@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) 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 +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  16. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  18. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  19. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  20. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  22. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  24. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  25. package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
  26. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  27. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  28. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  29. package/dist/resources/extensions/gsd/auto/session.js +3 -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-direct-dispatch.js +11 -34
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  37. package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
  38. package/dist/resources/extensions/gsd/auto-start.js +26 -8
  39. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  41. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  42. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  43. package/dist/resources/extensions/gsd/auto.js +52 -2
  44. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  47. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  50. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  51. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  53. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  56. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  57. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  58. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  59. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  61. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  62. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  63. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  64. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  65. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  66. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  67. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  68. package/dist/resources/extensions/gsd/files.js +33 -19
  69. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  70. package/dist/resources/extensions/gsd/gsd-db.js +17 -21
  71. package/dist/resources/extensions/gsd/guidance.js +60 -0
  72. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  73. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  74. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  75. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  76. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  77. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  78. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  79. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  80. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  81. package/dist/resources/extensions/gsd/notifications.js +12 -7
  82. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  83. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
  96. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  99. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  100. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  101. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  102. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  103. package/dist/resources/extensions/gsd/state.js +11 -2
  104. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  105. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  106. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  107. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  108. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  110. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  111. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  112. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  113. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  114. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  115. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  116. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  118. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  120. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  121. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  122. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  123. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  124. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  125. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  126. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  127. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  128. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  129. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  130. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  131. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  132. package/dist/resources/extensions/gsd/worktree.js +8 -1
  133. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  134. package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
  135. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  136. package/dist/resources/shared/package-manager-detection.js +1 -1
  137. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  138. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  139. package/dist/runtime-checks.d.ts +10 -0
  140. package/dist/runtime-checks.js +27 -0
  141. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  142. package/dist/update-check.d.ts +2 -0
  143. package/dist/update-check.js +24 -1
  144. package/dist/update-cmd.js +20 -3
  145. package/dist/web/standalone/.next/BUILD_ID +1 -1
  146. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  147. package/dist/web/standalone/.next/build-manifest.json +2 -2
  148. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  149. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  207. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  214. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  215. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  216. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  217. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  218. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  219. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  220. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  221. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  222. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  223. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  224. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  225. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  226. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  227. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  228. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  229. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  230. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  231. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  232. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  233. package/package.json +3 -3
  234. package/packages/cloud-mcp-gateway/package.json +2 -2
  235. package/packages/contracts/package.json +1 -1
  236. package/packages/daemon/package.json +4 -4
  237. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  238. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  239. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  240. package/packages/gsd-agent-core/package.json +5 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  252. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/mcp-server/README.md +12 -3
  262. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  263. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  264. package/packages/mcp-server/dist/cli-runner.js +137 -0
  265. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  266. package/packages/mcp-server/dist/cli.js +2 -53
  267. package/packages/mcp-server/dist/cli.js.map +1 -1
  268. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  272. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/pid-registry.js +459 -0
  275. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  276. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/probe-mode.js +10 -0
  279. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  280. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/server.js +4 -0
  282. package/packages/mcp-server/dist/server.js.map +1 -1
  283. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  288. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  290. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  291. package/packages/mcp-server/package.json +5 -4
  292. package/packages/native/package.json +1 -1
  293. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  294. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/packages/pi-agent-core/package.json +1 -1
  296. package/packages/pi-ai/README.md +1 -0
  297. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  298. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  299. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  300. package/packages/pi-ai/dist/index.d.ts +2 -0
  301. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/index.js +2 -0
  303. package/packages/pi-ai/dist/index.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  305. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.js +468 -269
  307. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  310. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  311. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  312. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  314. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  315. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  317. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  318. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  319. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  320. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  321. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  324. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  325. package/packages/pi-ai/package.json +3 -2
  326. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  332. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  333. package/packages/pi-coding-agent/package.json +7 -7
  334. package/packages/pi-tui/README.md +15 -0
  335. package/packages/pi-tui/dist/index.d.ts +2 -2
  336. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  337. package/packages/pi-tui/dist/index.js +2 -2
  338. package/packages/pi-tui/dist/index.js.map +1 -1
  339. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  340. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  341. package/packages/pi-tui/dist/terminal-image.js +54 -2
  342. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  343. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +70 -25
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/dist/tui.d.ts +15 -0
  348. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/tui.js +106 -21
  350. package/packages/pi-tui/dist/tui.js.map +1 -1
  351. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/utils.js +110 -36
  353. package/packages/pi-tui/dist/utils.js.map +1 -1
  354. package/packages/pi-tui/package.json +2 -2
  355. package/packages/rpc-client/package.json +2 -2
  356. package/pkg/dist/theme/theme.d.ts.map +1 -1
  357. package/pkg/dist/theme/theme.js +45 -17
  358. package/pkg/dist/theme/theme.js.map +1 -1
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/ask-user-questions.ts +7 -2
  362. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
  363. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  364. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  365. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  366. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  367. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  368. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  369. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  370. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  371. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  372. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  373. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  374. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  375. package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
  376. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  377. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  378. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  379. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  380. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  381. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  382. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  383. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
  385. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
  386. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  387. package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
  388. package/src/resources/extensions/gsd/auto-start.ts +27 -11
  389. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  390. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  391. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  392. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  393. package/src/resources/extensions/gsd/auto.ts +64 -2
  394. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  395. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  396. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  397. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  398. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
  399. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  400. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  401. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  402. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  403. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  404. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  405. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  406. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  407. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  408. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  409. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  410. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  411. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  412. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  413. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  414. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  415. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  416. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  417. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  418. package/src/resources/extensions/gsd/files.ts +33 -12
  419. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  420. package/src/resources/extensions/gsd/gsd-db.ts +19 -22
  421. package/src/resources/extensions/gsd/guidance.ts +78 -0
  422. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  423. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  424. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  425. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  426. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  427. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  428. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  429. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  430. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  431. package/src/resources/extensions/gsd/notifications.ts +13 -6
  432. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  433. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  435. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  436. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  437. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  442. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  443. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  448. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  449. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  450. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  451. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  452. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  453. package/src/resources/extensions/gsd/state.ts +12 -1
  454. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  457. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
  458. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
  459. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  461. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  462. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  463. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  464. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  465. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  468. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  469. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  470. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  471. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  472. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  473. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  474. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  475. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  476. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  477. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  478. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  479. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  480. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  481. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  483. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  484. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  485. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  486. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  487. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  488. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  489. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  490. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  491. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  492. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  493. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  495. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  498. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  499. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  500. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  501. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  503. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  504. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  505. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  506. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  507. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  508. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  509. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  511. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  512. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  513. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  514. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  515. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  516. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  517. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  518. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  519. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  520. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  521. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  524. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  526. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  527. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  528. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  529. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  530. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  531. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  532. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  533. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  534. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  535. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  536. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  537. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  538. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  539. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  540. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  541. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  542. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  543. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  544. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  545. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  546. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  547. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  548. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  549. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  550. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  551. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  552. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  553. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  554. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  555. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  556. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  557. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  558. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  559. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  560. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  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/workflow-reconcile.ts +29 -62
  564. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  565. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  566. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  567. package/src/resources/extensions/gsd/worktree.ts +7 -1
  568. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  569. package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
  570. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  571. package/src/resources/shared/package-manager-detection.ts +1 -1
  572. package/src/resources/skills/create-skill/SKILL.md +3 -0
  573. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  574. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  575. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  576. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  577. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  578. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  579. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
