@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) 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-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
  33. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  34. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  35. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  36. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  37. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  38. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  40. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  41. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  42. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  43. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  44. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  45. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  46. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  47. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  48. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  49. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  50. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  51. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  52. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  53. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  54. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  55. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  56. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  57. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  58. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  59. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  60. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  61. package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
  62. package/dist/resources/extensions/gsd/auto.js +56 -15
  63. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  64. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  65. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  66. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  69. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  70. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  71. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  72. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  73. package/dist/resources/extensions/gsd/captures.js +4 -6
  74. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  75. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  76. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  77. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  78. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  79. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  80. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  81. package/dist/resources/extensions/gsd/constants.js +0 -2
  82. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  83. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  84. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  85. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  86. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  87. package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
  88. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  89. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  90. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  91. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  92. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  93. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  94. package/dist/resources/extensions/gsd/files.js +33 -19
  95. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  96. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  97. package/dist/resources/extensions/gsd/guidance.js +158 -0
  98. package/dist/resources/extensions/gsd/guided-flow.js +110 -6
  99. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  100. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  101. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  102. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  103. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  104. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  105. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  106. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  107. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  108. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  109. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  110. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  111. package/dist/resources/extensions/gsd/notifications.js +12 -7
  112. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  113. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  114. package/dist/resources/extensions/gsd/paths.js +27 -0
  115. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  117. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  118. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  119. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  120. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  122. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  125. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  126. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  128. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  129. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  130. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  131. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  132. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  133. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  134. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  135. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  136. package/dist/resources/extensions/gsd/publication.js +87 -0
  137. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  138. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  139. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  140. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  141. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  142. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  143. package/dist/resources/extensions/gsd/state.js +12 -22
  144. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  145. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  148. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  150. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  151. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  153. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  158. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  159. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  160. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  173. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  174. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  175. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  176. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  177. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  178. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  179. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  180. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  187. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  188. package/dist/resources/shared/package-manager-detection.js +1 -1
  189. package/dist/resources/shared/package.json +3 -0
  190. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  191. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  192. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  193. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  195. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  196. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  197. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  198. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  199. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  200. package/dist/runtime-checks.d.ts +10 -0
  201. package/dist/runtime-checks.js +27 -0
  202. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  203. package/dist/update-check.d.ts +2 -0
  204. package/dist/update-check.js +24 -1
  205. package/dist/update-cmd.js +20 -3
  206. package/dist/web/standalone/.next/BUILD_ID +1 -1
  207. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  208. package/dist/web/standalone/.next/build-manifest.json +3 -3
  209. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  210. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  225. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  226. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  227. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/index.html +1 -1
  230. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  237. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  238. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  239. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  245. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  246. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  247. package/dist/web/standalone/package.json +1 -1
  248. package/dist/worktree-cli.js +3 -6
  249. package/dist/worktree-status-banner.js +7 -15
  250. package/package.json +3 -3
  251. package/packages/cloud-mcp-gateway/package.json +2 -2
  252. package/packages/contracts/dist/rpc.d.ts +1 -0
  253. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  254. package/packages/contracts/dist/rpc.js.map +1 -1
  255. package/packages/contracts/dist/workflow.d.ts +4 -0
  256. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  257. package/packages/contracts/dist/workflow.js.map +1 -1
  258. package/packages/contracts/package.json +1 -1
  259. package/packages/daemon/package.json +4 -4
  260. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  261. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  262. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  263. package/packages/gsd-agent-core/package.json +5 -5
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  271. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  275. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  280. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  291. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  297. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  298. package/packages/gsd-agent-modes/package.json +7 -7
  299. package/packages/mcp-server/README.md +12 -3
  300. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  301. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/cli-runner.js +137 -0
  303. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  304. package/packages/mcp-server/dist/cli.js +2 -50
  305. package/packages/mcp-server/dist/cli.js.map +1 -1
  306. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  310. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  311. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  312. package/packages/mcp-server/dist/pid-registry.js +452 -0
  313. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  314. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  315. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  316. package/packages/mcp-server/dist/probe-mode.js +10 -0
  317. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  318. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  319. package/packages/mcp-server/dist/server.js +4 -0
  320. package/packages/mcp-server/dist/server.js.map +1 -1
  321. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  322. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  323. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  324. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  325. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  326. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  327. package/packages/mcp-server/dist/workflow-tools.js +178 -82
  328. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  329. package/packages/mcp-server/package.json +5 -4
  330. package/packages/native/package.json +1 -1
  331. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  332. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  333. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  334. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  335. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  336. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  337. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  338. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  339. package/packages/pi-agent-core/dist/index.js +3 -0
  340. package/packages/pi-agent-core/dist/index.js.map +1 -1
  341. package/packages/pi-agent-core/package.json +1 -1
  342. package/packages/pi-ai/README.md +1 -0
  343. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  344. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  345. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  346. package/packages/pi-ai/dist/index.d.ts +2 -0
  347. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/index.js +2 -0
  349. package/packages/pi-ai/dist/index.js.map +1 -1
  350. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  351. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/models.generated.js +46 -120
  353. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  356. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  357. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  358. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  360. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  361. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  362. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  363. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  364. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  365. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  366. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  367. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  368. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  369. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  370. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  371. package/packages/pi-ai/package.json +3 -2
  372. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  373. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  375. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  378. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  380. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  382. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  384. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  386. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  388. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/index.js +1 -1
  390. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  393. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  395. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  397. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  398. package/packages/pi-coding-agent/package.json +7 -7
  399. package/packages/pi-tui/dist/index.d.ts +1 -1
  400. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  401. package/packages/pi-tui/dist/index.js +1 -1
  402. package/packages/pi-tui/dist/index.js.map +1 -1
  403. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  404. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  405. package/packages/pi-tui/dist/terminal-image.js +54 -2
  406. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  407. package/packages/pi-tui/dist/tui.d.ts +8 -0
  408. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  409. package/packages/pi-tui/dist/tui.js +72 -18
  410. package/packages/pi-tui/dist/tui.js.map +1 -1
  411. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  412. package/packages/pi-tui/dist/utils.js +110 -36
  413. package/packages/pi-tui/dist/utils.js.map +1 -1
  414. package/packages/pi-tui/package.json +2 -2
  415. package/packages/rpc-client/package.json +2 -2
  416. package/pkg/dist/theme/theme.d.ts.map +1 -1
  417. package/pkg/dist/theme/theme.js +45 -17
  418. package/pkg/dist/theme/theme.js.map +1 -1
  419. package/pkg/package.json +1 -1
  420. package/src/resources/GSD-WORKFLOW.md +5 -4
  421. package/src/resources/extensions/ask-user-questions.ts +7 -2
  422. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  423. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  424. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  425. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  426. package/src/resources/extensions/async-jobs/index.ts +79 -0
  427. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  428. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  429. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  430. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  431. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  432. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  433. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  434. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  435. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  436. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  437. package/src/resources/extensions/browser-tools/index.ts +71 -13
  438. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  439. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  440. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  441. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
  442. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  443. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  444. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  445. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  446. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  447. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  448. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  449. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  450. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  451. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  452. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  453. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  454. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  455. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  456. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  457. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  458. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  459. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  460. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  461. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  462. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  463. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  464. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  465. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  466. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  467. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  468. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  469. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  470. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  471. package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
  472. package/src/resources/extensions/gsd/auto.ts +72 -17
  473. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  474. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  475. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  476. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  477. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  478. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  479. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  480. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  481. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  482. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  483. package/src/resources/extensions/gsd/captures.ts +4 -6
  484. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  485. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  486. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  487. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  489. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  490. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  491. package/src/resources/extensions/gsd/constants.ts +0 -3
  492. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  493. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  494. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  495. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  496. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  497. package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
  498. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  499. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  500. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  501. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  502. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  503. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  504. package/src/resources/extensions/gsd/files.ts +33 -12
  505. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  507. package/src/resources/extensions/gsd/guidance.ts +217 -0
  508. package/src/resources/extensions/gsd/guided-flow.ts +161 -26
  509. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  511. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  512. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  513. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  514. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  515. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  516. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  517. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  518. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  519. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  520. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  521. package/src/resources/extensions/gsd/notifications.ts +13 -6
  522. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  523. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  524. package/src/resources/extensions/gsd/paths.ts +33 -0
  525. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  526. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  527. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  528. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  529. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  530. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  531. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  532. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  533. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  534. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  535. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  536. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  539. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  540. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  541. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  542. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  543. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  544. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  545. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  546. package/src/resources/extensions/gsd/publication.ts +122 -0
  547. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  548. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  549. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  550. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  551. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  552. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  553. package/src/resources/extensions/gsd/state.ts +16 -22
  554. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  555. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  556. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  557. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  558. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  559. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  560. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  561. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  562. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  563. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  564. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  565. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  566. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  567. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  568. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  569. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  570. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  571. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  572. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  573. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  574. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  575. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  576. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  577. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  578. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  579. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  580. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  581. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  582. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  583. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  585. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  586. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  587. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  588. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  589. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  591. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  592. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  593. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  594. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  595. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  596. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  597. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  598. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
  599. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  600. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  601. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  602. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  603. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  605. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  606. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  607. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  610. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  611. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  612. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  613. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  614. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  615. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  616. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  617. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  618. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  619. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  620. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  621. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  622. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  624. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  625. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  626. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  627. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  628. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  629. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  630. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  632. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  633. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  634. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  635. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  636. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  637. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  640. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  641. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  642. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  643. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  644. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  645. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  646. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  647. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  648. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  649. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  650. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  651. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  652. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  653. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  654. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  656. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  657. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  658. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  659. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  660. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  661. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  662. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  663. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  665. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  666. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  667. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  668. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  669. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  670. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  671. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  674. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  675. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  676. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  677. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  678. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  679. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  680. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  681. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  682. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  683. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  684. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  685. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  686. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  687. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  688. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  689. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  690. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  691. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  692. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  693. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  694. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  695. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  696. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  697. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  698. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  699. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  700. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  701. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  702. package/src/resources/extensions/gsd/worktree.ts +7 -1
  703. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  704. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  705. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  706. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  707. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  708. package/src/resources/shared/package-manager-detection.ts +1 -1
  709. package/src/resources/shared/package.json +3 -0
  710. package/src/resources/skills/create-skill/SKILL.md +3 -0
  711. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  712. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  713. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  714. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  715. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  716. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  717. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  718. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  719. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  720. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  721. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  722. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  723. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  724. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  725. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
  726. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
