@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3

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 (837) 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 +5 -2
  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/models.js +9 -0
  33. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
  34. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  35. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  36. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  37. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  38. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  40. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  41. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  42. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  43. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  44. package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
  45. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  46. package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
  47. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  48. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  49. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  50. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  51. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  52. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  53. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  54. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  55. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  56. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  57. package/dist/resources/extensions/gsd/auto-start.js +47 -29
  58. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  59. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  60. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  61. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  62. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  63. package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
  64. package/dist/resources/extensions/gsd/auto.js +49 -22
  65. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  66. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  67. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +69 -19
  68. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  69. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  70. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  71. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  72. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  73. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  74. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  75. package/dist/resources/extensions/gsd/captures.js +5 -15
  76. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  77. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  78. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  79. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  80. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  81. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  82. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  83. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  84. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  85. package/dist/resources/extensions/gsd/constants.js +0 -2
  86. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  87. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  88. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  89. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  90. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  91. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  92. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  93. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  94. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  95. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  96. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  97. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  98. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  99. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  100. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  101. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  102. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  103. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  104. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  105. package/dist/resources/extensions/gsd/files.js +33 -19
  106. package/dist/resources/extensions/gsd/git-service.js +1 -0
  107. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  108. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  109. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  110. package/dist/resources/extensions/gsd/guidance.js +158 -0
  111. package/dist/resources/extensions/gsd/guided-flow.js +144 -9
  112. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  113. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  114. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  115. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  116. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  117. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  118. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  119. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  120. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  121. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  122. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  123. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  124. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  125. package/dist/resources/extensions/gsd/model-router.js +3 -0
  126. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  127. package/dist/resources/extensions/gsd/notifications.js +12 -7
  128. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  129. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  130. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  131. package/dist/resources/extensions/gsd/paths.js +37 -24
  132. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  133. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  134. package/dist/resources/extensions/gsd/preferences.js +14 -0
  135. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  136. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  137. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  138. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  139. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  140. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  141. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  142. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  143. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  144. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  145. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  146. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  148. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  149. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  150. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  151. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  152. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  153. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  154. package/dist/resources/extensions/gsd/publication.js +87 -0
  155. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  156. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  157. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  158. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  159. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  160. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  161. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  162. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  163. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  164. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  165. package/dist/resources/extensions/gsd/state.js +12 -22
  166. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  167. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  168. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  169. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  170. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  171. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  172. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  173. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  174. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  175. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  176. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  177. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  178. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  179. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  180. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  181. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  182. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  183. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  184. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  185. package/dist/resources/extensions/gsd/undo.js +8 -7
  186. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  189. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  190. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  191. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  192. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  193. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  194. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  195. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  196. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  197. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  198. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  199. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  200. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  201. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  202. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  203. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  204. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  205. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  206. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  207. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  208. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  209. package/dist/resources/extensions/gsd/worktree.js +8 -1
  210. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  211. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  212. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  213. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  214. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  215. package/dist/resources/shared/package-manager-detection.js +1 -1
  216. package/dist/resources/shared/package.json +3 -0
  217. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  218. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  219. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  220. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  221. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  222. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  223. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  224. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  225. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  226. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  227. package/dist/runtime-checks.d.ts +10 -0
  228. package/dist/runtime-checks.js +27 -0
  229. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  230. package/dist/update-check.d.ts +2 -0
  231. package/dist/update-check.js +24 -1
  232. package/dist/update-cmd.js +20 -3
  233. package/dist/web/standalone/.next/BUILD_ID +1 -1
  234. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  235. package/dist/web/standalone/.next/build-manifest.json +3 -3
  236. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  237. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  238. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  239. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  247. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  261. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  267. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  271. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  272. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  273. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  276. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  277. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  278. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  279. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  280. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  281. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  282. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  283. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  284. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  285. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  286. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  289. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/index.html +1 -1
  291. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  292. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  293. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  294. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  295. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  296. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  297. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  298. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  299. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  300. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  301. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  304. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  305. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  306. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  307. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  308. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  309. package/dist/web/standalone/package.json +1 -1
  310. package/dist/worktree-cli.js +3 -6
  311. package/dist/worktree-status-banner.js +7 -11
  312. package/package.json +3 -3
  313. package/packages/cloud-mcp-gateway/package.json +2 -2
  314. package/packages/contracts/dist/rpc.d.ts +1 -0
  315. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  316. package/packages/contracts/dist/rpc.js.map +1 -1
  317. package/packages/contracts/dist/workflow.d.ts +4 -0
  318. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  319. package/packages/contracts/dist/workflow.js.map +1 -1
  320. package/packages/contracts/package.json +1 -1
  321. package/packages/daemon/package.json +4 -4
  322. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  323. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  324. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  325. package/packages/gsd-agent-core/package.json +5 -5
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  339. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  340. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  341. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  342. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  343. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  344. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  345. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  346. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  347. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  349. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  350. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  351. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  353. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  355. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  356. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  357. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  359. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/gsd-agent-modes/package.json +7 -7
  361. package/packages/mcp-server/README.md +12 -3
  362. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  363. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  364. package/packages/mcp-server/dist/cli-runner.js +137 -0
  365. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  366. package/packages/mcp-server/dist/cli.js +2 -50
  367. package/packages/mcp-server/dist/cli.js.map +1 -1
  368. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  369. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  370. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  371. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  372. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  373. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  374. package/packages/mcp-server/dist/pid-registry.js +452 -0
  375. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  376. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  377. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  378. package/packages/mcp-server/dist/probe-mode.js +10 -0
  379. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  380. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  381. package/packages/mcp-server/dist/server.js +4 -0
  382. package/packages/mcp-server/dist/server.js.map +1 -1
  383. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  384. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  385. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  386. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  387. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  388. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  389. package/packages/mcp-server/dist/workflow-tools.js +207 -102
  390. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  391. package/packages/mcp-server/package.json +5 -4
  392. package/packages/native/package.json +1 -1
  393. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  394. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  395. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  396. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  397. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  398. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  399. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  400. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  401. package/packages/pi-agent-core/dist/index.js +3 -0
  402. package/packages/pi-agent-core/dist/index.js.map +1 -1
  403. package/packages/pi-agent-core/package.json +1 -1
  404. package/packages/pi-ai/README.md +1 -0
  405. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  406. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  407. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  408. package/packages/pi-ai/dist/index.d.ts +2 -0
  409. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  410. package/packages/pi-ai/dist/index.js +2 -0
  411. package/packages/pi-ai/dist/index.js.map +1 -1
  412. package/packages/pi-ai/dist/models.generated.d.ts +158 -17
  413. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  414. package/packages/pi-ai/dist/models.generated.js +132 -17
  415. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  416. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  417. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  418. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  419. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  420. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  421. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  422. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  423. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  424. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  425. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  426. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  427. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  428. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  429. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  430. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  431. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  432. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  433. package/packages/pi-ai/package.json +3 -2
  434. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  435. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  437. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  440. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  442. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  443. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  445. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  447. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  449. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  451. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  453. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/index.js +1 -1
  455. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  457. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  458. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  460. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  462. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  463. package/packages/pi-coding-agent/package.json +7 -7
  464. package/packages/pi-tui/dist/index.d.ts +1 -1
  465. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  466. package/packages/pi-tui/dist/index.js +1 -1
  467. package/packages/pi-tui/dist/index.js.map +1 -1
  468. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  469. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  470. package/packages/pi-tui/dist/terminal-image.js +54 -2
  471. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  472. package/packages/pi-tui/dist/tui.d.ts +8 -0
  473. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  474. package/packages/pi-tui/dist/tui.js +72 -18
  475. package/packages/pi-tui/dist/tui.js.map +1 -1
  476. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  477. package/packages/pi-tui/dist/utils.js +110 -36
  478. package/packages/pi-tui/dist/utils.js.map +1 -1
  479. package/packages/pi-tui/package.json +2 -2
  480. package/packages/rpc-client/package.json +2 -2
  481. package/pkg/dist/theme/theme.d.ts.map +1 -1
  482. package/pkg/dist/theme/theme.js +45 -17
  483. package/pkg/dist/theme/theme.js.map +1 -1
  484. package/pkg/package.json +1 -1
  485. package/src/resources/GSD-WORKFLOW.md +5 -4
  486. package/src/resources/extensions/ask-user-questions.ts +7 -2
  487. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  488. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  489. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  490. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  491. package/src/resources/extensions/async-jobs/index.ts +79 -0
  492. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  493. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  494. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  495. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  496. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  497. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  498. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  499. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  500. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  501. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  502. package/src/resources/extensions/browser-tools/index.ts +71 -13
  503. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  504. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  505. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  506. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  507. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
  508. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
  509. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  510. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  511. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  512. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  513. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  514. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  515. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  516. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  517. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  518. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  519. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  520. package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
  521. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  522. package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
  523. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  524. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  525. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  526. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  527. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  528. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  529. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  530. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  531. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  532. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  533. package/src/resources/extensions/gsd/auto-start.ts +48 -33
  534. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  535. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  536. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  537. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  538. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  539. package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
  540. package/src/resources/extensions/gsd/auto.ts +69 -26
  541. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  542. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  543. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +89 -18
  544. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  545. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  546. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  547. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  548. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  549. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  550. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  551. package/src/resources/extensions/gsd/captures.ts +5 -16
  552. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  553. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  554. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  555. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  556. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  557. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  558. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  559. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  560. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  561. package/src/resources/extensions/gsd/constants.ts +0 -3
  562. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  563. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  564. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  565. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  566. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  567. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  568. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  569. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  570. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  571. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  572. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  573. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  574. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  575. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  576. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  577. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  578. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  579. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  580. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  581. package/src/resources/extensions/gsd/files.ts +33 -12
  582. package/src/resources/extensions/gsd/git-service.ts +1 -0
  583. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  584. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  585. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  586. package/src/resources/extensions/gsd/guidance.ts +217 -0
  587. package/src/resources/extensions/gsd/guided-flow.ts +195 -29
  588. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  589. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  590. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  591. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  592. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  593. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  594. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  595. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  596. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  597. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  598. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  599. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  600. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  601. package/src/resources/extensions/gsd/model-router.ts +3 -0
  602. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  603. package/src/resources/extensions/gsd/notifications.ts +13 -6
  604. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  605. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  606. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  607. package/src/resources/extensions/gsd/paths.ts +42 -22
  608. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  609. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  610. package/src/resources/extensions/gsd/preferences.ts +18 -0
  611. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  612. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  613. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  614. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  615. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  616. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  617. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  618. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  619. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  620. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  621. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  622. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  623. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  624. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  625. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  626. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  628. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  629. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  630. package/src/resources/extensions/gsd/publication.ts +122 -0
  631. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  632. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  633. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  634. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  635. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  636. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  637. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  638. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  639. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  640. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  641. package/src/resources/extensions/gsd/state.ts +16 -22
  642. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  643. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  644. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  645. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  646. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +329 -22
  647. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  648. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  649. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  650. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +54 -1
  651. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  652. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  653. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  654. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  655. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  656. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  657. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  658. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  659. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  660. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  661. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  662. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  663. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  664. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  665. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  666. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  667. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  668. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  669. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  670. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  671. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  672. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  673. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  674. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  675. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  676. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  677. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  678. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  679. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  680. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  681. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  682. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  683. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  684. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  685. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  687. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  688. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  689. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  690. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  691. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  692. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  693. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  694. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  695. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  696. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  697. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  698. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  699. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  700. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  701. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  702. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  703. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  704. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  705. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  706. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  707. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  708. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  709. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  710. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  711. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  712. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  713. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  714. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  715. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  716. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  717. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  718. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  719. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  720. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  721. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  722. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  723. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  724. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  725. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  726. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  727. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  728. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  729. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  730. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  731. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  732. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  733. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  734. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  735. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  736. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  737. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  738. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  739. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  740. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  741. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  742. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  743. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  744. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  745. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  746. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  747. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  748. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  749. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  750. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  751. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  752. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  753. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  755. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  756. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  757. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  758. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  759. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  760. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  761. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  762. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  763. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  764. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  765. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  766. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  767. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  768. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  769. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  770. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  771. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  772. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  773. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  774. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  775. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  776. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  777. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  778. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  779. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  780. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  781. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  782. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  783. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  784. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  785. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  786. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  787. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  788. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  789. package/src/resources/extensions/gsd/undo.ts +9 -8
  790. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  791. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  792. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  793. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  794. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  795. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  796. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  797. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  798. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  799. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  800. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  801. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  802. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  803. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  804. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  805. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  806. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  807. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  808. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  809. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  810. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  811. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  812. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  813. package/src/resources/extensions/gsd/worktree.ts +7 -1
  814. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  815. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  816. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  817. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  818. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  819. package/src/resources/shared/package-manager-detection.ts +1 -1
  820. package/src/resources/shared/package.json +3 -0
  821. package/src/resources/skills/create-skill/SKILL.md +3 -0
  822. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  823. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  824. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  825. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  826. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  827. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  828. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  829. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  830. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  831. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  832. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  833. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  834. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  835. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  836. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
  837. /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_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,11 +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";
