gsd-pi 2.44.0 → 2.45.0-dev.6b9da3e
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/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +37 -36
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +31 -2
- 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 +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -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/rethink.md +78 -0
- 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/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/state.js +41 -3
- 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-manager.js +32 -2
- 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 +8 -8
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 +4 -4
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +6 -6
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- 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/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- 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/package.json +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/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/phases.ts +46 -48
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +39 -2
- 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 +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -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/rethink.md +78 -0
- 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/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/state.ts +41 -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-disk-reconcile.test.ts +121 -0
- 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/inherited-repo-home-dir.test.ts +121 -0
- 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/recovery-attempts-reset.test.ts +176 -0
- 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/survivor-branch-complete.test.ts +108 -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-submodule-safety.test.ts +65 -0
- 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-manager.ts +43 -2
- 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/chunks/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
4
|
import { join } from 'node:path';
|
|
3
5
|
import { tmpdir } from 'node:os';
|
|
4
6
|
|
|
5
7
|
import { deriveState } from '../state.ts';
|
|
6
|
-
import { createTestContext } from './test-helpers.ts';
|
|
7
|
-
|
|
8
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
9
8
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
10
9
|
|
|
11
10
|
function createFixtureBase(): string {
|
|
@@ -63,12 +62,11 @@ function cleanup(base: string): void {
|
|
|
63
62
|
// Test Groups
|
|
64
63
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
65
64
|
|
|
66
|
-
async
|
|
65
|
+
describe('derive-state-deps', async () => {
|
|
67
66
|
|
|
68
67
|
// ─── Test Group 1: blocked-deps ────────────────────────────────────────
|
|
69
68
|
// M001 is incomplete (no SUMMARY), M002 depends_on M001 → M002 is pending
|
|
70
|
-
|
|
71
|
-
{
|
|
69
|
+
test('blocked-deps', async () => {
|
|
72
70
|
const base = createFixtureBase();
|
|
73
71
|
try {
|
|
74
72
|
// M001: incomplete (one slice, no SUMMARY)
|
|
@@ -108,19 +106,18 @@ async function main(): Promise<void> {
|
|
|
108
106
|
|
|
109
107
|
const state = await deriveState(base);
|
|
110
108
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'active', 'blocked-deps: M001 is active');
|
|
110
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'pending', 'blocked-deps: M002 is pending (dep-blocked)');
|
|
111
|
+
assert.deepStrictEqual(state.phase, 'executing', 'blocked-deps: phase is executing (M001 is active)');
|
|
112
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001', 'blocked-deps: activeMilestone is M001');
|
|
115
113
|
} finally {
|
|
116
114
|
cleanup(base);
|
|
117
115
|
}
|
|
118
|
-
}
|
|
116
|
+
});
|
|
119
117
|
|
|
120
118
|
// ─── Test Group 2: unblocked-deps ──────────────────────────────────────
|
|
121
119
|
// M001 is complete (all slices [x] + SUMMARY), M002 depends_on M001 → M002 becomes active
|
|
122
|
-
|
|
123
|
-
{
|
|
120
|
+
test('unblocked-deps', async () => {
|
|
124
121
|
const base = createFixtureBase();
|
|
125
122
|
try {
|
|
126
123
|
// M001: complete (all slices done + SUMMARY present)
|
|
@@ -150,19 +147,18 @@ async function main(): Promise<void> {
|
|
|
150
147
|
|
|
151
148
|
const state = await deriveState(base);
|
|
152
149
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
150
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'complete', 'unblocked-deps: M001 is complete');
|
|
151
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'active', 'unblocked-deps: M002 is active');
|
|
152
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'unblocked-deps: activeMilestone is M002');
|
|
153
|
+
assert.ok(state.phase !== 'blocked', 'unblocked-deps: phase is not blocked');
|
|
157
154
|
} finally {
|
|
158
155
|
cleanup(base);
|
|
159
156
|
}
|
|
160
|
-
}
|
|
157
|
+
});
|
|
161
158
|
|
|
162
159
|
// ─── Test Group 3: all-blocked ─────────────────────────────────────────
|
|
163
160
|
// M001 depends_on M002, M002 depends_on M001 — circular dep, neither can activate
|
|
164
|
-
|
|
165
|
-
{
|
|
161
|
+
test('all-blocked', async () => {
|
|
166
162
|
const base = createFixtureBase();
|
|
167
163
|
try {
|
|
168
164
|
// M001: depends on M002
|
|
@@ -191,18 +187,17 @@ async function main(): Promise<void> {
|
|
|
191
187
|
|
|
192
188
|
const state = await deriveState(base);
|
|
193
189
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
190
|
+
assert.deepStrictEqual(state.phase, 'blocked', 'all-blocked: phase is blocked');
|
|
191
|
+
assert.ok(state.activeMilestone === null || state.activeMilestone !== null, 'all-blocked: state is consistent');
|
|
192
|
+
assert.ok(state.blockers.length > 0, 'all-blocked: blockers array is non-empty');
|
|
197
193
|
} finally {
|
|
198
194
|
cleanup(base);
|
|
199
195
|
}
|
|
200
|
-
}
|
|
196
|
+
});
|
|
201
197
|
|
|
202
198
|
// ─── Test Group 4: absent-context ──────────────────────────────────────
|
|
203
199
|
// Neither M001 nor M002 has a CONTEXT.md → no dep constraints, normal sequential behavior
|
|
204
|
-
|
|
205
|
-
{
|
|
200
|
+
test('absent-context', async () => {
|
|
206
201
|
const base = createFixtureBase();
|
|
207
202
|
try {
|
|
208
203
|
// M001: incomplete, no CONTEXT.md
|
|
@@ -229,19 +224,18 @@ async function main(): Promise<void> {
|
|
|
229
224
|
|
|
230
225
|
const state = await deriveState(base);
|
|
231
226
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
227
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'active', 'absent-context: M001 is active');
|
|
228
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'pending', 'absent-context: M002 is pending');
|
|
229
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001', 'absent-context: activeMilestone is M001');
|
|
230
|
+
assert.ok(state.phase !== 'blocked', 'absent-context: phase is not blocked');
|
|
236
231
|
} finally {
|
|
237
232
|
cleanup(base);
|
|
238
233
|
}
|
|
239
|
-
}
|
|
234
|
+
});
|
|
240
235
|
|
|
241
236
|
// ─── Test Group 5: forward-dep ─────────────────────────────────────────
|
|
242
237
|
// M001 depends_on M002, but M002 is already complete → M001 can activate
|
|
243
|
-
|
|
244
|
-
{
|
|
238
|
+
test('forward-dep', async () => {
|
|
245
239
|
const base = createFixtureBase();
|
|
246
240
|
try {
|
|
247
241
|
// M001: depends on M002, but M002 is complete so M001 is unblocked
|
|
@@ -271,18 +265,17 @@ async function main(): Promise<void> {
|
|
|
271
265
|
|
|
272
266
|
const state = await deriveState(base);
|
|
273
267
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
268
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001', 'forward-dep: activeMilestone is M001');
|
|
269
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'complete', 'forward-dep: M002 is complete');
|
|
270
|
+
assert.ok(state.phase !== 'blocked', 'forward-dep: phase is not blocked');
|
|
277
271
|
} finally {
|
|
278
272
|
cleanup(base);
|
|
279
273
|
}
|
|
280
|
-
}
|
|
274
|
+
});
|
|
281
275
|
|
|
282
276
|
// ─── Test Group 6: empty-deps-list ─────────────────────────────────────
|
|
283
277
|
// M002 has `depends_on: []` — empty list means no constraint, normal sequential behavior
|
|
284
|
-
|
|
285
|
-
{
|
|
278
|
+
test('empty-deps-list', async () => {
|
|
286
279
|
const base = createFixtureBase();
|
|
287
280
|
try {
|
|
288
281
|
// M001: incomplete, no context
|
|
@@ -310,20 +303,19 @@ async function main(): Promise<void> {
|
|
|
310
303
|
|
|
311
304
|
const state = await deriveState(base);
|
|
312
305
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
306
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'active', 'empty-deps-list: M001 is active');
|
|
307
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'pending', 'empty-deps-list: M002 is pending (M001 not done yet)');
|
|
308
|
+
assert.ok(state.phase !== 'blocked', 'empty-deps-list: phase is not blocked');
|
|
316
309
|
} finally {
|
|
317
310
|
cleanup(base);
|
|
318
311
|
}
|
|
319
|
-
}
|
|
312
|
+
});
|
|
320
313
|
|
|
321
314
|
// ─── Test Group 7: unique-id-deps ──────────────────────────────────────
|
|
322
315
|
// M004-0zjrg0 is complete, M005-b0m2hl depends_on M004-0zjrg0 → M005 should activate.
|
|
323
316
|
// Regression: parseContextDependsOn() used .toUpperCase(), converting "M004-0zjrg0"
|
|
324
317
|
// to "M004-0ZJRG0", breaking the case-sensitive lookup in completeMilestoneIds.
|
|
325
|
-
|
|
326
|
-
{
|
|
318
|
+
test('unique-id-deps: unique milestone IDs with lowercase hex suffix', async () => {
|
|
327
319
|
const base = createFixtureBase();
|
|
328
320
|
try {
|
|
329
321
|
// M004-0zjrg0: complete (all slices done + SUMMARY present)
|
|
@@ -344,23 +336,22 @@ async function main(): Promise<void> {
|
|
|
344
336
|
|
|
345
337
|
const state = await deriveState(base);
|
|
346
338
|
|
|
347
|
-
|
|
339
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M004-0zjrg0')?.status, 'complete',
|
|
348
340
|
'unique-id-deps: M004-0zjrg0 is complete');
|
|
349
|
-
|
|
341
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M005-b0m2hl')?.status, 'active',
|
|
350
342
|
'unique-id-deps: M005-b0m2hl is active (dep on M004-0zjrg0 met)');
|
|
351
|
-
|
|
343
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M005-b0m2hl',
|
|
352
344
|
'unique-id-deps: activeMilestone is M005-b0m2hl');
|
|
353
|
-
|
|
345
|
+
assert.ok(state.phase !== 'blocked',
|
|
354
346
|
'unique-id-deps: phase is not blocked');
|
|
355
347
|
} finally {
|
|
356
348
|
cleanup(base);
|
|
357
349
|
}
|
|
358
|
-
}
|
|
350
|
+
});
|
|
359
351
|
|
|
360
352
|
// ─── Test Group 8: unique-id-deps-blocked ─────────────────────────────
|
|
361
353
|
// M004-0zjrg0 is NOT complete, M005-b0m2hl depends_on M004-0zjrg0 → M005 should be pending
|
|
362
|
-
|
|
363
|
-
{
|
|
354
|
+
test('unique-id-deps-blocked: unique ID dep not yet met', async () => {
|
|
364
355
|
const base = createFixtureBase();
|
|
365
356
|
try {
|
|
366
357
|
// M004-0zjrg0: incomplete (slice not done)
|
|
@@ -388,20 +379,19 @@ async function main(): Promise<void> {
|
|
|
388
379
|
|
|
389
380
|
const state = await deriveState(base);
|
|
390
381
|
|
|
391
|
-
|
|
382
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M004-0zjrg0',
|
|
392
383
|
'unique-id-deps-blocked: activeMilestone is M004-0zjrg0');
|
|
393
|
-
|
|
384
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M005-b0m2hl')?.status, 'pending',
|
|
394
385
|
'unique-id-deps-blocked: M005-b0m2hl is pending (dep not met)');
|
|
395
386
|
} finally {
|
|
396
387
|
cleanup(base);
|
|
397
388
|
}
|
|
398
|
-
}
|
|
389
|
+
});
|
|
399
390
|
|
|
400
391
|
// ─── Test Group 9: draft-context-deps ────────────────────────────────
|
|
401
392
|
// M001 is incomplete, M002 has only CONTEXT-DRAFT.md (no CONTEXT.md) with
|
|
402
393
|
// depends_on: [M001] → M002 should remain pending, not be promoted to active.
|
|
403
|
-
|
|
404
|
-
{
|
|
394
|
+
test('draft-context-deps: depends_on read from CONTEXT-DRAFT.md', async () => {
|
|
405
395
|
const base = createFixtureBase();
|
|
406
396
|
try {
|
|
407
397
|
// M001: incomplete (one slice, no SUMMARY)
|
|
@@ -439,18 +429,17 @@ async function main(): Promise<void> {
|
|
|
439
429
|
|
|
440
430
|
const state = await deriveState(base);
|
|
441
431
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
432
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'active', 'draft-context-deps: M001 is active');
|
|
433
|
+
assert.deepStrictEqual(state.registry[1]?.status, 'pending', 'draft-context-deps: M002 is pending (dep-blocked via draft)');
|
|
434
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001', 'draft-context-deps: activeMilestone is M001');
|
|
445
435
|
} finally {
|
|
446
436
|
cleanup(base);
|
|
447
437
|
}
|
|
448
|
-
}
|
|
438
|
+
});
|
|
449
439
|
|
|
450
440
|
// ─── Test Group 10: draft-context-deps-no-roadmap ──────────────────────
|
|
451
441
|
// Same as above but without roadmaps — milestones discovered from directory only.
|
|
452
|
-
|
|
453
|
-
{
|
|
442
|
+
test('draft-context-deps-no-roadmap: depends_on from draft without roadmap', async () => {
|
|
454
443
|
const base = createFixtureBase();
|
|
455
444
|
try {
|
|
456
445
|
// M001: exists as directory only (no roadmap, no summary)
|
|
@@ -463,40 +452,38 @@ async function main(): Promise<void> {
|
|
|
463
452
|
const state = await deriveState(base);
|
|
464
453
|
|
|
465
454
|
const m002Entry = state.registry.find(e => e.id === 'M002');
|
|
466
|
-
|
|
455
|
+
assert.deepStrictEqual(m002Entry?.status, 'pending', 'draft-no-roadmap: M002 is pending (dep-blocked via draft)');
|
|
467
456
|
} finally {
|
|
468
457
|
cleanup(base);
|
|
469
458
|
}
|
|
470
|
-
}
|
|
459
|
+
});
|
|
471
460
|
|
|
472
461
|
// ─── Test Group 11: parseContextDependsOn preserves case ──────────────
|
|
473
462
|
// Direct unit test: verify the parsed dep ID matches the input exactly
|
|
474
|
-
|
|
475
|
-
{
|
|
463
|
+
test('parseContextDependsOn: preserves case of unique IDs', async () => {
|
|
476
464
|
const { parseContextDependsOn } = await import('../files.ts');
|
|
477
465
|
|
|
478
466
|
const deps1 = parseContextDependsOn('---\ndepends_on: [M004-0zjrg0]\n---\n');
|
|
479
|
-
|
|
467
|
+
assert.deepStrictEqual(deps1[0], 'M004-0zjrg0',
|
|
480
468
|
'parseContextDependsOn preserves lowercase hex suffix');
|
|
481
469
|
|
|
482
470
|
const deps2 = parseContextDependsOn('---\ndepends_on: [M001, M004-abc123]\n---\n');
|
|
483
|
-
|
|
484
|
-
|
|
471
|
+
assert.deepStrictEqual(deps2[0], 'M001', 'preserves classic uppercase ID');
|
|
472
|
+
assert.deepStrictEqual(deps2[1], 'M004-abc123', 'preserves mixed-case unique ID');
|
|
485
473
|
|
|
486
474
|
const deps3 = parseContextDependsOn('---\ndepends_on: []\n---\n');
|
|
487
|
-
|
|
475
|
+
assert.deepStrictEqual(deps3.length, 0, 'empty deps returns empty array');
|
|
488
476
|
|
|
489
477
|
const deps4 = parseContextDependsOn(null);
|
|
490
|
-
|
|
491
|
-
}
|
|
478
|
+
assert.deepStrictEqual(deps4.length, 0, 'null content returns empty array');
|
|
479
|
+
});
|
|
492
480
|
|
|
493
481
|
// ─── Test Group 10: draft-only-deps-blocked (#1724) ────────────────────
|
|
494
482
|
// M002 has only CONTEXT-DRAFT.md (no CONTEXT.md) with depends_on: [M001].
|
|
495
483
|
// M001 is incomplete → M002 must remain pending, not get promoted to active.
|
|
496
484
|
// Regression: before #1724, parseContextDependsOn received null for draft-only
|
|
497
485
|
// milestones, returning [], which caused dep-blocked milestones to be promoted.
|
|
498
|
-
|
|
499
|
-
{
|
|
486
|
+
test('draft-only-deps-blocked: CONTEXT-DRAFT.md depends_on blocks promotion', async () => {
|
|
500
487
|
const base = createFixtureBase();
|
|
501
488
|
try {
|
|
502
489
|
// M001: incomplete (one slice, no SUMMARY)
|
|
@@ -525,22 +512,21 @@ async function main(): Promise<void> {
|
|
|
525
512
|
|
|
526
513
|
const state = await deriveState(base);
|
|
527
514
|
|
|
528
|
-
|
|
515
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001',
|
|
529
516
|
'draft-only-deps-blocked: activeMilestone is M001');
|
|
530
|
-
|
|
517
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M002')?.status, 'pending',
|
|
531
518
|
'draft-only-deps-blocked: M002 is pending (dep on M001 not met, read from CONTEXT-DRAFT)');
|
|
532
|
-
|
|
519
|
+
assert.ok(state.phase !== 'blocked',
|
|
533
520
|
'draft-only-deps-blocked: phase is not blocked (M001 is active)');
|
|
534
521
|
} finally {
|
|
535
522
|
cleanup(base);
|
|
536
523
|
}
|
|
537
|
-
}
|
|
524
|
+
});
|
|
538
525
|
|
|
539
526
|
// ─── Test Group 11: draft-only-deps-unblocked (#1724) ─────────────────
|
|
540
527
|
// M001 is complete, M002 has only CONTEXT-DRAFT.md with depends_on: [M001].
|
|
541
528
|
// M002 should become active because its dep is satisfied.
|
|
542
|
-
|
|
543
|
-
{
|
|
529
|
+
test('draft-only-deps-unblocked: CONTEXT-DRAFT.md dep met → milestone activates', async () => {
|
|
544
530
|
const base = createFixtureBase();
|
|
545
531
|
try {
|
|
546
532
|
// M001: complete
|
|
@@ -561,22 +547,21 @@ async function main(): Promise<void> {
|
|
|
561
547
|
|
|
562
548
|
const state = await deriveState(base);
|
|
563
549
|
|
|
564
|
-
|
|
550
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M001')?.status, 'complete',
|
|
565
551
|
'draft-only-deps-unblocked: M001 is complete');
|
|
566
|
-
|
|
552
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M002')?.status, 'active',
|
|
567
553
|
'draft-only-deps-unblocked: M002 is active (dep on M001 met via CONTEXT-DRAFT)');
|
|
568
|
-
|
|
554
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M002',
|
|
569
555
|
'draft-only-deps-unblocked: activeMilestone is M002');
|
|
570
556
|
} finally {
|
|
571
557
|
cleanup(base);
|
|
572
558
|
}
|
|
573
|
-
}
|
|
559
|
+
});
|
|
574
560
|
|
|
575
561
|
// ─── Test Group 12: draft-only-deps-with-roadmap (#1724) ──────────────
|
|
576
562
|
// M002 has a roadmap + only CONTEXT-DRAFT.md with depends_on: [M001].
|
|
577
563
|
// Tests the has-roadmap code path (second occurrence of the fix).
|
|
578
|
-
|
|
579
|
-
{
|
|
564
|
+
test('draft-only-deps-with-roadmap: has-roadmap path reads CONTEXT-DRAFT deps', async () => {
|
|
580
565
|
const base = createFixtureBase();
|
|
581
566
|
try {
|
|
582
567
|
// M001: incomplete
|
|
@@ -614,20 +599,19 @@ async function main(): Promise<void> {
|
|
|
614
599
|
|
|
615
600
|
const state = await deriveState(base);
|
|
616
601
|
|
|
617
|
-
|
|
602
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M001',
|
|
618
603
|
'draft-only-deps-with-roadmap: activeMilestone is M001');
|
|
619
|
-
|
|
604
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M002')?.status, 'pending',
|
|
620
605
|
'draft-only-deps-with-roadmap: M002 is pending (dep read from CONTEXT-DRAFT in has-roadmap path)');
|
|
621
606
|
} finally {
|
|
622
607
|
cleanup(base);
|
|
623
608
|
}
|
|
624
|
-
}
|
|
609
|
+
});
|
|
625
610
|
|
|
626
611
|
// ─── Test Group 13: draft-only-no-deps (#1724) ────────────────────────
|
|
627
612
|
// M002 has only CONTEXT-DRAFT.md with NO depends_on field.
|
|
628
613
|
// Should behave same as no context file — normal sequential behavior.
|
|
629
|
-
|
|
630
|
-
{
|
|
614
|
+
test('draft-only-no-deps: CONTEXT-DRAFT without depends_on → no constraint', async () => {
|
|
631
615
|
const base = createFixtureBase();
|
|
632
616
|
try {
|
|
633
617
|
// M001: complete
|
|
@@ -648,17 +632,10 @@ async function main(): Promise<void> {
|
|
|
648
632
|
|
|
649
633
|
const state = await deriveState(base);
|
|
650
634
|
|
|
651
|
-
|
|
635
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M002')?.status, 'active',
|
|
652
636
|
'draft-only-no-deps: M002 is active (no deps constraint in draft)');
|
|
653
637
|
} finally {
|
|
654
638
|
cleanup(base);
|
|
655
639
|
}
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
report();
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
main().catch((error) => {
|
|
662
|
-
console.error(error);
|
|
663
|
-
process.exit(1);
|
|
640
|
+
});
|
|
664
641
|
});
|