@@ -1,10 +1,14 @@
1
1
  // gsd-pi - Claude Code stream adapter regression tests
2
2
  import { describe, test } from "node:test";
3
+ import { clearGuidedUnitContext, setGuidedUnitContext } from "../../gsd/guided-unit-context.ts";
3
4
  import assert from "node:assert/strict";
4
5
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
6
+ import { createRequire } from "node:module";
5
7
  import { join, resolve } from "node:path";
6
8
  import { tmpdir } from "node:os";
9
+ import { pathToFileURL } from "node:url";
7
10
  import {
11
+ streamViaClaudeCode,
8
12
  makeStreamExhaustedErrorMessage,
9
13
  isClaudeCodeAbortErrorMessage,
10
14
  resolveClaudeCodeAbortedMessageText,
@@ -35,12 +39,20 @@ import {
35
39
  roundResultToElicitationContent,
36
40
  autoInitClaudeCodeWorkflowMcp,
37
41
  inferGsdPhaseFromContext,
42
+ resolveGsdPhaseForSdk,
43
+ resolveClaudeCodeToolSurfaceReadinessError,
44
+ resolveClaudeCodeToolSurfaceReadinessRetryDelayMs,
45
+ shouldRetryClaudeCodeToolSurfaceReadiness,
46
+ buildWorkflowMcpReadinessProgressMessage,
47
+ pushWorkflowMcpReadinessProgressEvent,
38
48
  } from "../stream-adapter.ts";
39
49
  import { CLAUDE_CODE_MODELS } from "../models.ts";
40
50
  import type { AssistantMessage, Context, Message } from "@gsd/pi-ai";
41
51
  import type { SDKUserMessage } from "../sdk-types.ts";
42
52
  import { _setAutoActiveForTest } from "../../gsd/auto.ts";
43
53
  import { getInFlightToolCount, hasInteractiveToolInFlight, clearInFlightTools, isInteractiveElicitationInFlight } from "../../gsd/auto-tool-tracking.ts";
54
+ import { clearMcpConfigCache } from "../../mcp-client/manager.ts";
55
+ import { UNIT_TOOL_CONTRACTS } from "../../gsd/unit-tool-contracts.ts";
44
56
 
45
57
  // ---------------------------------------------------------------------------
46
58
  // Env helpers — `GSD_WORKFLOW_MCP_*` save/restore
@@ -356,6 +368,114 @@ describe("stream-adapter — image prompt forwarding (#4183)", () => {
356
368
  parent_tool_use_id: null,
357
369
  });
358
370
  });
