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
|
@@ -10,9 +10,9 @@ import { parsePlanningDirectory } from '../migrate/parser.ts';
|
|
|
10
10
|
import { validatePlanningDirectory } from '../migrate/validator.ts';
|
|
11
11
|
|
|
12
12
|
import type { PlanningProject, ValidationResult } from '../migrate/types.ts';
|
|
13
|
-
import {
|
|
13
|
+
import { describe, test, beforeEach, afterEach } from 'node:test';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
14
15
|
|
|
15
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
16
16
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
17
17
|
|
|
18
18
|
function createFixtureBase(): string {
|
|
@@ -241,11 +241,9 @@ Fixed the login button by correcting the touch event handler.
|
|
|
241
241
|
// Test Groups
|
|
242
242
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
243
243
|
|
|
244
|
-
async function main(): Promise<void> {
|
|
245
|
-
|
|
246
244
|
// ─── Test 1: Complete .planning directory ──────────────────────────────
|
|
247
|
-
|
|
248
|
-
|
|
245
|
+
|
|
246
|
+
test('Complete .planning directory with all file types', async () => {
|
|
249
247
|
const base = createFixtureBase();
|
|
250
248
|
try {
|
|
251
249
|
const planning = createPlanningDir(base);
|
|
@@ -313,86 +311,86 @@ Dashboard needs auth to be complete first.
|
|
|
313
311
|
const project = await parsePlanningDirectory(planning);
|
|
314
312
|
|
|
315
313
|
// Top-level structure
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
314
|
+
assert.deepStrictEqual(project.path, planning, 'project.path matches');
|
|
315
|
+
assert.ok(project.project !== null, 'PROJECT.md parsed');
|
|
316
|
+
assert.ok(project.roadmap !== null, 'ROADMAP.md parsed');
|
|
317
|
+
assert.ok(project.requirements.length > 0, 'requirements parsed');
|
|
318
|
+
assert.ok(project.state !== null, 'STATE.md parsed');
|
|
319
|
+
assert.ok(project.config !== null, 'config.json parsed');
|
|
322
320
|
|
|
323
321
|
// Phases
|
|
324
|
-
|
|
325
|
-
|
|
322
|
+
assert.ok('29-auth-system' in project.phases, 'phase 29 present');
|
|
323
|
+
assert.ok('30-dashboard' in project.phases, 'phase 30 present');
|
|
326
324
|
|
|
327
325
|
const phase29 = project.phases['29-auth-system'];
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
326
|
+
assert.deepStrictEqual(phase29?.number, 29, 'phase 29 number');
|
|
327
|
+
assert.deepStrictEqual(phase29?.slug, 'auth-system', 'phase 29 slug');
|
|
328
|
+
assert.ok('01' in (phase29?.plans ?? {}), 'phase 29 has plan 01');
|
|
329
|
+
assert.ok('01' in (phase29?.summaries ?? {}), 'phase 29 has summary 01');
|
|
330
|
+
assert.ok((phase29?.research?.length ?? 0) > 0, 'phase 29 has research');
|
|
333
331
|
|
|
334
332
|
// Plan content (XML-in-markdown)
|
|
335
333
|
const plan29 = phase29?.plans?.['01'];
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
334
|
+
assert.ok(plan29 !== undefined, 'plan 29-01 exists');
|
|
335
|
+
assert.ok(plan29?.objective?.includes('authentication') ?? false, 'plan objective extracted');
|
|
336
|
+
assert.ok((plan29?.tasks?.length ?? 0) >= 3, 'plan tasks extracted');
|
|
337
|
+
assert.ok(plan29?.context?.includes('JWT') ?? false, 'plan context extracted');
|
|
338
|
+
assert.ok(plan29?.verification !== '', 'plan verification extracted');
|
|
339
|
+
assert.ok(plan29?.successCriteria !== '', 'plan success criteria extracted');
|
|
342
340
|
|
|
343
341
|
// Plan frontmatter
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
342
|
+
assert.deepStrictEqual(plan29?.frontmatter?.phase, '29-auth-system', 'plan frontmatter phase');
|
|
343
|
+
assert.deepStrictEqual(plan29?.frontmatter?.plan, '01', 'plan frontmatter plan');
|
|
344
|
+
assert.deepStrictEqual(plan29?.frontmatter?.type, 'implementation', 'plan frontmatter type');
|
|
345
|
+
assert.deepStrictEqual(plan29?.frontmatter?.wave, 1, 'plan frontmatter wave');
|
|
346
|
+
assert.deepStrictEqual(plan29?.frontmatter?.autonomous, true, 'plan frontmatter autonomous');
|
|
349
347
|
|
|
350
348
|
// Summary content
|
|
351
349
|
const summary29 = phase29?.summaries?.['01'];
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
350
|
+
assert.ok(summary29 !== undefined, 'summary 29-01 exists');
|
|
351
|
+
assert.deepStrictEqual(summary29?.frontmatter?.phase, '29-auth-system', 'summary frontmatter phase');
|
|
352
|
+
assert.deepStrictEqual(summary29?.frontmatter?.plan, '01', 'summary frontmatter plan');
|
|
353
|
+
assert.deepStrictEqual(summary29?.frontmatter?.subsystem, 'auth', 'summary frontmatter subsystem');
|
|
354
|
+
assert.ok((summary29?.frontmatter?.tags?.length ?? 0) >= 2, 'summary frontmatter tags');
|
|
355
|
+
assert.ok((summary29?.frontmatter?.provides?.length ?? 0) >= 2, 'summary frontmatter provides');
|
|
356
|
+
assert.ok((summary29?.frontmatter?.affects?.length ?? 0) >= 1, 'summary frontmatter affects');
|
|
357
|
+
assert.ok((summary29?.frontmatter?.['tech-stack']?.length ?? 0) >= 2, 'summary frontmatter tech-stack');
|
|
358
|
+
assert.ok((summary29?.frontmatter?.['key-files']?.length ?? 0) >= 2, 'summary frontmatter key-files');
|
|
359
|
+
assert.ok((summary29?.frontmatter?.['key-decisions']?.length ?? 0) >= 2, 'summary frontmatter key-decisions');
|
|
360
|
+
assert.ok((summary29?.frontmatter?.['patterns-established']?.length ?? 0) >= 1, 'summary frontmatter patterns-established');
|
|
361
|
+
assert.deepStrictEqual(summary29?.frontmatter?.duration, '2h', 'summary frontmatter duration');
|
|
362
|
+
assert.deepStrictEqual(summary29?.frontmatter?.completed, '2026-01-15', 'summary frontmatter completed');
|
|
365
363
|
|
|
366
364
|
// Quick tasks
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
365
|
+
assert.ok(project.quickTasks.length >= 1, 'quick tasks parsed');
|
|
366
|
+
assert.deepStrictEqual(project.quickTasks[0]?.number, 1, 'quick task number');
|
|
367
|
+
assert.ok(project.quickTasks[0]?.plan !== null, 'quick task has plan');
|
|
368
|
+
assert.ok(project.quickTasks[0]?.summary !== null, 'quick task has summary');
|
|
371
369
|
|
|
372
370
|
// Milestones
|
|
373
|
-
|
|
371
|
+
assert.ok(project.milestones.length >= 1, 'milestones parsed');
|
|
374
372
|
|
|
375
373
|
// Root research
|
|
376
|
-
|
|
374
|
+
assert.ok(project.research.length >= 1, 'root research parsed');
|
|
377
375
|
|
|
378
376
|
// Config
|
|
379
|
-
|
|
377
|
+
assert.deepStrictEqual(project.config?.projectName, 'test-project', 'config projectName');
|
|
380
378
|
|
|
381
379
|
// State
|
|
382
|
-
|
|
383
|
-
|
|
380
|
+
assert.ok(project.state?.currentPhase?.includes('30') ?? false, 'state current phase');
|
|
381
|
+
assert.deepStrictEqual(project.state?.status, 'in-progress', 'state status');
|
|
384
382
|
|
|
385
383
|
// Validation
|
|
386
|
-
|
|
387
|
-
|
|
384
|
+
assert.deepStrictEqual(project.validation.valid, true, 'validation passes for complete dir');
|
|
385
|
+
assert.deepStrictEqual(project.validation.issues.length, 0, 'no validation issues');
|
|
388
386
|
} finally {
|
|
389
387
|
cleanup(base);
|
|
390
388
|
}
|
|
391
|
-
|
|
389
|
+
});
|
|
392
390
|
|
|
393
391
|
// ─── Test 2: Minimal .planning directory (only ROADMAP.md) ─────────────
|
|
394
|
-
|
|
395
|
-
|
|
392
|
+
|
|
393
|
+
test('Minimal .planning directory (only ROADMAP.md)', async () => {
|
|
396
394
|
const base = createFixtureBase();
|
|
397
395
|
try {
|
|
398
396
|
const planning = createPlanningDir(base);
|
|
@@ -400,42 +398,42 @@ Dashboard needs auth to be complete first.
|
|
|
400
398
|
|
|
401
399
|
const project = await parsePlanningDirectory(planning);
|
|
402
400
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
401
|
+
assert.deepStrictEqual(project.project, null, 'minimal: PROJECT.md is null');
|
|
402
|
+
assert.ok(project.roadmap !== null, 'minimal: ROADMAP.md parsed');
|
|
403
|
+
assert.deepStrictEqual(project.requirements.length, 0, 'minimal: no requirements');
|
|
404
|
+
assert.deepStrictEqual(project.state, null, 'minimal: no state');
|
|
405
|
+
assert.deepStrictEqual(project.config, null, 'minimal: no config');
|
|
406
|
+
assert.deepStrictEqual(Object.keys(project.phases).length, 0, 'minimal: no phases');
|
|
407
|
+
assert.deepStrictEqual(project.quickTasks.length, 0, 'minimal: no quick tasks');
|
|
408
|
+
assert.deepStrictEqual(project.milestones.length, 0, 'minimal: no milestones');
|
|
409
|
+
assert.deepStrictEqual(project.research.length, 0, 'minimal: no research');
|
|
410
|
+
assert.deepStrictEqual(project.validation.valid, true, 'minimal: validation passes');
|
|
413
411
|
} finally {
|
|
414
412
|
cleanup(base);
|
|
415
413
|
}
|
|
416
|
-
|
|
414
|
+
});
|
|
417
415
|
|
|
418
416
|
// ─── Test 3: Missing directory → validation fatal error ────────────────
|
|
419
|
-
|
|
420
|
-
|
|
417
|
+
|
|
418
|
+
test('Missing directory → validation returns fatal error', async () => {
|
|
421
419
|
const base = createFixtureBase();
|
|
422
420
|
try {
|
|
423
421
|
const result = await validatePlanningDirectory(join(base, 'nonexistent'));
|
|
424
422
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
423
|
+
assert.deepStrictEqual(result.valid, false, 'missing dir: validation fails');
|
|
424
|
+
assert.ok(result.issues.length > 0, 'missing dir: has issues');
|
|
425
|
+
assert.ok(
|
|
428
426
|
result.issues.some(i => i.severity === 'fatal'),
|
|
429
427
|
'missing dir: has fatal issue'
|
|
430
428
|
);
|
|
431
429
|
} finally {
|
|
432
430
|
cleanup(base);
|
|
433
431
|
}
|
|
434
|
-
|
|
432
|
+
});
|
|
435
433
|
|
|
436
434
|
// ─── Test 4: Duplicate phase numbers ───────────────────────────────────
|
|
437
|
-
|
|
438
|
-
|
|
435
|
+
|
|
436
|
+
test('Phase directory with duplicate numbers', async () => {
|
|
439
437
|
const base = createFixtureBase();
|
|
440
438
|
try {
|
|
441
439
|
const planning = createPlanningDir(base);
|
|
@@ -456,18 +454,18 @@ Dashboard needs auth to be complete first.
|
|
|
456
454
|
|
|
457
455
|
const project = await parsePlanningDirectory(planning);
|
|
458
456
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
457
|
+
assert.ok('45-core-infrastructure' in project.phases, 'dup nums: core-infrastructure phase present');
|
|
458
|
+
assert.ok('45-logging-config' in project.phases, 'dup nums: logging-config phase present');
|
|
459
|
+
assert.deepStrictEqual(project.phases['45-core-infrastructure']?.number, 45, 'dup nums: both have number 45 (a)');
|
|
460
|
+
assert.deepStrictEqual(project.phases['45-logging-config']?.number, 45, 'dup nums: both have number 45 (b)');
|
|
463
461
|
} finally {
|
|
464
462
|
cleanup(base);
|
|
465
463
|
}
|
|
466
|
-
|
|
464
|
+
});
|
|
467
465
|
|
|
468
466
|
// ─── Test 5: XML-in-markdown plan parsing ──────────────────────────────
|
|
469
|
-
|
|
470
|
-
|
|
467
|
+
|
|
468
|
+
test('Plan file with XML-in-markdown', async () => {
|
|
471
469
|
const base = createFixtureBase();
|
|
472
470
|
try {
|
|
473
471
|
const planning = createPlanningDir(base);
|
|
@@ -480,21 +478,21 @@ Dashboard needs auth to be complete first.
|
|
|
480
478
|
const project = await parsePlanningDirectory(planning);
|
|
481
479
|
const plan = project.phases['29-auth-system']?.plans?.['01'];
|
|
482
480
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
481
|
+
assert.ok(plan !== undefined, 'xml plan: plan exists');
|
|
482
|
+
assert.ok(plan?.objective?.includes('authentication') ?? false, 'xml plan: objective extracted');
|
|
483
|
+
assert.ok((plan?.tasks?.length ?? 0) === 3, 'xml plan: 3 tasks extracted');
|
|
484
|
+
assert.ok(plan?.tasks?.[0]?.includes('auth middleware') ?? false, 'xml plan: first task content');
|
|
485
|
+
assert.ok(plan?.context?.includes('JWT') ?? false, 'xml plan: context extracted');
|
|
486
|
+
assert.ok(plan?.verification?.includes('Login returns') ?? false, 'xml plan: verification extracted');
|
|
487
|
+
assert.ok(plan?.successCriteria?.includes('endpoints respond') ?? false, 'xml plan: success criteria extracted');
|
|
490
488
|
} finally {
|
|
491
489
|
cleanup(base);
|
|
492
490
|
}
|
|
493
|
-
|
|
491
|
+
});
|
|
494
492
|
|
|
495
493
|
// ─── Test 6: Summary file with YAML frontmatter ───────────────────────
|
|
496
|
-
|
|
497
|
-
|
|
494
|
+
|
|
495
|
+
test('Summary file with YAML frontmatter', async () => {
|
|
498
496
|
const base = createFixtureBase();
|
|
499
497
|
try {
|
|
500
498
|
const planning = createPlanningDir(base);
|
|
@@ -507,27 +505,27 @@ Dashboard needs auth to be complete first.
|
|
|
507
505
|
const project = await parsePlanningDirectory(planning);
|
|
508
506
|
const summary = project.phases['29-auth-system']?.summaries?.['01'];
|
|
509
507
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
508
|
+
assert.ok(summary !== undefined, 'summary fm: summary exists');
|
|
509
|
+
assert.deepStrictEqual(summary?.frontmatter?.phase, '29-auth-system', 'summary fm: phase');
|
|
510
|
+
assert.deepStrictEqual(summary?.frontmatter?.plan, '01', 'summary fm: plan');
|
|
511
|
+
assert.deepStrictEqual(summary?.frontmatter?.subsystem, 'auth', 'summary fm: subsystem');
|
|
512
|
+
assert.deepStrictEqual(summary?.frontmatter?.tags, ['authentication', 'security'], 'summary fm: tags');
|
|
513
|
+
assert.deepStrictEqual(summary?.frontmatter?.provides, ['auth-middleware', 'jwt-validation'], 'summary fm: provides');
|
|
514
|
+
assert.deepStrictEqual(summary?.frontmatter?.affects, ['api-routes'], 'summary fm: affects');
|
|
515
|
+
assert.deepStrictEqual(summary?.frontmatter?.['tech-stack'], ['jsonwebtoken', 'express'], 'summary fm: tech-stack');
|
|
516
|
+
assert.deepStrictEqual(summary?.frontmatter?.['key-files'], ['src/auth.ts', 'src/middleware/auth.ts'], 'summary fm: key-files');
|
|
517
|
+
assert.deepStrictEqual(summary?.frontmatter?.['key-decisions'], ['Use RS256 for JWT signing', 'Store refresh tokens in DB'], 'summary fm: key-decisions');
|
|
518
|
+
assert.deepStrictEqual(summary?.frontmatter?.['patterns-established'], ['Middleware-based auth'], 'summary fm: patterns-established');
|
|
519
|
+
assert.deepStrictEqual(summary?.frontmatter?.duration, '2h', 'summary fm: duration');
|
|
520
|
+
assert.deepStrictEqual(summary?.frontmatter?.completed, '2026-01-15', 'summary fm: completed');
|
|
523
521
|
} finally {
|
|
524
522
|
cleanup(base);
|
|
525
523
|
}
|
|
526
|
-
|
|
524
|
+
});
|
|
527
525
|
|
|
528
526
|
// ─── Test 7: Orphan summaries (no matching plan) ──────────────────────
|
|
529
|
-
|
|
530
|
-
|
|
527
|
+
|
|
528
|
+
test('Orphan summaries (no matching plan)', async () => {
|
|
531
529
|
const base = createFixtureBase();
|
|
532
530
|
try {
|
|
533
531
|
const planning = createPlanningDir(base);
|
|
@@ -561,19 +559,19 @@ Another orphan.
|
|
|
561
559
|
const project = await parsePlanningDirectory(planning);
|
|
562
560
|
const phase = project.phases['45-logging-config'];
|
|
563
561
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
562
|
+
assert.ok(phase !== undefined, 'orphan: phase exists');
|
|
563
|
+
assert.deepStrictEqual(Object.keys(phase?.plans ?? {}).length, 0, 'orphan: no plans');
|
|
564
|
+
assert.ok(Object.keys(phase?.summaries ?? {}).length >= 2, 'orphan: summaries preserved');
|
|
565
|
+
assert.ok('04' in (phase?.summaries ?? {}), 'orphan: summary 04 present');
|
|
566
|
+
assert.ok('05' in (phase?.summaries ?? {}), 'orphan: summary 05 present');
|
|
569
567
|
} finally {
|
|
570
568
|
cleanup(base);
|
|
571
569
|
}
|
|
572
|
-
|
|
570
|
+
});
|
|
573
571
|
|
|
574
572
|
// ─── Test 8: .archive/ directory skipped ──────────────────────────────
|
|
575
|
-
|
|
576
|
-
|
|
573
|
+
|
|
574
|
+
test('.archive/ directory → skipped by default', async () => {
|
|
577
575
|
const base = createFixtureBase();
|
|
578
576
|
try {
|
|
579
577
|
const planning = createPlanningDir(base);
|
|
@@ -591,17 +589,17 @@ Another orphan.
|
|
|
591
589
|
|
|
592
590
|
const project = await parsePlanningDirectory(planning);
|
|
593
591
|
|
|
594
|
-
|
|
592
|
+
assert.ok('29-auth-system' in project.phases, 'archive: normal phase present');
|
|
595
593
|
// Archive phases should not appear in the phases map
|
|
596
|
-
|
|
594
|
+
assert.ok(!Object.keys(project.phases).some(k => k.includes('old-auth')), 'archive: archived phase not present');
|
|
597
595
|
} finally {
|
|
598
596
|
cleanup(base);
|
|
599
597
|
}
|
|
600
|
-
|
|
598
|
+
});
|
|
601
599
|
|
|
602
600
|
// ─── Test 9: Quick tasks ──────────────────────────────────────────────
|
|
603
|
-
|
|
604
|
-
|
|
601
|
+
|
|
602
|
+
test('Quick tasks parsed', async () => {
|
|
605
603
|
const base = createFixtureBase();
|
|
606
604
|
try {
|
|
607
605
|
const planning = createPlanningDir(base);
|
|
@@ -620,22 +618,22 @@ Another orphan.
|
|
|
620
618
|
|
|
621
619
|
const project = await parsePlanningDirectory(planning);
|
|
622
620
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
621
|
+
assert.deepStrictEqual(project.quickTasks.length, 2, 'quick: 2 quick tasks');
|
|
622
|
+
assert.deepStrictEqual(project.quickTasks[0]?.number, 1, 'quick: first task number');
|
|
623
|
+
assert.deepStrictEqual(project.quickTasks[0]?.slug, 'fix-login', 'quick: first task slug');
|
|
624
|
+
assert.ok(project.quickTasks[0]?.plan !== null, 'quick: first task has plan');
|
|
625
|
+
assert.ok(project.quickTasks[0]?.summary !== null, 'quick: first task has summary');
|
|
626
|
+
assert.deepStrictEqual(project.quickTasks[1]?.number, 2, 'quick: second task number');
|
|
627
|
+
assert.ok(project.quickTasks[1]?.plan !== null, 'quick: second task has plan');
|
|
628
|
+
assert.deepStrictEqual(project.quickTasks[1]?.summary, null, 'quick: second task has no summary');
|
|
631
629
|
} finally {
|
|
632
630
|
cleanup(base);
|
|
633
631
|
}
|
|
634
|
-
|
|
632
|
+
});
|
|
635
633
|
|
|
636
634
|
// ─── Test 10: Roadmap with milestone sections and <details> ────────────
|
|
637
|
-
|
|
638
|
-
|
|
635
|
+
|
|
636
|
+
test('Roadmap with milestone sections and <details> blocks', async () => {
|
|
639
637
|
const base = createFixtureBase();
|
|
640
638
|
try {
|
|
641
639
|
const planning = createPlanningDir(base);
|
|
@@ -643,35 +641,35 @@ Another orphan.
|
|
|
643
641
|
|
|
644
642
|
const project = await parsePlanningDirectory(planning);
|
|
645
643
|
|
|
646
|
-
|
|
647
|
-
|
|
644
|
+
assert.ok(project.roadmap !== null, 'ms roadmap: roadmap parsed');
|
|
645
|
+
assert.ok((project.roadmap?.milestones?.length ?? 0) >= 2, 'ms roadmap: has milestone sections');
|
|
648
646
|
|
|
649
647
|
// Check collapsed milestone
|
|
650
648
|
const v20 = project.roadmap?.milestones?.find(m => m.id.includes('2.0'));
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
649
|
+
assert.ok(v20 !== undefined, 'ms roadmap: v2.0 milestone found');
|
|
650
|
+
assert.deepStrictEqual(v20?.collapsed, true, 'ms roadmap: v2.0 is collapsed');
|
|
651
|
+
assert.ok((v20?.phases?.length ?? 0) >= 2, 'ms roadmap: v2.0 has phases');
|
|
652
|
+
assert.ok(v20?.phases?.every(p => p.done) ?? false, 'ms roadmap: v2.0 phases all done');
|
|
655
653
|
|
|
656
654
|
// Check active milestone
|
|
657
655
|
const v25 = project.roadmap?.milestones?.find(m => m.id.includes('2.5'));
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
656
|
+
assert.ok(v25 !== undefined, 'ms roadmap: v2.5 milestone found');
|
|
657
|
+
assert.deepStrictEqual(v25?.collapsed, false, 'ms roadmap: v2.5 is not collapsed');
|
|
658
|
+
assert.ok((v25?.phases?.length ?? 0) >= 3, 'ms roadmap: v2.5 has phases');
|
|
661
659
|
|
|
662
660
|
// Check completion state
|
|
663
661
|
const phase29 = v25?.phases?.find(p => p.number === 29);
|
|
664
|
-
|
|
662
|
+
assert.ok(phase29?.done === true, 'ms roadmap: phase 29 is done');
|
|
665
663
|
const phase30 = v25?.phases?.find(p => p.number === 30);
|
|
666
|
-
|
|
664
|
+
assert.ok(phase30?.done === false, 'ms roadmap: phase 30 is not done');
|
|
667
665
|
} finally {
|
|
668
666
|
cleanup(base);
|
|
669
667
|
}
|
|
670
|
-
|
|
668
|
+
});
|
|
671
669
|
|
|
672
670
|
// ─── Test 11: Non-standard phase files → extra files ──────────────────
|
|
673
|
-
|
|
674
|
-
|
|
671
|
+
|
|
672
|
+
test('Non-standard phase files → collected as extra files', async () => {
|
|
675
673
|
const base = createFixtureBase();
|
|
676
674
|
try {
|
|
677
675
|
const planning = createPlanningDir(base);
|
|
@@ -687,28 +685,28 @@ Another orphan.
|
|
|
687
685
|
const project = await parsePlanningDirectory(planning);
|
|
688
686
|
const phase = project.phases['36-attachment-system'];
|
|
689
687
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
688
|
+
assert.ok(phase !== undefined, 'extra: phase exists');
|
|
689
|
+
assert.ok((phase?.extraFiles?.length ?? 0) >= 3, 'extra: non-standard files collected');
|
|
690
|
+
assert.ok(
|
|
693
691
|
phase?.extraFiles?.some(f => f.fileName === 'BASELINE.md') ?? false,
|
|
694
692
|
'extra: BASELINE.md collected'
|
|
695
693
|
);
|
|
696
|
-
|
|
694
|
+
assert.ok(
|
|
697
695
|
phase?.extraFiles?.some(f => f.fileName === 'BUNDLE-ANALYSIS.md') ?? false,
|
|
698
696
|
'extra: BUNDLE-ANALYSIS.md collected'
|
|
699
697
|
);
|
|
700
|
-
|
|
698
|
+
assert.ok(
|
|
701
699
|
phase?.extraFiles?.some(f => f.fileName === 'depcheck-results.txt') ?? false,
|
|
702
700
|
'extra: depcheck-results.txt collected'
|
|
703
701
|
);
|
|
704
702
|
} finally {
|
|
705
703
|
cleanup(base);
|
|
706
704
|
}
|
|
707
|
-
|
|
705
|
+
});
|
|
708
706
|
|
|
709
707
|
// ─── Test 12: Validation — missing ROADMAP.md → warning (not fatal) ───
|
|
710
|
-
|
|
711
|
-
|
|
708
|
+
|
|
709
|
+
test('Validation: missing ROADMAP.md → warning (not fatal)', async () => {
|
|
712
710
|
const base = createFixtureBase();
|
|
713
711
|
try {
|
|
714
712
|
const planning = createPlanningDir(base);
|
|
@@ -717,19 +715,19 @@ Another orphan.
|
|
|
717
715
|
|
|
718
716
|
const result = await validatePlanningDirectory(planning);
|
|
719
717
|
|
|
720
|
-
|
|
721
|
-
|
|
718
|
+
assert.deepStrictEqual(result.valid, true, 'no roadmap: validation still passes');
|
|
719
|
+
assert.ok(
|
|
722
720
|
result.issues.some(i => i.severity === 'warning' && i.file.includes('ROADMAP')),
|
|
723
721
|
'no roadmap: warning issue mentions ROADMAP'
|
|
724
722
|
);
|
|
725
723
|
} finally {
|
|
726
724
|
cleanup(base);
|
|
727
725
|
}
|
|
728
|
-
|
|
726
|
+
});
|
|
729
727
|
|
|
730
728
|
// ─── Test 13: Validation — missing PROJECT.md → warning ───────────────
|
|
731
|
-
|
|
732
|
-
|
|
729
|
+
|
|
730
|
+
test('Validation: missing PROJECT.md → warning', async () => {
|
|
733
731
|
const base = createFixtureBase();
|
|
734
732
|
try {
|
|
735
733
|
const planning = createPlanningDir(base);
|
|
@@ -738,20 +736,13 @@ Another orphan.
|
|
|
738
736
|
|
|
739
737
|
const result = await validatePlanningDirectory(planning);
|
|
740
738
|
|
|
741
|
-
|
|
742
|
-
|
|
739
|
+
assert.deepStrictEqual(result.valid, true, 'no project: validation passes (warning only)');
|
|
740
|
+
assert.ok(
|
|
743
741
|
result.issues.some(i => i.severity === 'warning' && i.file.includes('PROJECT')),
|
|
744
742
|
'no project: warning issue mentions PROJECT'
|
|
745
743
|
);
|
|
746
744
|
} finally {
|
|
747
745
|
cleanup(base);
|
|
748
746
|
}
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
report();
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
main().catch((error) => {
|
|
755
|
-
console.error(error);
|
|
756
|
-
process.exit(1);
|
|
757
747
|
});
|
|
748
|
+
|