gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
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 +63 -77
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- 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 +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- 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/parallel.js +1 -1
- 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/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- 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 +21 -10
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.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/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- 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/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -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/gsd/write-intercept.js +84 -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 +12 -12
- 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 +12 -12
- 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 +2 -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/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- 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 +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- 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/parallel.ts +1 -1
- 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/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -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/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- 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 +21 -10
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.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/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- 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/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- 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 +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- 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 +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- 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 +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- 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 +82 -103
- 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 +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- 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 +81 -94
- 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/milestone-transition-state-rebuild.test.ts +8 -9
- 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-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
- 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/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- 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/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- 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/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -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 -47
- 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/stop-auto-remote.test.ts +2 -3
- 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/sync-lock.test.ts +122 -0
- 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-ownership.test.ts +175 -0
- 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-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -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/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -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/gsd/write-intercept.ts +90 -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_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -52,12 +52,6 @@ import {
|
|
|
52
52
|
updateSessionLock,
|
|
53
53
|
} from "./session-lock.js";
|
|
54
54
|
import type { SessionLockStatus } from "./session-lock.js";
|
|
55
|
-
import {
|
|
56
|
-
clearUnitRuntimeRecord,
|
|
57
|
-
inspectExecuteTaskDurability,
|
|
58
|
-
readUnitRuntimeRecord,
|
|
59
|
-
writeUnitRuntimeRecord,
|
|
60
|
-
} from "./unit-runtime.js";
|
|
61
55
|
import {
|
|
62
56
|
resolveAutoSupervisorConfig,
|
|
63
57
|
loadEffectiveGSDPreferences,
|
|
@@ -81,7 +75,6 @@ import {
|
|
|
81
75
|
} from "./auto-tool-tracking.js";
|
|
82
76
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
83
77
|
import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
|
|
84
|
-
import { selfHealRuntimeRecords } from "./auto-recovery.js";
|
|
85
78
|
import { selectAndApplyModel, resolveModelId } from "./auto-model-selection.js";
|
|
86
79
|
import {
|
|
87
80
|
syncProjectRootToWorktree,
|
|
@@ -155,10 +148,6 @@ import { pruneQueueOrder } from "./queue-order.js";
|
|
|
155
148
|
|
|
156
149
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
157
150
|
import {
|
|
158
|
-
resolveExpectedArtifactPath,
|
|
159
|
-
verifyExpectedArtifact,
|
|
160
|
-
writeBlockerPlaceholder,
|
|
161
|
-
diagnoseExpectedArtifact,
|
|
162
151
|
buildLoopRemediationSteps,
|
|
163
152
|
reconcileMergeState,
|
|
164
153
|
} from "./auto-recovery.js";
|
|
@@ -213,7 +202,6 @@ import {
|
|
|
213
202
|
NEW_SESSION_TIMEOUT_MS,
|
|
214
203
|
} from "./auto/session.js";
|
|
215
204
|
import type {
|
|
216
|
-
CompletedUnit,
|
|
217
205
|
CurrentUnit,
|
|
218
206
|
UnitRouting,
|
|
219
207
|
StartModel,
|
|
@@ -225,7 +213,6 @@ export {
|
|
|
225
213
|
NEW_SESSION_TIMEOUT_MS,
|
|
226
214
|
} from "./auto/session.js";
|
|
227
215
|
export type {
|
|
228
|
-
CompletedUnit,
|
|
229
216
|
CurrentUnit,
|
|
230
217
|
UnitRouting,
|
|
231
218
|
StartModel,
|
|
@@ -250,9 +237,9 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
|
250
237
|
|
|
251
238
|
export function shouldUseWorktreeIsolation(): boolean {
|
|
252
239
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
253
|
-
if (prefs?.isolation === "
|
|
254
|
-
|
|
255
|
-
return
|
|
240
|
+
if (prefs?.isolation === "worktree") return true;
|
|
241
|
+
// Default is false — worktree isolation requires explicit opt-in
|
|
242
|
+
return false;
|
|
256
243
|
}
|
|
257
244
|
|
|
258
245
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
@@ -335,7 +322,6 @@ export function getAutoDashboardData(): AutoDashboardData {
|
|
|
335
322
|
? (s.autoStartTime > 0 ? Date.now() - s.autoStartTime : 0)
|
|
336
323
|
: 0,
|
|
337
324
|
currentUnit: s.currentUnit ? { ...s.currentUnit } : null,
|
|
338
|
-
completedUnits: [...s.completedUnits],
|
|
339
325
|
basePath: s.basePath,
|
|
340
326
|
totalCost: totals?.cost ?? 0,
|
|
341
327
|
totalTokens: totals?.tokens.total ?? 0,
|
|
@@ -447,7 +433,6 @@ export function checkRemoteAutoSession(projectRoot: string): {
|
|
|
447
433
|
unitType?: string;
|
|
448
434
|
unitId?: string;
|
|
449
435
|
startedAt?: string;
|
|
450
|
-
completedUnits?: number;
|
|
451
436
|
} {
|
|
452
437
|
const lock = readCrashLock(projectRoot);
|
|
453
438
|
if (!lock) return { running: false };
|
|
@@ -463,7 +448,6 @@ export function checkRemoteAutoSession(projectRoot: string): {
|
|
|
463
448
|
unitType: lock.unitType,
|
|
464
449
|
unitId: lock.unitId,
|
|
465
450
|
startedAt: lock.startedAt,
|
|
466
|
-
completedUnits: lock.completedUnits,
|
|
467
451
|
};
|
|
468
452
|
}
|
|
469
453
|
|
|
@@ -491,23 +475,19 @@ function clearUnitTimeout(): void {
|
|
|
491
475
|
clearInFlightTools();
|
|
492
476
|
}
|
|
493
477
|
|
|
494
|
-
/** Build snapshot metric opts
|
|
478
|
+
/** Build snapshot metric opts. */
|
|
495
479
|
function buildSnapshotOpts(
|
|
496
|
-
|
|
497
|
-
|
|
480
|
+
_unitType: string,
|
|
481
|
+
_unitId: string,
|
|
498
482
|
): {
|
|
499
483
|
continueHereFired?: boolean;
|
|
500
484
|
promptCharCount?: number;
|
|
501
485
|
baselineCharCount?: number;
|
|
502
486
|
} & Record<string, unknown> {
|
|
503
|
-
const runtime = s.currentUnit
|
|
504
|
-
? readUnitRuntimeRecord(s.basePath, unitType, unitId)
|
|
505
|
-
: null;
|
|
506
487
|
return {
|
|
507
488
|
promptCharCount: s.lastPromptCharCount,
|
|
508
489
|
baselineCharCount: s.lastBaselineCharCount,
|
|
509
490
|
...(s.currentUnitRouting ?? {}),
|
|
510
|
-
...(runtime?.continueHereFired ? { continueHereFired: true } : {}),
|
|
511
491
|
};
|
|
512
492
|
}
|
|
513
493
|
|
|
@@ -610,14 +590,48 @@ export async function stopAuto(
|
|
|
610
590
|
}
|
|
611
591
|
|
|
612
592
|
// ── Step 4: Auto-worktree exit ──
|
|
593
|
+
// When the milestone is complete (has a SUMMARY), merge the worktree branch
|
|
594
|
+
// back to main so code isn't stranded on the worktree branch (#2317).
|
|
595
|
+
// For incomplete milestones, preserve the branch for later resumption.
|
|
613
596
|
try {
|
|
614
597
|
if (s.currentMilestoneId) {
|
|
615
598
|
const notifyCtx = ctx
|
|
616
599
|
? { notify: ctx.ui.notify.bind(ctx.ui) }
|
|
617
600
|
: { notify: () => {} };
|
|
618
|
-
buildResolver()
|
|
619
|
-
|
|
620
|
-
|
|
601
|
+
const resolver = buildResolver();
|
|
602
|
+
|
|
603
|
+
// Check if the milestone is complete — SUMMARY file is the authoritative signal.
|
|
604
|
+
let milestoneComplete = false;
|
|
605
|
+
try {
|
|
606
|
+
const summaryPath = resolveMilestoneFile(
|
|
607
|
+
s.originalBasePath || s.basePath,
|
|
608
|
+
s.currentMilestoneId,
|
|
609
|
+
"SUMMARY",
|
|
610
|
+
);
|
|
611
|
+
if (!summaryPath) {
|
|
612
|
+
// Also check in the worktree path (SUMMARY may not be synced yet)
|
|
613
|
+
const wtSummaryPath = resolveMilestoneFile(
|
|
614
|
+
s.basePath,
|
|
615
|
+
s.currentMilestoneId,
|
|
616
|
+
"SUMMARY",
|
|
617
|
+
);
|
|
618
|
+
milestoneComplete = wtSummaryPath !== null;
|
|
619
|
+
} else {
|
|
620
|
+
milestoneComplete = true;
|
|
621
|
+
}
|
|
622
|
+
} catch {
|
|
623
|
+
// Non-fatal — fall through to preserveBranch path
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
if (milestoneComplete) {
|
|
627
|
+
// Milestone is complete — merge worktree branch back to main
|
|
628
|
+
resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
|
|
629
|
+
} else {
|
|
630
|
+
// Milestone still in progress — preserve branch for later resumption
|
|
631
|
+
resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
|
|
632
|
+
preserveBranch: true,
|
|
633
|
+
});
|
|
634
|
+
}
|
|
621
635
|
}
|
|
622
636
|
} catch (e) {
|
|
623
637
|
debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
|
|
@@ -814,11 +828,6 @@ export async function pauseAuto(
|
|
|
814
828
|
} catch {
|
|
815
829
|
// Non-fatal — best-effort closeout on pause
|
|
816
830
|
}
|
|
817
|
-
try {
|
|
818
|
-
clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
|
|
819
|
-
} catch {
|
|
820
|
-
// Non-fatal
|
|
821
|
-
}
|
|
822
831
|
s.currentUnit = null;
|
|
823
832
|
}
|
|
824
833
|
|
|
@@ -959,9 +968,6 @@ function buildLoopDeps(): LoopDeps {
|
|
|
959
968
|
getMainBranch,
|
|
960
969
|
// Unit closeout + runtime records
|
|
961
970
|
closeoutUnit,
|
|
962
|
-
verifyExpectedArtifact,
|
|
963
|
-
clearUnitRuntimeRecord,
|
|
964
|
-
writeUnitRuntimeRecord,
|
|
965
971
|
recordOutcome,
|
|
966
972
|
writeLock,
|
|
967
973
|
captureAvailableSkills,
|
|
@@ -1134,15 +1140,6 @@ export async function startAuto(
|
|
|
1134
1140
|
}
|
|
1135
1141
|
invalidateAllCaches();
|
|
1136
1142
|
|
|
1137
|
-
// Clean stale runtime records left from the paused session
|
|
1138
|
-
try {
|
|
1139
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
1140
|
-
} catch (e) {
|
|
1141
|
-
debugLog("resume-self-heal-runtime-failed", {
|
|
1142
|
-
error: e instanceof Error ? e.message : String(e),
|
|
1143
|
-
});
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
1143
|
if (s.pausedSessionFile) {
|
|
1147
1144
|
const activityDir = join(gsdRoot(s.basePath), "activity");
|
|
1148
1145
|
const recovery = synthesizeCrashRecovery(
|
|
@@ -1166,19 +1163,14 @@ export async function startAuto(
|
|
|
1166
1163
|
lockBase(),
|
|
1167
1164
|
"resuming",
|
|
1168
1165
|
s.currentMilestoneId ?? "unknown",
|
|
1169
|
-
s.completedUnits.length,
|
|
1170
1166
|
);
|
|
1171
1167
|
writeLock(
|
|
1172
1168
|
lockBase(),
|
|
1173
1169
|
"resuming",
|
|
1174
1170
|
s.currentMilestoneId ?? "unknown",
|
|
1175
|
-
s.completedUnits.length,
|
|
1176
1171
|
);
|
|
1177
1172
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
|
|
1178
1173
|
|
|
1179
|
-
// Clear orphaned runtime records from prior process deaths before entering the loop
|
|
1180
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
1181
|
-
|
|
1182
1174
|
await autoLoop(ctx, pi, s, buildLoopDeps());
|
|
1183
1175
|
cleanupAfterLoopExit(ctx);
|
|
1184
1176
|
return;
|
|
@@ -1210,9 +1202,6 @@ export async function startAuto(
|
|
|
1210
1202
|
}
|
|
1211
1203
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
|
|
1212
1204
|
|
|
1213
|
-
// Clear orphaned runtime records from prior process deaths before entering the loop
|
|
1214
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
1215
|
-
|
|
1216
1205
|
// Dispatch the first unit
|
|
1217
1206
|
await autoLoop(ctx, pi, s, buildLoopDeps());
|
|
1218
1207
|
cleanupAfterLoopExit(ctx);
|
|
@@ -1353,7 +1342,6 @@ export async function dispatchHookUnit(
|
|
|
1353
1342
|
s.basePath = targetBasePath;
|
|
1354
1343
|
s.autoStartTime = Date.now();
|
|
1355
1344
|
s.currentUnit = null;
|
|
1356
|
-
s.completedUnits = [];
|
|
1357
1345
|
s.pendingQuickTasks = [];
|
|
1358
1346
|
}
|
|
1359
1347
|
|
|
@@ -1378,21 +1366,6 @@ export async function dispatchHookUnit(
|
|
|
1378
1366
|
startedAt: hookStartedAt,
|
|
1379
1367
|
};
|
|
1380
1368
|
|
|
1381
|
-
writeUnitRuntimeRecord(
|
|
1382
|
-
s.basePath,
|
|
1383
|
-
hookUnitType,
|
|
1384
|
-
triggerUnitId,
|
|
1385
|
-
hookStartedAt,
|
|
1386
|
-
{
|
|
1387
|
-
phase: "dispatched",
|
|
1388
|
-
wrapupWarningSent: false,
|
|
1389
|
-
timeoutAt: null,
|
|
1390
|
-
lastProgressAt: hookStartedAt,
|
|
1391
|
-
progressCount: 0,
|
|
1392
|
-
lastProgressKind: "dispatch",
|
|
1393
|
-
},
|
|
1394
|
-
);
|
|
1395
|
-
|
|
1396
1369
|
if (hookModel) {
|
|
1397
1370
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
1398
1371
|
const match = resolveModelId(hookModel, availableModels, ctx.model?.provider);
|
|
@@ -1416,7 +1389,6 @@ export async function dispatchHookUnit(
|
|
|
1416
1389
|
lockBase(),
|
|
1417
1390
|
hookUnitType,
|
|
1418
1391
|
triggerUnitId,
|
|
1419
|
-
s.completedUnits.length,
|
|
1420
1392
|
sessionFile,
|
|
1421
1393
|
);
|
|
1422
1394
|
|
|
@@ -1426,18 +1398,6 @@ export async function dispatchHookUnit(
|
|
|
1426
1398
|
s.unitTimeoutHandle = setTimeout(async () => {
|
|
1427
1399
|
s.unitTimeoutHandle = null;
|
|
1428
1400
|
if (!s.active) return;
|
|
1429
|
-
if (s.currentUnit) {
|
|
1430
|
-
writeUnitRuntimeRecord(
|
|
1431
|
-
s.basePath,
|
|
1432
|
-
hookUnitType,
|
|
1433
|
-
triggerUnitId,
|
|
1434
|
-
hookStartedAt,
|
|
1435
|
-
{
|
|
1436
|
-
phase: "timeout",
|
|
1437
|
-
timeoutAt: Date.now(),
|
|
1438
|
-
},
|
|
1439
|
-
);
|
|
1440
|
-
}
|
|
1441
1401
|
ctx.ui.notify(
|
|
1442
1402
|
`Hook ${hookName} exceeded ${supervisor.hard_timeout_minutes ?? 30}min timeout. Pausing auto-mode.`,
|
|
1443
1403
|
"warning",
|
|
@@ -1469,8 +1429,6 @@ export { dispatchDirectPhase } from "./auto-direct-dispatch.js";
|
|
|
1469
1429
|
|
|
1470
1430
|
// Re-export recovery functions for external consumers
|
|
1471
1431
|
export {
|
|
1472
|
-
resolveExpectedArtifactPath,
|
|
1473
|
-
verifyExpectedArtifact,
|
|
1474
|
-
writeBlockerPlaceholder,
|
|
1475
1432
|
buildLoopRemediationSteps,
|
|
1476
1433
|
} from "./auto-recovery.js";
|
|
1434
|
+
export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
2
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
3
|
+
import { Text } from "@gsd/pi-tui";
|
|
3
4
|
|
|
4
5
|
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
5
6
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
6
7
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
7
8
|
import { StringEnum } from "@gsd/pi-ai";
|
|
9
|
+
import { logError } from "../workflow-logger.js";
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
@@ -51,7 +53,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
51
53
|
};
|
|
52
54
|
} catch (err) {
|
|
53
55
|
const msg = err instanceof Error ? err.message : String(err);
|
|
54
|
-
|
|
56
|
+
logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
|
|
55
57
|
return {
|
|
56
58
|
content: [{ type: "text" as const, text: `Error saving decision: ${msg}` }],
|
|
57
59
|
details: { operation: "save_decision", error: msg } as any,
|
|
@@ -87,6 +89,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
87
89
|
], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
|
|
88
90
|
}),
|
|
89
91
|
execute: decisionSaveExecute,
|
|
92
|
+
renderCall(args: any, theme: any) {
|
|
93
|
+
let text = theme.fg("toolTitle", theme.bold("decision_save "));
|
|
94
|
+
if (args.scope) text += theme.fg("accent", `[${args.scope}] `);
|
|
95
|
+
if (args.decision) text += theme.fg("muted", args.decision);
|
|
96
|
+
if (args.choice) text += theme.fg("dim", ` — ${args.choice}`);
|
|
97
|
+
return new Text(text, 0, 0);
|
|
98
|
+
},
|
|
99
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
100
|
+
const d = result.details;
|
|
101
|
+
if (result.isError || d?.error) {
|
|
102
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
103
|
+
}
|
|
104
|
+
let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
|
|
105
|
+
if (d?.id) text += theme.fg("dim", ` → DECISIONS.md`);
|
|
106
|
+
return new Text(text, 0, 0);
|
|
107
|
+
},
|
|
90
108
|
};
|
|
91
109
|
|
|
92
110
|
pi.registerTool(decisionSaveTool);
|
|
@@ -126,7 +144,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
126
144
|
};
|
|
127
145
|
} catch (err) {
|
|
128
146
|
const msg = err instanceof Error ? err.message : String(err);
|
|
129
|
-
|
|
147
|
+
logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
|
|
130
148
|
return {
|
|
131
149
|
content: [{ type: "text" as const, text: `Error updating requirement: ${msg}` }],
|
|
132
150
|
details: { operation: "update_requirement", id: params.id, error: msg } as any,
|
|
@@ -157,6 +175,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
157
175
|
supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
|
|
158
176
|
}),
|
|
159
177
|
execute: requirementUpdateExecute,
|
|
178
|
+
renderCall(args: any, theme: any) {
|
|
179
|
+
let text = theme.fg("toolTitle", theme.bold("requirement_update "));
|
|
180
|
+
if (args.id) text += theme.fg("accent", args.id);
|
|
181
|
+
const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
|
|
182
|
+
if (fields.length > 0) text += theme.fg("dim", ` (${fields.join(", ")})`);
|
|
183
|
+
return new Text(text, 0, 0);
|
|
184
|
+
},
|
|
185
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
186
|
+
const d = result.details;
|
|
187
|
+
if (result.isError || d?.error) {
|
|
188
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
189
|
+
}
|
|
190
|
+
let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
|
|
191
|
+
text += theme.fg("dim", ` → REQUIREMENTS.md`);
|
|
192
|
+
return new Text(text, 0, 0);
|
|
193
|
+
},
|
|
160
194
|
};
|
|
161
195
|
|
|
162
196
|
pi.registerTool(requirementUpdateTool);
|
|
@@ -206,7 +240,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
206
240
|
};
|
|
207
241
|
} catch (err) {
|
|
208
242
|
const msg = err instanceof Error ? err.message : String(err);
|
|
209
|
-
|
|
243
|
+
logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
|
|
210
244
|
return {
|
|
211
245
|
content: [{ type: "text" as const, text: `Error saving artifact: ${msg}` }],
|
|
212
246
|
details: { operation: "save_summary", error: msg } as any,
|
|
@@ -235,6 +269,22 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
235
269
|
content: Type.String({ description: "The full markdown content of the artifact" }),
|
|
236
270
|
}),
|
|
237
271
|
execute: summarySaveExecute,
|
|
272
|
+
renderCall(args: any, theme: any) {
|
|
273
|
+
let text = theme.fg("toolTitle", theme.bold("summary_save "));
|
|
274
|
+
if (args.artifact_type) text += theme.fg("accent", args.artifact_type);
|
|
275
|
+
const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
|
|
276
|
+
if (path) text += theme.fg("dim", ` ${path}`);
|
|
277
|
+
return new Text(text, 0, 0);
|
|
278
|
+
},
|
|
279
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
280
|
+
const d = result.details;
|
|
281
|
+
if (result.isError || d?.error) {
|
|
282
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
283
|
+
}
|
|
284
|
+
let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
|
|
285
|
+
if (d?.path) text += theme.fg("dim", ` → ${d.path}`);
|
|
286
|
+
return new Text(text, 0, 0);
|
|
287
|
+
},
|
|
238
288
|
};
|
|
239
289
|
|
|
240
290
|
pi.registerTool(summarySaveTool);
|
|
@@ -248,6 +298,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
248
298
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
249
299
|
const reserved = claimReservedId();
|
|
250
300
|
if (reserved) {
|
|
301
|
+
await ensureMilestoneDbRow(reserved);
|
|
251
302
|
return {
|
|
252
303
|
content: [{ type: "text" as const, text: reserved }],
|
|
253
304
|
details: { operation: "generate_milestone_id", id: reserved, source: "reserved" } as any,
|
|
@@ -259,6 +310,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
259
310
|
const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
260
311
|
const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
|
|
261
312
|
const newId = nextMilestoneId(allIds, uniqueEnabled);
|
|
313
|
+
await ensureMilestoneDbRow(newId);
|
|
262
314
|
return {
|
|
263
315
|
content: [{ type: "text" as const, text: newId }],
|
|
264
316
|
details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled } as any,
|
|
@@ -272,6 +324,23 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
272
324
|
}
|
|
273
325
|
};
|
|
274
326
|
|
|
327
|
+
/**
|
|
328
|
+
* Insert a minimal DB row for a milestone ID so it's visible to the state
|
|
329
|
+
* machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
|
|
330
|
+
* later writes the full row. Silently skips if the DB isn't available yet
|
|
331
|
+
* (pre-migration).
|
|
332
|
+
*/
|
|
333
|
+
async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
|
|
334
|
+
const dbAvailable = await ensureDbOpen();
|
|
335
|
+
if (!dbAvailable) return;
|
|
336
|
+
try {
|
|
337
|
+
const { insertMilestone } = await import("../gsd-db.js");
|
|
338
|
+
insertMilestone({ id: milestoneId, status: "queued" });
|
|
339
|
+
} catch {
|
|
340
|
+
// Non-fatal — the safety-net in deriveStateFromDb will catch this
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
275
344
|
const milestoneGenerateIdTool = {
|
|
276
345
|
name: "gsd_milestone_generate_id",
|
|
277
346
|
label: "Generate Milestone ID",
|
|
@@ -288,6 +357,18 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
288
357
|
],
|
|
289
358
|
parameters: Type.Object({}),
|
|
290
359
|
execute: milestoneGenerateIdExecute,
|
|
360
|
+
renderCall(_args: any, theme: any) {
|
|
361
|
+
return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
|
|
362
|
+
},
|
|
363
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
364
|
+
const d = result.details;
|
|
365
|
+
if (result.isError || d?.error) {
|
|
366
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
367
|
+
}
|
|
368
|
+
let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
|
|
369
|
+
if (d?.source === "reserved") text += theme.fg("dim", " (reserved)");
|
|
370
|
+
return new Text(text, 0, 0);
|
|
371
|
+
},
|
|
291
372
|
};
|
|
292
373
|
|
|
293
374
|
pi.registerTool(milestoneGenerateIdTool);
|
|
@@ -322,7 +403,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
322
403
|
};
|
|
323
404
|
} catch (err) {
|
|
324
405
|
const msg = err instanceof Error ? err.message : String(err);
|
|
325
|
-
|
|
406
|
+
logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
|
|
326
407
|
return {
|
|
327
408
|
content: [{ type: "text" as const, text: `Error planning milestone: ${msg}` }],
|
|
328
409
|
details: { operation: "plan_milestone", error: msg } as any,
|
|
@@ -415,7 +496,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
415
496
|
};
|
|
416
497
|
} catch (err) {
|
|
417
498
|
const msg = err instanceof Error ? err.message : String(err);
|
|
418
|
-
|
|
499
|
+
logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
|
|
419
500
|
return {
|
|
420
501
|
content: [{ type: "text" as const, text: `Error planning slice: ${msg}` }],
|
|
421
502
|
details: { operation: "plan_slice", error: msg } as any,
|
|
@@ -492,7 +573,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
492
573
|
};
|
|
493
574
|
} catch (err) {
|
|
494
575
|
const msg = err instanceof Error ? err.message : String(err);
|
|
495
|
-
|
|
576
|
+
logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
|
|
496
577
|
return {
|
|
497
578
|
content: [{ type: "text" as const, text: `Error planning task: ${msg}` }],
|
|
498
579
|
details: { operation: "plan_task", error: msg } as any,
|
|
@@ -562,7 +643,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
562
643
|
};
|
|
563
644
|
} catch (err) {
|
|
564
645
|
const msg = err instanceof Error ? err.message : String(err);
|
|
565
|
-
|
|
646
|
+
logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
|
|
566
647
|
return {
|
|
567
648
|
content: [{ type: "text" as const, text: `Error completing task: ${msg}` }],
|
|
568
649
|
details: { operation: "complete_task", error: msg } as any,
|
|
@@ -643,7 +724,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
643
724
|
};
|
|
644
725
|
} catch (err) {
|
|
645
726
|
const msg = err instanceof Error ? err.message : String(err);
|
|
646
|
-
|
|
727
|
+
logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
|
|
647
728
|
return {
|
|
648
729
|
content: [{ type: "text" as const, text: `Error completing slice: ${msg}` }],
|
|
649
730
|
details: { operation: "complete_slice", error: msg } as any,
|
|
@@ -754,7 +835,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
754
835
|
};
|
|
755
836
|
} catch (err) {
|
|
756
837
|
const msg = err instanceof Error ? err.message : String(err);
|
|
757
|
-
|
|
838
|
+
logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
|
|
758
839
|
return {
|
|
759
840
|
content: [{ type: "text" as const, text: `Error completing milestone: ${msg}` }],
|
|
760
841
|
details: { operation: "complete_milestone", error: msg } as any,
|
|
@@ -772,6 +853,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
772
853
|
promptGuidelines: [
|
|
773
854
|
"Use gsd_complete_milestone when all slices in a milestone are finished and the milestone needs to be recorded.",
|
|
774
855
|
"All slices in the milestone must have status 'complete' — the handler validates this before proceeding.",
|
|
856
|
+
"verificationPassed must be explicitly set to true — the handler rejects completion if verification did not pass.",
|
|
775
857
|
"On success, returns summaryPath where the MILESTONE-SUMMARY.md was written.",
|
|
776
858
|
],
|
|
777
859
|
parameters: Type.Object({
|
|
@@ -787,6 +869,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
787
869
|
lessonsLearned: Type.Array(Type.String(), { description: "Lessons learned during the milestone" }),
|
|
788
870
|
followUps: Type.Optional(Type.String({ description: "Follow-up items for future milestones" })),
|
|
789
871
|
deviations: Type.Optional(Type.String({ description: "Deviations from the original plan" })),
|
|
872
|
+
verificationPassed: Type.Boolean({ description: "Must be true — confirms that code change verification, success criteria, and definition of done checks all passed before completion" }),
|
|
790
873
|
}),
|
|
791
874
|
execute: milestoneCompleteExecute,
|
|
792
875
|
};
|
|
@@ -794,6 +877,74 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
794
877
|
pi.registerTool(milestoneCompleteTool);
|
|
795
878
|
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
796
879
|
|
|
880
|
+
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
881
|
+
|
|
882
|
+
const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
883
|
+
const dbAvailable = await ensureDbOpen();
|
|
884
|
+
if (!dbAvailable) {
|
|
885
|
+
return {
|
|
886
|
+
content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot validate milestone." }],
|
|
887
|
+
details: { operation: "validate_milestone", error: "db_unavailable" } as any,
|
|
888
|
+
};
|
|
889
|
+
}
|
|
890
|
+
try {
|
|
891
|
+
const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
|
|
892
|
+
const result = await handleValidateMilestone(params, process.cwd());
|
|
893
|
+
if ("error" in result) {
|
|
894
|
+
return {
|
|
895
|
+
content: [{ type: "text" as const, text: `Error validating milestone: ${result.error}` }],
|
|
896
|
+
details: { operation: "validate_milestone", error: result.error } as any,
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
return {
|
|
900
|
+
content: [{ type: "text" as const, text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
|
|
901
|
+
details: {
|
|
902
|
+
operation: "validate_milestone",
|
|
903
|
+
milestoneId: result.milestoneId,
|
|
904
|
+
verdict: result.verdict,
|
|
905
|
+
validationPath: result.validationPath,
|
|
906
|
+
} as any,
|
|
907
|
+
};
|
|
908
|
+
} catch (err) {
|
|
909
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
910
|
+
logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
|
|
911
|
+
return {
|
|
912
|
+
content: [{ type: "text" as const, text: `Error validating milestone: ${msg}` }],
|
|
913
|
+
details: { operation: "validate_milestone", error: msg } as any,
|
|
914
|
+
};
|
|
915
|
+
}
|
|
916
|
+
};
|
|
917
|
+
|
|
918
|
+
const milestoneValidateTool = {
|
|
919
|
+
name: "gsd_validate_milestone",
|
|
920
|
+
label: "Validate Milestone",
|
|
921
|
+
description:
|
|
922
|
+
"Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
|
|
923
|
+
"Records verdict (pass/needs-attention/needs-remediation) and rationale.",
|
|
924
|
+
promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
|
|
925
|
+
promptGuidelines: [
|
|
926
|
+
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
927
|
+
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
|
|
928
|
+
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
929
|
+
"On success, returns validationPath where VALIDATION.md was written.",
|
|
930
|
+
],
|
|
931
|
+
parameters: Type.Object({
|
|
932
|
+
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
933
|
+
verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
|
|
934
|
+
remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
|
|
935
|
+
successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
|
|
936
|
+
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
937
|
+
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
938
|
+
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
939
|
+
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
940
|
+
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
941
|
+
}),
|
|
942
|
+
execute: milestoneValidateExecute,
|
|
943
|
+
};
|
|
944
|
+
|
|
945
|
+
pi.registerTool(milestoneValidateTool);
|
|
946
|
+
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
947
|
+
|
|
797
948
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
798
949
|
|
|
799
950
|
const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
@@ -825,7 +976,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
825
976
|
};
|
|
826
977
|
} catch (err) {
|
|
827
978
|
const msg = err instanceof Error ? err.message : String(err);
|
|
828
|
-
|
|
979
|
+
logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
|
|
829
980
|
return {
|
|
830
981
|
content: [{ type: "text" as const, text: `Error replanning slice: ${msg}` }],
|
|
831
982
|
details: { operation: "replan_slice", error: msg } as any,
|
|
@@ -905,7 +1056,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
905
1056
|
};
|
|
906
1057
|
} catch (err) {
|
|
907
1058
|
const msg = err instanceof Error ? err.message : String(err);
|
|
908
|
-
|
|
1059
|
+
logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
|
|
909
1060
|
return {
|
|
910
1061
|
content: [{ type: "text" as const, text: `Error reassessing roadmap: ${msg}` }],
|
|
911
1062
|
details: { operation: "reassess_roadmap", error: msg } as any,
|
|
@@ -7,6 +7,7 @@ import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolve
|
|
|
7
7
|
import { buildBeforeAgentStartResult } from "./system-context.js";
|
|
8
8
|
import { handleAgentEnd } from "./agent-end-recovery.js";
|
|
9
9
|
import { clearDiscussionFlowState, isDepthVerified, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite } from "./write-gate.js";
|
|
10
|
+
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
10
11
|
import { getDiscussionMilestoneId } from "../guided-flow.js";
|
|
11
12
|
import { loadToolApiKeys } from "../commands-config.js";
|
|
12
13
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -135,7 +136,28 @@ export function registerHooks(pi: ExtensionAPI): void {
|
|
|
135
136
|
return { block: true, reason: loopCheck.reason };
|
|
136
137
|
}
|
|
137
138
|
|
|
139
|
+
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
140
|
+
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
141
|
+
if (isToolCallEventType("write", event)) {
|
|
142
|
+
if (isBlockedStateFile(event.input.path)) {
|
|
143
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (isToolCallEventType("edit", event)) {
|
|
148
|
+
if (isBlockedStateFile(event.input.path)) {
|
|
149
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (isToolCallEventType("bash", event)) {
|
|
154
|
+
if (isBashWriteToStateFile(event.input.command)) {
|
|
155
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
138
159
|
if (!isToolCallEventType("write", event)) return;
|
|
160
|
+
|
|
139
161
|
const result = shouldBlockContextWrite(
|
|
140
162
|
event.toolName,
|
|
141
163
|
event.input.path,
|