@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.6ccd27b3
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +450 -217
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +41 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -59
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +41 -24
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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/api/update/route.js.nft.json +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 +12 -12
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-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/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- 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 +13 -0
- 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 +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- 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 +7 -0
- 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 +8 -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-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- 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 +12 -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-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.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 +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +239 -153
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +256 -145
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.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.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +534 -228
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +49 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +211 -59
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +41 -24
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Typed contract for which tool lifecycle hooks fire under which
|
|
3
|
+
// engine, plus the single seam for tool-name normalization.
|
|
4
|
+
//
|
|
5
|
+
// ── Why this contract exists ────────────────────────────────────────────────
|
|
6
|
+
// External engines (claude-code-cli) pre-execute tools inside the vendor CLI
|
|
7
|
+
// and hand the agent loop a `toolCall.externalResult`. The loop short-circuits
|
|
8
|
+
// before `beforeToolCall`/`afterToolCall` ever run for those calls
|
|
9
|
+
// (packages/pi-agent-core/src/agent-loop.ts, prepareToolCall: the
|
|
10
|
+
// externalResult branch returns an "immediate" outcome before the
|
|
11
|
+
// config.beforeToolCall invocation, and "immediate" outcomes skip
|
|
12
|
+
// finalizeExecutedToolCall where config.afterToolCall lives).
|
|
13
|
+
// `beforeToolCall`/`afterToolCall` are exactly what the extension runner maps
|
|
14
|
+
// to the `tool_call`/`tool_result` extension events
|
|
15
|
+
// (packages/gsd-agent-core/src/session/agent-session-extensions.ts,
|
|
16
|
+
// installAgentToolHooks).
|
|
17
|
+
//
|
|
18
|
+
// `tool_execution_start` is emitted unconditionally before prepareToolCall
|
|
19
|
+
// and `tool_execution_end` after every finalized outcome — immediate or
|
|
20
|
+
// executed — so those two are the ONLY tool lifecycle hooks that fire for
|
|
21
|
+
// every tool call on every engine.
|
|
22
|
+
//
|
|
23
|
+
// Consequence: any enforcement attached only to `tool_call` (blocking) or
|
|
24
|
+
// `tool_result` (rewriting) is silently dead under external engines. Safety
|
|
25
|
+
// enforcement must ride `tool_execution_start`/`tool_execution_end`, or
|
|
26
|
+
// mirror across both with toolCallId dedup. See the per-registration contract
|
|
27
|
+
// comments in bootstrap/register-hooks.ts for how each registered hook
|
|
28
|
+
// honors (or knowingly violates) this contract.
|
|
29
|
+
|
|
30
|
+
import { stripMcpToolPrefix } from "./mcp-tool-name.js";
|
|
31
|
+
import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Tool lifecycle hooks that fire for EVERY tool call on EVERY engine,
|
|
35
|
+
* including external engines (claude-code-cli) that pre-execute tools.
|
|
36
|
+
* Attach safety-critical enforcement and evidence collection here.
|
|
37
|
+
*/
|
|
38
|
+
export const UNIVERSAL_TOOL_HOOKS = ["tool_execution_start", "tool_execution_end"] as const;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Tool lifecycle hooks that fire ONLY for natively executed tools. External
|
|
42
|
+
* engines pre-execute tools (externalResult), short-circuiting the agent
|
|
43
|
+
* loop's beforeToolCall/afterToolCall — so handlers on these events never run
|
|
44
|
+
* for those calls. Blocking guards attached only here are dead under external
|
|
45
|
+
* engines; they need a tool_execution_start mirror to be universal.
|
|
46
|
+
*/
|
|
47
|
+
export const NATIVE_ONLY_TOOL_HOOKS = ["tool_call", "tool_result"] as const;
|
|
48
|
+
|
|
49
|
+
export type UniversalToolHook = (typeof UNIVERSAL_TOOL_HOOKS)[number];
|
|
50
|
+
export type NativeOnlyToolHook = (typeof NATIVE_ONLY_TOOL_HOOKS)[number];
|
|
51
|
+
|
|
52
|
+
// Non-tool lifecycle events (session_start, agent_end, message_update, ...)
|
|
53
|
+
// are intentionally NOT classified here: they are emitted by the session
|
|
54
|
+
// host / extension runner independent of tool execution, so the external
|
|
55
|
+
// engine short-circuit above does not apply to them. Only classify events
|
|
56
|
+
// whose engine behavior has been verified against the agent loop.
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Canonical tool name: strips the `mcp__<server>__` prefix when present,
|
|
60
|
+
* nothing else. Use for identity checks against host/native tool names and
|
|
61
|
+
* for any guard that must NOT conflate workflow aliases with their canonical
|
|
62
|
+
* tools (e.g. write gates, evidence keys).
|
|
63
|
+
*
|
|
64
|
+
* Malformed MCP names (empty server or empty tool segment, e.g.
|
|
65
|
+
* `mcp____tool` or `mcp__server__`) are returned unchanged.
|
|
66
|
+
*/
|
|
67
|
+
export function canonicalToolName(toolName: string): string {
|
|
68
|
+
return stripMcpToolPrefix(toolName);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Workflow-aware canonical tool name: strips the MCP prefix AND resolves
|
|
73
|
+
* workflow tool aliases to their canonical contract names. Use whenever the
|
|
74
|
+
* name is compared against the workflow tool surface (scoping, presentation,
|
|
75
|
+
* dispatch) — plain {@link canonicalToolName} would miss alias spellings.
|
|
76
|
+
*/
|
|
77
|
+
export function canonicalWorkflowToolName(toolName: string): string {
|
|
78
|
+
return canonicalWorkflowSurfaceToolName(toolName);
|
|
79
|
+
}
|
|
@@ -12,6 +12,7 @@ import { spawn } from "node:child_process";
|
|
|
12
12
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { randomUUID } from "node:crypto";
|
|
14
14
|
import { resolve } from "node:path";
|
|
15
|
+
import { killProcessTree, SIGKILL_GRACE_MS, HARD_DEADLINE_MS } from "@gsd/pi-coding-agent";
|
|
15
16
|
|
|
16
17
|
export interface ExecSandboxRequest {
|
|
17
18
|
/** Interpreter to use. */
|
|
@@ -47,6 +48,17 @@ export interface ExecSandboxOptions {
|
|
|
47
48
|
now?: () => Date;
|
|
48
49
|
/** Optional override for id generation (tests). */
|
|
49
50
|
generateId?: () => string;
|
|
51
|
+
/**
|
|
52
|
+
* Grace period (ms) between SIGTERM and SIGKILL on timeout.
|
|
53
|
+
* Defaults to SIGKILL_GRACE_MS. Exposed as a test seam.
|
|
54
|
+
*/
|
|
55
|
+
kill_grace_ms?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Delay (ms) after a kill is initiated before the hard-deadline force-resolves
|
|
58
|
+
* the promise (handles D-state / non-closing children).
|
|
59
|
+
* Defaults to SIGKILL_GRACE_MS + HARD_DEADLINE_MS. Exposed as a test seam.
|
|
60
|
+
*/
|
|
61
|
+
force_resolve_delay_ms?: number;
|
|
50
62
|
}
|
|
51
63
|
|
|
52
64
|
export interface ExecSandboxResult {
|
|
@@ -55,6 +67,12 @@ export interface ExecSandboxResult {
|
|
|
55
67
|
exit_code: number | null;
|
|
56
68
|
signal: NodeJS.Signals | null;
|
|
57
69
|
timed_out: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* True when the result came from the hard-deadline force-resolve (a non-closing
|
|
72
|
+
* D-state child that never emitted 'close') rather than an observed process exit.
|
|
73
|
+
* In that case `signal` is the synthetic "SIGKILL" marker, not a delivered signal.
|
|
74
|
+
*/
|
|
75
|
+
force_resolved: boolean;
|
|
58
76
|
duration_ms: number;
|
|
59
77
|
stdout_bytes: number;
|
|
60
78
|
stderr_bytes: number;
|
|
@@ -68,6 +86,10 @@ export interface ExecSandboxResult {
|
|
|
68
86
|
|
|
69
87
|
const ALWAYS_FORWARD_ENV = ["PATH", "HOME"] as const;
|
|
70
88
|
|
|
89
|
+
// SIGKILL_GRACE_MS / HARD_DEADLINE_MS are imported from @gsd/pi-coding-agent
|
|
90
|
+
// (shell.ts) — the single source of truth for the graceful-kill timing ladder —
|
|
91
|
+
// so this sandbox can never drift from the canonical kill path it delegates to.
|
|
92
|
+
|
|
71
93
|
export const EXEC_DEFAULTS = {
|
|
72
94
|
clampTimeoutMs: 600_000,
|
|
73
95
|
defaultTimeoutMs: 30_000,
|
|
@@ -180,6 +202,7 @@ export function runExecSandbox(
|
|
|
180
202
|
exit_code: null,
|
|
181
203
|
signal: null,
|
|
182
204
|
timed_out: false,
|
|
205
|
+
force_resolved: false,
|
|
183
206
|
duration_ms: duration,
|
|
184
207
|
stdout_bytes: 0,
|
|
185
208
|
stderr_bytes: Buffer.byteLength(`spawn error: ${message}\n`),
|
|
@@ -233,23 +256,39 @@ export function runExecSandbox(
|
|
|
233
256
|
}
|
|
234
257
|
});
|
|
235
258
|
|
|
259
|
+
const effectiveGraceMs = opts.kill_grace_ms ?? SIGKILL_GRACE_MS;
|
|
260
|
+
const effectiveForceResolveDelay = opts.force_resolve_delay_ms ?? (effectiveGraceMs + HARD_DEADLINE_MS);
|
|
261
|
+
|
|
236
262
|
let timedOut = false;
|
|
263
|
+
let settled = false;
|
|
264
|
+
let forceResolveTimer: NodeJS.Timeout | undefined;
|
|
265
|
+
|
|
237
266
|
const timer = setTimeout(() => {
|
|
238
267
|
timedOut = true;
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
268
|
+
// killProcessTree handles both platforms and kills the whole tree: on Unix
|
|
269
|
+
// it signals the process group (SIGTERM -> grace -> SIGKILL); on Windows it
|
|
270
|
+
// force-kills the tree via taskkill /F /T. Using child.kill("SIGTERM") here
|
|
271
|
+
// would only terminate the direct child on Windows, orphaning grandchildren.
|
|
272
|
+
if (child.pid != null) {
|
|
273
|
+
killProcessTree(child.pid, { graceMs: effectiveGraceMs });
|
|
245
274
|
} else {
|
|
246
|
-
child.kill("
|
|
275
|
+
child.kill("SIGTERM");
|
|
247
276
|
}
|
|
277
|
+
// Arm hard-deadline force-resolve in case child never closes (D-state).
|
|
278
|
+
// The "SIGKILL" here is a synthetic marker (the process may not have actually
|
|
279
|
+
// received it); force_resolved=true records that this was a deadline, not an exit.
|
|
280
|
+
forceResolveTimer = setTimeout(() => {
|
|
281
|
+
finalize(null, "SIGKILL", true);
|
|
282
|
+
}, effectiveForceResolveDelay);
|
|
283
|
+
forceResolveTimer.unref?.();
|
|
248
284
|
}, timeoutMs);
|
|
249
285
|
timer.unref?.();
|
|
250
286
|
|
|
251
|
-
const finalize = (exitCode: number | null, signal: NodeJS.Signals | null) => {
|
|
287
|
+
const finalize = (exitCode: number | null, signal: NodeJS.Signals | null, forceResolved = false) => {
|
|
288
|
+
if (settled) return;
|
|
289
|
+
settled = true;
|
|
252
290
|
clearTimeout(timer);
|
|
291
|
+
clearTimeout(forceResolveTimer);
|
|
253
292
|
const duration = Date.now() - started;
|
|
254
293
|
const stdoutBuf = Buffer.concat(stdoutChunks);
|
|
255
294
|
const stderrBuf = Buffer.concat(stderrChunks);
|
|
@@ -274,6 +313,7 @@ export function runExecSandbox(
|
|
|
274
313
|
exit_code: exitCode,
|
|
275
314
|
signal,
|
|
276
315
|
timed_out: timedOut,
|
|
316
|
+
force_resolved: forceResolved,
|
|
277
317
|
duration_ms: duration,
|
|
278
318
|
stdout_bytes: stdoutBytes,
|
|
279
319
|
stderr_bytes: stderrBytes,
|
|
@@ -324,6 +364,7 @@ function writeMeta(
|
|
|
324
364
|
exit_code: result.exit_code,
|
|
325
365
|
signal: result.signal,
|
|
326
366
|
timed_out: result.timed_out,
|
|
367
|
+
force_resolved: result.force_resolved,
|
|
327
368
|
duration_ms: result.duration_ms,
|
|
328
369
|
stdout_bytes: result.stdout_bytes,
|
|
329
370
|
stderr_bytes: result.stderr_bytes,
|
|
@@ -331,7 +372,6 @@ function writeMeta(
|
|
|
331
372
|
stderr_truncated: result.stderr_truncated,
|
|
332
373
|
stdout_path: result.stdout_path,
|
|
333
374
|
stderr_path: result.stderr_path,
|
|
334
|
-
...(request.metadata ? { metadata: request.metadata } : {}),
|
|
335
375
|
};
|
|
336
376
|
writeFileSync(path, `${JSON.stringify(meta, null, 2)}\n`);
|
|
337
377
|
}
|
|
@@ -671,33 +671,54 @@ export function parseTaskPlanIO(content: string): { inputFiles: string[]; output
|
|
|
671
671
|
*/
|
|
672
672
|
export type UatType = 'artifact-driven' | 'live-runtime' | 'human-experience' | 'mixed' | 'browser-executable' | 'runtime-executable';
|
|
673
673
|
|
|
674
|
+
/** Canonical list of recognised UAT types — uat-policy.ts re-exports this as UAT_TYPES. */
|
|
675
|
+
export const UAT_TYPE_KEYWORDS: readonly UatType[] = [
|
|
676
|
+
'artifact-driven',
|
|
677
|
+
'browser-executable',
|
|
678
|
+
'runtime-executable',
|
|
679
|
+
'live-runtime',
|
|
680
|
+
'mixed',
|
|
681
|
+
'human-experience',
|
|
682
|
+
];
|
|
683
|
+
|
|
684
|
+
/** Match a value against the recognised UAT type keywords (leading-keyword-only). */
|
|
685
|
+
function matchUatTypeKeyword(value: string): UatType | undefined {
|
|
686
|
+
const normalized = value.trim().toLowerCase();
|
|
687
|
+
return UAT_TYPE_KEYWORDS.find(keyword => normalized.startsWith(keyword));
|
|
688
|
+
}
|
|
689
|
+
|
|
674
690
|
/**
|
|
675
691
|
* Extract the UAT type from a UAT file's raw content.
|
|
676
692
|
*
|
|
677
693
|
* UAT files have no YAML frontmatter - pass raw file content directly.
|
|
678
694
|
* Classification is leading-keyword-only: e.g. `mixed (artifact-driven + live-runtime)` → `'mixed'`.
|
|
679
695
|
*
|
|
696
|
+
* The canonical form is a `- UAT mode: <type>` bullet under `## UAT Type`
|
|
697
|
+
* (case-insensitive prefix, `**bold**` tolerated). When no such line exists,
|
|
698
|
+
* a line that itself starts with a recognised keyword — e.g. a bare
|
|
699
|
+
* `browser-executable` under the heading — is accepted, so agent-authored
|
|
700
|
+
* format drift does not silently fall back to artifact-driven.
|
|
701
|
+
*
|
|
680
702
|
* Returns `undefined` when:
|
|
681
703
|
* - the `## UAT Type` section is absent
|
|
682
|
-
* -
|
|
683
|
-
* -
|
|
704
|
+
* - a `UAT mode:` line exists but its value starts with no recognised keyword
|
|
705
|
+
* - no line in the section starts with `UAT mode:` or a recognised keyword
|
|
684
706
|
*/
|
|
685
707
|
export function extractUatType(content: string): UatType | undefined {
|
|
686
708
|
const sectionText = extractSection(content, 'UAT Type');
|
|
687
709
|
if (!sectionText) return undefined;
|
|
688
710
|
|
|
689
|
-
const
|
|
690
|
-
const modeBullet = bullets.find(b => b.startsWith('UAT mode:'));
|
|
691
|
-
if (!modeBullet) return undefined;
|
|
711
|
+
const lines = parseBullets(sectionText).map(line => line.replace(/\*\*/g, ''));
|
|
692
712
|
|
|
693
|
-
const
|
|
713
|
+
for (const line of lines) {
|
|
714
|
+
const declared = /^uat mode:\s*(.*)$/i.exec(line);
|
|
715
|
+
if (declared) return matchUatTypeKeyword(declared[1]);
|
|
716
|
+
}
|
|
694
717
|
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
if (rawValue.startsWith('human-experience')) return 'human-experience';
|
|
700
|
-
if (rawValue.startsWith('mixed')) return 'mixed';
|
|
718
|
+
for (const line of lines) {
|
|
719
|
+
const matched = matchUatTypeKeyword(line);
|
|
720
|
+
if (matched) return matched;
|
|
721
|
+
}
|
|
701
722
|
|
|
702
723
|
return undefined;
|
|
703
724
|
}
|
|
@@ -66,7 +66,7 @@ function disabled(description: string, reason: string): string {
|
|
|
66
66
|
|
|
67
67
|
export function buildGsdHomeModel(
|
|
68
68
|
state: GSDState,
|
|
69
|
-
closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones">,
|
|
69
|
+
closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones" | "idleResidueHint">,
|
|
70
70
|
): GsdHomeModel {
|
|
71
71
|
const blocked = isBlocked(state);
|
|
72
72
|
const complete = state.phase === "complete";
|
|
@@ -74,10 +74,14 @@ export function buildGsdHomeModel(
|
|
|
74
74
|
const workLabel = activeWorkLabel(state);
|
|
75
75
|
const strandedQuick = closeout?.strandedQuick ?? null;
|
|
76
76
|
const unmergedMilestone = closeout?.unmergedMilestones?.[0];
|
|
77
|
+
const idleResidueHint = closeout?.idleResidueHint ?? null;
|
|
78
|
+
const hasIdleResidue = Boolean(idleResidueHint);
|
|
77
79
|
const nextReason = complete
|
|
78
80
|
? "all milestones are complete"
|
|
79
81
|
: blocked
|
|
80
82
|
? "the active milestone is blocked"
|
|
83
|
+
: hasIdleResidue
|
|
84
|
+
? "milestone git residue needs recovery"
|
|
81
85
|
: !hasActiveWork
|
|
82
86
|
? "there is no active milestone"
|
|
83
87
|
: "";
|
|
@@ -91,6 +95,8 @@ export function buildGsdHomeModel(
|
|
|
91
95
|
? "finish_milestone"
|
|
92
96
|
: blocked
|
|
93
97
|
? "fix_recover"
|
|
98
|
+
: hasIdleResidue
|
|
99
|
+
? "fix_recover"
|
|
94
100
|
: canAdvance
|
|
95
101
|
? "continue_step"
|
|
96
102
|
: complete && unmappedActive > 0
|
|
@@ -107,6 +113,8 @@ export function buildGsdHomeModel(
|
|
|
107
113
|
? [`Quick task Q${strandedQuick.taskNum} finished on ${strandedQuick.quickBranch} but is not merged to ${strandedQuick.originalBranch}.`]
|
|
108
114
|
: unmergedMilestone
|
|
109
115
|
? [`${unmergedMilestone.milestoneId} is complete but not merged into ${unmergedMilestone.integrationBranch}.`]
|
|
116
|
+
: idleResidueHint
|
|
117
|
+
? [idleResidueHint.message]
|
|
110
118
|
: completionSummary;
|
|
111
119
|
|
|
112
120
|
return {
|
|
@@ -181,10 +189,12 @@ export function buildGsdHomeModel(
|
|
|
181
189
|
label: "Fix or recover",
|
|
182
190
|
description: blocked
|
|
183
191
|
? "Review the blocker and recovery commands for the active milestone."
|
|
192
|
+
: hasIdleResidue
|
|
193
|
+
? "Review stranded milestone worktrees/branches and run the suggested recovery command."
|
|
184
194
|
: disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
|
|
185
|
-
enabled: blocked,
|
|
195
|
+
enabled: blocked || hasIdleResidue,
|
|
186
196
|
recommended: recommended === "fix_recover",
|
|
187
|
-
disabledReason: blocked ? undefined : "no blocker is active",
|
|
197
|
+
disabledReason: blocked || hasIdleResidue ? undefined : "no blocker is active",
|
|
188
198
|
},
|
|
189
199
|
{
|
|
190
200
|
id: "start_configure",
|
|
@@ -246,9 +246,9 @@ export function insertMilestone(m: {
|
|
|
246
246
|
status?: string;
|
|
247
247
|
depends_on?: string[];
|
|
248
248
|
planning?: Partial<MilestonePlanningRecord>;
|
|
249
|
-
}):
|
|
249
|
+
}): boolean {
|
|
250
250
|
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
251
|
-
getDbOrNull()!.prepare(
|
|
251
|
+
const result = getDbOrNull()!.prepare(
|
|
252
252
|
`INSERT OR IGNORE INTO milestones (
|
|
253
253
|
id, title, status, depends_on, created_at,
|
|
254
254
|
vision, success_criteria, key_risks, proof_strategy,
|
|
@@ -279,7 +279,8 @@ export function insertMilestone(m: {
|
|
|
279
279
|
":definition_of_done": JSON.stringify(m.planning?.definitionOfDone ?? []),
|
|
280
280
|
":requirement_coverage": m.planning?.requirementCoverage ?? "",
|
|
281
281
|
":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
|
|
282
|
-
});
|
|
282
|
+
}) as { changes?: number };
|
|
283
|
+
return (result.changes ?? 0) > 0;
|
|
283
284
|
}
|
|
284
285
|
|
|
285
286
|
export function upsertMilestonePlanning(milestoneId: string, planning: Partial<MilestonePlanningRecord> & { title?: string; status?: string; depends_on?: string[] }): void {
|
|
@@ -88,6 +88,84 @@ export function needsRemediationBlockerGuidance(milestoneId: string): string {
|
|
|
88
88
|
].join("\n");
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
// ─── Milestone closeout UAT sign-off blockers ───────────────────────────
|
|
92
|
+
// The first sentence is the blocker finding; the numbered steps are the
|
|
93
|
+
// resolution path. `verdict` is the recorded non-PASS verdict, or undefined
|
|
94
|
+
// when no verdict has been recorded at all.
|
|
95
|
+
|
|
96
|
+
export function uatSignoffBlockerGuidance(
|
|
97
|
+
milestoneId: string,
|
|
98
|
+
sliceId: string,
|
|
99
|
+
verdict?: string,
|
|
100
|
+
): string {
|
|
101
|
+
const finding =
|
|
102
|
+
verdict === undefined
|
|
103
|
+
? `missing UAT PASS verdict for ${sliceId}`
|
|
104
|
+
: `UAT verdict for ${sliceId} is "${verdict}"`;
|
|
105
|
+
const sliceSpecificRerunStep =
|
|
106
|
+
`If ${sliceId} is not the most recently completed slice, type a chat request to re-run UAT for ${sliceId}; run-uat will record the verdict through \`gsd_uat_result_save\`.`;
|
|
107
|
+
const steps =
|
|
108
|
+
verdict === undefined
|
|
109
|
+
? [
|
|
110
|
+
`1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
|
|
111
|
+
`2. ${sliceSpecificRerunStep}`,
|
|
112
|
+
`3. Review the UAT criteria and progress: \`/gsd status\``,
|
|
113
|
+
`4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
114
|
+
]
|
|
115
|
+
: [
|
|
116
|
+
`1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
|
|
117
|
+
`2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
|
|
118
|
+
`3. ${sliceSpecificRerunStep}`,
|
|
119
|
+
`4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
|
|
120
|
+
`5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
121
|
+
];
|
|
122
|
+
return [
|
|
123
|
+
`Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
|
|
124
|
+
`Fix options:`,
|
|
125
|
+
...steps,
|
|
126
|
+
].join("\n");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ─── Worktree isolation degradation ─────────────────────────────────────
|
|
130
|
+
// The first sentence of each notice is load-bearing for log matching and
|
|
131
|
+
// tests — keep it intact and append guidance after it.
|
|
132
|
+
|
|
133
|
+
function restoreIsolationHint(milestoneId: string): string {
|
|
134
|
+
return `To restore isolation: close any processes using the old worktree, merge salvageable work with \`/gsd worktree merge ${milestoneId}\` or remove the stale worktree with \`/gsd worktree remove ${milestoneId}\`, then run \`/gsd doctor fix\`.`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function worktreeCreationFailedGuidance(milestoneId: string, error: string): string {
|
|
138
|
+
return [
|
|
139
|
+
`Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
|
|
140
|
+
`Worktree isolation is degraded for this session.`,
|
|
141
|
+
restoreIsolationHint(milestoneId),
|
|
142
|
+
].join("\n");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function isolationDegradedFallbackGuidance(milestoneId: string): string {
|
|
146
|
+
return [
|
|
147
|
+
`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
|
|
148
|
+
`Work continues safely on the milestone branch in the project root.`,
|
|
149
|
+
restoreIsolationHint(milestoneId),
|
|
150
|
+
].join("\n");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
|
|
154
|
+
export function milestoneEntryBlockedGuidance(
|
|
155
|
+
milestoneId: string,
|
|
156
|
+
reason: "creation-failed" | "isolation-degraded",
|
|
157
|
+
): string {
|
|
158
|
+
const finding =
|
|
159
|
+
reason === "creation-failed"
|
|
160
|
+
? `worktree/branch creation failed. Isolation is degraded.`
|
|
161
|
+
: `isolation is degraded from a prior worktree failure.`;
|
|
162
|
+
return [
|
|
163
|
+
`Cannot enter milestone ${milestoneId}: ${finding}`,
|
|
164
|
+
restoreIsolationHint(milestoneId),
|
|
165
|
+
`Then run \`/gsd auto\` to retry.`,
|
|
166
|
+
].join("\n");
|
|
167
|
+
}
|
|
168
|
+
|
|
91
169
|
// ─── Crash recovery resume hints ────────────────────────────────────────
|
|
92
170
|
|
|
93
171
|
/** Resume hint for an interrupted auto-mode unit, by unit class. */
|
|
@@ -76,13 +76,25 @@ import {
|
|
|
76
76
|
countUnmappedActiveRequirements,
|
|
77
77
|
showRequirementsBacklogReview,
|
|
78
78
|
} from "./requirements-backlog.js";
|
|
79
|
-
import { selectAndApplyModel } from "./auto-model-selection.js";
|
|
79
|
+
import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
|
|
80
80
|
import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
|
|
81
81
|
import {
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
detectWorkflowMcpLaunchConfig,
|
|
83
|
+
resolveWorkflowMcpProjectRoot,
|
|
84
84
|
supportsStructuredQuestions,
|
|
85
85
|
} from "./workflow-mcp.js";
|
|
86
|
+
import { usesWorkflowMcpTransport } from "./question-transport.js";
|
|
87
|
+
import {
|
|
88
|
+
getCachedWorkflowMcpProbe,
|
|
89
|
+
probeAndCacheWorkflowMcp,
|
|
90
|
+
warmWorkflowMcpProbeInBackground,
|
|
91
|
+
workflowMcpProbeAdvertisesSurface,
|
|
92
|
+
WORKFLOW_MCP_PROBE_TIMEOUT_MS,
|
|
93
|
+
} from "./workflow-mcp-readiness-cache.js";
|
|
94
|
+
import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
|
|
95
|
+
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
96
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
97
|
+
import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
|
|
86
98
|
import {
|
|
87
99
|
runPreparation,
|
|
88
100
|
formatCodebaseBrief,
|
|
@@ -555,7 +567,7 @@ interface DispatchWorkflowOptions {
|
|
|
555
567
|
deps?: {
|
|
556
568
|
loadPreferences?: typeof loadEffectiveGSDPreferences;
|
|
557
569
|
selectModel?: typeof selectAndApplyModel;
|
|
558
|
-
|
|
570
|
+
getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessError;
|
|
559
571
|
};
|
|
560
572
|
}
|
|
561
573
|
|
|
@@ -563,6 +575,93 @@ export function resolveGuidedDispatchProjectRoot(basePath?: string): string {
|
|
|
563
575
|
return basePath ?? process.cwd();
|
|
564
576
|
}
|
|
565
577
|
|
|
578
|
+
/**
|
|
579
|
+
* Wait until the workflow MCP server is reachable and advertising its tool
|
|
580
|
+
* surface. Returns failure details when timed out, or null when ready (or MCP
|
|
581
|
+
* is not the transport). Called inside dispatchWorkflow() so every guided-flow
|
|
582
|
+
* dispatch path is gated automatically.
|
|
583
|
+
*/
|
|
584
|
+
const MCP_READINESS_TIMEOUT_MS = 15_000;
|
|
585
|
+
const MCP_READINESS_POLL_MS = 200;
|
|
586
|
+
|
|
587
|
+
export interface WorkflowMcpReadinessFailure {
|
|
588
|
+
server: string;
|
|
589
|
+
error?: string;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
async function awaitWorkflowMcpReadiness(
|
|
593
|
+
pi: ExtensionAPI,
|
|
594
|
+
ctx: ExtensionContext,
|
|
595
|
+
basePath: string,
|
|
596
|
+
options: {
|
|
597
|
+
unitType?: string;
|
|
598
|
+
timeoutMs?: number;
|
|
599
|
+
pollMs?: number;
|
|
600
|
+
probeTimeoutMs?: number;
|
|
601
|
+
probe?: typeof probeAndCacheWorkflowMcp;
|
|
602
|
+
} = {},
|
|
603
|
+
): Promise<WorkflowMcpReadinessFailure | null> {
|
|
604
|
+
const provider = ctx.model?.provider;
|
|
605
|
+
const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
|
|
606
|
+
if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl)) return null;
|
|
607
|
+
|
|
608
|
+
const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
|
|
609
|
+
const launch = detectWorkflowMcpLaunchConfig(projectRoot);
|
|
610
|
+
if (!launch) return null;
|
|
611
|
+
|
|
612
|
+
const requiredTools = options.unitType
|
|
613
|
+
? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
|
|
614
|
+
: [];
|
|
615
|
+
const coversExpectedSurface = (tools: readonly string[]) =>
|
|
616
|
+
requiredTools.length > 0
|
|
617
|
+
? probeCoversRequiredWorkflowTools(tools, requiredTools)
|
|
618
|
+
: workflowMcpProbeAdvertisesSurface(tools);
|
|
619
|
+
|
|
620
|
+
const serverPrefix = `mcp__${launch.name}__`;
|
|
621
|
+
const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
|
|
622
|
+
const systemPromptCoversExpectedSurface = () => {
|
|
623
|
+
const prompt = systemPrompt();
|
|
624
|
+
return requiredTools.length > 0
|
|
625
|
+
? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
|
|
626
|
+
: prompt.includes(serverPrefix);
|
|
627
|
+
};
|
|
628
|
+
const sessionAlreadyReady = () =>
|
|
629
|
+
coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
|
|
630
|
+
systemPromptCoversExpectedSurface();
|
|
631
|
+
if (sessionAlreadyReady()) return null;
|
|
632
|
+
|
|
633
|
+
if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
const probe = options.probe ?? probeAndCacheWorkflowMcp;
|
|
638
|
+
const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
|
|
639
|
+
|
|
640
|
+
ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
|
|
641
|
+
let lastError: string | undefined;
|
|
642
|
+
const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
|
|
643
|
+
const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
|
|
644
|
+
while (Date.now() < deadline) {
|
|
645
|
+
if (sessionAlreadyReady()) {
|
|
646
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
647
|
+
return null;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
|
|
651
|
+
if (result.ok && coversExpectedSurface(result.tools)) {
|
|
652
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
653
|
+
return null;
|
|
654
|
+
}
|
|
655
|
+
lastError = result.error;
|
|
656
|
+
|
|
657
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
658
|
+
}
|
|
659
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
660
|
+
return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
|
|
664
|
+
|
|
566
665
|
/**
|
|
567
666
|
* Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
|
|
568
667
|
* This is the only way the wizard triggers work — everything else is the LLM's job.
|
|
@@ -584,7 +683,8 @@ async function dispatchWorkflow(
|
|
|
584
683
|
const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
|
|
585
684
|
const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
|
|
586
685
|
const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
|
|
587
|
-
const
|
|
686
|
+
const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
|
|
687
|
+
?? getUnitWorkflowDispatchReadinessError;
|
|
588
688
|
|
|
589
689
|
// Route through the dynamic routing pipeline (complexity classification,
|
|
590
690
|
// tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
|
|
@@ -603,29 +703,49 @@ async function dispatchWorkflow(
|
|
|
603
703
|
});
|
|
604
704
|
}
|
|
605
705
|
|
|
606
|
-
const compatibilityError =
|
|
607
|
-
result.appliedModel?.provider ?? ctx.model?.provider,
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
? ctx.modelRegistry.getProviderAuthMode(
|
|
615
|
-
:
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
// here — not whether MCP tools are pre-registered in the parent session.
|
|
623
|
-
},
|
|
624
|
-
);
|
|
706
|
+
const compatibilityError = getDispatchReadinessError({
|
|
707
|
+
provider: result.appliedModel?.provider ?? ctx.model?.provider,
|
|
708
|
+
projectRoot,
|
|
709
|
+
surface: "guided flow",
|
|
710
|
+
unitType,
|
|
711
|
+
authMode: result.appliedModel?.provider
|
|
712
|
+
? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
|
|
713
|
+
: ctx.model?.provider
|
|
714
|
+
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
715
|
+
: undefined,
|
|
716
|
+
baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
|
|
717
|
+
// Guided flow starts the MCP workflow server as part of dispatch, so the
|
|
718
|
+
// parent session's activeTools doesn't include MCP tools yet. The MCP
|
|
719
|
+
// launch config check (detectWorkflowMcpLaunchConfig) is the right gate
|
|
720
|
+
// here — not whether MCP tools are pre-registered in the parent session.
|
|
721
|
+
});
|
|
625
722
|
if (compatibilityError) {
|
|
626
723
|
ctx.ui.notify(compatibilityError, "error");
|
|
627
724
|
return;
|
|
628
725
|
}
|
|
726
|
+
|
|
727
|
+
// ── Live MCP readiness gate ────────────────────────────────────────
|
|
728
|
+
// Units with required workflow tools must not dispatch until the MCP
|
|
729
|
+
// surface covers that exact contract; otherwise the model can race into
|
|
730
|
+
// "No such tool available" before recovery sees a clean readiness error.
|
|
731
|
+
warmWorkflowMcpProbeInBackground(projectRoot);
|
|
732
|
+
const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
|
|
733
|
+
const strictBlocking = requiredWorkflowTools.length > 0
|
|
734
|
+
&& (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
|
|
735
|
+
if (strictBlocking) {
|
|
736
|
+
// If the workflow MCP server is configured but still connecting, wait
|
|
737
|
+
// for it instead of dispatching into a child session that will abort.
|
|
738
|
+
const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
|
|
739
|
+
if (readinessFailure) {
|
|
740
|
+
const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
|
|
741
|
+
ctx.ui.notify(
|
|
742
|
+
`GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
|
|
743
|
+
`Run \`/gsd mcp check ${readinessFailure.server}\` for details.`,
|
|
744
|
+
"warning",
|
|
745
|
+
);
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
629
749
|
}
|
|
630
750
|
|
|
631
751
|
// Scope tools for guided workflow turns (#2949, token-consumption savings).
|
|
@@ -1708,6 +1828,7 @@ export async function showSmartEntry(
|
|
|
1708
1828
|
options?: { step?: boolean },
|
|
1709
1829
|
): Promise<void> {
|
|
1710
1830
|
const stepMode = options?.step ?? true;
|
|
1831
|
+
warmWorkflowMcpProbeInBackground(basePath);
|
|
1711
1832
|
|
|
1712
1833
|
// ── Clear stale milestone ID reservations from previous cancelled sessions ──
|
|
1713
1834
|
// Reservations only need to survive within a single /gsd interaction.
|