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,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
|
|
2
4
|
import { join } from 'node:path';
|
|
3
5
|
import { tmpdir } from 'node:os';
|
|
@@ -6,26 +8,7 @@ import { deriveState, invalidateStateCache, getActiveMilestoneId } from '../stat
|
|
|
6
8
|
import { clearPathCache } from '../paths.ts';
|
|
7
9
|
import { parkMilestone, unparkMilestone, discardMilestone, isParked, getParkedReason } from '../milestone-actions.ts';
|
|
8
10
|
|
|
9
|
-
let passed = 0;
|
|
10
|
-
let failed = 0;
|
|
11
11
|
|
|
12
|
-
function assert(condition: boolean, message: string): void {
|
|
13
|
-
if (condition) {
|
|
14
|
-
passed++;
|
|
15
|
-
} else {
|
|
16
|
-
failed++;
|
|
17
|
-
console.error(` FAIL: ${message}`);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function assertEq<T>(actual: T, expected: T, message: string): void {
|
|
22
|
-
if (JSON.stringify(actual) === JSON.stringify(expected)) {
|
|
23
|
-
passed++;
|
|
24
|
-
} else {
|
|
25
|
-
failed++;
|
|
26
|
-
console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
12
|
|
|
30
13
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
31
14
|
|
|
@@ -89,30 +72,28 @@ function clearCaches(): void {
|
|
|
89
72
|
// Tests
|
|
90
73
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
91
74
|
|
|
92
|
-
async function main(): Promise<void> {
|
|
93
|
-
|
|
94
75
|
// ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
|
|
95
|
-
|
|
96
|
-
|
|
76
|
+
|
|
77
|
+
describe('park-milestone', () => {
|
|
78
|
+
test('parkMilestone creates PARKED.md', () => {
|
|
97
79
|
const base = createFixtureBase();
|
|
98
80
|
try {
|
|
99
81
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
100
82
|
clearCaches();
|
|
101
83
|
|
|
102
84
|
const success = parkMilestone(base, 'M001', 'Priority shift');
|
|
103
|
-
assert(success, 'parkMilestone returns true');
|
|
104
|
-
assert(isParked(base, 'M001'), 'isParked returns true after parking');
|
|
85
|
+
assert.ok(success, 'parkMilestone returns true');
|
|
86
|
+
assert.ok(isParked(base, 'M001'), 'isParked returns true after parking');
|
|
105
87
|
|
|
106
88
|
const reason = getParkedReason(base, 'M001');
|
|
107
|
-
|
|
89
|
+
assert.deepStrictEqual(reason, 'Priority shift', 'reason matches');
|
|
108
90
|
} finally {
|
|
109
91
|
cleanup(base);
|
|
110
92
|
}
|
|
111
|
-
|
|
93
|
+
});
|
|
112
94
|
|
|
113
95
|
// ─── Test 2: parkMilestone is idempotent — fails if already parked ────
|
|
114
|
-
|
|
115
|
-
{
|
|
96
|
+
test('parkMilestone fails if already parked', () => {
|
|
116
97
|
const base = createFixtureBase();
|
|
117
98
|
try {
|
|
118
99
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -120,50 +101,47 @@ async function main(): Promise<void> {
|
|
|
120
101
|
|
|
121
102
|
parkMilestone(base, 'M001', 'First park');
|
|
122
103
|
const secondPark = parkMilestone(base, 'M001', 'Second park');
|
|
123
|
-
assert(!secondPark, 'second parkMilestone returns false');
|
|
124
|
-
|
|
104
|
+
assert.ok(!secondPark, 'second parkMilestone returns false');
|
|
105
|
+
assert.deepStrictEqual(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
|
|
125
106
|
} finally {
|
|
126
107
|
cleanup(base);
|
|
127
108
|
}
|
|
128
|
-
|
|
109
|
+
});
|
|
129
110
|
|
|
130
111
|
// ─── Test 3: unparkMilestone removes PARKED.md ────────────────────────
|
|
131
|
-
|
|
132
|
-
{
|
|
112
|
+
test('unparkMilestone removes PARKED.md', () => {
|
|
133
113
|
const base = createFixtureBase();
|
|
134
114
|
try {
|
|
135
115
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
136
116
|
clearCaches();
|
|
137
117
|
|
|
138
118
|
parkMilestone(base, 'M001', 'Test reason');
|
|
139
|
-
assert(isParked(base, 'M001'), 'milestone is parked');
|
|
119
|
+
assert.ok(isParked(base, 'M001'), 'milestone is parked');
|
|
140
120
|
|
|
141
121
|
const success = unparkMilestone(base, 'M001');
|
|
142
|
-
assert(success, 'unparkMilestone returns true');
|
|
143
|
-
assert(!isParked(base, 'M001'), 'isParked returns false after unpark');
|
|
122
|
+
assert.ok(success, 'unparkMilestone returns true');
|
|
123
|
+
assert.ok(!isParked(base, 'M001'), 'isParked returns false after unpark');
|
|
144
124
|
} finally {
|
|
145
125
|
cleanup(base);
|
|
146
126
|
}
|
|
147
|
-
|
|
127
|
+
});
|
|
148
128
|
|
|
149
129
|
// ─── Test 4: unparkMilestone fails if not parked ──────────────────────
|
|
150
|
-
|
|
151
|
-
{
|
|
130
|
+
test('unparkMilestone fails if not parked', () => {
|
|
152
131
|
const base = createFixtureBase();
|
|
153
132
|
try {
|
|
154
133
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
155
134
|
clearCaches();
|
|
156
135
|
|
|
157
136
|
const result = unparkMilestone(base, 'M001');
|
|
158
|
-
assert(!result, 'unparkMilestone returns false when not parked');
|
|
137
|
+
assert.ok(!result, 'unparkMilestone returns false when not parked');
|
|
159
138
|
} finally {
|
|
160
139
|
cleanup(base);
|
|
161
140
|
}
|
|
162
|
-
|
|
141
|
+
});
|
|
163
142
|
|
|
164
143
|
// ─── Test 5: deriveState returns 'parked' status ──────────────────────
|
|
165
|
-
|
|
166
|
-
{
|
|
144
|
+
test('deriveState returns parked status', async () => {
|
|
167
145
|
const base = createFixtureBase();
|
|
168
146
|
try {
|
|
169
147
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -173,16 +151,15 @@ async function main(): Promise<void> {
|
|
|
173
151
|
|
|
174
152
|
const state = await deriveState(base);
|
|
175
153
|
const entry = state.registry.find(e => e.id === 'M001');
|
|
176
|
-
assert(!!entry, 'M001 in registry');
|
|
177
|
-
|
|
154
|
+
assert.ok(!!entry, 'M001 in registry');
|
|
155
|
+
assert.deepStrictEqual(entry?.status, 'parked', 'status is parked');
|
|
178
156
|
} finally {
|
|
179
157
|
cleanup(base);
|
|
180
158
|
}
|
|
181
|
-
|
|
159
|
+
});
|
|
182
160
|
|
|
183
161
|
// ─── Test 6: deriveState skips parked milestone for active ─────────────
|
|
184
|
-
|
|
185
|
-
{
|
|
162
|
+
test('deriveState skips parked milestone', async () => {
|
|
186
163
|
const base = createFixtureBase();
|
|
187
164
|
try {
|
|
188
165
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -191,29 +168,28 @@ async function main(): Promise<void> {
|
|
|
191
168
|
|
|
192
169
|
// Before park: M001 is active
|
|
193
170
|
const stateBefore = await deriveState(base);
|
|
194
|
-
|
|
171
|
+
assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
|
|
195
172
|
|
|
196
173
|
parkMilestone(base, 'M001', 'Testing');
|
|
197
174
|
|
|
198
175
|
// After park: M002 becomes active
|
|
199
176
|
const stateAfter = await deriveState(base);
|
|
200
|
-
|
|
177
|
+
assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
|
|
201
178
|
|
|
202
179
|
// M001 still in registry as parked
|
|
203
180
|
const m001 = stateAfter.registry.find(e => e.id === 'M001');
|
|
204
|
-
|
|
181
|
+
assert.deepStrictEqual(m001?.status, 'parked', 'M001 has parked status');
|
|
205
182
|
|
|
206
183
|
// M002 is active
|
|
207
184
|
const m002 = stateAfter.registry.find(e => e.id === 'M002');
|
|
208
|
-
|
|
185
|
+
assert.deepStrictEqual(m002?.status, 'active', 'M002 has active status');
|
|
209
186
|
} finally {
|
|
210
187
|
cleanup(base);
|
|
211
188
|
}
|
|
212
|
-
|
|
189
|
+
});
|
|
213
190
|
|
|
214
191
|
// ─── Test 7: getActiveMilestoneId skips parked ────────────────────────
|
|
215
|
-
|
|
216
|
-
{
|
|
192
|
+
test('getActiveMilestoneId skips parked', async () => {
|
|
217
193
|
const base = createFixtureBase();
|
|
218
194
|
try {
|
|
219
195
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -223,15 +199,14 @@ async function main(): Promise<void> {
|
|
|
223
199
|
parkMilestone(base, 'M001', 'Testing');
|
|
224
200
|
|
|
225
201
|
const activeId = await getActiveMilestoneId(base);
|
|
226
|
-
|
|
202
|
+
assert.deepStrictEqual(activeId, 'M002', 'getActiveMilestoneId returns M002');
|
|
227
203
|
} finally {
|
|
228
204
|
cleanup(base);
|
|
229
205
|
}
|
|
230
|
-
|
|
206
|
+
});
|
|
231
207
|
|
|
232
208
|
// ─── Test 8: Parked milestone does NOT satisfy depends_on ─────────────
|
|
233
|
-
|
|
234
|
-
{
|
|
209
|
+
test('Parked milestone does not satisfy depends_on', async () => {
|
|
235
210
|
const base = createFixtureBase();
|
|
236
211
|
try {
|
|
237
212
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -243,18 +218,17 @@ async function main(): Promise<void> {
|
|
|
243
218
|
const state = await deriveState(base);
|
|
244
219
|
// M001 is parked, M002 depends on M001 → M002 should be pending, not active
|
|
245
220
|
const m002 = state.registry.find(e => e.id === 'M002');
|
|
246
|
-
|
|
221
|
+
assert.deepStrictEqual(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
|
|
247
222
|
|
|
248
223
|
// No active milestone (both are blocked/parked)
|
|
249
|
-
|
|
224
|
+
assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone');
|
|
250
225
|
} finally {
|
|
251
226
|
cleanup(base);
|
|
252
227
|
}
|
|
253
|
-
|
|
228
|
+
});
|
|
254
229
|
|
|
255
230
|
// ─── Test 9: Park then unpark restores correct status ─────────────────
|
|
256
|
-
|
|
257
|
-
{
|
|
231
|
+
test('Park then unpark restores status', async () => {
|
|
258
232
|
const base = createFixtureBase();
|
|
259
233
|
try {
|
|
260
234
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -264,43 +238,41 @@ async function main(): Promise<void> {
|
|
|
264
238
|
// Park M001
|
|
265
239
|
parkMilestone(base, 'M001', 'Testing');
|
|
266
240
|
const stateParked = await deriveState(base);
|
|
267
|
-
|
|
241
|
+
assert.deepStrictEqual(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
|
|
268
242
|
|
|
269
243
|
// Unpark M001 — M001 should become active again (it's first in queue)
|
|
270
244
|
unparkMilestone(base, 'M001');
|
|
271
245
|
const stateUnparked = await deriveState(base);
|
|
272
|
-
|
|
273
|
-
|
|
246
|
+
assert.deepStrictEqual(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
|
|
247
|
+
assert.deepStrictEqual(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
|
|
274
248
|
} finally {
|
|
275
249
|
cleanup(base);
|
|
276
250
|
}
|
|
277
|
-
|
|
251
|
+
});
|
|
278
252
|
|
|
279
253
|
// ─── Test 10: discardMilestone removes directory ──────────────────────
|
|
280
|
-
|
|
281
|
-
{
|
|
254
|
+
test('discardMilestone removes directory', async () => {
|
|
282
255
|
const base = createFixtureBase();
|
|
283
256
|
try {
|
|
284
257
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
285
258
|
clearCaches();
|
|
286
259
|
|
|
287
260
|
const mDir = join(base, '.gsd', 'milestones', 'M001');
|
|
288
|
-
assert(existsSync(mDir), 'milestone dir exists before discard');
|
|
261
|
+
assert.ok(existsSync(mDir), 'milestone dir exists before discard');
|
|
289
262
|
|
|
290
263
|
const success = discardMilestone(base, 'M001');
|
|
291
|
-
assert(success, 'discardMilestone returns true');
|
|
292
|
-
assert(!existsSync(mDir), 'milestone dir removed after discard');
|
|
264
|
+
assert.ok(success, 'discardMilestone returns true');
|
|
265
|
+
assert.ok(!existsSync(mDir), 'milestone dir removed after discard');
|
|
293
266
|
|
|
294
267
|
const state = await deriveState(base);
|
|
295
|
-
assert(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
|
|
268
|
+
assert.ok(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
|
|
296
269
|
} finally {
|
|
297
270
|
cleanup(base);
|
|
298
271
|
}
|
|
299
|
-
|
|
272
|
+
});
|
|
300
273
|
|
|
301
274
|
// ─── Test 11: discardMilestone updates queue order ────────────────────
|
|
302
|
-
|
|
303
|
-
{
|
|
275
|
+
test('discardMilestone updates queue order', () => {
|
|
304
276
|
const base = createFixtureBase();
|
|
305
277
|
try {
|
|
306
278
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -315,16 +287,15 @@ async function main(): Promise<void> {
|
|
|
315
287
|
|
|
316
288
|
// Queue order should no longer include M001
|
|
317
289
|
const queueContent = JSON.parse(readFileSync(queuePath, 'utf-8'));
|
|
318
|
-
assert(!queueContent.order.includes('M001'), 'M001 removed from queue order');
|
|
319
|
-
assert(queueContent.order.includes('M002'), 'M002 still in queue order');
|
|
290
|
+
assert.ok(!queueContent.order.includes('M001'), 'M001 removed from queue order');
|
|
291
|
+
assert.ok(queueContent.order.includes('M002'), 'M002 still in queue order');
|
|
320
292
|
} finally {
|
|
321
293
|
cleanup(base);
|
|
322
294
|
}
|
|
323
|
-
|
|
295
|
+
});
|
|
324
296
|
|
|
325
297
|
// ─── Test 12: All milestones parked → no active milestone ─────────────
|
|
326
|
-
|
|
327
|
-
{
|
|
298
|
+
test('All milestones parked → no active', async () => {
|
|
328
299
|
const base = createFixtureBase();
|
|
329
300
|
try {
|
|
330
301
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -333,18 +304,17 @@ async function main(): Promise<void> {
|
|
|
333
304
|
parkMilestone(base, 'M001', 'Testing');
|
|
334
305
|
|
|
335
306
|
const state = await deriveState(base);
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
assert(state.registry.length === 1, 'registry still has 1 entry');
|
|
339
|
-
|
|
307
|
+
assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone when all parked');
|
|
308
|
+
assert.deepStrictEqual(state.phase, 'pre-planning', 'phase is pre-planning');
|
|
309
|
+
assert.ok(state.registry.length === 1, 'registry still has 1 entry');
|
|
310
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'parked', 'entry is parked');
|
|
340
311
|
} finally {
|
|
341
312
|
cleanup(base);
|
|
342
313
|
}
|
|
343
|
-
|
|
314
|
+
});
|
|
344
315
|
|
|
345
316
|
// ─── Test 13: Parked milestone without roadmap ────────────────────────
|
|
346
|
-
|
|
347
|
-
{
|
|
317
|
+
test('Park milestone without roadmap', async () => {
|
|
348
318
|
const base = createFixtureBase();
|
|
349
319
|
try {
|
|
350
320
|
createMilestone(base, 'M001'); // No roadmap
|
|
@@ -354,16 +324,15 @@ async function main(): Promise<void> {
|
|
|
354
324
|
parkMilestone(base, 'M001', 'Not ready yet');
|
|
355
325
|
|
|
356
326
|
const state = await deriveState(base);
|
|
357
|
-
|
|
358
|
-
|
|
327
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
|
|
328
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
|
|
359
329
|
} finally {
|
|
360
330
|
cleanup(base);
|
|
361
331
|
}
|
|
362
|
-
|
|
332
|
+
});
|
|
363
333
|
|
|
364
334
|
// ─── Test 14: Progress counts with parked milestone ───────────────────
|
|
365
|
-
|
|
366
|
-
{
|
|
335
|
+
test('Progress counts with parked', async () => {
|
|
367
336
|
const base = createFixtureBase();
|
|
368
337
|
try {
|
|
369
338
|
createMilestone(base, 'M001', { withRoadmap: true, withSummary: true }); // complete
|
|
@@ -374,28 +343,12 @@ async function main(): Promise<void> {
|
|
|
374
343
|
parkMilestone(base, 'M002', 'Parked');
|
|
375
344
|
|
|
376
345
|
const state = await deriveState(base);
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
346
|
+
assert.deepStrictEqual(state.progress?.milestones.done, 1, '1 complete milestone');
|
|
347
|
+
assert.deepStrictEqual(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
|
|
348
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M003', 'M003 is active');
|
|
380
349
|
} finally {
|
|
381
350
|
cleanup(base);
|
|
382
351
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
386
|
-
// Results
|
|
387
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
388
|
-
|
|
389
|
-
console.log(`\n${'='.repeat(40)}`);
|
|
390
|
-
console.log(`Results: ${passed} passed, ${failed} failed`);
|
|
391
|
-
if (failed > 0) {
|
|
392
|
-
process.exit(1);
|
|
393
|
-
} else {
|
|
394
|
-
console.log('All tests passed ✓');
|
|
395
|
-
}
|
|
396
|
-
}
|
|
352
|
+
});
|
|
397
353
|
|
|
398
|
-
main().catch((error) => {
|
|
399
|
-
console.error(error);
|
|
400
|
-
process.exit(1);
|
|
401
354
|
});
|