371
+
372
+ test("buildSdkQueryPrompt image iterable can be consumed for each SDK retry", async () => {
373
+ const context: Context = {
374
+ messages: [
375
+ {
376
+ role: "user",
377
+ content: [
378
+ { type: "image", data: "ZmFrZQ==", mimeType: "image/jpeg" },
379
+ { type: "text", text: "Retry with this image." },
380
+ ],
381
+ } as Message,
382
+ ],
383
+ };
384
+ const textPrompt = buildPromptFromContext(context);
385
+ const prompt = buildSdkQueryPrompt(context, textPrompt);
386
+
387
+ const firstAttempt = [];
388
+ for await (const item of prompt as AsyncIterable<any>) {
389
+ firstAttempt.push(item);
390
+ }
391
+
392
+ const retryAttempt = [];
393
+ for await (const item of prompt as AsyncIterable<any>) {
394
+ retryAttempt.push(item);
395
+ }
396
+
397
+ assert.equal(firstAttempt.length, 1);
398
+ assert.deepEqual(retryAttempt, firstAttempt);
399
+ });
400
+
401
+ test("SDK readiness retries do not leak partial content into the next attempt", async () => {
402
+ let queryCalls = 0;
403
+ const cwd = mkdtempSync(join(tmpdir(), "claude-sdk-retry-state-"));
404
+ const context: Context = {
405
+ systemPrompt: "UNIT: Run UAT",
406
+ messages: [{ role: "user", content: "Run UAT." } as Message],
407
+ };
408
+ try {
409
+ const stream = streamViaClaudeCode(
410
+ { id: "claude-sonnet-4-6" } as any,
411
+ context,
412
+ {
413
+ cwd,
414
+ _skipWorkflowMcpPreflightForTest: true,
415
+ async *_sdkQueryForTest() {
416
+ queryCalls += 1;
417
+ if (queryCalls === 1) {
418
+ yield {
419
+ type: "stream_event",
420
+ event: { type: "message_start", message: { model: "claude-sonnet-4-6" } },
421
+ parent_tool_use_id: null,
422
+ uuid: "partial-1",
423
+ session_id: "session-1",
424
+ };
425
+ yield {
426
+ type: "stream_event",
427
+ event: { type: "content_block_start", index: 0, content_block: { type: "text", text: "" } },
428
+ parent_tool_use_id: null,
429
+ uuid: "partial-1",
430
+ session_id: "session-1",
431
+ };
432
+ yield {
433
+ type: "stream_event",
434
+ event: { type: "content_block_delta", index: 0, delta: { type: "text_delta", text: "stale retry text" } },
435
+ parent_tool_use_id: null,
436
+ uuid: "partial-1",
437
+ session_id: "session-1",
438
+ };
439
+ yield {
440
+ type: "system",
441
+ subtype: "init",
442
+ tools: ["Read"],
443
+ mcp_servers: [{ name: "gsd-workflow", status: "connected" }],
444
+ };
445
+ return;
446
+ }
447
+
448
+ yield {
449
+ type: "result",
450
+ subtype: "success",
451
+ uuid: "result-2",
452
+ session_id: "session-2",
453
+ duration_ms: 1,
454
+ duration_api_ms: 1,
455
+ is_error: false,
456
+ num_turns: 1,
457
+ result: "fresh retry result",
458
+ stop_reason: "end_turn",
459
+ total_cost_usd: 0,
460
+ usage: {
461
+ input_tokens: 0,
462
+ output_tokens: 0,
463
+ cache_read_input_tokens: 0,
464
+ cache_creation_input_tokens: 0,
465
+ },
466
+ };
467
+ },
468
+ } as any,
469
+ );
470
+
471
+ const message = await stream.result();
472
+
473
+ assert.equal(queryCalls, 2);
474
+ assert.deepEqual(message.content, [{ type: "text", text: "fresh retry result" }]);
475
+ } finally {
476
+ rmSync(cwd, { recursive: true, force: true });
477
+ }
478
+ });
359
479
  });
360
480
 
361
481
  // ---------------------------------------------------------------------------
@@ -461,6 +581,33 @@ describe("stream-adapter — no transcript fabrication (#4102)", () => {
461
581
  assert.ok(!prompt.includes("mcp__gsd-workflow__<tool_name>"));
462
582
  });
463
583
 
