gsd-pi 2.45.0 → 2.46.0-dev.cc9d310
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/dist/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/auto/phases.js +27 -42
- 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-start.js +2 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +5 -4
- package/dist/resources/extensions/gsd/auto.js +12 -57
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +15 -12
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- 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 +9 -9
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +5 -3
- package/dist/resources/extensions/gsd/gsd-db.js +16 -3
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- 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 +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
- 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 +4 -2
- 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/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +7 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +7 -0
- 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 +30 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +27 -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 +32 -2
- 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 +4 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +37 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -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 +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +17 -17
- 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.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/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/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/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/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/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/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 +2 -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 +20 -2
- 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/package.json +1 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- 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/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +30 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +24 -44
- 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-start.ts +1 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +8 -5
- package/src/resources/extensions/gsd/auto.ts +7 -83
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -12
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- 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 +9 -17
- 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 +6 -3
- package/src/resources/extensions/gsd/gsd-db.ts +16 -3
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -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 +7 -3
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
- 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 +4 -2
- 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/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +7 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +8 -0
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +5 -13
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +264 -228
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +317 -250
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +2 -8
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +42 -3
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -7
- 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 +0 -2
- 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/preferences.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +15 -14
- 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/session-lock-regression.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- 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/worktree-journal-events.test.ts +220 -0
- 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 +38 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +35 -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 +38 -1
- 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 +4 -9
- package/src/resources/extensions/gsd/worktree-resolver.ts +37 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -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/app/page-12dd5ece0df4badc.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/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,7 @@ import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
|
5
5
|
import { readRepoMeta, externalProjectsRoot, cleanNumberedGsdVariants } from "./repo-identity.js";
|
|
6
6
|
import { loadFile } from "./files.js";
|
|
7
7
|
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
8
|
-
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
8
|
+
import { isDbAvailable, _getAdapter, getMilestoneSlices } from "./gsd-db.js";
|
|
9
9
|
import { resolveMilestoneFile, milestonesDir, gsdRoot, resolveGsdRootFile, relGsdRootFile } from "./paths.js";
|
|
10
10
|
import { deriveState, isMilestoneComplete } from "./state.js";
|
|
11
11
|
import { saveFile } from "./files.js";
|
|
@@ -19,13 +19,15 @@ import { getAllWorktreeHealth } from "./worktree-health.js";
|
|
|
19
19
|
import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
|
|
20
20
|
import { recoverFailedMigration } from "./migrate-external.js";
|
|
21
21
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
22
|
+
import { readEvents } from "./workflow-events.js";
|
|
23
|
+
import { renderAllProjections } from "./workflow-projections.js";
|
|
22
24
|
|
|
23
25
|
export async function checkGitHealth(
|
|
24
26
|
basePath: string,
|
|
25
27
|
issues: DoctorIssue[],
|
|
26
28
|
fixesApplied: string[],
|
|
27
29
|
shouldFix: (code: DoctorIssueCode) => boolean,
|
|
28
|
-
isolationMode: "none" | "worktree" | "branch" = "
|
|
30
|
+
isolationMode: "none" | "worktree" | "branch" = "none",
|
|
29
31
|
): Promise<void> {
|
|
30
32
|
// Degrade gracefully if not a git repo
|
|
31
33
|
if (!nativeIsRepo(basePath)) {
|
|
@@ -1111,3 +1113,179 @@ export async function checkGlobalHealth(
|
|
|
1111
1113
|
// Non-fatal — global health check must not block per-project doctor
|
|
1112
1114
|
}
|
|
1113
1115
|
}
|
|
1116
|
+
|
|
1117
|
+
// ── Engine Health Checks ────────────────────────────────────────────────────
|
|
1118
|
+
// DB constraint violation detection and projection drift checks.
|
|
1119
|
+
|
|
1120
|
+
export async function checkEngineHealth(
|
|
1121
|
+
basePath: string,
|
|
1122
|
+
issues: DoctorIssue[],
|
|
1123
|
+
fixesApplied: string[],
|
|
1124
|
+
): Promise<void> {
|
|
1125
|
+
// ── DB constraint violation detection (full doctor only, not pre-dispatch per D-10) ──
|
|
1126
|
+
try {
|
|
1127
|
+
if (isDbAvailable()) {
|
|
1128
|
+
const adapter = _getAdapter()!;
|
|
1129
|
+
|
|
1130
|
+
// a. Orphaned tasks (task.slice_id points to non-existent slice)
|
|
1131
|
+
try {
|
|
1132
|
+
const orphanedTasks = adapter
|
|
1133
|
+
.prepare(
|
|
1134
|
+
`SELECT t.id, t.slice_id, t.milestone_id
|
|
1135
|
+
FROM tasks t
|
|
1136
|
+
LEFT JOIN slices s ON t.milestone_id = s.milestone_id AND t.slice_id = s.id
|
|
1137
|
+
WHERE s.id IS NULL`,
|
|
1138
|
+
)
|
|
1139
|
+
.all() as Array<{ id: string; slice_id: string; milestone_id: string }>;
|
|
1140
|
+
|
|
1141
|
+
for (const row of orphanedTasks) {
|
|
1142
|
+
issues.push({
|
|
1143
|
+
severity: "error",
|
|
1144
|
+
code: "db_orphaned_task",
|
|
1145
|
+
scope: "task",
|
|
1146
|
+
unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
|
|
1147
|
+
message: `Task ${row.id} references slice ${row.slice_id} in milestone ${row.milestone_id} but no such slice exists in the database`,
|
|
1148
|
+
fixable: false,
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
} catch {
|
|
1152
|
+
// Non-fatal — orphaned task check failed
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
// b. Orphaned slices (slice.milestone_id points to non-existent milestone)
|
|
1156
|
+
try {
|
|
1157
|
+
const orphanedSlices = adapter
|
|
1158
|
+
.prepare(
|
|
1159
|
+
`SELECT s.id, s.milestone_id
|
|
1160
|
+
FROM slices s
|
|
1161
|
+
LEFT JOIN milestones m ON s.milestone_id = m.id
|
|
1162
|
+
WHERE m.id IS NULL`,
|
|
1163
|
+
)
|
|
1164
|
+
.all() as Array<{ id: string; milestone_id: string }>;
|
|
1165
|
+
|
|
1166
|
+
for (const row of orphanedSlices) {
|
|
1167
|
+
issues.push({
|
|
1168
|
+
severity: "error",
|
|
1169
|
+
code: "db_orphaned_slice",
|
|
1170
|
+
scope: "slice",
|
|
1171
|
+
unitId: `${row.milestone_id}/${row.id}`,
|
|
1172
|
+
message: `Slice ${row.id} references milestone ${row.milestone_id} but no such milestone exists in the database`,
|
|
1173
|
+
fixable: false,
|
|
1174
|
+
});
|
|
1175
|
+
}
|
|
1176
|
+
} catch {
|
|
1177
|
+
// Non-fatal — orphaned slice check failed
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// c. Tasks marked complete without summaries
|
|
1181
|
+
try {
|
|
1182
|
+
const doneTasks = adapter
|
|
1183
|
+
.prepare(
|
|
1184
|
+
`SELECT id, slice_id, milestone_id FROM tasks
|
|
1185
|
+
WHERE status = 'done' AND (summary IS NULL OR summary = '')`,
|
|
1186
|
+
)
|
|
1187
|
+
.all() as Array<{ id: string; slice_id: string; milestone_id: string }>;
|
|
1188
|
+
|
|
1189
|
+
for (const row of doneTasks) {
|
|
1190
|
+
issues.push({
|
|
1191
|
+
severity: "warning",
|
|
1192
|
+
code: "db_done_task_no_summary",
|
|
1193
|
+
scope: "task",
|
|
1194
|
+
unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
|
|
1195
|
+
message: `Task ${row.id} is marked done but has no summary in the database`,
|
|
1196
|
+
fixable: false,
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
} catch {
|
|
1200
|
+
// Non-fatal — done-task-no-summary check failed
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
// d. Duplicate entity IDs (safety check)
|
|
1204
|
+
try {
|
|
1205
|
+
const dupMilestones = adapter
|
|
1206
|
+
.prepare("SELECT id, COUNT(*) as cnt FROM milestones GROUP BY id HAVING cnt > 1")
|
|
1207
|
+
.all() as Array<{ id: string; cnt: number }>;
|
|
1208
|
+
for (const row of dupMilestones) {
|
|
1209
|
+
issues.push({
|
|
1210
|
+
severity: "error",
|
|
1211
|
+
code: "db_duplicate_id",
|
|
1212
|
+
scope: "milestone",
|
|
1213
|
+
unitId: row.id,
|
|
1214
|
+
message: `Duplicate milestone ID "${row.id}" appears ${row.cnt} times in the database`,
|
|
1215
|
+
fixable: false,
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
const dupSlices = adapter
|
|
1220
|
+
.prepare("SELECT id, milestone_id, COUNT(*) as cnt FROM slices GROUP BY id, milestone_id HAVING cnt > 1")
|
|
1221
|
+
.all() as Array<{ id: string; milestone_id: string; cnt: number }>;
|
|
1222
|
+
for (const row of dupSlices) {
|
|
1223
|
+
issues.push({
|
|
1224
|
+
severity: "error",
|
|
1225
|
+
code: "db_duplicate_id",
|
|
1226
|
+
scope: "slice",
|
|
1227
|
+
unitId: `${row.milestone_id}/${row.id}`,
|
|
1228
|
+
message: `Duplicate slice ID "${row.id}" in milestone ${row.milestone_id} appears ${row.cnt} times`,
|
|
1229
|
+
fixable: false,
|
|
1230
|
+
});
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
const dupTasks = adapter
|
|
1234
|
+
.prepare("SELECT id, slice_id, milestone_id, COUNT(*) as cnt FROM tasks GROUP BY id, slice_id, milestone_id HAVING cnt > 1")
|
|
1235
|
+
.all() as Array<{ id: string; slice_id: string; milestone_id: string; cnt: number }>;
|
|
1236
|
+
for (const row of dupTasks) {
|
|
1237
|
+
issues.push({
|
|
1238
|
+
severity: "error",
|
|
1239
|
+
code: "db_duplicate_id",
|
|
1240
|
+
scope: "task",
|
|
1241
|
+
unitId: `${row.milestone_id}/${row.slice_id}/${row.id}`,
|
|
1242
|
+
message: `Duplicate task ID "${row.id}" in slice ${row.slice_id} appears ${row.cnt} times`,
|
|
1243
|
+
fixable: false,
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
} catch {
|
|
1247
|
+
// Non-fatal — duplicate ID check failed
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
} catch {
|
|
1251
|
+
// Non-fatal — DB constraint checks failed entirely
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
// ── Projection drift detection ──────────────────────────────────────────
|
|
1255
|
+
// If the DB is available, check whether markdown projections are stale
|
|
1256
|
+
// relative to the event log and re-render them.
|
|
1257
|
+
try {
|
|
1258
|
+
if (isDbAvailable()) {
|
|
1259
|
+
const eventLogPath = join(basePath, ".gsd", "event-log.jsonl");
|
|
1260
|
+
const events = readEvents(eventLogPath);
|
|
1261
|
+
if (events.length > 0) {
|
|
1262
|
+
const lastEventTs = new Date(events[events.length - 1]!.ts).getTime();
|
|
1263
|
+
const state = await deriveState(basePath);
|
|
1264
|
+
for (const milestone of state.registry) {
|
|
1265
|
+
if (milestone.status === "complete") continue;
|
|
1266
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
|
|
1267
|
+
if (!roadmapPath || !existsSync(roadmapPath)) {
|
|
1268
|
+
try {
|
|
1269
|
+
await renderAllProjections(basePath, milestone.id);
|
|
1270
|
+
fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
|
|
1271
|
+
} catch {
|
|
1272
|
+
// Non-fatal — projection re-render failed
|
|
1273
|
+
}
|
|
1274
|
+
continue;
|
|
1275
|
+
}
|
|
1276
|
+
const projectionMtime = statSync(roadmapPath).mtimeMs;
|
|
1277
|
+
if (lastEventTs > projectionMtime) {
|
|
1278
|
+
try {
|
|
1279
|
+
await renderAllProjections(basePath, milestone.id);
|
|
1280
|
+
fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
|
|
1281
|
+
} catch {
|
|
1282
|
+
// Non-fatal — projection re-render failed
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
} catch {
|
|
1289
|
+
// Non-fatal — projection drift check must never block doctor
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
@@ -70,7 +70,13 @@ export type DoctorIssueCode =
|
|
|
70
70
|
| "large_planning_file"
|
|
71
71
|
// Slow environment checks (opt-in via --build / --test flags)
|
|
72
72
|
| "env_build"
|
|
73
|
-
| "env_test"
|
|
73
|
+
| "env_test"
|
|
74
|
+
// Engine health checks (Phase 4)
|
|
75
|
+
| "db_orphaned_task"
|
|
76
|
+
| "db_orphaned_slice"
|
|
77
|
+
| "db_done_task_no_summary"
|
|
78
|
+
| "db_duplicate_id"
|
|
79
|
+
| "projection_drift";
|
|
74
80
|
|
|
75
81
|
/**
|
|
76
82
|
* Issue codes that represent global or completion-critical state.
|
|
@@ -12,7 +12,7 @@ import { loadEffectiveGSDPreferences, type GSDPreferences } from "./preferences.
|
|
|
12
12
|
import type { DoctorIssue, DoctorIssueCode, DoctorReport } from "./doctor-types.js";
|
|
13
13
|
import { GLOBAL_STATE_CODES } from "./doctor-types.js";
|
|
14
14
|
import type { RoadmapSliceEntry } from "./types.js";
|
|
15
|
-
import { checkGitHealth, checkRuntimeHealth, checkGlobalHealth } from "./doctor-checks.js";
|
|
15
|
+
import { checkGitHealth, checkRuntimeHealth, checkGlobalHealth, checkEngineHealth } from "./doctor-checks.js";
|
|
16
16
|
import { checkEnvironmentHealth } from "./doctor-environment.js";
|
|
17
17
|
import { runProviderChecks } from "./doctor-providers.js";
|
|
18
18
|
|
|
@@ -360,8 +360,8 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
|
|
|
360
360
|
// Git health checks — timed
|
|
361
361
|
const t0git = Date.now();
|
|
362
362
|
const isolationMode: "none" | "worktree" | "branch" = options?.isolationMode ??
|
|
363
|
-
(prefs?.preferences?.git?.isolation === "
|
|
364
|
-
prefs?.preferences?.git?.isolation === "branch" ? "branch" : "
|
|
363
|
+
(prefs?.preferences?.git?.isolation === "worktree" ? "worktree" :
|
|
364
|
+
prefs?.preferences?.git?.isolation === "branch" ? "branch" : "none");
|
|
365
365
|
await checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode);
|
|
366
366
|
const gitMs = Date.now() - t0git;
|
|
367
367
|
|
|
@@ -382,6 +382,9 @@ export async function runGSDDoctor(basePath: string, options?: { fix?: boolean;
|
|
|
382
382
|
});
|
|
383
383
|
const envMs = Date.now() - t0env;
|
|
384
384
|
|
|
385
|
+
// Engine health checks — DB constraints and projection drift
|
|
386
|
+
await checkEngineHealth(basePath, issues, fixesApplied);
|
|
387
|
+
|
|
385
388
|
const milestonesPath = milestonesDir(basePath);
|
|
386
389
|
if (!existsSync(milestonesPath)) {
|
|
387
390
|
const report: DoctorReport = { ok: issues.every(i => i.severity !== "error"), basePath, issues, fixesApplied, timing: { git: gitMs, runtime: runtimeMs, environment: envMs, gsdState: 0 } };
|
|
@@ -78,8 +78,12 @@ function loadProvider(): void {
|
|
|
78
78
|
// unavailable
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
const nodeMajor = parseInt(process.versions.node.split(".")[0], 10);
|
|
82
|
+
const versionHint = nodeMajor < 22
|
|
83
|
+
? ` GSD requires Node >= 22.0.0 (current: v${process.versions.node}). Upgrade Node to fix this.`
|
|
84
|
+
: "";
|
|
81
85
|
process.stderr.write(
|
|
82
|
-
|
|
86
|
+
`gsd-db: No SQLite provider available (tried node:sqlite, better-sqlite3).${versionHint}\n`,
|
|
83
87
|
);
|
|
84
88
|
}
|
|
85
89
|
|
|
@@ -145,7 +149,7 @@ function openRawDb(path: string): unknown {
|
|
|
145
149
|
return new Database(path);
|
|
146
150
|
}
|
|
147
151
|
|
|
148
|
-
const SCHEMA_VERSION =
|
|
152
|
+
const SCHEMA_VERSION = 11;
|
|
149
153
|
|
|
150
154
|
function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
151
155
|
if (fileBacked) db.exec("PRAGMA journal_mode=WAL");
|
|
@@ -619,6 +623,13 @@ function migrateSchema(db: DbAdapter): void {
|
|
|
619
623
|
|
|
620
624
|
if (currentVersion < 11) {
|
|
621
625
|
ensureColumn(db, "tasks", "full_plan_md", `ALTER TABLE tasks ADD COLUMN full_plan_md TEXT NOT NULL DEFAULT ''`);
|
|
626
|
+
// Add unique constraint to replan_history for idempotency:
|
|
627
|
+
// one replan record per blocker task per slice per milestone.
|
|
628
|
+
db.exec(`
|
|
629
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_replan_history_unique
|
|
630
|
+
ON replan_history(milestone_id, slice_id, task_id)
|
|
631
|
+
WHERE slice_id IS NOT NULL AND task_id IS NOT NULL
|
|
632
|
+
`);
|
|
622
633
|
|
|
623
634
|
db.prepare("INSERT INTO schema_version (version, applied_at) VALUES (:version, :applied_at)").run({
|
|
624
635
|
":version": 11,
|
|
@@ -1602,8 +1613,10 @@ export function insertReplanHistory(entry: {
|
|
|
1602
1613
|
replacementArtifactPath?: string | null;
|
|
1603
1614
|
}): void {
|
|
1604
1615
|
if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1616
|
+
// INSERT OR REPLACE: idempotent on (milestone_id, slice_id, task_id) via schema v11 unique index.
|
|
1617
|
+
// Retrying the same replan silently updates summary instead of accumulating duplicate rows.
|
|
1605
1618
|
currentDb.prepare(
|
|
1606
|
-
`INSERT INTO replan_history (milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at)
|
|
1619
|
+
`INSERT OR REPLACE INTO replan_history (milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at)
|
|
1607
1620
|
VALUES (:milestone_id, :slice_id, :task_id, :summary, :previous_artifact_path, :replacement_artifact_path, :created_at)`,
|
|
1608
1621
|
).run({
|
|
1609
1622
|
":milestone_id": entry.milestoneId,
|
|
@@ -910,8 +910,7 @@ export async function showSmartEntry(
|
|
|
910
910
|
// when the user exits during init wizard or discuss phase before any
|
|
911
911
|
// real auto-mode work begins.
|
|
912
912
|
const isBootstrapCrash = crashLock.unitType === "starting"
|
|
913
|
-
&& crashLock.unitId === "bootstrap"
|
|
914
|
-
&& crashLock.completedUnits === 0;
|
|
913
|
+
&& crashLock.unitId === "bootstrap";
|
|
915
914
|
|
|
916
915
|
if (!isBootstrapCrash) {
|
|
917
916
|
const resume = await showNextAction(ctx, {
|
|
@@ -32,7 +32,12 @@ export type JournalEventType =
|
|
|
32
32
|
| "milestone-transition"
|
|
33
33
|
| "stuck-detected"
|
|
34
34
|
| "sidecar-dequeue"
|
|
35
|
-
| "iteration-end"
|
|
35
|
+
| "iteration-end"
|
|
36
|
+
| "worktree-enter"
|
|
37
|
+
| "worktree-create-failed"
|
|
38
|
+
| "worktree-skip"
|
|
39
|
+
| "worktree-merge-start"
|
|
40
|
+
| "worktree-merge-failed";
|
|
36
41
|
|
|
37
42
|
/** A single structured event in the journal. */
|
|
38
43
|
export interface JournalEntry {
|
|
@@ -37,7 +37,7 @@ export function determineMergeOrder(
|
|
|
37
37
|
workers: WorkerInfo[],
|
|
38
38
|
order: MergeOrder = "sequential",
|
|
39
39
|
): string[] {
|
|
40
|
-
const completed = workers.filter(w => w.state === "stopped"
|
|
40
|
+
const completed = workers.filter(w => w.state === "stopped");
|
|
41
41
|
if (order === "by-completion") {
|
|
42
42
|
return completed
|
|
43
43
|
.sort((a, b) => a.startedAt - b.startedAt) // earliest first
|
|
@@ -52,7 +52,6 @@ export interface WorkerInfo {
|
|
|
52
52
|
worktreePath: string;
|
|
53
53
|
startedAt: number;
|
|
54
54
|
state: "running" | "paused" | "stopped" | "error";
|
|
55
|
-
completedUnits: number;
|
|
56
55
|
cost: number;
|
|
57
56
|
cleanup?: () => void;
|
|
58
57
|
}
|
|
@@ -83,7 +82,6 @@ export interface PersistedState {
|
|
|
83
82
|
worktreePath: string;
|
|
84
83
|
startedAt: number;
|
|
85
84
|
state: "running" | "paused" | "stopped" | "error";
|
|
86
|
-
completedUnits: number;
|
|
87
85
|
cost: number;
|
|
88
86
|
}>;
|
|
89
87
|
totalCost: number;
|
|
@@ -114,7 +112,6 @@ export function persistState(basePath: string): void {
|
|
|
114
112
|
worktreePath: w.worktreePath,
|
|
115
113
|
startedAt: w.startedAt,
|
|
116
114
|
state: w.state,
|
|
117
|
-
completedUnits: w.completedUnits,
|
|
118
115
|
cost: w.cost,
|
|
119
116
|
})),
|
|
120
117
|
totalCost: state.totalCost,
|
|
@@ -226,7 +223,6 @@ function restoreRuntimeState(basePath: string): boolean {
|
|
|
226
223
|
worktreePath: diskStatus?.worktreePath ?? w.worktreePath,
|
|
227
224
|
startedAt: w.startedAt,
|
|
228
225
|
state: diskStatus?.state ?? w.state,
|
|
229
|
-
completedUnits: diskStatus?.completedUnits ?? w.completedUnits,
|
|
230
226
|
cost: diskStatus?.cost ?? w.cost,
|
|
231
227
|
});
|
|
232
228
|
}
|
|
@@ -261,7 +257,6 @@ function restoreRuntimeState(basePath: string): boolean {
|
|
|
261
257
|
worktreePath: status.worktreePath,
|
|
262
258
|
startedAt: status.startedAt,
|
|
263
259
|
state: status.state,
|
|
264
|
-
completedUnits: status.completedUnits,
|
|
265
260
|
cost: status.cost,
|
|
266
261
|
});
|
|
267
262
|
state.totalCost += status.cost;
|
|
@@ -389,7 +384,6 @@ export async function startParallel(
|
|
|
389
384
|
worktreePath: w.worktreePath,
|
|
390
385
|
startedAt: w.startedAt,
|
|
391
386
|
state: "running",
|
|
392
|
-
completedUnits: w.completedUnits,
|
|
393
387
|
cost: w.cost,
|
|
394
388
|
});
|
|
395
389
|
adopted.push(w.milestoneId);
|
|
@@ -440,7 +434,6 @@ export async function startParallel(
|
|
|
440
434
|
worktreePath: wtPath,
|
|
441
435
|
startedAt: now,
|
|
442
436
|
state: "running",
|
|
443
|
-
completedUnits: 0,
|
|
444
437
|
cost: 0,
|
|
445
438
|
};
|
|
446
439
|
|
|
@@ -602,7 +595,7 @@ export function spawnWorker(
|
|
|
602
595
|
pid: worker.pid,
|
|
603
596
|
state: "running",
|
|
604
597
|
currentUnit: null,
|
|
605
|
-
completedUnits:
|
|
598
|
+
completedUnits: 0,
|
|
606
599
|
cost: worker.cost,
|
|
607
600
|
lastHeartbeat: Date.now(),
|
|
608
601
|
startedAt: worker.startedAt,
|
|
@@ -645,7 +638,7 @@ export function spawnWorker(
|
|
|
645
638
|
pid: w.pid,
|
|
646
639
|
state: w.state,
|
|
647
640
|
currentUnit: null,
|
|
648
|
-
completedUnits:
|
|
641
|
+
completedUnits: 0,
|
|
649
642
|
cost: w.cost,
|
|
650
643
|
lastHeartbeat: Date.now(),
|
|
651
644
|
startedAt: w.startedAt,
|
|
@@ -727,14 +720,6 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
|
|
|
727
720
|
}
|
|
728
721
|
}
|
|
729
722
|
|
|
730
|
-
// Track completed units (each message_end from assistant = progress)
|
|
731
|
-
if (msg.role === "assistant") {
|
|
732
|
-
const worker = state.workers.get(milestoneId);
|
|
733
|
-
if (worker) {
|
|
734
|
-
worker.completedUnits++;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
|
|
738
723
|
// Update session status file so dashboard sees live cost
|
|
739
724
|
const worker = state.workers.get(milestoneId);
|
|
740
725
|
if (worker) {
|
|
@@ -743,7 +728,7 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
|
|
|
743
728
|
pid: worker.pid,
|
|
744
729
|
state: worker.state,
|
|
745
730
|
currentUnit: null,
|
|
746
|
-
completedUnits:
|
|
731
|
+
completedUnits: 0,
|
|
747
732
|
cost: worker.cost,
|
|
748
733
|
lastHeartbeat: Date.now(),
|
|
749
734
|
startedAt: worker.startedAt,
|
|
@@ -762,7 +747,7 @@ function processWorkerLine(basePath: string, milestoneId: string, line: string):
|
|
|
762
747
|
pid: worker.pid,
|
|
763
748
|
state: worker.state,
|
|
764
749
|
currentUnit: null,
|
|
765
|
-
completedUnits:
|
|
750
|
+
completedUnits: 0,
|
|
766
751
|
cost: worker.cost,
|
|
767
752
|
lastHeartbeat: Date.now(),
|
|
768
753
|
startedAt: worker.startedAt,
|
|
@@ -930,14 +915,13 @@ export function refreshWorkerStatuses(
|
|
|
930
915
|
if (!isPidAlive(worker.pid)) {
|
|
931
916
|
worker.cleanup?.();
|
|
932
917
|
worker.cleanup = undefined;
|
|
933
|
-
worker.state =
|
|
918
|
+
worker.state = "error";
|
|
934
919
|
worker.process = null;
|
|
935
920
|
}
|
|
936
921
|
continue;
|
|
937
922
|
}
|
|
938
923
|
|
|
939
924
|
worker.state = diskStatus.state;
|
|
940
|
-
worker.completedUnits = diskStatus.completedUnits;
|
|
941
925
|
worker.cost = diskStatus.cost;
|
|
942
926
|
worker.pid = diskStatus.pid;
|
|
943
927
|
}
|
|
@@ -34,7 +34,7 @@ export const MODE_DEFAULTS: Record<WorkflowMode, Partial<GSDPreferences>> = {
|
|
|
34
34
|
push_branches: false,
|
|
35
35
|
pre_merge_check: false,
|
|
36
36
|
merge_strategy: "squash",
|
|
37
|
-
isolation: "
|
|
37
|
+
isolation: "none",
|
|
38
38
|
},
|
|
39
39
|
unique_milestone_ids: false,
|
|
40
40
|
},
|
|
@@ -44,7 +44,7 @@ export const MODE_DEFAULTS: Record<WorkflowMode, Partial<GSDPreferences>> = {
|
|
|
44
44
|
push_branches: true,
|
|
45
45
|
pre_merge_check: true,
|
|
46
46
|
merge_strategy: "squash",
|
|
47
|
-
isolation: "
|
|
47
|
+
isolation: "none",
|
|
48
48
|
},
|
|
49
49
|
unique_milestone_ids: true,
|
|
50
50
|
},
|
|
@@ -497,13 +497,17 @@ export function resolvePreDispatchHooks(): PreDispatchHookConfig[] {
|
|
|
497
497
|
|
|
498
498
|
/**
|
|
499
499
|
* Resolve the effective git isolation mode from preferences.
|
|
500
|
-
* Returns "
|
|
500
|
+
* Returns "none" (default), "worktree", or "branch".
|
|
501
|
+
*
|
|
502
|
+
* Default is "none" so GSD works out of the box without preferences.md.
|
|
503
|
+
* Worktree isolation requires explicit opt-in because it depends on git
|
|
504
|
+
* branch infrastructure that must be set up before use.
|
|
501
505
|
*/
|
|
502
506
|
export function getIsolationMode(): "none" | "worktree" | "branch" {
|
|
503
507
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
504
|
-
if (prefs?.isolation === "
|
|
508
|
+
if (prefs?.isolation === "worktree") return "worktree";
|
|
505
509
|
if (prefs?.isolation === "branch") return "branch";
|
|
506
|
-
return "
|
|
510
|
+
return "none"; // default — no isolation, work on current branch
|
|
507
511
|
}
|
|
508
512
|
|
|
509
513
|
export function resolveParallelConfig(prefs: GSDPreferences | undefined): import("./types.js").ParallelConfig {
|
|
@@ -17,18 +17,31 @@ All relevant context has been preloaded below — the roadmap, all slice summari
|
|
|
17
17
|
Then:
|
|
18
18
|
1. Use the **Milestone Summary** output template from the inlined context above
|
|
19
19
|
2. {{skillActivation}}
|
|
20
|
-
3. **Verify code changes exist.** Run `git diff --stat HEAD $(git merge-base HEAD main) -- ':!.gsd/'` (or the equivalent for the integration branch). If no non-`.gsd/` files appear in the diff, the milestone produced only planning artifacts and no actual code.
|
|
21
|
-
4. Verify each **success criterion** from the milestone definition in `{{roadmapPath}}`. For each criterion, confirm it was met with specific evidence from slice summaries, test results, or observable behavior.
|
|
22
|
-
5. Verify the milestone's **definition of done** — all slices are `[x]`, all slice summaries exist, and any cross-slice integration points work correctly.
|
|
20
|
+
3. **Verify code changes exist.** Run `git diff --stat HEAD $(git merge-base HEAD main) -- ':!.gsd/'` (or the equivalent for the integration branch). If no non-`.gsd/` files appear in the diff, the milestone produced only planning artifacts and no actual code. Record this as a **verification failure**.
|
|
21
|
+
4. Verify each **success criterion** from the milestone definition in `{{roadmapPath}}`. For each criterion, confirm it was met with specific evidence from slice summaries, test results, or observable behavior. Record any criterion that was NOT met as a **verification failure**.
|
|
22
|
+
5. Verify the milestone's **definition of done** — all slices are `[x]`, all slice summaries exist, and any cross-slice integration points work correctly. Record any unmet items as a **verification failure**.
|
|
23
23
|
6. Validate **requirement status transitions**. For each requirement that changed status during this milestone, confirm the transition is supported by evidence. Requirements can move between Active, Validated, Deferred, Blocked, or Out of Scope — but only with proof.
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
|
|
25
|
+
### Verification Gate — STOP if verification failed
|
|
26
|
+
|
|
27
|
+
**If ANY verification failure was recorded in steps 3, 4, or 5, you MUST follow the failure path below. Do NOT proceed to step 7.**
|
|
28
|
+
|
|
29
|
+
**Failure path** (verification failed):
|
|
30
|
+
- Do NOT call `gsd_complete_milestone` — the milestone must not be marked as complete.
|
|
31
|
+
- Do NOT update `.gsd/PROJECT.md` to reflect completion.
|
|
32
|
+
- Do NOT update `.gsd/REQUIREMENTS.md` to mark requirements as validated.
|
|
33
|
+
- Write a clear summary of what failed and why to help the next attempt.
|
|
34
|
+
- Say: "Milestone {{milestoneId}} verification FAILED — not complete." and stop.
|
|
35
|
+
|
|
36
|
+
**Success path** (all verifications passed — continue with steps 7–11):
|
|
37
|
+
|
|
38
|
+
7. **Persist completion through `gsd_complete_milestone`.** Call it with: `milestoneId`, `title`, `oneLiner`, `narrative`, `successCriteriaResults`, `definitionOfDoneResults`, `requirementOutcomes`, `keyDecisions`, `keyFiles`, `lessonsLearned`, `followUps`, `deviations`, `verificationPassed: true`. The tool updates the milestone status in the DB, renders `{{milestoneSummaryPath}}`, and validates all slices are complete before proceeding.
|
|
39
|
+
8. For each requirement whose status changed in step 6, call `gsd_requirement_update` with the requirement ID and updated `status` and `validation` fields — the tool regenerates `.gsd/REQUIREMENTS.md` automatically.
|
|
26
40
|
9. Update `.gsd/PROJECT.md` to reflect milestone completion and current project state.
|
|
27
41
|
10. Review all slice summaries for cross-cutting lessons, patterns, or gotchas that emerged during this milestone. Append any non-obvious, reusable insights to `.gsd/KNOWLEDGE.md`.
|
|
28
42
|
11. Do not commit manually — the system auto-commits your changes after this unit completes.
|
|
43
|
+
- Say: "Milestone {{milestoneId}} complete."
|
|
29
44
|
|
|
30
|
-
**Important:** Do NOT skip the code change verification, success criteria, or definition of done verification (steps 3-5). The milestone summary must reflect actual verified outcomes, not assumed success.
|
|
45
|
+
**Important:** Do NOT skip the code change verification, success criteria, or definition of done verification (steps 3-5). The milestone summary must reflect actual verified outcomes, not assumed success. Verification failures BLOCK completion — there is no override. The milestone stays in its current state until issues are resolved and verification is re-run.
|
|
31
46
|
|
|
32
47
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
33
|
-
|
|
34
|
-
When done, say: "Milestone {{milestoneId}} complete."
|
|
@@ -23,28 +23,15 @@ Then:
|
|
|
23
23
|
2. {{skillActivation}}
|
|
24
24
|
3. Run all slice-level verification checks defined in the slice plan. All must pass before marking the slice done. If any fail, fix them first.
|
|
25
25
|
4. If the slice plan includes observability/diagnostic surfaces, confirm they work. Skip this for simple slices that don't have observability sections.
|
|
26
|
-
5. If
|
|
27
|
-
6.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
**Patterns & decisions:** `keyDecisions` (array of decision strings), `patternsEstablished` (array), `observabilitySurfaces` (array)
|
|
38
|
-
|
|
39
|
-
**Dependencies:** `provides` (what this slice provides downstream), `affects` (downstream slice IDs affected), `requires` (array of `{slice, provides}` for upstream dependencies consumed), `drillDownPaths` (paths to task summaries)
|
|
40
|
-
|
|
41
|
-
**UAT content:** `uatContent` — the UAT markdown body. This must be a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built. The tool writes it to `{{sliceUatPath}}`.
|
|
42
|
-
|
|
43
|
-
7. Review task summaries for `key_decisions`. Append any significant decisions to `.gsd/DECISIONS.md` if missing.
|
|
44
|
-
8. Review task summaries for patterns, gotchas, or non-obvious lessons learned. If any would save future agents from repeating investigation or hitting the same issues, append them to `.gsd/KNOWLEDGE.md`. Only add entries that are genuinely useful — don't pad with obvious observations.
|
|
45
|
-
9. Do not run git commands — the system commits your changes and handles any merge after this unit succeeds.
|
|
46
|
-
10. Update `.gsd/PROJECT.md` if it exists — refresh current state if needed.
|
|
47
|
-
|
|
48
|
-
**You MUST call `gsd_slice_complete` before finishing.** The tool handles writing `{{sliceSummaryPath}}`, `{{sliceUatPath}}`, and updating `{{roadmapPath}}` atomically. You must still review decisions and knowledge manually (steps 7-8).
|
|
26
|
+
5. If this slice produced evidence that a requirement changed status (Active → Validated, Active → Deferred, etc.), call `gsd_save_decision` with scope="requirement", decision="{requirement-id}", choice="{new-status}", rationale="{evidence}". Do NOT write `.gsd/REQUIREMENTS.md` directly — the engine renders it from the database.
|
|
27
|
+
6. Write `{{sliceSummaryPath}}` (compress all task summaries).
|
|
28
|
+
7. Write `{{sliceUatPath}}` — a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built.
|
|
29
|
+
8. Review task summaries for `key_decisions`. Append any significant decisions to `.gsd/DECISIONS.md` if missing.
|
|
30
|
+
9. Review task summaries for patterns, gotchas, or non-obvious lessons learned. If any would save future agents from repeating investigation or hitting the same issues, append them to `.gsd/KNOWLEDGE.md`. Only add entries that are genuinely useful — don't pad with obvious observations.
|
|
31
|
+
10. Call `gsd_complete_slice` with milestone_id, slice_id, the slice summary, and the UAT result. Do NOT manually mark the roadmap checkbox — the tool writes to the DB and renders the ROADMAP.md projection automatically.
|
|
32
|
+
11. Do not run git commands — the system commits your changes and handles any merge after this unit succeeds.
|
|
33
|
+
12. Update `.gsd/PROJECT.md` if it exists — refresh current state if needed.
|
|
34
|
+
|
|
35
|
+
**You MUST do ALL THREE before finishing: (1) write `{{sliceSummaryPath}}`, (2) write `{{sliceUatPath}}`, (3) call `gsd_complete_slice`. The unit will not be marked complete if any of these are missing.**
|
|
49
36
|
|
|
50
37
|
When done, say: "Slice {{sliceId}} complete."
|
|
@@ -203,7 +203,7 @@ When writing context.md, preserve the user's exact terminology, emphasis, and sp
|
|
|
203
203
|
|
|
204
204
|
4. Write `{{contextPath}}` — use the **Context** output template below. Preserve key risks, unknowns, existing codebase constraints, integration points, and relevant requirements surfaced during discussion.
|
|
205
205
|
5. Call `gsd_plan_milestone` to create the roadmap. Decompose into demoable vertical slices with risk, depends, demo sentences, proof strategy, verification classes, milestone definition of done, requirement coverage, and a boundary map. If the milestone crosses multiple runtime boundaries, include an explicit final integration slice that proves the assembled system works end-to-end in a real environment. Use the **Roadmap** output template below to structure the tool call parameters.
|
|
206
|
-
6.
|
|
206
|
+
6. For each architectural or pattern decision made during discussion, call `gsd_decision_save` — the tool auto-assigns IDs and regenerates `.gsd/DECISIONS.md` automatically.
|
|
207
207
|
7. {{commitInstruction}}
|
|
208
208
|
|
|
209
209
|
After writing the files, say exactly: "Milestone {{milestoneId}} ready." — nothing else. Auto-mode will start automatically.
|
|
@@ -217,7 +217,7 @@ Once the user confirms the milestone split:
|
|
|
217
217
|
1. For each milestone, call `gsd_milestone_generate_id` to get its ID — never invent milestone IDs manually. Then `mkdir -p .gsd/milestones/<ID>/slices`.
|
|
218
218
|
2. Write `.gsd/PROJECT.md` — use the **Project** output template below.
|
|
219
219
|
3. Write `.gsd/REQUIREMENTS.md` — use the **Requirements** output template below. Capture Active, Deferred, Out of Scope, and any already Validated requirements. Later milestones may have provisional ownership where slice plans do not exist yet.
|
|
220
|
-
4.
|
|
220
|
+
4. For any architectural or pattern decisions made during discussion, call `gsd_decision_save` — the tool auto-assigns IDs and regenerates `.gsd/DECISIONS.md` automatically.
|
|
221
221
|
|
|
222
222
|
#### Phase 2: Primary milestone
|
|
223
223
|
|
|
@@ -63,23 +63,13 @@ Then:
|
|
|
63
63
|
11. **Blocker discovery:** If execution reveals that the remaining slice plan is fundamentally invalid — not just a bug or minor deviation, but a plan-invalidating finding like a wrong API, missing capability, or architectural mismatch — set `blocker_discovered: true` in the task summary frontmatter and describe the blocker clearly in the summary narrative. Do NOT set `blocker_discovered: true` for ordinary debugging, minor deviations, or issues that can be fixed within the current task or the remaining plan. This flag triggers an automatic replan of the slice.
|
|
64
64
|
12. If you made an architectural, pattern, library, or observability decision during this task that downstream work should know about, append it to `.gsd/DECISIONS.md` (read the template at `~/.gsd/agent/extensions/gsd/templates/decisions.md` if the file doesn't exist yet). Not every task produces decisions — only append when a meaningful choice was made.
|
|
65
65
|
13. If you discover a non-obvious rule, recurring gotcha, or useful pattern during execution, append it to `.gsd/KNOWLEDGE.md`. Only add entries that would save future agents from repeating your investigation. Don't add obvious things.
|
|
66
|
-
14.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
- `oneLiner`: One-line summary of what was accomplished (becomes the commit message)
|
|
71
|
-
- `narrative`: Detailed narrative of what happened during the task
|
|
72
|
-
- `verification`: What was verified and how — commands run, tests passed, behavior confirmed
|
|
73
|
-
- `deviations`: Deviations from the task plan, or "None."
|
|
74
|
-
- `knownIssues`: Known issues discovered but not fixed, or "None."
|
|
75
|
-
- `keyFiles`: Array of key files created or modified
|
|
76
|
-
- `keyDecisions`: Array of key decisions made during this task
|
|
77
|
-
- `blockerDiscovered`: Whether a plan-invalidating blocker was discovered (boolean)
|
|
78
|
-
- `verificationEvidence`: Array of `{ command, exitCode, verdict, durationMs }` objects from the verification gate
|
|
79
|
-
15. Do not run git commands — the system reads your task summary after completion and creates a meaningful commit from it (type inferred from title, message from your one-liner, key files from frontmatter). Write a clear, specific one-liner in the summary — it becomes the commit message.
|
|
66
|
+
14. Read the template at `~/.gsd/agent/extensions/gsd/templates/task-summary.md`
|
|
67
|
+
15. Write `{{taskSummaryPath}}`
|
|
68
|
+
16. Call `gsd_complete_task` with milestone_id, slice_id, task_id, and a summary of what was accomplished. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, and renders PLAN.md automatically.
|
|
69
|
+
17. Do not run git commands — the system reads your task summary after completion and creates a meaningful commit from it (type inferred from title, message from your one-liner, key files from frontmatter). Write a clear, specific one-liner in the summary — it becomes the commit message.
|
|
80
70
|
|
|
81
71
|
All work stays in your working directory: `{{workingDirectory}}`.
|
|
82
72
|
|
|
83
|
-
**You MUST call `
|
|
73
|
+
**You MUST call `gsd_complete_task` AND write `{{taskSummaryPath}}` before finishing.**
|
|
84
74
|
|
|
85
75
|
When done, say: "Task {{taskId}} complete."
|