@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
|
@@ -78,6 +78,9 @@ function readDetails(result: any): any {
|
|
|
78
78
|
|
|
79
79
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- result shape varies by tool
|
|
80
80
|
function formatToolErrorText(result: any, details: any): string {
|
|
81
|
+
if (typeof details?.displayReason === "string" && details.displayReason) {
|
|
82
|
+
return details.displayReason;
|
|
83
|
+
}
|
|
81
84
|
const message = details?.error
|
|
82
85
|
?? result?.content?.find((entry: { type?: string; text?: string }) => entry.type === "text")?.text
|
|
83
86
|
?? "unknown";
|
|
@@ -413,6 +416,95 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
413
416
|
pi.registerTool(summarySaveTool);
|
|
414
417
|
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
415
418
|
|
|
419
|
+
// ─── gsd_uat_result_save ─────────────────────────────────────────────────
|
|
420
|
+
|
|
421
|
+
const uatResultSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
422
|
+
const { executeUatResultSave } = await loadWorkflowExecutors();
|
|
423
|
+
return executeUatResultSave(params, resolveWorkflowToolBasePath(_ctx, params));
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
const uatEvidenceRef = Type.Object({
|
|
427
|
+
kind: StringEnum(["gsd_uat_exec", "gsd_exec", "screenshot", "log", "url", "browser"], { description: "Evidence kind" }),
|
|
428
|
+
ref: Type.String({ description: "Evidence ID, approved .gsd path, or URL" }),
|
|
429
|
+
note: Type.Optional(Type.String({ description: "Short evidence note" })),
|
|
430
|
+
unitType: Type.Optional(Type.String({ description: "Unit that produced the evidence" })),
|
|
431
|
+
tool: Type.Optional(Type.String({ description: "Tool that produced the evidence" })),
|
|
432
|
+
executionId: Type.Optional(Type.String({ description: "Stable execution or artifact id" })),
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
const uatCheck = Type.Object({
|
|
436
|
+
id: Type.String({ description: "Stable check ID from the UAT spec" }),
|
|
437
|
+
description: Type.String({ description: "Check description" }),
|
|
438
|
+
mode: StringEnum(["artifact", "runtime", "browser", "human-follow-up"], { description: "Evidence mode" }),
|
|
439
|
+
result: StringEnum(["PASS", "FAIL", "NEEDS-HUMAN"], { description: "Check result" }),
|
|
440
|
+
evidence: Type.Optional(Type.Array(uatEvidenceRef, { description: "Objective evidence references" })),
|
|
441
|
+
notes: Type.Optional(Type.String({ description: "Observed result, failure notes, or human instruction" })),
|
|
442
|
+
nonAutomatable: Type.Optional(Type.Boolean({ description: "True when the check is explicitly non-automatable" })),
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
const toolPresentationBlock = Type.Object({
|
|
446
|
+
surface: Type.Optional(StringEnum(["provider-tools", "claude-code-sdk", "mcp", "hybrid"], { description: "Tool presentation surface" })),
|
|
447
|
+
model: Type.Optional(Type.Object({
|
|
448
|
+
provider: Type.Optional(Type.String()),
|
|
449
|
+
api: Type.Optional(Type.String()),
|
|
450
|
+
id: Type.Optional(Type.String()),
|
|
451
|
+
})),
|
|
452
|
+
presentedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool names actually presented to the model" })),
|
|
453
|
+
blockedTools: Type.Optional(Type.Array(Type.Object({
|
|
454
|
+
name: Type.String(),
|
|
455
|
+
reason: Type.String(),
|
|
456
|
+
}), { description: "Tool names blocked from the model with reasons" })),
|
|
457
|
+
aliases: Type.Optional(Type.Array(Type.Object({
|
|
458
|
+
requested: Type.String(),
|
|
459
|
+
canonical: Type.String(),
|
|
460
|
+
}))),
|
|
461
|
+
fallbackToolsUsed: Type.Optional(Type.Array(Type.String())),
|
|
462
|
+
toolPresentationPlanId: Type.Optional(Type.String()),
|
|
463
|
+
notes: Type.Optional(Type.String()),
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
const uatResultSaveTool = {
|
|
467
|
+
name: "gsd_uat_result_save",
|
|
468
|
+
label: "Save UAT Result",
|
|
469
|
+
description:
|
|
470
|
+
"Save a structured UAT result for a slice. Validates evidence, writes the ASSESSMENT artifact, " +
|
|
471
|
+
"records attempt history, and saves the aggregate UAT gate result.",
|
|
472
|
+
promptSnippet: "Save structured UAT checks, evidence, verdict, and tool-presentation proof",
|
|
473
|
+
promptGuidelines: [
|
|
474
|
+
"Call gsd_uat_result_save once after all UAT checks have been executed.",
|
|
475
|
+
"Every PASS or FAIL check must cite objective evidence, preferably a gsd_uat_exec evidence ID.",
|
|
476
|
+
"Include the presented and blocked tool set in presentation so tool timing is auditable.",
|
|
477
|
+
"Do not use raw gsd_summary_save as a substitute for UAT results.",
|
|
478
|
+
],
|
|
479
|
+
parameters: Type.Object({
|
|
480
|
+
milestoneId: Type.Optional(Type.String({ description: "Milestone ID (e.g. M001)" })),
|
|
481
|
+
sliceId: Type.Optional(Type.String({ description: "Slice ID (e.g. S01)" })),
|
|
482
|
+
uatType: Type.Optional(Type.String({ description: "Declared UAT mode" })),
|
|
483
|
+
verdict: Type.Optional(Type.String({ description: "Overall UAT verdict: PASS, FAIL, or PARTIAL" })),
|
|
484
|
+
checks: Type.Optional(Type.Array(uatCheck, { description: "Structured check results" })),
|
|
485
|
+
presentation: Type.Optional(toolPresentationBlock),
|
|
486
|
+
notes: Type.Optional(Type.String({ description: "Overall verdict rationale" })),
|
|
487
|
+
attempt: Type.Optional(Type.String({ description: "Attempt number or auto" })),
|
|
488
|
+
previousAttemptId: Type.Optional(Type.String({ description: "Prior attempt ID, when retrying" })),
|
|
489
|
+
}),
|
|
490
|
+
execute: uatResultSaveExecute,
|
|
491
|
+
renderCall(args: any, theme: any) {
|
|
492
|
+
let text = theme.fg("toolTitle", theme.bold("uat_result_save "));
|
|
493
|
+
text += theme.fg("accent", `${args.milestoneId ?? "?"}/${args.sliceId ?? "?"}`);
|
|
494
|
+
if (args.verdict) text += theme.fg("dim", ` → ${args.verdict}`);
|
|
495
|
+
return new Text(text, 0, 0);
|
|
496
|
+
},
|
|
497
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
498
|
+
const d = readDetails(result);
|
|
499
|
+
if (result.isError || d?.error) {
|
|
500
|
+
return new Text(theme.fg("error", formatToolErrorText(result, d)), 0, 0);
|
|
501
|
+
}
|
|
502
|
+
return new Text(theme.fg("success", `UAT ${d?.sliceId ?? ""}: ${d?.verdict ?? "saved"}`), 0, 0);
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
pi.registerTool(uatResultSaveTool);
|
|
507
|
+
|
|
416
508
|
// ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
|
|
417
509
|
|
|
418
510
|
const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
@@ -746,7 +838,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
746
838
|
recommendation: Type.String({ description: "Option id the executor recommends." }),
|
|
747
839
|
recommendationRationale: Type.String({ description: "Why the recommendation — 1–2 sentences." }),
|
|
748
840
|
continueWithDefault: Type.Boolean({
|
|
749
|
-
description: "When true,
|
|
841
|
+
description: "When true, the recommendation is recorded as the default, but auto-mode still pauses until the user resolves via /gsd escalate resolve.",
|
|
750
842
|
}),
|
|
751
843
|
}, { description: "ADR-011 Phase 2: optional escalation payload. Only honored when phases.mid_execution_escalation is true." })),
|
|
752
844
|
verificationEvidence: Type.Optional(Type.Array(
|
|
@@ -795,7 +887,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
795
887
|
sliceTitle: Type.String({ description: "Title of the slice" }),
|
|
796
888
|
oneLiner: Type.String({ description: "One-line summary of what the slice accomplished" }),
|
|
797
889
|
narrative: Type.String({ description: "Detailed narrative of what happened across all tasks" }),
|
|
798
|
-
verification: Type.String({ description: "What was verified across all tasks" }),
|
|
890
|
+
verification: Type.Optional(Type.String({ description: "What was verified across all tasks — if omitted, summary records verification as passed without detail." })),
|
|
799
891
|
uatContent: Type.String({ description: "UAT test content (markdown body)" }),
|
|
800
892
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
801
893
|
deviations: Type.Optional(Type.String({ description: "Deviations from the slice plan, or 'None.'" })),
|
|
@@ -1009,7 +1101,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1009
1101
|
promptGuidelines: [
|
|
1010
1102
|
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
1011
1103
|
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verificationClasses (optional), verdictRationale, remediationPlan (optional).",
|
|
1012
|
-
"If verification classes were planned, verificationClasses must
|
|
1104
|
+
"If verification classes were planned, verificationClasses must be a complete canonical table with one row for every applicable planned class using the exact class names Contract, Integration, Operational, and UAT. Do not submit a partial table.",
|
|
1013
1105
|
"Planned verification text marked as none/not required/not applicable/N/A (including suffixed variants such as 'not required - backend-only') is treated as not applicable and does not require a class row.",
|
|
1014
1106
|
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
1015
1107
|
"On success, returns validationPath where VALIDATION.md was written.",
|
|
@@ -1022,7 +1114,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1022
1114
|
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
1023
1115
|
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
1024
1116
|
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
1025
|
-
verificationClasses: Type.Optional(Type.String({ description: "
|
|
1117
|
+
verificationClasses: Type.Optional(Type.String({ description: "Complete markdown table describing verification class compliance and gaps; include one canonical row for every applicable planned class (Contract, Integration, Operational, UAT)" })),
|
|
1026
1118
|
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
1027
1119
|
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
1028
1120
|
}),
|
|
@@ -25,6 +25,57 @@ async function loadContextModePreferences(baseDir: string) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export function registerExecTools(pi: ExtensionAPI): void {
|
|
28
|
+
pi.registerTool({
|
|
29
|
+
name: "gsd_uat_exec",
|
|
30
|
+
label: "UAT Exec",
|
|
31
|
+
description:
|
|
32
|
+
"Run a UAT-scoped bash/node/python check with milestone/slice/check metadata. " +
|
|
33
|
+
"Uses the same capped .gsd/exec evidence store as gsd_exec, but rejects commands that mutate dependencies, git state, credentials, or destructive files.",
|
|
34
|
+
promptSnippet: "Run one UAT check and save typed evidence under .gsd/exec",
|
|
35
|
+
promptGuidelines: [
|
|
36
|
+
"Use gsd_uat_exec for each automated UAT check.",
|
|
37
|
+
"Every PASS/FAIL check saved by gsd_uat_result_save must reference objective evidence from this tool or another approved GSD evidence path.",
|
|
38
|
+
"Do not install packages, mutate git state, edit source files, or dump credentials during UAT.",
|
|
39
|
+
],
|
|
40
|
+
parameters: Type.Object({
|
|
41
|
+
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
42
|
+
sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
|
|
43
|
+
checkId: Type.String({ description: "Stable check ID from the UAT spec (e.g. UAT-01)" }),
|
|
44
|
+
intent: Type.String({
|
|
45
|
+
description:
|
|
46
|
+
"UAT command intent. Use one canonical value: uat-artifact-check, uat-runtime-check, " +
|
|
47
|
+
"uat-browser-check, uat-service-start, or uat-log-inspection. Short aliases such as artifact, " +
|
|
48
|
+
"runtime, browser, service-start, and log-inspection are accepted.",
|
|
49
|
+
}),
|
|
50
|
+
runtime: Type.Optional(
|
|
51
|
+
Type.String({
|
|
52
|
+
description:
|
|
53
|
+
"Optional interpreter. Defaults to bash. Supported: bash, node, python; sh/shell, js/nodejs, and py/python3 aliases are accepted.",
|
|
54
|
+
}),
|
|
55
|
+
),
|
|
56
|
+
script: Type.Optional(Type.String({ description: "Script body. Keep output small (log the finding, not the data)." })),
|
|
57
|
+
command: Type.Optional(Type.String({ description: "Alias for script; defaults to bash when runtime is omitted." })),
|
|
58
|
+
cmd: Type.Optional(Type.String({ description: "Short alias for script." })),
|
|
59
|
+
code: Type.Optional(Type.String({ description: "Alias for script, useful for node/python snippets." })),
|
|
60
|
+
expected: Type.Optional(Type.String({ description: "Expected outcome for this UAT check." })),
|
|
61
|
+
timeout_ms: Type.Optional(
|
|
62
|
+
Type.Number({
|
|
63
|
+
description: "Per-invocation timeout (ms). Capped at 600000. Default from preferences.",
|
|
64
|
+
minimum: 1_000,
|
|
65
|
+
maximum: 600_000,
|
|
66
|
+
}),
|
|
67
|
+
),
|
|
68
|
+
}),
|
|
69
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
70
|
+
const { executeUatExec } = await import("../tools/exec-tool.js");
|
|
71
|
+
const baseDir = resolveCtxCwd(_ctx);
|
|
72
|
+
return executeUatExec(params as Parameters<typeof executeUatExec>[0], {
|
|
73
|
+
baseDir,
|
|
74
|
+
preferences: await loadContextModePreferences(baseDir),
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
28
79
|
pi.registerTool({
|
|
29
80
|
name: "gsd_exec",
|
|
30
81
|
label: "Exec (Sandboxed)",
|
|
@@ -17,7 +17,7 @@ import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer,
|
|
|
17
17
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
18
18
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
19
19
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
20
|
-
import { clearToolInvocationError, getAutoRuntimeSnapshot, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
|
|
20
|
+
import { clearToolInvocationError, getAutoRuntimeSnapshot, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
|
|
21
21
|
|
|
22
22
|
import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
|
|
23
23
|
import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
|
|
@@ -36,7 +36,9 @@ import { resolveSkillManifest } from "../skill-manifest.js";
|
|
|
36
36
|
import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
|
|
37
37
|
import { getGuidedUnitContext } from "../guided-unit-context.js";
|
|
38
38
|
import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
|
|
39
|
-
import { AUTO_UNIT_SCOPED_TOOLS, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
39
|
+
import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
|
|
40
|
+
import { filterToolsForProvider } from "../model-router.js";
|
|
41
|
+
import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
|
|
40
42
|
|
|
41
43
|
let approvalQuestionAbortInFlight = false;
|
|
42
44
|
|
|
@@ -123,6 +125,7 @@ export const MINIMAL_GSD_TOOL_NAMES = [
|
|
|
123
125
|
"gsd_resume",
|
|
124
126
|
"gsd_milestone_status",
|
|
125
127
|
"gsd_checkpoint_db",
|
|
128
|
+
"gsd_plan_milestone",
|
|
126
129
|
"memory_query",
|
|
127
130
|
"capture_thought",
|
|
128
131
|
] as const;
|
|
@@ -226,6 +229,9 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
226
229
|
unitType: string | undefined,
|
|
227
230
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
228
231
|
): string[] {
|
|
232
|
+
if (unitType === "run-uat") {
|
|
233
|
+
return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
|
|
234
|
+
}
|
|
229
235
|
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
230
236
|
const autoBaseTools = new Set<string>(MINIMAL_AUTO_BASE_TOOL_NAMES);
|
|
231
237
|
const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
|
|
@@ -240,6 +246,22 @@ export function buildMinimalAutoGsdToolSet(
|
|
|
240
246
|
return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
|
|
241
247
|
}
|
|
242
248
|
|
|
249
|
+
export function buildRunUatGsdToolSet(
|
|
250
|
+
activeToolNames: readonly string[],
|
|
251
|
+
registeredToolNames: readonly string[] = activeToolNames,
|
|
252
|
+
): string[] {
|
|
253
|
+
const scoped = resolveScopedToolNames(
|
|
254
|
+
[...activeToolNames, ...registeredToolNames],
|
|
255
|
+
[
|
|
256
|
+
...RUN_UAT_WORKFLOW_TOOL_NAMES,
|
|
257
|
+
...RUN_UAT_READ_ONLY_TOOL_NAMES,
|
|
258
|
+
"subagent",
|
|
259
|
+
...RUN_UAT_BROWSER_TOOL_NAMES,
|
|
260
|
+
],
|
|
261
|
+
);
|
|
262
|
+
return [...new Set(scoped)];
|
|
263
|
+
}
|
|
264
|
+
|
|
243
265
|
export function buildMinimalGsdWorkflowToolSet(
|
|
244
266
|
activeToolNames: readonly string[],
|
|
245
267
|
registeredToolNames: readonly string[] = activeToolNames,
|
|
@@ -463,22 +485,30 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
|
463
485
|
return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
|
|
464
486
|
}
|
|
465
487
|
|
|
488
|
+
function withDepthGateDisplayReason<T extends { block: boolean; reason?: string }>(
|
|
489
|
+
result: T,
|
|
490
|
+
displayReason = "Depth confirmation is waiting for your answer.",
|
|
491
|
+
): T & { displayReason?: string } {
|
|
492
|
+
if (!result.block) return result;
|
|
493
|
+
return { ...result, displayReason };
|
|
494
|
+
}
|
|
495
|
+
|
|
466
496
|
function shouldBlockDeferredApprovalTool(
|
|
467
497
|
toolName: string,
|
|
468
498
|
input: unknown,
|
|
469
499
|
basePath: string,
|
|
470
|
-
): { block: boolean; reason?: string } {
|
|
500
|
+
): { block: boolean; reason?: string; displayReason?: string } {
|
|
471
501
|
if (deferredApprovalGate?.basePath !== basePath) return { block: false };
|
|
472
502
|
if (toolName === "ask_user_questions") return { block: false };
|
|
473
503
|
if (isContextDraftSummarySave(toolName, input)) return { block: false };
|
|
474
|
-
return {
|
|
504
|
+
return withDepthGateDisplayReason({
|
|
475
505
|
block: true,
|
|
476
506
|
reason: [
|
|
477
507
|
`HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
|
|
478
508
|
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
479
509
|
`Wait for the user's answer before calling additional tools.`,
|
|
480
510
|
].join(" "),
|
|
481
|
-
};
|
|
511
|
+
});
|
|
482
512
|
}
|
|
483
513
|
|
|
484
514
|
export function resolveNotificationStoreBasePath(basePath: string): string {
|
|
@@ -518,8 +548,9 @@ export function registerHooks(
|
|
|
518
548
|
|
|
519
549
|
pi.on("session_start", async (_event, ctx) => {
|
|
520
550
|
const basePath = contextBasePath(ctx);
|
|
551
|
+
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
521
552
|
initSessionNotifications(ctx);
|
|
522
|
-
if (!isAutoActive()) {
|
|
553
|
+
if (!isAutoActive() && !preserveCloseoutSurface) {
|
|
523
554
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
524
555
|
initHealthWidget(ctx);
|
|
525
556
|
}
|
|
@@ -539,15 +570,18 @@ export function registerHooks(
|
|
|
539
570
|
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
540
571
|
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
541
572
|
} catch { /* non-fatal */ }
|
|
542
|
-
|
|
573
|
+
if (!preserveCloseoutSurface) {
|
|
574
|
+
await installWelcomeHeader(ctx);
|
|
575
|
+
}
|
|
543
576
|
await loadToolApiKeysForSession();
|
|
544
|
-
if (isAutoActive()) {
|
|
577
|
+
if (isAutoActive() || preserveCloseoutSurface) {
|
|
545
578
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
546
579
|
}
|
|
547
580
|
});
|
|
548
581
|
|
|
549
582
|
pi.on("session_switch", async (_event, ctx) => {
|
|
550
583
|
const basePath = contextBasePath(ctx);
|
|
584
|
+
const preserveCloseoutSurface = isAutoCompletionStopInProgress();
|
|
551
585
|
initSessionNotifications(ctx);
|
|
552
586
|
resetWriteGateState(basePath);
|
|
553
587
|
resetToolCallLoopGuard();
|
|
@@ -559,7 +593,7 @@ export function registerHooks(
|
|
|
559
593
|
await applyCompactionThresholdOverride(ctx);
|
|
560
594
|
await prepareWorkflowMcpForHookContext(ctx, basePath);
|
|
561
595
|
await loadToolApiKeysForSession();
|
|
562
|
-
if (!isAutoActive()) {
|
|
596
|
+
if (!isAutoActive() && !preserveCloseoutSurface) {
|
|
563
597
|
ctx.ui.setWidget("gsd-progress", undefined);
|
|
564
598
|
ctx.ui.setWidget("gsd-outcome", undefined);
|
|
565
599
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
@@ -896,7 +930,7 @@ export function registerHooks(
|
|
|
896
930
|
"Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
897
931
|
);
|
|
898
932
|
}
|
|
899
|
-
return bashGuard;
|
|
933
|
+
return withDepthGateDisplayReason(bashGuard);
|
|
900
934
|
}
|
|
901
935
|
} else {
|
|
902
936
|
const gateGuard = shouldBlockPendingGate(
|
|
@@ -914,7 +948,7 @@ export function registerHooks(
|
|
|
914
948
|
"Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
915
949
|
);
|
|
916
950
|
}
|
|
917
|
-
return gateGuard;
|
|
951
|
+
return withDepthGateDisplayReason(gateGuard);
|
|
918
952
|
}
|
|
919
953
|
}
|
|
920
954
|
}
|
|
@@ -1019,12 +1053,13 @@ export function registerHooks(
|
|
|
1019
1053
|
isQueuePhaseActive(discussionBasePath),
|
|
1020
1054
|
discussionBasePath,
|
|
1021
1055
|
);
|
|
1022
|
-
if (result.block)
|
|
1056
|
+
if (result.block) {
|
|
1057
|
+
return withDepthGateDisplayReason(result, "Depth check required before writing milestone context.");
|
|
1058
|
+
}
|
|
1023
1059
|
});
|
|
1024
1060
|
|
|
1025
|
-
// ── Safety harness: evidence collection + destructive command
|
|
1061
|
+
// ── Safety harness: evidence collection + destructive command blocking ──
|
|
1026
1062
|
pi.on("tool_call", async (event, ctx) => {
|
|
1027
|
-
if (!isAutoActive()) return;
|
|
1028
1063
|
markToolStart(event.toolCallId, event.toolName);
|
|
1029
1064
|
safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
|
|
1030
1065
|
|
|
@@ -1041,17 +1076,28 @@ export function registerHooks(
|
|
|
1041
1076
|
}
|
|
1042
1077
|
}
|
|
1043
1078
|
|
|
1044
|
-
// Destructive command classification
|
|
1079
|
+
// Destructive command classification + hard gate in all modes.
|
|
1045
1080
|
if (isToolCallEventType("bash", event)) {
|
|
1046
1081
|
const classification = classifyCommand(event.input.command);
|
|
1047
1082
|
if (classification.destructive) {
|
|
1083
|
+
const reason = [
|
|
1084
|
+
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1085
|
+
`Detected: ${classification.labels.join(", ")}`,
|
|
1086
|
+
"Run this via ask_user_questions, wait for the user's response,",
|
|
1087
|
+
"then issue the command only when confirmed in the current turn.",
|
|
1088
|
+
].join(" ");
|
|
1048
1089
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1049
1090
|
command: String(event.input.command).slice(0, 200),
|
|
1050
1091
|
});
|
|
1051
|
-
ctx
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1092
|
+
if (ctx) {
|
|
1093
|
+
await maybePauseAutoForApprovalGate(
|
|
1094
|
+
ctx,
|
|
1095
|
+
pi,
|
|
1096
|
+
isAutoActive(),
|
|
1097
|
+
"Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
return { block: true, reason };
|
|
1055
1101
|
}
|
|
1056
1102
|
}
|
|
1057
1103
|
});
|
|
@@ -1320,19 +1366,27 @@ export function registerHooks(
|
|
|
1320
1366
|
const fullToolsRequested = isFullGsdToolSurfaceRequested();
|
|
1321
1367
|
const dropAliases = !fullToolsRequested;
|
|
1322
1368
|
const dropBrowser = !fullToolsRequested && !isBrowserToolSurfaceRequested();
|
|
1323
|
-
const
|
|
1324
|
-
(name) => !(dropAliases && isWorkflowAliasTool(name))
|
|
1369
|
+
const aliasFilteredCompatible = compatible.filter(
|
|
1370
|
+
(name) => !(dropAliases && isWorkflowAliasTool(name)),
|
|
1371
|
+
);
|
|
1372
|
+
const providerCompatible = aliasFilteredCompatible.filter(
|
|
1373
|
+
(name) => !(dropBrowser && isBrowserTool(name)),
|
|
1325
1374
|
);
|
|
1326
1375
|
const surfaceReduced = providerCompatible.length !== compatible.length;
|
|
1327
1376
|
if (fullToolsRequested) {
|
|
1328
1377
|
return surfaceReduced ? { toolNames: providerCompatible } : undefined;
|
|
1329
1378
|
}
|
|
1330
1379
|
const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
|
|
1380
|
+
const compatibleRegisteredToolNames = filterToolsForProvider(
|
|
1381
|
+
registeredToolNames,
|
|
1382
|
+
event.selectedModelApi,
|
|
1383
|
+
event.selectedModelProvider,
|
|
1384
|
+
).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
|
|
1331
1385
|
const guidedUnit = getGuidedUnitContext();
|
|
1332
1386
|
const requestScoped = buildRequestScopedGsdToolSet(
|
|
1333
|
-
providerCompatible,
|
|
1387
|
+
guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1334
1388
|
event.requestCustomMessages,
|
|
1335
|
-
registeredToolNames,
|
|
1389
|
+
guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames,
|
|
1336
1390
|
guidedUnit?.unitType,
|
|
1337
1391
|
);
|
|
1338
1392
|
if (requestScoped) {
|
|
@@ -1342,9 +1396,11 @@ export function registerHooks(
|
|
|
1342
1396
|
if (dash.active && dash.currentUnit) {
|
|
1343
1397
|
return {
|
|
1344
1398
|
toolNames: buildMinimalAutoGsdToolSet(
|
|
1345
|
-
providerCompatible,
|
|
1399
|
+
dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
|
|
1346
1400
|
dash.currentUnit.type,
|
|
1347
|
-
|
|
1401
|
+
dash.currentUnit.type === "run-uat"
|
|
1402
|
+
? compatibleRegisteredToolNames
|
|
1403
|
+
: resolveRegisteredToolNames(pi, event.activeToolNames),
|
|
1348
1404
|
),
|
|
1349
1405
|
};
|
|
1350
1406
|
}
|