sequant 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +8 -5
  4. package/dist/bin/cli.js +46 -4
  5. package/dist/src/commands/abort.d.ts +36 -0
  6. package/dist/src/commands/abort.js +138 -0
  7. package/dist/src/commands/prompt.d.ts +7 -0
  8. package/dist/src/commands/prompt.js +101 -7
  9. package/dist/src/commands/run-progress.d.ts +11 -1
  10. package/dist/src/commands/run-progress.js +20 -3
  11. package/dist/src/commands/run.js +12 -2
  12. package/dist/src/commands/watch.d.ts +2 -0
  13. package/dist/src/commands/watch.js +67 -3
  14. package/dist/src/lib/assess-collision-detect.js +1 -1
  15. package/dist/src/lib/cli-ui/run-renderer-types.d.ts +39 -0
  16. package/dist/src/lib/cli-ui/run-renderer.d.ts +27 -1
  17. package/dist/src/lib/cli-ui/run-renderer.js +231 -14
  18. package/dist/src/lib/cli-ui/scrollback-harness.d.ts +112 -0
  19. package/dist/src/lib/cli-ui/scrollback-harness.js +294 -0
  20. package/dist/src/lib/merge-check/types.js +1 -1
  21. package/dist/src/lib/relay/archive.js +6 -0
  22. package/dist/src/lib/relay/types.d.ts +2 -0
  23. package/dist/src/lib/relay/types.js +9 -0
  24. package/dist/src/lib/workflow/batch-executor.js +34 -18
  25. package/dist/src/lib/workflow/drivers/agent-driver.d.ts +48 -1
  26. package/dist/src/lib/workflow/drivers/aider.d.ts +7 -1
  27. package/dist/src/lib/workflow/drivers/aider.js +9 -0
  28. package/dist/src/lib/workflow/drivers/claude-code.d.ts +17 -1
  29. package/dist/src/lib/workflow/drivers/claude-code.js +51 -2
  30. package/dist/src/lib/workflow/drivers/index.d.ts +1 -1
  31. package/dist/src/lib/workflow/event-emitter.d.ts +157 -0
  32. package/dist/src/lib/workflow/event-emitter.js +102 -0
  33. package/dist/src/lib/workflow/notice.d.ts +32 -0
  34. package/dist/src/lib/workflow/notice.js +38 -0
  35. package/dist/src/lib/workflow/phase-executor.d.ts +9 -21
  36. package/dist/src/lib/workflow/phase-executor.js +88 -115
  37. package/dist/src/lib/workflow/phase-mapper.d.ts +26 -13
  38. package/dist/src/lib/workflow/phase-mapper.js +55 -33
  39. package/dist/src/lib/workflow/phase-registry.d.ts +127 -0
  40. package/dist/src/lib/workflow/phase-registry.js +233 -0
  41. package/dist/src/lib/workflow/run-log-schema.d.ts +5 -55
  42. package/dist/src/lib/workflow/run-orchestrator.d.ts +32 -2
  43. package/dist/src/lib/workflow/run-orchestrator.js +125 -11
  44. package/dist/src/lib/workflow/state-manager.d.ts +19 -1
  45. package/dist/src/lib/workflow/state-manager.js +27 -1
  46. package/dist/src/lib/workflow/state-schema.d.ts +20 -35
  47. package/dist/src/lib/workflow/state-schema.js +28 -3
  48. package/dist/src/lib/workflow/types.d.ts +65 -15
  49. package/dist/src/lib/workflow/types.js +18 -13
  50. package/package.json +5 -4
  51. package/templates/hooks/post-tool.sh +81 -0
  52. package/templates/skills/assess/SKILL.md +28 -28
  53. package/templates/skills/assess/references/predicted-collision-detection.md +1 -1
  54. package/templates/skills/setup/SKILL.md +6 -6
@@ -227,6 +227,60 @@ if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE '(npm run build
227
227
  fi
228
228
  fi
229
229
 
