@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- 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 +123 -20
- 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/bg-shell/utilities.js +3 -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 +456 -198
- 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 +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- 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 +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- 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/captures.js +4 -6
- 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 +12 -15
- 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 +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -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 +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- 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/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- 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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- 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 +2 -2
- 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 +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- 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 +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- 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 +108 -0
- 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 +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- 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-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- 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/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- 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-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- 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 +13 -13
- 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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- 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/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/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 -50
- 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 +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- 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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/bg-shell/utilities.ts +3 -0
- 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 +537 -202
- 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 +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- 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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- 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/captures.ts +4 -6
- 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 +13 -11
- 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 +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -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 +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- 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/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- 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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- 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 +2 -2
- 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 +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- 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 +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- 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 +77 -1
- 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/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- 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 +148 -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 +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -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/notification-store.test.ts +32 -0
- 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/pre-execution-checks.test.ts +193 -1
- 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-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- 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 +27 -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/stop-notice.test.ts +70 -0
- 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-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- 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-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -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 +67 -4
- 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 +275 -40
- 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 +183 -0
- 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 +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- 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-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- 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/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- 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-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- 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/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -42,15 +42,21 @@ 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
|
-
import { getPendingGate } from "./bootstrap/write-gate.js";
|
|
56
|
+
import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
51
57
|
import { _getPendingAutoStart, deletePendingAutoStart, hasPendingAutoStart, setPendingAutoStart, } from "./pending-auto-start.js";
|
|
52
58
|
import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
|
|
53
|
-
import { scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
|
|
59
|
+
import { checkAutoStartAfterDiscuss, scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
|
|
54
60
|
export { maybeHandleEmptyIntentTurn, maybeHandleReadyPhraseWithoutFiles, resetEmptyTurnCounter, } from "./guided-unit-completion.js";
|
|
55
61
|
export { _getPendingAutoStart, clearPendingAutoStart, getDiscussionMilestoneId, setPendingAutoStart, } from "./pending-auto-start.js";
|
|
56
62
|
export { checkAutoStartAfterDiscuss } from "./discussion-handoff.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)
|
|
@@ -1529,6 +1618,21 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1529
1618
|
deletePendingAutoStart(basePath);
|
|
1530
1619
|
}
|
|
1531
1620
|
else {
|
|
1621
|
+
if (milestoneHasContext && !isAgentTurnInFlight(ctx)) {
|
|
1622
|
+
// The discussion already produced CONTEXT but the agent_end handoff
|
|
1623
|
+
// never consumed the entry — e.g. an external-engine post-hoc gate
|
|
1624
|
+
// re-arm wiped the depth verification after the save (write-gate
|
|
1625
|
+
// two-process sync). CONTEXT can only be written through a verified
|
|
1626
|
+
// depth gate, so a gate still pending for this milestone is stale:
|
|
1627
|
+
// clear it and re-run the handoff instead of dead-ending.
|
|
1628
|
+
const gateBasePath = entry.scope.workspace.projectRoot;
|
|
1629
|
+
const pendingGateId = getPendingGate(gateBasePath);
|
|
1630
|
+
if (pendingGateId && extractDepthVerificationMilestoneId(pendingGateId) === entry.milestoneId) {
|
|
1631
|
+
clearPendingGate(gateBasePath);
|
|
1632
|
+
}
|
|
1633
|
+
if (checkAutoStartAfterDiscuss(basePath))
|
|
1634
|
+
return;
|
|
1635
|
+
}
|
|
1532
1636
|
ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
|
|
1533
1637
|
return;
|
|
1534
1638
|
}
|
|
@@ -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";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
|
+
import { isGsdBrowserMcpServerConfig } from "../shared/gsd-browser-cli.js";
|
|
4
5
|
import { toMcpWildcardToolName } from "./mcp-tool-name.js";
|
|
5
6
|
import { resolveModelMcpConfig } from "./preferences-mcp.js";
|
|
6
7
|
function isRecord(value) {
|
|
@@ -63,29 +64,11 @@ function isWorkflowMcpServerConfig(config) {
|
|
|
63
64
|
const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
|
|
64
65
|
return args.some((arg) => arg.includes("gsd-mcp-server") || arg.includes("packages/mcp-server"));
|
|
65
66
|
}
|
|
66
|
-
function isBrowserMcpServerConfig(config) {
|
|
67
|
-
if (!isRecord(config))
|
|
68
|
-
return false;
|
|
69
|
-
const command = typeof config.command === "string" ? config.command : "";
|
|
70
|
-
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
const env = config.env;
|
|
74
|
-
if (isRecord(env)) {
|
|
75
|
-
if (typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
76
|
-
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
77
|
-
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string") {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
|
|
82
|
-
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
83
|
-
}
|
|
84
67
|
export function discoverWorkflowMcpServerName(projectDir) {
|
|
85
68
|
return discoverMcpServers(projectDir).find((server) => isWorkflowMcpServerConfig(server.config))?.name;
|
|
86
69
|
}
|
|
87
70
|
export function discoverBrowserMcpServerName(projectDir) {
|
|
88
|
-
return discoverMcpServers(projectDir).find((server) =>
|
|
71
|
+
return discoverMcpServers(projectDir).find((server) => isGsdBrowserMcpServerConfig(server.config))?.name;
|
|
89
72
|
}
|
|
90
73
|
export function discoverMcpServerNames(projectDir) {
|
|
91
74
|
return discoverMcpServers(projectDir).map((server) => server.name);
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
|
-
// File Purpose:
|
|
2
|
+
// File Purpose: GSD-facing face over the shared @gsd/pi-ai MCP tool-name helpers.
|
|
3
|
+
import { parseMcpToolName as parsePiAiMcpToolName, stripMcpToolPrefix } from "@gsd/pi-ai";
|
|
3
4
|
const MCP_TOOL_PREFIX = "mcp__";
|
|
4
5
|
export function parseMcpToolName(toolName) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const toolSeparator = toolName.indexOf("__", MCP_TOOL_PREFIX.length);
|
|
8
|
-
if (toolSeparator < 0)
|
|
9
|
-
return null;
|
|
10
|
-
return {
|
|
11
|
-
serverName: toolName.slice(MCP_TOOL_PREFIX.length, toolSeparator),
|
|
12
|
-
toolName: toolName.slice(toolSeparator + 2),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export function stripMcpToolPrefix(toolName) {
|
|
16
|
-
return parseMcpToolName(toolName)?.toolName ?? toolName;
|
|
6
|
+
const parsed = parsePiAiMcpToolName(toolName);
|
|
7
|
+
return parsed ? { serverName: parsed.server, toolName: parsed.tool } : null;
|
|
17
8
|
}
|
|
9
|
+
export { stripMcpToolPrefix };
|
|
18
10
|
export function toMcpToolName(serverName, toolName) {
|
|
19
11
|
return `${MCP_TOOL_PREFIX}${serverName}__${toolName}`;
|
|
20
12
|
}
|
|
@@ -211,7 +211,7 @@ export function reportConsolidationGaps(basePath) {
|
|
|
211
211
|
const report = scanConsolidationGaps(basePath);
|
|
212
212
|
if (report.totalGaps === 0)
|
|
213
213
|
return report;
|
|
214
|
-
appendNotification(report.summary, "warning", "workflow-logger");
|
|
214
|
+
appendNotification(report.summary, "warning", "workflow-logger", { kind: "memory-consolidation" });
|
|
215
215
|
logWarning("memory-consolidation", report.summary);
|
|
216
216
|
return report;
|
|
217
217
|
}
|
|
@@ -8,6 +8,7 @@ import { readCrashLock, isLockProcessAlive } from "../crash-recovery.js";
|
|
|
8
8
|
import { closeWorkflowDatabase } from "../db-workspace.js";
|
|
9
9
|
import { readPausedSessionMetadata } from "../interrupted-session.js";
|
|
10
10
|
import { gsdRoot } from "../paths.js";
|
|
11
|
+
import { canonicalWorktreesDir } from "../worktree-placement.js";
|
|
11
12
|
export class MigrationBlockedError extends Error {
|
|
12
13
|
constructor(message) {
|
|
13
14
|
super(message);
|
|
@@ -78,8 +79,10 @@ export function assertMigrationHasSlices(preview) {
|
|
|
78
79
|
throw new MigrationBlockedError("Migration blocked - the legacy project would produce zero slices. Add a ROADMAP.md or phases/ content before migrating.");
|
|
79
80
|
}
|
|
80
81
|
function hasWorktreeState(targetRoot) {
|
|
82
|
+
// Legacy container is probed via gsdRoot() (symlink-resolved) on purpose —
|
|
83
|
+
// migration targets may have .gsd in the external-state layout.
|
|
81
84
|
const containers = [
|
|
82
|
-
|
|
85
|
+
canonicalWorktreesDir(targetRoot),
|
|
83
86
|
join(gsdRoot(targetRoot), "worktrees"),
|
|
84
87
|
];
|
|
85
88
|
for (const worktreesDir of containers) {
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
// - preflight: dispatch git clean before complete-milestone agent (auto-dispatch)
|
|
5
5
|
// - postUnit: git commit, artifact verify, DB settle, then GitHub finalize
|
|
6
6
|
// - recovery: DB repair from artifacts, then GitHub finalize
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
7
8
|
import { loadFile } from "./files.js";
|
|
8
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
9
9
|
import { resolveMilestoneFile } from "./paths.js";
|
|
10
|
-
import { getMilestone, getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
|
|
10
|
+
import { getMilestone, getClosedSliceIds, getLatestAssessmentByScope, getMilestoneSlices, isDbAvailable, } from "./gsd-db.js";
|
|
11
11
|
import { isClosedStatus } from "./status-guards.js";
|
|
12
|
+
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
13
|
+
import { handleCompleteMilestone } from "./tools/complete-milestone.js";
|
|
12
14
|
import { runSafely } from "./auto-utils.js";
|
|
13
15
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
16
|
+
import { uatSignoffBlockerGuidance } from "./guidance.js";
|
|
14
17
|
import { logWarning } from "./workflow-logger.js";
|
|
15
18
|
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
16
19
|
import { buildCompleteMilestonePrompt } from "./auto-prompts.js";
|
|
@@ -19,6 +22,60 @@ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
|
19
22
|
import { commitPendingMilestoneCloseoutChanges, findMissingSummaries, isVerificationNotApplicable, readUatGateVerdict, } from "./auto-dispatch.js";
|
|
20
23
|
const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
|
|
21
24
|
const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
|
|
25
|
+
/**
|
|
26
|
+
* True when a milestone is terminal for git cleanup (orphaned worktrees, stale branches).
|
|
27
|
+
* DB-authoritative (ADR-017): closed status, or validation-pass with all slices closed.
|
|
28
|
+
* When the DB is unavailable we cannot make this decision and conservatively
|
|
29
|
+
* return false so callers leave the worktree/branch alone instead of cleaning
|
|
30
|
+
* up based on parsed projections.
|
|
31
|
+
*/
|
|
32
|
+
export async function isCompletedMilestoneTerminal(_basePath, milestoneId) {
|
|
33
|
+
if (!isDbAvailable())
|
|
34
|
+
return false;
|
|
35
|
+
const milestone = getMilestone(milestoneId);
|
|
36
|
+
if (!milestone)
|
|
37
|
+
return false;
|
|
38
|
+
if (isClosedStatus(milestone.status)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
42
|
+
if (validation?.status !== "pass") {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
46
|
+
if (slices.length === 0)
|
|
47
|
+
return false;
|
|
48
|
+
return slices.every((slice) => isClosedStatus(slice.status));
|
|
49
|
+
}
|
|
50
|
+
/** Write a missing milestone SUMMARY projection when canonical DB closeout already settled. */
|
|
51
|
+
export async function repairMissingMilestoneSummaryProjection(basePath, milestoneId) {
|
|
52
|
+
const milestone = getMilestone(milestoneId);
|
|
53
|
+
if (!milestone) {
|
|
54
|
+
return { ok: false, error: `milestone not found: ${milestoneId}` };
|
|
55
|
+
}
|
|
56
|
+
const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
57
|
+
const summaryPath = resolveExpectedArtifactPath("complete-milestone", milestoneId, artifactBasePath);
|
|
58
|
+
if (summaryPath && existsSync(summaryPath)) {
|
|
59
|
+
return { ok: true };
|
|
60
|
+
}
|
|
61
|
+
const result = await handleCompleteMilestone({
|
|
62
|
+
milestoneId,
|
|
63
|
+
title: milestone.title,
|
|
64
|
+
oneLiner: "Canonical closeout completed; summary projection repaired automatically.",
|
|
65
|
+
narrative: "The workflow database recorded this milestone as complete, but the milestone SUMMARY artifact was missing on disk. " +
|
|
66
|
+
"Dispatch policy repaired the projection so closeout proof and cleanup can proceed.",
|
|
67
|
+
verificationPassed: true,
|
|
68
|
+
triggerReason: "closeout-projection-repair",
|
|
69
|
+
}, basePath);
|
|
70
|
+
if ("error" in result) {
|
|
71
|
+
return { ok: false, error: result.error };
|
|
72
|
+
}
|
|
73
|
+
const writtenSummaryPath = result.summaryPath;
|
|
74
|
+
if (result.stale || !writtenSummaryPath || !existsSync(writtenSummaryPath)) {
|
|
75
|
+
return { ok: false, error: "milestone SUMMARY projection write failed" };
|
|
76
|
+
}
|
|
77
|
+
return { ok: true };
|
|
78
|
+
}
|
|
22
79
|
/**
|
|
23
80
|
* True when the milestone is closed in the DB and the completion summary artifact exists.
|
|
24
81
|
* Polls briefly so post-unit verification can observe the tool's DB write.
|
|
@@ -65,38 +122,42 @@ export async function evaluateCompleteMilestoneDispatch(ctx) {
|
|
|
65
122
|
if (isDbAvailable()) {
|
|
66
123
|
const milestone = getMilestone(mid);
|
|
67
124
|
if (milestone && isClosedStatus(milestone.status)) {
|
|
68
|
-
|
|
125
|
+
const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, mid);
|
|
126
|
+
const summaryPath = resolveExpectedArtifactPath("complete-milestone", mid, artifactBasePath);
|
|
127
|
+
const summaryMissing = !summaryPath || !existsSync(summaryPath);
|
|
128
|
+
if (summaryMissing) {
|
|
129
|
+
const repair = await repairMissingMilestoneSummaryProjection(basePath, mid);
|
|
130
|
+
if (!repair.ok) {
|
|
131
|
+
logWarning("dispatch", `Milestone ${mid} is closed in DB but SUMMARY repair failed: ${repair.error}. Dispatching complete-milestone to retry.`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
return { action: "skip" };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
return { action: "skip" };
|
|
139
|
+
}
|
|
69
140
|
}
|
|
70
141
|
}
|
|
71
142
|
const closeoutGitStop = commitPendingMilestoneCloseoutChanges(basePath, mid);
|
|
72
143
|
if (closeoutGitStop)
|
|
73
144
|
return closeoutGitStop;
|
|
74
145
|
if (prefs?.uat_dispatch) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
84
|
-
if (!roadmapContent) {
|
|
85
|
-
return {
|
|
86
|
-
action: "stop",
|
|
87
|
-
reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
|
|
88
|
-
level: "warning",
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
92
|
-
closedSliceIds = roadmap.slices.filter((slice) => slice.done).map((slice) => slice.id);
|
|
146
|
+
// DB-authoritative (ADR-017): UAT sign-off gating never parses the
|
|
147
|
+
// ROADMAP projection. Without a DB we cannot verify — stop conservatively.
|
|
148
|
+
if (!isDbAvailable()) {
|
|
149
|
+
return {
|
|
150
|
+
action: "stop",
|
|
151
|
+
reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because the workflow DB is not accessible.`,
|
|
152
|
+
level: "warning",
|
|
153
|
+
};
|
|
93
154
|
}
|
|
94
|
-
for (const sliceId of
|
|
155
|
+
for (const sliceId of getClosedSliceIds(mid)) {
|
|
95
156
|
const result = await readUatGateVerdict(basePath, mid, sliceId);
|
|
96
157
|
if (!result) {
|
|
97
158
|
return {
|
|
98
159
|
action: "stop",
|
|
99
|
-
reason:
|
|
160
|
+
reason: uatSignoffBlockerGuidance(mid, sliceId),
|
|
100
161
|
level: "warning",
|
|
101
162
|
};
|
|
102
163
|
}
|
|
@@ -104,7 +165,7 @@ export async function evaluateCompleteMilestoneDispatch(ctx) {
|
|
|
104
165
|
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
105
166
|
return {
|
|
106
167
|
action: "stop",
|
|
107
|
-
reason:
|
|
168
|
+
reason: uatSignoffBlockerGuidance(mid, sliceId, verdict),
|
|
108
169
|
level: "warning",
|
|
109
170
|
};
|
|
110
171
|
}
|
|
@@ -5,7 +5,7 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
5
5
|
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertMilestone, insertSlice, upsertMilestonePlanning, upsertSlicePlanning, } from "./gsd-db.js";
|
|
6
6
|
import { invalidateStateCache } from "./state.js";
|
|
7
7
|
import { renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
8
|
-
import {
|
|
8
|
+
import { flushWorkflowProjections } from "./projection-flush.js";
|
|
9
9
|
import { writeManifest } from "./workflow-manifest.js";
|
|
10
10
|
import { appendEvent } from "./workflow-events.js";
|
|
11
11
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -109,7 +109,7 @@ async function renderPlanArtifacts(basePath, params) {
|
|
|
109
109
|
}
|
|
110
110
|
async function runPostPlanHooks(basePath, params) {
|
|
111
111
|
try {
|
|
112
|
-
await
|
|
112
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
113
113
|
writeManifest(basePath);
|
|
114
114
|
appendEvent(basePath, {
|
|
115
115
|
cmd: "plan-milestone",
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { gsdRoot } from "./paths.js";
|
|
1
|
+
import { workflowEventArchivePath, workflowEventLogPath } from "./workflow-event-ledger.js";
|
|
3
2
|
import { readEvents } from "./workflow-events.js";
|
|
4
3
|
export function latestExplicitReopenAt(basePath, milestoneId) {
|
|
5
|
-
const root = gsdRoot(basePath);
|
|
6
4
|
const candidates = [
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
workflowEventLogPath(basePath),
|
|
6
|
+
workflowEventArchivePath(basePath, milestoneId),
|
|
9
7
|
];
|
|
10
8
|
let latest = null;
|
|
11
9
|
for (const file of candidates) {
|