@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.
Files changed (579) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +14 -19
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /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 { projectRootFromWorktreePath } from "../worktree-root.js";
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 indent = Math.max(0, options.indent ?? 2);
111
- const rule = (text: string) => theme.fg(ruleColor, text);
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
- // Header rule: "── <title> ───────"
114
- const lead = "── ";
115
- const headerUsed = visibleWidth(lead) + visibleWidth(title) + 1;
116
- const headerFill = Math.max(0, width - headerUsed);
117
- const header = safeLine(rule(lead) + title + " " + rule("─".repeat(headerFill)), width, "");
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
- // Body lines, indented so no chrome sits on copyable text.
120
- const pad = " ".repeat(indent);
121
- const contentWidth = Math.max(0, width - indent);
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
- return [header, "", ...body, rule("─".repeat(width))];
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: ["gsd_task_complete", "gsd_decision_save"],
258
- requiredWorkflowTools: ["gsd_task_complete"],
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: ["gsd_task_complete", "gsd_decision_save"],
267
- requiredWorkflowTools: ["gsd_task_complete"],
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
- const cwd = process.cwd();
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);