@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
|
@@ -11,7 +11,11 @@ import { spawn } from "node:child_process";
|
|
|
11
11
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
12
12
|
import { randomUUID } from "node:crypto";
|
|
13
13
|
import { resolve } from "node:path";
|
|
14
|
+
import { killProcessTree, SIGKILL_GRACE_MS, HARD_DEADLINE_MS } from "@gsd/pi-coding-agent";
|
|
14
15
|
const ALWAYS_FORWARD_ENV = ["PATH", "HOME"];
|
|
16
|
+
// SIGKILL_GRACE_MS / HARD_DEADLINE_MS are imported from @gsd/pi-coding-agent
|
|
17
|
+
// (shell.ts) — the single source of truth for the graceful-kill timing ladder —
|
|
18
|
+
// so this sandbox can never drift from the canonical kill path it delegates to.
|
|
15
19
|
export const EXEC_DEFAULTS = {
|
|
16
20
|
clampTimeoutMs: 600_000,
|
|
17
21
|
defaultTimeoutMs: 30_000,
|
|
@@ -120,6 +124,7 @@ export function runExecSandbox(request, opts) {
|
|
|
120
124
|
exit_code: null,
|
|
121
125
|
signal: null,
|
|
122
126
|
timed_out: false,
|
|
127
|
+
force_resolved: false,
|
|
123
128
|
duration_ms: duration,
|
|
124
129
|
stdout_bytes: 0,
|
|
125
130
|
stderr_bytes: Buffer.byteLength(`spawn error: ${message}\n`),
|
|
@@ -172,24 +177,38 @@ export function runExecSandbox(request, opts) {
|
|
|
172
177
|
stderrTruncated = true;
|
|
173
178
|
}
|
|
174
179
|
});
|
|
180
|
+
const effectiveGraceMs = opts.kill_grace_ms ?? SIGKILL_GRACE_MS;
|
|
181
|
+
const effectiveForceResolveDelay = opts.force_resolve_delay_ms ?? (effectiveGraceMs + HARD_DEADLINE_MS);
|
|
175
182
|
let timedOut = false;
|
|
183
|
+
let settled = false;
|
|
184
|
+
let forceResolveTimer;
|
|
176
185
|
const timer = setTimeout(() => {
|
|
177
186
|
timedOut = true;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
187
|
+
// killProcessTree handles both platforms and kills the whole tree: on Unix
|
|
188
|
+
// it signals the process group (SIGTERM -> grace -> SIGKILL); on Windows it
|
|
189
|
+
// force-kills the tree via taskkill /F /T. Using child.kill("SIGTERM") here
|
|
190
|
+
// would only terminate the direct child on Windows, orphaning grandchildren.
|
|
191
|
+
if (child.pid != null) {
|
|
192
|
+
killProcessTree(child.pid, { graceMs: effectiveGraceMs });
|
|
185
193
|
}
|
|
186
194
|
else {
|
|
187
|
-
child.kill("
|
|
195
|
+
child.kill("SIGTERM");
|
|
188
196
|
}
|
|
197
|
+
// Arm hard-deadline force-resolve in case child never closes (D-state).
|
|
198
|
+
// The "SIGKILL" here is a synthetic marker (the process may not have actually
|
|
199
|
+
// received it); force_resolved=true records that this was a deadline, not an exit.
|
|
200
|
+
forceResolveTimer = setTimeout(() => {
|
|
201
|
+
finalize(null, "SIGKILL", true);
|
|
202
|
+
}, effectiveForceResolveDelay);
|
|
203
|
+
forceResolveTimer.unref?.();
|
|
189
204
|
}, timeoutMs);
|
|
190
205
|
timer.unref?.();
|
|
191
|
-
const finalize = (exitCode, signal) => {
|
|
206
|
+
const finalize = (exitCode, signal, forceResolved = false) => {
|
|
207
|
+
if (settled)
|
|
208
|
+
return;
|
|
209
|
+
settled = true;
|
|
192
210
|
clearTimeout(timer);
|
|
211
|
+
clearTimeout(forceResolveTimer);
|
|
193
212
|
const duration = Date.now() - started;
|
|
194
213
|
const stdoutBuf = Buffer.concat(stdoutChunks);
|
|
195
214
|
const stderrBuf = Buffer.concat(stderrChunks);
|
|
@@ -211,6 +230,7 @@ export function runExecSandbox(request, opts) {
|
|
|
211
230
|
exit_code: exitCode,
|
|
212
231
|
signal,
|
|
213
232
|
timed_out: timedOut,
|
|
233
|
+
force_resolved: forceResolved,
|
|
214
234
|
duration_ms: duration,
|
|
215
235
|
stdout_bytes: stdoutBytes,
|
|
216
236
|
stderr_bytes: stderrBytes,
|
|
@@ -254,6 +274,7 @@ function writeMeta(path, result, request, now) {
|
|
|
254
274
|
exit_code: result.exit_code,
|
|
255
275
|
signal: result.signal,
|
|
256
276
|
timed_out: result.timed_out,
|
|
277
|
+
force_resolved: result.force_resolved,
|
|
257
278
|
duration_ms: result.duration_ms,
|
|
258
279
|
stdout_bytes: result.stdout_bytes,
|
|
259
280
|
stderr_bytes: result.stderr_bytes,
|
|
@@ -261,7 +282,6 @@ function writeMeta(path, result, request, now) {
|
|
|
261
282
|
stderr_truncated: result.stderr_truncated,
|
|
262
283
|
stdout_path: result.stdout_path,
|
|
263
284
|
stderr_path: result.stderr_path,
|
|
264
|
-
...(request.metadata ? { metadata: request.metadata } : {}),
|
|
265
285
|
};
|
|
266
286
|
writeFileSync(path, `${JSON.stringify(meta, null, 2)}\n`);
|
|
267
287
|
}
|
|
@@ -576,38 +576,52 @@ export function parseTaskPlanIO(content) {
|
|
|
576
576
|
outputFiles: extractPaths(outputSection),
|
|
577
577
|
};
|
|
578
578
|
}
|
|
579
|
+
/** Canonical list of recognised UAT types — uat-policy.ts re-exports this as UAT_TYPES. */
|
|
580
|
+
export const UAT_TYPE_KEYWORDS = [
|
|
581
|
+
'artifact-driven',
|
|
582
|
+
'browser-executable',
|
|
583
|
+
'runtime-executable',
|
|
584
|
+
'live-runtime',
|
|
585
|
+
'mixed',
|
|
586
|
+
'human-experience',
|
|
587
|
+
];
|
|
588
|
+
/** Match a value against the recognised UAT type keywords (leading-keyword-only). */
|
|
589
|
+
function matchUatTypeKeyword(value) {
|
|
590
|
+
const normalized = value.trim().toLowerCase();
|
|
591
|
+
return UAT_TYPE_KEYWORDS.find(keyword => normalized.startsWith(keyword));
|
|
592
|
+
}
|
|
579
593
|
/**
|
|
580
594
|
* Extract the UAT type from a UAT file's raw content.
|
|
581
595
|
*
|
|
582
596
|
* UAT files have no YAML frontmatter - pass raw file content directly.
|
|
583
597
|
* Classification is leading-keyword-only: e.g. `mixed (artifact-driven + live-runtime)` → `'mixed'`.
|
|
584
598
|
*
|
|
599
|
+
* The canonical form is a `- UAT mode: <type>` bullet under `## UAT Type`
|
|
600
|
+
* (case-insensitive prefix, `**bold**` tolerated). When no such line exists,
|
|
601
|
+
* a line that itself starts with a recognised keyword — e.g. a bare
|
|
602
|
+
* `browser-executable` under the heading — is accepted, so agent-authored
|
|
603
|
+
* format drift does not silently fall back to artifact-driven.
|
|
604
|
+
*
|
|
585
605
|
* Returns `undefined` when:
|
|
586
606
|
* - the `## UAT Type` section is absent
|
|
587
|
-
* -
|
|
588
|
-
* -
|
|
607
|
+
* - a `UAT mode:` line exists but its value starts with no recognised keyword
|
|
608
|
+
* - no line in the section starts with `UAT mode:` or a recognised keyword
|
|
589
609
|
*/
|
|
590
610
|
export function extractUatType(content) {
|
|
591
611
|
const sectionText = extractSection(content, 'UAT Type');
|
|
592
612
|
if (!sectionText)
|
|
593
613
|
return undefined;
|
|
594
|
-
const
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
if (rawValue.startsWith('live-runtime'))
|
|
606
|
-
return 'live-runtime';
|
|
607
|
-
if (rawValue.startsWith('human-experience'))
|
|
608
|
-
return 'human-experience';
|
|
609
|
-
if (rawValue.startsWith('mixed'))
|
|
610
|
-
return 'mixed';
|
|
614
|
+
const lines = parseBullets(sectionText).map(line => line.replace(/\*\*/g, ''));
|
|
615
|
+
for (const line of lines) {
|
|
616
|
+
const declared = /^uat mode:\s*(.*)$/i.exec(line);
|
|
617
|
+
if (declared)
|
|
618
|
+
return matchUatTypeKeyword(declared[1]);
|
|
619
|
+
}
|
|
620
|
+
for (const line of lines) {
|
|
621
|
+
const matched = matchUatTypeKeyword(line);
|
|
622
|
+
if (matched)
|
|
623
|
+
return matched;
|
|
624
|
+
}
|
|
611
625
|
return undefined;
|
|
612
626
|
}
|
|
613
627
|
/**
|
|
@@ -28,13 +28,17 @@ export function buildGsdHomeModel(state, closeout) {
|
|
|
28
28
|
const workLabel = activeWorkLabel(state);
|
|
29
29
|
const strandedQuick = closeout?.strandedQuick ?? null;
|
|
30
30
|
const unmergedMilestone = closeout?.unmergedMilestones?.[0];
|
|
31
|
+
const idleResidueHint = closeout?.idleResidueHint ?? null;
|
|
32
|
+
const hasIdleResidue = Boolean(idleResidueHint);
|
|
31
33
|
const nextReason = complete
|
|
32
34
|
? "all milestones are complete"
|
|
33
35
|
: blocked
|
|
34
36
|
? "the active milestone is blocked"
|
|
35
|
-
:
|
|
36
|
-
? "
|
|
37
|
-
:
|
|
37
|
+
: hasIdleResidue
|
|
38
|
+
? "milestone git residue needs recovery"
|
|
39
|
+
: !hasActiveWork
|
|
40
|
+
? "there is no active milestone"
|
|
41
|
+
: "";
|
|
38
42
|
const canAdvance = hasActiveWork && !blocked && !complete;
|
|
39
43
|
const unmappedActive = complete ? countUnmappedActiveRequirements() : 0;
|
|
40
44
|
const recommended = strandedQuick
|
|
@@ -43,11 +47,13 @@ export function buildGsdHomeModel(state, closeout) {
|
|
|
43
47
|
? "finish_milestone"
|
|
44
48
|
: blocked
|
|
45
49
|
? "fix_recover"
|
|
46
|
-
:
|
|
47
|
-
? "
|
|
48
|
-
:
|
|
49
|
-
? "
|
|
50
|
-
:
|
|
50
|
+
: hasIdleResidue
|
|
51
|
+
? "fix_recover"
|
|
52
|
+
: canAdvance
|
|
53
|
+
? "continue_step"
|
|
54
|
+
: complete && unmappedActive > 0
|
|
55
|
+
? "review_requirements_backlog"
|
|
56
|
+
: "start_configure";
|
|
51
57
|
const completionSummary = complete
|
|
52
58
|
? appendRequirementsBacklogToSummary(state, [
|
|
53
59
|
`All milestones complete${state.lastCompletedMilestone ? ` after ${state.lastCompletedMilestone.id}: ${state.lastCompletedMilestone.title}` : ""}.`,
|
|
@@ -57,7 +63,9 @@ export function buildGsdHomeModel(state, closeout) {
|
|
|
57
63
|
? [`Quick task Q${strandedQuick.taskNum} finished on ${strandedQuick.quickBranch} but is not merged to ${strandedQuick.originalBranch}.`]
|
|
58
64
|
: unmergedMilestone
|
|
59
65
|
? [`${unmergedMilestone.milestoneId} is complete but not merged into ${unmergedMilestone.integrationBranch}.`]
|
|
60
|
-
:
|
|
66
|
+
: idleResidueHint
|
|
67
|
+
? [idleResidueHint.message]
|
|
68
|
+
: completionSummary;
|
|
61
69
|
return {
|
|
62
70
|
title: "GSD — What now?",
|
|
63
71
|
summary: [
|
|
@@ -130,10 +138,12 @@ export function buildGsdHomeModel(state, closeout) {
|
|
|
130
138
|
label: "Fix or recover",
|
|
131
139
|
description: blocked
|
|
132
140
|
? "Review the blocker and recovery commands for the active milestone."
|
|
133
|
-
:
|
|
134
|
-
|
|
141
|
+
: hasIdleResidue
|
|
142
|
+
? "Review stranded milestone worktrees/branches and run the suggested recovery command."
|
|
143
|
+
: disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
|
|
144
|
+
enabled: blocked || hasIdleResidue,
|
|
135
145
|
recommended: recommended === "fix_recover",
|
|
136
|
-
disabledReason: blocked ? undefined : "no blocker is active",
|
|
146
|
+
disabledReason: blocked || hasIdleResidue ? undefined : "no blocker is active",
|
|
137
147
|
},
|
|
138
148
|
{
|
|
139
149
|
id: "start_configure",
|
|
@@ -169,7 +169,7 @@ export function insertArtifact(a) {
|
|
|
169
169
|
export function insertMilestone(m) {
|
|
170
170
|
if (!getDbOrNull())
|
|
171
171
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
172
|
-
getDbOrNull().prepare(`INSERT OR IGNORE INTO milestones (
|
|
172
|
+
const result = getDbOrNull().prepare(`INSERT OR IGNORE INTO milestones (
|
|
173
173
|
id, title, status, depends_on, created_at,
|
|
174
174
|
vision, success_criteria, key_risks, proof_strategy,
|
|
175
175
|
verification_contract, verification_integration, verification_operational, verification_uat,
|
|
@@ -199,6 +199,7 @@ export function insertMilestone(m) {
|
|
|
199
199
|
":requirement_coverage": m.planning?.requirementCoverage ?? "",
|
|
200
200
|
":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
|
|
201
201
|
});
|
|
202
|
+
return (result.changes ?? 0) > 0;
|
|
202
203
|
}
|
|
203
204
|
export function upsertMilestonePlanning(milestoneId, planning) {
|
|
204
205
|
if (!getDbOrNull())
|
|
@@ -55,6 +55,66 @@ export function needsRemediationBlockerGuidance(milestoneId) {
|
|
|
55
55
|
`3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
56
56
|
].join("\n");
|
|
57
57
|
}
|
|
58
|
+
// ─── Milestone closeout UAT sign-off blockers ───────────────────────────
|
|
59
|
+
// The first sentence is the blocker finding; the numbered steps are the
|
|
60
|
+
// resolution path. `verdict` is the recorded non-PASS verdict, or undefined
|
|
61
|
+
// when no verdict has been recorded at all.
|
|
62
|
+
export function uatSignoffBlockerGuidance(milestoneId, sliceId, verdict) {
|
|
63
|
+
const finding = verdict === undefined
|
|
64
|
+
? `missing UAT PASS verdict for ${sliceId}`
|
|
65
|
+
: `UAT verdict for ${sliceId} is "${verdict}"`;
|
|
66
|
+
const sliceSpecificRerunStep = `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\`.`;
|
|
67
|
+
const steps = verdict === undefined
|
|
68
|
+
? [
|
|
69
|
+
`1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
|
|
70
|
+
`2. ${sliceSpecificRerunStep}`,
|
|
71
|
+
`3. Review the UAT criteria and progress: \`/gsd status\``,
|
|
72
|
+
`4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
73
|
+
]
|
|
74
|
+
: [
|
|
75
|
+
`1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
|
|
76
|
+
`2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
|
|
77
|
+
`3. ${sliceSpecificRerunStep}`,
|
|
78
|
+
`4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
|
|
79
|
+
`5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
80
|
+
];
|
|
81
|
+
return [
|
|
82
|
+
`Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
|
|
83
|
+
`Fix options:`,
|
|
84
|
+
...steps,
|
|
85
|
+
].join("\n");
|
|
86
|
+
}
|
|
87
|
+
// ─── Worktree isolation degradation ─────────────────────────────────────
|
|
88
|
+
// The first sentence of each notice is load-bearing for log matching and
|
|
89
|
+
// tests — keep it intact and append guidance after it.
|
|
90
|
+
function restoreIsolationHint(milestoneId) {
|
|
91
|
+
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\`.`;
|
|
92
|
+
}
|
|
93
|
+
export function worktreeCreationFailedGuidance(milestoneId, error) {
|
|
94
|
+
return [
|
|
95
|
+
`Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
|
|
96
|
+
`Worktree isolation is degraded for this session.`,
|
|
97
|
+
restoreIsolationHint(milestoneId),
|
|
98
|
+
].join("\n");
|
|
99
|
+
}
|
|
100
|
+
export function isolationDegradedFallbackGuidance(milestoneId) {
|
|
101
|
+
return [
|
|
102
|
+
`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
|
|
103
|
+
`Work continues safely on the milestone branch in the project root.`,
|
|
104
|
+
restoreIsolationHint(milestoneId),
|
|
105
|
+
].join("\n");
|
|
106
|
+
}
|
|
107
|
+
/** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
|
|
108
|
+
export function milestoneEntryBlockedGuidance(milestoneId, reason) {
|
|
109
|
+
const finding = reason === "creation-failed"
|
|
110
|
+
? `worktree/branch creation failed. Isolation is degraded.`
|
|
111
|
+
: `isolation is degraded from a prior worktree failure.`;
|
|
112
|
+
return [
|
|
113
|
+
`Cannot enter milestone ${milestoneId}: ${finding}`,
|
|
114
|
+
restoreIsolationHint(milestoneId),
|
|
115
|
+
`Then run \`/gsd auto\` to retry.`,
|
|
116
|
+
].join("\n");
|
|
117
|
+
}
|
|
58
118
|
// ─── Crash recovery resume hints ────────────────────────────────────────
|
|
59
119
|
/** Resume hint for an interrupted auto-mode unit, by unit class. */
|
|
60
120
|
export function crashResumeHint(unitType, unitId) {
|
|
@@ -42,9 +42,15 @@ export { nextMilestoneIdReserved } from "./milestone-id-reservation.js";
|
|
|
42
42
|
import { parkMilestone, discardMilestone } from "./milestone-actions.js";
|
|
43
43
|
import { buildCloseoutMenuActions, buildIdleMenuSummary, getPrimaryCloseoutRecommendation, handleCloseoutChoice, loadCloseoutContext, } from "./closeout-wizard.js";
|
|
44
44
|
import { buildRequirementsBacklogDiscussContext, countUnmappedActiveRequirements, showRequirementsBacklogReview, } from "./requirements-backlog.js";
|
|
45
|
-
import { selectAndApplyModel } from "./auto-model-selection.js";
|
|
45
|
+
import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
|
|
46
46
|
import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
|
|
47
|
-
import {
|
|
47
|
+
import { detectWorkflowMcpLaunchConfig, resolveWorkflowMcpProjectRoot, supportsStructuredQuestions, } from "./workflow-mcp.js";
|
|
48
|
+
import { usesWorkflowMcpTransport } from "./question-transport.js";
|
|
49
|
+
import { getCachedWorkflowMcpProbe, probeAndCacheWorkflowMcp, warmWorkflowMcpProbeInBackground, workflowMcpProbeAdvertisesSurface, WORKFLOW_MCP_PROBE_TIMEOUT_MS, } from "./workflow-mcp-readiness-cache.js";
|
|
50
|
+
import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
|
|
51
|
+
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
52
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
53
|
+
import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
|
|
48
54
|
import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
|
|
49
55
|
import { verifyExpectedArtifact } from "./auto-recovery.js";
|
|
50
56
|
import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
@@ -368,6 +374,67 @@ async function dispatchNextDeepProjectSetupStage(entry) {
|
|
|
368
374
|
export function resolveGuidedDispatchProjectRoot(basePath) {
|
|
369
375
|
return basePath ?? process.cwd();
|
|
370
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Wait until the workflow MCP server is reachable and advertising its tool
|
|
379
|
+
* surface. Returns failure details when timed out, or null when ready (or MCP
|
|
380
|
+
* is not the transport). Called inside dispatchWorkflow() so every guided-flow
|
|
381
|
+
* dispatch path is gated automatically.
|
|
382
|
+
*/
|
|
383
|
+
const MCP_READINESS_TIMEOUT_MS = 15_000;
|
|
384
|
+
const MCP_READINESS_POLL_MS = 200;
|
|
385
|
+
async function awaitWorkflowMcpReadiness(pi, ctx, basePath, options = {}) {
|
|
386
|
+
const provider = ctx.model?.provider;
|
|
387
|
+
const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
|
|
388
|
+
if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl))
|
|
389
|
+
return null;
|
|
390
|
+
const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
|
|
391
|
+
const launch = detectWorkflowMcpLaunchConfig(projectRoot);
|
|
392
|
+
if (!launch)
|
|
393
|
+
return null;
|
|
394
|
+
const requiredTools = options.unitType
|
|
395
|
+
? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
|
|
396
|
+
: [];
|
|
397
|
+
const coversExpectedSurface = (tools) => requiredTools.length > 0
|
|
398
|
+
? probeCoversRequiredWorkflowTools(tools, requiredTools)
|
|
399
|
+
: workflowMcpProbeAdvertisesSurface(tools);
|
|
400
|
+
const serverPrefix = `mcp__${launch.name}__`;
|
|
401
|
+
const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
|
|
402
|
+
const systemPromptCoversExpectedSurface = () => {
|
|
403
|
+
const prompt = systemPrompt();
|
|
404
|
+
return requiredTools.length > 0
|
|
405
|
+
? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
|
|
406
|
+
: prompt.includes(serverPrefix);
|
|
407
|
+
};
|
|
408
|
+
const sessionAlreadyReady = () => coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
|
|
409
|
+
systemPromptCoversExpectedSurface();
|
|
410
|
+
if (sessionAlreadyReady())
|
|
411
|
+
return null;
|
|
412
|
+
if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
const probe = options.probe ?? probeAndCacheWorkflowMcp;
|
|
416
|
+
const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
|
|
417
|
+
ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
|
|
418
|
+
let lastError;
|
|
419
|
+
const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
|
|
420
|
+
const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
|
|
421
|
+
while (Date.now() < deadline) {
|
|
422
|
+
if (sessionAlreadyReady()) {
|
|
423
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
|
|
427
|
+
if (result.ok && coversExpectedSurface(result.tools)) {
|
|
428
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
lastError = result.error;
|
|
432
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
433
|
+
}
|
|
434
|
+
ctx.ui.setStatus("gsd-step", "");
|
|
435
|
+
return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
|
|
436
|
+
}
|
|
437
|
+
export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
|
|
371
438
|
/**
|
|
372
439
|
* Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
|
|
373
440
|
* This is the only way the wizard triggers work — everything else is the LLM's job.
|
|
@@ -382,7 +449,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
|
|
|
382
449
|
const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
|
|
383
450
|
const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
|
|
384
451
|
const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
|
|
385
|
-
const
|
|
452
|
+
const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
|
|
453
|
+
?? getUnitWorkflowDispatchReadinessError;
|
|
386
454
|
// Route through the dynamic routing pipeline (complexity classification,
|
|
387
455
|
// tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
|
|
388
456
|
if (ctx && unitType) {
|
|
@@ -396,7 +464,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
|
|
|
396
464
|
routing: result.routing,
|
|
397
465
|
});
|
|
398
466
|
}
|
|
399
|
-
const compatibilityError =
|
|
467
|
+
const compatibilityError = getDispatchReadinessError({
|
|
468
|
+
provider: result.appliedModel?.provider ?? ctx.model?.provider,
|
|
400
469
|
projectRoot,
|
|
401
470
|
surface: "guided flow",
|
|
402
471
|
unitType,
|
|
@@ -415,6 +484,25 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
|
|
|
415
484
|
ctx.ui.notify(compatibilityError, "error");
|
|
416
485
|
return;
|
|
417
486
|
}
|
|
487
|
+
// ── Live MCP readiness gate ────────────────────────────────────────
|
|
488
|
+
// Units with required workflow tools must not dispatch until the MCP
|
|
489
|
+
// surface covers that exact contract; otherwise the model can race into
|
|
490
|
+
// "No such tool available" before recovery sees a clean readiness error.
|
|
491
|
+
warmWorkflowMcpProbeInBackground(projectRoot);
|
|
492
|
+
const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
|
|
493
|
+
const strictBlocking = requiredWorkflowTools.length > 0
|
|
494
|
+
&& (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
|
|
495
|
+
if (strictBlocking) {
|
|
496
|
+
// If the workflow MCP server is configured but still connecting, wait
|
|
497
|
+
// for it instead of dispatching into a child session that will abort.
|
|
498
|
+
const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
|
|
499
|
+
if (readinessFailure) {
|
|
500
|
+
const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
|
|
501
|
+
ctx.ui.notify(`GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
|
|
502
|
+
`Run \`/gsd mcp check ${readinessFailure.server}\` for details.`, "warning");
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
418
506
|
}
|
|
419
507
|
// Scope tools for guided workflow turns (#2949, token-consumption savings).
|
|
420
508
|
// Providers with grammar-based constrained decoding (xAI/Grok) return
|
|
@@ -1297,6 +1385,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
|
|
|
1297
1385
|
}
|
|
1298
1386
|
export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
1299
1387
|
const stepMode = options?.step ?? true;
|
|
1388
|
+
warmWorkflowMcpProbeInBackground(basePath);
|
|
1300
1389
|
// ── Clear stale milestone ID reservations from previous cancelled sessions ──
|
|
1301
1390
|
// Reservations only need to survive within a single /gsd interaction.
|
|
1302
1391
|
// Without this, each cancelled session permanently bumps the next ID. (#2488)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Always-on ambient health signal rendered below the editor.
|
|
3
3
|
import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
|
|
4
|
-
import { runEnvironmentChecks } from "./doctor-environment.js";
|
|
4
|
+
import { runEnvironmentChecks, runEnvironmentChecksAsync } from "./doctor-environment.js";
|
|
5
5
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
6
6
|
import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
|
|
7
7
|
import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
|
|
@@ -9,7 +9,28 @@ import { projectRoot } from "./commands/context.js";
|
|
|
9
9
|
import { buildHealthLines, detectHealthWidgetProjectState, } from "./health-widget-core.js";
|
|
10
10
|
export const HEALTH_WIDGET_ACTIVE_HINTS = " /gsd auto to run · /gsd status to inspect · /gsd report for snapshots · /gsd notifications for history · /gsd help";
|
|
11
11
|
// ── Data loader ────────────────────────────────────────────────────────────────
|
|
12
|
-
|
|
12
|
+
// Last-commit lookup is subprocess-backed (native-git-bridge → git spawns),
|
|
13
|
+
// so it is treated like the other expensive checks: skipped on first paint,
|
|
14
|
+
// run only by the background refresh.
|
|
15
|
+
function loadLastCommitInfo(basePath) {
|
|
16
|
+
try {
|
|
17
|
+
if (nativeIsRepo(basePath)) {
|
|
18
|
+
const branch = nativeGetCurrentBranch(basePath);
|
|
19
|
+
const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
|
|
20
|
+
if (epoch > 0) {
|
|
21
|
+
return { epoch, message: nativeCommitSubject(basePath, branch || "HEAD") || null };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch { /* non-fatal */ }
|
|
26
|
+
return { epoch: null, message: null };
|
|
27
|
+
}
|
|
28
|
+
function loadHealthWidgetData(basePath, options) {
|
|
29
|
+
// `includeChecks` gates the expensive subprocess-backed checks (provider +
|
|
30
|
+
// environment doctor: `lsof`, `docker`, `node --version`, ...). The initial
|
|
31
|
+
// synchronous render passes `false` so first paint is never blocked on them;
|
|
32
|
+
// the async refresh (off the first-paint path) runs the full suite.
|
|
33
|
+
const includeChecks = options?.includeChecks ?? true;
|
|
13
34
|
let budgetCeiling;
|
|
14
35
|
let budgetSpent = 0;
|
|
15
36
|
let providerIssue = null;
|
|
@@ -28,13 +49,57 @@ function loadHealthWidgetData(basePath) {
|
|
|
28
49
|
}
|
|
29
50
|
}
|
|
30
51
|
catch { /* non-fatal */ }
|
|
52
|
+
if (includeChecks) {
|
|
53
|
+
try {
|
|
54
|
+
const providerResults = runProviderChecks();
|
|
55
|
+
providerIssue = summariseProviderIssues(providerResults);
|
|
56
|
+
}
|
|
57
|
+
catch { /* non-fatal */ }
|
|
58
|
+
try {
|
|
59
|
+
const envResults = runEnvironmentChecks(basePath);
|
|
60
|
+
for (const r of envResults) {
|
|
61
|
+
if (r.status === "error")
|
|
62
|
+
environmentErrorCount++;
|
|
63
|
+
else if (r.status === "warning")
|
|
64
|
+
environmentWarningCount++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch { /* non-fatal */ }
|
|
68
|
+
}
|
|
69
|
+
// ── Last commit info ── (git spawns — gated like the other expensive checks)
|
|
70
|
+
if (includeChecks) {
|
|
71
|
+
const commit = loadLastCommitInfo(basePath);
|
|
72
|
+
lastCommitEpoch = commit.epoch;
|
|
73
|
+
lastCommitMessage = commit.message;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
projectState,
|
|
77
|
+
budgetCeiling,
|
|
78
|
+
budgetSpent,
|
|
79
|
+
providerIssue,
|
|
80
|
+
environmentErrorCount,
|
|
81
|
+
environmentWarningCount,
|
|
82
|
+
lastCommitEpoch,
|
|
83
|
+
lastCommitMessage,
|
|
84
|
+
lastRefreshed: Date.now(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Non-blocking variant used by the widget's background refresh: the cheap fields
|
|
88
|
+
// come from the synchronous snapshot, then provider + environment checks are
|
|
89
|
+
// layered in off the event-loop critical path (env checks run concurrently via
|
|
90
|
+
// runEnvironmentChecksAsync). Keeps the always-on widget from stalling the UI on
|
|
91
|
+
// its initial enrichment or its 60s refresh.
|
|
92
|
+
async function loadHealthWidgetDataAsync(basePath) {
|
|
93
|
+
const data = loadHealthWidgetData(basePath, { includeChecks: false });
|
|
94
|
+
let providerIssue = data.providerIssue;
|
|
95
|
+
let environmentErrorCount = 0;
|
|
96
|
+
let environmentWarningCount = 0;
|
|
31
97
|
try {
|
|
32
|
-
|
|
33
|
-
providerIssue = summariseProviderIssues(providerResults);
|
|
98
|
+
providerIssue = summariseProviderIssues(runProviderChecks());
|
|
34
99
|
}
|
|
35
100
|
catch { /* non-fatal */ }
|
|
36
101
|
try {
|
|
37
|
-
const envResults =
|
|
102
|
+
const envResults = await runEnvironmentChecksAsync(basePath);
|
|
38
103
|
for (const r of envResults) {
|
|
39
104
|
if (r.status === "error")
|
|
40
105
|
environmentErrorCount++;
|
|
@@ -43,27 +108,14 @@ function loadHealthWidgetData(basePath) {
|
|
|
43
108
|
}
|
|
44
109
|
}
|
|
45
110
|
catch { /* non-fatal */ }
|
|
46
|
-
|
|
47
|
-
try {
|
|
48
|
-
if (nativeIsRepo(basePath)) {
|
|
49
|
-
const branch = nativeGetCurrentBranch(basePath);
|
|
50
|
-
const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
|
|
51
|
-
if (epoch > 0) {
|
|
52
|
-
lastCommitEpoch = epoch;
|
|
53
|
-
lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch { /* non-fatal */ }
|
|
111
|
+
const commit = loadLastCommitInfo(basePath);
|
|
58
112
|
return {
|
|
59
|
-
|
|
60
|
-
budgetCeiling,
|
|
61
|
-
budgetSpent,
|
|
113
|
+
...data,
|
|
62
114
|
providerIssue,
|
|
63
115
|
environmentErrorCount,
|
|
64
116
|
environmentWarningCount,
|
|
65
|
-
lastCommitEpoch,
|
|
66
|
-
lastCommitMessage,
|
|
117
|
+
lastCommitEpoch: commit.epoch,
|
|
118
|
+
lastCommitMessage: commit.message,
|
|
67
119
|
lastRefreshed: Date.now(),
|
|
68
120
|
};
|
|
69
121
|
}
|
|
@@ -77,8 +129,13 @@ export function initHealthWidget(ctx) {
|
|
|
77
129
|
if (!ctx.hasUI)
|
|
78
130
|
return;
|
|
79
131
|
const basePath = projectRoot();
|
|
80
|
-
// String-array fallback — used in RPC mode (factory is a no-op there)
|
|
81
|
-
|
|
132
|
+
// String-array fallback — used in RPC mode (factory is a no-op there).
|
|
133
|
+
// Skip the expensive provider/environment doctor checks here: this runs
|
|
134
|
+
// synchronously on the interactive-startup path, where running them would
|
|
135
|
+
// block first paint by ~0.9s (lsof/docker probes, otherwise run again
|
|
136
|
+
// immediately by the factory below). The factory's async refresh fills in
|
|
137
|
+
// real health once the screen is up.
|
|
138
|
+
const initialData = loadHealthWidgetData(basePath, { includeChecks: false });
|
|
82
139
|
ctx.ui.setWidget("gsd-health", buildHealthLines(initialData), { placement: "belowEditor" });
|
|
83
140
|
// Factory-based widget for TUI mode — replaces the string-array above
|
|
84
141
|
ctx.ui.setWidget("gsd-health", (_tui, _theme) => {
|
|
@@ -91,7 +148,7 @@ export function initHealthWidget(ctx) {
|
|
|
91
148
|
return;
|
|
92
149
|
refreshInFlight = true;
|
|
93
150
|
try {
|
|
94
|
-
data =
|
|
151
|
+
data = await loadHealthWidgetDataAsync(basePath);
|
|
95
152
|
cachedLines = undefined;
|
|
96
153
|
if (!isDisposed)
|
|
97
154
|
_tui.requestRender();
|
|
@@ -101,9 +158,11 @@ export function initHealthWidget(ctx) {
|
|
|
101
158
|
refreshInFlight = false;
|
|
102
159
|
}
|
|
103
160
|
};
|
|
104
|
-
// Fire first enrichment
|
|
105
|
-
//
|
|
106
|
-
|
|
161
|
+
// Fire the first full enrichment off the first-paint path. setTimeout(0)
|
|
162
|
+
// yields to the initial render + input loop, so the expensive doctor checks
|
|
163
|
+
// (provider + environment) never delay the moment the user sees the UI.
|
|
164
|
+
// requestRender() inside refresh repaints the widget once data is ready.
|
|
165
|
+
setTimeout(() => { void refresh(); }, 0);
|
|
107
166
|
const refreshTimer = setInterval(() => {
|
|
108
167
|
void refresh();
|
|
109
168
|
}, REFRESH_INTERVAL_MS);
|
|
@@ -717,6 +717,16 @@ export function detectStaleRenders(basePath) {
|
|
|
717
717
|
}
|
|
718
718
|
return stale;
|
|
719
719
|
}
|
|
720
|
+
/**
|
|
721
|
+
* Render-verification helper: does the rendered ROADMAP markdown mark a slice
|
|
722
|
+
* as done? Used by completion code to verify/repair the *projection* after a
|
|
723
|
+
* DB write — never as a source of truth for dispatch or completion decisions
|
|
724
|
+
* (ADR-017). Lives here so decision-path modules need not import
|
|
725
|
+
* parsers-legacy directly.
|
|
726
|
+
*/
|
|
727
|
+
export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
|
|
728
|
+
return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
|
|
729
|
+
}
|
|
720
730
|
export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
|
|
721
731
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
722
732
|
?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// mcp-bridge.ts — stable runtime seam for MCP server consumption (phase 1).
|
|
2
|
+
export { loadWriteGateSnapshot, shouldBlockPendingGateInSnapshot, shouldBlockQueueExecutionInSnapshot, } from "./bootstrap/write-gate.js";
|
|
3
|
+
export { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
4
|
+
export { _getAdapter, checkpointDatabase, closeDatabase, getAllMilestones, getDb, getGateResults, getMilestoneSlices, getPendingGates, getSliceTasks, insertDecision, insertMilestone, insertSlice, openDatabase, upsertMilestonePlanning, } from "./gsd-db.js";
|
|
5
|
+
export { invalidateStateCache, isReusableGhostMilestone } from "./state.js";
|
|
6
|
+
export { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
7
|
+
export { saveDecisionToDb, saveRequirementToDb, updateRequirementInDb, } from "./db-writer.js";
|
|
8
|
+
export { rebuildState } from "./doctor.js";
|
|
9
|
+
export { queryJournal } from "./journal.js";
|
|
10
|
+
export { claimReservedId, findMilestoneIds, getReservedMilestoneIds, milestoneIdSort, nextMilestoneId, } from "./milestone-ids.js";
|