@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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
5
5
|
import type { GSDState } from "./types.js";
|
|
6
6
|
import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
|
|
7
|
-
import { runEnvironmentChecks } from "./doctor-environment.js";
|
|
7
|
+
import { runEnvironmentChecks, runEnvironmentChecksAsync } from "./doctor-environment.js";
|
|
8
8
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
9
9
|
import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
|
|
10
10
|
import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
|
|
@@ -22,7 +22,31 @@ export const HEALTH_WIDGET_ACTIVE_HINTS =
|
|
|
22
22
|
|
|
23
23
|
// ── Data loader ────────────────────────────────────────────────────────────────
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
// Last-commit lookup is subprocess-backed (native-git-bridge → git spawns),
|
|
26
|
+
// so it is treated like the other expensive checks: skipped on first paint,
|
|
27
|
+
// run only by the background refresh.
|
|
28
|
+
function loadLastCommitInfo(basePath: string): { epoch: number | null; message: string | null } {
|
|
29
|
+
try {
|
|
30
|
+
if (nativeIsRepo(basePath)) {
|
|
31
|
+
const branch = nativeGetCurrentBranch(basePath);
|
|
32
|
+
const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
|
|
33
|
+
if (epoch > 0) {
|
|
34
|
+
return { epoch, message: nativeCommitSubject(basePath, branch || "HEAD") || null };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch { /* non-fatal */ }
|
|
38
|
+
return { epoch: null, message: null };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function loadHealthWidgetData(
|
|
42
|
+
basePath: string,
|
|
43
|
+
options?: { includeChecks?: boolean },
|
|
44
|
+
): HealthWidgetData {
|
|
45
|
+
// `includeChecks` gates the expensive subprocess-backed checks (provider +
|
|
46
|
+
// environment doctor: `lsof`, `docker`, `node --version`, ...). The initial
|
|
47
|
+
// synchronous render passes `false` so first paint is never blocked on them;
|
|
48
|
+
// the async refresh (off the first-paint path) runs the full suite.
|
|
49
|
+
const includeChecks = options?.includeChecks ?? true;
|
|
26
50
|
let budgetCeiling: number | undefined;
|
|
27
51
|
let budgetSpent = 0;
|
|
28
52
|
let providerIssue: string | null = null;
|
|
@@ -44,40 +68,73 @@ function loadHealthWidgetData(basePath: string): HealthWidgetData {
|
|
|
44
68
|
}
|
|
45
69
|
} catch { /* non-fatal */ }
|
|
46
70
|
|
|
71
|
+
if (includeChecks) {
|
|
72
|
+
try {
|
|
73
|
+
const providerResults = runProviderChecks();
|
|
74
|
+
providerIssue = summariseProviderIssues(providerResults);
|
|
75
|
+
} catch { /* non-fatal */ }
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const envResults = runEnvironmentChecks(basePath);
|
|
79
|
+
for (const r of envResults) {
|
|
80
|
+
if (r.status === "error") environmentErrorCount++;
|
|
81
|
+
else if (r.status === "warning") environmentWarningCount++;
|
|
82
|
+
}
|
|
83
|
+
} catch { /* non-fatal */ }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ── Last commit info ── (git spawns — gated like the other expensive checks)
|
|
87
|
+
if (includeChecks) {
|
|
88
|
+
const commit = loadLastCommitInfo(basePath);
|
|
89
|
+
lastCommitEpoch = commit.epoch;
|
|
90
|
+
lastCommitMessage = commit.message;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
projectState,
|
|
95
|
+
budgetCeiling,
|
|
96
|
+
budgetSpent,
|
|
97
|
+
providerIssue,
|
|
98
|
+
environmentErrorCount,
|
|
99
|
+
environmentWarningCount,
|
|
100
|
+
lastCommitEpoch,
|
|
101
|
+
lastCommitMessage,
|
|
102
|
+
lastRefreshed: Date.now(),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Non-blocking variant used by the widget's background refresh: the cheap fields
|
|
107
|
+
// come from the synchronous snapshot, then provider + environment checks are
|
|
108
|
+
// layered in off the event-loop critical path (env checks run concurrently via
|
|
109
|
+
// runEnvironmentChecksAsync). Keeps the always-on widget from stalling the UI on
|
|
110
|
+
// its initial enrichment or its 60s refresh.
|
|
111
|
+
async function loadHealthWidgetDataAsync(basePath: string): Promise<HealthWidgetData> {
|
|
112
|
+
const data = loadHealthWidgetData(basePath, { includeChecks: false });
|
|
113
|
+
let providerIssue = data.providerIssue;
|
|
114
|
+
let environmentErrorCount = 0;
|
|
115
|
+
let environmentWarningCount = 0;
|
|
116
|
+
|
|
47
117
|
try {
|
|
48
|
-
|
|
49
|
-
providerIssue = summariseProviderIssues(providerResults);
|
|
118
|
+
providerIssue = summariseProviderIssues(runProviderChecks());
|
|
50
119
|
} catch { /* non-fatal */ }
|
|
51
120
|
|
|
52
121
|
try {
|
|
53
|
-
const envResults =
|
|
122
|
+
const envResults = await runEnvironmentChecksAsync(basePath);
|
|
54
123
|
for (const r of envResults) {
|
|
55
124
|
if (r.status === "error") environmentErrorCount++;
|
|
56
125
|
else if (r.status === "warning") environmentWarningCount++;
|
|
57
126
|
}
|
|
58
127
|
} catch { /* non-fatal */ }
|
|
59
128
|
|
|
60
|
-
|
|
61
|
-
try {
|
|
62
|
-
if (nativeIsRepo(basePath)) {
|
|
63
|
-
const branch = nativeGetCurrentBranch(basePath);
|
|
64
|
-
const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
|
|
65
|
-
if (epoch > 0) {
|
|
66
|
-
lastCommitEpoch = epoch;
|
|
67
|
-
lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
} catch { /* non-fatal */ }
|
|
129
|
+
const commit = loadLastCommitInfo(basePath);
|
|
71
130
|
|
|
72
131
|
return {
|
|
73
|
-
|
|
74
|
-
budgetCeiling,
|
|
75
|
-
budgetSpent,
|
|
132
|
+
...data,
|
|
76
133
|
providerIssue,
|
|
77
134
|
environmentErrorCount,
|
|
78
135
|
environmentWarningCount,
|
|
79
|
-
lastCommitEpoch,
|
|
80
|
-
lastCommitMessage,
|
|
136
|
+
lastCommitEpoch: commit.epoch,
|
|
137
|
+
lastCommitMessage: commit.message,
|
|
81
138
|
lastRefreshed: Date.now(),
|
|
82
139
|
};
|
|
83
140
|
}
|
|
@@ -95,8 +152,13 @@ export function initHealthWidget(ctx: ExtensionContext): void {
|
|
|
95
152
|
|
|
96
153
|
const basePath = projectRoot();
|
|
97
154
|
|
|
98
|
-
// String-array fallback — used in RPC mode (factory is a no-op there)
|
|
99
|
-
|
|
155
|
+
// String-array fallback — used in RPC mode (factory is a no-op there).
|
|
156
|
+
// Skip the expensive provider/environment doctor checks here: this runs
|
|
157
|
+
// synchronously on the interactive-startup path, where running them would
|
|
158
|
+
// block first paint by ~0.9s (lsof/docker probes, otherwise run again
|
|
159
|
+
// immediately by the factory below). The factory's async refresh fills in
|
|
160
|
+
// real health once the screen is up.
|
|
161
|
+
const initialData = loadHealthWidgetData(basePath, { includeChecks: false });
|
|
100
162
|
ctx.ui.setWidget("gsd-health", buildHealthLines(initialData), { placement: "belowEditor" });
|
|
101
163
|
|
|
102
164
|
// Factory-based widget for TUI mode — replaces the string-array above
|
|
@@ -110,7 +172,7 @@ export function initHealthWidget(ctx: ExtensionContext): void {
|
|
|
110
172
|
if (refreshInFlight) return;
|
|
111
173
|
refreshInFlight = true;
|
|
112
174
|
try {
|
|
113
|
-
data =
|
|
175
|
+
data = await loadHealthWidgetDataAsync(basePath);
|
|
114
176
|
cachedLines = undefined;
|
|
115
177
|
if (!isDisposed) _tui.requestRender();
|
|
116
178
|
} catch { /* non-fatal */ } finally {
|
|
@@ -118,9 +180,11 @@ export function initHealthWidget(ctx: ExtensionContext): void {
|
|
|
118
180
|
}
|
|
119
181
|
};
|
|
120
182
|
|
|
121
|
-
// Fire first enrichment
|
|
122
|
-
//
|
|
123
|
-
|
|
183
|
+
// Fire the first full enrichment off the first-paint path. setTimeout(0)
|
|
184
|
+
// yields to the initial render + input loop, so the expensive doctor checks
|
|
185
|
+
// (provider + environment) never delay the moment the user sees the UI.
|
|
186
|
+
// requestRender() inside refresh repaints the widget once data is ready.
|
|
187
|
+
setTimeout(() => { void refresh(); }, 0);
|
|
124
188
|
|
|
125
189
|
const refreshTimer = setInterval(() => {
|
|
126
190
|
void refresh();
|
|
@@ -911,6 +911,17 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
911
911
|
return stale;
|
|
912
912
|
}
|
|
913
913
|
|
|
914
|
+
/**
|
|
915
|
+
* Render-verification helper: does the rendered ROADMAP markdown mark a slice
|
|
916
|
+
* as done? Used by completion code to verify/repair the *projection* after a
|
|
917
|
+
* DB write — never as a source of truth for dispatch or completion decisions
|
|
918
|
+
* (ADR-017). Lives here so decision-path modules need not import
|
|
919
|
+
* parsers-legacy directly.
|
|
920
|
+
*/
|
|
921
|
+
export function roadmapRenderMarksSliceDone(roadmapContent: string, sliceId: string): boolean {
|
|
922
|
+
return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
|
|
923
|
+
}
|
|
924
|
+
|
|
914
925
|
// ─── Stale Repair ─────────────────────────────────────────────────────────
|
|
915
926
|
// Body relocated to state-reconciliation/drift/stale-render.ts (ADR-017 #5702).
|
|
916
927
|
// detectStaleRenders above stays as a useful diagnostic primitive; the
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// mcp-bridge.ts — stable runtime seam for MCP server consumption (phase 1).
|
|
2
|
+
export {
|
|
3
|
+
loadWriteGateSnapshot,
|
|
4
|
+
shouldBlockPendingGateInSnapshot,
|
|
5
|
+
shouldBlockQueueExecutionInSnapshot,
|
|
6
|
+
} from "./bootstrap/write-gate.js";
|
|
7
|
+
export { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
|
+
export {
|
|
9
|
+
_getAdapter,
|
|
10
|
+
checkpointDatabase,
|
|
11
|
+
closeDatabase,
|
|
12
|
+
getAllMilestones,
|
|
13
|
+
getDb,
|
|
14
|
+
getGateResults,
|
|
15
|
+
getMilestoneSlices,
|
|
16
|
+
getPendingGates,
|
|
17
|
+
getSliceTasks,
|
|
18
|
+
insertDecision,
|
|
19
|
+
insertMilestone,
|
|
20
|
+
insertSlice,
|
|
21
|
+
openDatabase,
|
|
22
|
+
upsertMilestonePlanning,
|
|
23
|
+
} from "./gsd-db.js";
|
|
24
|
+
export { invalidateStateCache, isReusableGhostMilestone } from "./state.js";
|
|
25
|
+
export { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
26
|
+
export {
|
|
27
|
+
saveDecisionToDb,
|
|
28
|
+
saveRequirementToDb,
|
|
29
|
+
updateRequirementInDb,
|
|
30
|
+
} from "./db-writer.js";
|
|
31
|
+
export { rebuildState } from "./doctor.js";
|
|
32
|
+
export { queryJournal } from "./journal.js";
|
|
33
|
+
export {
|
|
34
|
+
claimReservedId,
|
|
35
|
+
findMilestoneIds,
|
|
36
|
+
getReservedMilestoneIds,
|
|
37
|
+
milestoneIdSort,
|
|
38
|
+
nextMilestoneId,
|
|
39
|
+
} from "./milestone-ids.js";
|
|
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
|
|
5
5
|
import type { ClaudeCodeMcpConfig } from "./preferences-types.js";
|
|
6
|
+
import { isGsdBrowserMcpServerConfig } from "../shared/gsd-browser-cli.js";
|
|
6
7
|
import { toMcpWildcardToolName } from "./mcp-tool-name.js";
|
|
7
8
|
import { resolveModelMcpConfig } from "./preferences-mcp.js";
|
|
8
9
|
|
|
@@ -83,34 +84,12 @@ function isWorkflowMcpServerConfig(config: unknown): boolean {
|
|
|
83
84
|
return args.some((arg) => arg.includes("gsd-mcp-server") || arg.includes("packages/mcp-server"));
|
|
84
85
|
}
|
|
85
86
|
|
|
86
|
-
function isBrowserMcpServerConfig(config: unknown): boolean {
|
|
87
|
-
if (!isRecord(config)) return false;
|
|
88
|
-
const command = typeof config.command === "string" ? config.command : "";
|
|
89
|
-
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const env = config.env;
|
|
94
|
-
if (isRecord(env)) {
|
|
95
|
-
if (
|
|
96
|
-
typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
97
|
-
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
98
|
-
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string"
|
|
99
|
-
) {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
|
|
105
|
-
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
87
|
export function discoverWorkflowMcpServerName(projectDir: string): string | undefined {
|
|
109
88
|
return discoverMcpServers(projectDir).find((server) => isWorkflowMcpServerConfig(server.config))?.name;
|
|
110
89
|
}
|
|
111
90
|
|
|
112
91
|
export function discoverBrowserMcpServerName(projectDir: string): string | undefined {
|
|
113
|
-
return discoverMcpServers(projectDir).find((server) =>
|
|
92
|
+
return discoverMcpServers(projectDir).find((server) => isGsdBrowserMcpServerConfig(server.config))?.name;
|
|
114
93
|
}
|
|
115
94
|
|
|
116
95
|
export function discoverMcpServerNames(projectDir: string): string[] {
|
|
@@ -5,13 +5,23 @@
|
|
|
5
5
|
// - postUnit: git commit, artifact verify, DB settle, then GitHub finalize
|
|
6
6
|
// - recovery: DB repair from artifacts, then GitHub finalize
|
|
7
7
|
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
|
|
8
10
|
import { loadFile } from "./files.js";
|
|
9
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
10
11
|
import { resolveMilestoneFile } from "./paths.js";
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
getMilestone,
|
|
14
|
+
getClosedSliceIds,
|
|
15
|
+
getLatestAssessmentByScope,
|
|
16
|
+
getMilestoneSlices,
|
|
17
|
+
isDbAvailable,
|
|
18
|
+
} from "./gsd-db.js";
|
|
12
19
|
import { isClosedStatus } from "./status-guards.js";
|
|
20
|
+
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
21
|
+
import { handleCompleteMilestone } from "./tools/complete-milestone.js";
|
|
13
22
|
import { runSafely } from "./auto-utils.js";
|
|
14
23
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
24
|
+
import { uatSignoffBlockerGuidance } from "./guidance.js";
|
|
15
25
|
import { logWarning } from "./workflow-logger.js";
|
|
16
26
|
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
17
27
|
import { buildCompleteMilestonePrompt } from "./auto-prompts.js";
|
|
@@ -28,6 +38,76 @@ import {
|
|
|
28
38
|
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
29
39
|
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
30
40
|
|
|
41
|
+
/**
|
|
42
|
+
* True when a milestone is terminal for git cleanup (orphaned worktrees, stale branches).
|
|
43
|
+
* DB-authoritative (ADR-017): closed status, or validation-pass with all slices closed.
|
|
44
|
+
* When the DB is unavailable we cannot make this decision and conservatively
|
|
45
|
+
* return false so callers leave the worktree/branch alone instead of cleaning
|
|
46
|
+
* up based on parsed projections.
|
|
47
|
+
*/
|
|
48
|
+
export async function isCompletedMilestoneTerminal(
|
|
49
|
+
_basePath: string,
|
|
50
|
+
milestoneId: string,
|
|
51
|
+
): Promise<boolean> {
|
|
52
|
+
if (!isDbAvailable()) return false;
|
|
53
|
+
|
|
54
|
+
const milestone = getMilestone(milestoneId);
|
|
55
|
+
if (!milestone) return false;
|
|
56
|
+
|
|
57
|
+
if (isClosedStatus(milestone.status)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
62
|
+
if (validation?.status !== "pass") {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
67
|
+
if (slices.length === 0) return false;
|
|
68
|
+
return slices.every((slice) => isClosedStatus(slice.status));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Write a missing milestone SUMMARY projection when canonical DB closeout already settled. */
|
|
72
|
+
export async function repairMissingMilestoneSummaryProjection(
|
|
73
|
+
basePath: string,
|
|
74
|
+
milestoneId: string,
|
|
75
|
+
): Promise<{ ok: true } | { ok: false; error: string }> {
|
|
76
|
+
const milestone = getMilestone(milestoneId);
|
|
77
|
+
if (!milestone) {
|
|
78
|
+
return { ok: false, error: `milestone not found: ${milestoneId}` };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
82
|
+
const summaryPath = resolveExpectedArtifactPath("complete-milestone", milestoneId, artifactBasePath);
|
|
83
|
+
if (summaryPath && existsSync(summaryPath)) {
|
|
84
|
+
return { ok: true };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const result = await handleCompleteMilestone(
|
|
88
|
+
{
|
|
89
|
+
milestoneId,
|
|
90
|
+
title: milestone.title,
|
|
91
|
+
oneLiner: "Canonical closeout completed; summary projection repaired automatically.",
|
|
92
|
+
narrative:
|
|
93
|
+
"The workflow database recorded this milestone as complete, but the milestone SUMMARY artifact was missing on disk. " +
|
|
94
|
+
"Dispatch policy repaired the projection so closeout proof and cleanup can proceed.",
|
|
95
|
+
verificationPassed: true,
|
|
96
|
+
triggerReason: "closeout-projection-repair",
|
|
97
|
+
},
|
|
98
|
+
basePath,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if ("error" in result) {
|
|
102
|
+
return { ok: false, error: result.error };
|
|
103
|
+
}
|
|
104
|
+
const writtenSummaryPath = result.summaryPath;
|
|
105
|
+
if (result.stale || !writtenSummaryPath || !existsSync(writtenSummaryPath)) {
|
|
106
|
+
return { ok: false, error: "milestone SUMMARY projection write failed" };
|
|
107
|
+
}
|
|
108
|
+
return { ok: true };
|
|
109
|
+
}
|
|
110
|
+
|
|
31
111
|
/**
|
|
32
112
|
* True when the milestone is closed in the DB and the completion summary artifact exists.
|
|
33
113
|
* Polls briefly so post-unit verification can observe the tool's DB write.
|
|
@@ -78,7 +158,22 @@ export async function evaluateCompleteMilestoneDispatch(
|
|
|
78
158
|
if (isDbAvailable()) {
|
|
79
159
|
const milestone = getMilestone(mid);
|
|
80
160
|
if (milestone && isClosedStatus(milestone.status)) {
|
|
81
|
-
|
|
161
|
+
const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, mid);
|
|
162
|
+
const summaryPath = resolveExpectedArtifactPath("complete-milestone", mid, artifactBasePath);
|
|
163
|
+
const summaryMissing = !summaryPath || !existsSync(summaryPath);
|
|
164
|
+
if (summaryMissing) {
|
|
165
|
+
const repair = await repairMissingMilestoneSummaryProjection(basePath, mid);
|
|
166
|
+
if (!repair.ok) {
|
|
167
|
+
logWarning(
|
|
168
|
+
"dispatch",
|
|
169
|
+
`Milestone ${mid} is closed in DB but SUMMARY repair failed: ${repair.error}. Dispatching complete-milestone to retry.`,
|
|
170
|
+
);
|
|
171
|
+
} else {
|
|
172
|
+
return { action: "skip" };
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
return { action: "skip" };
|
|
176
|
+
}
|
|
82
177
|
}
|
|
83
178
|
}
|
|
84
179
|
|
|
@@ -86,31 +181,21 @@ export async function evaluateCompleteMilestoneDispatch(
|
|
|
86
181
|
if (closeoutGitStop) return closeoutGitStop;
|
|
87
182
|
|
|
88
183
|
if (prefs?.uat_dispatch) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (!roadmapContent) {
|
|
98
|
-
return {
|
|
99
|
-
action: "stop",
|
|
100
|
-
reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
|
|
101
|
-
level: "warning",
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
105
|
-
closedSliceIds = roadmap.slices.filter((slice) => slice.done).map((slice) => slice.id);
|
|
184
|
+
// DB-authoritative (ADR-017): UAT sign-off gating never parses the
|
|
185
|
+
// ROADMAP projection. Without a DB we cannot verify — stop conservatively.
|
|
186
|
+
if (!isDbAvailable()) {
|
|
187
|
+
return {
|
|
188
|
+
action: "stop",
|
|
189
|
+
reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because the workflow DB is not accessible.`,
|
|
190
|
+
level: "warning",
|
|
191
|
+
};
|
|
106
192
|
}
|
|
107
|
-
|
|
108
|
-
for (const sliceId of closedSliceIds) {
|
|
193
|
+
for (const sliceId of getClosedSliceIds(mid)) {
|
|
109
194
|
const result = await readUatGateVerdict(basePath, mid, sliceId);
|
|
110
195
|
if (!result) {
|
|
111
196
|
return {
|
|
112
197
|
action: "stop",
|
|
113
|
-
reason:
|
|
198
|
+
reason: uatSignoffBlockerGuidance(mid, sliceId),
|
|
114
199
|
level: "warning",
|
|
115
200
|
};
|
|
116
201
|
}
|
|
@@ -118,7 +203,7 @@ export async function evaluateCompleteMilestoneDispatch(
|
|
|
118
203
|
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
119
204
|
return {
|
|
120
205
|
action: "stop",
|
|
121
|
-
reason:
|
|
206
|
+
reason: uatSignoffBlockerGuidance(mid, sliceId, verdict),
|
|
122
207
|
level: "warning",
|
|
123
208
|
};
|
|
124
209
|
}
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./gsd-db.js";
|
|
16
16
|
import { invalidateStateCache } from "./state.js";
|
|
17
17
|
import { renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
18
|
-
import {
|
|
18
|
+
import { flushWorkflowProjections } from "./projection-flush.js";
|
|
19
19
|
import { writeManifest } from "./workflow-manifest.js";
|
|
20
20
|
import { appendEvent } from "./workflow-events.js";
|
|
21
21
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -171,7 +171,7 @@ async function renderPlanArtifacts(
|
|
|
171
171
|
|
|
172
172
|
async function runPostPlanHooks(basePath: string, params: PersistMilestonePlanParams): Promise<void> {
|
|
173
173
|
try {
|
|
174
|
-
await
|
|
174
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
175
175
|
writeManifest(basePath);
|
|
176
176
|
appendEvent(basePath, {
|
|
177
177
|
cmd: "plan-milestone",
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { gsdRoot } from "./paths.js";
|
|
1
|
+
import { workflowEventArchivePath, workflowEventLogPath } from "./workflow-event-ledger.js";
|
|
4
2
|
import { readEvents } from "./workflow-events.js";
|
|
5
3
|
|
|
6
4
|
export function latestExplicitReopenAt(basePath: string, milestoneId: string): string | null {
|
|
7
|
-
const root = gsdRoot(basePath);
|
|
8
5
|
const candidates = [
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
workflowEventLogPath(basePath),
|
|
7
|
+
workflowEventArchivePath(basePath, milestoneId),
|
|
11
8
|
];
|
|
12
9
|
|
|
13
10
|
let latest: string | null = null;
|
|
@@ -74,8 +74,8 @@ export function evaluateAllCompleteSettlement(
|
|
|
74
74
|
action: "pause",
|
|
75
75
|
message:
|
|
76
76
|
`Milestone ${milestoneId} is complete, but its worktree branch has not been merged to main. ` +
|
|
77
|
-
`Retry with \`/gsd dispatch complete-milestone ${milestoneId}\`
|
|
78
|
-
nextAction: `Retry \`/gsd dispatch complete-milestone ${milestoneId}
|
|
77
|
+
`Retry with \`/gsd dispatch complete-milestone ${milestoneId}\` to finish the system-owned merge.`,
|
|
78
|
+
nextAction: `Retry \`/gsd dispatch complete-milestone ${milestoneId}\`.`,
|
|
79
79
|
milestoneId,
|
|
80
80
|
};
|
|
81
81
|
}
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
import { execFileSync } from "node:child_process";
|
|
5
5
|
import type { NotificationPreferences } from "./types.js";
|
|
6
6
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
7
|
-
import { sendRemoteNotification } from "../remote-questions/notify.js";
|
|
7
|
+
import { sendRemoteNotification as _sendRemoteNotification } from "../remote-questions/notify.js";
|
|
8
|
+
|
|
9
|
+
/** Swappable dispatcher for remote notifications — exported so tests can mock it. */
|
|
10
|
+
export const remoteNotificationDispatcher = {
|
|
11
|
+
send: _sendRemoteNotification,
|
|
12
|
+
};
|
|
8
13
|
|
|
9
14
|
export type NotifyLevel = "info" | "success" | "warning" | "error";
|
|
10
15
|
export type NotificationKind = "complete" | "error" | "budget" | "milestone" | "attention";
|
|
@@ -30,28 +35,30 @@ export function sendDesktopNotification(
|
|
|
30
35
|
level: NotifyLevel = "info",
|
|
31
36
|
kind: NotificationKind = "complete",
|
|
32
37
|
projectName?: string,
|
|
38
|
+
deps: { notifications?: NotificationPreferences } = {},
|
|
33
39
|
): void {
|
|
34
40
|
// When a projectName is provided and the title is the default "GSD",
|
|
35
41
|
// replace it with a project-qualified title for multi-project clarity.
|
|
36
42
|
if (projectName && title === "GSD") {
|
|
37
43
|
title = formatNotificationTitle(projectName);
|
|
38
44
|
}
|
|
39
|
-
const
|
|
45
|
+
const loadedPreferences = loadEffectiveGSDPreferences()?.preferences;
|
|
46
|
+
const notifications = deps.notifications ?? loadedPreferences?.notifications;
|
|
40
47
|
|
|
41
48
|
// Remote notifications fire independently of desktop preferences.
|
|
42
49
|
// sendRemoteNotification handles "not configured" gracefully (early return).
|
|
43
|
-
void
|
|
50
|
+
void remoteNotificationDispatcher.send(title, message).catch(() => {});
|
|
44
51
|
|
|
45
|
-
if (!shouldSendDesktopNotification(kind,
|
|
52
|
+
if (!shouldSendDesktopNotification(kind, notifications)) return;
|
|
46
53
|
|
|
47
54
|
// cmux delivery and desktop delivery are independent — if cmux import or
|
|
48
55
|
// delivery fails, we must still attempt the native desktop notification.
|
|
49
56
|
const runCmux = async () => {
|
|
50
57
|
try {
|
|
51
58
|
const { CmuxClient, emitOsc777Notification, resolveCmuxConfig } = await import("../cmux/index.js");
|
|
52
|
-
const cmux = resolveCmuxConfig(
|
|
59
|
+
const cmux = resolveCmuxConfig(loadedPreferences);
|
|
53
60
|
if (cmux.notifications) {
|
|
54
|
-
const delivered = CmuxClient.fromPreferences(
|
|
61
|
+
const delivered = CmuxClient.fromPreferences(loadedPreferences).notify(title, message);
|
|
55
62
|
if (delivered) return true;
|
|
56
63
|
emitOsc777Notification(title, message);
|
|
57
64
|
}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
// GSD Extension - Legacy Parsers
|
|
2
2
|
// parseRoadmap() and parsePlan() extracted from files.ts.
|
|
3
|
-
// Used only by: md-importer.ts (migration), state.ts (pre-migration fallback),
|
|
4
|
-
// markdown-renderer.ts (detectStaleRenders disk-vs-DB comparison),
|
|
5
|
-
// commands-maintenance.ts (cold-path branch cleanup), and tests.
|
|
6
3
|
//
|
|
7
|
-
//
|
|
4
|
+
// ADR-017: the DB is the single source of truth; `.gsd/*.md` files are
|
|
5
|
+
// projections. These parsers may be imported ONLY for:
|
|
6
|
+
// - migration/import (md-importer, workflow-migration, migration-auto-check)
|
|
7
|
+
// - drift detection that compares both sources by design
|
|
8
|
+
// (state-reconciliation/drift, markdown-renderer stale-render detection)
|
|
9
|
+
// - explicit pre-migration / DB-unavailable fallbacks (state.ts,
|
|
10
|
+
// reactive-graph.ts, auto-recovery.ts)
|
|
11
|
+
// - diagnostics and display/telemetry-only surfaces (doctor,
|
|
12
|
+
// doctor-git-checks, workspace-index, visualizer-data, auto-prompts
|
|
13
|
+
// context text, commands-maintenance, milestone-closeout, github-sync)
|
|
14
|
+
// - tests
|
|
15
|
+
//
|
|
16
|
+
// Dispatch/gate/completion DECISION paths must NOT import this module — they
|
|
17
|
+
// read the DB via gsd-db queries (e.g. getMilestoneSliceSummaries). Enforced
|
|
18
|
+
// by tests/parsers-legacy-importers.test.ts; new importers must be added to
|
|
19
|
+
// its allowlist with a one-line justification.
|
|
8
20
|
|
|
9
21
|
import { extractSection, parseBullets, extractBoldField, extractAllSections, registerCacheClearCallback } from './files.js';
|
|
10
22
|
import { splitFrontmatter } from '../shared/frontmatter.js';
|
|
@@ -185,8 +185,9 @@ export function resolveThinkingLevelForUnit(unitType: string): GSDThinkingLevel
|
|
|
185
185
|
*/
|
|
186
186
|
export function resolveDefaultSessionModel(
|
|
187
187
|
sessionProvider?: string,
|
|
188
|
+
basePath?: string,
|
|
188
189
|
): { provider: string; id: string } | undefined {
|
|
189
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
190
|
+
const prefs = loadEffectiveGSDPreferences(basePath, { availableModelIds: [] });
|
|
190
191
|
const models = prefs?.preferences?.models;
|
|
191
192
|
if (!models) return undefined;
|
|
192
193
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Single workflow projection flush seam for mutation exits.
|
|
3
|
+
|
|
4
|
+
import { renderAllProjections } from "./workflow-projections.js";
|
|
5
|
+
|
|
6
|
+
export interface ProjectionFlushScope {
|
|
7
|
+
milestoneId: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ProjectionFlushResult {
|
|
11
|
+
milestoneId: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function flushWorkflowProjections(
|
|
15
|
+
basePath: string,
|
|
16
|
+
scope: ProjectionFlushScope,
|
|
17
|
+
): Promise<ProjectionFlushResult> {
|
|
18
|
+
await renderAllProjections(basePath, scope.milestoneId);
|
|
19
|
+
return { milestoneId: scope.milestoneId };
|
|
20
|
+
}
|
|
@@ -24,7 +24,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
24
24
|
|
|
25
25
|
1. Use the inlined Slice Summary and UAT templates.
|
|
26
26
|
2. {{skillActivation}}
|
|
27
|
-
3. Run all slice-level verification through `gsd_exec` / Context Mode evidence; refresh current state if needed. Do not use direct `bash` for verification commands.
|
|
27
|
+
3. Run all slice-level verification through `gsd_exec` / Context Mode evidence; refresh current state if needed. Do not use direct `bash` for verification commands. See the prepended **Tool Surface** block for unavailable tools.
|
|
28
28
|
4. Complete only when every required check passes. If verification fails or source changes are needed, do **not** edit source files in this unit and do **not** call `gsd_slice_complete`.
|
|
29
29
|
5. If verification fails:
|
|
30
30
|
- Task-specific regressions: if the failure is in files the task touched and pre-task verification evidence shows it was absent before that task ran, call `gsd_task_reopen` with that task and reason.
|
|
@@ -36,9 +36,9 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
36
36
|
8. Address every Gate to Close. Q8 = **Operational Readiness**: health signal, failure signal, recovery, monitoring gaps. Omit empty sections.
|
|
37
37
|
9. If requirement status changed, call `gsd_requirement_update`; do not write `.gsd/REQUIREMENTS.md` directly.
|
|
38
38
|
10. Prepare `gsd_slice_complete` content with camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`.
|
|
39
|
-
11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type.
|
|
39
|
+
11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type. Declare the type as a bullet under a `## UAT Type` heading, exactly like `- UAT mode: browser-executable`.
|
|
40
40
|
**Web apps:** when inlined Web App UAT guidance is present, declare `browser-executable` or `runtime-executable` (not `artifact-driven`) for localhost/browser/screenshot steps; include dev-server preconditions and name Playwright specs when they exist.
|
|
41
|
-
12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `capture_thought`; do not append knowledge files.
|
|
41
|
+
12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `gsd_capture_thought` (MCP-scoped `mcp__...__gsd_capture_thought`), not bare `capture_thought`; do not append knowledge files.
|
|
42
42
|
13. When verification passes, call `gsd_slice_complete`. The DB-backed tool is the canonical write path. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}`. Do not edit roadmap checkboxes.
|
|
43
43
|
14. Do not run git commands.
|
|
44
44
|
15. If the current project state needs refresh, call `gsd_summary_save` with `artifact_type: "PROJECT"` and the full updated project markdown as `content`; omit `milestone_id`. Do not write or edit `.gsd/PROJECT.md` directly.
|
|
@@ -49,4 +49,4 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
49
49
|
|
|
50
50
|
**You MUST call `gsd_slice_complete` with summary and UAT content only after verification passes.**
|
|
51
51
|
|
|
52
|
-
When done, say: "Slice {{sliceId}} complete."
|
|
52
|
+
When done, say: "Slice {{sliceId}} complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
|