230
+ # === TEST COVERAGE ANALYSIS (P3) ===
231
+ # Opt-in: Set CLAUDE_HOOKS_COVERAGE=true to enable
232
+ # Automatically appends coverage analysis to npm test output
233
+ # Logs which changed files have/don't have corresponding tests
234
+ if [[ "${CLAUDE_HOOKS_COVERAGE:-}" == "true" ]]; then
235
+ if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE '(npm (test|run test)|bun (test|run test)|yarn (test|run test)|pnpm (test|run test))'; then
236
+ # Only run if tests passed (don't clutter failure output)
237
+ if ! echo "$TOOL_OUTPUT" | grep -qE '(FAIL|failed|Error:)'; then
238
+ COVERAGE_LOG="${_LOG_DIR}/claude-coverage.log"
239
+
240
+ # Get changed source files (excluding tests)
241
+ changed_files=$(git diff main...HEAD --name-only 2>/dev/null | grep -E '\.(ts|tsx|js|jsx)$' | grep -v -E '\.test\.|\.spec\.|__tests__' || true)
242
+
243
+ if [[ -n "$changed_files" ]]; then
244
+ echo "$(date +%H:%M:%S) COVERAGE_ANALYSIS: Checking test coverage for changed files" >> "$QUALITY_LOG"
245
+
246
+ files_with_tests=0
247
+ files_without_tests=0
248
+ critical_without_tests=""
249
+
250
+ while IFS= read -r file; do
251
+ [[ -z "$file" ]] && continue
252
+ base=$(basename "$file" .ts | sed 's/\.tsx$//')
253
+
254
+ # Check for test file
255
+ if find . -name "${base}.test.*" -o -name "${base}.spec.*" 2>/dev/null | grep -q .; then
256
+ ((files_with_tests++))
257
+ else
258
+ ((files_without_tests++))
259
+ # Check if critical path
260
+ if echo "$file" | grep -qE 'auth|payment|security|server-action|middleware|admin'; then
261
+ critical_without_tests="$critical_without_tests $file"
262
+ fi
263
+ fi
264
+ done <<< "$changed_files"
265
+
266
+ total=$((files_with_tests + files_without_tests))
267
+
268
+ # Log coverage summary
269
+ echo "$(date +%H:%M:%S) COVERAGE: $files_with_tests/$total changed files have tests" >> "$COVERAGE_LOG"
270
+
271
+ if [[ -n "$critical_without_tests" ]]; then
272
+ echo "$(date +%H:%M:%S) ⚠️ CRITICAL_NO_TESTS:$critical_without_tests" >> "$COVERAGE_LOG"
273
+ echo "$(date +%H:%M:%S) CRITICAL_NO_TESTS:$critical_without_tests" >> "$QUALITY_LOG"
274
+ fi
275
+
276
+ if [[ $files_without_tests -gt 0 ]]; then
277
+ echo "$(date +%H:%M:%S) COVERAGE_GAP: $files_without_tests files without tests" >> "$QUALITY_LOG"
278
+ fi
279
+ fi
280
+ fi
281
+ fi
282
+ fi
283
+
230
284
  # === SMART TEST RUNNING (P3) ===
231
285
  # Opt-in: Set CLAUDE_HOOKS_SMART_TESTS=true to enable
232
286
  # Runs related tests asynchronously after file edits
@@ -311,4 +365,31 @@ if [[ -n "${CLAUDE_HOOKS_WEBHOOK_URL:-}" ]]; then
311
365
  fi
312
366
  fi
313
367
 
368
+ # === POST-MERGE WORKTREE CLEANUP ===
369
+ # Clean up worktree AFTER `gh pr merge` succeeds (not before).
370
+ # Previous approach removed worktree pre-merge, which lost work if merge failed.
371
+ if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE 'gh pr merge'; then
372
+ # Only clean up if merge succeeded (output contains merge confirmation)
373
+ if echo "$TOOL_OUTPUT" | grep -qiE '(merged|Merged pull request|Pull request .* merged)'; then
374
+ PR_NUM=$(echo "$TOOL_INPUT" | grep -oE 'gh pr merge [0-9]+' | grep -oE '[0-9]+')
375
+
376
+ if [[ -n "$PR_NUM" ]]; then
377
+ BRANCH_NAME=$(gh pr view "$PR_NUM" --json headRefName --jq '.headRefName' 2>/dev/null || true)
378
+
379
+ if [[ -n "$BRANCH_NAME" ]]; then
380
+ # Note: worktree line is 2 lines before branch line in porcelain output
381
+ WORKTREE_PATH=$(git worktree list --porcelain 2>/dev/null | grep -B2 "branch refs/heads/$BRANCH_NAME" | grep "^worktree " | sed 's/^worktree //' || true)
382
+
383
+ if [[ -n "$WORKTREE_PATH" && -d "$WORKTREE_PATH" ]]; then
384
+ git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
385
+ echo "POST-MERGE: Removed worktree $WORKTREE_PATH for branch $BRANCH_NAME" >> "${_LOG_DIR}/claude-hook.log"
386
+ fi
387
+
388
+ # Clean up local branch
389
+ git branch -D "$BRANCH_NAME" 2>/dev/null || true
390
+ fi
391
+ fi
392
+ fi
393
+ fi
394
+
314
395
  exit 0
