* build: drop unused elevate.exe from Windows build #8135
elevate.exe is bundled by electron-builder's NSIS target solely so
electron-updater can apply privileged per-machine updates. We ship no
in-app auto-updater (electron-updater is not a dependency; the autoUpdater
block in electron/start-app.ts is commented out), so the binary is unused
dead weight and a frequent AV false-positive. Set packElevateHelper: false
to stop bundling it; safe because perMachine is not true.
* docs: flag task component (perf) and sync system (correctness) as high-risk areas
* feat(tasks): show checklist progress indicator on task cards
Derive checklist progress from a task's markdown checklist notes and surface
a compact "done/total" badge in the task controls. The badge switches to a
completed state when every item is checked and opens the notes panel on click,
making checklist progress visible at a glance without opening the task.
https://claude.ai/code/session_0131giFn7PwH5AFMUpSQXdU2
* feat(tasks): add checklist reorder and bulk actions in notes
Add drag-to-reorder for checklist items in the notes editor and a checklist
actions menu (Check all / Uncheck all / Clear completed), shown only when the
notes are recognized as a markdown checklist. All operations are backed by pure,
unit-tested helpers that manipulate the existing markdown notes string and emit
through the normal change flow, preserving interleaved prose lines.
https://claude.ai/code/session_0131giFn7PwH5AFMUpSQXdU2
* refactor(tasks): harden checklist reorder and add drop indicator
Review follow-ups for the checklist actions:
- guard moveChecklistItem against NaN/non-integer indices (a NaN drop index
previously slipped past the range checks and corrupted ordering)
- show a drop-target highlight while dragging a checklist item
- drop redundant modelCopy.set (the model setter already syncs it)
- add component tests for bulk actions and the drag-and-drop flow
https://claude.ai/code/session_0131giFn7PwH5AFMUpSQXdU2
* refactor(tasks): remove checklist drag-to-reorder, refine card icon
Remove native drag-to-reorder for checklist items in the notes editor
(drag handlers, drop indicator, the moveChecklistItem helper, and the
related styles and tests). The checklist bulk-actions menu (check all /
uncheck all / clear completed) and the task-card progress badge are kept.
On the task card, the checklist progress badge now stands in for the plain
'chat' notes indicator: when a task has a checklist the redundant notes icon
is suppressed, and the badge itself yields to the close (X) button when the
detail panel is open, mirroring how the notes icon behaves.
* feat(tasks): replace unmodified default notes template on checklist toggle
When the notes field shows only the app's stock default template (and it
has not been edited), the checklist button now replaces that placeholder
with a fresh checklist instead of appending a checkbox below it. Edited
content and user notes are preserved and appended to as before.
Adds a `defaultText` input on inline-markdown so the task detail panel can
pass the (replaceable) stock template, guarded by isStockNotesTemplate so a
user-customized template is treated as real content.
* fix(tasks): indent list line on Tab regardless of cursor column
handleTabKey previously only indented when the cursor sat at line start or
at the end of an empty prefix, so pressing Tab mid-item moved focus out of
the editor instead of indenting. It now indents whenever the collapsed
cursor is on a list line, returning null only for multi-char selections or
non-list lines.
* feat(tasks): hint "Notes / Checklist" in empty notes header
When a task has no notes yet, the notes section header now reads
"Notes / Checklist" instead of "Notes", hinting that the section can hold
either a free-form note or a checklist. Plain notes still show "Notes" and
a recognized checklist still shows "Checklist".
* feat(tasks): limit checklist item click target to checkbox and text
Checklist item text was rendered as a bare text node inside the block-level
row, so clicking anywhere on the row (including empty space) toggled the
item. Wrap the text in a <span class="checkbox-label"> and only toggle when
the click lands on the checkbox icon or that label; clicks on the rest of
the row fall through to opening the editor. Cursor affordance is moved off
the row onto the checkbox and label accordingly.
* fix(tasks): map checklist toggle to the correct source line
_handleCheckboxClick mapped the Nth rendered checkbox to the Nth source line
matching `line.includes('- [')`, which also matches non-task lines such as
markdown link bullets (`- [text](url)`) or prose. That shifted the index so
clicking a checkbox could toggle the wrong line (often a no-op). Use the
anchored `isChecklistItemLine` predicate — the same one the bulk-action
helpers use — so source lines align with the rendered checkboxes. Applied to
both the inline editor and the fullscreen markdown dialog (duplicated logic).
* refactor(tasks): unify checklist predicate and dedupe toggle logic
Addresses multi-review feedback (W1/W3/S1):
- Single source of truth for "is a checklist line": isMarkdownChecklist,
markdownToChecklist and getChecklistProgress now use the checklist-operations
predicates instead of three divergent definitions. Tightened CHECKLIST_ITEM_RE
to /^\s*- \[[ xX]\]/ so it matches exactly what marked renders (verified: marked
treats - [ ]/- [x]/- [X] as tasks but NOT - []). This also fixes the badge not
recognizing uppercase [X] checklists.
- Extracted toggleChecklistItemAtIndex() into checklist-operations and use it in
both _handleCheckboxClick copies (inline editor + fullscreen dialog), removing
the duplicated index-mapping + string-toggle. The helper flips only the
checkbox marker (item text containing [ ] is safe) and handles [X] uncheck —
both pre-existing bugs in the old inline toggle.
- getChecklistProgress counts in a single pass over the lines (no intermediate
markdownToChecklist array / throwaway substring allocations) — it runs on the
task-card hot path.
* fix(tasks): match checklist predicate exactly to marked's task rendering
Final review follow-up. The line predicate now requires "- [marker] <content>"
(marker box + whitespace + a non-space char), matching what marked actually
renders as a checkbox — verified against marked across 15 cases. Previously an
empty "- [ ] " placeholder line (or "- [x]a" with no space) was counted as an
item even though marked renders no checkbox for it, which could desync the
Nth-checkbox -> Nth-line mapping (e.g. "- [ ] \n- [x] real": marked shows 1
checkbox, predicate matched 2, so clicking the real item toggled the empty
line). Tightening CHECKLIST_ITEM_RE/CHECKED_ITEM_RE closes that gap and makes the
"in sync with marked" comment accurate.
---------
Co-authored-by: Claude <noreply@anthropic.com>