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
|
/**
|
|
2
4
|
* doctor-proactive.test.ts — Tests for proactive healing layer.
|
|
3
5
|
*
|
|
@@ -22,10 +24,6 @@ import {
|
|
|
22
24
|
resetProactiveHealing,
|
|
23
25
|
formatHealthSummary,
|
|
24
26
|
} from "../doctor-proactive.ts";
|
|
25
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
26
|
-
|
|
27
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
28
|
-
|
|
29
27
|
function run(cmd: string, cwd: string): string {
|
|
30
28
|
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
31
29
|
}
|
|
@@ -70,44 +68,40 @@ _None_
|
|
|
70
68
|
return dir;
|
|
71
69
|
}
|
|
72
70
|
|
|
73
|
-
async
|
|
71
|
+
describe('doctor-proactive', async () => {
|
|
74
72
|
const cleanups: string[] = [];
|
|
75
73
|
|
|
76
74
|
try {
|
|
77
75
|
// ─── Health Score Tracking ─────────────────────────────────────────
|
|
78
|
-
|
|
79
|
-
{
|
|
76
|
+
test('health tracking: initial state', () => {
|
|
80
77
|
resetProactiveHealing();
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
78
|
+
assert.deepStrictEqual(getHealthTrend(), "unknown", "trend is unknown with no data");
|
|
79
|
+
assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "no consecutive errors initially");
|
|
80
|
+
assert.deepStrictEqual(getHealthHistory().length, 0, "no history initially");
|
|
81
|
+
});
|
|
85
82
|
|
|
86
|
-
|
|
87
|
-
{
|
|
83
|
+
test('health tracking: recording snapshots', () => {
|
|
88
84
|
resetProactiveHealing();
|
|
89
85
|
recordHealthSnapshot(0, 2, 1);
|
|
90
86
|
recordHealthSnapshot(0, 1, 0);
|
|
91
87
|
recordHealthSnapshot(0, 0, 0);
|
|
92
88
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
89
|
+
assert.deepStrictEqual(getHealthHistory().length, 3, "3 snapshots recorded");
|
|
90
|
+
assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "no consecutive errors after clean units");
|
|
91
|
+
});
|
|
96
92
|
|
|
97
|
-
|
|
98
|
-
{
|
|
93
|
+
test('health tracking: consecutive error counting', () => {
|
|
99
94
|
resetProactiveHealing();
|
|
100
95
|
recordHealthSnapshot(2, 1, 0); // errors
|
|
101
96
|
recordHealthSnapshot(1, 0, 0); // errors
|
|
102
97
|
recordHealthSnapshot(1, 0, 0); // errors
|
|
103
|
-
|
|
98
|
+
assert.deepStrictEqual(getConsecutiveErrorUnits(), 3, "3 consecutive error units");
|
|
104
99
|
|
|
105
100
|
recordHealthSnapshot(0, 0, 0); // clean
|
|
106
|
-
|
|
107
|
-
}
|
|
101
|
+
assert.deepStrictEqual(getConsecutiveErrorUnits(), 0, "streak reset on clean unit");
|
|
102
|
+
});
|
|
108
103
|
|
|
109
|
-
|
|
110
|
-
{
|
|
104
|
+
test('health tracking: trend detection', () => {
|
|
111
105
|
resetProactiveHealing();
|
|
112
106
|
// Record 5 older snapshots with low issues
|
|
113
107
|
for (let i = 0; i < 5; i++) {
|
|
@@ -117,11 +111,10 @@ async function main(): Promise<void> {
|
|
|
117
111
|
for (let i = 0; i < 5; i++) {
|
|
118
112
|
recordHealthSnapshot(3, 5, 0);
|
|
119
113
|
}
|
|
120
|
-
|
|
121
|
-
}
|
|
114
|
+
assert.deepStrictEqual(getHealthTrend(), "degrading", "detects degrading trend");
|
|
115
|
+
});
|
|
122
116
|
|
|
123
|
-
|
|
124
|
-
{
|
|
117
|
+
test('health tracking: improving trend', () => {
|
|
125
118
|
resetProactiveHealing();
|
|
126
119
|
// Record 5 older snapshots with high issues
|
|
127
120
|
for (let i = 0; i < 5; i++) {
|
|
@@ -131,32 +124,29 @@ async function main(): Promise<void> {
|
|
|
131
124
|
for (let i = 0; i < 5; i++) {
|
|
132
125
|
recordHealthSnapshot(0, 0, 0);
|
|
133
126
|
}
|
|
134
|
-
|
|
135
|
-
}
|
|
127
|
+
assert.deepStrictEqual(getHealthTrend(), "improving", "detects improving trend");
|
|
128
|
+
});
|
|
136
129
|
|
|
137
|
-
|
|
138
|
-
{
|
|
130
|
+
test('health tracking: stable trend', () => {
|
|
139
131
|
resetProactiveHealing();
|
|
140
132
|
for (let i = 0; i < 10; i++) {
|
|
141
133
|
recordHealthSnapshot(1, 1, 0);
|
|
142
134
|
}
|
|
143
|
-
|
|
144
|
-
}
|
|
135
|
+
assert.deepStrictEqual(getHealthTrend(), "stable", "detects stable trend");
|
|
136
|
+
});
|
|
145
137
|
|
|
146
138
|
// ─── Auto-Heal Escalation ─────────────────────────────────────────
|
|
147
|
-
|
|
148
|
-
{
|
|
139
|
+
test('escalation: below threshold', () => {
|
|
149
140
|
resetProactiveHealing();
|
|
150
141
|
recordHealthSnapshot(1, 0, 0);
|
|
151
142
|
recordHealthSnapshot(1, 0, 0);
|
|
152
143
|
recordHealthSnapshot(1, 0, 0);
|
|
153
144
|
const result = checkHealEscalation(1, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
145
|
+
assert.deepStrictEqual(result.shouldEscalate, false, "no escalation below threshold");
|
|
146
|
+
assert.ok(result.reason.includes("3/5"), "reason shows progress toward threshold");
|
|
147
|
+
});
|
|
157
148
|
|
|
158
|
-
|
|
159
|
-
{
|
|
149
|
+
test('escalation: at threshold', () => {
|
|
160
150
|
resetProactiveHealing();
|
|
161
151
|
// Need 5+ consecutive error units AND degrading/stable trend
|
|
162
152
|
for (let i = 0; i < 5; i++) {
|
|
@@ -166,21 +156,19 @@ async function main(): Promise<void> {
|
|
|
166
156
|
recordHealthSnapshot(2, 1, 0); // recent error snapshots
|
|
167
157
|
}
|
|
168
158
|
const result = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
159
|
+
assert.deepStrictEqual(result.shouldEscalate, true, "escalates at threshold with degrading trend");
|
|
160
|
+
assert.ok(result.reason.includes("5 consecutive"), "reason mentions consecutive count");
|
|
161
|
+
});
|
|
172
162
|
|
|
173
|
-
|
|
174
|
-
{
|
|
163
|
+
test('escalation: no double escalation', () => {
|
|
175
164
|
// Don't reset — should already be escalated from previous test
|
|
176
165
|
recordHealthSnapshot(2, 0, 0);
|
|
177
166
|
const result = checkHealEscalation(2, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
167
|
+
assert.deepStrictEqual(result.shouldEscalate, false, "no double escalation in same session");
|
|
168
|
+
assert.ok(result.reason.includes("already escalated"), "reason explains why no escalation");
|
|
169
|
+
});
|
|
181
170
|
|
|
182
|
-
|
|
183
|
-
{
|
|
171
|
+
test('escalation: deferred when improving', () => {
|
|
184
172
|
resetProactiveHealing();
|
|
185
173
|
// 5 older snapshots with high errors
|
|
186
174
|
for (let i = 0; i < 5; i++) {
|
|
@@ -191,37 +179,34 @@ async function main(): Promise<void> {
|
|
|
191
179
|
recordHealthSnapshot(1, 0, 0);
|
|
192
180
|
}
|
|
193
181
|
const result = checkHealEscalation(1, [{ code: "test", message: "test error", unitId: "M001/S01" }]);
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
182
|
+
assert.deepStrictEqual(result.shouldEscalate, false, "no escalation when trend is improving");
|
|
183
|
+
assert.ok(result.reason.includes("improving"), "reason mentions improving trend");
|
|
184
|
+
});
|
|
197
185
|
|
|
198
186
|
// ─── Health Summary Formatting ────────────────────────────────────
|
|
199
|
-
|
|
200
|
-
{
|
|
187
|
+
test('formatHealthSummary', () => {
|
|
201
188
|
resetProactiveHealing();
|
|
202
|
-
|
|
189
|
+
assert.deepStrictEqual(formatHealthSummary(), "No health data yet.", "empty summary when no data");
|
|
203
190
|
|
|
204
191
|
recordHealthSnapshot(2, 3, 1);
|
|
205
192
|
const summary = formatHealthSummary();
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
193
|
+
assert.ok(summary.includes("2 errors") && summary.includes("3 warnings"), "summary includes error/warning counts");
|
|
194
|
+
assert.ok(summary.includes("1 fix applied"), "summary includes fix count");
|
|
195
|
+
assert.ok(summary.includes("1 of 5 consecutive errors"), "summary includes error streak");
|
|
196
|
+
});
|
|
210
197
|
|
|
211
198
|
// ─── Pre-Dispatch Health Gate ─────────────────────────────────────
|
|
212
|
-
|
|
213
|
-
{
|
|
199
|
+
test('health gate: clean state', async () => {
|
|
214
200
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
|
|
215
201
|
cleanups.push(dir);
|
|
216
202
|
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
217
203
|
|
|
218
204
|
const result = await preDispatchHealthGate(dir);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
205
|
+
assert.ok(result.proceed, "gate passes on clean state");
|
|
206
|
+
assert.deepStrictEqual(result.issues.length, 0, "no issues on clean state");
|
|
207
|
+
});
|
|
222
208
|
|
|
223
|
-
|
|
224
|
-
{
|
|
209
|
+
test('health gate: missing STATE.md does NOT block dispatch (#889)', async () => {
|
|
225
210
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
|
|
226
211
|
cleanups.push(dir);
|
|
227
212
|
// Create milestones dir but no STATE.md — mimics fresh worktree
|
|
@@ -229,13 +214,12 @@ async function main(): Promise<void> {
|
|
|
229
214
|
writeFileSync(join(dir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# Roadmap\n");
|
|
230
215
|
|
|
231
216
|
const result = await preDispatchHealthGate(dir);
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
217
|
+
assert.ok(result.proceed, "gate must NOT block when STATE.md is missing (deadlock #889)");
|
|
218
|
+
assert.deepStrictEqual(result.issues.length, 0, "missing STATE.md is not a blocking issue");
|
|
219
|
+
assert.ok(result.fixesApplied.some((f: string) => f.includes("STATE.md")), "reports STATE.md status as info");
|
|
220
|
+
});
|
|
236
221
|
|
|
237
|
-
|
|
238
|
-
{
|
|
222
|
+
test('health gate: stale crash lock auto-cleared', async () => {
|
|
239
223
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
|
|
240
224
|
cleanups.push(dir);
|
|
241
225
|
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
@@ -248,12 +232,12 @@ async function main(): Promise<void> {
|
|
|
248
232
|
}));
|
|
249
233
|
|
|
250
234
|
const result = await preDispatchHealthGate(dir);
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
235
|
+
assert.ok(result.proceed, "gate passes after auto-clearing stale lock");
|
|
236
|
+
assert.ok(result.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "reports lock cleared");
|
|
237
|
+
assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "lock file removed");
|
|
238
|
+
});
|
|
255
239
|
|
|
256
|
-
|
|
240
|
+
test('health gate: corrupt merge state auto-healed', async () => {
|
|
257
241
|
if (process.platform !== "win32") {
|
|
258
242
|
{
|
|
259
243
|
const dir = createGitRepo();
|
|
@@ -264,36 +248,35 @@ async function main(): Promise<void> {
|
|
|
264
248
|
writeFileSync(join(dir, ".git", "MERGE_HEAD"), headHash + "\n");
|
|
265
249
|
|
|
266
250
|
const result = await preDispatchHealthGate(dir);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
251
|
+
assert.ok(result.proceed, "gate passes after auto-healing merge state");
|
|
252
|
+
assert.ok(result.fixesApplied.some(f => f.includes("cleaned merge state")), "reports merge state cleaned");
|
|
253
|
+
assert.ok(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed");
|
|
270
254
|
}
|
|
271
255
|
} else {
|
|
272
256
|
console.log(" (skipped on Windows)");
|
|
273
257
|
}
|
|
258
|
+
});
|
|
274
259
|
|
|
275
|
-
|
|
276
|
-
{
|
|
260
|
+
test('health gate: STATE.md missing — auto-healed', async () => {
|
|
277
261
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));
|
|
278
262
|
cleanups.push(dir);
|
|
279
263
|
// Minimal .gsd structure: milestones dir exists but no STATE.md
|
|
280
264
|
mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
|
|
281
265
|
|
|
282
266
|
const stateFile = join(dir, ".gsd", "STATE.md");
|
|
283
|
-
|
|
267
|
+
assert.ok(!existsSync(stateFile), "STATE.md does not exist before gate");
|
|
284
268
|
|
|
285
269
|
const result = await preDispatchHealthGate(dir);
|
|
286
|
-
|
|
287
|
-
|
|
270
|
+
assert.ok(result.proceed, "gate passes after rebuilding STATE.md");
|
|
271
|
+
assert.ok(
|
|
288
272
|
result.fixesApplied.some(f => f.includes("rebuilt missing STATE.md")),
|
|
289
273
|
"reports STATE.md rebuilt",
|
|
290
274
|
);
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}
|
|
275
|
+
assert.ok(existsSync(stateFile), "STATE.md created by auto-heal");
|
|
276
|
+
assert.ok(result.issues.length === 0, "no blocking issues after heal");
|
|
277
|
+
});
|
|
294
278
|
|
|
295
|
-
|
|
296
|
-
{
|
|
279
|
+
test('health gate: stale integration branch uses detected fallback', async () => {
|
|
297
280
|
const dir = createRepoWithActiveMilestone();
|
|
298
281
|
cleanups.push(dir);
|
|
299
282
|
|
|
@@ -301,16 +284,15 @@ async function main(): Promise<void> {
|
|
|
301
284
|
writeFileSync(metaPath, JSON.stringify({ integrationBranch: "feature/missing" }, null, 2));
|
|
302
285
|
|
|
303
286
|
const result = await preDispatchHealthGate(dir);
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
287
|
+
assert.ok(result.proceed, "gate does not block when stale integration branch has detected fallback");
|
|
288
|
+
assert.deepStrictEqual(result.issues.length, 0, "stale integration branch with fallback is not a blocking issue");
|
|
289
|
+
assert.ok(
|
|
307
290
|
result.fixesApplied.some(f => f.includes('feature/missing') && f.includes('main')),
|
|
308
291
|
"fixesApplied reports stale recorded branch and detected fallback branch",
|
|
309
292
|
);
|
|
310
|
-
}
|
|
293
|
+
});
|
|
311
294
|
|
|
312
|
-
|
|
313
|
-
{
|
|
295
|
+
test('health gate: stale integration branch uses configured fallback', async () => {
|
|
314
296
|
const dir = createRepoWithActiveMilestone();
|
|
315
297
|
cleanups.push(dir);
|
|
316
298
|
|
|
@@ -323,16 +305,16 @@ async function main(): Promise<void> {
|
|
|
323
305
|
process.chdir(dir);
|
|
324
306
|
try {
|
|
325
307
|
const result = await preDispatchHealthGate(dir);
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
308
|
+
assert.ok(result.proceed, "gate does not block when configured main_branch can be used as fallback");
|
|
309
|
+
assert.deepStrictEqual(result.issues.length, 0, "configured fallback is not treated as a blocking issue");
|
|
310
|
+
assert.ok(
|
|
329
311
|
result.fixesApplied.some(f => f.includes('feature/missing') && f.includes('trunk')),
|
|
330
312
|
"fixesApplied reports stale recorded branch and configured fallback branch",
|
|
331
313
|
);
|
|
332
314
|
} finally {
|
|
333
315
|
process.chdir(previousCwd);
|
|
334
316
|
}
|
|
335
|
-
}
|
|
317
|
+
});
|
|
336
318
|
|
|
337
319
|
} finally {
|
|
338
320
|
resetProactiveHealing();
|
|
@@ -340,8 +322,4 @@ async function main(): Promise<void> {
|
|
|
340
322
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
341
323
|
}
|
|
342
324
|
}
|
|
343
|
-
|
|
344
|
-
report();
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
main();
|
|
325
|
+
});
|
|
@@ -58,72 +58,66 @@ Done.
|
|
|
58
58
|
`);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
test("fixLevel:task — roadmap checkbox is never toggled by doctor (reconciliation removed)", async () => {
|
|
61
|
+
test("fixLevel:task — roadmap checkbox is never toggled by doctor (reconciliation removed)", async (t) => {
|
|
62
62
|
const tmp = makeTmp("no-roadmap-toggle");
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
80
|
-
}
|
|
63
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
64
|
+
|
|
65
|
+
buildScaffold(tmp);
|
|
66
|
+
|
|
67
|
+
const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
|
|
68
|
+
|
|
69
|
+
// Roadmap must remain unchecked — doctor no longer touches checkboxes
|
|
70
|
+
const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
|
|
71
|
+
assert.ok(
|
|
72
|
+
roadmapContent.includes("- [ ] **S01"),
|
|
73
|
+
"roadmap should remain unchecked — doctor no longer toggles checkboxes"
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// No summary or UAT stubs created
|
|
77
|
+
const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
|
|
78
|
+
assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
|
|
81
79
|
});
|
|
82
80
|
|
|
83
|
-
test("fixLevel:all — roadmap checkbox is never toggled by doctor (reconciliation removed)", async () => {
|
|
81
|
+
test("fixLevel:all — roadmap checkbox is never toggled by doctor (reconciliation removed)", async (t) => {
|
|
84
82
|
const tmp = makeTmp("all-no-toggle");
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
101
|
-
}
|
|
83
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
84
|
+
|
|
85
|
+
buildScaffold(tmp);
|
|
86
|
+
|
|
87
|
+
const report = await runGSDDoctor(tmp, { fix: true });
|
|
88
|
+
|
|
89
|
+
// Even at fixLevel:all, doctor no longer creates stubs or toggles checkboxes
|
|
90
|
+
const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
|
|
91
|
+
assert.ok(
|
|
92
|
+
roadmapContent.includes("- [ ] **S01"),
|
|
93
|
+
"roadmap should remain unchecked — reconciliation removed"
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
|
|
97
|
+
assert.ok(!existsSync(sliceSummaryPath), "summary should NOT be created");
|
|
102
98
|
});
|
|
103
99
|
|
|
104
|
-
test("consecutive doctor runs produce no reconciliation codes", async () => {
|
|
100
|
+
test("consecutive doctor runs produce no reconciliation codes", async (t) => {
|
|
105
101
|
const tmp = makeTmp("consecutive-clean");
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
} finally {
|
|
127
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
102
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
103
|
+
|
|
104
|
+
buildScaffold(tmp);
|
|
105
|
+
|
|
106
|
+
await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
|
|
107
|
+
const report2 = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
|
|
108
|
+
|
|
109
|
+
const REMOVED_CODES = [
|
|
110
|
+
"task_done_missing_summary",
|
|
111
|
+
"task_summary_without_done_checkbox",
|
|
112
|
+
"all_tasks_done_missing_slice_summary",
|
|
113
|
+
"all_tasks_done_missing_slice_uat",
|
|
114
|
+
"all_tasks_done_roadmap_not_checked",
|
|
115
|
+
"slice_checked_missing_summary",
|
|
116
|
+
"slice_checked_missing_uat",
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
const codes = report2.issues.map(i => i.code);
|
|
120
|
+
for (const removed of REMOVED_CODES) {
|
|
121
|
+
assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
|
|
128
122
|
}
|
|
129
123
|
});
|