gsd-pi 2.44.0 → 2.45.0-dev.e0ee972
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/help-text.js +1 -1
- package/dist/loader.js +34 -0
- 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 +52 -45
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- 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 +14 -10
- package/dist/resources/extensions/gsd/auto.js +34 -8
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +168 -11
- 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 +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +1 -1
- package/dist/resources/extensions/gsd/doctor.js +10 -2
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +17 -5
- 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/workflow-logger.js +138 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
- 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 +15 -15
- 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/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.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/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.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/lifecycle-hooks.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- 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-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.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/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- 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 +61 -59
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- 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 +17 -11
- package/src/resources/extensions/gsd/auto.ts +40 -6
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -11
- 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 +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +1 -1
- package/src/resources/extensions/gsd/doctor.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +21 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- 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 +75 -37
- 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 +34 -9
- 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-logger.test.ts +275 -0
- 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-journal-events.test.ts +220 -0
- 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/workflow-logger.ts +193 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -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_ → dFMji9G1LZ-Tv36el9pRT}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_ssgManifest.js +0 -0
|
@@ -130,119 +130,119 @@ test("auto-loop 'all milestones complete' path merges before stopping (#962)", (
|
|
|
130
130
|
|
|
131
131
|
// ─── Integration: single milestone completes → merged to main ────────────────
|
|
132
132
|
|
|
133
|
-
test("single milestone worktree is merged to main when all complete (#962)", () => {
|
|
133
|
+
test("single milestone worktree is merged to main when all complete (#962)", (t) => {
|
|
134
134
|
const savedCwd = process.cwd();
|
|
135
135
|
let tempDir = "";
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
tempDir = createTempRepo();
|
|
139
|
-
|
|
140
|
-
// Set up a single milestone
|
|
141
|
-
createMilestoneArtifacts(tempDir, "M001");
|
|
142
|
-
run("git add .", tempDir);
|
|
143
|
-
run('git commit -m "add milestone"', tempDir);
|
|
144
|
-
|
|
145
|
-
// Create worktree and simulate work
|
|
146
|
-
const wt = createAutoWorktree(tempDir, "M001");
|
|
147
|
-
assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
|
|
148
|
-
|
|
149
|
-
writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
|
|
150
|
-
run("git add .", wt);
|
|
151
|
-
run('git commit -m "feat(M001): add feature"', wt);
|
|
152
|
-
|
|
153
|
-
// Simulate the fix: merge before stopping (what the "all complete" path now does)
|
|
154
|
-
const roadmapPath = join(
|
|
155
|
-
tempDir,
|
|
156
|
-
".gsd",
|
|
157
|
-
"milestones",
|
|
158
|
-
"M001",
|
|
159
|
-
"M001-ROADMAP.md",
|
|
160
|
-
);
|
|
161
|
-
const roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
162
|
-
const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
|
|
163
|
-
|
|
164
|
-
// Verify work is on main
|
|
165
|
-
assert.ok(
|
|
166
|
-
existsSync(join(tempDir, "feature.ts")),
|
|
167
|
-
"feature.ts should be on main after merge",
|
|
168
|
-
);
|
|
169
|
-
assert.equal(process.cwd(), tempDir, "cwd restored to project root");
|
|
170
|
-
assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
|
|
171
|
-
assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
|
|
172
|
-
|
|
173
|
-
// Verify milestone branch was cleaned up
|
|
174
|
-
const branches = run("git branch", tempDir);
|
|
175
|
-
assert.ok(
|
|
176
|
-
!branches.includes("milestone/M001"),
|
|
177
|
-
"milestone branch should be deleted",
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
// Verify squash commit on main
|
|
181
|
-
const log = run("git log --oneline -3", tempDir);
|
|
182
|
-
assert.ok(
|
|
183
|
-
log.includes("M001"),
|
|
184
|
-
"squash commit on main should reference M001",
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
|
|
188
|
-
} finally {
|
|
137
|
+
t.after(() => {
|
|
189
138
|
process.chdir(savedCwd);
|
|
190
139
|
if (tempDir && existsSync(tempDir)) {
|
|
191
|
-
|
|
140
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
192
141
|
}
|
|
193
|
-
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
tempDir = createTempRepo();
|
|
145
|
+
|
|
146
|
+
// Set up a single milestone
|
|
147
|
+
createMilestoneArtifacts(tempDir, "M001");
|
|
148
|
+
run("git add .", tempDir);
|
|
149
|
+
run('git commit -m "add milestone"', tempDir);
|
|
150
|
+
|
|
151
|
+
// Create worktree and simulate work
|
|
152
|
+
const wt = createAutoWorktree(tempDir, "M001");
|
|
153
|
+
assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
|
|
154
|
+
|
|
155
|
+
writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
|
|
156
|
+
run("git add .", wt);
|
|
157
|
+
run('git commit -m "feat(M001): add feature"', wt);
|
|
158
|
+
|
|
159
|
+
// Simulate the fix: merge before stopping (what the "all complete" path now does)
|
|
160
|
+
const roadmapPath = join(
|
|
161
|
+
tempDir,
|
|
162
|
+
".gsd",
|
|
163
|
+
"milestones",
|
|
164
|
+
"M001",
|
|
165
|
+
"M001-ROADMAP.md",
|
|
166
|
+
);
|
|
167
|
+
const roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
168
|
+
const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
|
|
169
|
+
|
|
170
|
+
// Verify work is on main
|
|
171
|
+
assert.ok(
|
|
172
|
+
existsSync(join(tempDir, "feature.ts")),
|
|
173
|
+
"feature.ts should be on main after merge",
|
|
174
|
+
);
|
|
175
|
+
assert.equal(process.cwd(), tempDir, "cwd restored to project root");
|
|
176
|
+
assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
|
|
177
|
+
assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
|
|
178
|
+
|
|
179
|
+
// Verify milestone branch was cleaned up
|
|
180
|
+
const branches = run("git branch", tempDir);
|
|
181
|
+
assert.ok(
|
|
182
|
+
!branches.includes("milestone/M001"),
|
|
183
|
+
"milestone branch should be deleted",
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// Verify squash commit on main
|
|
187
|
+
const log = run("git log --oneline -3", tempDir);
|
|
188
|
+
assert.ok(
|
|
189
|
+
log.includes("M001"),
|
|
190
|
+
"squash commit on main should reference M001",
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
|
|
194
194
|
});
|
|
195
195
|
|
|
196
196
|
// ─── Integration: last of multiple milestones completes → merged ─────────────
|
|
197
197
|
|
|
198
|
-
test("last milestone worktree is merged when it's the final one (#962)", () => {
|
|
198
|
+
test("last milestone worktree is merged when it's the final one (#962)", (t) => {
|
|
199
199
|
const savedCwd = process.cwd();
|
|
200
200
|
let tempDir = "";
|
|
201
201
|
|
|
202
|
-
|
|
203
|
-
tempDir = createTempRepo();
|
|
204
|
-
|
|
205
|
-
// Set up two milestones
|
|
206
|
-
createMilestoneArtifacts(tempDir, "M001");
|
|
207
|
-
createMilestoneArtifacts(tempDir, "M002");
|
|
208
|
-
run("git add .", tempDir);
|
|
209
|
-
run('git commit -m "add milestones"', tempDir);
|
|
210
|
-
|
|
211
|
-
// Complete M001 first (merge it)
|
|
212
|
-
const wt1 = createAutoWorktree(tempDir, "M001");
|
|
213
|
-
writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
|
|
214
|
-
run("git add .", wt1);
|
|
215
|
-
run('git commit -m "feat(M001): m001 work"', wt1);
|
|
216
|
-
const roadmap1 = readFileSync(
|
|
217
|
-
join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
218
|
-
"utf-8",
|
|
219
|
-
);
|
|
220
|
-
mergeMilestoneToMain(tempDir, "M001", roadmap1);
|
|
221
|
-
|
|
222
|
-
// Now complete M002 (the LAST milestone — this is the #962 scenario)
|
|
223
|
-
const wt2 = createAutoWorktree(tempDir, "M002");
|
|
224
|
-
writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
|
|
225
|
-
run("git add .", wt2);
|
|
226
|
-
run('git commit -m "feat(M002): m002 work"', wt2);
|
|
227
|
-
const roadmap2 = readFileSync(
|
|
228
|
-
join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
|
|
229
|
-
"utf-8",
|
|
230
|
-
);
|
|
231
|
-
mergeMilestoneToMain(tempDir, "M002", roadmap2);
|
|
232
|
-
|
|
233
|
-
// Both features should now be on main
|
|
234
|
-
assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
|
|
235
|
-
assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
|
|
236
|
-
assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
|
|
237
|
-
|
|
238
|
-
// Both milestone branches should be cleaned up
|
|
239
|
-
const branches = run("git branch", tempDir);
|
|
240
|
-
assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
|
|
241
|
-
assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
|
|
242
|
-
} finally {
|
|
202
|
+
t.after(() => {
|
|
243
203
|
process.chdir(savedCwd);
|
|
244
204
|
if (tempDir && existsSync(tempDir)) {
|
|
245
|
-
|
|
205
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
246
206
|
}
|
|
247
|
-
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
tempDir = createTempRepo();
|
|
210
|
+
|
|
211
|
+
// Set up two milestones
|
|
212
|
+
createMilestoneArtifacts(tempDir, "M001");
|
|
213
|
+
createMilestoneArtifacts(tempDir, "M002");
|
|
214
|
+
run("git add .", tempDir);
|
|
215
|
+
run('git commit -m "add milestones"', tempDir);
|
|
216
|
+
|
|
217
|
+
// Complete M001 first (merge it)
|
|
218
|
+
const wt1 = createAutoWorktree(tempDir, "M001");
|
|
219
|
+
writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
|
|
220
|
+
run("git add .", wt1);
|
|
221
|
+
run('git commit -m "feat(M001): m001 work"', wt1);
|
|
222
|
+
const roadmap1 = readFileSync(
|
|
223
|
+
join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
224
|
+
"utf-8",
|
|
225
|
+
);
|
|
226
|
+
mergeMilestoneToMain(tempDir, "M001", roadmap1);
|
|
227
|
+
|
|
228
|
+
// Now complete M002 (the LAST milestone — this is the #962 scenario)
|
|
229
|
+
const wt2 = createAutoWorktree(tempDir, "M002");
|
|
230
|
+
writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
|
|
231
|
+
run("git add .", wt2);
|
|
232
|
+
run('git commit -m "feat(M002): m002 work"', wt2);
|
|
233
|
+
const roadmap2 = readFileSync(
|
|
234
|
+
join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
|
|
235
|
+
"utf-8",
|
|
236
|
+
);
|
|
237
|
+
mergeMilestoneToMain(tempDir, "M002", roadmap2);
|
|
238
|
+
|
|
239
|
+
// Both features should now be on main
|
|
240
|
+
assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
|
|
241
|
+
assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
|
|
242
|
+
assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
|
|
243
|
+
|
|
244
|
+
// Both milestone branches should be cleaned up
|
|
245
|
+
const branches = run("git branch", tempDir);
|
|
246
|
+
assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
|
|
247
|
+
assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
|
|
248
248
|
});
|
|
@@ -110,26 +110,24 @@ test("clearLock is safe when no lock file exists", () => {
|
|
|
110
110
|
rmSync(dir, { recursive: true, force: true });
|
|
111
111
|
});
|
|
112
112
|
|
|
113
|
-
test("bootstrap cleanup releases session lock artifacts", () => {
|
|
113
|
+
test("bootstrap cleanup releases session lock artifacts", (t) => {
|
|
114
114
|
const dir = mkdtempSync(join(tmpdir(), "gsd-lock-test-"));
|
|
115
115
|
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
releaseSessionLock(dir);
|
|
126
|
-
clearLock(dir);
|
|
127
|
-
|
|
128
|
-
assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
|
|
129
|
-
assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
|
|
130
|
-
} finally {
|
|
131
|
-
rmSync(dir, { recursive: true, force: true });
|
|
117
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
118
|
+
|
|
119
|
+
const result = acquireSessionLock(dir);
|
|
120
|
+
assert.equal(result.acquired, true, "session lock should be acquired");
|
|
121
|
+
assert.ok(existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should exist while lock is held");
|
|
122
|
+
if (properLockfileAvailable) {
|
|
123
|
+
assert.ok(existsSync(join(dir, ".gsd.lock")), ".gsd.lock should exist while lock is held");
|
|
132
124
|
}
|
|
125
|
+
|
|
126
|
+
releaseSessionLock(dir);
|
|
127
|
+
clearLock(dir);
|
|
128
|
+
|
|
129
|
+
assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
|
|
130
|
+
assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
|
|
133
131
|
});
|
|
134
132
|
|
|
135
133
|
// ─── isLockProcessAlive detects live vs dead PIDs ────────────────────────
|
|
@@ -51,93 +51,79 @@ function cleanup(base: string): void {
|
|
|
51
51
|
try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
test("resolveMilestonePath returns null for missing milestone", () => {
|
|
54
|
+
test("resolveMilestonePath returns null for missing milestone", (t) => {
|
|
55
55
|
const base = makeTmpBase();
|
|
56
56
|
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
cleanup(base);
|
|
62
|
-
}
|
|
57
|
+
t.after(() => cleanup(base));
|
|
58
|
+
|
|
59
|
+
const result = resolveMilestonePath(base, "M999");
|
|
60
|
+
assert.equal(result, null, "should return null for non-existent milestone");
|
|
63
61
|
});
|
|
64
62
|
|
|
65
|
-
test("resolveMilestonePath returns path for existing milestone", () => {
|
|
63
|
+
test("resolveMilestonePath returns path for existing milestone", (t) => {
|
|
66
64
|
const base = makeTmpBase();
|
|
67
65
|
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
cleanup(base);
|
|
74
|
-
}
|
|
66
|
+
t.after(() => cleanup(base));
|
|
67
|
+
|
|
68
|
+
const result = resolveMilestonePath(base, "M001");
|
|
69
|
+
assert.ok(result, "should return a path for existing milestone");
|
|
70
|
+
assert.ok(result.includes("M001"), "path should contain the milestone ID");
|
|
75
71
|
});
|
|
76
72
|
|
|
77
|
-
test("resolveMilestoneFile returns null when no SUMMARY exists", () => {
|
|
73
|
+
test("resolveMilestoneFile returns null when no SUMMARY exists", (t) => {
|
|
78
74
|
const base = makeTmpBase();
|
|
79
75
|
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
cleanup(base);
|
|
85
|
-
}
|
|
76
|
+
t.after(() => cleanup(base));
|
|
77
|
+
|
|
78
|
+
const result = resolveMilestoneFile(base, "M001", "SUMMARY");
|
|
79
|
+
assert.equal(result, null, "should return null when no SUMMARY file");
|
|
86
80
|
});
|
|
87
81
|
|
|
88
|
-
test("resolveMilestoneFile returns path when SUMMARY exists (completed)", () => {
|
|
82
|
+
test("resolveMilestoneFile returns path when SUMMARY exists (completed)", (t) => {
|
|
89
83
|
const base = makeTmpBase();
|
|
90
84
|
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
91
85
|
mkdirSync(mDir, { recursive: true });
|
|
92
86
|
writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
cleanup(base);
|
|
99
|
-
}
|
|
87
|
+
t.after(() => cleanup(base));
|
|
88
|
+
|
|
89
|
+
const result = resolveMilestoneFile(base, "M001", "SUMMARY");
|
|
90
|
+
assert.ok(result, "should return a path when SUMMARY exists");
|
|
91
|
+
assert.ok(result.includes("SUMMARY"), "path should reference SUMMARY");
|
|
100
92
|
});
|
|
101
93
|
|
|
102
94
|
// ─── Combined validation logic (mirrors auto.ts resume guard) ───────────────
|
|
103
95
|
|
|
104
|
-
test("stale milestone: missing dir means paused session should be discarded", () => {
|
|
96
|
+
test("stale milestone: missing dir means paused session should be discarded", (t) => {
|
|
105
97
|
const base = makeTmpBase();
|
|
106
98
|
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
cleanup(base);
|
|
114
|
-
}
|
|
99
|
+
t.after(() => cleanup(base));
|
|
100
|
+
|
|
101
|
+
const mDir = resolveMilestonePath(base, "M999");
|
|
102
|
+
const summaryFile = resolveMilestoneFile(base, "M999", "SUMMARY");
|
|
103
|
+
const isStale = !mDir || !!summaryFile;
|
|
104
|
+
assert.ok(isStale, "milestone that doesn't exist should be detected as stale");
|
|
115
105
|
});
|
|
116
106
|
|
|
117
|
-
test("stale milestone: completed (has SUMMARY) means paused session should be discarded", () => {
|
|
107
|
+
test("stale milestone: completed (has SUMMARY) means paused session should be discarded", (t) => {
|
|
118
108
|
const base = makeTmpBase();
|
|
119
109
|
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
120
110
|
mkdirSync(mDir, { recursive: true });
|
|
121
111
|
writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
cleanup(base);
|
|
129
|
-
}
|
|
112
|
+
t.after(() => cleanup(base));
|
|
113
|
+
|
|
114
|
+
const dir = resolveMilestonePath(base, "M001");
|
|
115
|
+
const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
|
|
116
|
+
const isStale = !dir || !!summaryFile;
|
|
117
|
+
assert.ok(isStale, "milestone with SUMMARY should be detected as stale");
|
|
130
118
|
});
|
|
131
119
|
|
|
132
|
-
test("valid milestone: exists and has no SUMMARY means paused session is valid", () => {
|
|
120
|
+
test("valid milestone: exists and has no SUMMARY means paused session is valid", (t) => {
|
|
133
121
|
const base = makeTmpBase();
|
|
134
122
|
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
cleanup(base);
|
|
142
|
-
}
|
|
123
|
+
t.after(() => cleanup(base));
|
|
124
|
+
|
|
125
|
+
const dir = resolveMilestonePath(base, "M001");
|
|
126
|
+
const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
|
|
127
|
+
const isStale = !dir || !!summaryFile;
|
|
128
|
+
assert.ok(!isStale, "active milestone should not be detected as stale");
|
|
143
129
|
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* auto-pr-bugs.test.ts — Regression tests for #2302.
|
|
3
|
+
*
|
|
4
|
+
* Three interacting bugs prevented auto_pr from ever creating a PR:
|
|
5
|
+
* 1. auto_pr was gated on `pushed` (which requires auto_push)
|
|
6
|
+
* 2. Milestone branch was not pushed to remote before PR creation
|
|
7
|
+
* 3. createDraftPR in git-service.ts lacked --head/--base parameters
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import test from "node:test";
|
|
11
|
+
import assert from "node:assert/strict";
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
|
|
15
|
+
// ─── Bug 1: auto_pr should not depend on auto_push / pushed flag ────────────
|
|
16
|
+
|
|
17
|
+
const autoWorktreeSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
|
|
18
|
+
const autoWorktreeSrc = readFileSync(autoWorktreeSrcPath, "utf-8");
|
|
19
|
+
|
|
20
|
+
test("#2302 bug 1: auto_pr condition should not require pushed flag", () => {
|
|
21
|
+
// Find the auto_pr block in mergeMilestoneToMain
|
|
22
|
+
const autoPrIdx = autoWorktreeSrc.indexOf("auto_pr");
|
|
23
|
+
assert.ok(autoPrIdx !== -1, "auto_pr reference exists in auto-worktree.ts");
|
|
24
|
+
|
|
25
|
+
// Get context around the auto_pr check
|
|
26
|
+
const lineStart = autoWorktreeSrc.lastIndexOf("\n", autoPrIdx) + 1;
|
|
27
|
+
const lineEnd = autoWorktreeSrc.indexOf("\n", autoPrIdx);
|
|
28
|
+
const autoPrLine = autoWorktreeSrc.slice(lineStart, lineEnd);
|
|
29
|
+
|
|
30
|
+
// The condition should NOT include `&& pushed`
|
|
31
|
+
assert.ok(
|
|
32
|
+
!autoPrLine.includes("&& pushed"),
|
|
33
|
+
"auto_pr condition should not be gated on pushed flag (auto_push dependency)",
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// ─── Bug 2: phases.ts should not duplicate PR creation ──────────────────────
|
|
38
|
+
|
|
39
|
+
const phasesSrcPath = join(import.meta.dirname, "..", "auto", "phases.ts");
|
|
40
|
+
const phasesSrc = readFileSync(phasesSrcPath, "utf-8");
|
|
41
|
+
|
|
42
|
+
test("#2302 bug 2: phases.ts should not call createDraftPR (handled by mergeMilestoneToMain)", () => {
|
|
43
|
+
// After fix, phases.ts should not import or call createDraftPR because
|
|
44
|
+
// PR creation is handled inside mergeMilestoneToMain in auto-worktree.ts
|
|
45
|
+
const createDraftPRCalls = phasesSrc.match(/createDraftPR\(/g) || [];
|
|
46
|
+
|
|
47
|
+
assert.equal(
|
|
48
|
+
createDraftPRCalls.length,
|
|
49
|
+
0,
|
|
50
|
+
"phases.ts should not call createDraftPR — it's handled by mergeMilestoneToMain",
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// ─── Bug 3: createDraftPR should accept head and base branch parameters ─────
|
|
55
|
+
|
|
56
|
+
const gitServiceSrcPath = join(import.meta.dirname, "..", "git-service.ts");
|
|
57
|
+
const gitServiceSrc = readFileSync(gitServiceSrcPath, "utf-8");
|
|
58
|
+
|
|
59
|
+
test("#2302 bug 3: createDraftPR should accept head and base branch parameters", () => {
|
|
60
|
+
// Find the createDraftPR function signature
|
|
61
|
+
const fnIdx = gitServiceSrc.indexOf("function createDraftPR");
|
|
62
|
+
assert.ok(fnIdx !== -1, "createDraftPR function exists");
|
|
63
|
+
|
|
64
|
+
// Get the function signature (up to the closing paren)
|
|
65
|
+
const sigEnd = gitServiceSrc.indexOf(")", fnIdx);
|
|
66
|
+
const signature = gitServiceSrc.slice(fnIdx, sigEnd);
|
|
67
|
+
|
|
68
|
+
// Should have head and base parameters
|
|
69
|
+
assert.ok(
|
|
70
|
+
signature.includes("head") || signature.includes("branch"),
|
|
71
|
+
"createDraftPR should accept a head/branch parameter",
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("#2302 bug 3: createDraftPR should pass --head and --base to gh pr create", () => {
|
|
76
|
+
const fnIdx = gitServiceSrc.indexOf("function createDraftPR");
|
|
77
|
+
const fnEnd = gitServiceSrc.indexOf("\n}", fnIdx);
|
|
78
|
+
const fnBody = gitServiceSrc.slice(fnIdx, fnEnd);
|
|
79
|
+
|
|
80
|
+
assert.ok(
|
|
81
|
+
fnBody.includes("--head"),
|
|
82
|
+
"createDraftPR should pass --head to gh pr create",
|
|
83
|
+
);
|
|
84
|
+
assert.ok(
|
|
85
|
+
fnBody.includes("--base"),
|
|
86
|
+
"createDraftPR should pass --base to gh pr create",
|
|
87
|
+
);
|
|
88
|
+
});
|
|
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
|
|
|
6
6
|
|
|
7
7
|
import { runGSDDoctor, selectDoctorScope, filterDoctorIssues } from "../doctor.js";
|
|
8
8
|
|
|
9
|
-
test("auto-preflight scopes to active milestone, ignoring historical", async () => {
|
|
9
|
+
test("auto-preflight scopes to active milestone, ignoring historical", async (t) => {
|
|
10
10
|
const tmpBase = mkdtempSync(join(tmpdir(), "gsd-auto-preflight-test-"));
|
|
11
11
|
const gsd = join(tmpBase, ".gsd");
|
|
12
12
|
|
|
@@ -23,18 +23,16 @@ test("auto-preflight scopes to active milestone, ignoring historical", async ()
|
|
|
23
23
|
writeFileSync(join(gsd, "milestones", "M009", "M009-ROADMAP.md"), `# M009: Active\n\n## Slices\n- [ ] **S01: Active Slice** \`risk:low\` \`depends:[]\`\n > After this: active works\n`);
|
|
24
24
|
writeFileSync(join(gsd, "milestones", "M009", "slices", "S01", "S01-PLAN.md"), `# S01: Active Slice\n\n**Goal:** Active\n**Demo:** Active\n\n## Must-Haves\n- done\n\n## Tasks\n- [ ] **T01: Active Task** \`est:5m\`\n todo\n`);
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
const scope = await selectDoctorScope(tmpBase);
|
|
28
|
-
assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
|
|
26
|
+
t.after(() => rmSync(tmpBase, { recursive: true, force: true }));
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
|
|
28
|
+
const scope = await selectDoctorScope(tmpBase);
|
|
29
|
+
assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
|
|
33
30
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
const scopedReport = await runGSDDoctor(tmpBase, { fix: false, scope });
|
|
32
|
+
const scopedBlocking = filterDoctorIssues(scopedReport.issues, { scope, includeWarnings: false });
|
|
33
|
+
assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
|
|
34
|
+
|
|
35
|
+
const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
|
|
36
|
+
const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
|
|
37
|
+
assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
|
|
40
38
|
});
|