@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7
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/cli.js +3 -2
- package/dist/help-text.js +10 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
- package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/dist/resources/extensions/browser-tools/index.js +57 -9
- package/dist/resources/extensions/browser-tools/package.json +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
- package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
- package/dist/resources/extensions/gsd/auto/phases.js +4 -3
- package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
- package/dist/resources/extensions/gsd/auto-dispatch.js +55 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +94 -15
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +18 -65
- package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
- package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
- package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +2 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
- package/dist/resources/extensions/gsd/error-classifier.js +2 -1
- package/dist/resources/extensions/gsd/escalation.js +4 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
- package/dist/resources/extensions/gsd/forensics.js +74 -2
- package/dist/resources/extensions/gsd/gsd-db.js +42 -6
- package/dist/resources/extensions/gsd/guided-flow.js +119 -176
- package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
- package/dist/resources/extensions/gsd/memory-store.js +4 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
- package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
- package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
- package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/dist/resources/extensions/gsd/prompts/system.md +3 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
- package/dist/resources/extensions/gsd/rule-registry.js +428 -52
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
- package/dist/resources/extensions/gsd/skill-activation.js +20 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
- package/dist/resources/extensions/gsd/state.js +17 -14
- package/dist/resources/extensions/gsd/templates/plan.md +3 -1
- package/dist/resources/extensions/gsd/tool-contract.js +5 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
- package/dist/resources/extensions/gsd/verification-gate.js +72 -1
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
- package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
- package/dist/resources/extensions/mcp-client/manager.js +31 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
- package/dist/rtk.d.ts +7 -1
- package/dist/rtk.js +27 -11
- package/dist/update-check.d.ts +15 -1
- package/dist/update-check.js +87 -12
- package/dist/update-cmd.d.ts +1 -0
- package/dist/update-cmd.js +53 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +5 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +32 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/index.d.ts +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +1 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
- package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
- package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +23 -9
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +84 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +42 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/api-registry.d.ts +2 -0
- package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/packages/pi-ai/dist/api-registry.js +23 -0
- package/packages/pi-ai/dist/api-registry.js.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +15 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +411 -39
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +504 -153
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/stream.js +6 -6
- package/packages/pi-ai/dist/stream.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -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 +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.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 +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/terminal.d.ts +1 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +8 -4
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
- package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/src/resources/extensions/browser-tools/index.ts +60 -9
- package/src/resources/extensions/browser-tools/package.json +5 -1
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
- package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +5 -3
- package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
- package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
- package/src/resources/extensions/gsd/auto-start.ts +112 -17
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
- package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
- package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
- package/src/resources/extensions/gsd/error-classifier.ts +2 -1
- package/src/resources/extensions/gsd/escalation.ts +4 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
- package/src/resources/extensions/gsd/forensics.ts +99 -5
- package/src/resources/extensions/gsd/gsd-db.ts +46 -8
- package/src/resources/extensions/gsd/guided-flow.ts +215 -217
- package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
- package/src/resources/extensions/gsd/memory-store.ts +4 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
- package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/src/resources/extensions/gsd/prompts/system.md +3 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
- package/src/resources/extensions/gsd/rule-registry.ts +558 -58
- package/src/resources/extensions/gsd/rule-types.ts +2 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
- package/src/resources/extensions/gsd/skill-activation.ts +20 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
- package/src/resources/extensions/gsd/state.ts +18 -14
- package/src/resources/extensions/gsd/templates/plan.md +3 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
- package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
- package/src/resources/extensions/gsd/tool-contract.ts +6 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
- package/src/resources/extensions/gsd/types.ts +69 -5
- package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
- package/src/resources/extensions/gsd/verification-gate.ts +87 -1
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
- package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
- package/src/resources/extensions/mcp-client/manager.ts +33 -1
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
|
@@ -60,12 +60,13 @@ import { getAutoWorktreePath, isInAutoWorktree, checkoutBranchWithStashGuard } f
|
|
|
60
60
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
61
61
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
62
62
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
63
|
+
import { queryJournal } from "./journal.js";
|
|
63
64
|
import { initMetrics } from "./metrics.js";
|
|
64
65
|
import { initRoutingHistory } from "./routing-history.js";
|
|
65
66
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
66
67
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
67
68
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
68
|
-
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
69
|
+
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus, updateMilestoneStatus } from "./gsd-db.js";
|
|
69
70
|
import { isClosedStatus } from "./status-guards.js";
|
|
70
71
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
71
72
|
import { extractVerdict } from "./verdict-parser.js";
|
|
@@ -100,6 +101,7 @@ import {
|
|
|
100
101
|
} from "./preferences-models.js";
|
|
101
102
|
import type { WorktreeLifecycle } from "./worktree-lifecycle.js";
|
|
102
103
|
import { getSessionModelOverride } from "./session-model-override.js";
|
|
104
|
+
import { setAutoActiveStatus } from "./auto-dashboard.js";
|
|
103
105
|
|
|
104
106
|
export interface BootstrapDeps {
|
|
105
107
|
shouldUseWorktreeIsolation: (basePath?: string) => boolean;
|
|
@@ -187,6 +189,40 @@ export function reconcileProjectMilestonesFromDisk(basePath: string): number {
|
|
|
187
189
|
}
|
|
188
190
|
}
|
|
189
191
|
|
|
192
|
+
export function reconcileMergedMilestonesFromJournal(basePath: string): number {
|
|
193
|
+
if (!isDbAvailable()) return 0;
|
|
194
|
+
|
|
195
|
+
const mergedAtByMilestone = new Map<string, string>();
|
|
196
|
+
for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
|
|
197
|
+
const data = entry.data ?? {};
|
|
198
|
+
const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
|
|
199
|
+
if (!milestoneId) continue;
|
|
200
|
+
if (data.conflict === true) continue;
|
|
201
|
+
|
|
202
|
+
const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
|
|
203
|
+
const previous = mergedAtByMilestone.get(milestoneId);
|
|
204
|
+
if (!previous || endedAt > previous) mergedAtByMilestone.set(milestoneId, endedAt);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let closed = 0;
|
|
208
|
+
for (const [milestoneId, completedAt] of mergedAtByMilestone) {
|
|
209
|
+
const existing = getMilestone(milestoneId);
|
|
210
|
+
if (!existing) {
|
|
211
|
+
insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
|
|
212
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
213
|
+
closed++;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!isClosedStatus(existing.status)) {
|
|
217
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
218
|
+
closed++;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (closed > 0) invalidateAllCaches();
|
|
223
|
+
return closed;
|
|
224
|
+
}
|
|
225
|
+
|
|
190
226
|
/**
|
|
191
227
|
* Audit for orphaned milestone branches at bootstrap.
|
|
192
228
|
*
|
|
@@ -258,6 +294,7 @@ export interface OrphanAuditAction {
|
|
|
258
294
|
message: string;
|
|
259
295
|
severity: "info" | "warning";
|
|
260
296
|
branch?: string;
|
|
297
|
+
mainBranch?: string;
|
|
261
298
|
commitsAhead?: number;
|
|
262
299
|
dirtyWorktree?: boolean;
|
|
263
300
|
worktreeDirExists?: boolean;
|
|
@@ -276,6 +313,27 @@ function isBlockingStrandedWorkAction(action: OrphanAuditAction): boolean {
|
|
|
276
313
|
return action.kind === "in-progress-stranded-work" && action.blocksAuto;
|
|
277
314
|
}
|
|
278
315
|
|
|
316
|
+
function strandedWorkEvidence(args: {
|
|
317
|
+
branch?: string;
|
|
318
|
+
commitsAhead: number;
|
|
319
|
+
mainBranch: string;
|
|
320
|
+
dirtyWorktree: boolean;
|
|
321
|
+
}): string[] {
|
|
322
|
+
const evidence: string[] = [];
|
|
323
|
+
if (args.branch && args.commitsAhead > 0) {
|
|
324
|
+
evidence.push(
|
|
325
|
+
`branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
if (args.dirtyWorktree) {
|
|
329
|
+
evidence.push("the worktree has uncommitted changes");
|
|
330
|
+
}
|
|
331
|
+
if (evidence.length === 0) {
|
|
332
|
+
evidence.push("physical git evidence exists");
|
|
333
|
+
}
|
|
334
|
+
return evidence;
|
|
335
|
+
}
|
|
336
|
+
|
|
279
337
|
function detectWorktreeEvidence(
|
|
280
338
|
basePath: string,
|
|
281
339
|
milestoneId: string,
|
|
@@ -307,18 +365,7 @@ function strandedWorkMessage(args: {
|
|
|
307
365
|
worktreeDirExists: boolean;
|
|
308
366
|
recoveryMode: StrandedWorkRecoveryMode;
|
|
309
367
|
}): string {
|
|
310
|
-
const evidence
|
|
311
|
-
if (args.branch && args.commitsAhead > 0) {
|
|
312
|
-
evidence.push(
|
|
313
|
-
`branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
if (args.dirtyWorktree) {
|
|
317
|
-
evidence.push("the worktree has uncommitted changes");
|
|
318
|
-
}
|
|
319
|
-
if (evidence.length === 0) {
|
|
320
|
-
evidence.push("physical git evidence exists");
|
|
321
|
-
}
|
|
368
|
+
const evidence = strandedWorkEvidence(args);
|
|
322
369
|
|
|
323
370
|
const wtSuffix = args.worktreeDirExists
|
|
324
371
|
? ` Worktree directory at .gsd/worktrees/${args.milestoneId}/ holds live work.`
|
|
@@ -334,6 +381,45 @@ function strandedWorkMessage(args: {
|
|
|
334
381
|
);
|
|
335
382
|
}
|
|
336
383
|
|
|
384
|
+
function formatStrandedWorkRecoveryMessage(action: OrphanAuditAction): string {
|
|
385
|
+
const recoveryMode = action.recoveryMode === "worktree"
|
|
386
|
+
? "existing worktree"
|
|
387
|
+
: "milestone branch";
|
|
388
|
+
const evidence = strandedWorkEvidence({
|
|
389
|
+
branch: action.branch,
|
|
390
|
+
commitsAhead: action.commitsAhead ?? 0,
|
|
391
|
+
mainBranch: action.mainBranch ?? "main",
|
|
392
|
+
dirtyWorktree: action.dirtyWorktree ?? false,
|
|
393
|
+
});
|
|
394
|
+
const wtSuffix = action.worktreeDirExists
|
|
395
|
+
? ` Worktree directory at .gsd/worktrees/${action.milestoneId}/ holds live work.`
|
|
396
|
+
: "";
|
|
397
|
+
return (
|
|
398
|
+
`Resuming saved milestone work for ${action.milestoneId}: ${evidence.join("; ")}.` +
|
|
399
|
+
wtSuffix +
|
|
400
|
+
` Adopting the ${recoveryMode} before dispatching new units. Park or discard explicitly if abandoning.`
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
function formatStrandedWorkBlockerMessage(
|
|
405
|
+
action: OrphanAuditAction,
|
|
406
|
+
activeMilestoneId: string | null,
|
|
407
|
+
): string {
|
|
408
|
+
const target = action.milestoneId;
|
|
409
|
+
const mode = action.recoveryMode === "worktree" ? "existing worktree" : "milestone branch";
|
|
410
|
+
const intro = activeMilestoneId
|
|
411
|
+
? `Stranded work for ${target} blocks auto-mode before ${activeMilestoneId}.`
|
|
412
|
+
: `Stranded work for ${target} blocks auto-mode, but that milestone is not active in project state.`;
|
|
413
|
+
|
|
414
|
+
return [
|
|
415
|
+
intro,
|
|
416
|
+
"Choose one explicit next step:",
|
|
417
|
+
`1. Recover it: run \`/gsd auto ${target}\` to adopt the ${mode}.`,
|
|
418
|
+
`2. Defer it: run \`/gsd park ${target} "reason"\`, then rerun \`/gsd auto\`.`,
|
|
419
|
+
`3. Abandon it: run \`/gsd rethink\` and explicitly discard ${target}.`,
|
|
420
|
+
].join("\n");
|
|
421
|
+
}
|
|
422
|
+
|
|
337
423
|
export function auditOrphanedMilestoneBranches(
|
|
338
424
|
basePath: string,
|
|
339
425
|
_isolationMode: "worktree" | "branch" | "none",
|
|
@@ -435,6 +521,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
435
521
|
kind: "in-progress-stranded-work",
|
|
436
522
|
milestoneId,
|
|
437
523
|
branch,
|
|
524
|
+
mainBranch,
|
|
438
525
|
commitsAhead,
|
|
439
526
|
dirtyWorktree: worktreeEvidence.dirty,
|
|
440
527
|
worktreeDirExists: worktreeEvidence.dirExists,
|
|
@@ -589,6 +676,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
589
676
|
pushAction({
|
|
590
677
|
kind: "in-progress-stranded-work",
|
|
591
678
|
milestoneId: m.id,
|
|
679
|
+
mainBranch,
|
|
592
680
|
commitsAhead: 0,
|
|
593
681
|
dirtyWorktree: true,
|
|
594
682
|
worktreeDirExists: worktreeEvidence.dirExists,
|
|
@@ -1066,6 +1154,7 @@ export async function bootstrapAutoSession(
|
|
|
1066
1154
|
await openProjectDbIfPresent(base);
|
|
1067
1155
|
registerAutoWorkerForSession(base);
|
|
1068
1156
|
reconcileProjectMilestonesFromDisk(base);
|
|
1157
|
+
reconcileMergedMilestonesFromJournal(base);
|
|
1069
1158
|
|
|
1070
1159
|
// Clean stale runtime unit files for completed milestones (#887).
|
|
1071
1160
|
// DB-authoritative: when DB is available, require DB status to be closed
|
|
@@ -1103,7 +1192,13 @@ export async function bootstrapAutoSession(
|
|
|
1103
1192
|
for (const msg of auditResult.recovered) {
|
|
1104
1193
|
ctx.ui.notify(`Orphan audit: ${msg}`, "info");
|
|
1105
1194
|
}
|
|
1195
|
+
const deferredStrandedMessages = new Set(
|
|
1196
|
+
auditResult.actions
|
|
1197
|
+
.filter(isBlockingStrandedWorkAction)
|
|
1198
|
+
.map((action) => action.message),
|
|
1199
|
+
);
|
|
1106
1200
|
for (const msg of auditResult.warnings) {
|
|
1201
|
+
if (deferredStrandedMessages.has(msg)) continue;
|
|
1107
1202
|
const prefix = msg.startsWith("Stranded work") ? "" : "Orphan audit: ";
|
|
1108
1203
|
ctx.ui.notify(`${prefix}${msg}`, "warning");
|
|
1109
1204
|
}
|
|
@@ -1177,21 +1272,21 @@ export async function bootstrapAutoSession(
|
|
|
1177
1272
|
if (blockingStrandedRecoveryAction) {
|
|
1178
1273
|
if (!state.activeMilestone) {
|
|
1179
1274
|
ctx.ui.notify(
|
|
1180
|
-
|
|
1275
|
+
formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null),
|
|
1181
1276
|
"error",
|
|
1182
1277
|
);
|
|
1183
1278
|
return releaseLockAndReturn();
|
|
1184
1279
|
}
|
|
1185
1280
|
if (state.activeMilestone.id !== blockingStrandedRecoveryAction.milestoneId) {
|
|
1186
1281
|
ctx.ui.notify(
|
|
1187
|
-
|
|
1282
|
+
formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, state.activeMilestone.id),
|
|
1188
1283
|
"error",
|
|
1189
1284
|
);
|
|
1190
1285
|
return releaseLockAndReturn();
|
|
1191
1286
|
}
|
|
1192
1287
|
strandedRecoveryAction = blockingStrandedRecoveryAction;
|
|
1193
1288
|
ctx.ui.notify(
|
|
1194
|
-
|
|
1289
|
+
formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
|
|
1195
1290
|
"info",
|
|
1196
1291
|
);
|
|
1197
1292
|
}
|
|
@@ -1663,7 +1758,7 @@ export async function bootstrapAutoSession(
|
|
|
1663
1758
|
snapshotSkills();
|
|
1664
1759
|
}
|
|
1665
1760
|
|
|
1666
|
-
ctx
|
|
1761
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
1667
1762
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
1668
1763
|
const modeLabel = s.stepMode ? "Step-mode" : "Auto-mode";
|
|
1669
1764
|
const pendingCount = (state.registry ?? []).filter(
|
|
@@ -94,7 +94,7 @@ export function clearInFlightTools(): void {
|
|
|
94
94
|
* from the tool handler. When these errors occur, retrying the same unit will
|
|
95
95
|
* produce the same failure, so the retry loop must be broken.
|
|
96
96
|
*/
|
|
97
|
-
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
97
|
+
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
98
98
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
99
99
|
|
|
100
100
|
/**
|
|
@@ -1,58 +1,13 @@
|
|
|
1
1
|
import { parseUnitId } from "./unit-id.js";
|
|
2
|
+
import {
|
|
3
|
+
AUTO_UNIT_SCOPED_TOOLS,
|
|
4
|
+
getForbiddenGsdToolReason,
|
|
5
|
+
} from "./unit-tool-contracts.js";
|
|
2
6
|
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"browser_fill_form",
|
|
8
|
-
"browser_click_ref",
|
|
9
|
-
"browser_fill_ref",
|
|
10
|
-
"browser_wait_for",
|
|
11
|
-
"browser_assert",
|
|
12
|
-
"browser_verify",
|
|
13
|
-
"browser_screenshot",
|
|
14
|
-
"browser_snapshot_refs",
|
|
15
|
-
"browser_find",
|
|
16
|
-
"browser_get_console_logs",
|
|
17
|
-
"browser_get_network_logs",
|
|
18
|
-
"browser_evaluate",
|
|
19
|
-
"browser_reload",
|
|
20
|
-
"browser_batch",
|
|
21
|
-
"browser_act",
|
|
22
|
-
] as const;
|
|
23
|
-
|
|
24
|
-
export const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = {
|
|
25
|
-
"research-milestone": ["gsd_summary_save", "gsd_decision_save"],
|
|
26
|
-
"plan-milestone": ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
|
|
27
|
-
"discuss-milestone": [
|
|
28
|
-
"gsd_summary_save",
|
|
29
|
-
"gsd_decision_save",
|
|
30
|
-
"gsd_requirement_save",
|
|
31
|
-
"gsd_requirement_update",
|
|
32
|
-
"gsd_plan_milestone",
|
|
33
|
-
"gsd_milestone_generate_id",
|
|
34
|
-
],
|
|
35
|
-
"discuss-slice": ["gsd_summary_save", "gsd_decision_save"],
|
|
36
|
-
"validate-milestone": ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
|
|
37
|
-
"complete-milestone": ["gsd_complete_milestone", "subagent"],
|
|
38
|
-
"research-slice": ["gsd_summary_save", "gsd_decision_save"],
|
|
39
|
-
"plan-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
40
|
-
"refine-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
41
|
-
"replan-slice": ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
42
|
-
"complete-slice": ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice", "gsd_decision_save", "gsd_requirement_update", "subagent"],
|
|
43
|
-
"reassess-roadmap": ["gsd_reassess_roadmap"],
|
|
44
|
-
"execute-task": ["gsd_task_complete", "gsd_decision_save"],
|
|
45
|
-
"execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
|
|
46
|
-
"reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
|
|
47
|
-
"run-uat": ["gsd_summary_save", ...RUN_UAT_BROWSER_TOOL_NAMES],
|
|
48
|
-
"gate-evaluate": ["gsd_save_gate_result"],
|
|
49
|
-
"rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
|
|
50
|
-
"workflow-preferences": ["gsd_summary_save"],
|
|
51
|
-
"discuss-project": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
52
|
-
"discuss-requirements": ["gsd_requirement_save", "gsd_summary_save"],
|
|
53
|
-
"research-decision": ["gsd_summary_save"],
|
|
54
|
-
"research-project": ["gsd_summary_save", "gsd_decision_save"],
|
|
55
|
-
};
|
|
7
|
+
export {
|
|
8
|
+
AUTO_UNIT_SCOPED_TOOLS,
|
|
9
|
+
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
10
|
+
} from "./unit-tool-contracts.js";
|
|
56
11
|
|
|
57
12
|
const WORKFLOW_TOOL_ALIASES: Record<string, string> = {
|
|
58
13
|
gsd_save_decision: "gsd_decision_save",
|
|
@@ -96,6 +51,14 @@ const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
|
|
|
96
51
|
.map(canonicalWorkflowToolName),
|
|
97
52
|
);
|
|
98
53
|
|
|
54
|
+
export const GSD_PHASE_SCOPE_DISPLAY_REASON = "This GSD phase only allows its scoped workflow tools.";
|
|
55
|
+
|
|
56
|
+
type AutoUnitToolScopeResult = {
|
|
57
|
+
block: boolean;
|
|
58
|
+
reason?: string;
|
|
59
|
+
displayReason?: string;
|
|
60
|
+
};
|
|
61
|
+
|
|
99
62
|
function stripMcpToolPrefix(toolName: string): string {
|
|
100
63
|
if (!toolName.startsWith("mcp__")) return toolName;
|
|
101
64
|
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
@@ -113,12 +76,20 @@ export function isWorkflowAliasTool(toolName: string): boolean {
|
|
|
113
76
|
|
|
114
77
|
function hardBlockReason(unitType: string, what: string): string {
|
|
115
78
|
return [
|
|
116
|
-
`HARD BLOCK: unit "${unitType}"
|
|
79
|
+
`HARD BLOCK: Tool Contract failure for unit "${unitType}" — ${what}.`,
|
|
117
80
|
"This is a mechanical phase-boundary gate. You MUST NOT proceed, retry the same call,",
|
|
118
81
|
"or route around this block; the orchestrator owns phase transitions.",
|
|
119
82
|
].join(" ");
|
|
120
83
|
}
|
|
121
84
|
|
|
85
|
+
function hardBlock(unitType: string, what: string): AutoUnitToolScopeResult {
|
|
86
|
+
return {
|
|
87
|
+
block: true,
|
|
88
|
+
reason: hardBlockReason(unitType, what),
|
|
89
|
+
displayReason: GSD_PHASE_SCOPE_DISPLAY_REASON,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
122
93
|
function allowedGsdToolsForUnit(unitType: string): string[] {
|
|
123
94
|
return [...new Set(
|
|
124
95
|
(AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [])
|
|
@@ -143,7 +114,7 @@ function shouldBlockTaskCompletionScope(
|
|
|
143
114
|
unitId: string | undefined,
|
|
144
115
|
toolName: string,
|
|
145
116
|
input: unknown,
|
|
146
|
-
):
|
|
117
|
+
): AutoUnitToolScopeResult {
|
|
147
118
|
if (!EXECUTE_TASK_UNIT_TYPES.has(unitType)) return { block: false };
|
|
148
119
|
if (canonicalWorkflowToolName(toolName) !== "gsd_task_complete") return { block: false };
|
|
149
120
|
if (!unitId) return { block: false };
|
|
@@ -164,13 +135,10 @@ function shouldBlockTaskCompletionScope(
|
|
|
164
135
|
return { block: false };
|
|
165
136
|
}
|
|
166
137
|
|
|
167
|
-
return
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
`gsd_task_complete may only complete the active task ${expected.milestone}/${expected.slice}/${expected.task}; requested ${actualMilestone}/${actualSlice}/${actualTask}`,
|
|
172
|
-
),
|
|
173
|
-
};
|
|
138
|
+
return hardBlock(
|
|
139
|
+
unitType,
|
|
140
|
+
`gsd_task_complete may only complete the active task ${expected.milestone}/${expected.slice}/${expected.task}; requested ${actualMilestone}/${actualSlice}/${actualTask}`,
|
|
141
|
+
);
|
|
174
142
|
}
|
|
175
143
|
|
|
176
144
|
export function shouldBlockAutoUnitToolCall(
|
|
@@ -178,15 +146,12 @@ export function shouldBlockAutoUnitToolCall(
|
|
|
178
146
|
toolName: string,
|
|
179
147
|
input?: unknown,
|
|
180
148
|
unitId?: string,
|
|
181
|
-
):
|
|
149
|
+
): AutoUnitToolScopeResult {
|
|
182
150
|
const scopedTools = AUTO_UNIT_SCOPED_TOOLS[unitType];
|
|
183
151
|
if (!scopedTools) return { block: false };
|
|
184
152
|
|
|
185
153
|
if (isNativeWorkflowTool(toolName)) {
|
|
186
|
-
return
|
|
187
|
-
block: true,
|
|
188
|
-
reason: hardBlockReason(unitType, "native Workflow is not permitted inside a dispatched GSD auto-mode unit"),
|
|
189
|
-
};
|
|
154
|
+
return hardBlock(unitType, "native Workflow is not permitted inside a dispatched GSD auto-mode unit");
|
|
190
155
|
}
|
|
191
156
|
|
|
192
157
|
const taskScope = shouldBlockTaskCompletionScope(unitType, unitId, toolName, input);
|
|
@@ -198,11 +163,16 @@ export function shouldBlockAutoUnitToolCall(
|
|
|
198
163
|
const allowedTools = allowedGsdToolsForUnit(unitType);
|
|
199
164
|
if (allowedTools.includes(canonicalTool)) return { block: false };
|
|
200
165
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
166
|
+
const forbiddenReason = getForbiddenGsdToolReason(unitType, canonicalTool);
|
|
167
|
+
if (forbiddenReason) {
|
|
168
|
+
return hardBlock(
|
|
204
169
|
unitType,
|
|
205
|
-
`GSD lifecycle tool "${canonicalTool}" is not permitted;
|
|
206
|
-
)
|
|
207
|
-
}
|
|
170
|
+
`GSD lifecycle tool "${canonicalTool}" is not permitted; ${forbiddenReason} Fix unit-tool-contracts.ts or the ${unitType} prompt.`,
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return hardBlock(
|
|
175
|
+
unitType,
|
|
176
|
+
`GSD lifecycle tool "${canonicalTool}" is not permitted; allowed GSD tools: ${allowedTools.length > 0 ? allowedTools.join(", ") : "(none)"}`,
|
|
177
|
+
);
|
|
208
178
|
}
|
|
@@ -83,6 +83,11 @@ import {
|
|
|
83
83
|
nativeWorktreeList,
|
|
84
84
|
nativeLsFiles,
|
|
85
85
|
} from "./native-git-bridge.js";
|
|
86
|
+
import {
|
|
87
|
+
CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
|
|
88
|
+
checkCloseoutConsistencyGate,
|
|
89
|
+
formatCloseoutConsistencyBlock,
|
|
90
|
+
} from "./closeout-consistency-gate.js";
|
|
86
91
|
import { gsdHome } from "./gsd-home.js";
|
|
87
92
|
import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
|
|
88
93
|
import {
|
|
@@ -1771,16 +1776,29 @@ export function mergeMilestoneToMain(
|
|
|
1771
1776
|
// symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
|
|
1772
1777
|
// database (#2823).
|
|
1773
1778
|
if (isDbAvailable()) {
|
|
1779
|
+
const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
|
|
1780
|
+
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1781
|
+
const mainDbPath = contract.projectDb;
|
|
1774
1782
|
try {
|
|
1775
|
-
const
|
|
1776
|
-
|
|
1777
|
-
|
|
1783
|
+
const activeDbPath = getDbPath();
|
|
1784
|
+
if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
|
|
1785
|
+
closeDatabase();
|
|
1786
|
+
if (!openDatabase(mainDbPath)) {
|
|
1787
|
+
throw new Error(`cannot open project DB at ${mainDbPath}`);
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1778
1790
|
if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
|
|
1779
1791
|
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
1780
1792
|
}
|
|
1781
1793
|
} catch (err) {
|
|
1782
|
-
|
|
1783
|
-
logError("worktree",
|
|
1794
|
+
const message = `DB reconciliation failed before milestone ${milestoneId} merge: ${err instanceof Error ? err.message : String(err)}`;
|
|
1795
|
+
logError("worktree", message);
|
|
1796
|
+
throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
const closeoutGate = checkCloseoutConsistencyGate(milestoneId);
|
|
1800
|
+
if (!closeoutGate.ok) {
|
|
1801
|
+
throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
|
|
1784
1802
|
}
|
|
1785
1803
|
}
|
|
1786
1804
|
|
|
@@ -205,6 +205,7 @@ import {
|
|
|
205
205
|
updateProgressWidget as _updateProgressWidget,
|
|
206
206
|
setCompletionProgressWidget,
|
|
207
207
|
setAutoOutcomeWidget,
|
|
208
|
+
setAutoActiveStatus,
|
|
208
209
|
updateSliceProgressCache,
|
|
209
210
|
clearSliceProgressCache,
|
|
210
211
|
describeNextUnit as _describeNextUnit,
|
|
@@ -254,7 +255,12 @@ import {
|
|
|
254
255
|
postUnitPreVerification,
|
|
255
256
|
postUnitPostVerification,
|
|
256
257
|
} from "./auto-post-unit.js";
|
|
257
|
-
import {
|
|
258
|
+
import {
|
|
259
|
+
bootstrapAutoSession,
|
|
260
|
+
openProjectDbIfPresent,
|
|
261
|
+
reconcileMergedMilestonesFromJournal,
|
|
262
|
+
type BootstrapDeps,
|
|
263
|
+
} from "./auto-start.js";
|
|
258
264
|
import { initHealthWidget } from "./health-widget.js";
|
|
259
265
|
import { runLegacyAutoLoop, runUokKernelLoop } from "./auto/loop.js";
|
|
260
266
|
import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight } from "./auto/resolve.js";
|
|
@@ -2102,6 +2108,28 @@ export function createWiredDispatchAdapter(
|
|
|
2102
2108
|
return null;
|
|
2103
2109
|
}
|
|
2104
2110
|
|
|
2111
|
+
function shouldAdoptActiveMilestone(
|
|
2112
|
+
state: GSDState,
|
|
2113
|
+
activeSession: AutoSession | undefined,
|
|
2114
|
+
activeDispatchBasePath: string,
|
|
2115
|
+
): boolean {
|
|
2116
|
+
const activeMilestoneId = state.activeMilestone?.id;
|
|
2117
|
+
const currentMilestoneId = activeSession?.currentMilestoneId;
|
|
2118
|
+
if (!activeSession || !activeMilestoneId || !currentMilestoneId || activeMilestoneId === currentMilestoneId) {
|
|
2119
|
+
return false;
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
const scopedWorktreeMilestone =
|
|
2123
|
+
(activeSession.basePath ? detectWorktreeName(activeSession.basePath) : null) ??
|
|
2124
|
+
detectWorktreeName(activeDispatchBasePath);
|
|
2125
|
+
if (scopedWorktreeMilestone && scopedWorktreeMilestone !== activeMilestoneId) {
|
|
2126
|
+
return false;
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
const currentMilestone = state.registry.find((milestone) => milestone.id === currentMilestoneId);
|
|
2130
|
+
return !!currentMilestone && isClosedStatus(currentMilestone.status);
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2105
2133
|
return {
|
|
2106
2134
|
async decideNextUnit(input) {
|
|
2107
2135
|
const state = input.stateSnapshot;
|
|
@@ -2110,6 +2138,9 @@ export function createWiredDispatchAdapter(
|
|
|
2110
2138
|
|
|
2111
2139
|
const activeSession = input.session ?? session;
|
|
2112
2140
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
2141
|
+
if (activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
2142
|
+
activeSession.currentMilestoneId = active.id;
|
|
2143
|
+
}
|
|
2113
2144
|
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
2114
2145
|
|
|
2115
2146
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
@@ -2280,10 +2311,20 @@ export function createWiredAutoOrchestrationModule(
|
|
|
2280
2311
|
async reconcileBeforeDispatch() {
|
|
2281
2312
|
const activeBasePath = getLiveDispatchBasePath();
|
|
2282
2313
|
const result = await reconcileBeforeDispatch(activeBasePath);
|
|
2283
|
-
|
|
2314
|
+
// Failure-path summaries written by gsd_summary_save create
|
|
2315
|
+
// artifact-db-status-divergence blockers for tasks that are still
|
|
2316
|
+
// pending (gsd_task_complete never ran). These tasks can still be
|
|
2317
|
+
// dispatched and the drift self-heals once they complete successfully.
|
|
2318
|
+
const hardBlockers = result.blockers.filter(
|
|
2319
|
+
(b) =>
|
|
2320
|
+
!b.includes("has SUMMARY artifact while DB status is") &&
|
|
2321
|
+
!b.includes("has SUMMARY on disk while DB status is") &&
|
|
2322
|
+
!b.includes("has task SUMMARY artifacts but no DB tasks"),
|
|
2323
|
+
);
|
|
2324
|
+
if (hardBlockers.length > 0) {
|
|
2284
2325
|
return {
|
|
2285
2326
|
ok: false,
|
|
2286
|
-
reason:
|
|
2327
|
+
reason: hardBlockers[0],
|
|
2287
2328
|
stateSnapshot: result.stateSnapshot,
|
|
2288
2329
|
};
|
|
2289
2330
|
}
|
|
@@ -2955,6 +2996,7 @@ export async function startAuto(
|
|
|
2955
2996
|
if (!getLedger()) initMetrics(base);
|
|
2956
2997
|
if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
|
|
2957
2998
|
await openProjectDbIfPresent(base);
|
|
2999
|
+
reconcileMergedMilestonesFromJournal(base);
|
|
2958
3000
|
registerAutoWorkerForSession(s, base);
|
|
2959
3001
|
|
|
2960
3002
|
// Re-register health level notification callback lost across process restart
|
|
@@ -2991,7 +3033,7 @@ export async function startAuto(
|
|
|
2991
3033
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2992
3034
|
registerSigtermHandler(lockBase());
|
|
2993
3035
|
|
|
2994
|
-
ctx
|
|
3036
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
2995
3037
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
2996
3038
|
ctx.ui.notify(
|
|
2997
3039
|
s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.",
|
|
@@ -3320,7 +3362,7 @@ export async function dispatchHookUnit(
|
|
|
3320
3362
|
await pauseAuto(ctx, pi);
|
|
3321
3363
|
}, hookHardTimeoutMs);
|
|
3322
3364
|
|
|
3323
|
-
ctx
|
|
3365
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
3324
3366
|
ctx.ui.notify(`Running post-unit hook: ${hookName}`, "info");
|
|
3325
3367
|
|
|
3326
3368
|
debugLog("dispatchHookUnit", {
|