@@ -149,7 +149,7 @@ Surface red flags. Only track signals that change the recommendation.
149
149
  |--------|----------|----------|
150
150
  | security, auth, authentication, permissions | Domain | `spec → security-review → exec → qa` |
151
151
  | ui, frontend, admin, web, browser | Domain | `spec → exec → test → qa` |
152
- | complex, refactor, breaking, major | Modifier | `spec → exec → qa` + `-q` |
152
+ | complex, refactor, breaking, major | Modifier | `spec → exec → qa` + `-Q` |
153
153
  | (ui/frontend) + (enhancement/feature), or testable-AC signals | Modifier | inserts `testgen` before `exec` (see Testgen detection below) |
154
154
  | enhancement, feature (default) | Generic | `spec → exec → qa` |
155
155
  | bug, fix, hotfix, patch | Generic | `spec → exec → qa` |
@@ -165,7 +165,7 @@ Surface red flags. Only track signals that change the recommendation.
165
165
 
166
166
  **PR review detection:** Open PR with implementation complete → mark as review-needed (`◂ qa`).
167
167
 
168
- **Quality loop (`-q`):** Recommend for everything except simple bug fixes and docs-only.
168
+ **Quality loop (`-Q`):** Recommend for everything except simple bug fixes and docs-only.
169
169
 
170
170
  **Testgen detection:** Add `testgen` to the workflow when any apply:
171
171
  - Labels include (`ui` or `frontend`) AND (`enhancement` or `feature`)
@@ -179,7 +179,7 @@ Triggers (any one):
179
179
  - Issue body or comments mention `"depends on #N"`, `"blocked by #N"`, or `"after #N"`
180
180
  - One issue's described output is another issue's input (e.g., A changes a function signature that B consumes)
181
181
 
182
- Format: `Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <one-line reason>`
182
+ Format: `Chain: npx sequant run <N1> <N2> --chain --qa-gate -Q <phases> # alternative — <one-line reason>`
183
183
 
184
184
  Flag references:
185
185
  - `--chain` chains issues (each branches from previous; implies `--sequential`)
@@ -238,7 +238,7 @@ Order: <N> → <N> (<dependency reason>)
238
238
  ⚠ #<N> <warning>
239
239
  ⚠ #<N> <warning>
240
240
 
241
- Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <reason>
241
+ Chain: npx sequant run <N1> <N2> --chain --qa-gate -Q <phases> # alternative — <reason>
242
242
 
243
243
  Flags:
244
244
  <flag> <one-line reason>
@@ -300,12 +300,12 @@ Emit annotations in this order between the separators that follow `Commands:`:
300
300
  - `⚠ #412 bug + auth labels — domain label (auth) takes priority over bug`
301
301
 
302
302
  - **`Chain:`** — Only when 2+ PROCEED issues have a detected dependency (see "Chain detection" in Step 4). Suggests an alternative execution topology. Does not replace the default per-issue commands. Format:
303
- `Chain: npx sequant run <N1> <N2> --chain --qa-gate -q <phases> # alternative — <one-line reason>`
303
+ `Chain: npx sequant run <N1> <N2> --chain --qa-gate -Q <phases> # alternative — <one-line reason>`
304
304
 
