@opengsd/gsd-pi 1.2.0-dev.9ad8ae33 → 1.2.0-dev.a6376d75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resources/.managed-resources-content-hash +1 -1
- 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/dispatch-history.js +21 -6
- 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 +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -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-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -1
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- 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/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/guided-flow.js +88 -2
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
- 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/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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/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 +8 -8
- 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/package.json +2 -2
- 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 +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-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 -58
- package/packages/mcp-server/dist/cli.js.map +1 -1
- 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/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.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- 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/package.json +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/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/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 +63 -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/extensions/ask-user-questions.ts +7 -2
- 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/dispatch-history.ts +22 -6
- 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 +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -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-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- 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/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/guided-flow.ts +128 -2
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +7 -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-orchestrator.test.ts +76 -12
- 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-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -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/guided-dispatch-root.test.ts +16 -0
- 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 +18 -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-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-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -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 +1 -1
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- 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/runtime-invariant-modules.test.ts +7 -1
- 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/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/uok-plan-v2-wiring.test.ts +1 -1
- 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-templates.test.ts +92 -0
- 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/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- 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/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -173,15 +173,19 @@ export const UNIT_REGISTRY = {
|
|
|
173
173
|
phaseChain: ["completion"],
|
|
174
174
|
toolContract: {
|
|
175
175
|
allowedGsdTools: [
|
|
176
|
+
"gsd_exec",
|
|
176
177
|
"gsd_slice_complete",
|
|
177
178
|
"gsd_task_reopen",
|
|
178
179
|
"gsd_replan_slice",
|
|
179
180
|
"gsd_decision_save",
|
|
181
|
+
"gsd_capture_thought",
|
|
180
182
|
"gsd_requirement_update",
|
|
181
183
|
"gsd_summary_save",
|
|
182
184
|
"subagent",
|
|
183
185
|
],
|
|
184
186
|
requiredWorkflowTools: [
|
|
187
|
+
"gsd_exec",
|
|
188
|
+
"gsd_capture_thought",
|
|
185
189
|
"gsd_slice_complete",
|
|
186
190
|
"gsd_task_reopen",
|
|
187
191
|
"gsd_replan_slice",
|
|
@@ -207,8 +211,21 @@ export const UNIT_REGISTRY = {
|
|
|
207
211
|
scopeClass: "execute-task",
|
|
208
212
|
phaseChain: ["execution"],
|
|
209
213
|
toolContract: {
|
|
210
|
-
allowedGsdTools: [
|
|
211
|
-
|
|
214
|
+
allowedGsdTools: [
|
|
215
|
+
"gsd_task_complete",
|
|
216
|
+
"gsd_exec",
|
|
217
|
+
"gsd_exec_search",
|
|
218
|
+
"gsd_resume",
|
|
219
|
+
"gsd_capture_thought",
|
|
220
|
+
"gsd_decision_save",
|
|
221
|
+
],
|
|
222
|
+
requiredWorkflowTools: [
|
|
223
|
+
"gsd_task_complete",
|
|
224
|
+
"gsd_exec",
|
|
225
|
+
"gsd_exec_search",
|
|
226
|
+
"gsd_resume",
|
|
227
|
+
"gsd_capture_thought",
|
|
228
|
+
],
|
|
212
229
|
},
|
|
213
230
|
},
|
|
214
231
|
"execute-task-simple": {
|
|
@@ -216,8 +233,21 @@ export const UNIT_REGISTRY = {
|
|
|
216
233
|
scopeClass: "execute-task",
|
|
217
234
|
phaseChain: ["execution_simple", "execution"],
|
|
218
235
|
toolContract: {
|
|
219
|
-
allowedGsdTools: [
|
|
220
|
-
|
|
236
|
+
allowedGsdTools: [
|
|
237
|
+
"gsd_task_complete",
|
|
238
|
+
"gsd_exec",
|
|
239
|
+
"gsd_exec_search",
|
|
240
|
+
"gsd_resume",
|
|
241
|
+
"gsd_capture_thought",
|
|
242
|
+
"gsd_decision_save",
|
|
243
|
+
],
|
|
244
|
+
requiredWorkflowTools: [
|
|
245
|
+
"gsd_task_complete",
|
|
246
|
+
"gsd_exec",
|
|
247
|
+
"gsd_exec_search",
|
|
248
|
+
"gsd_resume",
|
|
249
|
+
"gsd_capture_thought",
|
|
250
|
+
],
|
|
221
251
|
},
|
|
222
252
|
},
|
|
223
253
|
"reactive-execute": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ensureProjectWorkflowMcpConfig, } from "./mcp-project-config.js";
|
|
2
|
+
import { warmWorkflowMcpProbeInBackground } from "./workflow-mcp-readiness-cache.js";
|
|
2
3
|
import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
|
|
3
4
|
function withModelOverride(ctx, modelOverride) {
|
|
4
5
|
if (!modelOverride)
|
|
@@ -46,6 +47,7 @@ export function prepareWorkflowMcpForProject(ctx, projectRoot, modelOverride) {
|
|
|
46
47
|
if (result.status !== "unchanged") {
|
|
47
48
|
prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
|
|
48
49
|
}
|
|
50
|
+
warmWorkflowMcpProbeInBackground(projectRoot);
|
|
49
51
|
return result;
|
|
50
52
|
}
|
|
51
53
|
catch (err) {
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Share recent workflow MCP probe results across guided-flow and Claude Code SDK preflight.
|
|
3
|
+
import { testMcpServerConnection } from "../mcp-client/manager.js";
|
|
4
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
5
|
+
import { detectWorkflowMcpLaunchConfig, resolveWorkflowMcpProjectRoot, } from "./workflow-mcp.js";
|
|
6
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
7
|
+
/** Reuse a recent successful probe instead of spawning another stdio server. */
|
|
8
|
+
export const WORKFLOW_MCP_PROBE_CACHE_TTL_MS = 120_000;
|
|
9
|
+
/** Per-probe connect + tools/list budget (server typically ready in ~1–2s). */
|
|
10
|
+
export const WORKFLOW_MCP_PROBE_TIMEOUT_MS = 5_000;
|
|
11
|
+
const cacheByProject = new Map();
|
|
12
|
+
const probeInFlightByProject = new Map();
|
|
13
|
+
let activeWorkflowMcpSdkSessions = 0;
|
|
14
|
+
function cacheKey(projectRoot) {
|
|
15
|
+
return resolveWorkflowMcpProjectRoot(projectRoot);
|
|
16
|
+
}
|
|
17
|
+
export function beginWorkflowMcpSdkSession() {
|
|
18
|
+
activeWorkflowMcpSdkSessions++;
|
|
19
|
+
}
|
|
20
|
+
export function endWorkflowMcpSdkSession() {
|
|
21
|
+
activeWorkflowMcpSdkSessions = Math.max(0, activeWorkflowMcpSdkSessions - 1);
|
|
22
|
+
}
|
|
23
|
+
export function getCachedWorkflowMcpProbe(projectRoot) {
|
|
24
|
+
const entry = cacheByProject.get(cacheKey(projectRoot));
|
|
25
|
+
if (!entry)
|
|
26
|
+
return null;
|
|
27
|
+
if (Date.now() - entry.probedAt > WORKFLOW_MCP_PROBE_CACHE_TTL_MS) {
|
|
28
|
+
cacheByProject.delete(cacheKey(projectRoot));
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return entry;
|
|
32
|
+
}
|
|
33
|
+
export function recordWorkflowMcpProbe(projectRoot, serverName, tools) {
|
|
34
|
+
cacheByProject.set(cacheKey(projectRoot), {
|
|
35
|
+
serverName,
|
|
36
|
+
tools: [...tools],
|
|
37
|
+
probedAt: Date.now(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function clearWorkflowMcpProbeCache(projectRoot) {
|
|
41
|
+
if (projectRoot === undefined) {
|
|
42
|
+
cacheByProject.clear();
|
|
43
|
+
probeInFlightByProject.clear();
|
|
44
|
+
activeWorkflowMcpSdkSessions = 0;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const key = cacheKey(projectRoot);
|
|
48
|
+
cacheByProject.delete(key);
|
|
49
|
+
probeInFlightByProject.delete(key);
|
|
50
|
+
}
|
|
51
|
+
export function workflowMcpProbeAdvertisesSurface(tools) {
|
|
52
|
+
return tools.some((tool) => isWorkflowToolSurfaceName(tool));
|
|
53
|
+
}
|
|
54
|
+
export function cachedWorkflowMcpCoversRequired(projectRoot, serverName, required) {
|
|
55
|
+
const entry = getCachedWorkflowMcpProbe(projectRoot);
|
|
56
|
+
if (!entry || entry.serverName !== serverName)
|
|
57
|
+
return false;
|
|
58
|
+
return required.every((tool) => entry.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
59
|
+
}
|
|
60
|
+
async function runProbeAndCacheWorkflowMcp(projectRoot, options = {}) {
|
|
61
|
+
const root = cacheKey(projectRoot);
|
|
62
|
+
const launch = detectWorkflowMcpLaunchConfig(root);
|
|
63
|
+
const serverName = launch?.name ?? "gsd-workflow";
|
|
64
|
+
const cached = getCachedWorkflowMcpProbe(projectRoot);
|
|
65
|
+
if (cached && workflowMcpProbeAdvertisesSurface(cached.tools)) {
|
|
66
|
+
return { ok: true, tools: cached.tools, serverName: cached.serverName };
|
|
67
|
+
}
|
|
68
|
+
const result = await testMcpServerConnection(serverName, {
|
|
69
|
+
projectDir: root,
|
|
70
|
+
timeoutMs: options.timeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS,
|
|
71
|
+
});
|
|
72
|
+
if (result.ok && workflowMcpProbeAdvertisesSurface(result.tools)) {
|
|
73
|
+
recordWorkflowMcpProbe(projectRoot, serverName, result.tools);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
ok: result.ok,
|
|
77
|
+
tools: result.tools,
|
|
78
|
+
serverName,
|
|
79
|
+
error: result.error,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export async function probeAndCacheWorkflowMcp(projectRoot, options = {}) {
|
|
83
|
+
const key = cacheKey(projectRoot);
|
|
84
|
+
const inFlight = probeInFlightByProject.get(key);
|
|
85
|
+
if (inFlight)
|
|
86
|
+
return inFlight;
|
|
87
|
+
const promise = runProbeAndCacheWorkflowMcp(projectRoot, options).finally(() => {
|
|
88
|
+
probeInFlightByProject.delete(key);
|
|
89
|
+
});
|
|
90
|
+
probeInFlightByProject.set(key, promise);
|
|
91
|
+
return promise;
|
|
92
|
+
}
|
|
93
|
+
/** Fire-and-forget probe so /gsd dispatch often hits a warm cache. */
|
|
94
|
+
export function warmWorkflowMcpProbeInBackground(projectRoot) {
|
|
95
|
+
if (activeWorkflowMcpSdkSessions > 0)
|
|
96
|
+
return;
|
|
97
|
+
const key = cacheKey(projectRoot);
|
|
98
|
+
if (getCachedWorkflowMcpProbe(projectRoot))
|
|
99
|
+
return;
|
|
100
|
+
if (probeInFlightByProject.has(key))
|
|
101
|
+
return;
|
|
102
|
+
void probeAndCacheWorkflowMcp(projectRoot).catch(() => {
|
|
103
|
+
// Background warm is best-effort.
|
|
104
|
+
});
|
|
105
|
+
}
|
|
@@ -90,38 +90,40 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
90
90
|
return failure("worktree-git-marker-not-file", `Worktree root ${unitRoot} has a .git directory, not a registered worktree .git file.`, "Use a registered GSD worktree instead of a copied or nested repository.", { gitMarker });
|
|
91
91
|
}
|
|
92
92
|
let registered;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
93
|
+
if (isolationMode === "worktree") {
|
|
94
|
+
try {
|
|
95
|
+
registered = deps.listRegisteredWorktrees?.(projectRoot);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return failure("worktree-git-probe-failed", `Unable to list registered worktrees for project root ${projectRoot}.`, "Recover or recreate the milestone worktree before dispatching the source-writing Unit.", { projectRoot, error: errorMessage(error) });
|
|
99
|
+
}
|
|
100
|
+
if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
101
|
+
const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
|
|
102
|
+
let attemptedPrune = false;
|
|
103
|
+
if (!wasPreviouslyTracked && deps.pruneRegisteredWorktrees) {
|
|
104
|
+
attemptedPrune = true;
|
|
105
|
+
try {
|
|
106
|
+
deps.pruneRegisteredWorktrees(projectRoot);
|
|
107
|
+
const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
|
|
108
|
+
if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
109
|
+
unregisteredRecoveryFailed.delete(unitRoot);
|
|
110
|
+
registered = rechecked;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
unregisteredRecoveryFailed.add(unitRoot);
|
|
114
|
+
}
|
|
110
115
|
}
|
|
111
|
-
|
|
116
|
+
catch (error) {
|
|
112
117
|
unregisteredRecoveryFailed.add(unitRoot);
|
|
118
|
+
return failure("worktree-git-probe-failed", `Unable to recover unregistered worktree root ${unitRoot}.`, "Run 'git worktree prune', then recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { projectRoot, unitRoot, error: errorMessage(error) });
|
|
113
119
|
}
|
|
114
120
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
122
|
+
return failure("worktree-unregistered", `Worktree root ${unitRoot} is not registered with git worktree list.`, attemptedPrune || wasPreviouslyTracked
|
|
123
|
+
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
124
|
+
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) });
|
|
118
125
|
}
|
|
119
126
|
}
|
|
120
|
-
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
121
|
-
return failure("worktree-unregistered", `Worktree root ${unitRoot} is not registered with git worktree list.`, attemptedPrune || wasPreviouslyTracked
|
|
122
|
-
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
123
|
-
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune, trackedAsFailed: unregisteredRecoveryFailed.has(unitRoot) });
|
|
124
|
-
}
|
|
125
127
|
}
|
|
126
128
|
if (input.emptyWorktreeWithProjectContent) {
|
|
127
129
|
return failure("empty-worktree-with-project-content", `Worktree root ${unitRoot} has no project content, but the project root does.`, "Resolve untracked project-root content or recreate the worktree so source writes stay isolated.", { unitRoot, projectRoot });
|
|
@@ -30,6 +30,8 @@ const CHILD_ENV_ALLOWLIST = new Set([
|
|
|
30
30
|
"XDG_CACHE_HOME",
|
|
31
31
|
]);
|
|
32
32
|
const MCP_STDERR_MAX_BYTES = 4096;
|
|
33
|
+
/** Short-lived stdio probes must not register/kill production MCP PIDs (see probe-mode.ts). */
|
|
34
|
+
export const GSD_MCP_PROBE_ENV = "GSD_MCP_PROBE";
|
|
33
35
|
let cachedStatus = null;
|
|
34
36
|
let cachedStatusKey = "";
|
|
35
37
|
export function clearMcpConfigCache() {
|
|
@@ -259,7 +261,10 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
|
|
|
259
261
|
transport = new StdioClientTransport({
|
|
260
262
|
command: config.command ?? "",
|
|
261
263
|
args: config.args,
|
|
262
|
-
env:
|
|
264
|
+
env: {
|
|
265
|
+
...buildMcpChildEnv(config.env),
|
|
266
|
+
[GSD_MCP_PROBE_ENV]: "1",
|
|
267
|
+
},
|
|
263
268
|
cwd: config.cwd,
|
|
264
269
|
stderr: "pipe",
|
|
265
270
|
});
|
package/dist/runtime-checks.d.ts
CHANGED
|
@@ -25,3 +25,13 @@ export declare function checkNodeVersion(versionString: string, min?: number): {
|
|
|
25
25
|
* real subprocess.
|
|
26
26
|
*/
|
|
27
27
|
export declare function requireGit(execFn: (cmd: string, args: ReadonlyArray<string>) => unknown): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Fast presence check for `git`: scan the directories on `$PATH` for a `git`
|
|
30
|
+
* executable (plus Windows `.exe`/`.cmd` variants) instead of spawning
|
|
31
|
+
* `git --version`. The subprocess form costs ~15ms on every startup and showed
|
|
32
|
+
* up as ~5% of cold-start CPU; a filesystem `existsSync` scan is far cheaper and
|
|
33
|
+
* answers the same gate ("is git installed"). Returns true if a candidate path
|
|
34
|
+
* exists. `env`/`platform` are injectable so this can be unit-tested without a
|
|
35
|
+
* real $PATH.
|
|
36
|
+
*/
|
|
37
|
+
export declare function gitAvailableOnPath(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): boolean;
|
package/dist/runtime-checks.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Runtime dependency checks — pure helpers used by loader.ts.
|
|
2
2
|
// Extracted so they can be unit-tested without spawning the full loader.
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { delimiter, join } from 'path';
|
|
3
5
|
/**
|
|
4
6
|
* Minimum supported Node.js major version. Kept in sync with
|
|
5
7
|
* `engines.node` in package.json — see test
|
|
@@ -36,3 +38,28 @@ export function requireGit(execFn) {
|
|
|
36
38
|
return false;
|
|
37
39
|
}
|
|
38
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Fast presence check for `git`: scan the directories on `$PATH` for a `git`
|
|
43
|
+
* executable (plus Windows `.exe`/`.cmd` variants) instead of spawning
|
|
44
|
+
* `git --version`. The subprocess form costs ~15ms on every startup and showed
|
|
45
|
+
* up as ~5% of cold-start CPU; a filesystem `existsSync` scan is far cheaper and
|
|
46
|
+
* answers the same gate ("is git installed"). Returns true if a candidate path
|
|
47
|
+
* exists. `env`/`platform` are injectable so this can be unit-tested without a
|
|
48
|
+
* real $PATH.
|
|
49
|
+
*/
|
|
50
|
+
export function gitAvailableOnPath(env = process.env, platform = process.platform) {
|
|
51
|
+
const pathValue = env.PATH ?? env.Path ?? env.path ?? '';
|
|
52
|
+
if (pathValue.length === 0)
|
|
53
|
+
return false;
|
|
54
|
+
const dirs = pathValue.split(delimiter).filter((d) => d.length > 0);
|
|
55
|
+
const names = platform === 'win32'
|
|
56
|
+
? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM').split(';').map((ext) => `git${ext.toLowerCase()}`).concat('git')
|
|
57
|
+
: ['git'];
|
|
58
|
+
for (const dir of dirs) {
|
|
59
|
+
for (const name of names) {
|
|
60
|
+
if (existsSync(join(dir, name)))
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|