@@ -671,33 +671,54 @@ export function parseTaskPlanIO(content: string): { inputFiles: string[]; output
671
671
  */
672
672
  export type UatType = 'artifact-driven' | 'live-runtime' | 'human-experience' | 'mixed' | 'browser-executable' | 'runtime-executable';
673
673
 
674
+ /** Canonical list of recognised UAT types — uat-policy.ts re-exports this as UAT_TYPES. */
675
+ export const UAT_TYPE_KEYWORDS: readonly UatType[] = [
676
+ 'artifact-driven',
677
+ 'browser-executable',
678
+ 'runtime-executable',
679
+ 'live-runtime',
680
+ 'mixed',
681
+ 'human-experience',
682
+ ];
683
+
684
+ /** Match a value against the recognised UAT type keywords (leading-keyword-only). */
685
+ function matchUatTypeKeyword(value: string): UatType | undefined {
686
+ const normalized = value.trim().toLowerCase();
687
+ return UAT_TYPE_KEYWORDS.find(keyword => normalized.startsWith(keyword));
688
+ }
689
+
674
690
  /**
675
691
  * Extract the UAT type from a UAT file's raw content.
676
692
  *
677
693
  * UAT files have no YAML frontmatter - pass raw file content directly.
678
694
  * Classification is leading-keyword-only: e.g. `mixed (artifact-driven + live-runtime)` → `'mixed'`.
679
695
  *
696
+ * The canonical form is a `- UAT mode: <type>` bullet under `## UAT Type`
697
+ * (case-insensitive prefix, `**bold**` tolerated). When no such line exists,
698
+ * a line that itself starts with a recognised keyword — e.g. a bare
699
+ * `browser-executable` under the heading — is accepted, so agent-authored
700
+ * format drift does not silently fall back to artifact-driven.
701
+ *
680
702
  * Returns `undefined` when:
681
703
  * - the `## UAT Type` section is absent
682
- * - no `UAT mode:` bullet is found in the section
683
- * - the value does not start with a recognised keyword
704
+ * - a `UAT mode:` line exists but its value starts with no recognised keyword
705
+ * - no line in the section starts with `UAT mode:` or a recognised keyword
684
706
  */
685
707
  export function extractUatType(content: string): UatType | undefined {
686
708
  const sectionText = extractSection(content, 'UAT Type');
687
709
  if (!sectionText) return undefined;
688
710
 
689
- const bullets = parseBullets(sectionText);
690
- const modeBullet = bullets.find(b => b.startsWith('UAT mode:'));
691
- if (!modeBullet) return undefined;
711
+ const lines = parseBullets(sectionText).map(line => line.replace(/\*\*/g, ''));
692
712
 
693
- const rawValue = modeBullet.slice('UAT mode:'.length).trim().toLowerCase();
713
+ for (const line of lines) {
714
+ const declared = /^uat mode:\s*(.*)$/i.exec(line);
715
+ if (declared) return matchUatTypeKeyword(declared[1]);
716
+ }
694
717
 
695
- if (rawValue.startsWith('artifact-driven')) return 'artifact-driven';
696
- if (rawValue.startsWith('browser-executable')) return 'browser-executable';
697
- if (rawValue.startsWith('runtime-executable')) return 'runtime-executable';
698
- if (rawValue.startsWith('live-runtime')) return 'live-runtime';
699
- if (rawValue.startsWith('human-experience')) return 'human-experience';
700
- if (rawValue.startsWith('mixed')) return 'mixed';
718
+ for (const line of lines) {
719
+ const matched = matchUatTypeKeyword(line);
720
+ if (matched) return matched;
721
+ }
701
722
 
702
723
  return undefined;
703
724
  }
@@ -66,7 +66,7 @@ function disabled(description: string, reason: string): string {
66
66
 
67
67
  export function buildGsdHomeModel(
68
68
  state: GSDState,
69
- closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones">,
69
+ closeout?: Pick<CloseoutContext, "strandedQuick" | "unmergedMilestones" | "idleResidueHint">,
70
70
  ): GsdHomeModel {
71
71
  const blocked = isBlocked(state);
72
72
  const complete = state.phase === "complete";
@@ -74,10 +74,14 @@ export function buildGsdHomeModel(
74
74
  const workLabel = activeWorkLabel(state);
75
75
  const strandedQuick = closeout?.strandedQuick ?? null;
76
76
  const unmergedMilestone = closeout?.unmergedMilestones?.[0];
77
+ const idleResidueHint = closeout?.idleResidueHint ?? null;
78
+ const hasIdleResidue = Boolean(idleResidueHint);
77
79
  const nextReason = complete
78
80
  ? "all milestones are complete"
79
81
  : blocked
80
82
  ? "the active milestone is blocked"
83
+ : hasIdleResidue
84
+ ? "milestone git residue needs recovery"
81
85
  : !hasActiveWork
82
86
  ? "there is no active milestone"
83
87
  : "";
@@ -91,6 +95,8 @@ export function buildGsdHomeModel(
91
95
  ? "finish_milestone"
92
96
  : blocked
93
97
  ? "fix_recover"
98
+ : hasIdleResidue
99
+ ? "fix_recover"
94
100
  : canAdvance
95
101
  ? "continue_step"
96
102
  : complete && unmappedActive > 0
@@ -107,6 +113,8 @@ export function buildGsdHomeModel(
107
113
  ? [`Quick task Q${strandedQuick.taskNum} finished on ${strandedQuick.quickBranch} but is not merged to ${strandedQuick.originalBranch}.`]
108
114
  : unmergedMilestone
109
115
  ? [`${unmergedMilestone.milestoneId} is complete but not merged into ${unmergedMilestone.integrationBranch}.`]
116
+ : idleResidueHint
117
+ ? [idleResidueHint.message]
110
118
  : completionSummary;
111
119
 
112
120
  return {
@@ -181,10 +189,12 @@ export function buildGsdHomeModel(
181
189
  label: "Fix or recover",
182
190
  description: blocked
183
191
  ? "Review the blocker and recovery commands for the active milestone."
192
+ : hasIdleResidue
193
+ ? "Review stranded milestone worktrees/branches and run the suggested recovery command."
184
194
  : disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
185
- enabled: blocked,
195
+ enabled: blocked || hasIdleResidue,
186
196
  recommended: recommended === "fix_recover",
187
- disabledReason: blocked ? undefined : "no blocker is active",
197
+ disabledReason: blocked || hasIdleResidue ? undefined : "no blocker is active",
188
198
  },
189
199
  {
190
200
  id: "start_configure",
@@ -3,13 +3,15 @@
3
3
  //
4
4
  // ─── Single-writer invariant ─────────────────────────────────────────────
5
5
  // Every write-SQL statement against `.gsd/gsd.db` lives behind a typed
6
- // wrapper in the single-writer layer (this file plus db/writers/*). Connection
7
- // ownership, lifecycle, schema/migrations and transaction primitives live in
8
- // db/engine.ts and are re-exported here for backward compatibility, so callers
9
- // keep importing from "./gsd-db.js".
6
+ // wrapper in the explicit writer allowlist: this compatibility barrel,
7
+ // db/writers/*, typed coordination/runtime writers, schema/migration helpers,
8
+ // and ADR backfill helpers. Connection ownership, lifecycle, schema/migrations,
9
+ // and transaction primitives live in db/engine.ts and are re-exported here for
10
+ // backward compatibility, so callers keep importing from "./gsd-db.js".
10
11
  //
11
12
  // `_getAdapter()` (re-exported from the engine) is retained for read-only
12
- // SELECTs in query modules. Do NOT use it for writes — add a wrapper here.
13
+ // SELECTs in query modules. Do NOT use it for writes — add or call a typed
14
+ // wrapper in the explicit writer layer.
13
15
  //
14
16
  // The separate `.gsd/unit-claims.db` (unit-ownership.ts) is an intentionally
15
17
  // independent store and is excluded from this invariant.
@@ -46,11 +48,11 @@ import { rowToSlice, rowToTask, type SliceRow, type TaskRow } from "./db-task-sl
46
48
  // primitives now live in the engine; re-export the full public surface so
47
49
  // existing `from "./gsd-db.js"` imports keep working.
48
50
  export * from "./db/engine.js";
49
- import { transaction, getDb, getDbOrNull } from "./db/engine.js";
51
+ import { immediateTransaction, transaction, getDb, getDbOrNull } from "./db/engine.js";
50
52
 
51
53
  // ─── Single Writer Layer re-exports ──────────────────────────────────────
52
- // Write subsystems live in db/writers/*; re-exported here so callers keep
53
- // importing from "./gsd-db.js".
54
+ // Domain write subsystems live in db/writers/*; re-exported here so callers
55
+ // keep importing from "./gsd-db.js".
54
56
  export * from "./db/writers/memory.js";
55
57
  export * from "./db/writers/reconcile.js";
56
58
  export * from "./db/writers/import-restore.js";
@@ -246,9 +248,9 @@ export function insertMilestone(m: {
246
248
  status?: string;
247
249
  depends_on?: string[];
248
250
  planning?: Partial<MilestonePlanningRecord>;
249
- }): void {
251
+ }): boolean {
250
252
  if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
251
- getDbOrNull()!.prepare(
253
+ const result = getDbOrNull()!.prepare(
252
254
  `INSERT OR IGNORE INTO milestones (
253
255
  id, title, status, depends_on, created_at,
254
256
  vision, success_criteria, key_risks, proof_strategy,
@@ -279,7 +281,8 @@ export function insertMilestone(m: {
279
281
  ":definition_of_done": JSON.stringify(m.planning?.definitionOfDone ?? []),
280
282
  ":requirement_coverage": m.planning?.requirementCoverage ?? "",
281
283
  ":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
282
- });
284
+ }) as { changes?: number };
285
+ return (result.changes ?? 0) > 0;
283
286
  }
284
287
 
285
288
  export function upsertMilestonePlanning(milestoneId: string, planning: Partial<MilestonePlanningRecord> & { title?: string; status?: string; depends_on?: string[] }): void {
@@ -706,19 +709,14 @@ export function insertVerificationEvidence(e: {
706
709
 
707
710
 
708
711
  export function setMilestoneQueueOrder(order: string[]): void {
709
- if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
710
- getDbOrNull()!.exec("BEGIN IMMEDIATE");
711
- try {
712
- getDbOrNull()!.prepare("UPDATE milestones SET sequence = 0").run();
713
- const stmt = getDbOrNull()!.prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
712
+ const db = getDb();
713
+ immediateTransaction(() => {
714
+ db.prepare("UPDATE milestones SET sequence = 0").run();
715
+ const stmt = db.prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
714
716
  order.forEach((id, index) => {
715
717
  stmt.run({ ":id": id, ":sequence": index + 1 });
716
718
  });
717
- getDbOrNull()!.exec("COMMIT");
718
- } catch (err) {
719
- getDbOrNull()!.exec("ROLLBACK");
720
- throw err;
721
- }
719
+ });
722
720
  }
723
721
 
724
722
  function getMilestoneStatusForUpdate(milestoneId: string): string | null {
@@ -1441,4 +1439,3 @@ export function upsertQualityGate(g: {
1441
1439
  ":evaluated_at": g.evaluatedAt,
1442
1440
  });
1443
1441
  }
1444
-
@@ -88,6 +88,84 @@ export function needsRemediationBlockerGuidance(milestoneId: string): string {
88
88
  ].join("\n");
89
89
  }
90
90
 
91
+ // ─── Milestone closeout UAT sign-off blockers ───────────────────────────
92
+ // The first sentence is the blocker finding; the numbered steps are the
93
+ // resolution path. `verdict` is the recorded non-PASS verdict, or undefined
94
+ // when no verdict has been recorded at all.
95
+
96
+ export function uatSignoffBlockerGuidance(
97
+ milestoneId: string,
98
+ sliceId: string,
99
+ verdict?: string,
100
+ ): string {
101
+ const finding =
102
+ verdict === undefined
103
+ ? `missing UAT PASS verdict for ${sliceId}`
104
+ : `UAT verdict for ${sliceId} is "${verdict}"`;
105
+ const sliceSpecificRerunStep =
106
+ `If ${sliceId} is not the most recently completed slice, type a chat request to re-run UAT for ${sliceId}; run-uat will record the verdict through \`gsd_uat_result_save\`.`;
107
+ const steps =
108
+ verdict === undefined
109
+ ? [
110
+ `1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
111
+ `2. ${sliceSpecificRerunStep}`,
112
+ `3. Review the UAT criteria and progress: \`/gsd status\``,
113
+ `4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
114
+ ]
115
+ : [
116
+ `1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
117
+ `2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
118
+ `3. ${sliceSpecificRerunStep}`,
119
+ `4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
120
+ `5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
121
+ ];
122
+ return [
123
+ `Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
124
+ `Fix options:`,
125
+ ...steps,
126
+ ].join("\n");
127
+ }
128
+
129
+ // ─── Worktree isolation degradation ─────────────────────────────────────
130
+ // The first sentence of each notice is load-bearing for log matching and
131
+ // tests — keep it intact and append guidance after it.
132
+
133
+ function restoreIsolationHint(milestoneId: string): string {
134
+ return `To restore isolation: close any processes using the old worktree, merge salvageable work with \`/gsd worktree merge ${milestoneId}\` or remove the stale worktree with \`/gsd worktree remove ${milestoneId}\`, then run \`/gsd doctor fix\`.`;
135
+ }
136
+
137
+ export function worktreeCreationFailedGuidance(milestoneId: string, error: string): string {
138
+ return [
139
+ `Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
140
+ `Worktree isolation is degraded for this session.`,
141
+ restoreIsolationHint(milestoneId),
142
+ ].join("\n");
143
+ }
144
+
145
+ export function isolationDegradedFallbackGuidance(milestoneId: string): string {
146
+ return [
147
+ `Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
148
+ `Work continues safely on the milestone branch in the project root.`,
149
+ restoreIsolationHint(milestoneId),
150
+ ].join("\n");
151
+ }
152
+
153
+ /** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
154
+ export function milestoneEntryBlockedGuidance(
155
+ milestoneId: string,
156
+ reason: "creation-failed" | "isolation-degraded",
157
+ ): string {
158
+ const finding =
159
+ reason === "creation-failed"
160
+ ? `worktree/branch creation failed. Isolation is degraded.`
161
+ : `isolation is degraded from a prior worktree failure.`;
162
+ return [
163
+ `Cannot enter milestone ${milestoneId}: ${finding}`,
164
+ restoreIsolationHint(milestoneId),
165
+ `Then run \`/gsd auto\` to retry.`,
166
+ ].join("\n");
167
+ }
168
+
91
169
  // ─── Crash recovery resume hints ────────────────────────────────────────
92
170
 
93
171
  /** Resume hint for an interrupted auto-mode unit, by unit class. */
@@ -76,13 +76,25 @@ import {
76
76
  countUnmappedActiveRequirements,
77
77
  showRequirementsBacklogReview,
78
78
  } from "./requirements-backlog.js";
79
- import { selectAndApplyModel } from "./auto-model-selection.js";
79
+ import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
80
80
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
81
81
  import {
82
- getWorkflowTransportSupportError,
83
- getRequiredWorkflowToolsForGuidedUnit,
82
+ detectWorkflowMcpLaunchConfig,
83
+ resolveWorkflowMcpProjectRoot,
84
84
  supportsStructuredQuestions,
85
85
  } from "./workflow-mcp.js";
86
+ import { usesWorkflowMcpTransport } from "./question-transport.js";
87
+ import {
88
+ getCachedWorkflowMcpProbe,
89
+ probeAndCacheWorkflowMcp,
90
+ warmWorkflowMcpProbeInBackground,
91
+ workflowMcpProbeAdvertisesSurface,
92
+ WORKFLOW_MCP_PROBE_TIMEOUT_MS,
93
+ } from "./workflow-mcp-readiness-cache.js";
94
+ import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
95
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
96
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
97
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
86
98
  import {
87
99
  runPreparation,
88
100
  formatCodebaseBrief,
@@ -555,7 +567,7 @@ interface DispatchWorkflowOptions {
555
567
  deps?: {
556
568
  loadPreferences?: typeof loadEffectiveGSDPreferences;
557
569
  selectModel?: typeof selectAndApplyModel;
558
- getTransportSupportError?: typeof getWorkflowTransportSupportError;
570
+ getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessError;
559
571
  };
560
572
  }
561
573
 
@@ -563,6 +575,93 @@ export function resolveGuidedDispatchProjectRoot(basePath?: string): string {
563
575
  return basePath ?? process.cwd();
564
576
  }
565
577
 
578
+ /**
579
+ * Wait until the workflow MCP server is reachable and advertising its tool
580
+ * surface. Returns failure details when timed out, or null when ready (or MCP
581
+ * is not the transport). Called inside dispatchWorkflow() so every guided-flow
582
+ * dispatch path is gated automatically.
583
+ */
584
+ const MCP_READINESS_TIMEOUT_MS = 15_000;
585
+ const MCP_READINESS_POLL_MS = 200;
586
+
587
+ export interface WorkflowMcpReadinessFailure {
588
+ server: string;
589
+ error?: string;
590
+ }
591
+
592
+ async function awaitWorkflowMcpReadiness(
593
+ pi: ExtensionAPI,
594
+ ctx: ExtensionContext,
595
+ basePath: string,
596
+ options: {
597
+ unitType?: string;
598
+ timeoutMs?: number;
599
+ pollMs?: number;
600
+ probeTimeoutMs?: number;
601
+ probe?: typeof probeAndCacheWorkflowMcp;
602
+ } = {},
603
+ ): Promise<WorkflowMcpReadinessFailure | null> {
604
+ const provider = ctx.model?.provider;
605
+ const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
606
+ if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl)) return null;
607
+
608
+ const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
609
+ const launch = detectWorkflowMcpLaunchConfig(projectRoot);
610
+ if (!launch) return null;
611
+
612
+ const requiredTools = options.unitType
613
+ ? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
614
+ : [];
615
+ const coversExpectedSurface = (tools: readonly string[]) =>
616
+ requiredTools.length > 0
617
+ ? probeCoversRequiredWorkflowTools(tools, requiredTools)
618
+ : workflowMcpProbeAdvertisesSurface(tools);
619
+
620
+ const serverPrefix = `mcp__${launch.name}__`;
621
+ const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
622
+ const systemPromptCoversExpectedSurface = () => {
623
+ const prompt = systemPrompt();
624
+ return requiredTools.length > 0
625
+ ? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
626
+ : prompt.includes(serverPrefix);
627
+ };
628
+ const sessionAlreadyReady = () =>
629
+ coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
630
+ systemPromptCoversExpectedSurface();
631
+ if (sessionAlreadyReady()) return null;
632
+
633
+ if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
634
+ return null;
635
+ }
636
+
637
+ const probe = options.probe ?? probeAndCacheWorkflowMcp;
638
+ const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
639
+
640
+ ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
641
+ let lastError: string | undefined;
642
+ const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
643
+ const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
644
+ while (Date.now() < deadline) {
645
+ if (sessionAlreadyReady()) {
646
+ ctx.ui.setStatus("gsd-step", "");
647
+ return null;
648
+ }
649
+
650
+ const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
651
+ if (result.ok && coversExpectedSurface(result.tools)) {
652
+ ctx.ui.setStatus("gsd-step", "");
653
+ return null;
654
+ }
655
+ lastError = result.error;
656
+
657
+ await new Promise((r) => setTimeout(r, pollMs));
658
+ }
659
+ ctx.ui.setStatus("gsd-step", "");
660
+ return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
661
+ }
662
+
663
+ export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
664
+
566
665
  /**
567
666
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
568
667
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -584,7 +683,8 @@ async function dispatchWorkflow(
584
683
  const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
585
684
  const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
586
685
  const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
587
- const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
686
+ const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
687
+ ?? getUnitWorkflowDispatchReadinessError;
588
688
 
589
689
  // Route through the dynamic routing pipeline (complexity classification,
590
690
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
@@ -603,29 +703,49 @@ async function dispatchWorkflow(
603
703
  });
604
704
  }
605
705
 
606
- const compatibilityError = getTransportSupportError(
607
- result.appliedModel?.provider ?? ctx.model?.provider,
608
- getRequiredWorkflowToolsForGuidedUnit(unitType),
609
- {
610
- projectRoot,
611
- surface: "guided flow",
612
- unitType,
613
- authMode: result.appliedModel?.provider
614
- ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
615
- : ctx.model?.provider
616
- ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
617
- : undefined,
618
- baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
619
- // Guided flow starts the MCP workflow server as part of dispatch, so the
620
- // parent session's activeTools doesn't include MCP tools yet. The MCP
621
- // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
622
- // here — not whether MCP tools are pre-registered in the parent session.
623
- },
624
- );
706
+ const compatibilityError = getDispatchReadinessError({
707
+ provider: result.appliedModel?.provider ?? ctx.model?.provider,
708
+ projectRoot,
709
+ surface: "guided flow",
710
+ unitType,
711
+ authMode: result.appliedModel?.provider
712
+ ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
713
+ : ctx.model?.provider
714
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
715
+ : undefined,
716
+ baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
717
+ // Guided flow starts the MCP workflow server as part of dispatch, so the
718
+ // parent session's activeTools doesn't include MCP tools yet. The MCP
719
+ // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
720
+ // here not whether MCP tools are pre-registered in the parent session.
721
+ });
625
722
  if (compatibilityError) {
626
723
  ctx.ui.notify(compatibilityError, "error");
627
724
  return;
628
725
  }
726
+
727
+ // ── Live MCP readiness gate ────────────────────────────────────────
728
+ // Units with required workflow tools must not dispatch until the MCP
729
+ // surface covers that exact contract; otherwise the model can race into
730
+ // "No such tool available" before recovery sees a clean readiness error.
731
+ warmWorkflowMcpProbeInBackground(projectRoot);
732
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
733
+ const strictBlocking = requiredWorkflowTools.length > 0
734
+ && (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
735
+ if (strictBlocking) {
736
+ // If the workflow MCP server is configured but still connecting, wait
737
+ // for it instead of dispatching into a child session that will abort.
738
+ const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
739
+ if (readinessFailure) {
740
+ const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
741
+ ctx.ui.notify(
742
+ `GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
743
+ `Run \`/gsd mcp check ${readinessFailure.server}\` for details.`,
744
+ "warning",
745
+ );
746
+ return;
747
+ }
748
+ }
629
749
  }
630
750
 
631
751
  // Scope tools for guided workflow turns (#2949, token-consumption savings).
@@ -1708,6 +1828,7 @@ export async function showSmartEntry(
1708
1828
  options?: { step?: boolean },
1709
1829
  ): Promise<void> {
1710
1830
  const stepMode = options?.step ?? true;
1831
+ warmWorkflowMcpProbeInBackground(basePath);
1711
1832
 
1712
1833
  // ── Clear stale milestone ID reservations from previous cancelled sessions ──
1713
1834
  // Reservations only need to survive within a single /gsd interaction.