49
+ import { CLAUDE_CODE_MODELS } from "../models.ts";
39
50
  import type { AssistantMessage, Context, Message } from "@gsd/pi-ai";
40
51
  import type { SDKUserMessage } from "../sdk-types.ts";
41
52
  import { _setAutoActiveForTest } from "../../gsd/auto.ts";
42
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";
43
56
 
44
57
  // ---------------------------------------------------------------------------
45
58
  // Env helpers — `GSD_WORKFLOW_MCP_*` save/restore
@@ -355,6 +368,114 @@ describe("stream-adapter — image prompt forwarding (#4183)", () => {
355
368
  parent_tool_use_id: null,
356
369
  });
357
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
+ });
358
479
  });
359
480
 
360
481
  // ---------------------------------------------------------------------------
@@ -460,6 +581,33 @@ describe("stream-adapter — no transcript fabrication (#4102)", () => {
460
581
  assert.ok(!prompt.includes("mcp__gsd-workflow__<tool_name>"));
461
582
  });
462
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
+
463
611
  test("buildPromptFromContext does not advertise workflow MCP tools when unavailable", () => {
464
612
  const context: Context = {
465
613
  messages: [{ role: "user", content: "Check status" } as Message],
@@ -759,6 +907,91 @@ describe("stream-adapter — Claude Code external tool results", () => {
759
907
  assert.deepEqual(finalContent[1], { type: "text", text: "All done." });
760
908
  });
761
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
+
762
995
  test("buildFinalAssistantContent keeps final-turn tool calls when result arrives without a synthetic user boundary", () => {
763
996
  const finalContent = buildFinalAssistantContent({
764
997
  intermediateToolBlocks: [],
@@ -793,6 +1026,33 @@ describe("stream-adapter — Claude Code external tool results", () => {
793
1026
  });
794
1027
  });
795
1028
 
1029
+ describe("claude-code-cli — Claude Fable 5 Opus-tier support", () => {
1030
+ test("Fable 5 is exposed in the Claude Code model picker list", () => {
1031
+ const fable = CLAUDE_CODE_MODELS.find((m) => m.id === "claude-fable-5");
1032
+ assert.ok(fable, "claude-fable-5 must appear in CLAUDE_CODE_MODELS");
1033
+ assert.equal(fable!.reasoning, true);
1034
+ assert.equal(fable!.contextWindow, 1_000_000);
1035
+ assert.equal(fable!.maxTokens, 128_000);
1036
+ });
1037
+
1038
+ test("Fable 5 gets Opus-tier gates: xhigh effort, adaptive thinking, 1M-context beta", () => {
1039
+ const options = buildSdkOptions("claude-fable-5", "test prompt", undefined, { reasoning: "xhigh" });
1040
+ assert.equal(options.effort, "xhigh", "xhigh must pass through natively for Fable 5");
1041
+ assert.deepEqual(options.thinking, { type: "adaptive" }, "Fable 5 must use adaptive thinking");
1042
+ assert.ok(
1043
+ Array.isArray(options.betas) && (options.betas as string[]).includes("context-1m-2025-08-07"),
1044
+ "Fable 5 must enable the 1M-context beta",
1045
+ );
1046
+ });
1047
+
1048
+ test("non-Opus models do not receive Fable 5's Opus-tier gates", () => {
1049
+ // Failure/contrast path: Haiku supports adaptive thinking but is not xhigh/1M-tier.
1050
+ const options = buildSdkOptions("claude-haiku-4-5", "test prompt", undefined, { reasoning: "xhigh" });
1051
+ assert.equal(options.effort, "high", "xhigh must clamp to high for non-Opus-tier models");
1052
+ assert.deepEqual(options.betas, [], "Haiku must not enable the 1M-context beta");
1053
+ });
1054
+ });
1055
+
796
1056
  describe("stream-adapter — session persistence (#2859)", () => {
797
1057
  test("buildSdkOptions enables persistSession by default", () => {
798
1058
  const options = buildSdkOptions("claude-sonnet-4-20250514", "test prompt");
@@ -1025,7 +1285,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1025
1285
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1026
1286
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1027
1287
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, "/tmp/project");
1028
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1288
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1029
1289
  assert.deepEqual(options.allowedTools, [
1030
1290
  "Read",
1031
1291
  "Write",
@@ -1145,8 +1405,8 @@ describe("stream-adapter — session persistence (#2859)", () => {
1145
1405
  "plan-milestone must expose exact milestone status helper before ToolSearch is needed",
1146
1406
  );
1147
1407
  assert.ok(
1148
- allowedTools.includes("mcp__gsd-workflow__*"),
1149
- "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",
1150
1410
  );
1151
1411
  assert.ok((options.disallowedTools as string[]).includes("AskUserQuestion"));
1152
1412
  assert.equal(options.strictMcpConfig, true);
@@ -1158,6 +1418,121 @@ describe("stream-adapter — session persistence (#2859)", () => {
1158
1418
  }
1159
1419
  });
1160
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
+
1161
1536
  test("inferGsdPhaseFromContext recognizes non-UAT unit prompts", () => {
1162
1537
  const context = {
1163
1538
  messages: [
@@ -1168,6 +1543,53 @@ describe("stream-adapter — session persistence (#2859)", () => {
1168
1543
  assert.equal(inferGsdPhaseFromContext(context), "plan-milestone");
1169
1544
  });
1170
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
+
1171
1593
  test("buildSdkOptions presents ask_user_questions for discuss phases", () => {
1172
1594
  const restore = setWorkflowMcpEnv({
1173
1595
  GSD_WORKFLOW_MCP_COMMAND: "node",
@@ -1217,7 +1639,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1217
1639
  const mcpServers = options.mcpServers as Record<string, any>;
1218
1640
  assert.ok(mcpServers?.["custom-workflow"], "expected custom workflow server config");
1219
1641
  assert.ok(mcpServers?.["gsd-browser"], "expected gsd-browser server config");
1220
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1642
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1221
1643
  assert.deepEqual(options.allowedTools, [
1222
1644
  "Read",
1223
1645
  "Write",
@@ -1263,7 +1685,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1263
1685
  if (mcpServers) {
1264
1686
  assert.ok(mcpServers["gsd-workflow"], "if present, must include gsd-workflow");
1265
1687
  assert.ok(mcpServers["gsd-browser"], "if present, must include gsd-browser");
1266
- assert.deepEqual((options as any).disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1688
+ assert.deepEqual((options as any).disallowedTools, ["AskUserQuestion"]);
1267
1689
  } else {
1268
1690
  assert.deepEqual((options as any).disallowedTools, ["ToolSearch"]);
1269
1691
  }
@@ -1305,7 +1727,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1305
1727
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1306
1728
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1307
1729
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, resolvedRepoDir);
1308
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1730
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1309
1731
  } finally {
1310
1732
  process.chdir(originalCwd);
1311
1733
  rmSync(repoDir, { recursive: true, force: true });
@@ -1375,7 +1797,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1375
1797
  const allowedTools = options.allowedTools as string[];
1376
1798
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_plan_milestone"));
1377
1799
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_milestone_status"));
1378
- assert.ok(allowedTools.includes("mcp__gsd-workflow__*"));
1800
+ assert.ok(!allowedTools.includes("mcp__gsd-workflow__*"));
1379
1801
  } finally {
1380
1802
  process.chdir(originalCwd);
1381
1803
  rmSync(projectDir, { recursive: true, force: true });
@@ -1490,6 +1912,277 @@ describe("stream-adapter — session persistence (#2859)", () => {
1490
1912
  });
1491
1913
  });
1492
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
+
1493
2186
  describe("stream-adapter — MCP elicitation bridge", () => {
1494
2187
  const askUserQuestionsRequest = {
1495
2188
  serverName: "gsd-workflow",