gsd-pi 2.44.0-dev.62b5d6c → 2.44.0-dev.73f2fd5
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.
- package/README.md +30 -12
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +36 -36
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
- package/dist/resources/extensions/gsd/auto.js +30 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +34 -16
- package/dist/resources/extensions/gsd/doctor.js +8 -0
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +12 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/preferences.js +9 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/state.js +19 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/phases.ts +45 -48
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
- package/src/resources/extensions/gsd/auto.ts +37 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/db-writer.ts +39 -17
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +16 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/preferences.ts +11 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/state.ts +19 -1
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → kxxAA66bah_yhPYqLBHE2}/_ssgManifest.js +0 -0
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// Tests the RuleRegistry class, UnifiedRule types, singleton accessors,
|
|
4
4
|
// and evaluation methods using mock rules.
|
|
5
5
|
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
6
7
|
import { test, describe, beforeEach } from "node:test";
|
|
7
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
8
8
|
import {
|
|
9
9
|
RuleRegistry,
|
|
10
10
|
getRegistry,
|
|
@@ -64,9 +64,7 @@ function makeContext(phase: string): DispatchContext {
|
|
|
64
64
|
// ─── Tests ────────────────────────────────────────────────────────────────
|
|
65
65
|
|
|
66
66
|
describe("RuleRegistry", () => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
beforeEach(() => {
|
|
67
|
+
beforeEach(() => {
|
|
70
68
|
resetRegistry();
|
|
71
69
|
});
|
|
72
70
|
|
|
@@ -81,10 +79,10 @@ describe("RuleRegistry", () => {
|
|
|
81
79
|
|
|
82
80
|
// At minimum, dispatch rules are returned (hook rules depend on prefs)
|
|
83
81
|
const dispatchRules = listed.filter(r => r.when === "dispatch");
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
assert.deepStrictEqual(dispatchRules.length, 3, "listRules returns 3 dispatch rules");
|
|
83
|
+
assert.deepStrictEqual(dispatchRules[0].name, "rule-a", "first rule name is rule-a");
|
|
84
|
+
assert.deepStrictEqual(dispatchRules[1].name, "rule-b", "second rule name is rule-b");
|
|
85
|
+
assert.deepStrictEqual(dispatchRules[2].name, "rule-c", "third rule name is rule-c");
|
|
88
86
|
});
|
|
89
87
|
|
|
90
88
|
test("listRules returns correct fields on each rule", () => {
|
|
@@ -95,12 +93,12 @@ describe("RuleRegistry", () => {
|
|
|
95
93
|
const listed = registry.listRules();
|
|
96
94
|
const rule = listed.find(r => r.name === "check-fields")!;
|
|
97
95
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
96
|
+
assert.ok(rule !== undefined, "rule found by name");
|
|
97
|
+
assert.deepStrictEqual(rule.when, "dispatch", "when field is dispatch");
|
|
98
|
+
assert.deepStrictEqual(rule.evaluation, "first-match", "evaluation is first-match");
|
|
99
|
+
assert.ok(typeof rule.where === "function", "where is a function");
|
|
100
|
+
assert.ok(typeof rule.then === "function", "then is a function");
|
|
101
|
+
assert.deepStrictEqual(rule.description, "Mock rule for planning", "description is set");
|
|
104
102
|
});
|
|
105
103
|
|
|
106
104
|
test("evaluateDispatch returns first matching rule", async () => {
|
|
@@ -113,10 +111,10 @@ describe("RuleRegistry", () => {
|
|
|
113
111
|
const ctx = makeContext("executing");
|
|
114
112
|
const result = await registry.evaluateDispatch(ctx);
|
|
115
113
|
|
|
116
|
-
|
|
114
|
+
assert.deepStrictEqual(result.action, "dispatch", "result is a dispatch action");
|
|
117
115
|
if (result.action === "dispatch") {
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
assert.deepStrictEqual(result.unitType, "test-executing", "matched the executing rule");
|
|
117
|
+
assert.deepStrictEqual(result.prompt, "Prompt for executing", "prompt from matched rule");
|
|
120
118
|
}
|
|
121
119
|
});
|
|
122
120
|
|
|
@@ -128,9 +126,9 @@ describe("RuleRegistry", () => {
|
|
|
128
126
|
const ctx = makeContext("blocked");
|
|
129
127
|
const result = await registry.evaluateDispatch(ctx);
|
|
130
128
|
|
|
131
|
-
|
|
129
|
+
assert.deepStrictEqual(result.action, "stop", "result is a stop action");
|
|
132
130
|
if (result.action === "stop") {
|
|
133
|
-
|
|
131
|
+
assert.ok(result.reason.includes("blocked"), "stop reason mentions phase");
|
|
134
132
|
}
|
|
135
133
|
});
|
|
136
134
|
|
|
@@ -159,9 +157,9 @@ describe("RuleRegistry", () => {
|
|
|
159
157
|
const ctx = makeContext("planning");
|
|
160
158
|
const result = await registry.evaluateDispatch(ctx);
|
|
161
159
|
|
|
162
|
-
|
|
160
|
+
assert.deepStrictEqual(result.action, "dispatch", "async dispatch resolved");
|
|
163
161
|
if (result.action === "dispatch") {
|
|
164
|
-
|
|
162
|
+
assert.deepStrictEqual(result.unitType, "async-test", "async rule matched");
|
|
165
163
|
}
|
|
166
164
|
});
|
|
167
165
|
|
|
@@ -188,11 +186,11 @@ describe("RuleRegistry", () => {
|
|
|
188
186
|
// Reset
|
|
189
187
|
registry.resetState();
|
|
190
188
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
189
|
+
assert.deepStrictEqual(registry.getActiveHook(), null, "activeHook cleared");
|
|
190
|
+
assert.deepStrictEqual(registry.hookQueue.length, 0, "hookQueue cleared");
|
|
191
|
+
assert.deepStrictEqual(registry.cycleCounts.size, 0, "cycleCounts cleared");
|
|
192
|
+
assert.deepStrictEqual(registry.isRetryPending(), false, "retryPending cleared");
|
|
193
|
+
assert.deepStrictEqual(registry.consumeRetryTrigger(), null, "retryTrigger cleared");
|
|
196
194
|
});
|
|
197
195
|
|
|
198
196
|
test("singleton getRegistry throws when not initialized", () => {
|
|
@@ -201,9 +199,9 @@ describe("RuleRegistry", () => {
|
|
|
201
199
|
getRegistry();
|
|
202
200
|
} catch (e: any) {
|
|
203
201
|
threw = true;
|
|
204
|
-
|
|
202
|
+
assert.ok(e.message.includes("not initialized"), "error mentions not initialized");
|
|
205
203
|
}
|
|
206
|
-
|
|
204
|
+
assert.ok(threw, "getRegistry threw");
|
|
207
205
|
});
|
|
208
206
|
|
|
209
207
|
test("setRegistry / getRegistry round-trips", () => {
|
|
@@ -211,20 +209,20 @@ describe("RuleRegistry", () => {
|
|
|
211
209
|
setRegistry(registry);
|
|
212
210
|
|
|
213
211
|
const retrieved = getRegistry();
|
|
214
|
-
|
|
212
|
+
assert.deepStrictEqual(retrieved, registry, "getRegistry returns the same instance");
|
|
215
213
|
|
|
216
214
|
const listed = retrieved.listRules().filter(r => r.when === "dispatch");
|
|
217
|
-
|
|
218
|
-
|
|
215
|
+
assert.deepStrictEqual(listed.length, 1, "singleton has 1 dispatch rule");
|
|
216
|
+
assert.deepStrictEqual(listed[0].name, "singleton-test", "rule name matches");
|
|
219
217
|
});
|
|
220
218
|
|
|
221
219
|
test("initRegistry creates and sets singleton", () => {
|
|
222
220
|
const rules = [mockDispatchRule("init-test", "executing")];
|
|
223
221
|
const registry = initRegistry(rules);
|
|
224
222
|
|
|
225
|
-
|
|
223
|
+
assert.deepStrictEqual(getRegistry(), registry, "initRegistry sets the singleton");
|
|
226
224
|
const listed = getRegistry().listRules().filter(r => r.when === "dispatch");
|
|
227
|
-
|
|
225
|
+
assert.deepStrictEqual(listed.length, 1, "singleton has the rule");
|
|
228
226
|
});
|
|
229
227
|
|
|
230
228
|
test("evaluateDispatch respects rule order (first match wins)", async () => {
|
|
@@ -258,9 +256,9 @@ describe("RuleRegistry", () => {
|
|
|
258
256
|
const ctx = makeContext("planning");
|
|
259
257
|
const result = await registry.evaluateDispatch(ctx);
|
|
260
258
|
|
|
261
|
-
|
|
259
|
+
assert.deepStrictEqual(result.action, "dispatch", "dispatch action returned");
|
|
262
260
|
if (result.action === "dispatch") {
|
|
263
|
-
|
|
261
|
+
assert.deepStrictEqual(result.unitType, "first-wins", "first rule won over second");
|
|
264
262
|
}
|
|
265
263
|
});
|
|
266
264
|
|
|
@@ -268,18 +266,18 @@ describe("RuleRegistry", () => {
|
|
|
268
266
|
|
|
269
267
|
test("convertDispatchRules produces correct count of UnifiedRule objects", () => {
|
|
270
268
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
271
|
-
|
|
269
|
+
assert.deepStrictEqual(converted.length, DISPATCH_RULES.length, `convertDispatchRules produces ${DISPATCH_RULES.length} rules`);
|
|
272
270
|
});
|
|
273
271
|
|
|
274
272
|
test("each converted rule has correct when, evaluation, and original name", () => {
|
|
275
273
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
276
274
|
for (let i = 0; i < converted.length; i++) {
|
|
277
275
|
const rule = converted[i];
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
276
|
+
assert.deepStrictEqual(rule.when, "dispatch", `rule ${i} has when:"dispatch"`);
|
|
277
|
+
assert.deepStrictEqual(rule.evaluation, "first-match", `rule ${i} has evaluation:"first-match"`);
|
|
278
|
+
assert.deepStrictEqual(rule.name, DISPATCH_RULES[i].name, `rule ${i} preserves name "${DISPATCH_RULES[i].name}"`);
|
|
279
|
+
assert.ok(typeof rule.where === "function", `rule ${i} has a where function`);
|
|
280
|
+
assert.ok(typeof rule.then === "function", `rule ${i} has a then function`);
|
|
283
281
|
}
|
|
284
282
|
});
|
|
285
283
|
|
|
@@ -287,7 +285,7 @@ describe("RuleRegistry", () => {
|
|
|
287
285
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
288
286
|
const registry = new RuleRegistry(converted);
|
|
289
287
|
const listed = registry.listRules().filter(r => r.when === "dispatch");
|
|
290
|
-
|
|
288
|
+
assert.deepStrictEqual(listed.length, DISPATCH_RULES.length, `listRules returns ${DISPATCH_RULES.length} dispatch rules`);
|
|
291
289
|
});
|
|
292
290
|
|
|
293
291
|
test("rule names from listRules match getDispatchRuleNames in exact order", () => {
|
|
@@ -298,9 +296,9 @@ describe("RuleRegistry", () => {
|
|
|
298
296
|
.map(r => r.name);
|
|
299
297
|
const originalNames = getDispatchRuleNames();
|
|
300
298
|
|
|
301
|
-
|
|
299
|
+
assert.deepStrictEqual(listedNames.length, originalNames.length, "same number of names");
|
|
302
300
|
for (let i = 0; i < originalNames.length; i++) {
|
|
303
|
-
|
|
301
|
+
assert.deepStrictEqual(listedNames[i], originalNames[i], `name at index ${i} matches: "${originalNames[i]}"`);
|
|
304
302
|
}
|
|
305
303
|
});
|
|
306
304
|
|
|
@@ -309,18 +307,18 @@ describe("RuleRegistry", () => {
|
|
|
309
307
|
test("getOrCreateRegistry lazily creates a registry with empty dispatch rules", () => {
|
|
310
308
|
// After resetRegistry(), getRegistry() would throw. getOrCreateRegistry() should not.
|
|
311
309
|
const registry = getOrCreateRegistry();
|
|
312
|
-
|
|
310
|
+
assert.ok(registry instanceof RuleRegistry, "returns a RuleRegistry instance");
|
|
313
311
|
const dispatchRules = registry.listRules().filter(r => r.when === "dispatch");
|
|
314
|
-
|
|
312
|
+
assert.deepStrictEqual(dispatchRules.length, 0, "lazily-created registry has 0 dispatch rules");
|
|
315
313
|
});
|
|
316
314
|
|
|
317
315
|
test("getOrCreateRegistry returns existing registry when initialized", () => {
|
|
318
316
|
const rules = [mockDispatchRule("explicit-init", "planning")];
|
|
319
317
|
const explicit = initRegistry(rules);
|
|
320
318
|
const lazy = getOrCreateRegistry();
|
|
321
|
-
|
|
319
|
+
assert.deepStrictEqual(lazy, explicit, "getOrCreateRegistry returns the same singleton as initRegistry");
|
|
322
320
|
const dispatchRules = lazy.listRules().filter(r => r.when === "dispatch");
|
|
323
|
-
|
|
321
|
+
assert.deepStrictEqual(dispatchRules.length, 1, "singleton has the explicitly initialized dispatch rule");
|
|
324
322
|
});
|
|
325
323
|
|
|
326
324
|
// ── Hook-derived rules in listRules ────────────────────────────────
|
|
@@ -333,9 +331,9 @@ describe("RuleRegistry", () => {
|
|
|
333
331
|
const preDispatchRules = allRules.filter(r => r.when === "pre-dispatch");
|
|
334
332
|
|
|
335
333
|
// No preferences file = no hooks
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
334
|
+
assert.deepStrictEqual(postUnitRules.length, 0, "no post-unit rules when no hooks configured");
|
|
335
|
+
assert.deepStrictEqual(preDispatchRules.length, 0, "no pre-dispatch rules when no hooks configured");
|
|
336
|
+
assert.deepStrictEqual(allRules.length, DISPATCH_RULES.length, "total rules equals dispatch rules only");
|
|
339
337
|
});
|
|
340
338
|
|
|
341
339
|
test("listRules dispatch rules appear first, hooks after", () => {
|
|
@@ -345,8 +343,8 @@ describe("RuleRegistry", () => {
|
|
|
345
343
|
|
|
346
344
|
// Verify dispatch rules come first (indices 0..N-1)
|
|
347
345
|
for (let i = 0; i < converted.length; i++) {
|
|
348
|
-
|
|
349
|
-
|
|
346
|
+
assert.deepStrictEqual(allRules[i].when, "dispatch", `rule at index ${i} is a dispatch rule`);
|
|
347
|
+
assert.deepStrictEqual(allRules[i].name, converted[i].name, `dispatch rule at index ${i} has correct name`);
|
|
350
348
|
}
|
|
351
349
|
});
|
|
352
350
|
|
|
@@ -355,34 +353,34 @@ describe("RuleRegistry", () => {
|
|
|
355
353
|
test("evaluatePostUnit returns null for hook-on-hook prevention", () => {
|
|
356
354
|
const registry = new RuleRegistry([]);
|
|
357
355
|
const result = registry.evaluatePostUnit("hook/code-review", "M001/S01/T01", "/tmp/test");
|
|
358
|
-
|
|
356
|
+
assert.deepStrictEqual(result, null, "hook units don't trigger other hooks");
|
|
359
357
|
});
|
|
360
358
|
|
|
361
359
|
test("evaluatePostUnit returns null for triage-captures", () => {
|
|
362
360
|
const registry = new RuleRegistry([]);
|
|
363
361
|
const result = registry.evaluatePostUnit("triage-captures", "M001/S01/T01", "/tmp/test");
|
|
364
|
-
|
|
362
|
+
assert.deepStrictEqual(result, null, "triage-captures skipped");
|
|
365
363
|
});
|
|
366
364
|
|
|
367
365
|
test("evaluatePostUnit returns null for quick-task", () => {
|
|
368
366
|
const registry = new RuleRegistry([]);
|
|
369
367
|
const result = registry.evaluatePostUnit("quick-task", "M001/S01/T01", "/tmp/test");
|
|
370
|
-
|
|
368
|
+
assert.deepStrictEqual(result, null, "quick-task skipped");
|
|
371
369
|
});
|
|
372
370
|
|
|
373
371
|
test("evaluatePreDispatch bypasses hook units", () => {
|
|
374
372
|
const registry = new RuleRegistry([]);
|
|
375
373
|
const result = registry.evaluatePreDispatch("hook/review", "M001/S01/T01", "prompt", "/tmp/test");
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
374
|
+
assert.deepStrictEqual(result.action, "proceed", "hook units always proceed");
|
|
375
|
+
assert.deepStrictEqual(result.prompt, "prompt", "prompt unchanged");
|
|
376
|
+
assert.deepStrictEqual(result.firedHooks.length, 0, "no hooks fired");
|
|
379
377
|
});
|
|
380
378
|
|
|
381
379
|
test("evaluatePreDispatch proceeds with empty hooks", () => {
|
|
382
380
|
const registry = new RuleRegistry([]);
|
|
383
381
|
const result = registry.evaluatePreDispatch("execute-task", "M001/S01/T01", "original prompt", "/tmp/test");
|
|
384
|
-
|
|
385
|
-
|
|
382
|
+
assert.deepStrictEqual(result.action, "proceed", "proceeds when no hooks");
|
|
383
|
+
assert.deepStrictEqual(result.prompt, "original prompt", "prompt unchanged");
|
|
386
384
|
});
|
|
387
385
|
|
|
388
386
|
// ── matchedRule provenance (S02 journal support) ───────────────────
|
|
@@ -395,8 +393,8 @@ describe("RuleRegistry", () => {
|
|
|
395
393
|
const ctx = makeContext("planning");
|
|
396
394
|
const result = await registry.evaluateDispatch(ctx);
|
|
397
395
|
|
|
398
|
-
|
|
399
|
-
|
|
396
|
+
assert.deepStrictEqual(result.action, "dispatch", "result is a dispatch action");
|
|
397
|
+
assert.deepStrictEqual(result.matchedRule, "my-planning-rule", "matchedRule is the rule name");
|
|
400
398
|
});
|
|
401
399
|
|
|
402
400
|
test("evaluateDispatch result includes matchedRule '<no-match>' on fallback stop", async () => {
|
|
@@ -407,7 +405,7 @@ describe("RuleRegistry", () => {
|
|
|
407
405
|
const ctx = makeContext("some-unknown-phase");
|
|
408
406
|
const result = await registry.evaluateDispatch(ctx);
|
|
409
407
|
|
|
410
|
-
|
|
411
|
-
|
|
408
|
+
assert.deepStrictEqual(result.action, "stop", "result is a stop action");
|
|
409
|
+
assert.deepStrictEqual(result.matchedRule, "<no-match>", "matchedRule is '<no-match>' on fallback");
|
|
412
410
|
});
|
|
413
411
|
});
|