@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.9bb7453
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 +44 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -4
- 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 +2 -1
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +83 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +39 -14
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- 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 +30 -69
- 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/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 +48 -24
- 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/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-presentation-plan.js +120 -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 +403 -3
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- 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 -1
- 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 +6 -6
- 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 +6 -6
- 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/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 +38 -0
- 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/types.d.ts +3 -0
- 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 +406 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +484 -116
- 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/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/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 +53 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +4 -4
- 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 +2 -1
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +90 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +60 -19
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- 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 +91 -83
- 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/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 +48 -24
- 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/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-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/browser-evidence.test.ts +142 -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-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/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.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -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/migration-auto-check.test.ts +3 -3
- 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 +53 -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 +35 -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/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 +213 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +167 -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 +489 -3
- 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/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 -1
- 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/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
|
@@ -60,12 +60,13 @@ import { getAutoWorktreePath, isInAutoWorktree, checkoutBranchWithStashGuard } f
|
|
|
60
60
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
61
61
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
62
62
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
63
|
+
import { queryJournal } from "./journal.js";
|
|
63
64
|
import { initMetrics } from "./metrics.js";
|
|
64
65
|
import { initRoutingHistory } from "./routing-history.js";
|
|
65
66
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
66
67
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
67
68
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
68
|
-
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
|
|
69
|
+
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus, updateMilestoneStatus } from "./gsd-db.js";
|
|
69
70
|
import { isClosedStatus } from "./status-guards.js";
|
|
70
71
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
71
72
|
import { extractVerdict } from "./verdict-parser.js";
|
|
@@ -100,6 +101,7 @@ import {
|
|
|
100
101
|
} from "./preferences-models.js";
|
|
101
102
|
import type { WorktreeLifecycle } from "./worktree-lifecycle.js";
|
|
102
103
|
import { getSessionModelOverride } from "./session-model-override.js";
|
|
104
|
+
import { setAutoActiveStatus } from "./auto-dashboard.js";
|
|
103
105
|
|
|
104
106
|
export interface BootstrapDeps {
|
|
105
107
|
shouldUseWorktreeIsolation: (basePath?: string) => boolean;
|
|
@@ -187,6 +189,40 @@ export function reconcileProjectMilestonesFromDisk(basePath: string): number {
|
|
|
187
189
|
}
|
|
188
190
|
}
|
|
189
191
|
|
|
192
|
+
export function reconcileMergedMilestonesFromJournal(basePath: string): number {
|
|
193
|
+
if (!isDbAvailable()) return 0;
|
|
194
|
+
|
|
195
|
+
const mergedAtByMilestone = new Map<string, string>();
|
|
196
|
+
for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
|
|
197
|
+
const data = entry.data ?? {};
|
|
198
|
+
const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
|
|
199
|
+
if (!milestoneId) continue;
|
|
200
|
+
if (data.conflict === true) continue;
|
|
201
|
+
|
|
202
|
+
const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
|
|
203
|
+
const previous = mergedAtByMilestone.get(milestoneId);
|
|
204
|
+
if (!previous || endedAt > previous) mergedAtByMilestone.set(milestoneId, endedAt);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let closed = 0;
|
|
208
|
+
for (const [milestoneId, completedAt] of mergedAtByMilestone) {
|
|
209
|
+
const existing = getMilestone(milestoneId);
|
|
210
|
+
if (!existing) {
|
|
211
|
+
insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
|
|
212
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
213
|
+
closed++;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!isClosedStatus(existing.status)) {
|
|
217
|
+
updateMilestoneStatus(milestoneId, "complete", completedAt);
|
|
218
|
+
closed++;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (closed > 0) invalidateAllCaches();
|
|
223
|
+
return closed;
|
|
224
|
+
}
|
|
225
|
+
|
|
190
226
|
/**
|
|
191
227
|
* Audit for orphaned milestone branches at bootstrap.
|
|
192
228
|
*
|
|
@@ -258,6 +294,7 @@ export interface OrphanAuditAction {
|
|
|
258
294
|
message: string;
|
|
259
295
|
severity: "info" | "warning";
|
|
260
296
|
branch?: string;
|
|
297
|
+
mainBranch?: string;
|
|
261
298
|
commitsAhead?: number;
|
|
262
299
|
dirtyWorktree?: boolean;
|
|
263
300
|
worktreeDirExists?: boolean;
|
|
@@ -276,6 +313,27 @@ function isBlockingStrandedWorkAction(action: OrphanAuditAction): boolean {
|
|
|
276
313
|
return action.kind === "in-progress-stranded-work" && action.blocksAuto;
|
|
277
314
|
}
|
|
278
315
|
|
|
316
|
+
function strandedWorkEvidence(args: {
|
|
317
|
+
branch?: string;
|
|
318
|
+
commitsAhead: number;
|
|
319
|
+
mainBranch: string;
|
|
320
|
+
dirtyWorktree: boolean;
|
|
321
|
+
}): string[] {
|
|
322
|
+
const evidence: string[] = [];
|
|
323
|
+
if (args.branch && args.commitsAhead > 0) {
|
|
324
|
+
evidence.push(
|
|
325
|
+
`branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
if (args.dirtyWorktree) {
|
|
329
|
+
evidence.push("the worktree has uncommitted changes");
|
|
330
|
+
}
|
|
331
|
+
if (evidence.length === 0) {
|
|
332
|
+
evidence.push("physical git evidence exists");
|
|
333
|
+
}
|
|
334
|
+
return evidence;
|
|
335
|
+
}
|
|
336
|
+
|
|
279
337
|
function detectWorktreeEvidence(
|
|
280
338
|
basePath: string,
|
|
281
339
|
milestoneId: string,
|
|
@@ -307,18 +365,7 @@ function strandedWorkMessage(args: {
|
|
|
307
365
|
worktreeDirExists: boolean;
|
|
308
366
|
recoveryMode: StrandedWorkRecoveryMode;
|
|
309
367
|
}): string {
|
|
310
|
-
const evidence
|
|
311
|
-
if (args.branch && args.commitsAhead > 0) {
|
|
312
|
-
evidence.push(
|
|
313
|
-
`branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
if (args.dirtyWorktree) {
|
|
317
|
-
evidence.push("the worktree has uncommitted changes");
|
|
318
|
-
}
|
|
319
|
-
if (evidence.length === 0) {
|
|
320
|
-
evidence.push("physical git evidence exists");
|
|
321
|
-
}
|
|
368
|
+
const evidence = strandedWorkEvidence(args);
|
|
322
369
|
|
|
323
370
|
const wtSuffix = args.worktreeDirExists
|
|
324
371
|
? ` Worktree directory at .gsd/worktrees/${args.milestoneId}/ holds live work.`
|
|
@@ -334,6 +381,45 @@ function strandedWorkMessage(args: {
|
|
|
334
381
|
);
|
|
335
382
|
}
|
|
336
383
|
|
|
384
|
+
function formatStrandedWorkRecoveryMessage(action: OrphanAuditAction): string {
|
|
385
|
+
const recoveryMode = action.recoveryMode === "worktree"
|
|
386
|
+
? "existing worktree"
|
|
387
|
+
: "milestone branch";
|
|
388
|
+
const evidence = strandedWorkEvidence({
|
|
389
|
+
branch: action.branch,
|
|
390
|
+
commitsAhead: action.commitsAhead ?? 0,
|
|
391
|
+
mainBranch: action.mainBranch ?? "main",
|
|
392
|
+
dirtyWorktree: action.dirtyWorktree ?? false,
|
|
393
|
+
});
|
|
394
|
+
const wtSuffix = action.worktreeDirExists
|
|
395
|
+
? ` Worktree directory at .gsd/worktrees/${action.milestoneId}/ holds live work.`
|
|
396
|
+
: "";
|
|
397
|
+
return (
|
|
398
|
+
`Resuming saved milestone work for ${action.milestoneId}: ${evidence.join("; ")}.` +
|
|
399
|
+
wtSuffix +
|
|
400
|
+
` Adopting the ${recoveryMode} before dispatching new units. Park or discard explicitly if abandoning.`
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
function formatStrandedWorkBlockerMessage(
|
|
405
|
+
action: OrphanAuditAction,
|
|
406
|
+
activeMilestoneId: string | null,
|
|
407
|
+
): string {
|
|
408
|
+
const target = action.milestoneId;
|
|
409
|
+
const mode = action.recoveryMode === "worktree" ? "existing worktree" : "milestone branch";
|
|
410
|
+
const intro = activeMilestoneId
|
|
411
|
+
? `Stranded work for ${target} blocks auto-mode before ${activeMilestoneId}.`
|
|
412
|
+
: `Stranded work for ${target} blocks auto-mode, but that milestone is not active in project state.`;
|
|
413
|
+
|
|
414
|
+
return [
|
|
415
|
+
intro,
|
|
416
|
+
"Choose one explicit next step:",
|
|
417
|
+
`1. Recover it: run \`/gsd auto ${target}\` to adopt the ${mode}.`,
|
|
418
|
+
`2. Defer it: run \`/gsd park ${target} "reason"\`, then rerun \`/gsd auto\`.`,
|
|
419
|
+
`3. Abandon it: run \`/gsd rethink\` and explicitly discard ${target}.`,
|
|
420
|
+
].join("\n");
|
|
421
|
+
}
|
|
422
|
+
|
|
337
423
|
export function auditOrphanedMilestoneBranches(
|
|
338
424
|
basePath: string,
|
|
339
425
|
_isolationMode: "worktree" | "branch" | "none",
|
|
@@ -435,6 +521,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
435
521
|
kind: "in-progress-stranded-work",
|
|
436
522
|
milestoneId,
|
|
437
523
|
branch,
|
|
524
|
+
mainBranch,
|
|
438
525
|
commitsAhead,
|
|
439
526
|
dirtyWorktree: worktreeEvidence.dirty,
|
|
440
527
|
worktreeDirExists: worktreeEvidence.dirExists,
|
|
@@ -589,6 +676,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
589
676
|
pushAction({
|
|
590
677
|
kind: "in-progress-stranded-work",
|
|
591
678
|
milestoneId: m.id,
|
|
679
|
+
mainBranch,
|
|
592
680
|
commitsAhead: 0,
|
|
593
681
|
dirtyWorktree: true,
|
|
594
682
|
worktreeDirExists: worktreeEvidence.dirExists,
|
|
@@ -1066,6 +1154,7 @@ export async function bootstrapAutoSession(
|
|
|
1066
1154
|
await openProjectDbIfPresent(base);
|
|
1067
1155
|
registerAutoWorkerForSession(base);
|
|
1068
1156
|
reconcileProjectMilestonesFromDisk(base);
|
|
1157
|
+
reconcileMergedMilestonesFromJournal(base);
|
|
1069
1158
|
|
|
1070
1159
|
// Clean stale runtime unit files for completed milestones (#887).
|
|
1071
1160
|
// DB-authoritative: when DB is available, require DB status to be closed
|
|
@@ -1103,7 +1192,13 @@ export async function bootstrapAutoSession(
|
|
|
1103
1192
|
for (const msg of auditResult.recovered) {
|
|
1104
1193
|
ctx.ui.notify(`Orphan audit: ${msg}`, "info");
|
|
1105
1194
|
}
|
|
1195
|
+
const deferredStrandedMessages = new Set(
|
|
1196
|
+
auditResult.actions
|
|
1197
|
+
.filter(isBlockingStrandedWorkAction)
|
|
1198
|
+
.map((action) => action.message),
|
|
1199
|
+
);
|
|
1106
1200
|
for (const msg of auditResult.warnings) {
|
|
1201
|
+
if (deferredStrandedMessages.has(msg)) continue;
|
|
1107
1202
|
const prefix = msg.startsWith("Stranded work") ? "" : "Orphan audit: ";
|
|
1108
1203
|
ctx.ui.notify(`${prefix}${msg}`, "warning");
|
|
1109
1204
|
}
|
|
@@ -1177,21 +1272,21 @@ export async function bootstrapAutoSession(
|
|
|
1177
1272
|
if (blockingStrandedRecoveryAction) {
|
|
1178
1273
|
if (!state.activeMilestone) {
|
|
1179
1274
|
ctx.ui.notify(
|
|
1180
|
-
|
|
1275
|
+
formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null),
|
|
1181
1276
|
"error",
|
|
1182
1277
|
);
|
|
1183
1278
|
return releaseLockAndReturn();
|
|
1184
1279
|
}
|
|
1185
1280
|
if (state.activeMilestone.id !== blockingStrandedRecoveryAction.milestoneId) {
|
|
1186
1281
|
ctx.ui.notify(
|
|
1187
|
-
|
|
1282
|
+
formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, state.activeMilestone.id),
|
|
1188
1283
|
"error",
|
|
1189
1284
|
);
|
|
1190
1285
|
return releaseLockAndReturn();
|
|
1191
1286
|
}
|
|
1192
1287
|
strandedRecoveryAction = blockingStrandedRecoveryAction;
|
|
1193
1288
|
ctx.ui.notify(
|
|
1194
|
-
|
|
1289
|
+
formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
|
|
1195
1290
|
"info",
|
|
1196
1291
|
);
|
|
1197
1292
|
}
|
|
@@ -1663,7 +1758,7 @@ export async function bootstrapAutoSession(
|
|
|
1663
1758
|
snapshotSkills();
|
|
1664
1759
|
}
|
|
1665
1760
|
|
|
1666
|
-
ctx
|
|
1761
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
1667
1762
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
1668
1763
|
const modeLabel = s.stepMode ? "Step-mode" : "Auto-mode";
|
|
1669
1764
|
const pendingCount = (state.registry ?? []).filter(
|
|
@@ -94,7 +94,7 @@ export function clearInFlightTools(): void {
|
|
|
94
94
|
* from the tool handler. When these errors occur, retrying the same unit will
|
|
95
95
|
* produce the same failure, so the retry loop must be broken.
|
|
96
96
|
*/
|
|
97
|
-
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
97
|
+
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
98
98
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
99
99
|
|
|
100
100
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parseUnitId } from "./unit-id.js";
|
|
2
|
+
import { RUN_UAT_WORKFLOW_TOOL_NAMES } from "./tool-presentation-plan.js";
|
|
2
3
|
|
|
3
4
|
export const RUN_UAT_BROWSER_TOOL_NAMES = [
|
|
4
5
|
"browser_navigate",
|
|
@@ -44,7 +45,7 @@ export const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = {
|
|
|
44
45
|
"execute-task": ["gsd_task_complete", "gsd_decision_save"],
|
|
45
46
|
"execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
|
|
46
47
|
"reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
|
|
47
|
-
"run-uat": ["
|
|
48
|
+
"run-uat": [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent", ...RUN_UAT_BROWSER_TOOL_NAMES],
|
|
48
49
|
"gate-evaluate": ["gsd_save_gate_result"],
|
|
49
50
|
"rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
|
|
50
51
|
"workflow-preferences": ["gsd_summary_save"],
|
|
@@ -205,6 +205,7 @@ import {
|
|
|
205
205
|
updateProgressWidget as _updateProgressWidget,
|
|
206
206
|
setCompletionProgressWidget,
|
|
207
207
|
setAutoOutcomeWidget,
|
|
208
|
+
setAutoActiveStatus,
|
|
208
209
|
updateSliceProgressCache,
|
|
209
210
|
clearSliceProgressCache,
|
|
210
211
|
describeNextUnit as _describeNextUnit,
|
|
@@ -254,7 +255,12 @@ import {
|
|
|
254
255
|
postUnitPreVerification,
|
|
255
256
|
postUnitPostVerification,
|
|
256
257
|
} from "./auto-post-unit.js";
|
|
257
|
-
import {
|
|
258
|
+
import {
|
|
259
|
+
bootstrapAutoSession,
|
|
260
|
+
openProjectDbIfPresent,
|
|
261
|
+
reconcileMergedMilestonesFromJournal,
|
|
262
|
+
type BootstrapDeps,
|
|
263
|
+
} from "./auto-start.js";
|
|
258
264
|
import { initHealthWidget } from "./health-widget.js";
|
|
259
265
|
import { runLegacyAutoLoop, runUokKernelLoop } from "./auto/loop.js";
|
|
260
266
|
import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight } from "./auto/resolve.js";
|
|
@@ -2102,6 +2108,28 @@ export function createWiredDispatchAdapter(
|
|
|
2102
2108
|
return null;
|
|
2103
2109
|
}
|
|
2104
2110
|
|
|
2111
|
+
function shouldAdoptActiveMilestone(
|
|
2112
|
+
state: GSDState,
|
|
2113
|
+
activeSession: AutoSession | undefined,
|
|
2114
|
+
activeDispatchBasePath: string,
|
|
2115
|
+
): boolean {
|
|
2116
|
+
const activeMilestoneId = state.activeMilestone?.id;
|
|
2117
|
+
const currentMilestoneId = activeSession?.currentMilestoneId;
|
|
2118
|
+
if (!activeSession || !activeMilestoneId || !currentMilestoneId || activeMilestoneId === currentMilestoneId) {
|
|
2119
|
+
return false;
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
const scopedWorktreeMilestone =
|
|
2123
|
+
(activeSession.basePath ? detectWorktreeName(activeSession.basePath) : null) ??
|
|
2124
|
+
detectWorktreeName(activeDispatchBasePath);
|
|
2125
|
+
if (scopedWorktreeMilestone && scopedWorktreeMilestone !== activeMilestoneId) {
|
|
2126
|
+
return false;
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
const currentMilestone = state.registry.find((milestone) => milestone.id === currentMilestoneId);
|
|
2130
|
+
return !!currentMilestone && isClosedStatus(currentMilestone.status);
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2105
2133
|
return {
|
|
2106
2134
|
async decideNextUnit(input) {
|
|
2107
2135
|
const state = input.stateSnapshot;
|
|
@@ -2110,6 +2138,9 @@ export function createWiredDispatchAdapter(
|
|
|
2110
2138
|
|
|
2111
2139
|
const activeSession = input.session ?? session;
|
|
2112
2140
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
2141
|
+
if (activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
|
|
2142
|
+
activeSession.currentMilestoneId = active.id;
|
|
2143
|
+
}
|
|
2113
2144
|
const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
|
|
2114
2145
|
|
|
2115
2146
|
// Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
|
|
@@ -2280,10 +2311,20 @@ export function createWiredAutoOrchestrationModule(
|
|
|
2280
2311
|
async reconcileBeforeDispatch() {
|
|
2281
2312
|
const activeBasePath = getLiveDispatchBasePath();
|
|
2282
2313
|
const result = await reconcileBeforeDispatch(activeBasePath);
|
|
2283
|
-
|
|
2314
|
+
// Failure-path summaries written by gsd_summary_save create
|
|
2315
|
+
// artifact-db-status-divergence blockers for tasks that are still
|
|
2316
|
+
// pending (gsd_task_complete never ran). These tasks can still be
|
|
2317
|
+
// dispatched and the drift self-heals once they complete successfully.
|
|
2318
|
+
const hardBlockers = result.blockers.filter(
|
|
2319
|
+
(b) =>
|
|
2320
|
+
!b.includes("has SUMMARY artifact while DB status is") &&
|
|
2321
|
+
!b.includes("has SUMMARY on disk while DB status is") &&
|
|
2322
|
+
!b.includes("has task SUMMARY artifacts but no DB tasks"),
|
|
2323
|
+
);
|
|
2324
|
+
if (hardBlockers.length > 0) {
|
|
2284
2325
|
return {
|
|
2285
2326
|
ok: false,
|
|
2286
|
-
reason:
|
|
2327
|
+
reason: hardBlockers[0],
|
|
2287
2328
|
stateSnapshot: result.stateSnapshot,
|
|
2288
2329
|
};
|
|
2289
2330
|
}
|
|
@@ -2955,6 +2996,7 @@ export async function startAuto(
|
|
|
2955
2996
|
if (!getLedger()) initMetrics(base);
|
|
2956
2997
|
if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
|
|
2957
2998
|
await openProjectDbIfPresent(base);
|
|
2999
|
+
reconcileMergedMilestonesFromJournal(base);
|
|
2958
3000
|
registerAutoWorkerForSession(s, base);
|
|
2959
3001
|
|
|
2960
3002
|
// Re-register health level notification callback lost across process restart
|
|
@@ -2991,7 +3033,7 @@ export async function startAuto(
|
|
|
2991
3033
|
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
2992
3034
|
registerSigtermHandler(lockBase());
|
|
2993
3035
|
|
|
2994
|
-
ctx
|
|
3036
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
2995
3037
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
2996
3038
|
ctx.ui.notify(
|
|
2997
3039
|
s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.",
|
|
@@ -3320,7 +3362,7 @@ export async function dispatchHookUnit(
|
|
|
3320
3362
|
await pauseAuto(ctx, pi);
|
|
3321
3363
|
}, hookHardTimeoutMs);
|
|
3322
3364
|
|
|
3323
|
-
ctx
|
|
3365
|
+
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
3324
3366
|
ctx.ui.notify(`Running post-unit hook: ${hookName}`, "info");
|
|
3325
3367
|
|
|
3326
3368
|
debugLog("dispatchHookUnit", {
|
|
@@ -413,6 +413,92 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
413
413
|
pi.registerTool(summarySaveTool);
|
|
414
414
|
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
415
415
|
|
|
416
|
+
// ─── gsd_uat_result_save ─────────────────────────────────────────────────
|
|
417
|
+
|
|
418
|
+
const uatResultSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
419
|
+
const { executeUatResultSave } = await loadWorkflowExecutors();
|
|
420
|
+
return executeUatResultSave(params, resolveWorkflowToolBasePath(_ctx, params));
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
const uatEvidenceRef = Type.Object({
|
|
424
|
+
kind: StringEnum(["gsd_uat_exec", "gsd_exec", "screenshot", "log", "url", "browser"], { description: "Evidence kind" }),
|
|
425
|
+
ref: Type.String({ description: "Evidence ID, approved .gsd path, or URL" }),
|
|
426
|
+
note: Type.Optional(Type.String({ description: "Short evidence note" })),
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
const uatCheck = Type.Object({
|
|
430
|
+
id: Type.String({ description: "Stable check ID from the UAT spec" }),
|
|
431
|
+
description: Type.String({ description: "Check description" }),
|
|
432
|
+
mode: StringEnum(["artifact", "runtime", "browser", "human-follow-up"], { description: "Evidence mode" }),
|
|
433
|
+
result: StringEnum(["PASS", "FAIL", "NEEDS-HUMAN"], { description: "Check result" }),
|
|
434
|
+
evidence: Type.Optional(Type.Array(uatEvidenceRef, { description: "Objective evidence references" })),
|
|
435
|
+
notes: Type.Optional(Type.String({ description: "Observed result, failure notes, or human instruction" })),
|
|
436
|
+
nonAutomatable: Type.Optional(Type.Boolean({ description: "True when the check is explicitly non-automatable" })),
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
const toolPresentationBlock = Type.Object({
|
|
440
|
+
surface: StringEnum(["provider-tools", "claude-code-sdk", "mcp", "hybrid"], { description: "Tool presentation surface" }),
|
|
441
|
+
model: Type.Optional(Type.Object({
|
|
442
|
+
provider: Type.Optional(Type.String()),
|
|
443
|
+
api: Type.Optional(Type.String()),
|
|
444
|
+
id: Type.Optional(Type.String()),
|
|
445
|
+
})),
|
|
446
|
+
presentedTools: Type.Array(Type.String(), { description: "Tool names actually presented to the model" }),
|
|
447
|
+
blockedTools: Type.Array(Type.Object({
|
|
448
|
+
name: Type.String(),
|
|
449
|
+
reason: Type.String(),
|
|
450
|
+
}), { description: "Tool names blocked from the model with reasons" }),
|
|
451
|
+
aliases: Type.Optional(Type.Array(Type.Object({
|
|
452
|
+
requested: Type.String(),
|
|
453
|
+
canonical: Type.String(),
|
|
454
|
+
}))),
|
|
455
|
+
fallbackToolsUsed: Type.Optional(Type.Array(Type.String())),
|
|
456
|
+
toolPresentationPlanId: Type.Optional(Type.String()),
|
|
457
|
+
notes: Type.Optional(Type.String()),
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
const uatResultSaveTool = {
|
|
461
|
+
name: "gsd_uat_result_save",
|
|
462
|
+
label: "Save UAT Result",
|
|
463
|
+
description:
|
|
464
|
+
"Save a structured UAT result for a slice. Validates evidence, writes the ASSESSMENT artifact, " +
|
|
465
|
+
"records attempt history, and saves the aggregate UAT gate result.",
|
|
466
|
+
promptSnippet: "Save structured UAT checks, evidence, verdict, and tool-presentation proof",
|
|
467
|
+
promptGuidelines: [
|
|
468
|
+
"Call gsd_uat_result_save once after all UAT checks have been executed.",
|
|
469
|
+
"Every PASS or FAIL check must cite objective evidence, preferably a gsd_uat_exec evidence ID.",
|
|
470
|
+
"Include the presented and blocked tool set in presentation so tool timing is auditable.",
|
|
471
|
+
"Do not use raw gsd_summary_save as a substitute for UAT results.",
|
|
472
|
+
],
|
|
473
|
+
parameters: Type.Object({
|
|
474
|
+
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
475
|
+
sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
|
|
476
|
+
uatType: StringEnum(["artifact-driven", "browser-executable", "runtime-executable", "live-runtime", "mixed", "human-experience"], { description: "Declared UAT mode" }),
|
|
477
|
+
verdict: StringEnum(["PASS", "FAIL", "PARTIAL"], { description: "Overall UAT verdict" }),
|
|
478
|
+
checks: Type.Array(uatCheck, { description: "Structured check results" }),
|
|
479
|
+
presentation: toolPresentationBlock,
|
|
480
|
+
notes: Type.Optional(Type.String({ description: "Overall verdict rationale" })),
|
|
481
|
+
attempt: Type.Optional(Type.String({ description: "Attempt number or auto" })),
|
|
482
|
+
previousAttemptId: Type.Optional(Type.String({ description: "Prior attempt ID, when retrying" })),
|
|
483
|
+
}),
|
|
484
|
+
execute: uatResultSaveExecute,
|
|
485
|
+
renderCall(args: any, theme: any) {
|
|
486
|
+
let text = theme.fg("toolTitle", theme.bold("uat_result_save "));
|
|
487
|
+
text += theme.fg("accent", `${args.milestoneId ?? "?"}/${args.sliceId ?? "?"}`);
|
|
488
|
+
if (args.verdict) text += theme.fg("dim", ` → ${args.verdict}`);
|
|
489
|
+
return new Text(text, 0, 0);
|
|
490
|
+
},
|
|
491
|
+
renderResult(result: any, _options: any, theme: any) {
|
|
492
|
+
const d = readDetails(result);
|
|
493
|
+
if (result.isError || d?.error) {
|
|
494
|
+
return new Text(theme.fg("error", formatToolErrorText(result, d)), 0, 0);
|
|
495
|
+
}
|
|
496
|
+
return new Text(theme.fg("success", `UAT ${d?.sliceId ?? ""}: ${d?.verdict ?? "saved"}`), 0, 0);
|
|
497
|
+
},
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
pi.registerTool(uatResultSaveTool);
|
|
501
|
+
|
|
416
502
|
// ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
|
|
417
503
|
|
|
418
504
|
const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
|
|
@@ -746,7 +832,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
746
832
|
recommendation: Type.String({ description: "Option id the executor recommends." }),
|
|
747
833
|
recommendationRationale: Type.String({ description: "Why the recommendation — 1–2 sentences." }),
|
|
748
834
|
continueWithDefault: Type.Boolean({
|
|
749
|
-
description: "When true,
|
|
835
|
+
description: "When true, the recommendation is recorded as the default, but auto-mode still pauses until the user resolves via /gsd escalate resolve.",
|
|
750
836
|
}),
|
|
751
837
|
}, { description: "ADR-011 Phase 2: optional escalation payload. Only honored when phases.mid_execution_escalation is true." })),
|
|
752
838
|
verificationEvidence: Type.Optional(Type.Array(
|
|
@@ -795,7 +881,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
795
881
|
sliceTitle: Type.String({ description: "Title of the slice" }),
|
|
796
882
|
oneLiner: Type.String({ description: "One-line summary of what the slice accomplished" }),
|
|
797
883
|
narrative: Type.String({ description: "Detailed narrative of what happened across all tasks" }),
|
|
798
|
-
verification: Type.String({ description: "What was verified across all tasks" }),
|
|
884
|
+
verification: Type.Optional(Type.String({ description: "What was verified across all tasks — if omitted, summary records verification as passed without detail." })),
|
|
799
885
|
uatContent: Type.String({ description: "UAT test content (markdown body)" }),
|
|
800
886
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
801
887
|
deviations: Type.Optional(Type.String({ description: "Deviations from the slice plan, or 'None.'" })),
|
|
@@ -1009,7 +1095,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1009
1095
|
promptGuidelines: [
|
|
1010
1096
|
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
1011
1097
|
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verificationClasses (optional), verdictRationale, remediationPlan (optional).",
|
|
1012
|
-
"If verification classes were planned, verificationClasses must
|
|
1098
|
+
"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
1099
|
"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
1100
|
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
1015
1101
|
"On success, returns validationPath where VALIDATION.md was written.",
|
|
@@ -1022,7 +1108,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
|
|
|
1022
1108
|
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
1023
1109
|
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
1024
1110
|
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
1025
|
-
verificationClasses: Type.Optional(Type.String({ description: "
|
|
1111
|
+
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
1112
|
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
1027
1113
|
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
1028
1114
|
}),
|
|
@@ -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)",
|