@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9

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 (1016) 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-web-branch.d.ts +2 -0
  6. package/dist/cli-web-branch.js +9 -2
  7. package/dist/cli.js +2 -19
  8. package/dist/headless-events.d.ts +4 -2
  9. package/dist/headless-events.js +14 -34
  10. package/dist/help-text.js +5 -0
  11. package/dist/loader.js +6 -4
  12. package/dist/mcp-server.js +2 -1
  13. package/dist/models-resolver.d.ts +3 -13
  14. package/dist/models-resolver.js +3 -22
  15. package/dist/register-agent-bundles.d.ts +11 -2
  16. package/dist/register-agent-bundles.js +18 -4
  17. package/dist/resource-loader.d.ts +10 -5
  18. package/dist/resource-loader.js +123 -20
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +5 -4
  21. package/dist/resources/extensions/ask-user-questions.js +81 -25
  22. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  23. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  24. package/dist/resources/extensions/async-jobs/index.js +65 -0
  25. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  26. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  27. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  28. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  29. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  30. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  31. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  32. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  33. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  34. package/dist/resources/extensions/browser-tools/index.js +69 -12
  35. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  36. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +546 -426
  37. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -0
  38. package/dist/resources/extensions/github-sync/templates.js +3 -3
  39. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  40. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  41. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  42. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  43. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  44. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  45. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  46. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  47. package/dist/resources/extensions/gsd/auto/loop.js +80 -56
  48. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  49. package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
  50. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  51. package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
  52. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  53. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  54. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  55. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  56. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  57. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  58. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  59. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  60. package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
  61. package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
  62. package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
  63. package/dist/resources/extensions/gsd/auto-prompts.js +161 -26
  64. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  65. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  66. package/dist/resources/extensions/gsd/auto-start.js +59 -52
  67. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  68. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  69. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  70. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
  71. package/dist/resources/extensions/gsd/auto-verification.js +30 -37
  72. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  73. package/dist/resources/extensions/gsd/auto-worktree.js +68 -370
  74. package/dist/resources/extensions/gsd/auto.js +71 -29
  75. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  76. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  77. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  78. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +74 -50
  79. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  80. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  81. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  82. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +316 -161
  83. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
  84. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  85. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  86. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  87. package/dist/resources/extensions/gsd/captures.js +5 -15
  88. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  89. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  90. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  91. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  92. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  93. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  94. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  95. package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
  96. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  97. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  98. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  99. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  100. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  101. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  102. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  103. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  104. package/dist/resources/extensions/gsd/constants.js +0 -2
  105. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  106. package/dist/resources/extensions/gsd/db/engine.js +757 -0
  107. package/dist/resources/extensions/gsd/db/queries.js +428 -0
  108. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  109. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  110. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  111. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  112. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  113. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  114. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  115. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  116. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  117. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  118. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  119. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  120. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  121. package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
  122. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  123. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  124. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  125. package/dist/resources/extensions/gsd/doctor.js +16 -9
  126. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  127. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  128. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  129. package/dist/resources/extensions/gsd/files.js +33 -19
  130. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  131. package/dist/resources/extensions/gsd/git-service.js +1 -0
  132. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  133. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  134. package/dist/resources/extensions/gsd/gsd-db.js +186 -2048
  135. package/dist/resources/extensions/gsd/guidance.js +158 -0
  136. package/dist/resources/extensions/gsd/guided-flow.js +174 -473
  137. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  138. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  139. package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
  140. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  141. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  142. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  143. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  144. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  145. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  146. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  147. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  148. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  149. package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
  150. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  151. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  152. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  153. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  154. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  155. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  156. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  157. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  158. package/dist/resources/extensions/gsd/model-router.js +3 -0
  159. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  160. package/dist/resources/extensions/gsd/notifications.js +12 -7
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  162. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  163. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  164. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  165. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  166. package/dist/resources/extensions/gsd/paths.js +37 -24
  167. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  168. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  169. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  170. package/dist/resources/extensions/gsd/preferences.js +161 -29
  171. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  172. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  173. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
  174. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  175. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  176. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  177. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  178. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  179. package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  180. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  181. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  182. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  183. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  184. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  185. package/dist/resources/extensions/gsd/prompts/system.md +6 -3
  186. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  187. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  188. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  189. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  190. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  191. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  192. package/dist/resources/extensions/gsd/publication.js +87 -0
  193. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  194. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  195. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  196. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  197. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  198. package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
  199. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  200. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  201. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  202. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  203. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  204. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  205. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  206. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  207. package/dist/resources/extensions/gsd/state.js +24 -26
  208. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  209. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  210. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  211. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  212. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  213. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  214. package/dist/resources/extensions/gsd/tool-contract.js +66 -11
  215. package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
  216. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  217. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  218. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  219. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  220. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  221. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  222. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  223. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  224. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  225. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
  226. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  227. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  228. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  229. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  230. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  231. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  232. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  233. package/dist/resources/extensions/gsd/uat-policy.js +57 -25
  234. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  235. package/dist/resources/extensions/gsd/undo.js +8 -7
  236. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  237. package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
  238. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  239. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  240. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  241. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  242. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  243. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  244. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  245. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  246. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  247. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  248. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  249. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  250. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  251. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  252. package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
  253. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  254. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  255. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  256. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  257. package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
  258. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  259. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  260. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  261. package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
  262. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  263. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  264. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  265. package/dist/resources/extensions/gsd/worktree.js +8 -1
  266. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  267. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  268. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  269. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  270. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  271. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  272. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  273. package/dist/resources/shared/package-manager-detection.js +1 -1
  274. package/dist/resources/shared/package.json +3 -0
  275. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  276. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  277. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  278. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  279. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  280. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  281. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  282. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  283. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  284. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  285. package/dist/runtime-checks.d.ts +10 -0
  286. package/dist/runtime-checks.js +27 -0
  287. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  288. package/dist/update-check.d.ts +2 -0
  289. package/dist/update-check.js +24 -1
  290. package/dist/update-cmd.js +40 -3
  291. package/dist/web/standalone/.next/BUILD_ID +1 -1
  292. package/dist/web/standalone/.next/app-path-routes-manifest.json +4 -4
  293. package/dist/web/standalone/.next/build-manifest.json +3 -3
  294. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  295. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  296. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  297. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  298. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  299. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  300. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  301. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  302. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  303. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  304. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  305. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  306. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  307. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  308. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  309. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  310. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  311. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  312. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  313. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  314. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  315. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  316. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  317. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  318. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  319. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  320. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  321. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  322. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  323. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  324. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  325. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  326. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  327. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  328. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  329. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  330. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  331. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  332. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  333. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  334. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  335. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  336. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  337. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  338. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  339. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  340. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  341. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  344. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  345. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  347. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  348. package/dist/web/standalone/.next/server/app/index.html +1 -1
  349. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  350. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  351. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  352. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  353. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  354. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  355. package/dist/web/standalone/.next/server/app-paths-manifest.json +4 -4
  356. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  357. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  358. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  359. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  360. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  362. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  363. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  364. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  365. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  366. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  367. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  368. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  369. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
  370. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  371. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  372. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  373. package/dist/web/standalone/package.json +1 -1
  374. package/dist/web-mode.d.ts +2 -0
  375. package/dist/web-mode.js +20 -8
  376. package/dist/worktree-cli.js +3 -6
  377. package/dist/worktree-status-banner.js +7 -11
  378. package/package.json +4 -3
  379. package/packages/cloud-mcp-gateway/package.json +2 -2
  380. package/packages/contracts/dist/rpc.d.ts +1 -0
  381. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  382. package/packages/contracts/dist/rpc.js.map +1 -1
  383. package/packages/contracts/dist/workflow.d.ts +4 -0
  384. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  385. package/packages/contracts/dist/workflow.js.map +1 -1
  386. package/packages/contracts/package.json +1 -1
  387. package/packages/daemon/package.json +4 -4
  388. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  389. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  390. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  391. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  392. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  393. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  394. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  395. package/packages/gsd-agent-core/package.json +5 -5
  396. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  397. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  398. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  399. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  401. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +58 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  405. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  407. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  409. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +113 -40
  410. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  411. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  412. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  413. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  414. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  415. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  416. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  417. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  418. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  419. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  420. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  421. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  422. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  423. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  424. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  425. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  426. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  427. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  428. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  429. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  430. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  431. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  432. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  433. package/packages/gsd-agent-modes/package.json +7 -7
  434. package/packages/mcp-server/README.md +12 -3
  435. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  436. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  437. package/packages/mcp-server/dist/cli-runner.js +137 -0
  438. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  439. package/packages/mcp-server/dist/cli.js +2 -50
  440. package/packages/mcp-server/dist/cli.js.map +1 -1
  441. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  442. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  443. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  444. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  445. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  446. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  447. package/packages/mcp-server/dist/pid-registry.js +452 -0
  448. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  449. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  450. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  451. package/packages/mcp-server/dist/probe-mode.js +10 -0
  452. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  453. package/packages/mcp-server/dist/server.d.ts +10 -0
  454. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  455. package/packages/mcp-server/dist/server.js +12 -0
  456. package/packages/mcp-server/dist/server.js.map +1 -1
  457. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  458. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  459. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  460. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  461. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  462. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  463. package/packages/mcp-server/dist/workflow-tools.js +209 -103
  464. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  465. package/packages/mcp-server/package.json +5 -4
  466. package/packages/native/package.json +1 -1
  467. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  468. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  469. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  470. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  471. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  472. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  473. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  474. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  475. package/packages/pi-agent-core/dist/index.js +3 -0
  476. package/packages/pi-agent-core/dist/index.js.map +1 -1
  477. package/packages/pi-agent-core/package.json +1 -1
  478. package/packages/pi-ai/README.md +1 -0
  479. package/packages/pi-ai/dist/index.d.ts +2 -0
  480. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  481. package/packages/pi-ai/dist/index.js +2 -0
  482. package/packages/pi-ai/dist/index.js.map +1 -1
  483. package/packages/pi-ai/dist/models.generated.d.ts +183 -76
  484. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  485. package/packages/pi-ai/dist/models.generated.js +193 -112
  486. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  487. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  488. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  489. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  490. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  491. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  492. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  493. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  494. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  495. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  496. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  497. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  498. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  499. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  500. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  501. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  502. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  503. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  504. package/packages/pi-ai/package.json +3 -2
  505. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  506. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  507. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  508. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  511. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  513. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  514. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  516. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  517. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  518. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  520. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  521. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  522. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  524. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/index.js +1 -1
  526. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  529. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  530. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  531. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  533. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  534. package/packages/pi-coding-agent/package.json +7 -7
  535. package/packages/pi-tui/dist/components/input.js +1 -1
  536. package/packages/pi-tui/dist/components/input.js.map +1 -1
  537. package/packages/pi-tui/dist/index.d.ts +1 -1
  538. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  539. package/packages/pi-tui/dist/index.js +1 -1
  540. package/packages/pi-tui/dist/index.js.map +1 -1
  541. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  542. package/packages/pi-tui/dist/keys.js +39 -30
  543. package/packages/pi-tui/dist/keys.js.map +1 -1
  544. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  546. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  547. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  548. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  549. package/packages/pi-tui/dist/terminal-image.js +54 -2
  550. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  551. package/packages/pi-tui/dist/tui.d.ts +8 -0
  552. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  553. package/packages/pi-tui/dist/tui.js +72 -18
  554. package/packages/pi-tui/dist/tui.js.map +1 -1
  555. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  556. package/packages/pi-tui/dist/utils.js +110 -36
  557. package/packages/pi-tui/dist/utils.js.map +1 -1
  558. package/packages/pi-tui/package.json +2 -2
  559. package/packages/rpc-client/package.json +2 -2
  560. package/pkg/dist/theme/theme.d.ts.map +1 -1
  561. package/pkg/dist/theme/theme.js +45 -17
  562. package/pkg/dist/theme/theme.js.map +1 -1
  563. package/pkg/package.json +1 -1
  564. package/src/resources/GSD-WORKFLOW.md +5 -4
  565. package/src/resources/extensions/ask-user-questions.ts +94 -26
  566. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  567. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  568. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  569. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  570. package/src/resources/extensions/async-jobs/index.ts +79 -0
  571. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  572. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  573. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  574. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  575. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  576. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  577. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  578. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  579. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  580. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  581. package/src/resources/extensions/browser-tools/index.ts +71 -13
  582. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  583. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  584. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  585. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  586. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +651 -483
  587. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
  588. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -0
  589. package/src/resources/extensions/github-sync/templates.ts +3 -3
  590. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  591. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  592. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  593. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  594. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  595. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  596. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  597. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  598. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  599. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  600. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  601. package/src/resources/extensions/gsd/auto/loop.ts +89 -61
  602. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  603. package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
  604. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  605. package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
  606. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  607. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  608. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  609. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  610. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  611. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  612. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  613. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  614. package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
  615. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
  616. package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
  617. package/src/resources/extensions/gsd/auto-prompts.ts +225 -44
  618. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  619. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  620. package/src/resources/extensions/gsd/auto-start.ts +65 -53
  621. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  622. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  623. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  624. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
  625. package/src/resources/extensions/gsd/auto-verification.ts +33 -36
  626. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  627. package/src/resources/extensions/gsd/auto-worktree.ts +83 -386
  628. package/src/resources/extensions/gsd/auto.ts +99 -34
  629. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  630. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  631. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  632. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +93 -49
  633. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  634. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  635. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  636. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +375 -177
  637. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
  638. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  639. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  640. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  641. package/src/resources/extensions/gsd/captures.ts +5 -16
  642. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  643. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  644. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  645. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  646. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  647. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  648. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  649. package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
  650. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  651. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  652. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  653. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  654. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  655. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  656. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  657. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  658. package/src/resources/extensions/gsd/constants.ts +0 -3
  659. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  660. package/src/resources/extensions/gsd/db/engine.ts +811 -0
  661. package/src/resources/extensions/gsd/db/queries.ts +519 -0
  662. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  663. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  664. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  665. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  666. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  667. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  668. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  669. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  670. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  671. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  672. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  673. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  674. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  675. package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
  676. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  677. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  678. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  679. package/src/resources/extensions/gsd/doctor.ts +15 -5
  680. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  681. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  682. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  683. package/src/resources/extensions/gsd/files.ts +33 -12
  684. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  685. package/src/resources/extensions/gsd/git-service.ts +1 -0
  686. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  687. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  688. package/src/resources/extensions/gsd/gsd-db.ts +190 -2375
  689. package/src/resources/extensions/gsd/guidance.ts +217 -0
  690. package/src/resources/extensions/gsd/guided-flow.ts +240 -585
  691. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  692. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  693. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
  694. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  695. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  696. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  697. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  698. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  699. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  700. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  701. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  702. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  703. package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
  704. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  705. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  706. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  707. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  708. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  709. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  710. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  711. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  712. package/src/resources/extensions/gsd/model-router.ts +3 -0
  713. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  714. package/src/resources/extensions/gsd/notifications.ts +13 -6
  715. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  716. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  717. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  718. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  719. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  720. package/src/resources/extensions/gsd/paths.ts +42 -22
  721. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  722. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  723. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  724. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  725. package/src/resources/extensions/gsd/preferences.ts +191 -28
  726. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  727. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -4
  728. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
  729. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  730. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  731. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
  732. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  733. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  734. package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
  735. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  736. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  737. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  738. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  739. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  740. package/src/resources/extensions/gsd/prompts/system.md +6 -3
  741. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  742. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  743. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  744. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  745. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  746. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  747. package/src/resources/extensions/gsd/publication.ts +122 -0
  748. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  749. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  750. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  751. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  752. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  753. package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
  754. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  755. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  756. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  757. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  758. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  759. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  760. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  761. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  762. package/src/resources/extensions/gsd/state.ts +31 -27
  763. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  764. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  765. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  766. package/src/resources/extensions/gsd/templates/project.md +1 -0
  767. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  768. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  769. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  770. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  771. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  773. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
  774. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  775. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  776. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  777. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
  778. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  779. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
  780. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  782. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  783. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  784. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  785. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  786. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  787. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  788. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  789. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  790. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  791. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  792. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  793. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  794. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  795. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  796. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  797. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  798. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  799. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  800. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  801. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  802. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  803. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  804. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  805. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  806. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  807. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  808. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  809. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  810. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  811. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  812. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  813. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  814. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  815. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  816. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  817. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  818. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  819. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  820. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  821. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  822. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  823. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  824. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  825. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  826. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  827. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  828. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  829. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  830. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  831. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
  832. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  833. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  834. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  835. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  836. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  837. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  838. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  839. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  840. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  841. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  842. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  843. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
  844. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  845. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  846. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  847. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  848. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  849. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  850. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  851. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  852. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  853. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  854. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  855. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  856. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  857. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  858. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  859. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  860. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  861. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  862. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  863. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  864. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  865. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  866. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  867. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  868. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  869. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +56 -2
  870. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  871. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  872. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +11 -4
  873. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  874. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  875. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  876. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  877. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  878. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  879. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  880. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  881. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +51 -2
  882. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  883. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  884. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  885. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +300 -41
  886. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  887. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  888. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
  889. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  890. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  891. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  892. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  893. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  894. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  895. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  896. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  897. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  898. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  899. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  900. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  901. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
  902. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  903. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
  904. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  905. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  906. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  907. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  908. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  909. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  910. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  911. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  912. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
  913. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  914. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  915. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  916. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  917. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  918. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  919. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  920. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  921. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  922. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  923. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  924. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  925. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  926. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
  927. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  928. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
  929. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  930. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  931. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  932. package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
  933. package/src/resources/extensions/gsd/tool-contract.ts +124 -11
  934. package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
  935. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  936. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  937. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  938. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  939. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  940. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  941. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  942. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  943. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  944. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
  945. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  946. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  947. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  948. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  949. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  950. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  951. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  952. package/src/resources/extensions/gsd/uat-policy.ts +80 -25
  953. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  954. package/src/resources/extensions/gsd/undo.ts +9 -8
  955. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  956. package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
  957. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  958. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  959. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  960. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  961. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  962. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  963. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  964. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  965. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  966. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  967. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  968. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  969. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  970. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  971. package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
  972. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  973. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  974. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  975. package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
  976. package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
  977. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  978. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  979. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  980. package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
  981. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  982. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  983. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  984. package/src/resources/extensions/gsd/worktree.ts +7 -1
  985. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  986. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  987. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  988. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  989. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  990. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  991. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  992. package/src/resources/shared/package-manager-detection.ts +1 -1
  993. package/src/resources/shared/package.json +3 -0
  994. package/src/resources/skills/create-skill/SKILL.md +3 -0
  995. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  996. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  997. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  998. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  999. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  1000. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  1001. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  1002. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  1003. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  1004. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
  1005. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  1006. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  1007. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  1008. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  1009. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  1010. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  1011. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  1012. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
  1013. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
  1014. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  1015. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  1016. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_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,9 +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";
