@opengsd/gsd-pi 1.2.0-dev.4c756166 → 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-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 +5 -2
- 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/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
- 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 +207 -73
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
- 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 +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +47 -29
- 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-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
- package/dist/resources/extensions/gsd/auto.js +49 -22
- 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 +69 -19
- 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 +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- 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 +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- 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/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -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 +261 -136
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- 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/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +144 -9
- 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 +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- 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/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- 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-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- 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/preferences.js +14 -0
- 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 +41 -87
- 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/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -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-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- 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 +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- 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 +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- 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/skip-slice.js +18 -36
- 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/undo.js +8 -7
- 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 +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- 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 +10 -10
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +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/api/visualizer/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 +10 -10
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- 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 -11
- 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 +207 -102
- 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 +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- 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/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.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 +5 -2
- 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/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -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-deps.ts +1 -1
- 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 +232 -76
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
- 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 +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +48 -33
- 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-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
- package/src/resources/extensions/gsd/auto.ts +69 -26
- 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 +89 -18
- 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 +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- 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 +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- 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/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -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 +272 -155
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- 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/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +195 -29
- 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 +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- 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/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- 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-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- 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/preferences.ts +18 -0
- 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 +47 -88
- 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/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -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-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- 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 +329 -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 +54 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- 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/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- 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 +44 -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/evidence-xref-gsd-exec.test.ts +157 -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/file-change-validator.test.ts +33 -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 +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- 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/migration-auto-check.test.ts +85 -1
- 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/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- 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/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- 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/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- 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-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.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 +75 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
- 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 +109 -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 +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- 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 +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- 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/skip-slice.ts +18 -44
- 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/undo.ts +9 -8
- 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 +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- 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/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Guidance module — the single catalog mapping typed findings
|
|
3
|
+
// (Recovery kinds, milestone blocker kinds, doctor issue codes, crash unit
|
|
4
|
+
// classes) to user-facing remediation: what happened and what to do next.
|
|
5
|
+
//
|
|
6
|
+
// Emit sites pass the typed finding; phrasing, command names, and step
|
|
7
|
+
// ordering live here. A missing catalog row is a visible gap, not a silent
|
|
8
|
+
// omission scattered across call sites.
|
|
9
|
+
/** Flatten guidance into a notification / pause-banner string. */
|
|
10
|
+
export function formatGuidance(guidance) {
|
|
11
|
+
if (guidance.steps.length === 0)
|
|
12
|
+
return guidance.summary;
|
|
13
|
+
const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
|
|
14
|
+
return `${guidance.summary}\n\n${numbered}`;
|
|
15
|
+
}
|
|
16
|
+
const RECOVERY_REMEDIATION = {
|
|
17
|
+
"tool-schema": "Fix the Unit Tool Contract or tool schema before retrying.",
|
|
18
|
+
"tool-contract": "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
|
|
19
|
+
"tool-unavailable": "The tool surface had not finished registering when the Unit called it (workflow MCP startup race). Retry after the surface is ready; escalate if the tool never appears.",
|
|
20
|
+
"deterministic-policy": "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
|
|
21
|
+
"lifecycle-progression": "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
|
|
22
|
+
"stale-worker": "Run `/gsd doctor` to detect and clear the stale worker or lock, then run `/gsd auto` to resume.",
|
|
23
|
+
"worktree-invalid": "Run `/gsd doctor` to diagnose the milestone worktree (`gsd worktree list` shows its state). Repair it, or merge salvageable work with `gsd worktree merge <name>` before recreating — recreating discards uncommitted work.",
|
|
24
|
+
"verification-drift": "Run `/gsd status` to see the verification finding, fix or re-run the verification, then run `/gsd auto` to resume. `/gsd doctor` can repair stale state files.",
|
|
25
|
+
"reconciliation-drift": "Run `/gsd doctor` to surface the persistent or repair-failed drift kinds, apply its fixes, then run `/gsd auto` to resume.",
|
|
26
|
+
"illegal-transition": "A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
|
|
27
|
+
"runtime-unknown": "Inspect the runtime error and add a dedicated classification if it is repeatable.",
|
|
28
|
+
"provider-transient": "Retry after the provider/network condition clears.",
|
|
29
|
+
"provider-permanent": "Inspect provider credentials, model entitlement, or request shape.",
|
|
30
|
+
};
|
|
31
|
+
export function recoveryRemediation(key) {
|
|
32
|
+
return RECOVERY_REMEDIATION[key];
|
|
33
|
+
}
|
|
34
|
+
// ─── Milestone validation blockers ──────────────────────────────────────
|
|
35
|
+
// NOTE: the first line of each blocker is load-bearing — validation-block-guard
|
|
36
|
+
// matches /milestone validation returned needs-(?:attention|remediation)/i.
|
|
37
|
+
// Keep that phrase intact when editing.
|
|
38
|
+
export function needsAttentionBlockerGuidance(milestoneId) {
|
|
39
|
+
return [
|
|
40
|
+
`Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
|
|
41
|
+
`Fix options:`,
|
|
42
|
+
`1. Review the validation details: \`/gsd status\``,
|
|
43
|
+
`2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
|
|
44
|
+
`3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
45
|
+
`4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
46
|
+
`After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
|
|
47
|
+
].join("\n");
|
|
48
|
+
}
|
|
49
|
+
export function needsRemediationBlockerGuidance(milestoneId) {
|
|
50
|
+
return [
|
|
51
|
+
`Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
|
|
52
|
+
`Fix options:`,
|
|
53
|
+
`1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
|
|
54
|
+
`2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
55
|
+
`3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
56
|
+
].join("\n");
|
|
57
|
+
}
|
|
58
|
+
// ─── Milestone closeout UAT sign-off blockers ───────────────────────────
|
|
59
|
+
// The first sentence is the blocker finding; the numbered steps are the
|
|
60
|
+
// resolution path. `verdict` is the recorded non-PASS verdict, or undefined
|
|
61
|
+
// when no verdict has been recorded at all.
|
|
62
|
+
export function uatSignoffBlockerGuidance(milestoneId, sliceId, verdict) {
|
|
63
|
+
const finding = verdict === undefined
|
|
64
|
+
? `missing UAT PASS verdict for ${sliceId}`
|
|
65
|
+
: `UAT verdict for ${sliceId} is "${verdict}"`;
|
|
66
|
+
const sliceSpecificRerunStep = `If ${sliceId} is not the most recently completed slice, type a chat request to re-run UAT for ${sliceId}; run-uat will record the verdict through \`gsd_uat_result_save\`.`;
|
|
67
|
+
const steps = verdict === undefined
|
|
68
|
+
? [
|
|
69
|
+
`1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
|
|
70
|
+
`2. ${sliceSpecificRerunStep}`,
|
|
71
|
+
`3. Review the UAT criteria and progress: \`/gsd status\``,
|
|
72
|
+
`4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
73
|
+
]
|
|
74
|
+
: [
|
|
75
|
+
`1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
|
|
76
|
+
`2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
|
|
77
|
+
`3. ${sliceSpecificRerunStep}`,
|
|
78
|
+
`4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
|
|
79
|
+
`5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
|
|
80
|
+
];
|
|
81
|
+
return [
|
|
82
|
+
`Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
|
|
83
|
+
`Fix options:`,
|
|
84
|
+
...steps,
|
|
85
|
+
].join("\n");
|
|
86
|
+
}
|
|
87
|
+
// ─── Worktree isolation degradation ─────────────────────────────────────
|
|
88
|
+
// The first sentence of each notice is load-bearing for log matching and
|
|
89
|
+
// tests — keep it intact and append guidance after it.
|
|
90
|
+
function restoreIsolationHint(milestoneId) {
|
|
91
|
+
return `To restore isolation: close any processes using the old worktree, merge salvageable work with \`/gsd worktree merge ${milestoneId}\` or remove the stale worktree with \`/gsd worktree remove ${milestoneId}\`, then run \`/gsd doctor fix\`.`;
|
|
92
|
+
}
|
|
93
|
+
export function worktreeCreationFailedGuidance(milestoneId, error) {
|
|
94
|
+
return [
|
|
95
|
+
`Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
|
|
96
|
+
`Worktree isolation is degraded for this session.`,
|
|
97
|
+
restoreIsolationHint(milestoneId),
|
|
98
|
+
].join("\n");
|
|
99
|
+
}
|
|
100
|
+
export function isolationDegradedFallbackGuidance(milestoneId) {
|
|
101
|
+
return [
|
|
102
|
+
`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
|
|
103
|
+
`Work continues safely on the milestone branch in the project root.`,
|
|
104
|
+
restoreIsolationHint(milestoneId),
|
|
105
|
+
].join("\n");
|
|
106
|
+
}
|
|
107
|
+
/** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
|
|
108
|
+
export function milestoneEntryBlockedGuidance(milestoneId, reason) {
|
|
109
|
+
const finding = reason === "creation-failed"
|
|
110
|
+
? `worktree/branch creation failed. Isolation is degraded.`
|
|
111
|
+
: `isolation is degraded from a prior worktree failure.`;
|
|
112
|
+
return [
|
|
113
|
+
`Cannot enter milestone ${milestoneId}: ${finding}`,
|
|
114
|
+
restoreIsolationHint(milestoneId),
|
|
115
|
+
`Then run \`/gsd auto\` to retry.`,
|
|
116
|
+
].join("\n");
|
|
117
|
+
}
|
|
118
|
+
// ─── Crash recovery resume hints ────────────────────────────────────────
|
|
119
|
+
/** Resume hint for an interrupted auto-mode unit, by unit class. */
|
|
120
|
+
export function crashResumeHint(unitType, unitId) {
|
|
121
|
+
if (unitType === "starting" && unitId === "bootstrap") {
|
|
122
|
+
return `No work was lost. Run /gsd auto to restart.`;
|
|
123
|
+
}
|
|
124
|
+
if (unitType.includes("research") || unitType.includes("plan")) {
|
|
125
|
+
return `The ${unitType} unit may be incomplete. Run /gsd auto to re-run it.`;
|
|
126
|
+
}
|
|
127
|
+
if (unitType.includes("execute")) {
|
|
128
|
+
return `Task execution was interrupted. Run /gsd auto to resume — completed work is preserved.`;
|
|
129
|
+
}
|
|
130
|
+
if (unitType.includes("complete")) {
|
|
131
|
+
return `Slice/milestone completion was interrupted. Run /gsd auto to finish.`;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
// ─── Doctor issue fix hints ─────────────────────────────────────────────
|
|
136
|
+
// Partial by design: codes without a row render no hint. Add rows here as
|
|
137
|
+
// guidance is authored — the gap is visible in one place.
|
|
138
|
+
const DOCTOR_FIX_HINTS = {
|
|
139
|
+
db_unavailable: "The workflow database could not be opened — state derivation is degraded. Restart the session; if it persists, run `/gsd doctor` from the project root.",
|
|
140
|
+
stale_crash_lock: "Run `/gsd doctor` to clear the stale lock, then `/gsd auto` to resume.",
|
|
141
|
+
stale_parallel_session: "Run `/gsd doctor` to clear the stale session registration.",
|
|
142
|
+
unresolved_git_conflicts: "Resolve the conflict markers, commit, then re-run `/gsd auto`.",
|
|
143
|
+
conflict_markers_in_tracked_files: "Search the listed files for `<<<<<<<` markers, resolve, and commit.",
|
|
144
|
+
worktree_dirty: "Commit or merge the worktree's changes (`gsd worktree merge <name>`) before removing it.",
|
|
145
|
+
worktree_branch_merged: "The branch is merged — remove the worktree to reclaim space.",
|
|
146
|
+
orphaned_auto_worktree: "Run `/gsd doctor` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
|
|
147
|
+
gitignore_missing_patterns: "Run `/gsd doctor` to append the missing .gitignore patterns.",
|
|
148
|
+
invalid_preferences: "Edit .gsd/PREFERENCES.md to fix the invalid field, then re-run the command.",
|
|
149
|
+
provider_key_missing: "Add the provider API key to your environment or provider config, then retry.",
|
|
150
|
+
provider_key_backedoff: "The key is cooling down after repeated failures — wait, or switch the phase model in .gsd/PREFERENCES.md.",
|
|
151
|
+
state_file_stale: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
152
|
+
state_file_missing: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
153
|
+
projection_drift: "Run `/gsd doctor` to rebuild markdown projections from the database (DB is the source of truth).",
|
|
154
|
+
uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
|
|
155
|
+
};
|
|
156
|
+
export function doctorFixHint(code) {
|
|
157
|
+
return DOCTOR_FIX_HINTS[code];
|
|
158
|
+
}
|
|
@@ -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
|
|
@@ -1188,6 +1276,27 @@ function selfHealRuntimeRecords(basePath, ctx) {
|
|
|
1188
1276
|
return { cleared: 0 };
|
|
1189
1277
|
}
|
|
1190
1278
|
}
|
|
1279
|
+
/**
|
|
1280
|
+
* True when an agent turn is currently streaming or a dispatched message is
|
|
1281
|
+
* still queued waiting to trigger one. Used by the pending-auto-start stale
|
|
1282
|
+
* check: a live discuss turn can run for minutes before writing its first
|
|
1283
|
+
* artifact, and deleting its entry as "stale" re-dispatches the workflow —
|
|
1284
|
+
* resetting the interview and producing a duplicate completion turn.
|
|
1285
|
+
*/
|
|
1286
|
+
function isAgentTurnInFlight(ctx) {
|
|
1287
|
+
try {
|
|
1288
|
+
if (typeof ctx.isIdle === "function" && !ctx.isIdle())
|
|
1289
|
+
return true;
|
|
1290
|
+
if (typeof ctx.hasPendingMessages === "function" && ctx.hasPendingMessages())
|
|
1291
|
+
return true;
|
|
1292
|
+
}
|
|
1293
|
+
catch {
|
|
1294
|
+
// assertActive() throws on a stale runner context; fall through to
|
|
1295
|
+
// artifact/age staleness signals.
|
|
1296
|
+
logWarning("guided", "isAgentTurnInFlight: ctx method threw (stale runner); assuming no turn in flight");
|
|
1297
|
+
}
|
|
1298
|
+
return false;
|
|
1299
|
+
}
|
|
1191
1300
|
// ─── Milestone Actions Submenu ──────────────────────────────────────────────
|
|
1192
1301
|
/**
|
|
1193
1302
|
* Shows a submenu with Park / Discard / Skip / Back options for the active milestone.
|
|
@@ -1276,6 +1385,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
|
|
|
1276
1385
|
}
|
|
1277
1386
|
export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
1278
1387
|
const stepMode = options?.step ?? true;
|
|
1388
|
+
warmWorkflowMcpProbeInBackground(basePath);
|
|
1279
1389
|
// ── Clear stale milestone ID reservations from previous cancelled sessions ──
|
|
1280
1390
|
// Reservations only need to survive within a single /gsd interaction.
|
|
1281
1391
|
// Without this, each cancelled session permanently bumps the next ID. (#2488)
|
|
@@ -1479,12 +1589,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1479
1589
|
// and fires another dispatchWorkflow, resetting the conversation mid-interview.
|
|
1480
1590
|
if (hasPendingAutoStart(basePath)) {
|
|
1481
1591
|
// #3274: If /clear interrupted the discussion, the pending entry is stale.
|
|
1482
|
-
// Detect staleness: no manifest, no milestone CONTEXT artifact,
|
|
1483
|
-
// 30s (avoids race between .set() and LLM writing
|
|
1592
|
+
// Detect staleness: no manifest, no milestone CONTEXT/CONTEXT-DRAFT artifact,
|
|
1593
|
+
// the entry is older than 30s (avoids race between .set() and LLM writing the
|
|
1594
|
+
// first artifact), AND no agent turn is in flight. A dispatched discuss turn
|
|
1595
|
+
// can think for well over 30s before its first question round writes any
|
|
1596
|
+
// artifact; deleting the entry while that turn is live re-dispatches the
|
|
1597
|
+
// workflow, which both resets the interview and queues a duplicate turn that
|
|
1598
|
+
// replays the final "context written" message after the real one.
|
|
1484
1599
|
const entry = _getPendingAutoStart(basePath);
|
|
1485
1600
|
const ageMs = Date.now() - (entry.createdAt || 0);
|
|
1486
1601
|
const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
|
|
1487
1602
|
const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
|
|
1603
|
+
const milestoneHasDraft = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT-DRAFT");
|
|
1488
1604
|
const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
|
|
1489
1605
|
const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
|
|
1490
1606
|
const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
|
|
@@ -1493,11 +1609,30 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1493
1609
|
// Clear stale in-memory guard and continue through normal active-milestone routing.
|
|
1494
1610
|
deletePendingAutoStart(basePath);
|
|
1495
1611
|
}
|
|
1496
|
-
else if (!manifestExists &&
|
|
1612
|
+
else if (!manifestExists &&
|
|
1613
|
+
!milestoneHasContext &&
|
|
1614
|
+
!milestoneHasDraft &&
|
|
1615
|
+
ageMs > 30_000 &&
|
|
1616
|
+
!isAgentTurnInFlight(ctx)) {
|
|
1497
1617
|
// Stale entry from an interrupted discussion — clear and continue
|
|
1498
1618
|
deletePendingAutoStart(basePath);
|
|
1499
1619
|
}
|
|
1500
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
|
+
}
|
|
1501
1636
|
ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
|
|
1502
1637
|
return;
|
|
1503
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);
|