305
- - **`Flags:`** — Only when non-default flags appear in the commands and the reason isn't obvious. One line per **distinct** flag used across all commands. Omit entire section when `-q` is the only non-default flag AND its reason is obvious (e.g., all issues are enhancements). Format:
305
+ - **`Flags:`** — Only when non-default flags appear in the commands and the reason isn't obvious. One line per **distinct** flag used across all commands. Omit entire section when `-Q` is the only non-default flag AND its reason is obvious (e.g., all issues are enhancements). Format:
306
306
  ```
307
307
  Flags:
308
- -q 9+ ACs or multi-file scope
308
+ -Q 9+ ACs or multi-file scope
309
309
  --testgen testable ACs detected (UI hooks + API integration)
310
310
  --phases ...,test ui label → browser verification
311
311
  ```
@@ -331,10 +331,10 @@ Not all issues have explicit `- [ ]` checkboxes, so the `ACs` column is omitted.
331
331
  405 REWRITE PR #380 200+ commits behind ⟳ spec → exec → qa
332
332
  ────────────────────────────────────────────────────────────────
333
333
  Commands:
334
- npx sequant run 461 460 458 443 -q
335
- npx sequant run 412 -q --security-review
336
- npx sequant run 411 -q --phases exec,qa # resume
337
- npx sequant run 405 -q # restart
334
+ npx sequant run 461 460 458 443 -Q
335
+ npx sequant run 412 -Q --security-review
336
+ npx sequant run 411 -Q --phases exec,qa # resume
337
+ npx sequant run 405 -Q # restart
338
338
  ────────────────────────────────────────────────────────────────
