gsd-pi 2.44.0-dev.d25d507 → 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/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 +23 -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/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-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 +8 -4
- 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 +14 -14
- 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/react-loadable-manifest.json +2 -2
- 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 +1 -1
- 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 +2 -2
- 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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.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_client-reference-manifest.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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- 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/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/{page-b9367c5ae13b99c6.js → page-6654a8cca61a3d1c.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
- 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/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/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/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/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/package.json +1 -1
- 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/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/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/settings-manager.ts +9 -0
- 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/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 +26 -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/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-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 +7 -3
- 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/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/auto-pr-bugs.test.ts +88 -0
- 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/completed-units-metrics-sync.test.ts +114 -0
- 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/db-writer.test.ts +79 -0
- 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 +60 -0
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- 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/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/integration-proof.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- 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 +66 -0
- 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 +26 -21
- 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/session-lock-regression.test.ts +1 -4
- 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/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
- 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/worktree-submodule-safety.test.ts +65 -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 +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/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{tokoGmfkYfWf1_Yl_Gz7i → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tokoGmfkYfWf1_Yl_Gz7i → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -13,14 +13,12 @@
|
|
|
13
13
|
import { deriveState } from "./state.js";
|
|
14
14
|
import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
|
|
15
15
|
import { loadPrompt } from "./prompt-loader.js";
|
|
16
|
-
import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName,
|
|
16
|
+
import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, } from "./paths.js";
|
|
17
17
|
import { invalidateAllCaches } from "./cache.js";
|
|
18
18
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
19
19
|
import { autoCommitCurrentBranch, } from "./worktree.js";
|
|
20
20
|
import { verifyExpectedArtifact, resolveExpectedArtifactPath, } from "./auto-recovery.js";
|
|
21
|
-
import {
|
|
22
|
-
import { runGSDDoctor, rebuildState, summarizeDoctorIssues } from "./doctor.js";
|
|
23
|
-
import { recordHealthSnapshot, checkHealEscalation } from "./doctor-proactive.js";
|
|
21
|
+
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
24
22
|
import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
|
|
25
23
|
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
|
|
26
24
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
@@ -30,7 +28,6 @@ import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
|
30
28
|
import { debugLog } from "./debug-logger.js";
|
|
31
29
|
import { existsSync, unlinkSync } from "node:fs";
|
|
32
30
|
import { join } from "node:path";
|
|
33
|
-
import { atomicWriteSync } from "./atomic-write.js";
|
|
34
31
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
35
32
|
/**
|
|
36
33
|
* Detect summary files written directly to disk without the LLM calling
|
|
@@ -137,8 +134,6 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
|
|
|
137
134
|
}
|
|
138
135
|
return rogues;
|
|
139
136
|
}
|
|
140
|
-
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
141
|
-
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
142
137
|
/**
|
|
143
138
|
* Pre-verification processing: parallel worker signal check, cache invalidation,
|
|
144
139
|
* auto-commit, doctor run, state rebuild, worktree sync, artifact verification.
|
|
@@ -232,74 +227,6 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
232
227
|
catch (e) {
|
|
233
228
|
debugLog("postUnit", { phase: "github-sync", error: String(e) });
|
|
234
229
|
}
|
|
235
|
-
// Doctor: fix mechanical bookkeeping (skipped for lightweight sidecars)
|
|
236
|
-
if (!opts?.skipDoctor)
|
|
237
|
-
try {
|
|
238
|
-
const scopeParts = s.currentUnit.id.split("/").slice(0, 2);
|
|
239
|
-
const doctorScope = scopeParts.join("/");
|
|
240
|
-
const sliceTerminalUnits = new Set(["complete-slice", "run-uat"]);
|
|
241
|
-
const effectiveFixLevel = sliceTerminalUnits.has(s.currentUnit.type) ? "all" : "task";
|
|
242
|
-
const report = await runGSDDoctor(s.basePath, { fix: true, scope: doctorScope, fixLevel: effectiveFixLevel });
|
|
243
|
-
// Human-readable fix notification with details
|
|
244
|
-
if (report.fixesApplied.length > 0) {
|
|
245
|
-
const fixSummary = report.fixesApplied.length <= 2
|
|
246
|
-
? report.fixesApplied.join("; ")
|
|
247
|
-
: `${report.fixesApplied[0]}; +${report.fixesApplied.length - 1} more`;
|
|
248
|
-
ctx.ui.notify(`Doctor: ${fixSummary}`, "info");
|
|
249
|
-
}
|
|
250
|
-
// Proactive health tracking — filter to current milestone to avoid
|
|
251
|
-
// cross-milestone stale errors inflating the escalation counter
|
|
252
|
-
const currentMilestoneId = s.currentUnit.id.split("/")[0];
|
|
253
|
-
const milestoneIssues = currentMilestoneId
|
|
254
|
-
? report.issues.filter(i => i.unitId === currentMilestoneId ||
|
|
255
|
-
i.unitId.startsWith(`${currentMilestoneId}/`))
|
|
256
|
-
: report.issues;
|
|
257
|
-
const summary = summarizeDoctorIssues(milestoneIssues);
|
|
258
|
-
// Pass issue details + scope for real-time visibility in the progress widget
|
|
259
|
-
const issueDetails = milestoneIssues
|
|
260
|
-
.filter(i => i.severity === "error" || i.severity === "warning")
|
|
261
|
-
.map(i => ({ code: i.code, message: i.message, severity: i.severity, unitId: i.unitId }));
|
|
262
|
-
recordHealthSnapshot(summary.errors, summary.warnings, report.fixesApplied.length, issueDetails, report.fixesApplied, doctorScope);
|
|
263
|
-
// Check if we should escalate to LLM-assisted heal
|
|
264
|
-
if (summary.errors > 0) {
|
|
265
|
-
const unresolvedErrors = milestoneIssues
|
|
266
|
-
.filter(i => i.severity === "error" && !i.fixable)
|
|
267
|
-
.map(i => ({ code: i.code, message: i.message, unitId: i.unitId }));
|
|
268
|
-
const escalation = checkHealEscalation(summary.errors, unresolvedErrors);
|
|
269
|
-
if (escalation.shouldEscalate) {
|
|
270
|
-
ctx.ui.notify(`Doctor heal escalation: ${escalation.reason}. Dispatching LLM-assisted heal.`, "warning");
|
|
271
|
-
try {
|
|
272
|
-
const { formatDoctorIssuesForPrompt, formatDoctorReport } = await import("./doctor.js");
|
|
273
|
-
const { dispatchDoctorHeal } = await import("./commands-handlers.js");
|
|
274
|
-
const actionable = report.issues.filter(i => i.severity === "error");
|
|
275
|
-
const reportText = formatDoctorReport(report, { scope: doctorScope, includeWarnings: true });
|
|
276
|
-
const structuredIssues = formatDoctorIssuesForPrompt(actionable);
|
|
277
|
-
dispatchDoctorHeal(pi, doctorScope, reportText, structuredIssues);
|
|
278
|
-
return "dispatched";
|
|
279
|
-
}
|
|
280
|
-
catch (e) {
|
|
281
|
-
debugLog("postUnit", { phase: "doctor-heal-dispatch", error: String(e) });
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
catch (e) {
|
|
287
|
-
debugLog("postUnit", { phase: "doctor", error: String(e) });
|
|
288
|
-
}
|
|
289
|
-
// Throttled STATE.md rebuild (skipped for lightweight sidecars)
|
|
290
|
-
if (!opts?.skipStateRebuild) {
|
|
291
|
-
const now = Date.now();
|
|
292
|
-
if (now - s.lastStateRebuildAt >= STATE_REBUILD_MIN_INTERVAL_MS) {
|
|
293
|
-
try {
|
|
294
|
-
await rebuildState(s.basePath);
|
|
295
|
-
s.lastStateRebuildAt = now;
|
|
296
|
-
autoCommitCurrentBranch(s.basePath, "state-rebuild", s.currentUnit.id);
|
|
297
|
-
}
|
|
298
|
-
catch (e) {
|
|
299
|
-
debugLog("postUnit", { phase: "state-rebuild", error: String(e) });
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
230
|
// Prune dead bg-shell processes
|
|
304
231
|
try {
|
|
305
232
|
const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
|
|
@@ -411,6 +338,27 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
411
338
|
catch (e) {
|
|
412
339
|
debugLog("postUnit", { phase: "artifact-verify", error: String(e) });
|
|
413
340
|
}
|
|
341
|
+
// If verification failed, attempt to regenerate missing projection files
|
|
342
|
+
// from DB data before giving up (e.g. research-slice produces PLAN from engine).
|
|
343
|
+
if (!triggerArtifactVerified) {
|
|
344
|
+
try {
|
|
345
|
+
const parts = s.currentUnit.id.split("/");
|
|
346
|
+
const [mid, sid] = parts;
|
|
347
|
+
if (mid && sid) {
|
|
348
|
+
const regenerated = regenerateIfMissing(s.basePath, mid, sid, "PLAN");
|
|
349
|
+
if (regenerated) {
|
|
350
|
+
// Re-check after regeneration
|
|
351
|
+
triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
352
|
+
if (triggerArtifactVerified) {
|
|
353
|
+
invalidateAllCaches();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
debugLog("postUnit", { phase: "regenerate-projection", error: String(e) });
|
|
360
|
+
}
|
|
361
|
+
}
|
|
414
362
|
// When artifact verification fails for a unit type that has a known expected
|
|
415
363
|
// artifact, return "retry" so the caller re-dispatches with failure context
|
|
416
364
|
// instead of blindly re-dispatching the same unit (#1571).
|
|
@@ -432,18 +380,7 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
432
380
|
}
|
|
433
381
|
}
|
|
434
382
|
else {
|
|
435
|
-
// Hook unit completed —
|
|
436
|
-
try {
|
|
437
|
-
writeUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, {
|
|
438
|
-
phase: "finalized",
|
|
439
|
-
progressCount: 1,
|
|
440
|
-
lastProgressKind: "hook-completed",
|
|
441
|
-
});
|
|
442
|
-
clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
|
|
443
|
-
}
|
|
444
|
-
catch (e) {
|
|
445
|
-
debugLog("postUnit", { phase: "hook-finalize", error: String(e) });
|
|
446
|
-
}
|
|
383
|
+
// Hook unit completed — no additional processing needed
|
|
447
384
|
}
|
|
448
385
|
}
|
|
449
386
|
return "continue";
|
|
@@ -517,15 +454,7 @@ export async function postUnitPostVerification(pctx) {
|
|
|
517
454
|
}
|
|
518
455
|
}
|
|
519
456
|
}
|
|
520
|
-
// 3.
|
|
521
|
-
s.completedUnits = s.completedUnits.filter(u => !(u.type === trigger.unitType && u.id === trigger.unitId));
|
|
522
|
-
try {
|
|
523
|
-
const completedKeysPath = join(gsdRoot(s.basePath), "completed-units.json");
|
|
524
|
-
const keys = s.completedUnits.map(u => `${u.type}/${u.id}`);
|
|
525
|
-
atomicWriteSync(completedKeysPath, JSON.stringify(keys, null, 2));
|
|
526
|
-
}
|
|
527
|
-
catch { /* non-fatal: disk flush failure */ }
|
|
528
|
-
// 4. Delete the retry_on artifact (e.g. NEEDS-REWORK.md)
|
|
457
|
+
// 3. Delete the retry_on artifact (e.g. NEEDS-REWORK.md)
|
|
529
458
|
if (trigger.retryArtifact) {
|
|
530
459
|
const retryArtifactPath = resolveHookArtifactPath(s.basePath, trigger.unitId, trigger.retryArtifact);
|
|
531
460
|
if (existsSync(retryArtifactPath)) {
|
|
@@ -1156,6 +1156,12 @@ export async function buildCompleteMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1156
1156
|
roadmapPath: roadmapRel,
|
|
1157
1157
|
inlinedContext,
|
|
1158
1158
|
milestoneSummaryPath,
|
|
1159
|
+
skillActivation: buildSkillActivationBlock({
|
|
1160
|
+
base,
|
|
1161
|
+
milestoneId: mid,
|
|
1162
|
+
milestoneTitle: midTitle,
|
|
1163
|
+
extraContext: [inlinedContext],
|
|
1164
|
+
}),
|
|
1159
1165
|
});
|
|
1160
1166
|
}
|
|
1161
1167
|
export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
@@ -1236,6 +1242,12 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
1236
1242
|
inlinedContext,
|
|
1237
1243
|
validationPath: validationOutputPath,
|
|
1238
1244
|
remediationRound: String(remediationRound),
|
|
1245
|
+
skillActivation: buildSkillActivationBlock({
|
|
1246
|
+
base,
|
|
1247
|
+
milestoneId: mid,
|
|
1248
|
+
milestoneTitle: midTitle,
|
|
1249
|
+
extraContext: [inlinedContext],
|
|
1250
|
+
}),
|
|
1239
1251
|
});
|
|
1240
1252
|
}
|
|
1241
1253
|
export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
|
|
@@ -1332,6 +1344,12 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
|
|
|
1332
1344
|
uatResultPath,
|
|
1333
1345
|
uatType,
|
|
1334
1346
|
inlinedContext,
|
|
1347
|
+
skillActivation: buildSkillActivationBlock({
|
|
1348
|
+
base,
|
|
1349
|
+
milestoneId: mid,
|
|
1350
|
+
sliceId,
|
|
1351
|
+
extraContext: [inlinedContext],
|
|
1352
|
+
}),
|
|
1335
1353
|
});
|
|
1336
1354
|
}
|
|
1337
1355
|
export async function buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base, level) {
|
|
@@ -1378,11 +1396,16 @@ export async function buildReassessRoadmapPrompt(mid, midTitle, completedSliceId
|
|
|
1378
1396
|
milestoneTitle: midTitle,
|
|
1379
1397
|
completedSliceId,
|
|
1380
1398
|
roadmapPath: roadmapRel,
|
|
1381
|
-
completedSliceSummaryPath: summaryRel,
|
|
1382
1399
|
assessmentPath,
|
|
1383
1400
|
inlinedContext,
|
|
1384
1401
|
deferredCaptures,
|
|
1385
1402
|
commitInstruction: reassessCommitInstruction,
|
|
1403
|
+
skillActivation: buildSkillActivationBlock({
|
|
1404
|
+
base,
|
|
1405
|
+
milestoneId: mid,
|
|
1406
|
+
milestoneTitle: midTitle,
|
|
1407
|
+
extraContext: [inlinedContext, deferredCaptures],
|
|
1408
|
+
}),
|
|
1386
1409
|
});
|
|
1387
1410
|
}
|
|
1388
1411
|
// ─── Reactive Execute Prompt ──────────────────────────────────────────────
|
|
@@ -197,10 +197,13 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
197
197
|
state = await deriveState(wtPath);
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
// Milestone branch recovery (#601)
|
|
200
|
+
// Milestone branch recovery (#601, #2358)
|
|
201
|
+
// Detect survivor milestone branches in both pre-planning and complete phases.
|
|
202
|
+
// In phase=complete, the milestone artifacts exist but finalization (merge,
|
|
203
|
+
// worktree cleanup) was never run — the survivor branch must be merged.
|
|
201
204
|
let hasSurvivorBranch = false;
|
|
202
205
|
if (state.activeMilestone &&
|
|
203
|
-
state.phase === "pre-planning" &&
|
|
206
|
+
(state.phase === "pre-planning" || state.phase === "complete") &&
|
|
204
207
|
shouldUseWorktreeIsolation() &&
|
|
205
208
|
!detectWorktreeName(base) &&
|
|
206
209
|
!base.includes(`${pathSep}.gsd${pathSep}worktrees${pathSep}`)) {
|
|
@@ -231,6 +234,22 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
231
234
|
return releaseLockAndReturn();
|
|
232
235
|
}
|
|
233
236
|
}
|
|
237
|
+
// Survivor branch exists and milestone is complete (#2358):
|
|
238
|
+
// The milestone artifacts were written but finalization (merge, worktree
|
|
239
|
+
// cleanup) never ran. Run mergeAndExit to finalize, then re-derive state
|
|
240
|
+
// so the normal "all milestones complete" or "next milestone" path runs.
|
|
241
|
+
if (hasSurvivorBranch && state.phase === "complete") {
|
|
242
|
+
const mid = state.activeMilestone.id;
|
|
243
|
+
ctx.ui.notify(`Milestone ${mid} is complete but branch/worktree was not finalized. Running merge now.`, "info");
|
|
244
|
+
const resolver = buildResolver();
|
|
245
|
+
resolver.mergeAndExit(mid, {
|
|
246
|
+
notify: ctx.ui.notify.bind(ctx.ui),
|
|
247
|
+
});
|
|
248
|
+
invalidateAllCaches();
|
|
249
|
+
state = await deriveState(base);
|
|
250
|
+
// Clear survivor flag — finalization is done
|
|
251
|
+
hasSurvivorBranch = false;
|
|
252
|
+
}
|
|
234
253
|
if (!hasSurvivorBranch) {
|
|
235
254
|
// No active work — start a new milestone via discuss flow
|
|
236
255
|
if (!state.activeMilestone || state.phase === "complete") {
|
|
@@ -333,7 +352,6 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
333
352
|
});
|
|
334
353
|
s.autoStartTime = Date.now();
|
|
335
354
|
s.resourceVersionOnStart = readResourceVersion();
|
|
336
|
-
s.completedUnits = [];
|
|
337
355
|
s.pendingQuickTasks = [];
|
|
338
356
|
s.currentUnit = null;
|
|
339
357
|
s.currentMilestoneId = state.activeMilestone?.id ?? null;
|
|
@@ -436,8 +454,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
436
454
|
? `Will loop through ${pendingCount} milestones.`
|
|
437
455
|
: "Will loop until milestone complete.";
|
|
438
456
|
ctx.ui.notify(`${modeLabel} started. ${scopeMsg}`, "info");
|
|
439
|
-
updateSessionLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown"
|
|
440
|
-
writeLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown"
|
|
457
|
+
updateSessionLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown");
|
|
458
|
+
writeLock(lockBase(), "starting", s.currentMilestoneId ?? "unknown");
|
|
441
459
|
// Secrets collection gate
|
|
442
460
|
const mid = state.activeMilestone.id;
|
|
443
461
|
try {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* via startUnitSupervision() and torn down by the caller via clearUnitTimeout().
|
|
7
7
|
*/
|
|
8
8
|
import { readUnitRuntimeRecord, writeUnitRuntimeRecord } from "./unit-runtime.js";
|
|
9
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
9
10
|
import { resolveAutoSupervisorConfig } from "./preferences.js";
|
|
10
11
|
import { computeBudgets, resolveExecutorContextWindow } from "./context-budget.js";
|
|
11
12
|
import { getInFlightToolCount, getOldestInFlightToolStart, } from "./auto-tool-tracking.js";
|
|
@@ -21,12 +22,65 @@ import { resolveAgentEndCancelled } from "./auto/resolve.js";
|
|
|
21
22
|
* 3. Hard timeout (pause + recovery)
|
|
22
23
|
* 4. Context-pressure monitor (continue-here)
|
|
23
24
|
*/
|
|
25
|
+
/**
|
|
26
|
+
* Parse a task estimate string (e.g. "30m", "2h", "1h30m") into minutes.
|
|
27
|
+
* Returns null if the string cannot be parsed.
|
|
28
|
+
*/
|
|
29
|
+
export function parseEstimateMinutes(estimate) {
|
|
30
|
+
if (!estimate || typeof estimate !== "string")
|
|
31
|
+
return null;
|
|
32
|
+
const trimmed = estimate.trim();
|
|
33
|
+
if (!trimmed)
|
|
34
|
+
return null;
|
|
35
|
+
let totalMinutes = 0;
|
|
36
|
+
let matched = false;
|
|
37
|
+
// Match hours component
|
|
38
|
+
const hoursMatch = trimmed.match(/(\d+)\s*h/i);
|
|
39
|
+
if (hoursMatch) {
|
|
40
|
+
totalMinutes += Number(hoursMatch[1]) * 60;
|
|
41
|
+
matched = true;
|
|
42
|
+
}
|
|
43
|
+
// Match minutes component
|
|
44
|
+
const minutesMatch = trimmed.match(/(\d+)\s*m/i);
|
|
45
|
+
if (minutesMatch) {
|
|
46
|
+
totalMinutes += Number(minutesMatch[1]);
|
|
47
|
+
matched = true;
|
|
48
|
+
}
|
|
49
|
+
return matched ? totalMinutes : null;
|
|
50
|
+
}
|
|
24
51
|
export function startUnitSupervision(sctx) {
|
|
25
52
|
const { s, ctx, pi, unitType, unitId, prefs, buildSnapshotOpts, buildRecoveryContext, pauseAuto } = sctx;
|
|
26
53
|
const supervisor = resolveAutoSupervisorConfig();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
54
|
+
// Scale timeouts based on task estimate annotations (#2243).
|
|
55
|
+
// If the task has an est: annotation, use it to extend the hard and soft timeouts
|
|
56
|
+
// so longer tasks don't get prematurely timed out.
|
|
57
|
+
let taskEstimate = sctx.taskEstimate;
|
|
58
|
+
if (!taskEstimate && unitType === "task" && isDbAvailable()) {
|
|
59
|
+
// Look up the task estimate from the DB (#2243).
|
|
60
|
+
try {
|
|
61
|
+
if (s.currentMilestoneId) {
|
|
62
|
+
const slices = getMilestoneSlices(s.currentMilestoneId);
|
|
63
|
+
for (const slice of slices) {
|
|
64
|
+
const tasks = getSliceTasks(s.currentMilestoneId, slice.id);
|
|
65
|
+
const task = tasks.find(t => t.id === unitId);
|
|
66
|
+
if (task?.estimate) {
|
|
67
|
+
taskEstimate = task.estimate;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Non-fatal — fall through with no estimate
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const estimateMinutes = taskEstimate ? parseEstimateMinutes(taskEstimate) : null;
|
|
78
|
+
const timeoutScale = estimateMinutes && estimateMinutes > 0
|
|
79
|
+
? Math.max(1, estimateMinutes / 10) // 10min task = 1x, 30min = 3x, 2h = 12x
|
|
80
|
+
: 1;
|
|
81
|
+
const softTimeoutMs = (supervisor.soft_timeout_minutes ?? 0) * 60 * 1000 * timeoutScale;
|
|
82
|
+
const idleTimeoutMs = (supervisor.idle_timeout_minutes ?? 0) * 60 * 1000; // idle not scaled — idle is idle
|
|
83
|
+
const hardTimeoutMs = (supervisor.hard_timeout_minutes ?? 0) * 60 * 1000 * timeoutScale;
|
|
30
84
|
// ── 1. Soft timeout warning ──
|
|
31
85
|
s.wrapupWarningHandle = setTimeout(() => {
|
|
32
86
|
s.wrapupWarningHandle = null;
|
|
@@ -63,6 +63,10 @@ export function syncStateToProjectRoot(worktreePath, projectRoot, milestoneId) {
|
|
|
63
63
|
// 2. Milestone directory — ROADMAP, slice PLANs, task summaries
|
|
64
64
|
// Copy the entire milestone .gsd subtree so deriveState reads current checkboxes
|
|
65
65
|
safeCopyRecursive(join(wtGsd, "milestones", milestoneId), join(prGsd, "milestones", milestoneId), { force: true });
|
|
66
|
+
// 3. metrics.json — session cost/token tracking (#2313).
|
|
67
|
+
// Without this, metrics accumulated in the worktree are invisible from the
|
|
68
|
+
// project root and never appear in the dashboard or skill-health reports.
|
|
69
|
+
safeCopy(join(wtGsd, "metrics.json"), join(prGsd, "metrics.json"), { force: true });
|
|
66
70
|
// 4. Runtime records — unit dispatch state used by selfHealRuntimeRecords().
|
|
67
71
|
// Without this, a crash during a unit leaves the runtime record only in the
|
|
68
72
|
// worktree. If the next session resolves basePath before worktree re-entry,
|
|
@@ -17,6 +17,7 @@ import { createWorktree, removeWorktree, resolveGitDir, worktreePath, } from "./
|
|
|
17
17
|
import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
|
|
18
18
|
import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
19
19
|
import { debugLog } from "./debug-logger.js";
|
|
20
|
+
import { logWarning } from "./workflow-logger.js";
|
|
20
21
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
21
22
|
import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeWorkingTreeStatus, nativeAddAllWithExclusions, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, nativeDiffNumstat, nativeUpdateRef, nativeIsAncestor, } from "./native-git-bridge.js";
|
|
22
23
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
@@ -109,6 +110,7 @@ export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
|
|
|
109
110
|
"OVERRIDES.md",
|
|
110
111
|
"QUEUE.md",
|
|
111
112
|
"completed-units.json",
|
|
113
|
+
"metrics.json",
|
|
112
114
|
];
|
|
113
115
|
for (const f of rootFiles) {
|
|
114
116
|
const src = join(mainGsd, f);
|
|
@@ -269,8 +271,9 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
|
269
271
|
// ── 1. Sync root-level .gsd/ files back ──────────────────────────────
|
|
270
272
|
// The worktree is authoritative — complete-milestone updates REQUIREMENTS,
|
|
271
273
|
// PROJECT, etc. These must overwrite main's copies so they survive teardown.
|
|
272
|
-
// Also includes QUEUE.md
|
|
273
|
-
// milestone closeout and lost on teardown without explicit sync
|
|
274
|
+
// Also includes QUEUE.md, completed-units.json, and metrics.json which are
|
|
275
|
+
// written during milestone closeout and lost on teardown without explicit sync
|
|
276
|
+
// (#1787, #2313).
|
|
274
277
|
const rootFiles = [
|
|
275
278
|
"DECISIONS.md",
|
|
276
279
|
"REQUIREMENTS.md",
|
|
@@ -279,6 +282,7 @@ export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
|
279
282
|
"OVERRIDES.md",
|
|
280
283
|
"QUEUE.md",
|
|
281
284
|
"completed-units.json",
|
|
285
|
+
"metrics.json",
|
|
282
286
|
];
|
|
283
287
|
for (const f of rootFiles) {
|
|
284
288
|
const src = join(wtGsd, f);
|
|
@@ -612,7 +616,7 @@ export function createAutoWorktree(basePath, milestoneId) {
|
|
|
612
616
|
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
613
617
|
if (hookError) {
|
|
614
618
|
// Non-fatal — log but don't prevent worktree usage
|
|
615
|
-
|
|
619
|
+
logWarning("reconcile", hookError, { worktree: info.name });
|
|
616
620
|
}
|
|
617
621
|
const previousCwd = process.cwd();
|
|
618
622
|
try {
|
|
@@ -687,9 +691,9 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
687
691
|
// backslashes (#1436), leaving ~1 GB+ orphaned directories.
|
|
688
692
|
const wtDir = worktreePath(originalBasePath, milestoneId);
|
|
689
693
|
if (existsSync(wtDir)) {
|
|
690
|
-
|
|
691
|
-
`
|
|
692
|
-
`
|
|
694
|
+
logWarning("reconcile", `Worktree directory still exists after teardown: ${wtDir}. ` +
|
|
695
|
+
`This is likely an orphaned directory consuming disk space. ` +
|
|
696
|
+
`Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`, { worktree: milestoneId });
|
|
693
697
|
// Attempt a direct filesystem removal as a fallback
|
|
694
698
|
try {
|
|
695
699
|
rmSync(wtDir, { recursive: true, force: true });
|
|
@@ -1133,9 +1137,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1133
1137
|
// Push failure is non-fatal
|
|
1134
1138
|
}
|
|
1135
1139
|
}
|
|
1136
|
-
// 9b. Auto-create PR if enabled (
|
|
1140
|
+
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
1137
1141
|
let prCreated = false;
|
|
1138
|
-
if (prefs.auto_pr === true &&
|
|
1142
|
+
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
1139
1143
|
const remote = prefs.remote ?? "origin";
|
|
1140
1144
|
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
1141
1145
|
try {
|
|
@@ -1145,9 +1149,9 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1145
1149
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1146
1150
|
encoding: "utf-8",
|
|
1147
1151
|
});
|
|
1148
|
-
// Create PR via gh CLI
|
|
1152
|
+
// Create PR via gh CLI with explicit --head and --base (#2302)
|
|
1149
1153
|
execFileSync("gh", [
|
|
1150
|
-
"pr", "create",
|
|
1154
|
+
"pr", "create", "--draft",
|
|
1151
1155
|
"--base", prTarget,
|
|
1152
1156
|
"--head", milestoneBranch,
|
|
1153
1157
|
"--title", `Milestone ${milestoneId} complete`,
|