@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7
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.js +3 -2
- package/dist/help-text.js +10 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
- package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/dist/resources/extensions/browser-tools/index.js +57 -9
- package/dist/resources/extensions/browser-tools/package.json +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
- package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
- package/dist/resources/extensions/gsd/auto/phases.js +4 -3
- package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
- package/dist/resources/extensions/gsd/auto-dispatch.js +55 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +94 -15
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +18 -65
- package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
- package/dist/resources/extensions/gsd/auto.js +31 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
- package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
- package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +2 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
- package/dist/resources/extensions/gsd/error-classifier.js +2 -1
- package/dist/resources/extensions/gsd/escalation.js +4 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
- package/dist/resources/extensions/gsd/forensics.js +74 -2
- package/dist/resources/extensions/gsd/gsd-db.js +42 -6
- package/dist/resources/extensions/gsd/guided-flow.js +119 -176
- package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
- package/dist/resources/extensions/gsd/memory-store.js +4 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
- package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
- package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
- package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/dist/resources/extensions/gsd/prompts/system.md +3 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
- package/dist/resources/extensions/gsd/rule-registry.js +428 -52
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
- package/dist/resources/extensions/gsd/skill-activation.js +20 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
- package/dist/resources/extensions/gsd/state.js +17 -14
- package/dist/resources/extensions/gsd/templates/plan.md +3 -1
- package/dist/resources/extensions/gsd/tool-contract.js +5 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
- package/dist/resources/extensions/gsd/verification-gate.js +72 -1
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
- package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
- package/dist/resources/extensions/mcp-client/manager.js +31 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
- package/dist/rtk.d.ts +7 -1
- package/dist/rtk.js +27 -11
- package/dist/update-check.d.ts +15 -1
- package/dist/update-check.js +87 -12
- package/dist/update-cmd.d.ts +1 -0
- package/dist/update-cmd.js +53 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- 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/update/route.js +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 +5 -5
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- 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 +5 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +32 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/index.d.ts +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +1 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
- package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
- package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
- 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.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- 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 +1 -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 +5 -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/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +23 -9
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +84 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +42 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
- package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/api-registry.d.ts +2 -0
- package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/packages/pi-ai/dist/api-registry.js +23 -0
- package/packages/pi-ai/dist/api-registry.js.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +15 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +411 -39
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +504 -153
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/stream.js +6 -6
- package/packages/pi-ai/dist/stream.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
- package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/terminal.d.ts +1 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +8 -4
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
- package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/src/resources/extensions/browser-tools/index.ts +60 -9
- package/src/resources/extensions/browser-tools/package.json +5 -1
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
- package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +5 -3
- package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
- package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
- package/src/resources/extensions/gsd/auto-start.ts +112 -17
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
- package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
- package/src/resources/extensions/gsd/auto.ts +47 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
- package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
- package/src/resources/extensions/gsd/error-classifier.ts +2 -1
- package/src/resources/extensions/gsd/escalation.ts +4 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
- package/src/resources/extensions/gsd/forensics.ts +99 -5
- package/src/resources/extensions/gsd/gsd-db.ts +46 -8
- package/src/resources/extensions/gsd/guided-flow.ts +215 -217
- package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
- package/src/resources/extensions/gsd/memory-store.ts +4 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
- package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
- package/src/resources/extensions/gsd/prompts/system.md +3 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
- package/src/resources/extensions/gsd/rule-registry.ts +558 -58
- package/src/resources/extensions/gsd/rule-types.ts +2 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
- package/src/resources/extensions/gsd/skill-activation.ts +20 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
- package/src/resources/extensions/gsd/state.ts +18 -14
- package/src/resources/extensions/gsd/templates/plan.md +3 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
- package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
- package/src/resources/extensions/gsd/tool-contract.ts +6 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
- package/src/resources/extensions/gsd/types.ts +69 -5
- package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
- package/src/resources/extensions/gsd/verification-gate.ts +87 -1
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
- package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
- package/src/resources/extensions/mcp-client/manager.ts +33 -1
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* handleRunHook, handleUpdate, handleSkillHealth
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync, readFileSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { createRequire } from "node:module";
|
|
8
10
|
import { join, resolve as resolvePath, sep } from "node:path";
|
|
9
11
|
import { homedir } from "node:os";
|
|
10
12
|
import { deriveState } from "./state.js";
|
|
@@ -20,7 +22,10 @@ import { loadPrompt } from "./prompt-loader.js";
|
|
|
20
22
|
import { isPnpmInstall } from "../../shared/package-manager-detection.js";
|
|
21
23
|
import { buildDoctorHealIssuePayload, buildDoctorHealSummary, buildWorkflowDispatchContent, } from "./workflow-protocol.js";
|
|
22
24
|
import { restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch, } from "./bootstrap/register-hooks.js";
|
|
25
|
+
const GSD_PI_PACKAGE = "@opengsd/gsd-pi";
|
|
26
|
+
const GSD_BROWSER_PACKAGE = "@opengsd/gsd-browser";
|
|
23
27
|
const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/@opengsd%2fgsd-pi/latest";
|
|
28
|
+
const BROWSER_UPDATE_REGISTRY_URL = "https://registry.npmjs.org/@opengsd%2fgsd-browser/latest";
|
|
24
29
|
const UPDATE_FETCH_TIMEOUT_MS = 5000;
|
|
25
30
|
// Detects a bun-installed gsd via `process.argv[1]`. Mirrors isBunInstall in
|
|
26
31
|
// src/update-check.ts — duplicated because tsconfig.resources.json rootDir
|
|
@@ -47,11 +52,11 @@ function resolveInstallCommand(pkg) {
|
|
|
47
52
|
return `pnpm add -g ${pkg}`;
|
|
48
53
|
return `npm install -g ${pkg}`;
|
|
49
54
|
}
|
|
50
|
-
async function fetchLatestVersionForCommand() {
|
|
55
|
+
async function fetchLatestVersionForCommand(registryUrl = UPDATE_REGISTRY_URL) {
|
|
51
56
|
const controller = new AbortController();
|
|
52
57
|
const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
|
|
53
58
|
try {
|
|
54
|
-
const res = await fetch(
|
|
59
|
+
const res = await fetch(registryUrl, { signal: controller.signal });
|
|
55
60
|
if (!res.ok)
|
|
56
61
|
return null;
|
|
57
62
|
const data = (await res.json());
|
|
@@ -65,6 +70,19 @@ async function fetchLatestVersionForCommand() {
|
|
|
65
70
|
clearTimeout(timeout);
|
|
66
71
|
}
|
|
67
72
|
}
|
|
73
|
+
function resolveInstalledPackageVersionForCommand(packageName) {
|
|
74
|
+
try {
|
|
75
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
76
|
+
const packageJsonPath = requireFromHere.resolve(`${packageName}/package.json`);
|
|
77
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
78
|
+
return typeof pkg.version === "string" && pkg.version.trim().length > 0
|
|
79
|
+
? pkg.version.trim().replace(/^v/, "")
|
|
80
|
+
: null;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
68
86
|
export function dispatchDoctorHeal(pi, scope, reportText, structuredIssues) {
|
|
69
87
|
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
|
|
70
88
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
@@ -386,27 +404,74 @@ function compareSemverLocal(a, b) {
|
|
|
386
404
|
}
|
|
387
405
|
return 0;
|
|
388
406
|
}
|
|
389
|
-
|
|
407
|
+
function formatCommandVersion(version) {
|
|
408
|
+
return version ? `v${version}` : "unknown";
|
|
409
|
+
}
|
|
410
|
+
function pickHigherVersionForCommand(a, b) {
|
|
411
|
+
if (!a)
|
|
412
|
+
return b;
|
|
413
|
+
if (!b)
|
|
414
|
+
return a;
|
|
415
|
+
return compareSemverLocal(a, b) >= 0 ? a : b;
|
|
416
|
+
}
|
|
417
|
+
// Mirrors resolveGsdBrowserPathVersion in src/update-check.ts — duplicated because
|
|
418
|
+
// tsconfig.resources.json rootDir prevents importing from src/.
|
|
419
|
+
function resolveGsdBrowserPathVersionForCommand(env = process.env) {
|
|
420
|
+
const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
|
|
421
|
+
if (explicit)
|
|
422
|
+
return explicit.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
423
|
+
try {
|
|
424
|
+
const out = execFileSync("gsd-browser", ["--version"], {
|
|
425
|
+
encoding: "utf-8",
|
|
426
|
+
env,
|
|
427
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
428
|
+
timeout: 2000,
|
|
429
|
+
});
|
|
430
|
+
return out.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
export async function handleUpdate(ctx, args = "") {
|
|
390
437
|
const { execSync } = await import("node:child_process");
|
|
391
|
-
const
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
438
|
+
const target = args.trim();
|
|
439
|
+
const browserUpdate = target === "browser" || target === "gsd-browser";
|
|
440
|
+
if (target && !browserUpdate) {
|
|
441
|
+
ctx.ui.notify("Usage: /gsd update [browser]", "warning");
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
const NPM_PACKAGE = browserUpdate ? GSD_BROWSER_PACKAGE : GSD_PI_PACKAGE;
|
|
445
|
+
const registryUrl = browserUpdate ? BROWSER_UPDATE_REGISTRY_URL : UPDATE_REGISTRY_URL;
|
|
446
|
+
const bundledVersion = browserUpdate
|
|
447
|
+
? resolveInstalledPackageVersionForCommand(GSD_BROWSER_PACKAGE)
|
|
448
|
+
: null;
|
|
449
|
+
const current = browserUpdate
|
|
450
|
+
? pickHigherVersionForCommand(bundledVersion, resolveGsdBrowserPathVersionForCommand())
|
|
451
|
+
: process.env.GSD_VERSION || "0.0.0";
|
|
452
|
+
const label = browserUpdate ? "gsd-browser version" : "version";
|
|
453
|
+
ctx.ui.notify(`Current ${label}: ${formatCommandVersion(current)}\nChecking npm registry...`, "info");
|
|
454
|
+
const latest = await fetchLatestVersionForCommand(registryUrl);
|
|
395
455
|
if (!latest) {
|
|
396
456
|
ctx.ui.notify("Failed to reach npm registry. Check your network connection.", "error");
|
|
397
457
|
return;
|
|
398
458
|
}
|
|
399
|
-
if (compareSemverLocal(latest, current) <= 0) {
|
|
400
|
-
ctx.ui.notify(`Already up to date (
|
|
459
|
+
if (current && compareSemverLocal(latest, current) <= 0) {
|
|
460
|
+
ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
|
|
401
461
|
return;
|
|
402
462
|
}
|
|
403
|
-
ctx.ui.notify(`Updating:
|
|
463
|
+
ctx.ui.notify(`Updating: ${formatCommandVersion(current)} → v${latest}...`, "info");
|
|
404
464
|
const installCmd = resolveInstallCommand(`${NPM_PACKAGE}@latest`);
|
|
405
465
|
try {
|
|
406
466
|
execSync(installCmd, {
|
|
407
467
|
stdio: ["ignore", "pipe", "ignore"],
|
|
408
468
|
});
|
|
409
|
-
|
|
469
|
+
const newPathVersion = browserUpdate ? resolveGsdBrowserPathVersionForCommand() : null;
|
|
470
|
+
const pathReady = !browserUpdate || (!!newPathVersion && compareSemverLocal(newPathVersion, latest) >= 0);
|
|
471
|
+
ctx.ui.notify(browserUpdate
|
|
472
|
+
? `Updated gsd-browser to v${latest}. Restart your GSD session to use the new browser automation version.` +
|
|
473
|
+
(pathReady ? "" : "\nNote: Ensure the npm global bin directory is on your PATH so MCP automation uses the updated binary.")
|
|
474
|
+
: `Updated to v${latest}. Restart your GSD session to use the new version.`, "info");
|
|
410
475
|
}
|
|
411
476
|
catch {
|
|
412
477
|
ctx.ui.notify(`Update failed. Try manually: ${installCmd}`, "error");
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GSD Maintenance — cleanup, skip, dry-run, and recover handlers.
|
|
3
3
|
*
|
|
4
|
-
* Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun, handleRecover
|
|
4
|
+
* Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun, handleRecover, handleRebuild
|
|
5
5
|
*/
|
|
6
|
+
import { existsSync, mkdirSync, renameSync } from "node:fs";
|
|
7
|
+
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
6
8
|
import { deriveState } from "./state.js";
|
|
9
|
+
import { gsdProjectionRoot, gsdRoot } from "./paths.js";
|
|
7
10
|
import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
8
11
|
import { logWarning } from "./workflow-logger.js";
|
|
9
12
|
export async function handleCleanupBranches(ctx, basePath) {
|
|
@@ -439,6 +442,30 @@ export async function handleCleanupProjects(args, ctx) {
|
|
|
439
442
|
}
|
|
440
443
|
ctx.ui.notify(lines.join("\n"), "info");
|
|
441
444
|
}
|
|
445
|
+
function recoverConfirmed(args) {
|
|
446
|
+
return args
|
|
447
|
+
.split(/\s+/)
|
|
448
|
+
.map((part) => part.trim().toLowerCase())
|
|
449
|
+
.some((part) => part === "--confirm" || part === "--yes" || part === "confirm");
|
|
450
|
+
}
|
|
451
|
+
async function confirmRecover(ctx, args) {
|
|
452
|
+
if (recoverConfirmed(args))
|
|
453
|
+
return true;
|
|
454
|
+
const warning = [
|
|
455
|
+
"gsd recover imports markdown into the database.",
|
|
456
|
+
"It clears and reconstructs milestone, slice, and task hierarchy rows from rendered markdown.",
|
|
457
|
+
"Use /gsd rebuild markdown for normal DB-to-markdown realignment.",
|
|
458
|
+
].join("\n");
|
|
459
|
+
if (typeof ctx.ui.confirm === "function") {
|
|
460
|
+
const confirmed = await ctx.ui.confirm("Import markdown into the DB?", `${warning}\n\nContinue only if the DB is lost or corrupt and markdown is the source you intend to import.`);
|
|
461
|
+
if (confirmed)
|
|
462
|
+
return true;
|
|
463
|
+
ctx.ui.notify("gsd recover cancelled. No database changes made.", "info");
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
ctx.ui.notify(`${warning}\n\nNo database changes made. Re-run /gsd recover --confirm to proceed.`, "warning");
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
442
469
|
/**
|
|
443
470
|
* `gsd recover` — Reconstruct DB hierarchy state from rendered markdown on disk.
|
|
444
471
|
*
|
|
@@ -448,7 +475,7 @@ export async function handleCleanupProjects(args, ctx) {
|
|
|
448
475
|
*
|
|
449
476
|
* Prints counts of recovered items and the resulting project phase.
|
|
450
477
|
*/
|
|
451
|
-
export async function handleRecover(ctx, basePath) {
|
|
478
|
+
export async function handleRecover(ctx, basePath, args = "") {
|
|
452
479
|
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
453
480
|
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
454
481
|
const { invalidateStateCache } = await import("./state.js");
|
|
@@ -456,6 +483,8 @@ export async function handleRecover(ctx, basePath) {
|
|
|
456
483
|
ctx.ui.notify("gsd recover: No database open. Run a GSD command first to initialize the DB.", "error");
|
|
457
484
|
return;
|
|
458
485
|
}
|
|
486
|
+
if (!(await confirmRecover(ctx, args)))
|
|
487
|
+
return;
|
|
459
488
|
try {
|
|
460
489
|
// 1. Delete + re-populate inside a single transaction for atomicity.
|
|
461
490
|
// clearEngineHierarchy() uses transaction() internally but transaction()
|
|
@@ -496,3 +525,144 @@ export async function handleRecover(ctx, basePath) {
|
|
|
496
525
|
ctx.ui.notify(`gsd recover failed: ${msg}`, "error");
|
|
497
526
|
}
|
|
498
527
|
}
|
|
528
|
+
function normalizeArtifactPath(value) {
|
|
529
|
+
return value.replace(/\\/g, "/");
|
|
530
|
+
}
|
|
531
|
+
function pathWithin(root, candidate) {
|
|
532
|
+
const rel = relative(root, candidate);
|
|
533
|
+
return rel.length === 0 || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
534
|
+
}
|
|
535
|
+
function artifactPathForDb(basePath, absPath) {
|
|
536
|
+
const projectionRoot = gsdProjectionRoot(basePath);
|
|
537
|
+
const root = pathWithin(projectionRoot, absPath) ? projectionRoot : gsdRoot(basePath);
|
|
538
|
+
return normalizeArtifactPath(relative(root, absPath));
|
|
539
|
+
}
|
|
540
|
+
function quarantineRelativePath(basePath, absPath) {
|
|
541
|
+
for (const root of [gsdProjectionRoot(basePath), gsdRoot(basePath)]) {
|
|
542
|
+
if (pathWithin(root, absPath)) {
|
|
543
|
+
return normalizeArtifactPath(relative(root, absPath));
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return normalizeArtifactPath(absPath.replace(/^[/\\]+/, ""));
|
|
547
|
+
}
|
|
548
|
+
function uniquePath(path) {
|
|
549
|
+
if (!existsSync(path))
|
|
550
|
+
return path;
|
|
551
|
+
let idx = 2;
|
|
552
|
+
while (existsSync(`${path}.${idx}`))
|
|
553
|
+
idx++;
|
|
554
|
+
return `${path}.${idx}`;
|
|
555
|
+
}
|
|
556
|
+
function resolveDiskArtifactPath(basePath, artifactPath) {
|
|
557
|
+
if (isAbsolute(artifactPath))
|
|
558
|
+
return artifactPath;
|
|
559
|
+
const candidates = [
|
|
560
|
+
join(gsdProjectionRoot(basePath), artifactPath),
|
|
561
|
+
join(gsdRoot(basePath), artifactPath),
|
|
562
|
+
];
|
|
563
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
|
|
564
|
+
}
|
|
565
|
+
function quarantineProjectionFile(basePath, absPath, stamp) {
|
|
566
|
+
const rel = quarantineRelativePath(basePath, absPath);
|
|
567
|
+
const target = uniquePath(join(gsdProjectionRoot(basePath), "quarantine", "projections", stamp, rel));
|
|
568
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
569
|
+
renameSync(absPath, target);
|
|
570
|
+
return target;
|
|
571
|
+
}
|
|
572
|
+
function parseRebuildTarget(args) {
|
|
573
|
+
const trimmed = args.trim().toLowerCase();
|
|
574
|
+
if (!trimmed || trimmed === "markdown")
|
|
575
|
+
return "markdown";
|
|
576
|
+
if (trimmed === "database" || trimmed === "db")
|
|
577
|
+
return "database";
|
|
578
|
+
return "usage";
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
|
|
582
|
+
*
|
|
583
|
+
* This is the DB-first realignment command. It does not import markdown into
|
|
584
|
+
* the DB. Completion SUMMARY files that contradict open DB rows are preserved
|
|
585
|
+
* under `.gsd/quarantine/projections/` before DB projections are rendered.
|
|
586
|
+
*/
|
|
587
|
+
export async function handleRebuild(ctx, basePath, args = "") {
|
|
588
|
+
const { isDbAvailable: dbAvailable, deleteArtifactByPath } = await import("./gsd-db.js");
|
|
589
|
+
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
590
|
+
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
591
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
592
|
+
const target = parseRebuildTarget(args);
|
|
593
|
+
if (target === "usage") {
|
|
594
|
+
ctx.ui.notify([
|
|
595
|
+
"Usage:",
|
|
596
|
+
" /gsd rebuild markdown Rebuild markdown projections from the canonical DB",
|
|
597
|
+
" /gsd rebuild database Reserved for DB-native rebuilds; does not import markdown",
|
|
598
|
+
].join("\n"), "warning");
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
if (target === "database") {
|
|
602
|
+
ctx.ui.notify([
|
|
603
|
+
"gsd rebuild database is reserved for DB-native rebuilds.",
|
|
604
|
+
"It will not import markdown projections into the DB.",
|
|
605
|
+
"For normal realignment, run /gsd rebuild markdown.",
|
|
606
|
+
"If the DB is lost or corrupt and markdown is the source to import, run /gsd recover --confirm.",
|
|
607
|
+
].join("\n"), "warning");
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
if (!dbAvailable()) {
|
|
611
|
+
ctx.ui.notify("gsd rebuild markdown: No database open. Run a GSD command first to initialize the DB.", "error");
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
try {
|
|
615
|
+
invalidateStateCache();
|
|
616
|
+
const state = await deriveState(basePath);
|
|
617
|
+
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
618
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
619
|
+
const quarantined = [];
|
|
620
|
+
const seen = new Set();
|
|
621
|
+
for (const drift of drifts) {
|
|
622
|
+
if (drift.kind !== "artifact-db-status-divergence")
|
|
623
|
+
continue;
|
|
624
|
+
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
|
|
625
|
+
continue;
|
|
626
|
+
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
627
|
+
if (seen.has(absPath) || !existsSync(absPath))
|
|
628
|
+
continue;
|
|
629
|
+
seen.add(absPath);
|
|
630
|
+
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
631
|
+
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
632
|
+
deleteArtifactByPath(artifactDbPath);
|
|
633
|
+
quarantined.push(target);
|
|
634
|
+
}
|
|
635
|
+
const rendered = await renderAllFromDb(basePath);
|
|
636
|
+
invalidateStateCache();
|
|
637
|
+
const lines = [
|
|
638
|
+
"gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
|
|
639
|
+
` Rendered: ${rendered.rendered}`,
|
|
640
|
+
` Skipped: ${rendered.skipped}`,
|
|
641
|
+
` Quarantined: ${quarantined.length}`,
|
|
642
|
+
];
|
|
643
|
+
if (rendered.errors.length > 0) {
|
|
644
|
+
lines.push(` Errors: ${rendered.errors.length}`);
|
|
645
|
+
for (const err of rendered.errors.slice(0, 5)) {
|
|
646
|
+
lines.push(` - ${err}`);
|
|
647
|
+
}
|
|
648
|
+
if (rendered.errors.length > 5) {
|
|
649
|
+
lines.push(` - ${rendered.errors.length - 5} more`);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
if (quarantined.length > 0) {
|
|
653
|
+
lines.push("", " Quarantine:");
|
|
654
|
+
for (const target of quarantined.slice(0, 5)) {
|
|
655
|
+
lines.push(` - ${target}`);
|
|
656
|
+
}
|
|
657
|
+
if (quarantined.length > 5) {
|
|
658
|
+
lines.push(` - ${quarantined.length - 5} more`);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
ctx.ui.notify(lines.join("\n"), rendered.errors.length > 0 ? "warning" : "success");
|
|
662
|
+
}
|
|
663
|
+
catch (err) {
|
|
664
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
665
|
+
logWarning("command", `rebuild failed: ${msg}`);
|
|
666
|
+
ctx.ui.notify(`gsd rebuild failed: ${msg}`, "error");
|
|
667
|
+
}
|
|
668
|
+
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* /gsd mcp — Overview of all servers (alias: /gsd mcp status)
|
|
8
8
|
* /gsd mcp status — Same as bare /gsd mcp
|
|
9
9
|
* /gsd mcp check <srv> — Detailed status for a specific server
|
|
10
|
+
* /gsd mcp discover [srv] — Connect and list tools for a server
|
|
10
11
|
* /gsd mcp test <srv> — Test handshake + tools/list for a server
|
|
11
12
|
* /gsd mcp enable <srv> / disable <srv> — Toggle local server exposure
|
|
12
13
|
* /gsd mcp import <srv> [as <name>] — Copy a discovered server into local config
|
|
@@ -15,6 +16,7 @@
|
|
|
15
16
|
import { resolve } from "node:path";
|
|
16
17
|
import { ensureProjectWorkflowMcpConfig } from "./mcp-project-config.js";
|
|
17
18
|
import { deleteProjectLocalMcpServer, readMcpManagementStatus, setProjectLocalMcpServerDisabled, testMcpServerConnection, upsertProjectLocalMcpServer, } from "../mcp-client/manager.js";
|
|
19
|
+
const MCP_STATUS_PROBE_TIMEOUT_MS = 10_000;
|
|
18
20
|
export function hasHostMcpTool(systemPrompt, serverName) {
|
|
19
21
|
const marker = `mcp__${serverName}__`;
|
|
20
22
|
return systemPrompt.includes(marker);
|
|
@@ -31,7 +33,8 @@ export function formatMcpInitResult(status, configPath, targetPath) {
|
|
|
31
33
|
`Project: ${targetPath}`,
|
|
32
34
|
`Config: ${configPath}`,
|
|
33
35
|
"",
|
|
34
|
-
"MCP-capable clients can now load the GSD workflow MCP
|
|
36
|
+
"MCP-capable clients can now load the GSD workflow and gsd-browser MCP servers from this folder.",
|
|
37
|
+
"Pi Providers use the managed gsd-browser engine directly; this project config is for External MCP Clients.",
|
|
35
38
|
"Restart or reconnect any client that already has this project open.",
|
|
36
39
|
].join("\n");
|
|
37
40
|
}
|
|
@@ -48,21 +51,23 @@ export function formatMcpStatusReport(servers) {
|
|
|
48
51
|
}
|
|
49
52
|
const lines = [`MCP Server Status — ${servers.length} server(s)\n`];
|
|
50
53
|
for (const s of servers) {
|
|
51
|
-
const icon = s.disabled ? "⊘" : s.error ? "✗" : s.connected ? "✓" : "○";
|
|
54
|
+
const icon = s.disabled ? "⊘" : s.error ? "✗" : s.connected || s.available ? "✓" : "○";
|
|
52
55
|
const status = s.disabled
|
|
53
56
|
? "disabled"
|
|
54
57
|
: s.error
|
|
55
58
|
? `error: ${s.error}`
|
|
56
59
|
: s.connected
|
|
57
60
|
? `connected — ${s.toolCount} tools`
|
|
58
|
-
:
|
|
61
|
+
: s.available
|
|
62
|
+
? `available — ${s.toolCount} tools`
|
|
63
|
+
: "disconnected";
|
|
59
64
|
const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
|
|
60
65
|
lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
|
|
61
66
|
}
|
|
62
67
|
lines.push("");
|
|
63
68
|
lines.push("Use /gsd mcp check <server> for details on a specific server.");
|
|
69
|
+
lines.push("Use /gsd mcp discover <server> to connect and list tools.");
|
|
64
70
|
lines.push("Use /gsd mcp test <server> to verify handshake and tool discovery.");
|
|
65
|
-
lines.push("Use mcp_discover to connect and list tools for a server.");
|
|
66
71
|
return lines.join("\n");
|
|
67
72
|
}
|
|
68
73
|
export function formatMcpServerDetail(server) {
|
|
@@ -77,8 +82,8 @@ export function formatMcpServerDetail(server) {
|
|
|
77
82
|
lines.push(` Status: error`);
|
|
78
83
|
lines.push(` Error: ${server.error}`);
|
|
79
84
|
}
|
|
80
|
-
else if (server.connected) {
|
|
81
|
-
lines.push(` Status: connected`);
|
|
85
|
+
else if (server.connected || server.available) {
|
|
86
|
+
lines.push(` Status: ${server.connected ? "connected" : "available"}`);
|
|
82
87
|
lines.push(` Tools: ${server.toolCount}`);
|
|
83
88
|
if (server.tools.length > 0) {
|
|
84
89
|
lines.push("");
|
|
@@ -91,7 +96,7 @@ export function formatMcpServerDetail(server) {
|
|
|
91
96
|
else {
|
|
92
97
|
lines.push(` Status: disconnected`);
|
|
93
98
|
lines.push("");
|
|
94
|
-
lines.push(` Run
|
|
99
|
+
lines.push(` Run /gsd mcp discover ${server.name} to connect and list tools.`);
|
|
95
100
|
}
|
|
96
101
|
if (server.envWarnings?.length) {
|
|
97
102
|
lines.push("");
|
|
@@ -120,9 +125,70 @@ export function formatMcpConnectionTestResult(result) {
|
|
|
120
125
|
...(result.warnings.length > 0 ? ["", "Warnings:", ...result.warnings.map((warning) => ` - ${warning}`)] : []),
|
|
121
126
|
].join("\n");
|
|
122
127
|
}
|
|
128
|
+
export function formatMcpDiscoveryResult(result) {
|
|
129
|
+
if (result.ok) {
|
|
130
|
+
return [
|
|
131
|
+
`MCP discovery completed for ${result.server}.`,
|
|
132
|
+
"",
|
|
133
|
+
`Transport: ${result.transport}`,
|
|
134
|
+
`Tools: ${result.toolCount}`,
|
|
135
|
+
...(result.tools.length > 0 ? ["", "Discovered tools:", ...result.tools.map((tool) => ` - ${tool}`)] : []),
|
|
136
|
+
"",
|
|
137
|
+
`Call with: mcp_call(server="${result.server}", tool="<tool_name>", args={...})`,
|
|
138
|
+
].join("\n");
|
|
139
|
+
}
|
|
140
|
+
return [
|
|
141
|
+
`MCP discovery failed for ${result.server}.`,
|
|
142
|
+
"",
|
|
143
|
+
`Transport: ${result.transport}`,
|
|
144
|
+
`Error: ${result.error ?? "Unknown error"}`,
|
|
145
|
+
...(result.warnings.length > 0 ? ["", "Warnings:", ...result.warnings.map((warning) => ` - ${warning}`)] : []),
|
|
146
|
+
].join("\n");
|
|
147
|
+
}
|
|
148
|
+
async function readLiveConnectionStatus(serverName) {
|
|
149
|
+
try {
|
|
150
|
+
const mcpClient = await import("../mcp-client/index.js");
|
|
151
|
+
const mod = mcpClient;
|
|
152
|
+
if (typeof mod.getConnectionStatus === "function") {
|
|
153
|
+
return mod.getConnectionStatus(serverName);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// mcp-client may not expose status helpers in some hosts.
|
|
158
|
+
}
|
|
159
|
+
return { connected: false, tools: [] };
|
|
160
|
+
}
|
|
161
|
+
function shouldProbeConfiguredServer(config) {
|
|
162
|
+
return !config.disabled && config.transport === "stdio" && (config.envWarnings?.length ?? 0) === 0;
|
|
163
|
+
}
|
|
164
|
+
async function resolveMcpRuntimeStatus(config, systemPrompt) {
|
|
165
|
+
const live = await readLiveConnectionStatus(config.name);
|
|
166
|
+
let connected = live.connected;
|
|
167
|
+
let tools = live.tools;
|
|
168
|
+
let error = live.error;
|
|
169
|
+
if (!connected && !error && hasHostMcpTool(systemPrompt, config.name))
|
|
170
|
+
connected = true;
|
|
171
|
+
if (!connected && !error && shouldProbeConfiguredServer(config)) {
|
|
172
|
+
const probed = await testMcpServerConnection(config.name, { timeoutMs: MCP_STATUS_PROBE_TIMEOUT_MS });
|
|
173
|
+
if (probed.ok) {
|
|
174
|
+
return {
|
|
175
|
+
connected: false,
|
|
176
|
+
available: true,
|
|
177
|
+
tools: probed.tools,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
error = probed.error;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
connected,
|
|
184
|
+
available: false,
|
|
185
|
+
tools,
|
|
186
|
+
error,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
123
189
|
// ─── Command handler ────────────────────────────────────────────────────────
|
|
124
190
|
/**
|
|
125
|
-
* Handle `/gsd mcp [status|check <server
|
|
191
|
+
* Handle `/gsd mcp [status|check <server>|discover [server]|...]`.
|
|
126
192
|
*/
|
|
127
193
|
export async function handleMcpStatus(args, ctx) {
|
|
128
194
|
const trimmed = args.trim();
|
|
@@ -146,6 +212,24 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
146
212
|
}
|
|
147
213
|
return;
|
|
148
214
|
}
|
|
215
|
+
// /gsd mcp discover [server]
|
|
216
|
+
if (lowered === "discover" || lowered.startsWith("discover ")) {
|
|
217
|
+
const requestedServerName = trimmed.slice("discover".length).trim();
|
|
218
|
+
let serverName = requestedServerName;
|
|
219
|
+
if (!serverName) {
|
|
220
|
+
if (configs.length === 1) {
|
|
221
|
+
serverName = configs[0].name;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const available = configs.map((config) => config.name).join(", ") || "(none)";
|
|
225
|
+
ctx.ui.notify(`Usage: /gsd mcp discover <server>\n\nAvailable: ${available}`, "warning");
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const result = await testMcpServerConnection(serverName);
|
|
230
|
+
ctx.ui.notify(formatMcpDiscoveryResult(result), result.ok ? "info" : "warning");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
149
233
|
// /gsd mcp test <server>
|
|
150
234
|
if (lowered.startsWith("test ")) {
|
|
151
235
|
const serverName = trimmed.slice("test ".length).trim();
|
|
@@ -245,33 +329,15 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
245
329
|
ctx.ui.notify(`Unknown MCP server: "${serverName}"\n\nAvailable: ${available}`, "warning");
|
|
246
330
|
return;
|
|
247
331
|
}
|
|
248
|
-
|
|
249
|
-
let connected = false;
|
|
250
|
-
let toolNames = [];
|
|
251
|
-
let error;
|
|
252
|
-
try {
|
|
253
|
-
const mcpClient = await import("../mcp-client/index.js");
|
|
254
|
-
// Access the module's connection state if exported; fall back gracefully
|
|
255
|
-
const mod = mcpClient;
|
|
256
|
-
if (typeof mod.getConnectionStatus === "function") {
|
|
257
|
-
const status = mod.getConnectionStatus(serverName);
|
|
258
|
-
connected = status.connected;
|
|
259
|
-
toolNames = status.tools;
|
|
260
|
-
error = status.error;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
catch {
|
|
264
|
-
// mcp-client may not expose status helpers — that's fine
|
|
265
|
-
}
|
|
266
|
-
if (!connected && !error && hasHostMcpTool(systemPrompt, serverName))
|
|
267
|
-
connected = true;
|
|
332
|
+
const runtime = await resolveMcpRuntimeStatus(config, systemPrompt);
|
|
268
333
|
ctx.ui.notify(formatMcpServerDetail({
|
|
269
334
|
name: config.name,
|
|
270
335
|
transport: config.transport,
|
|
271
|
-
connected,
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
336
|
+
connected: runtime.connected,
|
|
337
|
+
available: runtime.available,
|
|
338
|
+
toolCount: runtime.tools.length,
|
|
339
|
+
tools: runtime.tools,
|
|
340
|
+
error: runtime.error,
|
|
275
341
|
disabled: config.disabled,
|
|
276
342
|
sourcePath: config.sourcePath,
|
|
277
343
|
envWarnings: config.envWarnings,
|
|
@@ -280,38 +346,20 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
280
346
|
}
|
|
281
347
|
// /gsd mcp or /gsd mcp status
|
|
282
348
|
if (!lowered || lowered === "status") {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
let connected = false;
|
|
287
|
-
let toolCount = 0;
|
|
288
|
-
let error;
|
|
289
|
-
try {
|
|
290
|
-
const mcpClient = await import("../mcp-client/index.js");
|
|
291
|
-
const mod = mcpClient;
|
|
292
|
-
if (typeof mod.getConnectionStatus === "function") {
|
|
293
|
-
const status = mod.getConnectionStatus(config.name);
|
|
294
|
-
connected = status.connected;
|
|
295
|
-
toolCount = status.tools.length;
|
|
296
|
-
error = status.error;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
// Fall back to unknown state
|
|
301
|
-
}
|
|
302
|
-
if (!connected && !error && hasHostMcpTool(systemPrompt, config.name))
|
|
303
|
-
connected = true;
|
|
304
|
-
statuses.push({
|
|
349
|
+
const statuses = await Promise.all(configs.map(async (config) => {
|
|
350
|
+
const runtime = await resolveMcpRuntimeStatus(config, systemPrompt);
|
|
351
|
+
return {
|
|
305
352
|
name: config.name,
|
|
306
353
|
transport: config.transport,
|
|
307
|
-
connected,
|
|
308
|
-
|
|
309
|
-
|
|
354
|
+
connected: runtime.connected,
|
|
355
|
+
available: runtime.available,
|
|
356
|
+
toolCount: runtime.tools.length,
|
|
357
|
+
error: runtime.error,
|
|
310
358
|
disabled: config.disabled,
|
|
311
359
|
sourcePath: config.sourcePath,
|
|
312
360
|
envWarnings: config.envWarnings,
|
|
313
|
-
}
|
|
314
|
-
}
|
|
361
|
+
};
|
|
362
|
+
}));
|
|
315
363
|
const warningLines = [
|
|
316
364
|
...management.warnings,
|
|
317
365
|
...management.duplicates.map((dup) => `Duplicate "${dup.name}" from ${dup.shadowedSourcePath} is shadowed by ${dup.keptSourcePath}.`),
|
|
@@ -323,9 +371,10 @@ export async function handleMcpStatus(args, ctx) {
|
|
|
323
371
|
return;
|
|
324
372
|
}
|
|
325
373
|
// Unknown subcommand
|
|
326
|
-
ctx.ui.notify("Usage: /gsd mcp [status|check <server>|test <server>|enable <server>|disable <server>|delete <server> --confirm|import <server> [as <name>]|init [dir]]\n\n" +
|
|
374
|
+
ctx.ui.notify("Usage: /gsd mcp [status|check <server>|discover [server]|test <server>|enable <server>|disable <server>|delete <server> --confirm|import <server> [as <name>]|init [dir]]\n\n" +
|
|
327
375
|
" status Show all MCP server statuses (default)\n" +
|
|
328
376
|
" check <server> Detailed status for a specific server\n" +
|
|
377
|
+
" discover [server] Connect and list tools for a server\n" +
|
|
329
378
|
" test <server> Verify MCP handshake and tools/list\n" +
|
|
330
379
|
" enable <server> Enable a local GSD-managed server\n" +
|
|
331
380
|
" disable <server> Disable a local GSD-managed server\n" +
|
|
@@ -11,6 +11,8 @@ import { fileURLToPath } from "node:url";
|
|
|
11
11
|
import { getGlobalGSDPreferencesPath, getLegacyGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, loadGlobalGSDPreferences, loadProjectGSDPreferences, loadEffectiveGSDPreferences, normalizePreferencesShape, resolveAllSkillReferences, } from "./preferences.js";
|
|
12
12
|
import { loadFile, saveFile, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
13
13
|
import { runClaudeImportFlow } from "./claude-import.js";
|
|
14
|
+
const DEFAULT_WIDGET_MODE = "small";
|
|
15
|
+
const WIDGET_MODE_OPTIONS = [DEFAULT_WIDGET_MODE, "full", "min", "off"];
|
|
14
16
|
/** Extract body content after frontmatter closing delimiter, or null if none. */
|
|
15
17
|
function extractBodyAfterFrontmatter(content) {
|
|
16
18
|
const closingIdx = content.indexOf("\n---", content.indexOf("---"));
|
|
@@ -1509,7 +1511,7 @@ async function configureAdvanced(ctx, prefs) {
|
|
|
1509
1511
|
else if (minRequestInterval !== undefined) {
|
|
1510
1512
|
prefs.min_request_interval_ms = minRequestInterval;
|
|
1511
1513
|
}
|
|
1512
|
-
const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode,
|
|
1514
|
+
const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode, WIDGET_MODE_OPTIONS, DEFAULT_WIDGET_MODE);
|
|
1513
1515
|
if (widget !== undefined)
|
|
1514
1516
|
prefs.widget_mode = widget;
|
|
1515
1517
|
const experimental = prefs.experimental ?? {};
|
|
@@ -166,6 +166,6 @@ export async function handleVerdict(rawArgs, ctx, basePath) {
|
|
|
166
166
|
ctx.ui.notify(`Milestone ${milestoneId} verdict: ${prevVerdict} -> ${effectiveVerdict} (${existingValidation.source})`, "success");
|
|
167
167
|
}
|
|
168
168
|
if (effectiveVerdict === "needs-remediation") {
|
|
169
|
-
ctx.ui.notify("Follow up with
|
|
169
|
+
ctx.ui.notify("Follow up with /gsd dispatch reassess to add remediation slices, then re-run /gsd auto.", "info");
|
|
170
170
|
}
|
|
171
171
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { matchesKey, Key, truncateToWidth } from "@gsd/pi-tui";
|
|
10
10
|
import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
|
|
11
11
|
import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, loadProjectGSDPreferences, getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, resolveDynamicRoutingConfig, resolveEffectiveProfile, resolveModelWithFallbacksForUnit, resolveAutoSupervisorConfig, } from "./preferences.js";
|
|
12
|
+
const DEFAULT_WIDGET_MODE = "small";
|
|
12
13
|
function collectConfigSections() {
|
|
13
14
|
const sections = [];
|
|
14
15
|
const globalPrefs = loadGlobalGSDPreferences();
|
|
@@ -157,7 +158,7 @@ function collectConfigSections() {
|
|
|
157
158
|
toggleRows.push({ label: "search_provider", value: prefs.search_provider });
|
|
158
159
|
if (prefs?.context_selection)
|
|
159
160
|
toggleRows.push({ label: "context_selection", value: prefs.context_selection });
|
|
160
|
-
if (prefs?.widget_mode && prefs.widget_mode !==
|
|
161
|
+
if (prefs?.widget_mode && prefs.widget_mode !== DEFAULT_WIDGET_MODE)
|
|
161
162
|
toggleRows.push({ label: "widget_mode", value: prefs.widget_mode });
|
|
162
163
|
if (prefs?.experimental?.rtk)
|
|
163
164
|
toggleRows.push({ label: "experimental.rtk", value: "on" });
|