339
339
  Order: 460 → 461 (460 adds batch-executor tests that 461's label matching depends on)
340
340
 
@@ -343,7 +343,7 @@ Order: 460 → 461 (460 adds batch-executor tests that 461's label matching depe
343
343
  ⚠ #412 bug + auth labels — auth (domain) adds security-review phase
344
344
 
345
345
  Flags:
346
- -q multi-file scope across most PROCEED issues
346
+ -Q multi-file scope across most PROCEED issues
347
347
  --security-review #412 auth label → security review required
348
348
  --phases exec,qa #411 resume — prior spec marker already exists
349
349
  ────────────────────────────────────────────────────────────────
@@ -374,15 +374,15 @@ All issues have explicit checkbox ACs, so the `ACs` column is shown. A dependenc
374
374
  186 PROCEED 9 React Query hooks migration spec → testgen → exec → test → qa
375
375
  ────────────────────────────────────────────────────────────────
376
376
  Commands:
377
- npx sequant run 185 -q
378
- npx sequant run 186 -q --testgen
377
+ npx sequant run 185 -Q
378
+ npx sequant run 186 -Q --testgen
379
379
  ────────────────────────────────────────────────────────────────
380
380
  Order: 185 → 186 (185 changes fetchApi error format that 186 consumes)
381
381
 
382
382
  ⚠ #185 Domain errors already exist in repository layer — scope may be smaller than expected
383
383
  ⚠ #186 @tanstack/react-query not installed; large scope (9 hooks + optimistic updates)
384
384
 
385
- Chain: npx sequant run 185 186 --chain --qa-gate -q --testgen
385
+ Chain: npx sequant run 185 186 --chain --qa-gate -Q --testgen
386
386
  # alternative — use if 186 should branch from 185's work
387
387
 
388
388
  Flags:
@@ -395,7 +395,7 @@ Flags:
395
395
 
396
396
  #### Batch Example (all clean)
397
397
 
398
- When every issue is PROCEED with no warnings, no dependencies, and no non-default flags beyond an obvious `-q`, the output is minimal. The `Flags:` section is omitted because `-q` is obvious here (all PROCEED enhancements).
398
+ When every issue is PROCEED with no warnings, no dependencies, and no non-default flags beyond an obvious `-Q`, the output is minimal. The `Flags:` section is omitted because `-Q` is obvious here (all PROCEED enhancements).
399
399
 
400
400
  ```
401
401
  # Action Reason Run
@@ -404,7 +404,7 @@ When every issue is PROCEED with no warnings, no dependencies, and no non-defaul
404
404
  443 PROCEED Consolidate gh calls spec → exec → qa
405
405
  ────────────────────────────────────────────────────────────────
406
406
  Commands:
407
- npx sequant run 461 460 443 -q
407
+ npx sequant run 461 460 443 -Q
408
408
  ────────────────────────────────────────────────────────────────
409
409
 
410
410
  <!-- #461 assess:action=PROCEED assess:phases=spec,exec,qa assess:quality-loop=true -->
@@ -435,9 +435,9 @@ When assessing 9+ issues, commands are split per Rule 7 (max 6 issue numbers per
435
435
  491 PROCEED Normalize config paths spec → exec → qa
436
436
  ────────────────────────────────────────────────────────────────
437
437
  Commands:
438
- npx sequant run 503 502 501 499 498 497 -q
439
- npx sequant run 495 494 492 491 -q
440
- npx sequant run 500 -q --security-review
438
+ npx sequant run 503 502 501 499 498 497 -Q
439
+ npx sequant run 495 494 492 491 -Q
440
+ npx sequant run 500 -Q --security-review
441
441
  ────────────────────────────────────────────────────────────────
442
442
  Order: 497 → 492 (497 refactors batch-executor internals that 492's export command uses)
443
443
 
@@ -498,9 +498,9 @@ Flags:
498
498
  <!-- assess:quality-loop=<bool> -->
499
499
  ```
500
500
 
501
- **`Flags:` (single mode):** Indented list of each enabled non-default flag with a one-line reason. Omit the entire `Flags:` section when `-q` is the only non-default flag AND the reason is obvious (e.g., a straightforward enhancement). Do not repeat obvious flags.
501
+ **`Flags:` (single mode):** Indented list of each enabled non-default flag with a one-line reason. Omit the entire `Flags:` section when `-Q` is the only non-default flag AND the reason is obvious (e.g., a straightforward enhancement). Do not repeat obvious flags.
502
502
 
503
- Example with `Flags:` (non-obvious `-q` + `--testgen`):
503
+ Example with `Flags:` (non-obvious `-Q` + `--testgen`):
504
504
 
505
505
  ```
506
506
  #458 — Parallel run UX freeze + reconcileState race condition
@@ -510,12 +510,12 @@ Open · bug, enhancement, cli
510
510
  → PROCEED — Both root causes confirmed in codebase
511
511
 
512
512
  Commands:
513
- npx sequant run 458 -q
513
+ npx sequant run 458 -Q
514
514
 
515
515
  spec → exec → qa · 8 ACs
516
516
 
517
517
  Flags:
518
- -q dual concern across 4 files
518
+ -Q dual concern across 4 files
519
519
  ────────────────────────────────────────────────────────────────
520
520
 
521
521
  <!-- assess:action=PROCEED -->
@@ -523,7 +523,7 @@ Flags:
523
523
  <!-- assess:quality-loop=true -->
524
524
  ```
525
525
 
526
- Example omitting `Flags:` (obvious `-q` for a standard enhancement):
526
+ Example omitting `Flags:` (obvious `-Q` for a standard enhancement):
527
527
 
528
528
  ```
529
529
  #443 — Consolidate gh CLI calls
@@ -533,7 +533,7 @@ Open · enhancement
533
533
  → PROCEED — Codebase matches spec, 5 ACs
534
534
 
535
535
  Commands:
536
- npx sequant run 443 -q
536
+ npx sequant run 443 -Q
537
537
 
538
538
  spec → exec → qa · 5 ACs
539
539
  ────────────────────────────────────────────────────────────────
@@ -637,7 +637,7 @@ Commands:
637
637
  | `Order:` | File conflicts or dependencies require sequencing |
638
638
  | `⚠` warnings | Non-obvious signals exist (complexity, staleness, dual concerns, partial-AC satisfaction) |
639
639
  | `Chain:` | 2+ PROCEED issues with detected dependency (suggest-only) |
640
- | `Flags:` | Non-default flags appear AND `-q` is not the sole flag with an obvious reason |
640
+ | `Flags:` | Non-default flags appear AND `-Q` is not the sole flag with an obvious reason |
641
641
  | `Cleanup:` | Stale branches, merged-but-open issues, or label changes |
642
642
  | Separators | Between sections that are both shown; omit if adjacent section is omitted |
643
643
 
@@ -680,7 +680,7 @@ If confirmed, post a structured comment to each issue via `gh issue comment`. Ea
680
680
  - [ ] Commands block only contains PROCEED and REWRITE issues, grouped by compatible workflow
681
681
  - [ ] `testgen` included when ui/frontend + enhancement/feature labels OR testable-AC signals
682
682
  - [ ] `Chain:` suggested (not auto-applied) when 2+ PROCEED issues have a detected dependency
683
- - [ ] `Flags:` section present when non-default flags appear (unless only obvious `-q`)
683
+ - [ ] `Flags:` section present when non-default flags appear (unless only obvious `-Q`)
684
684
  - [ ] `Order:` annotations carry dependency **reasoning**, not bare filenames
685
685
  - [ ] `⚠` warnings include partial-AC satisfaction where applicable
686
686
  - [ ] Separators appear between every shown section; omitted when adjacent section is omitted
@@ -104,6 +104,6 @@ The detector returns `CollisionResult[]` from `detectFileCollisions`. The format
104
104
 
105
105
  - `Order: A → B (path)` per pair (or `Order: A → B → C (path)` for 3+ on the same file). `path` is the canonical bare form (e.g. `qa/SKILL.md`).
106
106
  - `⚠ #N Modifies <path> (overlaps #M); land sequentially` per affected issue.
107
- - `Chain: npx sequant run A B C --chain --qa-gate -q # alternative — N issues modify <path> (chain length≥3 historically 1/6 = 17%; see docs/reference/chain-mode-analysis-2026-05.md)` only when ≥3 issues collide on the same file (suggest-only). The historical-rate annotation comes from the #604 forensic write-up; users see the suggestion alongside the parallel default and can weigh the trade-off.
107
+ - `Chain: npx sequant run A B C --chain --qa-gate -Q # alternative — N issues modify <path> (chain length≥3 historically 1/6 = 17%; see docs/reference/chain-mode-analysis-2026-05.md)` only when ≥3 issues collide on the same file (suggest-only). The historical-rate annotation comes from the #604 forensic write-up; users see the suggestion alongside the parallel default and can weigh the trade-off.
108
108
 
109
109
  The bare-filename `Order:` exception (defined in the skill's "Annotation Rules") applies here — predicted collisions are file-collision reasons by definition, so the filename in parentheses is the reason verbatim.
@@ -75,16 +75,16 @@ else
75
75
  PREREQ_FAIL=true
76
76
  fi
77
77
 
78
- # 3. Node.js 20+ (for MCP server via npx)
78
+ # 3. Node.js 22.12+ (for MCP server via npx)
79
79
  if node --version >/dev/null 2>&1; then
80
80
  NODE_VER=$(node --version | sed 's/v//' | cut -d. -f1)
81
- if [ "$NODE_VER" -ge 20 ] 2>/dev/null; then
82
- echo "✅ node: $(node --version) (>= 20)"
81
+ if [ "$NODE_VER" -ge 22 ] 2>/dev/null; then
82
+ echo "✅ node: $(node --version) (>= 22)"
83
83
  else
84
- echo "⚠️ node: $(node --version) — MCP server requires Node.js 20+. Upgrade recommended."
84
+ echo "⚠️ node: $(node --version) — MCP server requires Node.js 22.12+. Upgrade recommended."
85
85
  fi
86
86
  else
87
- echo "⚠️ node: not found — MCP server (npx sequant serve) requires Node.js 20+"
87
+ echo "⚠️ node: not found — MCP server (npx sequant serve) requires Node.js 22.12+"
88
88
  fi
89
89
 
90
90
  if [ "$PREREQ_FAIL" = "true" ]; then
@@ -383,7 +383,7 @@ You're all set — run `/assess <issue>` to start working on a GitHub issue.
383
383
  - Check that the file is valid JSON/TOML
384
384
 
385
385
  **MCP tools not available:**
386
- - Ensure Node.js 20+ is installed (`node --version`)
386
+ - Ensure Node.js 22.12+ is installed (`node --version`)
387
387
  - The MCP server starts automatically via `npx sequant@latest serve`
388
388
  - Check Claude Code settings if tools don't appear
389
389