@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- 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 +167 -64
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
- package/dist/resources/extensions/gsd/auto-start.js +26 -8
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +52 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +17 -21
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- 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/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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 +6 -6
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/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 +6 -6
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- 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 +8 -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 +50 -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/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 +17 -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-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/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/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 +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +468 -269
- 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/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/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/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- 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/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- 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/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
- package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
- package/src/resources/extensions/gsd/auto-start.ts +27 -11
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +64 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +19 -22
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/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-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -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 +62 -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/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/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/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -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-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -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/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- 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/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Share recent workflow MCP probe results across guided-flow and Claude Code SDK preflight.
|
|
3
|
+
|
|
4
|
+
import { testMcpServerConnection } from "../mcp-client/manager.js";
|
|
5
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
6
|
+
import {
|
|
7
|
+
detectWorkflowMcpLaunchConfig,
|
|
8
|
+
resolveWorkflowMcpProjectRoot,
|
|
9
|
+
} from "./workflow-mcp.js";
|
|
10
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
11
|
+
|
|
12
|
+
/** Reuse a recent successful probe instead of spawning another stdio server. */
|
|
13
|
+
export const WORKFLOW_MCP_PROBE_CACHE_TTL_MS = 120_000;
|
|
14
|
+
/** Per-probe connect + tools/list budget (server typically ready in ~1–2s). */
|
|
15
|
+
export const WORKFLOW_MCP_PROBE_TIMEOUT_MS = 5_000;
|
|
16
|
+
|
|
17
|
+
export interface WorkflowMcpProbeCacheEntry {
|
|
18
|
+
serverName: string;
|
|
19
|
+
tools: readonly string[];
|
|
20
|
+
probedAt: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type WorkflowMcpProbeResult = {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
tools: readonly string[];
|
|
26
|
+
serverName?: string;
|
|
27
|
+
error?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const cacheByProject = new Map<string, WorkflowMcpProbeCacheEntry>();
|
|
31
|
+
const probeInFlightByProject = new Map<string, Promise<WorkflowMcpProbeResult>>();
|
|
32
|
+
let activeWorkflowMcpSdkSessions = 0;
|
|
33
|
+
|
|
34
|
+
function cacheKey(projectRoot: string): string {
|
|
35
|
+
return resolveWorkflowMcpProjectRoot(projectRoot);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function beginWorkflowMcpSdkSession(): void {
|
|
39
|
+
activeWorkflowMcpSdkSessions++;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function endWorkflowMcpSdkSession(): void {
|
|
43
|
+
activeWorkflowMcpSdkSessions = Math.max(0, activeWorkflowMcpSdkSessions - 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getCachedWorkflowMcpProbe(projectRoot: string): WorkflowMcpProbeCacheEntry | null {
|
|
47
|
+
const entry = cacheByProject.get(cacheKey(projectRoot));
|
|
48
|
+
if (!entry) return null;
|
|
49
|
+
if (Date.now() - entry.probedAt > WORKFLOW_MCP_PROBE_CACHE_TTL_MS) {
|
|
50
|
+
cacheByProject.delete(cacheKey(projectRoot));
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return entry;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function recordWorkflowMcpProbe(
|
|
57
|
+
projectRoot: string,
|
|
58
|
+
serverName: string,
|
|
59
|
+
tools: readonly string[],
|
|
60
|
+
): void {
|
|
61
|
+
cacheByProject.set(cacheKey(projectRoot), {
|
|
62
|
+
serverName,
|
|
63
|
+
tools: [...tools],
|
|
64
|
+
probedAt: Date.now(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function clearWorkflowMcpProbeCache(projectRoot?: string): void {
|
|
69
|
+
if (projectRoot === undefined) {
|
|
70
|
+
cacheByProject.clear();
|
|
71
|
+
probeInFlightByProject.clear();
|
|
72
|
+
activeWorkflowMcpSdkSessions = 0;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const key = cacheKey(projectRoot);
|
|
76
|
+
cacheByProject.delete(key);
|
|
77
|
+
probeInFlightByProject.delete(key);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function workflowMcpProbeAdvertisesSurface(tools: readonly string[]): boolean {
|
|
81
|
+
return tools.some((tool) => isWorkflowToolSurfaceName(tool));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function cachedWorkflowMcpCoversRequired(
|
|
85
|
+
projectRoot: string,
|
|
86
|
+
serverName: string,
|
|
87
|
+
required: readonly string[],
|
|
88
|
+
): boolean {
|
|
89
|
+
const entry = getCachedWorkflowMcpProbe(projectRoot);
|
|
90
|
+
if (!entry || entry.serverName !== serverName) return false;
|
|
91
|
+
return required.every((tool) =>
|
|
92
|
+
entry.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function runProbeAndCacheWorkflowMcp(
|
|
97
|
+
projectRoot: string,
|
|
98
|
+
options: { timeoutMs?: number } = {},
|
|
99
|
+
): Promise<WorkflowMcpProbeResult> {
|
|
100
|
+
const root = cacheKey(projectRoot);
|
|
101
|
+
const launch = detectWorkflowMcpLaunchConfig(root);
|
|
102
|
+
const serverName = launch?.name ?? "gsd-workflow";
|
|
103
|
+
|
|
104
|
+
const cached = getCachedWorkflowMcpProbe(projectRoot);
|
|
105
|
+
if (cached && workflowMcpProbeAdvertisesSurface(cached.tools)) {
|
|
106
|
+
return { ok: true, tools: cached.tools, serverName: cached.serverName };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const result = await testMcpServerConnection(serverName, {
|
|
110
|
+
projectDir: root,
|
|
111
|
+
timeoutMs: options.timeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS,
|
|
112
|
+
});
|
|
113
|
+
if (result.ok && workflowMcpProbeAdvertisesSurface(result.tools)) {
|
|
114
|
+
recordWorkflowMcpProbe(projectRoot, serverName, result.tools);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
ok: result.ok,
|
|
118
|
+
tools: result.tools,
|
|
119
|
+
serverName,
|
|
120
|
+
error: result.error,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export async function probeAndCacheWorkflowMcp(
|
|
125
|
+
projectRoot: string,
|
|
126
|
+
options: { timeoutMs?: number } = {},
|
|
127
|
+
): Promise<WorkflowMcpProbeResult> {
|
|
128
|
+
const key = cacheKey(projectRoot);
|
|
129
|
+
const inFlight = probeInFlightByProject.get(key);
|
|
130
|
+
if (inFlight) return inFlight;
|
|
131
|
+
|
|
132
|
+
const promise = runProbeAndCacheWorkflowMcp(projectRoot, options).finally(() => {
|
|
133
|
+
probeInFlightByProject.delete(key);
|
|
134
|
+
});
|
|
135
|
+
probeInFlightByProject.set(key, promise);
|
|
136
|
+
return promise;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Fire-and-forget probe so /gsd dispatch often hits a warm cache. */
|
|
140
|
+
export function warmWorkflowMcpProbeInBackground(projectRoot: string): void {
|
|
141
|
+
if (activeWorkflowMcpSdkSessions > 0) return;
|
|
142
|
+
|
|
143
|
+
const key = cacheKey(projectRoot);
|
|
144
|
+
if (getCachedWorkflowMcpProbe(projectRoot)) return;
|
|
145
|
+
if (probeInFlightByProject.has(key)) return;
|
|
146
|
+
|
|
147
|
+
void probeAndCacheWorkflowMcp(projectRoot).catch(() => {
|
|
148
|
+
// Background warm is best-effort.
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -3,6 +3,16 @@ import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
|
3
3
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
4
4
|
import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
|
|
5
5
|
import type { WorkflowEvent } from "./workflow-events.js";
|
|
6
|
+
import {
|
|
7
|
+
normalizeWorkflowEventCommand,
|
|
8
|
+
workflowEventEntityKey,
|
|
9
|
+
} from "./workflow-event-vocabulary.js";
|
|
10
|
+
import {
|
|
11
|
+
readWorktreeEventLogPath,
|
|
12
|
+
workflowEventLogPath,
|
|
13
|
+
writeWorkflowEventLog,
|
|
14
|
+
writeWorktreeEventLog,
|
|
15
|
+
} from "./workflow-event-ledger.js";
|
|
6
16
|
import {
|
|
7
17
|
transaction,
|
|
8
18
|
updateTaskStatus,
|
|
@@ -82,14 +92,11 @@ function replayEvents(events: WorkflowEvent[]): void {
|
|
|
82
92
|
transaction(() => {
|
|
83
93
|
for (const event of events) {
|
|
84
94
|
const p = event.params;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// Type guard: malformed event lines with non-string cmd are skipped.
|
|
88
|
-
if (typeof event.cmd !== "string") {
|
|
95
|
+
const cmd = normalizeWorkflowEventCommand(event.cmd);
|
|
96
|
+
if (!cmd) {
|
|
89
97
|
logWarning("reconcile", `Event with non-string cmd skipped: ${JSON.stringify(event.cmd)}`);
|
|
90
98
|
continue;
|
|
91
99
|
}
|
|
92
|
-
const cmd = event.cmd.replace(/-/g, "_");
|
|
93
100
|
switch (cmd) {
|
|
94
101
|
case "complete_task": {
|
|
95
102
|
const milestoneId = p["milestoneId"] as string;
|
|
@@ -235,48 +242,7 @@ function replayEvents(events: WorkflowEvent[]): void {
|
|
|
235
242
|
export function extractEntityKey(
|
|
236
243
|
event: WorkflowEvent,
|
|
237
244
|
): { type: string; id: string } | null {
|
|
238
|
-
|
|
239
|
-
// Normalize cmd format: accept both hyphens and underscores
|
|
240
|
-
if (typeof event.cmd !== "string") return null;
|
|
241
|
-
const cmd = event.cmd.replace(/-/g, "_");
|
|
242
|
-
|
|
243
|
-
switch (cmd) {
|
|
244
|
-
case "complete_task":
|
|
245
|
-
case "start_task":
|
|
246
|
-
case "skip_task":
|
|
247
|
-
case "report_blocker":
|
|
248
|
-
case "record_verification":
|
|
249
|
-
case "plan_task":
|
|
250
|
-
return typeof p["taskId"] === "string"
|
|
251
|
-
? { type: "task", id: p["taskId"] }
|
|
252
|
-
: null;
|
|
253
|
-
|
|
254
|
-
case "complete_slice":
|
|
255
|
-
case "replan_slice":
|
|
256
|
-
return typeof p["sliceId"] === "string"
|
|
257
|
-
? { type: "slice", id: p["sliceId"] }
|
|
258
|
-
: null;
|
|
259
|
-
|
|
260
|
-
case "plan_slice":
|
|
261
|
-
return typeof p["sliceId"] === "string"
|
|
262
|
-
? { type: "slice_plan", id: p["sliceId"] }
|
|
263
|
-
: null;
|
|
264
|
-
|
|
265
|
-
case "complete_milestone":
|
|
266
|
-
case "plan_milestone":
|
|
267
|
-
return typeof p["milestoneId"] === "string"
|
|
268
|
-
? { type: "milestone", id: p["milestoneId"] }
|
|
269
|
-
: null;
|
|
270
|
-
|
|
271
|
-
case "save_decision":
|
|
272
|
-
if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
|
|
273
|
-
return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
|
|
274
|
-
}
|
|
275
|
-
return null;
|
|
276
|
-
|
|
277
|
-
default:
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
245
|
+
return workflowEventEntityKey(event);
|
|
280
246
|
}
|
|
281
247
|
|
|
282
248
|
// ─── detectConflicts ──────────────────────────────────────────────────────────
|
|
@@ -360,13 +326,6 @@ function rewriteDivergedEventsForEntity(
|
|
|
360
326
|
return rewritten;
|
|
361
327
|
}
|
|
362
328
|
|
|
363
|
-
function writeEventLog(basePath: string, events: WorkflowEvent[]): void {
|
|
364
|
-
const dir = join(basePath, ".gsd");
|
|
365
|
-
mkdirSync(dir, { recursive: true });
|
|
366
|
-
const content = events.map((e) => JSON.stringify(e)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
367
|
-
atomicWriteSync(join(dir, "event-log.jsonl"), content);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
329
|
// ─── writeConflictsFile ───────────────────────────────────────────────────────
|
|
371
330
|
|
|
372
331
|
/**
|
|
@@ -450,12 +409,18 @@ function _reconcileWorktreeLogsInner(
|
|
|
450
409
|
worktreeBasePath: string,
|
|
451
410
|
): ReconcileResult {
|
|
452
411
|
// Step 1: Read both logs
|
|
453
|
-
const mainLogPath =
|
|
454
|
-
const wtLogPath =
|
|
412
|
+
const mainLogPath = workflowEventLogPath(mainBasePath);
|
|
413
|
+
const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
|
|
455
414
|
|
|
456
415
|
const mainEvents = readEvents(mainLogPath);
|
|
457
416
|
const wtEvents = readEvents(wtLogPath);
|
|
458
417
|
|
|
418
|
+
// Canonical worktree appends are already durable in the project ledger.
|
|
419
|
+
// Empty/missing worktree shards are legacy-only absence, not divergence.
|
|
420
|
+
if (wtEvents.length === 0) {
|
|
421
|
+
return { autoMerged: 0, conflicts: [] };
|
|
422
|
+
}
|
|
423
|
+
|
|
459
424
|
// Step 2: Find fork point
|
|
460
425
|
const forkPoint = findForkPoint(mainEvents, wtEvents);
|
|
461
426
|
|
|
@@ -495,9 +460,7 @@ function _reconcileWorktreeLogsInner(
|
|
|
495
460
|
|
|
496
461
|
const baseEvents = mainEvents.slice(0, forkPoint + 1);
|
|
497
462
|
const mergedLog = baseEvents.concat(merged);
|
|
498
|
-
|
|
499
|
-
mkdirSync(join(mainBasePath, ".gsd"), { recursive: true });
|
|
500
|
-
atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
|
|
463
|
+
writeWorkflowEventLog(mainBasePath, mergedLog);
|
|
501
464
|
|
|
502
465
|
// Step 8: Replay into DB (wrapped in a transaction by replayEvents)
|
|
503
466
|
openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
|
|
@@ -636,8 +599,8 @@ export function resolveConflict(
|
|
|
636
599
|
const conflict = conflicts[idx]!;
|
|
637
600
|
const eventsToReplay = pick === "main" ? conflict.mainSideEvents : conflict.worktreeSideEvents;
|
|
638
601
|
|
|
639
|
-
const mainLogPath =
|
|
640
|
-
const wtLogPath =
|
|
602
|
+
const mainLogPath = workflowEventLogPath(basePath);
|
|
603
|
+
const wtLogPath = readWorktreeEventLogPath(worktreeBasePath);
|
|
641
604
|
const mainEvents = readEvents(mainLogPath);
|
|
642
605
|
const wtEvents = readEvents(wtLogPath);
|
|
643
606
|
const forkPoint = findForkPoint(mainEvents, wtEvents);
|
|
@@ -652,7 +615,11 @@ export function resolveConflict(
|
|
|
652
615
|
|
|
653
616
|
const targetBasePath = pick === "main" ? worktreeBasePath : basePath;
|
|
654
617
|
const targetBaseEvents = pick === "main" ? wtBaseEvents : mainBaseEvents;
|
|
655
|
-
|
|
618
|
+
if (pick === "main") {
|
|
619
|
+
writeWorktreeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
620
|
+
} else {
|
|
621
|
+
writeWorkflowEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
622
|
+
}
|
|
656
623
|
|
|
657
624
|
// Replay resolved events through the DB (updates DB state)
|
|
658
625
|
openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
|
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
// callers — production wiring previously injected them via deps; the seam
|
|
48
48
|
// added type churn without enabling test variation.
|
|
49
49
|
import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
|
|
50
|
+
import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
|
|
50
51
|
import { invalidateAllCaches } from "./cache.js";
|
|
51
52
|
import { resolveMilestoneFile } from "./paths.js";
|
|
52
53
|
import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
@@ -693,10 +694,7 @@ export function _enterMilestoneCore(
|
|
|
693
694
|
s.basePath = basePath;
|
|
694
695
|
rebuildGitService(s, deps);
|
|
695
696
|
invalidateAllCaches();
|
|
696
|
-
ctx.notify(
|
|
697
|
-
`Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
|
|
698
|
-
"warning",
|
|
699
|
-
);
|
|
697
|
+
ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
|
|
700
698
|
return { ok: true, mode: "branch", path: basePath };
|
|
701
699
|
} catch (err) {
|
|
702
700
|
debugLog("WorktreeLifecycle", {
|
|
@@ -883,10 +881,7 @@ export function _enterMilestoneCore(
|
|
|
883
881
|
eventType: "worktree-create-failed",
|
|
884
882
|
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
885
883
|
});
|
|
886
|
-
ctx.notify(
|
|
887
|
-
`Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`,
|
|
888
|
-
"warning",
|
|
889
|
-
);
|
|
884
|
+
ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
|
|
890
885
|
// Degrade isolation for the rest of this session so mergeAndExit
|
|
891
886
|
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
892
887
|
s.isolationDegraded = true;
|
|
@@ -656,7 +656,12 @@ export function removeWorktree(
|
|
|
656
656
|
const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
|
|
657
657
|
|
|
658
658
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
659
|
-
|
|
659
|
+
let cwd: string;
|
|
660
|
+
try {
|
|
661
|
+
cwd = process.cwd();
|
|
662
|
+
} catch {
|
|
663
|
+
cwd = basePath;
|
|
664
|
+
}
|
|
660
665
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
661
666
|
if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
|
|
662
667
|
process.chdir(basePath);
|
|
@@ -218,52 +218,54 @@ export function createWorktreeSafetyModule(
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
let registered: readonly RegisteredWorktree[] | undefined;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
221
|
+
if (isolationMode === "worktree") {
|
|
222
|
+
try {
|
|
223
|
+
registered = deps.listRegisteredWorktrees?.(projectRoot);
|
|
224
|
+
} catch (error) {
|
|
225
|
+
return failure(
|
|
226
|
+
"worktree-git-probe-failed",
|
|
227
|
+
`Unable to list registered worktrees for project root ${projectRoot}.`,
|
|
228
|
+
"Recover or recreate the milestone worktree before dispatching the source-writing Unit.",
|
|
229
|
+
{ projectRoot, error: errorMessage(error) },
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
233
|
+
const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
|
|
234
|
+
let attemptedPrune = false;
|
|
234
235
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
236
|
+
if (!wasPreviouslyTracked && deps.pruneRegisteredWorktrees) {
|
|
237
|
+
attemptedPrune = true;
|
|
238
|
+
try {
|
|
239
|
+
deps.pruneRegisteredWorktrees(projectRoot);
|
|
240
|
+
const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
|
|
241
|
+
if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
242
|
+
unregisteredRecoveryFailed.delete(unitRoot);
|
|
243
|
+
registered = rechecked;
|
|
244
|
+
} else {
|
|
245
|
+
unregisteredRecoveryFailed.add(unitRoot);
|
|
246
|
+
}
|
|
247
|
+
} catch (error) {
|
|
244
248
|
unregisteredRecoveryFailed.add(unitRoot);
|
|
249
|
+
return failure(
|
|
250
|
+
"worktree-git-probe-failed",
|
|
251
|
+
`Unable to recover unregistered worktree root ${unitRoot}.`,
|
|
252
|
+
"Run 'git worktree prune', then recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
|
|
253
|
+
{ projectRoot, unitRoot, error: errorMessage(error) },
|
|
254
|
+
);
|
|
245
255
|
}
|
|
246
|
-
}
|
|
247
|
-
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
248
259
|
return failure(
|
|
249
|
-
"worktree-
|
|
250
|
-
`
|
|
251
|
-
|
|
252
|
-
|
|
260
|
+
"worktree-unregistered",
|
|
261
|
+
`Worktree root ${unitRoot} is not registered with git worktree list.`,
|
|
262
|
+
attemptedPrune || wasPreviouslyTracked
|
|
263
|
+
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
264
|
+
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
|
|
265
|
+
{ unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) },
|
|
253
266
|
);
|
|
254
267
|
}
|
|
255
268
|
}
|
|
256
|
-
|
|
257
|
-
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
258
|
-
return failure(
|
|
259
|
-
"worktree-unregistered",
|
|
260
|
-
`Worktree root ${unitRoot} is not registered with git worktree list.`,
|
|
261
|
-
attemptedPrune || wasPreviouslyTracked
|
|
262
|
-
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
263
|
-
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.",
|
|
264
|
-
{ unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) },
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
269
|
}
|
|
268
270
|
|
|
269
271
|
if (input.emptyWorktreeWithProjectContent) {
|
|
@@ -224,7 +224,13 @@ export function resolveGitHeadPath(dir: string): string | null {
|
|
|
224
224
|
*/
|
|
225
225
|
export function nudgeGitBranchCache(previousCwd: string): void {
|
|
226
226
|
const now = new Date();
|
|
227
|
-
|
|
227
|
+
let currentCwd: string | null = null;
|
|
228
|
+
try {
|
|
229
|
+
currentCwd = process.cwd();
|
|
230
|
+
} catch {
|
|
231
|
+
currentCwd = null;
|
|
232
|
+
}
|
|
233
|
+
for (const dir of [previousCwd, currentCwd].filter((dir): dir is string => Boolean(dir))) {
|
|
228
234
|
try {
|
|
229
235
|
const headPath = resolveGitHeadPath(dir);
|
|
230
236
|
if (headPath) utimesSync(headPath, now, now);
|
|
@@ -105,6 +105,9 @@ const CHILD_ENV_ALLOWLIST = new Set([
|
|
|
105
105
|
|
|
106
106
|
const MCP_STDERR_MAX_BYTES = 4096;
|
|
107
107
|
|
|
108
|
+
/** Short-lived stdio probes must not register/kill production MCP PIDs (see probe-mode.ts). */
|
|
109
|
+
export const GSD_MCP_PROBE_ENV = "GSD_MCP_PROBE";
|
|
110
|
+
|
|
108
111
|
let cachedStatus: ManagedMcpStatus | null = null;
|
|
109
112
|
let cachedStatusKey = "";
|
|
110
113
|
|
|
@@ -385,7 +388,10 @@ export async function testMcpServerConnection(
|
|
|
385
388
|
transport = new StdioClientTransport({
|
|
386
389
|
command: config.command ?? "",
|
|
387
390
|
args: config.args,
|
|
388
|
-
env:
|
|
391
|
+
env: {
|
|
392
|
+
...buildMcpChildEnv(config.env),
|
|
393
|
+
[GSD_MCP_PROBE_ENV]: "1",
|
|
394
|
+
},
|
|
389
395
|
cwd: config.cwd,
|
|
390
396
|
stderr: "pipe",
|
|
391
397
|
});
|
|
@@ -55,6 +55,24 @@ function parseGsdBrowserVersion(output: string): string | null {
|
|
|
55
55
|
return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
function splitCommandLine(commandLine: string): string[] {
|
|
59
|
+
const parts = commandLine.match(/(?:"[^"]*"|'[^']*'|[^\s"']+)/g) ?? [];
|
|
60
|
+
return parts.map((part) => {
|
|
61
|
+
const quote = part[0];
|
|
62
|
+
if ((quote === '"' || quote === "'") && part.endsWith(quote)) {
|
|
63
|
+
return part.slice(1, -1);
|
|
64
|
+
}
|
|
65
|
+
return part;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function buildPathGsdBrowserVersionInvocation(platform: NodeJS.Platform): { command: string; args: string[] } {
|
|
70
|
+
if (platform === "win32") {
|
|
71
|
+
return { command: "cmd", args: ["/d", "/s", "/c", "gsd-browser", "--version"] };
|
|
72
|
+
}
|
|
73
|
+
return { command: "gsd-browser", args: ["--version"] };
|
|
74
|
+
}
|
|
75
|
+
|
|
58
76
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
59
77
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
60
78
|
}
|
|
@@ -86,7 +104,8 @@ function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
|
|
|
86
104
|
if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
|
|
87
105
|
|
|
88
106
|
try {
|
|
89
|
-
|
|
107
|
+
const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
|
|
108
|
+
cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
|
|
90
109
|
encoding: "utf-8",
|
|
91
110
|
env,
|
|
92
111
|
stdio: ["ignore", "pipe", "ignore"],
|
|
@@ -216,7 +235,8 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
216
235
|
const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
|
|
217
236
|
const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
|
|
218
237
|
const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
|
|
219
|
-
const
|
|
238
|
+
const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
239
|
+
const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
|
|
220
240
|
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
221
241
|
const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
|
|
222
242
|
const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
|
|
@@ -241,6 +261,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
241
261
|
const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
|
|
242
262
|
? explicitArgs.map(String)
|
|
243
263
|
: [
|
|
264
|
+
...explicitCommandArgs,
|
|
244
265
|
...(bundledCliPath ? [bundledCliPath] : []),
|
|
245
266
|
"mcp",
|
|
246
267
|
"--session",
|