@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
|
@@ -45,3 +45,30 @@ test("doctor fix respects git.manage_gitignore false (#4161)", async (t) => {
|
|
|
45
45
|
assert.equal(readFileSync(join(dir, ".gitignore"), "utf-8"), "node_modules/\n");
|
|
46
46
|
assert.equal(existsSync(join(dir, ".gsd", "PREFERENCES.md")), true);
|
|
47
47
|
});
|
|
48
|
+
|
|
49
|
+
test("doctor fix resets run-uat counters at the dispatch cap", async (t) => {
|
|
50
|
+
const dir = createGitProject();
|
|
51
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
52
|
+
|
|
53
|
+
const runtimeDir = join(dir, ".gsd", "runtime");
|
|
54
|
+
mkdirSync(runtimeDir, { recursive: true });
|
|
55
|
+
const counterPath = join(runtimeDir, "uat-count-M002-S01.json");
|
|
56
|
+
writeFileSync(
|
|
57
|
+
counterPath,
|
|
58
|
+
JSON.stringify({ count: 3, updatedAt: "2026-06-02T19:40:23.289Z" }) + "\n",
|
|
59
|
+
"utf-8",
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const detect = await runGSDDoctor(dir);
|
|
63
|
+
const issue = detect.issues.find((candidate) => candidate.code === "uat_retry_exhausted");
|
|
64
|
+
assert.ok(issue, "doctor reports the exhausted UAT retry counter at the dispatch cap");
|
|
65
|
+
assert.equal(issue.unitId, "M002/S01");
|
|
66
|
+
assert.match(issue.message, /3 attempt\(s\)/);
|
|
67
|
+
|
|
68
|
+
const fixed = await runGSDDoctor(dir, { fix: true, scope: "M002/S02" });
|
|
69
|
+
assert.ok(
|
|
70
|
+
fixed.fixesApplied.some((fix) => fix.includes("reset exhausted run-uat retry counter for M002/S01")),
|
|
71
|
+
"doctor --fix resets the blocked counter even when the current displayed scope has advanced",
|
|
72
|
+
);
|
|
73
|
+
assert.equal(existsSync(counterPath), false);
|
|
74
|
+
});
|
|
@@ -106,7 +106,7 @@ test("ADR-011 P2: writeEscalationArtifact persists canonical JSON at tasks/T##-E
|
|
|
106
106
|
assert.equal(row?.escalation_artifact_path, path);
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
-
test("ADR-011 P2: continueWithDefault=true sets awaiting_review (NOT pending)
|
|
109
|
+
test("ADR-011 P2: continueWithDefault=true sets awaiting_review (NOT pending)", (t) => {
|
|
110
110
|
const base = makeBase();
|
|
111
111
|
t.after(() => cleanup(base));
|
|
112
112
|
seedCompletedTask(base, "T04");
|
|
@@ -126,7 +126,7 @@ test("ADR-011 P2: continueWithDefault=true sets awaiting_review (NOT pending)
|
|
|
126
126
|
assert.equal(row?.escalation_awaiting_review, 1);
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
-
test("ADR-011 P2: detectPendingEscalation
|
|
129
|
+
test("ADR-011 P2: detectPendingEscalation pauses on unresolved awaiting_review escalations", (t) => {
|
|
130
130
|
const base = makeBase();
|
|
131
131
|
t.after(() => cleanup(base));
|
|
132
132
|
seedCompletedTask(base, "T01");
|
|
@@ -147,7 +147,7 @@ test("ADR-011 P2: detectPendingEscalation returns only pause-scoped escalations"
|
|
|
147
147
|
|
|
148
148
|
const tasks = [getTask("M001", "S01", "T01")!, getTask("M001", "S01", "T02")!];
|
|
149
149
|
const id = detectPendingEscalation(tasks, base);
|
|
150
|
-
assert.equal(id, "
|
|
150
|
+
assert.equal(id, "T01", "unresolved awaiting_review escalations must pause before later tasks");
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
test("ADR-011 P2: resolveEscalation(accept) marks artifact + clears flags", (t) => {
|
|
@@ -677,26 +677,19 @@ test("ADR-011 P3 #23: concurrent escalations across parallel slices — only the
|
|
|
677
677
|
assert.equal(detectPendingEscalation([getTask("M001", "S02", "T70")!], base), null);
|
|
678
678
|
});
|
|
679
679
|
|
|
680
|
-
test("ADR-011 P3 #24: continueWithDefault
|
|
681
|
-
// Timeline this test pins
|
|
682
|
-
// elapsed wall-clock where the loop keeps running after T80's
|
|
683
|
-
// continueWithDefault=true write):
|
|
680
|
+
test("ADR-011 P3 #24: continueWithDefault requires explicit response before override injection", (t) => {
|
|
681
|
+
// Timeline this test pins:
|
|
684
682
|
//
|
|
685
|
-
// 1. T80 writes continueWithDefault=true → awaiting_review=1
|
|
686
|
-
//
|
|
687
|
-
//
|
|
688
|
-
//
|
|
689
|
-
// 3. The very next prompt build (for T83) claims the override exactly
|
|
690
|
-
// once. T81/T82 are in the past — they must not retroactively
|
|
691
|
-
// receive the injection even though they ran during the window.
|
|
683
|
+
// 1. T80 writes continueWithDefault=true → awaiting_review=1.
|
|
684
|
+
// 2. Scheduler detection pauses on T80 instead of treating silence as
|
|
685
|
+
// consent. Prompt injection still waits until the user responds.
|
|
686
|
+
// 3. After the response, the next prompt build claims the override once.
|
|
692
687
|
const base = makeBase();
|
|
693
688
|
t.after(() => cleanup(base));
|
|
694
689
|
seedCompletedTask(base, "T80");
|
|
695
|
-
seedCompletedTask(base, "T81");
|
|
696
|
-
seedCompletedTask(base, "T82");
|
|
697
690
|
seedCompletedTask(base, "T83");
|
|
698
691
|
|
|
699
|
-
// Phase 1 — T80 escalates with continueWithDefault=true
|
|
692
|
+
// Phase 1 — T80 escalates with continueWithDefault=true.
|
|
700
693
|
writeEscalationArtifact(base, buildEscalationArtifact({
|
|
701
694
|
taskId: "T80", sliceId: "S01", milestoneId: "M001",
|
|
702
695
|
question: "Which cache strategy?", options: sampleOptions,
|
|
@@ -704,21 +697,17 @@ test("ADR-011 P3 #24: continueWithDefault timeout — late user response injects
|
|
|
704
697
|
continueWithDefault: true,
|
|
705
698
|
}));
|
|
706
699
|
|
|
707
|
-
// T80 is awaiting_review (not pending)
|
|
700
|
+
// T80 is awaiting_review (not pending), but scheduler detection still
|
|
701
|
+
// pauses until the user explicitly responds.
|
|
708
702
|
assert.equal(getTask("M001", "S01", "T80")?.escalation_awaiting_review, 1);
|
|
709
703
|
assert.equal(getTask("M001", "S01", "T80")?.escalation_pending, 0);
|
|
710
|
-
assert.equal(detectPendingEscalation([getTask("M001", "S01", "T80")!], base),
|
|
704
|
+
assert.equal(detectPendingEscalation([getTask("M001", "S01", "T80")!], base), "T80");
|
|
711
705
|
|
|
712
|
-
//
|
|
706
|
+
// Prompt injection must still wait for a response.
|
|
713
707
|
assert.equal(
|
|
714
708
|
claimOverrideForInjection(base, "M001", "S01"),
|
|
715
709
|
null,
|
|
716
|
-
"
|
|
717
|
-
);
|
|
718
|
-
assert.equal(
|
|
719
|
-
claimOverrideForInjection(base, "M001", "S01"),
|
|
720
|
-
null,
|
|
721
|
-
"T82's prompt build must also not claim the unresolved awaiting_review",
|
|
710
|
+
"unresolved awaiting_review must not be claimed as a default response",
|
|
722
711
|
);
|
|
723
712
|
|
|
724
713
|
// The response window remains open across N tasks — still no override applied.
|
|
@@ -728,7 +717,7 @@ test("ADR-011 P3 #24: continueWithDefault timeout — late user response injects
|
|
|
728
717
|
"applied_at must stay null throughout the response window",
|
|
729
718
|
);
|
|
730
719
|
|
|
731
|
-
// Phase 2 — user responds
|
|
720
|
+
// Phase 2 — user responds with a different option than the recommendation.
|
|
732
721
|
const resolveResult = resolveEscalation(
|
|
733
722
|
base, "M001", "S01", "T80", "B", "after reviewing, B is the call",
|
|
734
723
|
);
|
|
@@ -53,6 +53,24 @@ test('runExecSandbox: captures stdout, persists artifacts, returns digest', asyn
|
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
+
test('runExecSandbox: persists optional request metadata', async () => {
|
|
57
|
+
const base = freshBase();
|
|
58
|
+
try {
|
|
59
|
+
const result = await runExecSandbox(
|
|
60
|
+
{
|
|
61
|
+
runtime: 'bash',
|
|
62
|
+
script: 'echo metadata-ok',
|
|
63
|
+
metadata: { kind: 'uat_exec', intent: 'uat-artifact-check' },
|
|
64
|
+
},
|
|
65
|
+
baseOpts(base),
|
|
66
|
+
);
|
|
67
|
+
const meta = JSON.parse(readFileSync(result.meta_path, 'utf-8')) as Record<string, unknown>;
|
|
68
|
+
assert.deepEqual(meta.metadata, { kind: 'uat_exec', intent: 'uat-artifact-check' });
|
|
69
|
+
} finally {
|
|
70
|
+
cleanup(base);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
56
74
|
test('runExecSandbox: enforces stdout cap and marks truncation', async () => {
|
|
57
75
|
const base = freshBase();
|
|
58
76
|
try {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import { registerExecTools } from "../bootstrap/exec-tools.ts";
|
|
5
|
+
import { executeUatExec } from "../tools/exec-tool.ts";
|
|
6
|
+
import type { ExecSandboxRequest, ExecSandboxResult } from "../exec-sandbox.ts";
|
|
7
|
+
|
|
8
|
+
function makeExecResult(request: ExecSandboxRequest): ExecSandboxResult {
|
|
9
|
+
return {
|
|
10
|
+
id: "exec-1",
|
|
11
|
+
runtime: request.runtime,
|
|
12
|
+
exit_code: 0,
|
|
13
|
+
signal: null,
|
|
14
|
+
timed_out: false,
|
|
15
|
+
duration_ms: 1,
|
|
16
|
+
stdout_bytes: 12,
|
|
17
|
+
stderr_bytes: 0,
|
|
18
|
+
stdout_truncated: false,
|
|
19
|
+
stderr_truncated: false,
|
|
20
|
+
stdout_path: ".gsd/exec/exec-1.stdout",
|
|
21
|
+
stderr_path: ".gsd/exec/exec-1.stderr",
|
|
22
|
+
meta_path: ".gsd/exec/exec-1.meta.json",
|
|
23
|
+
digest: "check passed",
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
test("executeUatExec accepts evidence-mode aliases for intent", async () => {
|
|
28
|
+
const requests: ExecSandboxRequest[] = [];
|
|
29
|
+
const result = await executeUatExec(
|
|
30
|
+
{
|
|
31
|
+
milestoneId: "M001",
|
|
32
|
+
sliceId: "S01",
|
|
33
|
+
checkId: "UAT-PRE",
|
|
34
|
+
intent: "artifact",
|
|
35
|
+
runtime: "bash",
|
|
36
|
+
script: "printf ok",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
baseDir: "/tmp/gsd-uat-exec-test",
|
|
40
|
+
preferences: null,
|
|
41
|
+
run: async (request) => {
|
|
42
|
+
requests.push(request);
|
|
43
|
+
return makeExecResult(request);
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
assert.equal(result.isError, false);
|
|
49
|
+
assert.equal(result.details?.operation, "gsd_uat_exec");
|
|
50
|
+
assert.equal(result.details?.intent, "uat-artifact-check");
|
|
51
|
+
assert.equal(requests[0]?.metadata?.intent, "uat-artifact-check");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("registerExecTools exposes gsd_uat_exec intent as recoverable string schema", () => {
|
|
55
|
+
const tools: Array<{ name: string; parameters: any }> = [];
|
|
56
|
+
registerExecTools({
|
|
57
|
+
registerTool: (tool: { name: string; parameters: any }) => {
|
|
58
|
+
tools.push(tool);
|
|
59
|
+
},
|
|
60
|
+
} as any);
|
|
61
|
+
|
|
62
|
+
const tool = tools.find((registeredTool) => registeredTool.name === "gsd_uat_exec");
|
|
63
|
+
assert.ok(tool, "gsd_uat_exec should be registered");
|
|
64
|
+
const intentSchema = tool.parameters.properties.intent;
|
|
65
|
+
assert.equal(intentSchema.type, "string");
|
|
66
|
+
assert.equal("anyOf" in intentSchema, false);
|
|
67
|
+
assert.match(intentSchema.description, /uat-artifact-check/);
|
|
68
|
+
assert.match(intentSchema.description, /artifact/);
|
|
69
|
+
});
|
|
@@ -41,3 +41,23 @@ test("forensics prompt routes issue creation through bash tool, not github_issue
|
|
|
41
41
|
"Prompt must instruct use of the bash tool for issue creation",
|
|
42
42
|
);
|
|
43
43
|
});
|
|
44
|
+
|
|
45
|
+
test("forensics prompt provides paste-once fallback when bash is unavailable", () => {
|
|
46
|
+
const prompt = readPrompt("forensics");
|
|
47
|
+
|
|
48
|
+
assert.match(
|
|
49
|
+
prompt,
|
|
50
|
+
/If `bash` is unavailable/i,
|
|
51
|
+
"Prompt must branch when bash cannot be activated",
|
|
52
|
+
);
|
|
53
|
+
assert.match(
|
|
54
|
+
prompt,
|
|
55
|
+
/paste-once shell script/i,
|
|
56
|
+
"Prompt must provide a user-runnable fallback instead of an impossible tool call",
|
|
57
|
+
);
|
|
58
|
+
assert.match(
|
|
59
|
+
prompt,
|
|
60
|
+
/Searching closed issues for possible duplicates/i,
|
|
61
|
+
"Fallback script must preserve the duplicate-search step for the user",
|
|
62
|
+
);
|
|
63
|
+
});
|
|
@@ -24,13 +24,16 @@ test("forensics prompt renders compact investigation and issue routing guidance"
|
|
|
24
24
|
forensicData: "stuck-detected event for execute-task/M001/S01/T01",
|
|
25
25
|
gsdSourceDir: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
|
|
26
26
|
dedupSection: "No duplicate issue found.",
|
|
27
|
+
toolingSection: "## Filing Tool Availability\n\n- `bash`: available\n- `write`: available",
|
|
27
28
|
});
|
|
28
29
|
|
|
29
30
|
assert.match(prompt, /Investigation Protocol/);
|
|
31
|
+
assert.match(prompt, /Filing Tool Availability/);
|
|
30
32
|
assert.match(prompt, /gsd_milestone_status/);
|
|
31
33
|
assert.match(prompt, /sqlite3 .gsd\/gsd.db/);
|
|
32
34
|
assert.match(prompt, /gh issue create --repo open-gsd\/gsd-pi/);
|
|
33
35
|
assert.match(prompt, /Do NOT use the `github_issues` tool/);
|
|
36
|
+
assert.match(prompt, /paste-once shell script/);
|
|
34
37
|
assert.match(prompt, /Redaction Rules/);
|
|
35
38
|
assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
|
|
36
39
|
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Verifies /gsd forensics scopes issue-filing tools for its queued turn.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
applyForensicsToolScope,
|
|
9
|
+
buildForensicsToolingSection,
|
|
10
|
+
createForensicsToolScope,
|
|
11
|
+
restoreForensicsToolScope,
|
|
12
|
+
} from "../forensics.ts";
|
|
13
|
+
|
|
14
|
+
function tool(name: string): { name: string } {
|
|
15
|
+
return { name };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
test("forensics adds registered filing tools for the queued turn and restores the prior tools", () => {
|
|
19
|
+
const originalTools = ["read"];
|
|
20
|
+
let activeTools = [...originalTools];
|
|
21
|
+
const pi = {
|
|
22
|
+
getActiveTools: () => [...activeTools],
|
|
23
|
+
getAllTools: () => ["read", "bash", "write"].map(tool),
|
|
24
|
+
setActiveTools: (tools: string[]) => {
|
|
25
|
+
activeTools = [...tools];
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const scope = createForensicsToolScope(pi as any);
|
|
30
|
+
|
|
31
|
+
assert.deepEqual(scope.savedTools, originalTools);
|
|
32
|
+
assert.deepEqual(scope.activeToolsForTurn, ["read", "bash", "write"]);
|
|
33
|
+
assert.deepEqual(scope.availableFilingTools, ["bash", "write"]);
|
|
34
|
+
assert.deepEqual(scope.missingFilingTools, []);
|
|
35
|
+
assert.equal(scope.toolsChanged, true);
|
|
36
|
+
assert.deepEqual(activeTools, originalTools, "scope creation must not mutate active tools");
|
|
37
|
+
|
|
38
|
+
applyForensicsToolScope(pi as any, scope);
|
|
39
|
+
assert.deepEqual(activeTools, ["read", "bash", "write"]);
|
|
40
|
+
|
|
41
|
+
const toolingSection = buildForensicsToolingSection(scope);
|
|
42
|
+
assert.match(toolingSection, /`bash`: available/);
|
|
43
|
+
assert.match(toolingSection, /`write`: available/);
|
|
44
|
+
assert.match(toolingSection, /GitHub duplicate-check and issue-creation protocols/);
|
|
45
|
+
|
|
46
|
+
restoreForensicsToolScope(pi as any, scope);
|
|
47
|
+
assert.deepEqual(activeTools, originalTools);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("forensics tooling guidance falls back when bash is not registered", () => {
|
|
51
|
+
let activeTools = ["read"];
|
|
52
|
+
const pi = {
|
|
53
|
+
getActiveTools: () => [...activeTools],
|
|
54
|
+
getAllTools: () => ["read", "write"].map(tool),
|
|
55
|
+
setActiveTools: (tools: string[]) => {
|
|
56
|
+
activeTools = [...tools];
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const scope = createForensicsToolScope(pi as any);
|
|
61
|
+
|
|
62
|
+
assert.deepEqual(scope.availableFilingTools, ["write"]);
|
|
63
|
+
assert.deepEqual(scope.missingFilingTools, ["bash"]);
|
|
64
|
+
assert.deepEqual(scope.activeToolsForTurn, ["read", "write"]);
|
|
65
|
+
|
|
66
|
+
const toolingSection = buildForensicsToolingSection(scope);
|
|
67
|
+
assert.match(toolingSection, /`bash`: unavailable/);
|
|
68
|
+
assert.match(toolingSection, /paste-once shell script fallback/);
|
|
69
|
+
});
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* gsd-pi / guided-flow — regression tests for Gate 1b
|
|
2
|
+
* gsd-pi / guided-flow — regression tests for Gate 1b discussion handoff
|
|
3
3
|
*
|
|
4
|
-
* Gate 1b
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* → emit recovery hint directing the LLM to retry gsd_plan_milestone.
|
|
8
|
-
* (b) discuss-incomplete: discuss did not finish, no CONTEXT.md, DB row "queued".
|
|
9
|
-
* → silent block (no recovery hint).
|
|
4
|
+
* Gate 1b treats queued + pinned CONTEXT.md as Discussion Complete, Planning
|
|
5
|
+
* Pending. It must accept the handoff without warning the user or injecting a
|
|
6
|
+
* hidden gsd_plan_milestone retry.
|
|
10
7
|
*/
|
|
11
8
|
|
|
12
9
|
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
@@ -27,8 +24,6 @@ import {
|
|
|
27
24
|
insertMilestone,
|
|
28
25
|
} from "../gsd-db.ts";
|
|
29
26
|
|
|
30
|
-
// ─── Harness ───────────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
27
|
interface MockCapture {
|
|
33
28
|
notifies: Array<{ msg: string; level: string }>;
|
|
34
29
|
messages: Array<{ payload: any; options: any }>;
|
|
@@ -58,24 +53,26 @@ function mkPi(cap: MockCapture): any {
|
|
|
58
53
|
};
|
|
59
54
|
}
|
|
60
55
|
|
|
61
|
-
/**
|
|
62
|
-
* Create a minimal temp tree with a .gsd/milestones/M001 directory.
|
|
63
|
-
*/
|
|
64
56
|
function mkBase(): string {
|
|
65
57
|
const base = mkdtempSync(join(tmpdir(), "gsd-gate1b-"));
|
|
66
58
|
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
67
59
|
return base;
|
|
68
60
|
}
|
|
69
61
|
|
|
70
|
-
|
|
62
|
+
function writeContext(base: string): void {
|
|
63
|
+
writeFileSync(
|
|
64
|
+
join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
|
|
65
|
+
"# M001: Test Milestone\n\nContext written by discuss phase.\n",
|
|
66
|
+
);
|
|
67
|
+
}
|
|
71
68
|
|
|
72
|
-
describe("Gate 1b
|
|
69
|
+
describe("Gate 1b discussion handoff in checkAutoStartAfterDiscuss", () => {
|
|
73
70
|
let base: string;
|
|
74
71
|
let cap: MockCapture;
|
|
75
72
|
|
|
76
73
|
beforeEach(() => {
|
|
77
74
|
clearPendingAutoStart();
|
|
78
|
-
drainLogs();
|
|
75
|
+
drainLogs();
|
|
79
76
|
});
|
|
80
77
|
|
|
81
78
|
afterEach(() => {
|
|
@@ -86,104 +83,59 @@ describe("Gate 1b orphan discrimination in checkAutoStartAfterDiscuss", () => {
|
|
|
86
83
|
}
|
|
87
84
|
});
|
|
88
85
|
|
|
89
|
-
test("
|
|
86
|
+
test("queued row + CONTEXT.md accepts context-captured handoff without hidden retry", () => {
|
|
90
87
|
base = mkBase();
|
|
91
88
|
openDatabase(":memory:");
|
|
92
|
-
|
|
93
|
-
// DB row exists with status "queued" (plan_milestone was blocked)
|
|
94
89
|
insertMilestone({ id: "M001", title: "Test Milestone", status: "queued" });
|
|
95
|
-
|
|
96
|
-
// CONTEXT.md on disk (discuss phase completed)
|
|
97
|
-
writeFileSync(
|
|
98
|
-
join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
|
|
99
|
-
"# M001: Test Milestone\n\nContext written by discuss phase.\n",
|
|
100
|
-
);
|
|
90
|
+
writeContext(base);
|
|
101
91
|
|
|
102
92
|
cap = mkCapture();
|
|
103
93
|
setPendingAutoStart(base, {
|
|
104
94
|
basePath: base,
|
|
105
95
|
milestoneId: "M001",
|
|
96
|
+
startAuto: false,
|
|
106
97
|
ctx: mkCtx(cap),
|
|
107
98
|
pi: mkPi(cap),
|
|
108
99
|
});
|
|
109
100
|
|
|
110
101
|
const result = checkAutoStartAfterDiscuss();
|
|
111
102
|
|
|
112
|
-
|
|
113
|
-
assert.equal(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
"exactly one sendMessage call expected for the recovery hint",
|
|
120
|
-
);
|
|
121
|
-
assert.equal(
|
|
122
|
-
cap.messages[0].payload.customType,
|
|
123
|
-
"gsd-plan-milestone-blocked-recovery",
|
|
124
|
-
"recovery message must have customType gsd-plan-milestone-blocked-recovery",
|
|
125
|
-
);
|
|
103
|
+
assert.equal(result, true, "queued + context is a valid planning-pending handoff");
|
|
104
|
+
assert.equal(cap.messages.length, 0, "must not inject a hidden recovery turn");
|
|
105
|
+
assert.equal(cap.notifies.length, 1, "must emit one success notification");
|
|
106
|
+
assert.deepEqual(cap.notifies[0], {
|
|
107
|
+
msg: "Milestone M001 context captured. Continuing the planning pipeline.",
|
|
108
|
+
level: "success",
|
|
109
|
+
});
|
|
126
110
|
assert.equal(
|
|
127
|
-
cap.
|
|
128
|
-
|
|
129
|
-
"
|
|
130
|
-
);
|
|
131
|
-
assert.match(
|
|
132
|
-
cap.messages[0].payload.content,
|
|
133
|
-
/gsd_plan_milestone/,
|
|
134
|
-
"recovery message content must mention gsd_plan_milestone",
|
|
111
|
+
cap.notifies.some(n => /queued|gsd_plan_milestone/i.test(n.msg)),
|
|
112
|
+
false,
|
|
113
|
+
"user-visible copy must not mention queued state or internal plan tool retry",
|
|
135
114
|
);
|
|
136
|
-
|
|
137
|
-
// User must be notified via ctx.ui.notify
|
|
138
|
-
assert.ok(
|
|
139
|
-
cap.notifies.some((n) => n.level === "warning" && /queued/.test(n.msg)),
|
|
140
|
-
"user must be notified with a warning about the queued state",
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
// logWarning must have recorded the Gate 1b event
|
|
144
|
-
const logs = drainLogs();
|
|
145
|
-
const gate1bLog = logs.find(
|
|
146
|
-
(e) => e.component === "guided" && /Gate 1b/.test(e.message),
|
|
147
|
-
);
|
|
148
|
-
assert.ok(gate1bLog, "Gate 1b warning must be logged via logWarning");
|
|
149
115
|
});
|
|
150
116
|
|
|
151
|
-
test("
|
|
117
|
+
test("queued row without CONTEXT.md still waits silently for discussion output", () => {
|
|
152
118
|
base = mkBase();
|
|
153
119
|
openDatabase(":memory:");
|
|
154
|
-
|
|
155
|
-
// DB row exists with status "queued", but NO CONTEXT.md on disk
|
|
156
120
|
insertMilestone({ id: "M001", title: "Test Milestone", status: "queued" });
|
|
157
121
|
|
|
158
|
-
// No CONTEXT.md written — discuss phase is incomplete
|
|
159
122
|
cap = mkCapture();
|
|
160
123
|
setPendingAutoStart(base, {
|
|
161
124
|
basePath: base,
|
|
162
125
|
milestoneId: "M001",
|
|
126
|
+
startAuto: false,
|
|
163
127
|
ctx: mkCtx(cap),
|
|
164
128
|
pi: mkPi(cap),
|
|
165
129
|
});
|
|
166
130
|
|
|
167
|
-
drainLogs();
|
|
131
|
+
drainLogs();
|
|
168
132
|
|
|
169
133
|
const result = checkAutoStartAfterDiscuss();
|
|
170
134
|
|
|
171
|
-
|
|
172
|
-
assert.equal(
|
|
173
|
-
|
|
174
|
-
// No recovery hint — Gate 1 blocks before Gate 1b is reached
|
|
175
|
-
assert.equal(
|
|
176
|
-
cap.messages.length,
|
|
177
|
-
0,
|
|
178
|
-
"no sendMessage calls expected when CONTEXT.md is absent",
|
|
179
|
-
);
|
|
180
|
-
assert.equal(
|
|
181
|
-
cap.notifies.length,
|
|
182
|
-
0,
|
|
183
|
-
"no user notifications expected for discuss-incomplete case",
|
|
184
|
-
);
|
|
135
|
+
assert.equal(result, false, "must keep waiting while discuss has not written context");
|
|
136
|
+
assert.equal(cap.messages.length, 0, "no hidden recovery turn expected");
|
|
137
|
+
assert.equal(cap.notifies.length, 0, "no user notifications expected");
|
|
185
138
|
|
|
186
|
-
// No Gate 1b log entry
|
|
187
139
|
const logs = drainLogs();
|
|
188
140
|
const gate1bLog = logs.find(
|
|
189
141
|
(e) => e.component === "guided" && /Gate 1b/.test(e.message),
|