52
+ import { _setAutoActiveForTest } from "../../gsd/auto.ts";
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";
41
56
 
42
57
  // ---------------------------------------------------------------------------
43
58
  // Env helpers — `GSD_WORKFLOW_MCP_*` save/restore
@@ -58,6 +73,7 @@ const WORKFLOW_MCP_ENV_KEYS = [
58
73
  "GSD_WORKFLOW_MCP_ARGS",
59
74
  "GSD_WORKFLOW_MCP_ENV",
60
75
  "GSD_WORKFLOW_MCP_CWD",
76
+ "GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS",
61
77
  "GSD_PROJECT_ROOT",
62
78
  "GSD_WORKFLOW_PROJECT_ROOT",
63
79
  ] as const;
@@ -352,6 +368,114 @@ describe("stream-adapter — image prompt forwarding (#4183)", () => {
352
368
  parent_tool_use_id: null,
353
369
  });
354
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
+ });
355
479
  });
356
480
 
357
481
  // ---------------------------------------------------------------------------
@@ -457,6 +581,33 @@ describe("stream-adapter — no transcript fabrication (#4102)", () => {
457
581
  assert.ok(!prompt.includes("mcp__gsd-workflow__<tool_name>"));
458
582
  });
459
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
+
460
611
  test("buildPromptFromContext does not advertise workflow MCP tools when unavailable", () => {
461
612
  const context: Context = {
462
613
  messages: [{ role: "user", content: "Check status" } as Message],
@@ -756,6 +907,91 @@ describe("stream-adapter — Claude Code external tool results", () => {
756
907
  assert.deepEqual(finalContent[1], { type: "text", text: "All done." });
757
908
  });
758
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
+
759
995
  test("buildFinalAssistantContent keeps final-turn tool calls when result arrives without a synthetic user boundary", () => {
760
996
  const finalContent = buildFinalAssistantContent({
761
997
  intermediateToolBlocks: [],
@@ -790,6 +1026,33 @@ describe("stream-adapter — Claude Code external tool results", () => {
790
1026
  });
791
1027
  });
792
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
+
793
1056
  describe("stream-adapter — session persistence (#2859)", () => {
794
1057
  test("buildSdkOptions enables persistSession by default", () => {
795
1058
  const options = buildSdkOptions("claude-sonnet-4-20250514", "test prompt");
@@ -1022,7 +1285,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1022
1285
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1023
1286
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1024
1287
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, "/tmp/project");
1025
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1288
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1026
1289
  assert.deepEqual(options.allowedTools, [
1027
1290
  "Read",
1028
1291
  "Write",
@@ -1043,6 +1306,31 @@ describe("stream-adapter — session persistence (#2859)", () => {
1043
1306
  }
1044
1307
  });
1045
1308
 
1309
+ test("buildSdkOptions can disable workflow MCP ask_user_questions explicitly", () => {
1310
+ const restore = setWorkflowMcpEnv({
1311
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1312
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1313
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1314
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1315
+ GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0",
1316
+ });
1317
+ const originalCwd = process.cwd();
1318
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-ask-disabled-"));
1319
+ try {
1320
+ process.chdir(emptyDir);
1321
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
1322
+ assert.ok(
1323
+ (options.disallowedTools as string[]).includes("mcp__gsd-workflow__ask_user_questions"),
1324
+ "explicit opt-out must block the MCP question tool even when workflow wildcard is allowed",
1325
+ );
1326
+ assert.ok((options.disallowedTools as string[]).includes("AskUserQuestion"));
1327
+ } finally {
1328
+ process.chdir(originalCwd);
1329
+ rmSync(emptyDir, { recursive: true, force: true });
1330
+ restore();
1331
+ }
1332
+ });
1333
+
1046
1334
  test("buildSdkOptions scopes run-uat to exact workflow MCP tools", () => {
1047
1335
  const restore = setWorkflowMcpEnv({
1048
1336
  GSD_WORKFLOW_MCP_COMMAND: "node",
@@ -1117,8 +1405,8 @@ describe("stream-adapter — session persistence (#2859)", () => {
1117
1405
  "plan-milestone must expose exact milestone status helper before ToolSearch is needed",
1118
1406
  );
1119
1407
  assert.ok(
1120
- allowedTools.includes("mcp__gsd-workflow__*"),
1121
- "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",
1122
1410
  );
1123
1411
  assert.ok((options.disallowedTools as string[]).includes("AskUserQuestion"));
1124
1412
  assert.equal(options.strictMcpConfig, true);
@@ -1130,6 +1418,121 @@ describe("stream-adapter — session persistence (#2859)", () => {
1130
1418
  }
1131
1419
  });
1132
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
+
1133
1536
  test("inferGsdPhaseFromContext recognizes non-UAT unit prompts", () => {
1134
1537
  const context = {
1135
1538
  messages: [
@@ -1140,6 +1543,85 @@ describe("stream-adapter — session persistence (#2859)", () => {
1140
1543
  assert.equal(inferGsdPhaseFromContext(context), "plan-milestone");
1141
1544
  });
1142
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
+
1593
+ test("buildSdkOptions presents ask_user_questions for discuss phases", () => {
1594
+ const restore = setWorkflowMcpEnv({
1595
+ GSD_WORKFLOW_MCP_COMMAND: "node",
1596
+ GSD_WORKFLOW_MCP_NAME: "gsd-workflow",
1597
+ GSD_WORKFLOW_MCP_ARGS: JSON.stringify(["packages/mcp-server/dist/cli.js"]),
1598
+ GSD_WORKFLOW_MCP_ENV: JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" }),
1599
+ GSD_WORKFLOW_MCP_CWD: "/tmp/project",
1600
+ });
1601
+ const originalCwd = process.cwd();
1602
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-discuss-"));
1603
+ try {
1604
+ process.chdir(emptyDir);
1605
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test", undefined, { gsdPhase: "discuss-milestone" });
1606
+ const allowedTools = options.allowedTools as string[];
1607
+ const disallowedTools = options.disallowedTools as string[];
1608
+
1609
+ assert.ok(
1610
+ allowedTools.includes("mcp__gsd-workflow__ask_user_questions"),
1611
+ "discuss phases must expose the exact workflow MCP question tool",
1612
+ );
1613
+ assert.ok(disallowedTools.includes("AskUserQuestion"));
1614
+ assert.ok(
1615
+ !disallowedTools.includes("mcp__gsd-workflow__ask_user_questions"),
1616
+ "workflow MCP ask_user_questions should remain enabled by default",
1617
+ );
1618
+ } finally {
1619
+ process.chdir(originalCwd);
1620
+ rmSync(emptyDir, { recursive: true, force: true });
1621
+ restore();
1622
+ }
1623
+ });
1624
+
1143
1625
  test("buildSdkOptions prefers custom workflow MCP question tools over native AskUserQuestion", () => {
1144
1626
  const restore = setWorkflowMcpEnv({
1145
1627
  GSD_WORKFLOW_MCP_COMMAND: "node",
@@ -1157,7 +1639,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1157
1639
  const mcpServers = options.mcpServers as Record<string, any>;
1158
1640
  assert.ok(mcpServers?.["custom-workflow"], "expected custom workflow server config");
1159
1641
  assert.ok(mcpServers?.["gsd-browser"], "expected gsd-browser server config");
1160
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1642
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1161
1643
  assert.deepEqual(options.allowedTools, [
1162
1644
  "Read",
1163
1645
  "Write",
@@ -1203,7 +1685,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1203
1685
  if (mcpServers) {
1204
1686
  assert.ok(mcpServers["gsd-workflow"], "if present, must include gsd-workflow");
1205
1687
  assert.ok(mcpServers["gsd-browser"], "if present, must include gsd-browser");
1206
- assert.deepEqual((options as any).disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1688
+ assert.deepEqual((options as any).disallowedTools, ["AskUserQuestion"]);
1207
1689
  } else {
1208
1690
  assert.deepEqual((options as any).disallowedTools, ["ToolSearch"]);
1209
1691
  }
@@ -1245,7 +1727,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1245
1727
  assert.equal(srv.env.GSD_CLI_PATH, "/tmp/gsd");
1246
1728
  assert.equal(srv.env.GSD_PERSIST_WRITE_GATE_STATE, "1");
1247
1729
  assert.equal(srv.env.GSD_WORKFLOW_PROJECT_ROOT, resolvedRepoDir);
1248
- assert.deepEqual(options.disallowedTools, ["ToolSearch", "AskUserQuestion"]);
1730
+ assert.deepEqual(options.disallowedTools, ["AskUserQuestion"]);
1249
1731
  } finally {
1250
1732
  process.chdir(originalCwd);
1251
1733
  rmSync(repoDir, { recursive: true, force: true });
@@ -1315,7 +1797,7 @@ describe("stream-adapter — session persistence (#2859)", () => {
1315
1797
  const allowedTools = options.allowedTools as string[];
1316
1798
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_plan_milestone"));
1317
1799
  assert.ok(allowedTools.includes("mcp__gsd-workflow__gsd_milestone_status"));
1318
- assert.ok(allowedTools.includes("mcp__gsd-workflow__*"));
1800
+ assert.ok(!allowedTools.includes("mcp__gsd-workflow__*"));
1319
1801
  } finally {
1320
1802
  process.chdir(originalCwd);
1321
1803
  rmSync(projectDir, { recursive: true, force: true });
@@ -1430,6 +1912,277 @@ describe("stream-adapter — session persistence (#2859)", () => {
1430
1912
  });
1431
1913
  });
1432
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
+
1433
2186
  describe("stream-adapter — MCP elicitation bridge", () => {
1434
2187
  const askUserQuestionsRequest = {
1435
2188
  serverName: "gsd-workflow",
@@ -1662,6 +2415,26 @@ describe("stream-adapter — MCP elicitation bridge", () => {
1662
2415
  });
1663
2416
  });
1664
2417
 
2418
+ test("createClaudeCodeElicitationHandler returns cancel when custom UI is dismissed", async () => {
2419
+ let selectCalls = 0;
2420
+ const handler = createClaudeCodeElicitationHandler({
2421
+ custom: async () => ({
2422
+ endInterview: false,
2423
+ answers: {},
2424
+ }),
2425
+ select: async () => {
2426
+ selectCalls++;
2427
+ return "Cloud-synced";
2428
+ },
2429
+ } as any);
2430
+ assert.ok(handler);
2431
+
2432
+ const result = await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2433
+
2434
+ assert.deepEqual(result, { action: "cancel" });
2435
+ assert.equal(selectCalls, 0, "dismissed custom question must not re-open dialog fallback");
2436
+ });
2437
+
1665
2438
  test("parseTextInputElicitation recognizes secure free-text MCP forms", () => {
1666
2439
  const request = {
1667
2440
  serverName: "gsd-workflow",
@@ -1773,6 +2546,166 @@ describe("stream-adapter — MCP elicitation bridge", () => {
1773
2546
  assert.equal(inputCalls.length, 1);
1774
2547
  assert.equal(inputCalls[0]?.opts?.secure, true, "secure_env_collect fields should request secure input");
1775
2548
  });
2549
+
2550
+ // -- self-cancel loop fix (#2676 / claude-code-cli) ----------------------
2551
+ //
2552
+ // Under claude-code-cli, ask_user_questions arrives as an SDK elicitation,
2553
+ // not an MCP tool dispatch, so the auto-mode watchdogs never saw an in-flight
2554
+ // tool during the human wait and re-dispatched/aborted the turn hosting the
2555
+ // question (the "self-cancel loop"). The fix brackets the human wait with the
2556
+ // interactive-tool guard and disambiguates a system-teardown abort (decline)
2557
+ // from a deliberate user dismissal (cancel).
2558
+
2559
+ test("makes the SDK elicitation visible to the interactive-tool guard during the human wait", async () => {
2560
+ _setAutoActiveForTest(true);
2561
+ clearInFlightTools();
2562
+ try {
2563
+ let countDuringWait = -1;
2564
+ let interactiveDuringWait = false;
2565
+ const handler = createClaudeCodeElicitationHandler({
2566
+ custom: async () => {
2567
+ // Observe the in-flight guard state WHILE the question is open —
2568
+ // this is the window where the watchdogs previously saw 0 tools.
2569
+ countDuringWait = getInFlightToolCount();
2570
+ interactiveDuringWait = hasInteractiveToolInFlight();
2571
+ return {
2572
+ endInterview: false,
2573
+ answers: { storage_scope: { selected: "Cloud-synced", notes: "" }, platform: { selected: ["Web"], notes: "" } },
2574
+ };
2575
+ },
2576
+ } as any);
2577
+ assert.ok(handler);
2578
+
2579
+ const result = await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2580
+
2581
+ assert.equal(countDuringWait, 1, "elicitation must register as an in-flight tool during the human wait");
2582
+ assert.equal(interactiveDuringWait, true, "elicitation must be recognized as an interactive tool during the wait");
2583
+ assert.equal(result.action, "accept");
2584
+ assert.equal(getInFlightToolCount(), 0, "in-flight tool must be cleared after the elicitation resolves");
2585
+ } finally {
2586
+ _setAutoActiveForTest(false);
2587
+ clearInFlightTools();
2588
+ }
2589
+ });
2590
+
2591
+ test("clears the in-flight tool even when the interview UI throws (finally)", async () => {
2592
+ _setAutoActiveForTest(true);
2593
+ clearInFlightTools();
2594
+ try {
2595
+ const handler = createClaudeCodeElicitationHandler({
2596
+ // custom throws -> showInterviewRound rejects -> handler falls back
2597
+ // to dialogs; the in-flight entry must still be cleared via finally.
2598
+ custom: async () => {
2599
+ throw new Error("simulated UI failure");
2600
+ },
2601
+ select: async (_title: string, options: string[], opts?: { allowMultiple?: boolean }) => {
2602
+ if (opts?.allowMultiple) return ["Web"];
2603
+ return options[0];
2604
+ },
2605
+ input: async () => "note",
2606
+ } as any);
2607
+ assert.ok(handler);
2608
+
2609
+ await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2610
+ assert.equal(getInFlightToolCount(), 0, "in-flight tool must be cleared even when the UI throws");
2611
+ } finally {
2612
+ _setAutoActiveForTest(false);
2613
+ clearInFlightTools();
2614
+ }
2615
+ });
2616
+
2617
+ test("returns decline (not cancel) when an interrupt empties the answers", async () => {
2618
+ // A system/host teardown that aborts the signal mid-wait surfaces as
2619
+ // interrupted:true -> the handler must return decline so the model does
2620
+ // not re-ask against a clean user-declined cancel (the re-ask amplifier).
2621
+ const handler = createClaudeCodeElicitationHandler({
2622
+ custom: async () => ({ endInterview: false, answers: {}, interrupted: true }),
2623
+ select: async () => {
2624
+ throw new Error("interrupted elicitation must not re-open dialogs");
2625
+ },
2626
+ } as any);
2627
+ assert.ok(handler);
2628
+
2629
+ const result = await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2630
+ assert.deepEqual(result, { action: "decline" });
2631
+ });
2632
+
2633
+ test("returns cancel (today's semantics) when the user genuinely dismisses", async () => {
2634
+ const handler = createClaudeCodeElicitationHandler({
2635
+ custom: async () => ({ endInterview: false, answers: {} }),
2636
+ } as any);
2637
+ assert.ok(handler);
2638
+
2639
+ const result = await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2640
+ assert.deepEqual(result, { action: "cancel" });
2641
+ });
2642
+
2643
+ test("does not register an in-flight tool outside auto-mode (wrapper self-gates)", async () => {
2644
+ _setAutoActiveForTest(false);
2645
+ clearInFlightTools();
2646
+ let countDuringWait = -1;
2647
+ const handler = createClaudeCodeElicitationHandler({
2648
+ custom: async () => {
2649
+ countDuringWait = getInFlightToolCount();
2650
+ return { endInterview: false, answers: { storage_scope: { selected: "Cloud-synced", notes: "" }, platform: { selected: ["Web"], notes: "" } } };
2651
+ },
2652
+ } as any);
2653
+ assert.ok(handler);
2654
+
2655
+ await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2656
+ assert.equal(countDuringWait, 0, "foreground/non-auto elicitation must not touch the in-flight guard");
2657
+ });
2658
+
2659
+ // The FOREGROUND self-cancel regression guard: the s.active-gated in-flight
2660
+ // guard above is a no-op in foreground, so the foreground approval-gate pause
2661
+ // path needs a SEPARATE, ungated signal to see the elicitation as the active
2662
+ // human boundary. isInteractiveElicitationInFlight() must be true DURING the
2663
+ // wait and false after, even with auto inactive (#cc-elicitation-self-cancel).
2664
+ test("sets the ungated interactive-elicitation marker in FOREGROUND (auto inactive)", async () => {
2665
+ _setAutoActiveForTest(false);
2666
+ clearInFlightTools();
2667
+ try {
2668
+ let markerDuringWait = false;
2669
+ let countDuringWait = -1;
2670
+ const handler = createClaudeCodeElicitationHandler({
2671
+ custom: async () => {
2672
+ markerDuringWait = isInteractiveElicitationInFlight();
2673
+ countDuringWait = getInFlightToolCount();
2674
+ return {
2675
+ endInterview: false,
2676
+ answers: { storage_scope: { selected: "Cloud-synced", notes: "" }, platform: { selected: ["Web"], notes: "" } },
2677
+ };
2678
+ },
2679
+ } as any);
2680
+ assert.ok(handler);
2681
+
2682
+ const result = await handler!(askUserQuestionsRequest, { signal: new AbortController().signal });
2683
+
2684
+ assert.equal(markerDuringWait, true, "ungated marker must be true during the foreground human wait");
2685
+ assert.equal(countDuringWait, 0, "the separate marker must NOT touch the in-flight tool count in foreground");
2686
+ assert.equal(result.action, "accept");
2687
+ assert.equal(isInteractiveElicitationInFlight(), false, "marker must clear after the elicitation resolves");
2688
+ } finally {
2689
+ clearInFlightTools();
2690
+ }
2691
+ });
2692
+
2693
+ test("clears the ungated marker even when the interview UI throws in FOREGROUND (finally)", async () => {
2694
+ _setAutoActiveForTest(false);
2695
+ clearInFlightTools();
2696
+ try {
2697
+ const handler = createClaudeCodeElicitationHandler({
2698
+ custom: async () => {
2699
+ throw new Error("ui exploded");
2700
+ },
2701
+ } as any);
2702
+ assert.ok(handler);
2703
+ await handler!(askUserQuestionsRequest, { signal: new AbortController().signal }).catch(() => undefined);
2704
+ assert.equal(isInteractiveElicitationInFlight(), false, "marker must clear via finally on throw");
2705
+ } finally {
2706
+ clearInFlightTools();
2707
+ }
2708
+ });
1776
2709
  });
1777
2710
 
1778
2711
  // ---------------------------------------------------------------------------