584
+ test("buildPromptFromContext remaps structured user input to the workflow MCP question tool", () => {
585
+ const context: Context = {
586
+ systemPrompt: "Use ask_user_questions for structured user input.",
587
+ messages: [{ role: "user", content: "Ask the user what comes next" } as Message],
588
+ };
589
+
590
+ const prompt = buildPromptFromContext(context, { workflowMcpServerName: "gsd-workflow" });
591
+
592
+ assert.ok(prompt.includes("mcp__gsd-workflow__ask_user_questions"));
593
+ assert.ok(prompt.includes("Do not call bare ask_user_questions"));
594
+ assert.ok(prompt.includes("Do not call native AskUserQuestion"));
595
+ });
596
+
597
+ test("buildPromptFromContext allows ToolSearch only for deferred workflow MCP hydration", () => {
598
+ const context: Context = {
599
+ messages: [{ role: "user", content: "Plan the slice" } as Message],
600
+ };
601
+
602
+ const prompt = buildPromptFromContext(context, { workflowMcpServerName: "gsd-workflow" });
603
+
604
+ assert.ok(prompt.includes("ToolSearch is available only for Claude Code deferred workflow MCP hydration"));
605
+ assert.ok(prompt.includes("use ToolSearch with select:mcp__gsd-workflow__<tool_name> or the base tool name"));
606
+ assert.ok(prompt.includes("then call the returned MCP tool directly"));
607
+ assert.ok(prompt.includes("Do not use ToolSearch for browser_* tools or general discovery"));
608
+ assert.ok(!prompt.includes("ToolSearch is NOT available"));
609
+ });
610
+
464
611
  test("buildPromptFromContext does not advertise workflow MCP tools when unavailable", () => {
465
612
  const context: Context = {
466
613
  messages: [{ role: "user", content: "Check status" } as Message],
@@ -760,6 +907,91 @@ describe("stream-adapter — Claude Code external tool results", () => {
760
907
  assert.deepEqual(finalContent[1], { type: "text", text: "All done." });
761
908
  });
762
909
 
910
+ test("buildFinalAssistantContent suppresses duplicate empty MCP tool-unavailable failures after same-turn success", () => {
911
+ const finalContent = buildFinalAssistantContent({
912
+ intermediateToolBlocks: [
913
+ {
914
+ type: "toolCall",
915
+ id: "tool-empty-uat",
916
+ name: "gsd_uat_exec",
917
+ arguments: {},
918
+ mcpServer: "gsd-workflow",
919
+ } as any,
920
+ {
921
+ type: "toolCall",
922
+ id: "tool-real-uat",
923
+ name: "gsd_uat_exec",
924
+ arguments: {
925
+ milestoneId: "M004",
926
+ sliceId: "S01",
927
+ checkId: "S01-UAT-01-smoke",
928
+ intent: "uat-runtime-check",
929
+ script: "npx playwright test e2e/priority.spec.js --reporter=line",
930
+ },
931
+ mcpServer: "gsd-workflow",
932
+ } as any,
933
+ ],
934
+ pendingContent: [{ type: "text", text: "UAT S01 complete." }],
935
+ toolResultsById: new Map([
936
+ [
937
+ "tool-empty-uat",
938
+ {
939
+ content: [{
940
+ type: "text",
941
+ text: "<tool_use_error>Error: No such tool available: mcp__gsd-workflow__gsd_uat_exec</tool_use_error>",
942
+ }],
943
+ isError: true,
944
+ },
945
+ ],
946
+ [
947
+ "tool-real-uat",
948
+ {
949
+ content: [{ type: "text", text: "{\"operation\":\"gsd_uat_exec\",\"exit_code\":0}" }],
950
+ isError: false,
951
+ },
952
+ ],
953
+ ]),
954
+ });
955
+
956
+ assert.equal(finalContent.length, 2);
957
+ assert.equal((finalContent[0] as any).id, "tool-real-uat");
958
+ assert.deepEqual((finalContent[0] as any).externalResult, {
959
+ content: [{ type: "text", text: "{\"operation\":\"gsd_uat_exec\",\"exit_code\":0}" }],
960
+ isError: false,
961
+ });
962
+ assert.deepEqual(finalContent[1], { type: "text", text: "UAT S01 complete." });
963
+ });
964
+
965
+ test("buildFinalAssistantContent keeps lone MCP tool-unavailable failures", () => {
966
+ const finalContent = buildFinalAssistantContent({
967
+ intermediateToolBlocks: [
968
+ {
969
+ type: "toolCall",
970
+ id: "tool-empty-uat",
971
+ name: "gsd_uat_exec",
972
+ arguments: {},
973
+ mcpServer: "gsd-workflow",
974
+ } as any,
975
+ ],
976
+ toolResultsById: new Map([
977
+ [
978
+ "tool-empty-uat",
979
+ {
980
+ content: [{
981
+ type: "text",
982
+ text: "<tool_use_error>Error: No such tool available: mcp__gsd-workflow__gsd_uat_exec</tool_use_error>",
983
+ }],
984
+ isError: true,
985
+ },
986
+ ],
987
+ ]),
988
+ });
989
+
990
+ assert.equal(finalContent.length, 1);
991
+ assert.equal((finalContent[0] as any).id, "tool-empty-uat");
992
+ assert.equal((finalContent[0] as any).externalResult.isError, true);
993
+ });
994
+
763
995
  test("buildFinalAssistantContent keeps final-turn tool calls when result arrives without a synthetic user boundary", () => {
764
996
  const finalContent = buildFinalAssistantContent({
765
997
  intermediateToolBlocks: [],
@@ -1053,7 +1285,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1053
1285
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1054
1286
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1055
1287
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, "/tmp/project");
1056
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1288
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1057
1289
  assert.deepEqual(options.allowedTools, [
1058
1290
  "Read",
1059
1291
  "Write",
@@ -1173,8 +1405,8 @@ describe("stream-adapter — session persistence (#2859)", () => {
1173
1405
  "plan-milestone must expose exact milestone status helper before ToolSearch is needed",
1174
1406
  );
1175
1407
  assert.ok(
1176
- allowedTools.includes("mcp__gsd-workflow__*"),
1177
- "non-UAT workflow phases keep the wildcard for existing broad workflow behavior",
1408
+ !allowedTools.includes("mcp__gsd-workflow__*"),
1409
+ "strict GSD phases must not rely on a workflow wildcard that can mask missing exact tools",
1178
1410
  );
1179
1411
  assert.ok((options.disallowedTools as string[]).includes("AskUserQuestion"));
1180
1412
  assert.equal(options.strictMcpConfig, true);
@@ -1186,6 +1418,121 @@ describe("stream-adapter — session persistence (#2859)", () => {
1186
1418
  }
1187
1419
  });
1188
1420
 
1421
+ test("buildSdkOptions leaves ToolSearch available for complete-milestone workflow MCP hydration", () => {
1422
+ const restore = setWorkflowMcpEnv({
1423
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1424
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1425
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1426
+ GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
1427
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1428
+ });
1429
+ const originalCwd = process.cwd();
1430
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-complete-milestone-"));
1431
+ try {
1432
+ process.chdir(emptyDir);
1433
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, { gsdPhase: "complete-milestone" });
1434
+ const disallowedTools = options.disallowedTools as string[];
1435
+
1436
+ assert.ok(!disallowedTools.includes("ToolSearch"));
1437
+ assert.ok(disallowedTools.includes("Skill"));
1438
+ assert.ok(disallowedTools.includes("AskUserQuestion"));
1439
+ assert.equal(options.strictMcpConfig, true);
1440
+ } finally {
1441
+ process.chdir(originalCwd);
1442
+ rmSync(emptyDir, { recursive: true, force: true });
1443
+ restore();
1444
+ }
1445
+ });
1446
+
1447
+ test("buildSdkOptions scopes complete-slice away from native write and shell tools", () => {
1448
+ const restore = setWorkflowMcpEnv({
1449
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1450
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1451
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1452
+ GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
1453
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1454
+ });
1455
+ const originalCwd = process.cwd();
1456
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-complete-slice-"));
1457
+ try {
1458
+ process.chdir(emptyDir);
1459
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, { gsdPhase: "complete-slice" });
1460
+ const allowedTools = options.allowedTools as string[];
1461
+
1462
+ assert.ok(allowedTools.includes("Read"));
1463
+ assert.ok(allowedTools.includes("Glob"));
1464
+ assert.ok(allowedTools.includes("Grep"));
1465
+ assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_exec"));
1466
+ assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_slice_complete"));
1467
+ assert.ok(!allowedTools.includes("Bash"));
1468
+ assert.ok(!allowedTools.includes("Write"));
1469
+ assert.ok(!allowedTools.includes("Edit"));
1470
+ assert.ok(!allowedTools.includes("mcp__gsd-workflow__*"));
1471
+ } finally {
1472
+ process.chdir(originalCwd);
1473
+ rmSync(emptyDir, { recursive: true, force: true });
1474
+ restore();
1475
+ }
1476
+ });
1477
+
1478
+ test("buildSdkOptions blocks native Skill tool during GSD phases", () => {
1479
+ const restore = setWorkflowMcpEnv({
1480
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1481
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1482
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1483
+ GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
1484
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1485
+ });
1486
+ const originalCwd = process.cwd();
1487
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-no-native-skill-"));
1488
+ try {
1489
+ process.chdir(emptyDir);
1490
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, { gsdPhase: "complete-slice" });
1491
+ const allowedTools = options.allowedTools as string[];
1492
+ const disallowedTools = options.disallowedTools as string[];
1493
+
1494
+ assert.ok(!allowedTools.includes("Skill"));
1495
+ assert.ok(disallowedTools.includes("Skill"));
1496
+ } finally {
1497
+ process.chdir(originalCwd);
1498
+ rmSync(emptyDir, { recursive: true, force: true });
1499
+ restore();
1500
+ }
1501
+ });
1502
+
1503
+ test("buildSdkOptions presents every unit's required workflow MCP tools", () => {
1504
+ const restore = setWorkflowMcpEnv({
1505
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1506
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1507
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1508
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1509
+ });
1510
+ const originalCwd = process.cwd();
1511
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-all-units-"));
1512
+ try {
1513
+ process.chdir(emptyDir);
1514
+ for (const [unitType, contract] of Object.entries(UNIT_TOOL_CONTRACTS)) {
1515
+ const requiredTools = contract.requiredWorkflowTools.filter(
1516
+ (tool) => tool.startsWith("gsd_") || tool === "ask_user_questions",
1517
+ );
1518
+ if (requiredTools.length === 0) continue;
1519
+
1520
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, { gsdPhase: unitType });
1521
+ const allowedTools = options.allowedTools as string[];
1522
+ for (const toolName of requiredTools) {
1523
+ assert.ok(
1524
+ allowedTools.includes(`mcp__gsd-workflow__${toolName}`) || allowedTools.includes("mcp__gsd-workflow__*"),
1525
+ `${unitType} must allow ${toolName}; allowed=${JSON.stringify(allowedTools)}`,
1526
+ );
1527
+ }
1528
+ }
1529
+ } finally {
1530
+ process.chdir(originalCwd);
1531
+ rmSync(emptyDir, { recursive: true, force: true });
1532
+ restore();
1533
+ }
1534
+ });
1535
+
1189
1536
  test("inferGsdPhaseFromContext recognizes non-UAT unit prompts", () => {
1190
1537
  const context = {
1191
1538
  messages: [
@@ -1196,6 +1543,53 @@ describe("stream-adapter — session persistence (#2859)", () => {
1196
1543
  assert.equal(inferGsdPhaseFromContext(context), "plan-milestone");
1197
1544
  });
1198
1545
 
1546
+ test("inferGsdPhaseFromContext recognizes discuss-slice and refine-slice prompts", () => {
1547
+ const discussSlice = {
1548
+ messages: [{ role: "user", content: "Discuss slice S001 in milestone M001." }],
1549
+ } as Context;
1550
+ const refineSlice = {
1551
+ messages: [{ role: "user", content: "## UNIT: Refine Slice S001 (\"Auth\") - Milestone M001" }],
1552
+ } as Context;
1553
+
1554
+ assert.equal(inferGsdPhaseFromContext(discussSlice), "discuss-slice");
1555
+ assert.equal(inferGsdPhaseFromContext(refineSlice), "refine-slice");
1556
+ });
1557
+
1558
+ test("resolveGsdPhaseForSdk prefers guided unit context over prompt inference", () => {
1559
+ const projectRoot = "/tmp/gsd-guided-phase-project";
1560
+ clearGuidedUnitContext();
1561
+ setGuidedUnitContext(projectRoot, "discuss-slice");
1562
+ try {
1563
+ const context = {
1564
+ messages: [{ role: "user", content: "Generic workflow task with no phase slug." }],
1565
+ } as Context;
1566
+ assert.equal(resolveGsdPhaseForSdk(context, projectRoot), "discuss-slice");
1567
+ } finally {
1568
+ clearGuidedUnitContext(projectRoot);
1569
+ }
1570
+ });
1571
+
1572
+ test("resolveGsdPhaseForSdk matches guided context across milestone worktrees", () => {
1573
+ const projectRoot = "/tmp/gsd-guided-phase-root";
1574
+ const worktreeRoot = `${projectRoot}/.gsd/worktrees/m001-wt`;
1575
+ clearGuidedUnitContext();
1576
+ setGuidedUnitContext(worktreeRoot, "refine-slice");
1577
+ try {
1578
+ const context = { messages: [{ role: "user", content: "No UNIT header here." }] } as Context;
1579
+ assert.equal(resolveGsdPhaseForSdk(context, projectRoot), "refine-slice");
1580
+ } finally {
1581
+ clearGuidedUnitContext(worktreeRoot);
1582
+ }
1583
+ });
1584
+
1585
+ test("resolveGsdPhaseForSdk falls back to prompt inference when guided context is absent", () => {
1586
+ clearGuidedUnitContext();
1587
+ const context = {
1588
+ messages: [{ role: "user", content: "## UNIT: Run UAT — M001/S001" }],
1589
+ } as Context;
1590
+ assert.equal(resolveGsdPhaseForSdk(context, "/tmp/unrelated-project"), "run-uat");
1591
+ });
1592
+
1199
1593
  test("buildSdkOptions presents ask_user_questions for discuss phases", () => {
1200
1594
  const restore = setWorkflowMcpEnv({
1201
1595
  GSD_WORKFLOW_MCP_COMMAND: "node",
@@ -1245,7 +1639,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1245
1639
  const mcpServers = options.mcpServers as Record<string, any>;
1246
1640
  assert.ok(mcpServers?.["custom-workflow"], "expected custom workflow server config");
1247
1641
  assert.ok(mcpServers?.["gsd-browser"], "expected gsd-browser server config");
1248
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1642
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1249
1643
  assert.deepEqual(options.allowedTools, [
1250
1644
  "Read",
1251
1645
  "Write",
@@ -1291,7 +1685,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1291
1685
  if (mcpServers) {
1292
1686
  assert.ok(mcpServers["gsd-workflow"], "if present, must include gsd-workflow");
1293
1687
  assert.ok(mcpServers["gsd-browser"], "if present, must include gsd-browser");
1294
- assert.deepEqual((options as any).disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1688
+ assert.deepEqual((options as any).disallowedTools, ["AskUserQuestion"]);
1295
1689
  } else {
1296
1690
  assert.deepEqual((options as any).disallowedTools, ["ToolSearch"]);
1297
1691
  }
@@ -1333,7 +1727,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1333
1727
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1334
1728
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1335
1729
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, resolvedRepoDir);
1336
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1730
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1337
1731
  } finally {
1338
1732
  process.chdir(originalCwd);
1339
1733
  rmSync(repoDir, { recursive: true, force: true });
@@ -1403,7 +1797,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1403
1797
  const allowedTools = options.allowedTools as string[];
1404
1798
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_plan_milestone"));
1405
1799
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_milestone_status"));
1406
- assert.ok(allowedTools.includes("mcp__gsd-workflow__*"));
1800
+ assert.ok(!allowedTools.includes("mcp__gsd-workflow__*"));
1407
1801
  } finally {
1408
1802
  process.chdir(originalCwd);
1409
1803
  rmSync(projectDir, { recursive: true, force: true });
@@ -1518,6 +1912,277 @@ describe("stream-adapter — session persistence (#2859)", () => {
1518
1912
  });
1519
1913
  });
1520
1914
 
1915
+ describe("stream-adapter — workflow MCP readiness", () => {
1916
+ test("emits visible progress text before workflow MCP readiness waits", () => {
1917
+ const partial: AssistantMessage = {
1918
+ role: "assistant",
1919
+ content: [],
1920
+ api: "anthropic-messages",
1921
+ provider: "claude-code",
1922
+ model: "claude-sonnet-4-6",
1923
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
1924
+ stopReason: "stop",
1925
+ timestamp: Date.now(),
1926
+ };
1927
+ const events: any[] = [];
1928
+ const state = {};
1929
+ const message = buildWorkflowMcpReadinessProgressMessage({
1930
+ unitType: "complete-milestone",
1931
+ workflowServerName: "gsd-workflow",
1932
+ stage: "preflight",
1933
+ });
1934
+
1935
+ pushWorkflowMcpReadinessProgressEvent({
1936
+ stream: { push: (event: any) => events.push(event) } as any,
1937
+ partial,
1938
+ state,
1939
+ message,
1940
+ });
1941
+ const retryMessage = buildWorkflowMcpReadinessProgressMessage({
1942
+ unitType: "complete-milestone",
1943
+ workflowServerName: "gsd-workflow",
1944
+ stage: "retry",
1945
+ attempt: 1,
1946
+ delayMs: 1_000,
1947
+ });
1948
+ pushWorkflowMcpReadinessProgressEvent({
1949
+ stream: { push: (event: any) => events.push(event) } as any,
1950
+ partial,
1951
+ state,
1952
+ message: retryMessage,
1953
+ });
1954
+
1955
+ assert.deepEqual(events.map((event) => event.type), ["text_start", "text_delta", "text_delta"]);
1956
+ assert.match(events[1].delta, /Starting gsd-workflow MCP/);
1957
+ assert.match(events[1].delta, /complete-milestone/);
1958
+ assert.match(events[2].delta, /Still waiting for gsd-workflow MCP tools/);
1959
+ assert.match(events[2].delta, /Retrying in 1s/);
1960
+ assert.deepEqual(partial.content, [{ type: "text", text: `${message}\n${retryMessage}` }]);
1961
+ });
1962
+
1963
+ test("execute-task requires gsd_exec before the model follows verification guidance", async () => {
1964
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
1965
+ unitType: "execute-task",
1966
+ workflowServerName: "gsd-workflow",
1967
+ observation: {
1968
+ tools: [
1969
+ "Read",
1970
+ "Bash",
1971
+ "mcp__gsd-workflow__gsd_task_complete",
1972
+ "mcp__gsd-workflow__gsd_exec_search",
1973
+ "mcp__gsd-workflow__gsd_resume",
1974
+ "mcp__gsd-workflow__gsd_capture_thought",
1975
+ ],
1976
+ mcpServers: [{ name: "gsd-workflow", status: "connected" }],
1977
+ },
1978
+ });
1979
+
1980
+ assert.match(error ?? "", /gsd_exec/);
1981
+ });
1982
+
1983
+ test("complete-slice requires gsd_exec before the model follows closeout verification guidance", async () => {
1984
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
1985
+ unitType: "complete-slice",
1986
+ workflowServerName: "gsd-workflow",
1987
+ observation: {
1988
+ tools: [
1989
+ "Read",
1990
+ "mcp__gsd-workflow__gsd_slice_complete",
1991
+ "mcp__gsd-workflow__gsd_task_reopen",
1992
+ "mcp__gsd-workflow__gsd_replan_slice",
1993
+ "mcp__gsd-workflow__gsd_requirement_update",
1994
+ "mcp__gsd-workflow__gsd_summary_save",
1995
+ "mcp__gsd-workflow__gsd_capture_thought",
1996
+ "mcp__gsd-workflow__gsd_exec_search",
1997
+ ],
1998
+ mcpServers: [{ name: "gsd-workflow", status: "connected" }],
1999
+ },
2000
+ });
2001
+
2002
+ assert.match(error ?? "", /gsd_exec/);
2003
+ });
2004
+
2005
+ test("complete-slice requires workflow MCP memory capture before closeout guidance can use it", async () => {
2006
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
2007
+ unitType: "complete-slice",
2008
+ workflowServerName: "gsd-workflow",
2009
+ observation: {
2010
+ tools: [
2011
+ "Read",
2012
+ "capture_thought",
2013
+ "mcp__gsd-workflow__gsd_exec",
2014
+ "mcp__gsd-workflow__gsd_slice_complete",
2015
+ "mcp__gsd-workflow__gsd_task_reopen",
2016
+ "mcp__gsd-workflow__gsd_replan_slice",
2017
+ "mcp__gsd-workflow__gsd_requirement_update",
2018
+ "mcp__gsd-workflow__gsd_summary_save",
2019
+ ],
2020
+ mcpServers: [{ name: "gsd-workflow", status: "connected" }],
2021
+ },
2022
+ });
2023
+
2024
+ assert.match(error ?? "", /gsd_capture_thought/);
2025
+ });
2026
+
2027
+ test("terminal init surface remains not ready even when configured workflow MCP probes available", async () => {
2028
+ const previousGsdHome = process.env.GSD_HOME;
2029
+ const projectRoot = realpathSync(mkdtempSync(join(tmpdir(), "claude-sdk-mcp-pending-ready-")));
2030
+ const gsdHomeDir = realpathSync(mkdtempSync(join(tmpdir(), "claude-sdk-mcp-pending-home-")));
2031
+ try {
2032
+ process.env.GSD_HOME = gsdHomeDir;
2033
+
2034
+ const require = createRequire(import.meta.url);
2035
+ const mcpModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/mcp.js")).href;
2036
+ const stdioModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/stdio.js")).href;
2037
+ const serverPath = join(projectRoot, "fake-workflow-mcp-server.mjs");
2038
+ writeFileSync(
2039
+ serverPath,
2040
+ [
2041
+ `const { McpServer } = await import(${JSON.stringify(mcpModuleUrl)});`,
2042
+ `const { StdioServerTransport } = await import(${JSON.stringify(stdioModuleUrl)});`,
2043
+ 'const server = new McpServer({ name: "fake", version: "1.0.0" }, { capabilities: { tools: {} } });',
2044
+ 'server.tool("gsd_plan_slice", "Plan slice", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
2045
+ 'server.tool("gsd_reassess_roadmap", "Reassess roadmap", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
2046
+ 'await server.connect(new StdioServerTransport());',
2047
+ ].join("\n"),
2048
+ "utf-8",
2049
+ );
2050
+ writeFileSync(
2051
+ join(projectRoot, ".mcp.json"),
2052
+ JSON.stringify({ mcpServers: { "gsd-workflow": { command: process.execPath, args: [serverPath] } } }),
2053
+ "utf-8",
2054
+ );
2055
+
2056
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
2057
+ unitType: "plan-slice",
2058
+ workflowServerName: "gsd-workflow",
2059
+ observation: {
2060
+ tools: ["Read", "Bash"],
2061
+ mcpServers: [{ name: "gsd-workflow", status: "failed" }],
2062
+ },
2063
+ });
2064
+
2065
+ assert.match(error ?? "", /status is "failed"/);
2066
+ assert.match(error ?? "", /gsd_plan_slice/);
2067
+ } finally {
2068
+ if (previousGsdHome === undefined) {
2069
+ delete process.env.GSD_HOME;
2070
+ } else {
2071
+ process.env.GSD_HOME = previousGsdHome;
2072
+ }
2073
+ rmSync(projectRoot, { recursive: true, force: true });
2074
+ rmSync(gsdHomeDir, { recursive: true, force: true });
2075
+ clearMcpConfigCache();
2076
+ }
2077
+ });
2078
+
2079
+ test("pending init surface is not accepted until the live Claude session exposes plan-slice tools", async () => {
2080
+ const projectRoot = realpathSync(mkdtempSync(join(tmpdir(), "claude-sdk-mcp-plan-pending-")));
2081
+ try {
2082
+ const require = createRequire(import.meta.url);
2083
+ const mcpModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/mcp.js")).href;
2084
+ const stdioModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/stdio.js")).href;
2085
+ const serverPath = join(projectRoot, "fake-workflow-mcp-server.mjs");
2086
+ writeFileSync(
2087
+ serverPath,
2088
+ [
2089
+ `const { McpServer } = await import(${JSON.stringify(mcpModuleUrl)});`,
2090
+ `const { StdioServerTransport } = await import(${JSON.stringify(stdioModuleUrl)});`,
2091
+ 'const server = new McpServer({ name: "fake", version: "1.0.0" }, { capabilities: { tools: {} } });',
2092
+ 'server.tool("gsd_plan_slice", "Plan slice", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
2093
+ 'server.tool("gsd_reassess_roadmap", "Reassess roadmap", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
2094
+ 'await server.connect(new StdioServerTransport());',
2095
+ ].join("\n"),
2096
+ "utf-8",
2097
+ );
2098
+ writeFileSync(
2099
+ join(projectRoot, ".mcp.json"),
2100
+ JSON.stringify({ mcpServers: { "gsd-workflow": { command: process.execPath, args: [serverPath] } } }),
2101
+ "utf-8",
2102
+ );
2103
+
2104
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
2105
+ unitType: "plan-slice",
2106
+ workflowServerName: "gsd-workflow",
2107
+ projectRoot,
2108
+ observation: {
2109
+ tools: ["Read", "Bash"],
2110
+ mcpServers: [{ name: "gsd-workflow", status: "pending" }],
2111
+ },
2112
+ });
2113
+
2114
+ assert.match(error ?? "", /status is "pending"/);
2115
+ assert.match(error ?? "", /gsd_plan_slice/);
2116
+ } finally {
2117
+ rmSync(projectRoot, { recursive: true, force: true });
2118
+ clearMcpConfigCache();
2119
+ }
2120
+ });
2121
+
2122
+ test("pending init surface can be deferred to Claude Code ToolSearch hydration", async () => {
2123
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
2124
+ unitType: "plan-slice",
2125
+ workflowServerName: "gsd-workflow",
2126
+ allowPendingToolSearchHydration: true,
2127
+ observation: {
2128
+ tools: ["Read", "Bash"],
2129
+ mcpServers: [{ name: "gsd-workflow", status: "pending" }],
2130
+ },
2131
+ });
2132
+
2133
+ assert.equal(error, null);
2134
+ });
2135
+
2136
+ test("complete-milestone pending init surface defers to Claude Code ToolSearch hydration", async () => {
2137
+ const error = await resolveClaudeCodeToolSurfaceReadinessError({
2138
+ unitType: "complete-milestone",
2139
+ workflowServerName: "gsd-workflow",
2140
+ allowPendingToolSearchHydration: true,
2141
+ observation: {
2142
+ tools: ["Read", "Bash"],
2143
+ mcpServers: [{ name: "gsd-workflow", status: "pending" }],
2144
+ },
2145
+ });
2146
+
2147
+ assert.equal(error, null);
2148
+ });
2149
+
2150
+ test("retries transient readiness errors internally but not terminal MCP failures", () => {
2151
+ const pendingError =
2152
+ 'workflow tool surface not ready for run-uat: MCP server "gsd-workflow" status is "pending" (not yet connected): gsd_uat_exec';
2153
+ const partialError =
2154
+ 'workflow tool surface not ready for run-uat: MCP server "gsd-workflow" is connected but has not registered: gsd_uat_exec';
2155
+ const terminalError =
2156
+ 'workflow tool surface not ready for run-uat: MCP server "gsd-workflow" status is "failed" (terminal) — cannot register: gsd_uat_exec';
2157
+
2158
+ assert.equal(shouldRetryClaudeCodeToolSurfaceReadiness(pendingError), true);
2159
+ assert.equal(shouldRetryClaudeCodeToolSurfaceReadiness(partialError), true);
2160
+ assert.equal(shouldRetryClaudeCodeToolSurfaceReadiness(terminalError), false);
2161
+ assert.equal(
2162
+ resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 0),
2163
+ 500,
2164
+ );
2165
+ assert.equal(
2166
+ resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 1),
2167
+ 1_000,
2168
+ );
2169
+ assert.equal(
2170
+ resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(partialError, 2),
2171
+ 2_000,
2172
+ );
2173
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 3), 4_000);
2174
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 4), 8_000);
2175
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 5), 15_000);
2176
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 6), 15_000);
2177
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 7), 15_000);
2178
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 8), null);
2179
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 0, true), 1_000);
2180
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 9, true), 15_000);
2181
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(pendingError, 10, true), null);
2182
+ assert.equal(resolveClaudeCodeToolSurfaceReadinessRetryDelayMs(terminalError, 0), null);
2183
+ });
2184
+ });
2185
+
1521
2186
  describe("stream-adapter — MCP elicitation bridge", () => {
1522
2187
  const askUserQuestionsRequest = {
1523
2188
  serverName: "gsd-workflow",