@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
|
@@ -32,7 +32,7 @@ import { isDbAvailable, getDbPath, refreshOpenDatabaseFromDisk, getTask, getSlic
|
|
|
32
32
|
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
33
33
|
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
34
34
|
import { consumeSignal } from "./session-status-io.js";
|
|
35
|
-
import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
35
|
+
import { checkPostUnitHooks, consumeHookFailure, isRetryPending, consumeRetryTrigger, consumeGateBlock, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
36
36
|
import { hasPendingCaptures, loadPendingCaptures, revertExecutorResolvedCaptures } from "./captures.js";
|
|
37
37
|
import { debugLog } from "./debug-logger.js";
|
|
38
38
|
import { runSafely } from "./auto-utils.js";
|
|
@@ -323,6 +323,41 @@ function stripKnownIdPrefix(value, id) {
|
|
|
323
323
|
return raw.slice(id.length + 1).trim() || undefined;
|
|
324
324
|
return raw;
|
|
325
325
|
}
|
|
326
|
+
function parseReactiveBatchTaskIds(unitId) {
|
|
327
|
+
const { task: batchPart } = parseUnitId(unitId);
|
|
328
|
+
if (!batchPart?.startsWith("reactive+"))
|
|
329
|
+
return [];
|
|
330
|
+
const rawIds = batchPart
|
|
331
|
+
.slice("reactive+".length)
|
|
332
|
+
.split(",")
|
|
333
|
+
.map((taskId) => taskId.trim().toUpperCase())
|
|
334
|
+
.filter(Boolean);
|
|
335
|
+
const unique = new Set();
|
|
336
|
+
for (const taskId of rawIds) {
|
|
337
|
+
unique.add(taskId);
|
|
338
|
+
}
|
|
339
|
+
return [...unique];
|
|
340
|
+
}
|
|
341
|
+
function dedupePaths(values) {
|
|
342
|
+
const seen = new Set();
|
|
343
|
+
const result = [];
|
|
344
|
+
for (const value of values) {
|
|
345
|
+
if (!seen.has(value)) {
|
|
346
|
+
seen.add(value);
|
|
347
|
+
result.push(value);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
function getPlannedKeyFiles(tasks) {
|
|
353
|
+
return dedupePaths(tasks.flatMap((taskRow) => [
|
|
354
|
+
...(taskRow.expected_output ?? []),
|
|
355
|
+
...(taskRow.files ?? []),
|
|
356
|
+
...(taskRow.key_files ?? []),
|
|
357
|
+
]));
|
|
358
|
+
}
|
|
359
|
+
export const _parseReactiveBatchTaskIdsForTest = parseReactiveBatchTaskIds;
|
|
360
|
+
export const _getPlannedKeyFilesForTest = getPlannedKeyFiles;
|
|
326
361
|
function resolveVerificationFailureMarkerPath(unitType, unitId, basePath) {
|
|
327
362
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
328
363
|
switch (unitType) {
|
|
@@ -402,6 +437,34 @@ async function buildTaskCommitContextForUnit(basePath, unitId) {
|
|
|
402
437
|
issueNumber: ghIssueNumber,
|
|
403
438
|
};
|
|
404
439
|
}
|
|
440
|
+
async function buildReactiveTaskCommitContext(_basePath, unitId) {
|
|
441
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
442
|
+
if (!mid || !sid || !isDbAvailable())
|
|
443
|
+
return undefined;
|
|
444
|
+
const batchTaskIds = parseReactiveBatchTaskIds(unitId);
|
|
445
|
+
if (batchTaskIds.length === 0)
|
|
446
|
+
return undefined;
|
|
447
|
+
const milestone = getMilestone(mid);
|
|
448
|
+
const slice = getSlice(mid, sid);
|
|
449
|
+
const taskRows = batchTaskIds
|
|
450
|
+
.map((tid) => getTask(mid, sid, tid))
|
|
451
|
+
.filter((taskRow) => taskRow !== null);
|
|
452
|
+
const keyFiles = getPlannedKeyFiles(taskRows);
|
|
453
|
+
if (taskRows.length === 0 || keyFiles.length === 0)
|
|
454
|
+
return undefined;
|
|
455
|
+
const taskLabel = taskRows.map((row) => row.id).join(",");
|
|
456
|
+
return {
|
|
457
|
+
taskId: `${sid}/${taskLabel}`,
|
|
458
|
+
taskDisplayId: "reactive-batch",
|
|
459
|
+
taskTitle: `Reactive batch: ${taskLabel}`,
|
|
460
|
+
milestoneId: mid,
|
|
461
|
+
milestoneTitle: stripKnownIdPrefix(milestone?.title, mid),
|
|
462
|
+
sliceId: sid,
|
|
463
|
+
sliceTitle: stripKnownIdPrefix(slice?.title, sid),
|
|
464
|
+
oneLiner: `Reactive execute for ${taskLabel}`,
|
|
465
|
+
keyFiles,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
405
468
|
async function runPostUnitGitHubSyncIfNeeded(basePath, unit) {
|
|
406
469
|
if (unit.type === "complete-milestone")
|
|
407
470
|
return;
|
|
@@ -761,6 +824,9 @@ export async function autoCommitUnit(basePath, unitType, unitId, ctx) {
|
|
|
761
824
|
if (unitType === "execute-task") {
|
|
762
825
|
taskContext = await buildTaskCommitContextForUnit(basePath, unitId);
|
|
763
826
|
}
|
|
827
|
+
else if (unitType === "reactive-execute") {
|
|
828
|
+
taskContext = await buildReactiveTaskCommitContext(basePath, unitId);
|
|
829
|
+
}
|
|
764
830
|
_resetHasChangesCache();
|
|
765
831
|
if (LIFECYCLE_ONLY_UNITS.has(unitType)) {
|
|
766
832
|
return null;
|
|
@@ -812,6 +878,22 @@ async function runCloseoutGitAction(pctx, unit, opts) {
|
|
|
812
878
|
targetRepositories = getTask(mid, sid, tid)?.target_repositories;
|
|
813
879
|
}
|
|
814
880
|
}
|
|
881
|
+
else if (turnAction === "commit" && unit.type === "reactive-execute") {
|
|
882
|
+
taskContext = await buildReactiveTaskCommitContext(s.basePath, unit.id);
|
|
883
|
+
const { milestone: mid, slice: sid } = parseUnitId(unit.id);
|
|
884
|
+
if (mid && sid && isDbAvailable()) {
|
|
885
|
+
const repositories = new Set();
|
|
886
|
+
for (const tid of parseReactiveBatchTaskIds(unit.id)) {
|
|
887
|
+
const taskRow = getTask(mid, sid, tid);
|
|
888
|
+
for (const repoId of taskRow?.target_repositories ?? []) {
|
|
889
|
+
repositories.add(repoId);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
if (repositories.size > 0) {
|
|
893
|
+
targetRepositories = [...repositories];
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
}
|
|
815
897
|
// Invalidate the nativeHasChanges cache before auto-commit (#1853).
|
|
816
898
|
// The cache has a 10-second TTL and is keyed by basePath. A stale
|
|
817
899
|
// `false` result causes autoCommit to skip staging entirely.
|
|
@@ -1206,12 +1288,19 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
1206
1288
|
if (safetyConfig.enabled) {
|
|
1207
1289
|
const { milestone: sMid, slice: sSid, task: sTid } = parseUnitId(s.currentUnit.id);
|
|
1208
1290
|
// File change validation (execute-task only, after unit execution)
|
|
1209
|
-
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid
|
|
1291
|
+
if (safetyConfig.file_change_validation && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
|
|
1210
1292
|
try {
|
|
1211
|
-
const
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1293
|
+
const sliceTaskRows = isDbAvailable()
|
|
1294
|
+
? getSliceTasks(sMid, sSid).filter((t) => isClosedStatus(t.status) || t.id === sTid)
|
|
1295
|
+
: [];
|
|
1296
|
+
if (sliceTaskRows.length > 0) {
|
|
1297
|
+
const expectedOutput = getPlannedKeyFiles(sliceTaskRows.map((taskRow) => ({
|
|
1298
|
+
expected_output: taskRow.expected_output,
|
|
1299
|
+
files: taskRow.files,
|
|
1300
|
+
})));
|
|
1301
|
+
const plannedFiles = getPlannedKeyFiles(sliceTaskRows.map((taskRow) => ({
|
|
1302
|
+
files: taskRow.files,
|
|
1303
|
+
})));
|
|
1215
1304
|
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
|
|
1216
1305
|
if (audit && audit.violations.length > 0) {
|
|
1217
1306
|
const warnings = audit.violations.filter(v => v.severity === "warning");
|
|
@@ -1223,6 +1312,23 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
1223
1312
|
}
|
|
1224
1313
|
}
|
|
1225
1314
|
}
|
|
1315
|
+
else {
|
|
1316
|
+
const taskRow = getTask(sMid, sSid, sTid);
|
|
1317
|
+
if (taskRow) {
|
|
1318
|
+
const expectedOutput = taskRow.expected_output ?? [];
|
|
1319
|
+
const plannedFiles = taskRow.files ?? [];
|
|
1320
|
+
const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
|
|
1321
|
+
if (audit && audit.violations.length > 0) {
|
|
1322
|
+
const warnings = audit.violations.filter(v => v.severity === "warning");
|
|
1323
|
+
for (const v of warnings) {
|
|
1324
|
+
logWarning("safety", `file-change: ${v.file} — ${v.reason}`);
|
|
1325
|
+
}
|
|
1326
|
+
if (warnings.length > 0) {
|
|
1327
|
+
ctx.ui.notify(`Safety: ${warnings.length} unexpected file change(s) outside task plan`, "warning");
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1226
1332
|
}
|
|
1227
1333
|
catch (e) {
|
|
1228
1334
|
debugLog("postUnit", { phase: "safety-file-change", error: String(e) });
|
|
@@ -1754,18 +1860,25 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1754
1860
|
// ── Post-unit hooks ──
|
|
1755
1861
|
if (s.currentUnit && !s.stepMode) {
|
|
1756
1862
|
const hookUnit = checkPostUnitHooks(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
1863
|
+
persistHookState(s.basePath);
|
|
1757
1864
|
if (hookUnit) {
|
|
1758
1865
|
if (s.currentUnit) {
|
|
1759
1866
|
await closeoutUnit(ctx, s.basePath, s.currentUnit.type, s.currentUnit.id, s.currentUnit.startedAt, buildSnapshotOpts(s.currentUnit.type, s.currentUnit.id));
|
|
1760
1867
|
}
|
|
1761
|
-
persistHookState(s.basePath);
|
|
1762
1868
|
return enqueueSidecar(s, ctx, { kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model }, { hookName: hookUnit.hookName });
|
|
1763
1869
|
}
|
|
1870
|
+
const hookFailure = consumeHookFailure();
|
|
1871
|
+
if (hookFailure) {
|
|
1872
|
+
ctx.ui.notify(`Post-unit hook ${hookFailure.hookName} failed for ${hookFailure.unitId}: ${hookFailure.reason}. Pausing auto-mode.`, "warning");
|
|
1873
|
+
await pauseAuto(ctx, pi);
|
|
1874
|
+
return "stopped";
|
|
1875
|
+
}
|
|
1764
1876
|
// Check if a hook requested a retry of the trigger unit
|
|
1765
1877
|
if (isRetryPending()) {
|
|
1766
1878
|
const trigger = consumeRetryTrigger();
|
|
1767
1879
|
if (trigger) {
|
|
1768
|
-
|
|
1880
|
+
persistHookState(s.basePath);
|
|
1881
|
+
ctx.ui.notify(`Hook requested retry of ${trigger.unitType} ${trigger.unitId} — resetting trigger unit state.`, "info");
|
|
1769
1882
|
await s.orchestration?.retryActiveUnit({
|
|
1770
1883
|
unitType: trigger.unitType,
|
|
1771
1884
|
unitId: trigger.unitId,
|
|
@@ -1781,8 +1894,8 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1781
1894
|
}
|
|
1782
1895
|
catch (dbErr) {
|
|
1783
1896
|
// DB unavailable — fail explicitly rather than silently reverting to markdown mutation.
|
|
1784
|
-
// Use 'gsd recover' to
|
|
1785
|
-
logError("engine", `retry state-reset failed (DB unavailable): ${dbErr.message}. Run 'gsd recover' to
|
|
1897
|
+
// Use 'gsd recover --confirm' to import markdown into the DB if needed.
|
|
1898
|
+
logError("engine", `retry state-reset failed (DB unavailable): ${dbErr.message}. Run 'gsd recover --confirm' to import markdown into the DB.`);
|
|
1786
1899
|
}
|
|
1787
1900
|
}
|
|
1788
1901
|
// 2. Delete SUMMARY.md for the task
|
|
@@ -1812,6 +1925,17 @@ export async function postUnitPostVerification(pctx) {
|
|
|
1812
1925
|
// Fall through to normal dispatch — deriveState will re-derive the unit
|
|
1813
1926
|
}
|
|
1814
1927
|
}
|
|
1928
|
+
const gateBlock = consumeGateBlock();
|
|
1929
|
+
if (gateBlock) {
|
|
1930
|
+
persistHookState(s.basePath);
|
|
1931
|
+
const verdict = gateBlock.verdict ? ` verdict=${gateBlock.verdict};` : "";
|
|
1932
|
+
const artifact = gateBlock.artifact ? ` artifact=${gateBlock.artifact};` : "";
|
|
1933
|
+
const message = `Post-unit gate "${gateBlock.hookName}" blocked ${gateBlock.triggerUnitType} ${gateBlock.triggerUnitId}:` +
|
|
1934
|
+
`${verdict}${artifact} ${gateBlock.reason}. Run /gsd status to inspect, then /gsd auto after recovery.`;
|
|
1935
|
+
ctx.ui.notify(message, "warning");
|
|
1936
|
+
await pauseAuto(ctx, pi);
|
|
1937
|
+
return "stopped";
|
|
1938
|
+
}
|
|
1815
1939
|
}
|
|
1816
1940
|
// ── Fast-path stop detection (#3487) ──
|
|
1817
1941
|
// Before waiting for triage, check if any PENDING captures contain explicit
|
|
@@ -30,6 +30,8 @@ import { classifyProject } from "./detection.js";
|
|
|
30
30
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
31
31
|
import { debugLog } from "./debug-logger.js";
|
|
32
32
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
33
|
+
import { findMilestoneIds } from "./milestone-ids.js";
|
|
34
|
+
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
33
35
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
34
36
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
35
37
|
/**
|
|
@@ -1270,7 +1272,7 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
1270
1272
|
if (hasVerdict(uatContent))
|
|
1271
1273
|
continue;
|
|
1272
1274
|
// Also check the ASSESSMENT file — the run-uat prompt writes the verdict
|
|
1273
|
-
// there (via
|
|
1275
|
+
// there (via gsd_uat_result_save), not into the
|
|
1274
1276
|
// UAT spec file. Without this check the unit re-dispatches indefinitely.
|
|
1275
1277
|
const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
|
|
1276
1278
|
if (assessmentFile) {
|
|
@@ -1325,21 +1327,44 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
1325
1327
|
}
|
|
1326
1328
|
return null;
|
|
1327
1329
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
const
|
|
1330
|
+
export async function buildDiscussMilestoneInlinedContext(mid, base) {
|
|
1331
|
+
const inlined = [];
|
|
1332
|
+
const roadmapInline = await inlineFileOptional(resolveMilestoneFile(base, mid, "ROADMAP"), relMilestoneFile(base, mid, "ROADMAP"), "Milestone Roadmap");
|
|
1333
|
+
if (roadmapInline)
|
|
1334
|
+
inlined.push(roadmapInline);
|
|
1335
|
+
const contextInline = await inlineFileOptional(resolveMilestoneFile(base, mid, "CONTEXT"), relMilestoneFile(base, mid, "CONTEXT"), "Milestone Context");
|
|
1336
|
+
if (contextInline)
|
|
1337
|
+
inlined.push(contextInline);
|
|
1338
|
+
const researchInline = await inlineFileOptional(resolveMilestoneFile(base, mid, "RESEARCH"), relMilestoneFile(base, mid, "RESEARCH"), "Milestone Research");
|
|
1339
|
+
if (researchInline)
|
|
1340
|
+
inlined.push(researchInline);
|
|
1341
|
+
const decisionsPath = resolveGsdRootFile(base, "DECISIONS");
|
|
1342
|
+
if (existsSync(decisionsPath)) {
|
|
1343
|
+
const decisionsContent = await loadFile(decisionsPath);
|
|
1344
|
+
if (decisionsContent) {
|
|
1345
|
+
inlined.push(`### Decisions Register\nSource: \`${relGsdRootFile("DECISIONS")}\`\n\n${decisionsContent.trim()}`);
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
const milestoneIds = findMilestoneIds(base);
|
|
1349
|
+
const currentIndex = milestoneIds.indexOf(mid);
|
|
1350
|
+
const priorMilestoneIds = currentIndex >= 0 ? milestoneIds.slice(0, currentIndex) : milestoneIds;
|
|
1351
|
+
for (const priorMid of priorMilestoneIds) {
|
|
1352
|
+
const summaryInline = await inlineFileOptional(resolveMilestoneFile(base, priorMid, "SUMMARY"), relMilestoneFile(base, priorMid, "SUMMARY"), `${priorMid} Prior Milestone Summary`);
|
|
1353
|
+
if (summaryInline)
|
|
1354
|
+
inlined.push(summaryInline);
|
|
1355
|
+
}
|
|
1356
|
+
return inlined.length > 0
|
|
1357
|
+
? `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`
|
|
1358
|
+
: "## Inlined Context\n\n_(no milestone context files found yet — go in blind and ask broad questions)_";
|
|
1359
|
+
}
|
|
1360
|
+
export async function buildDiscussMilestonePrompt(mid, midTitle, base, structuredQuestionsAvailable = "false", { headless = false, commitInstruction = "Do not commit planning artifacts — .gsd/ is managed externally.", fastPathInstruction = "", includeDraftSeed = true, includeContextMode = true, } = {}) {
|
|
1361
|
+
const contextTemplate = inlineTemplate("context", "Context");
|
|
1337
1362
|
if (headless) {
|
|
1338
1363
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
1339
1364
|
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
1340
1365
|
return loadPrompt("discuss-headless", {
|
|
1341
1366
|
seedContext: roadmapContent ?? "",
|
|
1342
|
-
inlinedTemplates:
|
|
1367
|
+
inlinedTemplates: contextTemplate,
|
|
1343
1368
|
workingDirectory: base,
|
|
1344
1369
|
milestoneId: mid,
|
|
1345
1370
|
contextPath: relMilestoneFile(base, mid, "CONTEXT"),
|
|
@@ -1347,24 +1372,28 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
|
|
|
1347
1372
|
multiMilestoneCommitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1348
1373
|
});
|
|
1349
1374
|
}
|
|
1350
|
-
const
|
|
1375
|
+
const rawInlinedContext = await buildDiscussMilestoneInlinedContext(mid, base);
|
|
1376
|
+
const cappedInlinedContext = capPreamble(rawInlinedContext);
|
|
1377
|
+
const discussTemplates = [cappedInlinedContext, contextTemplate].join("\n\n---\n\n");
|
|
1351
1378
|
const basePrompt = loadPrompt("guided-discuss-milestone", {
|
|
1352
1379
|
workingDirectory: base,
|
|
1353
1380
|
milestoneId: mid,
|
|
1354
1381
|
milestoneTitle: midTitle,
|
|
1355
1382
|
inlinedTemplates: discussTemplates,
|
|
1356
1383
|
structuredQuestionsAvailable,
|
|
1357
|
-
commitInstruction
|
|
1358
|
-
fastPathInstruction
|
|
1384
|
+
commitInstruction,
|
|
1385
|
+
fastPathInstruction,
|
|
1359
1386
|
});
|
|
1360
|
-
const promptWithContextMode =
|
|
1387
|
+
const promptWithContextMode = includeContextMode
|
|
1388
|
+
? prependContextModeToBlock("discuss-milestone", base, basePrompt)
|
|
1389
|
+
: basePrompt;
|
|
1361
1390
|
// If a CONTEXT-DRAFT.md exists, append it as seed material
|
|
1362
1391
|
const draftPath = resolveMilestoneFile(base, mid, "CONTEXT-DRAFT");
|
|
1363
1392
|
const draftContent = draftPath ? await loadFile(draftPath) : null;
|
|
1364
|
-
if (draftContent) {
|
|
1393
|
+
if (includeDraftSeed && draftContent) {
|
|
1365
1394
|
return `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${draftContent}`;
|
|
1366
1395
|
}
|
|
1367
|
-
return
|
|
1396
|
+
return promptWithContextMode;
|
|
1368
1397
|
}
|
|
1369
1398
|
/**
|
|
1370
1399
|
* Build a prompt for the workflow-preferences unit type (deep mode).
|
|
@@ -2351,6 +2380,15 @@ export async function buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base,
|
|
|
2351
2380
|
sliceSummaryPath,
|
|
2352
2381
|
sliceUatPath,
|
|
2353
2382
|
gatesToClose,
|
|
2383
|
+
skillActivation: buildSkillActivationBlock({
|
|
2384
|
+
base,
|
|
2385
|
+
milestoneId: mid,
|
|
2386
|
+
milestoneTitle: midTitle,
|
|
2387
|
+
sliceId: sid,
|
|
2388
|
+
sliceTitle: sTitle,
|
|
2389
|
+
extraContext: [inlinedContext],
|
|
2390
|
+
unitType: "complete-slice",
|
|
2391
|
+
}),
|
|
2354
2392
|
});
|
|
2355
2393
|
}
|
|
2356
2394
|
export async function buildCompleteMilestonePrompt(mid, midTitle, base, level) {
|
|
@@ -2531,17 +2569,26 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
2531
2569
|
if (isDbAvailable()) {
|
|
2532
2570
|
const milestone = getMilestone(mid);
|
|
2533
2571
|
if (milestone) {
|
|
2572
|
+
const escapeCell = (value) => value.replace(/[\\|]/g, (char) => `\\${char}`).replace(/\r?\n/g, " ");
|
|
2534
2573
|
const classes = [];
|
|
2535
2574
|
if (milestone.verification_contract)
|
|
2536
|
-
classes.push(
|
|
2575
|
+
classes.push(`| Contract | ${escapeCell(milestone.verification_contract)} |`);
|
|
2537
2576
|
if (milestone.verification_integration)
|
|
2538
|
-
classes.push(
|
|
2577
|
+
classes.push(`| Integration | ${escapeCell(milestone.verification_integration)} |`);
|
|
2539
2578
|
if (milestone.verification_operational)
|
|
2540
|
-
classes.push(
|
|
2579
|
+
classes.push(`| Operational | ${escapeCell(milestone.verification_operational)} |`);
|
|
2541
2580
|
if (milestone.verification_uat)
|
|
2542
|
-
classes.push(
|
|
2581
|
+
classes.push(`| UAT | ${escapeCell(milestone.verification_uat)} |`);
|
|
2543
2582
|
if (classes.length > 0) {
|
|
2544
|
-
const verificationClasses =
|
|
2583
|
+
const verificationClasses = [
|
|
2584
|
+
"### Verification Classes (from planning)",
|
|
2585
|
+
"",
|
|
2586
|
+
"These verification tiers were defined during milestone planning. Every row in this table must appear in `verificationClasses` with the same canonical class name.",
|
|
2587
|
+
"",
|
|
2588
|
+
"| Class | Planned Check |",
|
|
2589
|
+
"| --- | --- |",
|
|
2590
|
+
...classes,
|
|
2591
|
+
].join("\n");
|
|
2545
2592
|
inlined.push(verificationClasses);
|
|
2546
2593
|
trackPromptContext(contextTelemetry, "verification-classes", "inline", verificationClasses);
|
|
2547
2594
|
}
|
|
@@ -2893,6 +2940,7 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
|
|
|
2893
2940
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
2894
2941
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
2895
2942
|
const uatType = resolveEffectiveUatType(uatContent);
|
|
2943
|
+
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
2896
2944
|
return loadPrompt("run-uat", {
|
|
2897
2945
|
workingDirectory: base,
|
|
2898
2946
|
milestoneId: mid,
|
|
@@ -2900,6 +2948,8 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
|
|
|
2900
2948
|
uatPath,
|
|
2901
2949
|
uatResultPath,
|
|
2902
2950
|
uatType,
|
|
2951
|
+
toolPresentationPlanId: RUN_UAT_TOOL_PRESENTATION_PLAN_ID,
|
|
2952
|
+
canonicalPresentation,
|
|
2903
2953
|
inlinedContext,
|
|
2904
2954
|
skillActivation: buildSkillActivationBlock({
|
|
2905
2955
|
base,
|
|
@@ -32,6 +32,7 @@ import { isGsdWorktreePath } from "./worktree-root.js";
|
|
|
32
32
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
33
33
|
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
34
34
|
import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
|
|
35
|
+
import { checkCloseoutConsistencyGate } from "./closeout-consistency-gate.js";
|
|
35
36
|
// Re-export so existing consumers of auto-recovery.ts keep working.
|
|
36
37
|
export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
|
|
37
38
|
export { classifyMilestoneSummaryContent, } from "./milestone-summary-classifier.js";
|
|
@@ -571,10 +572,8 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
|
571
572
|
return false;
|
|
572
573
|
const { milestone: mid } = parseUnitId(unitId);
|
|
573
574
|
if (mid && isDbAvailable()) {
|
|
574
|
-
const
|
|
575
|
-
if (!
|
|
576
|
-
return false;
|
|
577
|
-
if (!isClosedStatus(dbMilestone.status) && summaryOutcome !== "success")
|
|
575
|
+
const closeoutGate = checkCloseoutConsistencyGate(mid, { refreshFromDisk: true });
|
|
576
|
+
if (!closeoutGate.ok)
|
|
578
577
|
return false;
|
|
579
578
|
}
|
|
580
579
|
if (hasImplementationArtifacts(base, mid) === "absent")
|
|
@@ -802,7 +801,7 @@ export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
|
802
801
|
return [
|
|
803
802
|
` 1. Run \`gsd undo-task ${mid}/${sid}/${tid}\` to reset the task state`,
|
|
804
803
|
` 2. Resume auto-mode — it will re-execute the task`,
|
|
805
|
-
` 3. If the task keeps failing
|
|
804
|
+
` 3. If the task keeps failing and markdown should repopulate the DB, run \`gsd recover --confirm\``,
|
|
806
805
|
].join("\n");
|
|
807
806
|
}
|
|
808
807
|
case "plan-slice":
|
|
@@ -814,7 +813,7 @@ export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
|
814
813
|
: relSliceFile(base, mid, sid, "RESEARCH");
|
|
815
814
|
return [
|
|
816
815
|
` 1. Write ${artifactRel} manually (or with the LLM in interactive mode)`,
|
|
817
|
-
` 2. Run \`gsd recover\` to
|
|
816
|
+
` 2. Run \`gsd recover --confirm\` to import the markdown into the DB`,
|
|
818
817
|
` 3. Resume auto-mode`,
|
|
819
818
|
].join("\n");
|
|
820
819
|
}
|
|
@@ -824,7 +823,7 @@ export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
|
824
823
|
return [
|
|
825
824
|
` 1. Run \`gsd reset-slice ${mid}/${sid}\` to reset the slice and all its tasks`,
|
|
826
825
|
` 2. Resume auto-mode — it will re-execute incomplete tasks and re-complete the slice`,
|
|
827
|
-
` 3. If the slice keeps failing
|
|
826
|
+
` 3. If the slice keeps failing and markdown should repopulate the DB, run \`gsd recover --confirm\``,
|
|
828
827
|
].join("\n");
|
|
829
828
|
}
|
|
830
829
|
case "validate-milestone": {
|
|
@@ -833,7 +832,7 @@ export function buildLoopRemediationSteps(unitType, unitId, base) {
|
|
|
833
832
|
const artifactRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
834
833
|
return [
|
|
835
834
|
` 1. Write ${artifactRel} with verdict: pass`,
|
|
836
|
-
` 2. Run \`gsd recover\` to
|
|
835
|
+
` 2. Run \`gsd recover --confirm\` to import the markdown into the DB`,
|
|
837
836
|
` 3. Resume auto-mode`,
|
|
838
837
|
].join("\n");
|
|
839
838
|
}
|
|
@@ -20,6 +20,9 @@ export function isAutoActive() {
|
|
|
20
20
|
export function isAutoPaused() {
|
|
21
21
|
return autoSession.paused;
|
|
22
22
|
}
|
|
23
|
+
export function isAutoCompletionStopInProgress() {
|
|
24
|
+
return autoSession.completionStopInProgress;
|
|
25
|
+
}
|
|
23
26
|
export function markToolStart(toolCallId, toolName) {
|
|
24
27
|
markTrackedToolStart(toolCallId, autoSession.active, toolName);
|
|
25
28
|
}
|