Skip to content

feat(0.4.14): VSCode-kanban feature parity (restore_task, rename_label, undo, column-aware new task, TASKS_DIR)#35

Merged
sabbah13 merged 3 commits into
mainfrom
feat/vscode-features
May 5, 2026
Merged

feat(0.4.14): VSCode-kanban feature parity (restore_task, rename_label, undo, column-aware new task, TASKS_DIR)#35
sabbah13 merged 3 commits into
mainfrom
feat/vscode-features

Conversation

@sabbah13

@sabbah13 sabbah13 commented May 5, 2026

Copy link
Copy Markdown
Owner

Five regressions vs the original VSCode extension, all fixed.

  1. restore_task MCP tool — undoes a delete by walking archived/, restoring the matching file, and re-publishing.
  2. rename_label MCP tool — renames a label across config + every task using it. Idempotent. Returns updatedCount.
  3. Toast undo for archive + delete — 5-second window with an Undo button.
  4. Column-aware new-task hotkeyn while hovering a card opens the add-task form for THAT column.
  5. TASKS_DIR env override — CLI honors process.env.TASKS_DIR so tasks can live next to code in a git repo.

Tests

  • 10/10 mcp + 15/15 storage + 84/84 e2e green
  • 4 new tests (2 mcp + 2 e2e)

@sabbah13
sabbah13 force-pushed the feat/vscode-features branch from dcea4a8 to 24538dd Compare May 5, 2026 04:46

sabbah13 commented May 5, 2026

Copy link
Copy Markdown
Owner Author

Automated Code Review

Verdict: ⚠️ REQUEST CHANGES

Summary

Adds five features from the original VSCode kanban extension: restore_task MCP tool (undo delete), rename_label MCP tool (cascades across config + tasks), toast undo for archive and delete, column-aware n hotkey for new tasks, and a TASKS_DIR env override on the CLI. The architecture is clean, the new store methods are well-structured, and the 4 new tests are meaningful. Three issues need addressing before merge.


Issues (must fix before merge)

  1. rename_label bypasses Zod schema validation [packages/mcp-server/src/server.ts]

    Every other handler uses a typed Zod parse (e.g. DeleteTaskArgs.parse(raw)), but rename_label uses a raw type assertion and manual truthiness check:

    const { from, to } = raw as { from?: string; to?: string };
    if (!from || !to) {  }

    A non-string value (from: 123) passes the !from guard and reaches store.renameLabel with an unchecked type. A small Zod schema would match the established pattern and satisfy strict mode:

    const RenameArgs = z.object({ from: z.string().min(1), to: z.string().min(1) });
    const { from, to } = RenameArgs.parse(raw);
  2. PR template checklist missing

    The PR body is informative but omits the standard Type checkboxes and Checklist (typecheck / lint / test pass confirmations, conventional commit confirmation). PRs docs: contributor experience + PR review process #33 and others include these — worth filling in for consistency, especially for a feature PR.

  3. README conflict risk with PR docs(readme): benchmark improvements from repo audit #34

    Both this branch and docs/readme-improvements (PR docs(readme): benchmark improvements from repo audit #34) make identical edits to README.md against the same main base. Whichever merges second will hit conflicts. Recommend rebasing one branch onto the other, or having PR docs(readme): benchmark improvements from repo audit #34's README changes dropped if this one lands first.


Suggestions (optional)

  • Column-aware hotkey has an undocumented limitation. The PR description says "n while hovering a card opens the add-task form for THAT column" — but the implementation gates this on groupBy === 'status' only; other groupings fall back to effectiveColumns[0]. Worth noting in the PR body or the help dialog tooltip.

  • No e2e test for the column-aware hotkey. The undo flow is well covered, but the n-key column-routing logic has no automated verification.

  • No test for TASKS_DIR env override. A quick integration assertion that tasks land in a custom directory would guard this against silent regressions.


This review was generated automatically. A maintainer will follow up.


Generated by Claude Code

Cowork Tasks Maintainers and others added 3 commits May 5, 2026 10:33
- Fix duplicate "How it works" heading (renamed to "What gets captured" + "Architecture")
- Rename "Cursor-driven" to "Delta-only polling" (avoids Cursor IDE confusion)
- Add CI badge + npm version badge; drop low-signal Discussions badge
- Shorten sub-tagline to 3 punchy clauses
- Update GIF alt text to describe what demo actually shows
- Demote demo link from h3 to bold inline; add sub-caption
- Add "Who this is for" sentence after intro
- Surface "No API key needed" + "local-first" in first 300 words
- Replace blockquote "Why this exists" with plain prose paragraphs
- Add requirements block before install
- Combine CLI install into single command with &&
- Split features table into Core / Technical tiers (9 equal-weight rows -> 2 clear groups)
- Collapse shipped roadmap checkboxes into single "Shipped:" line
- Remove Discord/Newsletter star-threshold placeholders (signals unready)
- Remove Star History chart (flat line at 4 stars undermines credibility)
- Add "Used by maintainer daily" honest social proof

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…l, undo, column-aware new task, TASKS_DIR)

Five regressions vs the original VSCode extension fixed:

1. restore_task MCP tool - undoes a soft-delete by walking
   archived/, finding the most recent file with the id, moving it
   back to the active tasks folder, re-publishing.
2. rename_label MCP tool - renames a label in config AND every task
   using the old name in one pass. Returns updatedCount.
3. Toast undo for archive + delete - 5-second toast with Undo
   button. Optimistic local restore + matching MCP call.
4. Column-aware new-task hotkey - `n` while hovering a card opens
   the add-task form for THAT column.
5. TASKS_DIR env override - CLI honors process.env.TASKS_DIR so
   *.task.json files can live next to code in a git repo.

10/10 mcp + 15/15 storage + 84/84 e2e green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pre-existing strict-mode issues surfaced when CI started running build
before typecheck. Fixes:

- App.tsx: groupBy='source' patch needs the source-type cast against
  NonNullable<Task['source']> (not Task['source'] which is nullable).
- App.tsx: deriveColumns now returns Column-shaped objects with an
  always-present color (defaulted to #6b6a64).
- TopBar.tsx: drop the unused _onRefresh prop entirely; explicit
  comment notes Cowork chrome owns reload.
- App.tsx: drop the JSX comment that crept in on the TopBar opening.
- Markdown.tsx: remove unused IMAGE_EXT constant.
- useTasks.ts: replace eslint-disable for react-hooks/exhaustive-deps
  with a real comment (the rule isn't installed and was failing as
  unknown). The closure-over-apply behavior is intentional.
- server.ts: replace require('node:fs')/require('node:path') with
  named imports so eslint's no-var-requires passes.
- journey.spec.ts: drop unused setupCoworkEnv import.
- storage.test.ts: cast globalThis through unknown for stricter TS.
- connector-meet-fathom: cursor advancement was clamped to "now-24h"
  on first run because maxEnd started at `since`. Now starts at the
  original cursor (or empty) so any returned meeting wins; falls back
  to since only when there were no meetings.

10/10 mcp + 15/15 storage + 84/84 e2e + 2/2 fathom + lint + typecheck
all green locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sabbah13
sabbah13 force-pushed the feat/vscode-features branch from bb28429 to 8749754 Compare May 5, 2026 17:34
@sabbah13
sabbah13 merged commit 9db93db into main May 5, 2026
2 checks passed
@sabbah13
sabbah13 deleted the feat/vscode-features branch May 5, 2026 17:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant