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
|
@@ -17,6 +17,7 @@ import { createWorktree, removeWorktree, resolveGitDir, worktreePath, } from "./
|
|
|
17
17
|
import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
|
|
18
18
|
import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
19
19
|
import { debugLog } from "./debug-logger.js";
|
|
20
|
+
import { logWarning } from "./workflow-logger.js";
|
|
20
21
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
21
22
|
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, } from "./native-git-bridge.js";
|
|
22
23
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
@@ -109,6 +110,7 @@ export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
|
|
|
109
110
|
"OVERRIDES.md",
|
|
110
111
|
"QUEUE.md",
|
|
111
112
|
"completed-units.json",
|
|
113
|
+
"metrics.json",
|
|
112
114
|
];
|
|
113
115
|
for (const f of rootFiles) {
|
|
114
116
|
const src = join(mainGsd, f);
|
|
@@ -269,8 +271,9 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
|
269
271
|
// ── 1. Sync root-level .gsd/ files back ──────────────────────────────
|
|
270
272
|
// The worktree is authoritative — complete-milestone updates REQUIREMENTS,
|
|
271
273
|
// PROJECT, etc. These must overwrite main's copies so they survive teardown.
|
|
272
|
-
// Also includes QUEUE.md
|
|
273
|
-
// milestone closeout and lost on teardown without explicit sync
|
|
274
|
+
// Also includes QUEUE.md, completed-units.json, and metrics.json which are
|
|
275
|
+
// written during milestone closeout and lost on teardown without explicit sync
|
|
276
|
+
// (#1787, #2313).
|
|
274
277
|
const rootFiles = [
|
|
275
278
|
"DECISIONS.md",
|
|
276
279
|
"REQUIREMENTS.md",
|
|
@@ -279,6 +282,7 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
|
279
282
|
"OVERRIDES.md",
|
|
280
283
|
"QUEUE.md",
|
|
281
284
|
"completed-units.json",
|
|
285
|
+
"metrics.json",
|
|
282
286
|
];
|
|
283
287
|
for (const f of rootFiles) {
|
|
284
288
|
const src = join(wtGsd, f);
|
|
@@ -612,7 +616,7 @@ export function createAutoWorktree(basePath, milestoneId) {
|
|
|
612
616
|
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
613
617
|
if (hookError) {
|
|
614
618
|
// Non-fatal — log but don't prevent worktree usage
|
|
615
|
-
|
|
619
|
+
logWarning("reconcile", hookError, { worktree: info.name });
|
|
616
620
|
}
|
|
617
621
|
const previousCwd = process.cwd();
|
|
618
622
|
try {
|
|
@@ -687,9 +691,9 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
687
691
|
// backslashes (#1436), leaving ~1 GB+ orphaned directories.
|
|
688
692
|
const wtDir = worktreePath(originalBasePath, milestoneId);
|
|
689
693
|
if (existsSync(wtDir)) {
|
|
690
|
-
|
|
691
|
-
`
|
|
692
|
-
`
|
|
694
|
+
logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
|
|
695
|
+
`This is likely an orphaned directory consuming disk space. ` +
|
|
696
|
+
`Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
|
|
693
697
|
// Attempt a direct filesystem removal as a fallback
|
|
694
698
|
try {
|
|
695
699
|
rmSync(wtDir, { recursive: true, force: true });
|
|
@@ -1133,9 +1137,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1133
1137
|
// Push failure is non-fatal
|
|
1134
1138
|
}
|
|
1135
1139
|
}
|
|
1136
|
-
// 9b. Auto-create PR if enabled (
|
|
1140
|
+
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
1137
1141
|
let prCreated = false;
|
|
1138
|
-
if (prefs.auto_pr === true &&
|
|
1142
|
+
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
1139
1143
|
const remote = prefs.remote ?? "origin";
|
|
1140
1144
|
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
1141
1145
|
try {
|
|
@@ -1145,9 +1149,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1145
1149
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1146
1150
|
encoding: "utf-8",
|
|
1147
1151
|
});
|
|
1148
|
-
// Create PR via gh CLI
|
|
1152
|
+
// Create PR via gh CLI with explicit --head and --base (#2302)
|
|
1149
1153
|
execFileSync("gh", [
|
|
1150
|
-
"pr", "create",
|
|
1154
|
+
"pr", "create", "--draft",
|
|
1151
1155
|
"--base", prTarget,
|
|
1152
1156
|
"--head", milestoneBranch,
|
|
1153
1157
|
"--title", `Milestone ${milestoneId} complete`,
|
|
@@ -82,11 +82,10 @@ const s = new AutoSession();
|
|
|
82
82
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
83
83
|
export function shouldUseWorktreeIsolation() {
|
|
84
84
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
85
|
-
if (prefs?.isolation === "
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return true; // default: worktree
|
|
85
|
+
if (prefs?.isolation === "worktree")
|
|
86
|
+
return true;
|
|
87
|
+
// Default is false — worktree isolation requires explicit opt-in
|
|
88
|
+
return false;
|
|
90
89
|
}
|
|
91
90
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
92
91
|
/** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
|
|
@@ -369,14 +368,41 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
369
368
|
debugLog("stop-cleanup-sigterm", { error: e instanceof Error ? e.message : String(e) });
|
|
370
369
|
}
|
|
371
370
|
// ── Step 4: Auto-worktree exit ──
|
|
371
|
+
// When the milestone is complete (has a SUMMARY), merge the worktree branch
|
|
372
|
+
// back to main so code isn't stranded on the worktree branch (#2317).
|
|
373
|
+
// For incomplete milestones, preserve the branch for later resumption.
|
|
372
374
|
try {
|
|
373
375
|
if (s.currentMilestoneId) {
|
|
374
376
|
const notifyCtx = ctx
|
|
375
377
|
? { notify: ctx.ui.notify.bind(ctx.ui) }
|
|
376
378
|
: { notify: () => { } };
|
|
377
|
-
buildResolver()
|
|
378
|
-
|
|
379
|
-
|
|
379
|
+
const resolver = buildResolver();
|
|
380
|
+
// Check if the milestone is complete — SUMMARY file is the authoritative signal.
|
|
381
|
+
let milestoneComplete = false;
|
|
382
|
+
try {
|
|
383
|
+
const summaryPath = resolveMilestoneFile(s.originalBasePath || s.basePath, s.currentMilestoneId, "SUMMARY");
|
|
384
|
+
if (!summaryPath) {
|
|
385
|
+
// Also check in the worktree path (SUMMARY may not be synced yet)
|
|
386
|
+
const wtSummaryPath = resolveMilestoneFile(s.basePath, s.currentMilestoneId, "SUMMARY");
|
|
387
|
+
milestoneComplete = wtSummaryPath !== null;
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
milestoneComplete = true;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// Non-fatal — fall through to preserveBranch path
|
|
395
|
+
}
|
|
396
|
+
if (milestoneComplete) {
|
|
397
|
+
// Milestone is complete — merge worktree branch back to main
|
|
398
|
+
resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
// Milestone still in progress — preserve branch for later resumption
|
|
402
|
+
resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
|
|
403
|
+
preserveBranch: true,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
380
406
|
}
|
|
381
407
|
}
|
|
382
408
|
catch (e) {
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Text } from "@gsd/pi-tui";
|
|
2
3
|
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
3
4
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
4
5
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
6
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
7
|
+
import { logError } from "../workflow-logger.js";
|
|
5
8
|
/**
|
|
6
9
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
7
10
|
* The alias description and promptGuidelines direct the LLM to prefer the canonical name.
|
|
@@ -43,7 +46,7 @@ export function registerDbTools(pi) {
|
|
|
43
46
|
}
|
|
44
47
|
catch (err) {
|
|
45
48
|
const msg = err instanceof Error ? err.message : String(err);
|
|
46
|
-
|
|
49
|
+
logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
|
|
47
50
|
return {
|
|
48
51
|
content: [{ type: "text", text: `Error saving decision: ${msg}` }],
|
|
49
52
|
details: { operation: "save_decision", error: msg },
|
|
@@ -77,6 +80,26 @@ export function registerDbTools(pi) {
|
|
|
77
80
|
], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
|
|
78
81
|
}),
|
|
79
82
|
execute: decisionSaveExecute,
|
|
83
|
+
renderCall(args, theme) {
|
|
84
|
+
let text = theme.fg("toolTitle", theme.bold("decision_save "));
|
|
85
|
+
if (args.scope)
|
|
86
|
+
text += theme.fg("accent", `[${args.scope}] `);
|
|
87
|
+
if (args.decision)
|
|
88
|
+
text += theme.fg("muted", args.decision);
|
|
89
|
+
if (args.choice)
|
|
90
|
+
text += theme.fg("dim", ` — ${args.choice}`);
|
|
91
|
+
return new Text(text, 0, 0);
|
|
92
|
+
},
|
|
93
|
+
renderResult(result, _options, theme) {
|
|
94
|
+
const d = result.details;
|
|
95
|
+
if (result.isError || d?.error) {
|
|
96
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
97
|
+
}
|
|
98
|
+
let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
|
|
99
|
+
if (d?.id)
|
|
100
|
+
text += theme.fg("dim", ` → DECISIONS.md`);
|
|
101
|
+
return new Text(text, 0, 0);
|
|
102
|
+
},
|
|
80
103
|
};
|
|
81
104
|
pi.registerTool(decisionSaveTool);
|
|
82
105
|
registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
|
|
@@ -120,7 +143,7 @@ export function registerDbTools(pi) {
|
|
|
120
143
|
}
|
|
121
144
|
catch (err) {
|
|
122
145
|
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
-
|
|
146
|
+
logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
|
|
124
147
|
return {
|
|
125
148
|
content: [{ type: "text", text: `Error updating requirement: ${msg}` }],
|
|
126
149
|
details: { operation: "update_requirement", id: params.id, error: msg },
|
|
@@ -149,6 +172,24 @@ export function registerDbTools(pi) {
|
|
|
149
172
|
supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
|
|
150
173
|
}),
|
|
151
174
|
execute: requirementUpdateExecute,
|
|
175
|
+
renderCall(args, theme) {
|
|
176
|
+
let text = theme.fg("toolTitle", theme.bold("requirement_update "));
|
|
177
|
+
if (args.id)
|
|
178
|
+
text += theme.fg("accent", args.id);
|
|
179
|
+
const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
|
|
180
|
+
if (fields.length > 0)
|
|
181
|
+
text += theme.fg("dim", ` (${fields.join(", ")})`);
|
|
182
|
+
return new Text(text, 0, 0);
|
|
183
|
+
},
|
|
184
|
+
renderResult(result, _options, theme) {
|
|
185
|
+
const d = result.details;
|
|
186
|
+
if (result.isError || d?.error) {
|
|
187
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
188
|
+
}
|
|
189
|
+
let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
|
|
190
|
+
text += theme.fg("dim", ` → REQUIREMENTS.md`);
|
|
191
|
+
return new Text(text, 0, 0);
|
|
192
|
+
},
|
|
152
193
|
};
|
|
153
194
|
pi.registerTool(requirementUpdateTool);
|
|
154
195
|
registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
|
|
@@ -195,7 +236,7 @@ export function registerDbTools(pi) {
|
|
|
195
236
|
}
|
|
196
237
|
catch (err) {
|
|
197
238
|
const msg = err instanceof Error ? err.message : String(err);
|
|
198
|
-
|
|
239
|
+
logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
|
|
199
240
|
return {
|
|
200
241
|
content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
|
|
201
242
|
details: { operation: "save_summary", error: msg },
|
|
@@ -222,6 +263,25 @@ export function registerDbTools(pi) {
|
|
|
222
263
|
content: Type.String({ description: "The full markdown content of the artifact" }),
|
|
223
264
|
}),
|
|
224
265
|
execute: summarySaveExecute,
|
|
266
|
+
renderCall(args, theme) {
|
|
267
|
+
let text = theme.fg("toolTitle", theme.bold("summary_save "));
|
|
268
|
+
if (args.artifact_type)
|
|
269
|
+
text += theme.fg("accent", args.artifact_type);
|
|
270
|
+
const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
|
|
271
|
+
if (path)
|
|
272
|
+
text += theme.fg("dim", ` ${path}`);
|
|
273
|
+
return new Text(text, 0, 0);
|
|
274
|
+
},
|
|
275
|
+
renderResult(result, _options, theme) {
|
|
276
|
+
const d = result.details;
|
|
277
|
+
if (result.isError || d?.error) {
|
|
278
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
279
|
+
}
|
|
280
|
+
let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
|
|
281
|
+
if (d?.path)
|
|
282
|
+
text += theme.fg("dim", ` → ${d.path}`);
|
|
283
|
+
return new Text(text, 0, 0);
|
|
284
|
+
},
|
|
225
285
|
};
|
|
226
286
|
pi.registerTool(summarySaveTool);
|
|
227
287
|
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
@@ -232,6 +292,7 @@ export function registerDbTools(pi) {
|
|
|
232
292
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
233
293
|
const reserved = claimReservedId();
|
|
234
294
|
if (reserved) {
|
|
295
|
+
await ensureMilestoneDbRow(reserved);
|
|
235
296
|
return {
|
|
236
297
|
content: [{ type: "text", text: reserved }],
|
|
237
298
|
details: { operation: "generate_milestone_id", id: reserved, source: "reserved" },
|
|
@@ -242,6 +303,7 @@ export function registerDbTools(pi) {
|
|
|
242
303
|
const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
243
304
|
const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
|
|
244
305
|
const newId = nextMilestoneId(allIds, uniqueEnabled);
|
|
306
|
+
await ensureMilestoneDbRow(newId);
|
|
245
307
|
return {
|
|
246
308
|
content: [{ type: "text", text: newId }],
|
|
247
309
|
details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled },
|
|
@@ -255,6 +317,24 @@ export function registerDbTools(pi) {
|
|
|
255
317
|
};
|
|
256
318
|
}
|
|
257
319
|
};
|
|
320
|
+
/**
|
|
321
|
+
* Insert a minimal DB row for a milestone ID so it's visible to the state
|
|
322
|
+
* machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
|
|
323
|
+
* later writes the full row. Silently skips if the DB isn't available yet
|
|
324
|
+
* (pre-migration).
|
|
325
|
+
*/
|
|
326
|
+
async function ensureMilestoneDbRow(milestoneId) {
|
|
327
|
+
const dbAvailable = await ensureDbOpen();
|
|
328
|
+
if (!dbAvailable)
|
|
329
|
+
return;
|
|
330
|
+
try {
|
|
331
|
+
const { insertMilestone } = await import("../gsd-db.js");
|
|
332
|
+
insertMilestone({ id: milestoneId, status: "queued" });
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// Non-fatal — the safety-net in deriveStateFromDb will catch this
|
|
336
|
+
}
|
|
337
|
+
}
|
|
258
338
|
const milestoneGenerateIdTool = {
|
|
259
339
|
name: "gsd_milestone_generate_id",
|
|
260
340
|
label: "Generate Milestone ID",
|
|
@@ -270,6 +350,19 @@ export function registerDbTools(pi) {
|
|
|
270
350
|
],
|
|
271
351
|
parameters: Type.Object({}),
|
|
272
352
|
execute: milestoneGenerateIdExecute,
|
|
353
|
+
renderCall(_args, theme) {
|
|
354
|
+
return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
|
|
355
|
+
},
|
|
356
|
+
renderResult(result, _options, theme) {
|
|
357
|
+
const d = result.details;
|
|
358
|
+
if (result.isError || d?.error) {
|
|
359
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
360
|
+
}
|
|
361
|
+
let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
|
|
362
|
+
if (d?.source === "reserved")
|
|
363
|
+
text += theme.fg("dim", " (reserved)");
|
|
364
|
+
return new Text(text, 0, 0);
|
|
365
|
+
},
|
|
273
366
|
};
|
|
274
367
|
pi.registerTool(milestoneGenerateIdTool);
|
|
275
368
|
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
@@ -302,7 +395,7 @@ export function registerDbTools(pi) {
|
|
|
302
395
|
}
|
|
303
396
|
catch (err) {
|
|
304
397
|
const msg = err instanceof Error ? err.message : String(err);
|
|
305
|
-
|
|
398
|
+
logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
|
|
306
399
|
return {
|
|
307
400
|
content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
|
|
308
401
|
details: { operation: "plan_milestone", error: msg },
|
|
@@ -391,7 +484,7 @@ export function registerDbTools(pi) {
|
|
|
391
484
|
}
|
|
392
485
|
catch (err) {
|
|
393
486
|
const msg = err instanceof Error ? err.message : String(err);
|
|
394
|
-
|
|
487
|
+
logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
|
|
395
488
|
return {
|
|
396
489
|
content: [{ type: "text", text: `Error planning slice: ${msg}` }],
|
|
397
490
|
details: { operation: "plan_slice", error: msg },
|
|
@@ -464,7 +557,7 @@ export function registerDbTools(pi) {
|
|
|
464
557
|
}
|
|
465
558
|
catch (err) {
|
|
466
559
|
const msg = err instanceof Error ? err.message : String(err);
|
|
467
|
-
|
|
560
|
+
logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
|
|
468
561
|
return {
|
|
469
562
|
content: [{ type: "text", text: `Error planning task: ${msg}` }],
|
|
470
563
|
details: { operation: "plan_task", error: msg },
|
|
@@ -530,7 +623,7 @@ export function registerDbTools(pi) {
|
|
|
530
623
|
}
|
|
531
624
|
catch (err) {
|
|
532
625
|
const msg = err instanceof Error ? err.message : String(err);
|
|
533
|
-
|
|
626
|
+
logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
|
|
534
627
|
return {
|
|
535
628
|
content: [{ type: "text", text: `Error completing task: ${msg}` }],
|
|
536
629
|
details: { operation: "complete_task", error: msg },
|
|
@@ -604,7 +697,7 @@ export function registerDbTools(pi) {
|
|
|
604
697
|
}
|
|
605
698
|
catch (err) {
|
|
606
699
|
const msg = err instanceof Error ? err.message : String(err);
|
|
607
|
-
|
|
700
|
+
logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
|
|
608
701
|
return {
|
|
609
702
|
content: [{ type: "text", text: `Error completing slice: ${msg}` }],
|
|
610
703
|
details: { operation: "complete_slice", error: msg },
|
|
@@ -696,7 +789,7 @@ export function registerDbTools(pi) {
|
|
|
696
789
|
}
|
|
697
790
|
catch (err) {
|
|
698
791
|
const msg = err instanceof Error ? err.message : String(err);
|
|
699
|
-
|
|
792
|
+
logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
|
|
700
793
|
return {
|
|
701
794
|
content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
|
|
702
795
|
details: { operation: "complete_milestone", error: msg },
|
|
@@ -732,6 +825,70 @@ export function registerDbTools(pi) {
|
|
|
732
825
|
};
|
|
733
826
|
pi.registerTool(milestoneCompleteTool);
|
|
734
827
|
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
828
|
+
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
829
|
+
const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
830
|
+
const dbAvailable = await ensureDbOpen();
|
|
831
|
+
if (!dbAvailable) {
|
|
832
|
+
return {
|
|
833
|
+
content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
|
|
834
|
+
details: { operation: "validate_milestone", error: "db_unavailable" },
|
|
835
|
+
};
|
|
836
|
+
}
|
|
837
|
+
try {
|
|
838
|
+
const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
|
|
839
|
+
const result = await handleValidateMilestone(params, process.cwd());
|
|
840
|
+
if ("error" in result) {
|
|
841
|
+
return {
|
|
842
|
+
content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
|
|
843
|
+
details: { operation: "validate_milestone", error: result.error },
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
return {
|
|
847
|
+
content: [{ type: "text", text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
|
|
848
|
+
details: {
|
|
849
|
+
operation: "validate_milestone",
|
|
850
|
+
milestoneId: result.milestoneId,
|
|
851
|
+
verdict: result.verdict,
|
|
852
|
+
validationPath: result.validationPath,
|
|
853
|
+
},
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
catch (err) {
|
|
857
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
858
|
+
logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
|
|
859
|
+
return {
|
|
860
|
+
content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
|
|
861
|
+
details: { operation: "validate_milestone", error: msg },
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
const milestoneValidateTool = {
|
|
866
|
+
name: "gsd_validate_milestone",
|
|
867
|
+
label: "Validate Milestone",
|
|
868
|
+
description: "Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
|
|
869
|
+
"Records verdict (pass/needs-attention/needs-remediation) and rationale.",
|
|
870
|
+
promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
|
|
871
|
+
promptGuidelines: [
|
|
872
|
+
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
873
|
+
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
|
|
874
|
+
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
875
|
+
"On success, returns validationPath where VALIDATION.md was written.",
|
|
876
|
+
],
|
|
877
|
+
parameters: Type.Object({
|
|
878
|
+
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
879
|
+
verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
|
|
880
|
+
remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
|
|
881
|
+
successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
|
|
882
|
+
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
883
|
+
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
884
|
+
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
885
|
+
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
886
|
+
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
887
|
+
}),
|
|
888
|
+
execute: milestoneValidateExecute,
|
|
889
|
+
};
|
|
890
|
+
pi.registerTool(milestoneValidateTool);
|
|
891
|
+
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
735
892
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
736
893
|
const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
737
894
|
const dbAvailable = await ensureDbOpen();
|
|
@@ -763,7 +920,7 @@ export function registerDbTools(pi) {
|
|
|
763
920
|
}
|
|
764
921
|
catch (err) {
|
|
765
922
|
const msg = err instanceof Error ? err.message : String(err);
|
|
766
|
-
|
|
923
|
+
logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
|
|
767
924
|
return {
|
|
768
925
|
content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
|
|
769
926
|
details: { operation: "replan_slice", error: msg },
|
|
@@ -836,7 +993,7 @@ export function registerDbTools(pi) {
|
|
|
836
993
|
}
|
|
837
994
|
catch (err) {
|
|
838
995
|
const msg = err instanceof Error ? err.message : String(err);
|
|
839
|
-
|
|
996
|
+
logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
|
|
840
997
|
return {
|
|
841
998
|
content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
|
|
842
999
|
details: { operation: "reassess_roadmap", error: msg },
|
|
@@ -45,18 +45,9 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
45
45
|
ctx.ui.notify(`GSD skill preferences: ${report.warnings.length} unresolved skill${report.warnings.length === 1 ? "" : "s"}: ${report.warnings.join(", ")}`, "warning");
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
const content = readFileSync(knowledgePath, "utf-8").trim();
|
|
53
|
-
if (content) {
|
|
54
|
-
knowledgeBlock = `\n\n[PROJECT KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${content}`;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// skip
|
|
59
|
-
}
|
|
48
|
+
const { block: knowledgeBlock, globalSizeKb } = loadKnowledgeBlock(gsdHome, process.cwd());
|
|
49
|
+
if (globalSizeKb > 4) {
|
|
50
|
+
ctx.ui.notify(`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`, "warning");
|
|
60
51
|
}
|
|
61
52
|
let memoryBlock = "";
|
|
62
53
|
try {
|
|
@@ -102,6 +93,49 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
102
93
|
: {}),
|
|
103
94
|
};
|
|
104
95
|
}
|
|
96
|
+
export function loadKnowledgeBlock(gsdHomeDir, cwd) {
|
|
97
|
+
// 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
|
|
98
|
+
let globalKnowledge = "";
|
|
99
|
+
let globalSizeKb = 0;
|
|
100
|
+
const globalKnowledgePath = join(gsdHomeDir, "agent", "KNOWLEDGE.md");
|
|
101
|
+
if (existsSync(globalKnowledgePath)) {
|
|
102
|
+
try {
|
|
103
|
+
const content = readFileSync(globalKnowledgePath, "utf-8").trim();
|
|
104
|
+
if (content) {
|
|
105
|
+
globalSizeKb = Buffer.byteLength(content, "utf-8") / 1024;
|
|
106
|
+
globalKnowledge = content;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// skip
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 2. Project knowledge (.gsd/KNOWLEDGE.md) — project-specific
|
|
114
|
+
let projectKnowledge = "";
|
|
115
|
+
const knowledgePath = resolveGsdRootFile(cwd, "KNOWLEDGE");
|
|
116
|
+
if (existsSync(knowledgePath)) {
|
|
117
|
+
try {
|
|
118
|
+
const content = readFileSync(knowledgePath, "utf-8").trim();
|
|
119
|
+
if (content)
|
|
120
|
+
projectKnowledge = content;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!globalKnowledge && !projectKnowledge) {
|
|
127
|
+
return { block: "", globalSizeKb: 0 };
|
|
128
|
+
}
|
|
129
|
+
const parts = [];
|
|
130
|
+
if (globalKnowledge)
|
|
131
|
+
parts.push(`## Global Knowledge\n\n${globalKnowledge}`);
|
|
132
|
+
if (projectKnowledge)
|
|
133
|
+
parts.push(`## Project Knowledge\n\n${projectKnowledge}`);
|
|
134
|
+
return {
|
|
135
|
+
block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${parts.join("\n\n")}`,
|
|
136
|
+
globalSizeKb,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
105
139
|
function buildWorktreeContextBlock() {
|
|
106
140
|
const worktreeName = getActiveWorktreeName();
|
|
107
141
|
const worktreeMainCwd = getWorktreeOriginalCwd();
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { resolveProjectRoot } from "../worktree.js";
|
|
6
6
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
7
|
-
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast";
|
|
7
|
+
export const GSD_COMMAND_DESCRIPTION = "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink";
|
|
8
8
|
export const TOP_LEVEL_SUBCOMMANDS = [
|
|
9
9
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
10
10
|
{ cmd: "next", desc: "Explicit step mode (same as /gsd)" },
|
|
@@ -56,6 +56,8 @@ export const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
56
56
|
{ cmd: "templates", desc: "List available workflow templates" },
|
|
57
57
|
{ cmd: "extensions", desc: "Manage extensions (list, enable, disable, info)" },
|
|
58
58
|
{ cmd: "fast", desc: "Toggle OpenAI service tier (on/off/flex/status)" },
|
|
59
|
+
{ cmd: "mcp", desc: "MCP server status and connectivity check (status, check <server>)" },
|
|
60
|
+
{ cmd: "rethink", desc: "Conversational project reorganization — reorder, park, discard, add milestones" },
|
|
59
61
|
{ cmd: "workflow", desc: "Custom workflow lifecycle (new, run, list, validate, pause, resume)" },
|
|
60
62
|
];
|
|
61
63
|
const NESTED_COMPLETIONS = {
|
|
@@ -174,6 +176,10 @@ const NESTED_COMPLETIONS = {
|
|
|
174
176
|
{ cmd: "flex", desc: "Flex tier (0.5x cost, slower)" },
|
|
175
177
|
{ cmd: "status", desc: "Show current service tier setting" },
|
|
176
178
|
],
|
|
179
|
+
mcp: [
|
|
180
|
+
{ cmd: "status", desc: "Show all MCP server statuses (default)" },
|
|
181
|
+
{ cmd: "check", desc: "Detailed status for a specific server" },
|
|
182
|
+
],
|
|
177
183
|
doctor: [
|
|
178
184
|
{ cmd: "fix", desc: "Auto-fix detected issues" },
|
|
179
185
|
{ cmd: "heal", desc: "AI-driven deep healing" },
|
|
@@ -32,6 +32,7 @@ export function showHelp(ctx) {
|
|
|
32
32
|
" /gsd triage Classify and route pending captures",
|
|
33
33
|
" /gsd skip <unit> Prevent a unit from auto-mode dispatch",
|
|
34
34
|
" /gsd undo Revert last completed unit [--force]",
|
|
35
|
+
" /gsd rethink Conversational project reorganization — reorder, park, discard, add milestones",
|
|
35
36
|
" /gsd park [id] Park a milestone — skip without deleting [reason]",
|
|
36
37
|
" /gsd unpark [id] Reactivate a parked milestone",
|
|
37
38
|
"",
|
|
@@ -49,6 +50,7 @@ export function showHelp(ctx) {
|
|
|
49
50
|
" /gsd hooks Show post-unit hook configuration",
|
|
50
51
|
" /gsd extensions Manage extensions [list|enable|disable|info]",
|
|
51
52
|
" /gsd fast Toggle OpenAI service tier [on|off|flex|status]",
|
|
53
|
+
" /gsd mcp MCP server status and connectivity [status|check <server>]",
|
|
52
54
|
"",
|
|
53
55
|
"MAINTENANCE",
|
|
54
56
|
" /gsd doctor Diagnose and repair .gsd/ state [audit|fix|heal] [scope]",
|
|
@@ -188,10 +188,20 @@ Examples:
|
|
|
188
188
|
await handleFast(trimmed.replace(/^fast\s*/, "").trim(), ctx);
|
|
189
189
|
return true;
|
|
190
190
|
}
|
|
191
|
+
if (trimmed === "mcp" || trimmed.startsWith("mcp ")) {
|
|
192
|
+
const { handleMcpStatus } = await import("../../commands-mcp-status.js");
|
|
193
|
+
await handleMcpStatus(trimmed.replace(/^mcp\s*/, "").trim(), ctx);
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
191
196
|
if (trimmed === "extensions" || trimmed.startsWith("extensions ")) {
|
|
192
197
|
const { handleExtensions } = await import("../../commands-extensions.js");
|
|
193
198
|
await handleExtensions(trimmed.replace(/^extensions\s*/, "").trim(), ctx);
|
|
194
199
|
return true;
|
|
195
200
|
}
|
|
201
|
+
if (trimmed === "rethink") {
|
|
202
|
+
const { handleRethink } = await import("../../rethink.js");
|
|
203
|
+
await handleRethink(trimmed, ctx, pi);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
196
206
|
return false;
|
|
197
207
|
}
|
|
@@ -166,6 +166,11 @@ export async function handleWorkflowCommand(trimmed, ctx, pi) {
|
|
|
166
166
|
return true;
|
|
167
167
|
}
|
|
168
168
|
if (trimmed === "quick" || trimmed.startsWith("quick ")) {
|
|
169
|
+
if (isAutoActive()) {
|
|
170
|
+
ctx.ui.notify("/gsd quick cannot run while auto-mode is active.\n" +
|
|
171
|
+
"Stop auto-mode first with /gsd stop, then run /gsd quick.", "error");
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
169
174
|
await handleQuick(trimmed.replace(/^quick\s*/, "").trim(), ctx, pi);
|
|
170
175
|
return true;
|
|
171
176
|
}
|