@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63
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 +14 -19
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/loader.js +6 -4
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/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/google-cli/stream-adapter.js +16 -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 +119 -18
- 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 +542 -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-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
- package/dist/resources/extensions/gsd/auto-start.js +28 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
- package/dist/resources/extensions/gsd/auto.js +83 -19
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- 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/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/preferences-models.js +17 -9
- package/dist/resources/extensions/gsd/preferences.js +91 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/session-lock.js +4 -3
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -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/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- 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-logger.js +4 -0
- 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-manager.js +101 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- 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/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- 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 +12 -6
- 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/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- 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/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -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 +85 -19
- 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 +71 -3
- 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 +257 -37
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -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 +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
- 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 +48 -6
- 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/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -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 +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/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 +52 -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/extensions/extension-upstream-types.d.ts +28 -2
- 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/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.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/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.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 +8 -8
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -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 +140 -18
- 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 +716 -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-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
- package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
- package/src/resources/extensions/gsd/auto-start.ts +44 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
- package/src/resources/extensions/gsd/auto.ts +118 -18
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/config-overlay.ts +22 -9
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- 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/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/preferences-models.ts +26 -8
- package/src/resources/extensions/gsd/preferences.ts +111 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/session-lock.ts +8 -7
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
- 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-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
- 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 +97 -4
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- 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/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -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/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- 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/model-router.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +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/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.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/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- 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-manager.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -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/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- 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-logger.ts +5 -0
- 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-manager.ts +97 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
|
@@ -8,10 +8,8 @@ import {
|
|
|
8
8
|
type ExecSandboxRequest,
|
|
9
9
|
type ExecSandboxResult,
|
|
10
10
|
} from "../exec-sandbox.js";
|
|
11
|
-
import { realpathSync } from "node:fs";
|
|
12
|
-
import path from "node:path";
|
|
13
11
|
import { isContextModeEnabled, type ContextModeConfig } from "../preferences-types.js";
|
|
14
|
-
import {
|
|
12
|
+
import { bashReferencesProjectRootOutsideWorktree } from "../worktree-shell-guard.js";
|
|
15
13
|
import { contextModeDisabledResult, type ToolExecutionResult } from "./context-mode-tool-result.js";
|
|
16
14
|
|
|
17
15
|
export interface ExecToolParams {
|
|
@@ -189,117 +187,6 @@ function isToolExecutionResult(value: unknown): value is ToolExecutionResult {
|
|
|
189
187
|
return typeof value === "object" && value !== null && Array.isArray((value as { content?: unknown }).content);
|
|
190
188
|
}
|
|
191
189
|
|
|
192
|
-
function escapeRegExp(value: string): string {
|
|
193
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function normalizeScanPath(value: string): string {
|
|
197
|
-
const normalized = value.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
198
|
-
return normalized.startsWith("/private/var/")
|
|
199
|
-
? normalized.slice("/private".length)
|
|
200
|
-
: normalized;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function parseWorktreeBase(baseDir: string): { originalRoot: string; worktreeRoot: string } | null {
|
|
204
|
-
const normalizedBase = normalizeScanPath(baseDir);
|
|
205
|
-
const originalRoot = projectRootFromWorktreePath(normalizedBase);
|
|
206
|
-
if (!originalRoot) return null;
|
|
207
|
-
return { originalRoot, worktreeRoot: normalizedBase };
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function pathInside(parent: string, target: string): boolean {
|
|
211
|
-
const parentWithSep = parent.endsWith("/") ? parent : `${parent}/`;
|
|
212
|
-
return target === parent || target.startsWith(parentWithSep);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function comparablePathVariants(value: string): string[] {
|
|
216
|
-
const variants = new Set<string>();
|
|
217
|
-
const normalized = normalizeScanPath(path.resolve(value));
|
|
218
|
-
variants.add(normalized);
|
|
219
|
-
try {
|
|
220
|
-
variants.add(normalizeScanPath(realpathSync(normalized)));
|
|
221
|
-
} catch {
|
|
222
|
-
// Nonexistent paths are still compared lexically.
|
|
223
|
-
}
|
|
224
|
-
if (normalized.startsWith("/private/var/")) {
|
|
225
|
-
variants.add(normalized.replace(/^\/private\/var\//, "/var/"));
|
|
226
|
-
} else if (normalized.startsWith("/var/")) {
|
|
227
|
-
variants.add(`/private${normalized}`);
|
|
228
|
-
}
|
|
229
|
-
return [...variants];
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
function pathInsideAny(parents: readonly string[], targets: readonly string[]): boolean {
|
|
233
|
-
return targets.some((target) => parents.some((parent) => pathInside(parent, target)));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
function stripWrappingQuotes(value: string): string {
|
|
237
|
-
const trimmed = value.trim();
|
|
238
|
-
if (trimmed.length < 2) return trimmed;
|
|
239
|
-
const first = trimmed[0];
|
|
240
|
-
const last = trimmed[trimmed.length - 1];
|
|
241
|
-
if ((first === "'" || first === '"' || first === "`") && last === first) {
|
|
242
|
-
return trimmed.slice(1, -1).trim();
|
|
243
|
-
}
|
|
244
|
-
return trimmed;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
function extractPathLikeValues(script: string): string[] {
|
|
248
|
-
const values: string[] = [];
|
|
249
|
-
const push = (candidate: string) => {
|
|
250
|
-
const cleaned = stripWrappingQuotes(candidate).trim();
|
|
251
|
-
if (!cleaned) return;
|
|
252
|
-
values.push(cleaned);
|
|
253
|
-
};
|
|
254
|
-
const pushQuotedLiterals = (source: string, depth = 0) => {
|
|
255
|
-
for (const match of source.matchAll(/(["'`])((?:\\.|(?!\1).)*)\1/g)) {
|
|
256
|
-
push(match[2]);
|
|
257
|
-
if (depth < 2 && /["'`]/.test(match[2])) {
|
|
258
|
-
pushQuotedLiterals(match[2], depth + 1);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
for (const match of script.matchAll(/(?:^|[;\n\r]|\&\&|\|\|)\s*cd\s+([^\n\r;|&]+)/g)) {
|
|
264
|
-
push(match[1]);
|
|
265
|
-
}
|
|
266
|
-
for (const match of script.matchAll(/process\.chdir\(\s*([^\n\r;]+?)\s*\)/g)) {
|
|
267
|
-
push(match[1]);
|
|
268
|
-
pushQuotedLiterals(match[1]);
|
|
269
|
-
}
|
|
270
|
-
pushQuotedLiterals(script);
|
|
271
|
-
return values;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
function resolvesToOriginalRootOutsideWorktree(script: string, baseDir: string): boolean {
|
|
275
|
-
const parsed = parseWorktreeBase(baseDir);
|
|
276
|
-
if (!parsed) return false;
|
|
277
|
-
|
|
278
|
-
const normalizedWorktree = normalizeScanPath(path.resolve(parsed.worktreeRoot));
|
|
279
|
-
const normalizedOriginalRoot = normalizeScanPath(path.resolve(parsed.originalRoot));
|
|
280
|
-
const worktreeRoots = comparablePathVariants(normalizedWorktree);
|
|
281
|
-
const originalRoots = comparablePathVariants(normalizedOriginalRoot);
|
|
282
|
-
for (const value of extractPathLikeValues(script)) {
|
|
283
|
-
const resolved = comparablePathVariants(path.resolve(normalizedWorktree, value));
|
|
284
|
-
if (pathInsideAny(originalRoots, resolved) && !pathInsideAny(worktreeRoots, resolved)) {
|
|
285
|
-
return true;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
function scriptReferencesOriginalRootFromWorktree(script: string, baseDir: string): boolean {
|
|
292
|
-
const parsed = parseWorktreeBase(baseDir);
|
|
293
|
-
if (!parsed) return false;
|
|
294
|
-
const normalizedScript = script.replace(/\\/g, "/");
|
|
295
|
-
return comparablePathVariants(parsed.originalRoot).some((originalRoot) => {
|
|
296
|
-
const originalRootPattern = new RegExp(
|
|
297
|
-
`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd(?:-worktrees|/worktrees)(?:/|$)))`,
|
|
298
|
-
);
|
|
299
|
-
return originalRootPattern.test(normalizedScript);
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
|
|
303
190
|
export async function executeGsdExec(
|
|
304
191
|
params: ExecToolParams,
|
|
305
192
|
deps: ExecToolDeps,
|
|
@@ -313,10 +200,7 @@ export async function executeGsdExec(
|
|
|
313
200
|
if (Buffer.byteLength(script, "utf8") > 200_000) {
|
|
314
201
|
return paramError("script exceeds the 200 KB length limit");
|
|
315
202
|
}
|
|
316
|
-
if (
|
|
317
|
-
resolvesToOriginalRootOutsideWorktree(script, deps.baseDir)
|
|
318
|
-
|| scriptReferencesOriginalRootFromWorktree(script, deps.baseDir)
|
|
319
|
-
) {
|
|
203
|
+
if (bashReferencesProjectRootOutsideWorktree(script, deps.baseDir)) {
|
|
320
204
|
return paramError(
|
|
321
205
|
"script references the original project root while running inside a milestone worktree; use the active worktree path or relative paths",
|
|
322
206
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared terminal rendering helpers for GSD extension TUI surfaces.
|
|
3
3
|
|
|
4
|
-
import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
|
|
4
|
+
import { style, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
|
|
5
5
|
|
|
6
6
|
export interface ThemeLike {
|
|
7
7
|
fg(color: string, text: string): string;
|
|
@@ -107,21 +107,64 @@ export function renderPanel(
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
const ruleColor = options.ruleColor ?? "borderAccent";
|
|
110
|
-
const
|
|
111
|
-
const
|
|
110
|
+
const paddingX = Math.max(0, options.indent ?? 0);
|
|
111
|
+
const surface = style()
|
|
112
|
+
.border("open")
|
|
113
|
+
.title(title, (text) => theme.fg(ruleColor, text))
|
|
114
|
+
.borderColor((text) => theme.fg(ruleColor, text))
|
|
115
|
+
.paddingX(paddingX)
|
|
116
|
+
.bottomRule(true);
|
|
112
117
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
+
const body = inner.length > 0 ? inner : [""];
|
|
119
|
+
return surface.render(body, width);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface PlainOutcomeLayoutOptions {
|
|
123
|
+
/** Right side of the header row (e.g. elapsed time). */
|
|
124
|
+
headerRight?: string;
|
|
125
|
+
/** Full-width body rows with an optional right column. */
|
|
126
|
+
splitRows?: Array<{ left: string; right?: string }>;
|
|
127
|
+
/** Footer hints pinned to the bottom-right (e.g. slash commands). */
|
|
128
|
+
footerRight?: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Plain transcript outcome — matches the GSD chat/tool speaker line (no rule box).
|
|
133
|
+
* Header: `GSD · <status>` with optional right meta; body copy-clean; optional footer right.
|
|
134
|
+
*/
|
|
135
|
+
export function renderPlainOutcome(
|
|
136
|
+
theme: ThemeLike,
|
|
137
|
+
width: number,
|
|
138
|
+
statusLine: string,
|
|
139
|
+
bodyLines: string[],
|
|
140
|
+
options?: PlainOutcomeLayoutOptions,
|
|
141
|
+
): string[] {
|
|
142
|
+
const headerLeft =
|
|
143
|
+
theme.fg("accent", theme.bold("GSD")) + theme.fg("dim", " · ") + statusLine;
|
|
144
|
+
const header = options?.headerRight
|
|
145
|
+
? rightAlign(headerLeft, options.headerRight, width)
|
|
146
|
+
: safeLine(headerLeft, width);
|
|
147
|
+
|
|
148
|
+
const out: string[] = [header];
|
|
149
|
+
|
|
150
|
+
if (options?.splitRows && options.splitRows.length > 0) {
|
|
151
|
+
for (const row of options.splitRows) {
|
|
152
|
+
out.push(row.right ? rightAlign(row.left, row.right, width) : safeLine(row.left, width));
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
for (const line of bodyLines.filter(Boolean)) {
|
|
156
|
+
out.push(safeLine(line, width));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
118
159
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const body = inner.map((line) => safeLine(pad + safeLine(line, contentWidth), width, ""));
|
|
160
|
+
if (options?.footerRight) {
|
|
161
|
+
out.push(rightAlign("", options.footerRight, width));
|
|
162
|
+
}
|
|
123
163
|
|
|
124
|
-
|
|
164
|
+
if (out.length === 1 && !options?.footerRight) {
|
|
165
|
+
return [header, ""];
|
|
166
|
+
}
|
|
167
|
+
return [...out, ""];
|
|
125
168
|
}
|
|
126
169
|
|
|
127
170
|
export function renderFrame(
|
|
@@ -187,7 +187,7 @@ const TOOL_SURFACE_GUIDANCE_BY_UNIT: Record<string, string> = {
|
|
|
187
187
|
"run-uat":
|
|
188
188
|
"Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
|
|
189
189
|
"complete-slice":
|
|
190
|
-
"Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
190
|
+
"Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Capture learnings through `gsd_capture_thought` (or MCP-scoped `mcp__…__gsd_capture_thought`), not bare `capture_thought`, when workflow MCP tools are presented. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
191
191
|
"gate-evaluate":
|
|
192
192
|
"Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
|
|
193
193
|
"reactive-execute":
|
|
@@ -220,15 +220,19 @@ export const UNIT_REGISTRY = {
|
|
|
220
220
|
phaseChain: ["completion"],
|
|
221
221
|
toolContract: {
|
|
222
222
|
allowedGsdTools: [
|
|
223
|
+
"gsd_exec",
|
|
223
224
|
"gsd_slice_complete",
|
|
224
225
|
"gsd_task_reopen",
|
|
225
226
|
"gsd_replan_slice",
|
|
226
227
|
"gsd_decision_save",
|
|
228
|
+
"gsd_capture_thought",
|
|
227
229
|
"gsd_requirement_update",
|
|
228
230
|
"gsd_summary_save",
|
|
229
231
|
"subagent",
|
|
230
232
|
],
|
|
231
233
|
requiredWorkflowTools: [
|
|
234
|
+
"gsd_exec",
|
|
235
|
+
"gsd_capture_thought",
|
|
232
236
|
"gsd_slice_complete",
|
|
233
237
|
"gsd_task_reopen",
|
|
234
238
|
"gsd_replan_slice",
|
|
@@ -254,8 +258,21 @@ export const UNIT_REGISTRY = {
|
|
|
254
258
|
scopeClass: "execute-task",
|
|
255
259
|
phaseChain: ["execution"],
|
|
256
260
|
toolContract: {
|
|
257
|
-
allowedGsdTools: [
|
|
258
|
-
|
|
261
|
+
allowedGsdTools: [
|
|
262
|
+
"gsd_task_complete",
|
|
263
|
+
"gsd_exec",
|
|
264
|
+
"gsd_exec_search",
|
|
265
|
+
"gsd_resume",
|
|
266
|
+
"gsd_capture_thought",
|
|
267
|
+
"gsd_decision_save",
|
|
268
|
+
],
|
|
269
|
+
requiredWorkflowTools: [
|
|
270
|
+
"gsd_task_complete",
|
|
271
|
+
"gsd_exec",
|
|
272
|
+
"gsd_exec_search",
|
|
273
|
+
"gsd_resume",
|
|
274
|
+
"gsd_capture_thought",
|
|
275
|
+
],
|
|
259
276
|
},
|
|
260
277
|
},
|
|
261
278
|
"execute-task-simple": {
|
|
@@ -263,8 +280,21 @@ export const UNIT_REGISTRY = {
|
|
|
263
280
|
scopeClass: "execute-task",
|
|
264
281
|
phaseChain: ["execution_simple", "execution"],
|
|
265
282
|
toolContract: {
|
|
266
|
-
allowedGsdTools: [
|
|
267
|
-
|
|
283
|
+
allowedGsdTools: [
|
|
284
|
+
"gsd_task_complete",
|
|
285
|
+
"gsd_exec",
|
|
286
|
+
"gsd_exec_search",
|
|
287
|
+
"gsd_resume",
|
|
288
|
+
"gsd_capture_thought",
|
|
289
|
+
"gsd_decision_save",
|
|
290
|
+
],
|
|
291
|
+
requiredWorkflowTools: [
|
|
292
|
+
"gsd_task_complete",
|
|
293
|
+
"gsd_exec",
|
|
294
|
+
"gsd_exec_search",
|
|
295
|
+
"gsd_resume",
|
|
296
|
+
"gsd_capture_thought",
|
|
297
|
+
],
|
|
268
298
|
},
|
|
269
299
|
},
|
|
270
300
|
"reactive-execute": {
|
|
@@ -109,6 +109,11 @@ export function setStderrLoggingEnabled(enabled: boolean): boolean {
|
|
|
109
109
|
return previous;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
/** Whether GSD extension diagnostics may write directly to process.stderr. */
|
|
113
|
+
export function isGsdExtensionStderrEnabled(): boolean {
|
|
114
|
+
return _stderrEnabled;
|
|
115
|
+
}
|
|
116
|
+
|
|
112
117
|
// ─── Public API ─────────────────────────────────────────────────────────
|
|
113
118
|
|
|
114
119
|
/**
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type EnsureProjectWorkflowMcpConfigResult,
|
|
5
5
|
ensureProjectWorkflowMcpConfig,
|
|
6
6
|
} from "./mcp-project-config.js";
|
|
7
|
+
import { warmWorkflowMcpProbeInBackground } from "./workflow-mcp-readiness-cache.js";
|
|
7
8
|
import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
|
|
8
9
|
|
|
9
10
|
interface WorkflowMcpAutoPrepContext {
|
|
@@ -75,6 +76,7 @@ export function prepareWorkflowMcpForProject(
|
|
|
75
76
|
if (result.status !== "unchanged") {
|
|
76
77
|
prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
|
|
77
78
|
}
|
|
79
|
+
warmWorkflowMcpProbeInBackground(projectRoot);
|
|
78
80
|
return result;
|
|
79
81
|
} catch (err) {
|
|
80
82
|
prepCtx.ui?.notify?.(
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Share recent workflow MCP probe results across guided-flow and Claude Code SDK preflight.
|
|
3
|
+
|
|
4
|
+
import { testMcpServerConnection } from "../mcp-client/manager.js";
|
|
5
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
6
|
+
import {
|
|
7
|
+
detectWorkflowMcpLaunchConfig,
|
|
8
|
+
resolveWorkflowMcpProjectRoot,
|
|
9
|
+
} from "./workflow-mcp.js";
|
|
10
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
11
|
+
|
|
12
|
+
/** Reuse a recent successful probe instead of spawning another stdio server. */
|
|
13
|
+
export const WORKFLOW_MCP_PROBE_CACHE_TTL_MS = 120_000;
|
|
14
|
+
/** Per-probe connect + tools/list budget (server typically ready in ~1–2s). */
|
|
15
|
+
export const WORKFLOW_MCP_PROBE_TIMEOUT_MS = 5_000;
|
|
16
|
+
|
|
17
|
+
export interface WorkflowMcpProbeCacheEntry {
|
|
18
|
+
serverName: string;
|
|
19
|
+
tools: readonly string[];
|
|
20
|
+
probedAt: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type WorkflowMcpProbeResult = {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
tools: readonly string[];
|
|
26
|
+
serverName?: string;
|
|
27
|
+
error?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const cacheByProject = new Map<string, WorkflowMcpProbeCacheEntry>();
|
|
31
|
+
const probeInFlightByProject = new Map<string, Promise<WorkflowMcpProbeResult>>();
|
|
32
|
+
let activeWorkflowMcpSdkSessions = 0;
|
|
33
|
+
|
|
34
|
+
function cacheKey(projectRoot: string): string {
|
|
35
|
+
return resolveWorkflowMcpProjectRoot(projectRoot);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function beginWorkflowMcpSdkSession(): void {
|
|
39
|
+
activeWorkflowMcpSdkSessions++;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function endWorkflowMcpSdkSession(): void {
|
|
43
|
+
activeWorkflowMcpSdkSessions = Math.max(0, activeWorkflowMcpSdkSessions - 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getCachedWorkflowMcpProbe(projectRoot: string): WorkflowMcpProbeCacheEntry | null {
|
|
47
|
+
const entry = cacheByProject.get(cacheKey(projectRoot));
|
|
48
|
+
if (!entry) return null;
|
|
49
|
+
if (Date.now() - entry.probedAt > WORKFLOW_MCP_PROBE_CACHE_TTL_MS) {
|
|
50
|
+
cacheByProject.delete(cacheKey(projectRoot));
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return entry;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function recordWorkflowMcpProbe(
|
|
57
|
+
projectRoot: string,
|
|
58
|
+
serverName: string,
|
|
59
|
+
tools: readonly string[],
|
|
60
|
+
): void {
|
|
61
|
+
cacheByProject.set(cacheKey(projectRoot), {
|
|
62
|
+
serverName,
|
|
63
|
+
tools: [...tools],
|
|
64
|
+
probedAt: Date.now(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function clearWorkflowMcpProbeCache(projectRoot?: string): void {
|
|
69
|
+
if (projectRoot === undefined) {
|
|
70
|
+
cacheByProject.clear();
|
|
71
|
+
probeInFlightByProject.clear();
|
|
72
|
+
activeWorkflowMcpSdkSessions = 0;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const key = cacheKey(projectRoot);
|
|
76
|
+
cacheByProject.delete(key);
|
|
77
|
+
probeInFlightByProject.delete(key);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function workflowMcpProbeAdvertisesSurface(tools: readonly string[]): boolean {
|
|
81
|
+
return tools.some((tool) => isWorkflowToolSurfaceName(tool));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function cachedWorkflowMcpCoversRequired(
|
|
85
|
+
projectRoot: string,
|
|
86
|
+
serverName: string,
|
|
87
|
+
required: readonly string[],
|
|
88
|
+
): boolean {
|
|
89
|
+
const entry = getCachedWorkflowMcpProbe(projectRoot);
|
|
90
|
+
if (!entry || entry.serverName !== serverName) return false;
|
|
91
|
+
return required.every((tool) =>
|
|
92
|
+
entry.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function runProbeAndCacheWorkflowMcp(
|
|
97
|
+
projectRoot: string,
|
|
98
|
+
options: { timeoutMs?: number } = {},
|
|
99
|
+
): Promise<WorkflowMcpProbeResult> {
|
|
100
|
+
const root = cacheKey(projectRoot);
|
|
101
|
+
const launch = detectWorkflowMcpLaunchConfig(root);
|
|
102
|
+
const serverName = launch?.name ?? "gsd-workflow";
|
|
103
|
+
|
|
104
|
+
const cached = getCachedWorkflowMcpProbe(projectRoot);
|
|
105
|
+
if (cached && workflowMcpProbeAdvertisesSurface(cached.tools)) {
|
|
106
|
+
return { ok: true, tools: cached.tools, serverName: cached.serverName };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const result = await testMcpServerConnection(serverName, {
|
|
110
|
+
projectDir: root,
|
|
111
|
+
timeoutMs: options.timeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS,
|
|
112
|
+
});
|
|
113
|
+
if (result.ok && workflowMcpProbeAdvertisesSurface(result.tools)) {
|
|
114
|
+
recordWorkflowMcpProbe(projectRoot, serverName, result.tools);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
ok: result.ok,
|
|
118
|
+
tools: result.tools,
|
|
119
|
+
serverName,
|
|
120
|
+
error: result.error,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export async function probeAndCacheWorkflowMcp(
|
|
125
|
+
projectRoot: string,
|
|
126
|
+
options: { timeoutMs?: number } = {},
|
|
127
|
+
): Promise<WorkflowMcpProbeResult> {
|
|
128
|
+
const key = cacheKey(projectRoot);
|
|
129
|
+
const inFlight = probeInFlightByProject.get(key);
|
|
130
|
+
if (inFlight) return inFlight;
|
|
131
|
+
|
|
132
|
+
const promise = runProbeAndCacheWorkflowMcp(projectRoot, options).finally(() => {
|
|
133
|
+
probeInFlightByProject.delete(key);
|
|
134
|
+
});
|
|
135
|
+
probeInFlightByProject.set(key, promise);
|
|
136
|
+
return promise;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Fire-and-forget probe so /gsd dispatch often hits a warm cache. */
|
|
140
|
+
export function warmWorkflowMcpProbeInBackground(projectRoot: string): void {
|
|
141
|
+
if (activeWorkflowMcpSdkSessions > 0) return;
|
|
142
|
+
|
|
143
|
+
const key = cacheKey(projectRoot);
|
|
144
|
+
if (getCachedWorkflowMcpProbe(projectRoot)) return;
|
|
145
|
+
if (probeInFlightByProject.has(key)) return;
|
|
146
|
+
|
|
147
|
+
void probeAndCacheWorkflowMcp(projectRoot).catch(() => {
|
|
148
|
+
// Background warm is best-effort.
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* 4. remove() — git worktree remove + branch cleanup
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
22
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
23
23
|
import { execFileSync } from "node:child_process";
|
|
24
24
|
import { join, resolve, sep } from "node:path";
|
|
25
25
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
normalizeWorktreePathForCompare,
|
|
50
50
|
resolveWorktreeProjectRoot,
|
|
51
51
|
} from "./worktree-root.js";
|
|
52
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
52
53
|
import { canonicalWorktreesDir, worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
53
54
|
|
|
54
55
|
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
@@ -197,6 +198,95 @@ function isRegisteredGitWorktreeAtPath(basePath: string, wtPath: string): boolea
|
|
|
197
198
|
}
|
|
198
199
|
}
|
|
199
200
|
|
|
201
|
+
/** True when `wtPath` has a git worktree checkout marker (`.git` file with gitdir pointer). */
|
|
202
|
+
export function isLiveGitWorktreeCheckout(wtPath: string): boolean {
|
|
203
|
+
const gitPath = join(wtPath, ".git");
|
|
204
|
+
if (!existsSync(gitPath)) return false;
|
|
205
|
+
try {
|
|
206
|
+
return lstatSync(gitPath).isFile();
|
|
207
|
+
} catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** True when a worktree directory should count toward idle milestone residue detection. */
|
|
213
|
+
export function isMilestoneWorktreeResidueCandidate(basePath: string, wtPath: string): boolean {
|
|
214
|
+
return isRegisteredGitWorktreeAtPath(basePath, wtPath) || isLiveGitWorktreeCheckout(wtPath);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const EPHEMERAL_GHOST_WORKTREE_ENTRIES = new Set([".bg-shell", ".DS_Store"]);
|
|
218
|
+
|
|
219
|
+
function isEphemeralGhostWorktreeContents(dirPath: string): boolean {
|
|
220
|
+
let entries: string[];
|
|
221
|
+
try {
|
|
222
|
+
entries = readdirSync(dirPath);
|
|
223
|
+
} catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
if (entries.length === 0) return true;
|
|
227
|
+
for (const entry of entries) {
|
|
228
|
+
if (EPHEMERAL_GHOST_WORKTREE_ENTRIES.has(entry)) continue;
|
|
229
|
+
if (entry === ".gsd") {
|
|
230
|
+
try {
|
|
231
|
+
const gsdEntries = readdirSync(join(dirPath, ".gsd"));
|
|
232
|
+
if (gsdEntries.length <= 1 && gsdEntries.every((e) => e === "doctor-history.jsonl")) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
} catch {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Remove milestone worktree directories that are not registered with git and
|
|
247
|
+
* contain only ephemeral runtime content (e.g. bg-shell manifests recreated
|
|
248
|
+
* after teardown). Returns removed directory paths.
|
|
249
|
+
*/
|
|
250
|
+
export function pruneEphemeralGhostWorktreeDirectories(basePath: string): string[] {
|
|
251
|
+
const removed: string[] = [];
|
|
252
|
+
for (const container of allWorktreesDirs(basePath)) {
|
|
253
|
+
if (!existsSync(container)) continue;
|
|
254
|
+
let entries: string[];
|
|
255
|
+
try {
|
|
256
|
+
entries = readdirSync(container);
|
|
257
|
+
} catch {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
for (const entry of entries) {
|
|
261
|
+
if (!MILESTONE_ID_RE.test(entry)) continue;
|
|
262
|
+
const fullPath = join(container, entry);
|
|
263
|
+
try {
|
|
264
|
+
if (!statSync(fullPath).isDirectory()) continue;
|
|
265
|
+
} catch {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (isRegisteredGitWorktreeAtPath(basePath, fullPath)) continue;
|
|
269
|
+
if (isLiveGitWorktreeCheckout(fullPath)) continue;
|
|
270
|
+
if (!isEphemeralGhostWorktreeContents(fullPath)) continue;
|
|
271
|
+
try {
|
|
272
|
+
rmSync(fullPath, { recursive: true, force: true });
|
|
273
|
+
logWarning(
|
|
274
|
+
"reconcile",
|
|
275
|
+
`Removed ephemeral ghost worktree directory (not registered with git): ${fullPath}`,
|
|
276
|
+
{ worktree: entry },
|
|
277
|
+
);
|
|
278
|
+
removed.push(fullPath);
|
|
279
|
+
} catch (err) {
|
|
280
|
+
logWarning(
|
|
281
|
+
"worktree",
|
|
282
|
+
`ghost worktree directory removal failed for ${fullPath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return removed;
|
|
288
|
+
}
|
|
289
|
+
|
|
200
290
|
function removeStaleWorktreeDirectory(wtPath: string, name: string): void {
|
|
201
291
|
logWarning(
|
|
202
292
|
"reconcile",
|
|
@@ -656,7 +746,12 @@ export function removeWorktree(
|
|
|
656
746
|
const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
|
|
657
747
|
|
|
658
748
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
659
|
-
|
|
749
|
+
let cwd: string;
|
|
750
|
+
try {
|
|
751
|
+
cwd = process.cwd();
|
|
752
|
+
} catch {
|
|
753
|
+
cwd = basePath;
|
|
754
|
+
}
|
|
660
755
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
661
756
|
if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
|
|
662
757
|
process.chdir(basePath);
|