@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
@@ -40,12 +40,12 @@ import { listUnitRuntimeRecords, clearUnitRuntimeRecord, isInFlightRuntimePhase
40
40
  import { resolveExpectedArtifactPath } from "./auto.js";
41
41
  import { gsdHome } from "./gsd-home.js";
42
42
  import {
43
- gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath,
43
+ gsdRoot, milestonesDir, resolveMilestoneFile,
44
44
  resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
45
- relMilestoneFile, relSliceFile, clearPathCache,
45
+ relMilestoneFile, relSliceFile,
46
46
  } from "./paths.js";
47
47
  import { join } from "node:path";
48
- import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync, unlinkSync } from "node:fs";
48
+ import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
49
49
  import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.js";
50
50
  import { nativeAddAll, nativeCommit, nativeHasCommittedHead, nativeIsRepo, nativeInit } from "./native-git-bridge.js";
51
51
  import { isInheritedRepo } from "./repo-identity.js";
@@ -76,13 +76,25 @@ import {
76
76
  countUnmappedActiveRequirements,
77
77
  showRequirementsBacklogReview,
78
78
  } from "./requirements-backlog.js";
79
- import { selectAndApplyModel } from "./auto-model-selection.js";
79
+ import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
80
80
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
81
81
  import {
82
- getWorkflowTransportSupportError,
83
- getRequiredWorkflowToolsForGuidedUnit,
82
+ detectWorkflowMcpLaunchConfig,
83
+ resolveWorkflowMcpProjectRoot,
84
84
  supportsStructuredQuestions,
85
85
  } from "./workflow-mcp.js";
86
+ import { usesWorkflowMcpTransport } from "./question-transport.js";
87
+ import {
88
+ getCachedWorkflowMcpProbe,
89
+ probeAndCacheWorkflowMcp,
90
+ warmWorkflowMcpProbeInBackground,
91
+ workflowMcpProbeAdvertisesSurface,
92
+ WORKFLOW_MCP_PROBE_TIMEOUT_MS,
93
+ } from "./workflow-mcp-readiness-cache.js";
94
+ import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
95
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
96
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
97
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
86
98
  import {
87
99
  runPreparation,
88
100
  formatCodebaseBrief,
@@ -90,7 +102,7 @@ import {
90
102
  } from "./preparation.js";
91
103
  import { verifyExpectedArtifact } from "./auto-recovery.js";
92
104
  import type { MilestoneScope } from "./workspace.js";
93
- import { getPendingGate, extractDepthVerificationMilestoneId } from "./bootstrap/write-gate.js";
105
+ import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
94
106
  import {
95
107
  _getPendingAutoStart,
96
108
  clearPendingAutoStart,
@@ -98,9 +110,14 @@ import {
98
110
  getDiscussionMilestoneId,
99
111
  hasPendingAutoStart,
100
112
  setPendingAutoStart,
101
- type PendingAutoStartEntry,
102
113
  } from "./pending-auto-start.js";
103
114
  import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
115
+ import { checkAutoStartAfterDiscuss, scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
116
+ export {
117
+ maybeHandleEmptyIntentTurn,
118
+ maybeHandleReadyPhraseWithoutFiles,
119
+ resetEmptyTurnCounter,
120
+ } from "./guided-unit-completion.js";
104
121
 
105
122
  export {
106
123
  _getPendingAutoStart,
@@ -108,6 +125,7 @@ export {
108
125
  getDiscussionMilestoneId,
109
126
  setPendingAutoStart,
110
127
  } from "./pending-auto-start.js";
128
+ export { checkAutoStartAfterDiscuss } from "./discussion-handoff.js";
111
129
 
112
130
  export function shouldSkipGitBootstrapAfterInit(result: { gitEnabled?: boolean }): boolean {
113
131
  return result.gitEnabled === false;
@@ -125,7 +143,6 @@ export {
125
143
  buildExistingMilestonesContext,
126
144
  } from "./guided-flow-queue.js";
127
145
  import { logWarning } from "./workflow-logger.js";
128
- import { readManifest } from "./workflow-manifest.js";
129
146
  import { deleteRuntimeKv } from "./db/runtime-kv.js";
130
147
  import { PAUSED_SESSION_KV_KEY } from "./interrupted-session.js";
131
148
  import { buildWorkflowDispatchContent } from "./workflow-protocol.js";
@@ -141,32 +158,6 @@ export interface HeadlessMilestoneCreationOptions {
141
158
  startAutoAfterReady?: boolean;
142
159
  }
143
160
 
144
- type AutoStartOptions = Parameters<typeof startAutoDetached>[4];
145
- type AutoStartLauncher = typeof startAutoDetached;
146
-
147
- function scheduleAutoStartAfterIdle(
148
- ctx: ExtensionCommandContext,
149
- pi: ExtensionAPI,
150
- basePath: string,
151
- verboseMode: boolean,
152
- options?: AutoStartOptions,
153
- launch: AutoStartLauncher = startAutoDetached,
154
- ): void {
155
- const waitForIdle =
156
- typeof (ctx as { waitForIdle?: unknown }).waitForIdle === "function"
157
- ? ctx.waitForIdle.bind(ctx)
158
- : async () => {};
159
- void waitForIdle()
160
- .then(() => {
161
- setTimeout(() => launch(ctx, pi, basePath, verboseMode, options), 0);
162
- })
163
- .catch((err) => {
164
- const message = err instanceof Error ? err.message : String(err);
165
- ctx.ui.notify(`Auto-start failed while waiting for the prior turn to settle: ${message}`, "error");
166
- logWarning("guided", `auto-start idle wait failed: ${message}`);
167
- });
168
- }
169
-
170
161
  export const _scheduleAutoStartAfterIdleForTest = scheduleAutoStartAfterIdle;
171
162
 
172
163
  // ─── Scope-based validator wrappers ──────────────────────────────────────────
@@ -321,116 +312,6 @@ export function _roadmapHasParseableSlicesForTest(
321
312
  return parseRoadmapSlices(roadmapContent).length > 0;
322
313
  }
323
314
 
324
- function hasExecutablePlanForHandoff(milestoneId: string, roadmapFile: string | null): boolean {
325
- if (isDbAvailable()) {
326
- return getMilestoneSlices(milestoneId).length > 0;
327
- }
328
- if (!roadmapFile) return false;
329
- try {
330
- return parseRoadmapSlices(readFileSync(roadmapFile, "utf-8")).length > 0;
331
- } catch (e) {
332
- logWarning(
333
- "guided",
334
- `failed to parse roadmap slices for ${milestoneId}: ${(e as Error).message}`,
335
- );
336
- return false;
337
- }
338
- }
339
-
340
- function formatAcceptedDiscussHandoffMessage(
341
- milestoneId: string,
342
- contextFile: string | null,
343
- hasExecutablePlan: boolean,
344
- ): string {
345
- if (hasExecutablePlan) return `Milestone ${milestoneId} ready.`;
346
- if (contextFile) return `Milestone ${milestoneId} context captured. Continuing the planning pipeline.`;
347
- return `Milestone ${milestoneId} planning artifacts captured. Continuing the planning pipeline.`;
348
- }
349
-
350
- function manifestContainsMilestone(basePath: string, milestoneId: string): boolean {
351
- try {
352
- const manifest = readManifest(basePath);
353
- return (
354
- Array.isArray(manifest?.milestones) &&
355
- manifest.milestones.some(m => m.id === milestoneId)
356
- );
357
- } catch (e) {
358
- logWarning("guided", `R3b: failed to read state manifest: ${(e as Error).message}`);
359
- return false;
360
- }
361
- }
362
-
363
- function notifyDbRowRecoveryFailed(entry: PendingAutoStartEntry): void {
364
- entry.ctx.ui.notify(
365
- `Milestone ${entry.milestoneId}: DB row recovery failed ${entry.r3bRecoveryCount} times. ` +
366
- `Re-run /gsd to reset the recovery counter, or run /gsd-debug to diagnose without resetting.`,
367
- "error",
368
- );
369
- }
370
-
371
- function noteDbRowRecoveryMiss(entry: PendingAutoStartEntry): void {
372
- entry.r3bRecoveryCount += 1;
373
- if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
374
- notifyDbRowRecoveryFailed(entry);
375
- }
376
- }
377
-
378
- function ensureMilestoneRowForAcceptedHandoff(
379
- entry: PendingAutoStartEntry,
380
- contextFile: string | null,
381
- ): boolean {
382
- if (!isDbAvailable()) return true;
383
-
384
- const { basePath, milestoneId } = entry;
385
- const milestoneRow = getMilestone(milestoneId);
386
- if (milestoneRow) return true;
387
-
388
- if (manifestContainsMilestone(basePath, milestoneId)) {
389
- logWarning(
390
- "guided",
391
- `R3b: getMilestone(${milestoneId}) returned null but manifest has the row — treating as stale read`,
392
- );
393
- return true;
394
- }
395
-
396
- if (!contextFile) {
397
- entry.ctx.ui.notify(
398
- `Milestone ${milestoneId}: discuss artifacts on disk but no DB row exists. ` +
399
- `PROJECT.md may have failed to register milestones. ` +
400
- `Re-save PROJECT.md with canonical "- [ ] M001: Title — One-liner" lines, ` +
401
- `then re-run /gsd to recover.`,
402
- "error",
403
- );
404
- return false;
405
- }
406
-
407
- if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
408
- logWarning(
409
- "guided",
410
- `R3b: milestone ${milestoneId} DB-row recovery limit reached ` +
411
- `(${entry.r3bRecoveryCount}/${MAX_DB_ROW_RECOVERIES}); user already notified`,
412
- );
413
- return false;
414
- }
415
-
416
- logWarning(
417
- "guided",
418
- `R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
419
- `(attempt ${entry.r3bRecoveryCount + 1}/${MAX_DB_ROW_RECOVERIES})`,
420
- );
421
-
422
- try {
423
- insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
424
- } catch (e) {
425
- logWarning("guided", `R3b: insertMilestone failed: ${(e as Error).message}`);
426
- }
427
-
428
- if (getMilestone(milestoneId)) return true;
429
-
430
- noteDbRowRecoveryMiss(entry);
431
- return false;
432
- }
433
-
434
315
  // ─── Commit Instruction Helpers ──────────────────────────────────────────────
435
316
 
436
317
  /** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
@@ -451,18 +332,6 @@ interface PendingDeepProjectSetupEntry {
451
332
  currentUnitId?: string;
452
333
  }
453
334
 
454
- // #4573: cap for how many times we nudge the LLM after a premature ready
455
- // phrase before giving up and asking the user to re-run /gsd.
456
- const MAX_READY_REJECTS = 2;
457
-
458
- // Cap failed in-flight DB row repair attempts before escalating to the user.
459
- const MAX_DB_ROW_RECOVERIES = 3;
460
-
461
- // #4573: matches the canonical ready phrase the discuss prompt asks the LLM
462
- // to emit. Accepts any M-prefixed milestone ID (three digits + optional
463
- // suffix) with optional trailing punctuation.
464
- const READY_PHRASE_RE = /\bMilestone\s+M\d{3}[A-Z0-9-]*\s+ready\.?/i;
465
-
466
335
  const pendingDeepProjectSetupMap = new Map<string, PendingDeepProjectSetupEntry>();
467
336
  const USER_DRIVEN_DEEP_SETUP_UNITS = new Set([
468
337
  "discuss-project",
@@ -687,405 +556,6 @@ async function dispatchNextDeepProjectSetupStage(entry: PendingDeepProjectSetupE
687
556
  return true;
688
557
  }
689
558
 
690
- /** Called from agent_end to check if auto-mode should start after discuss */
691
- export function checkAutoStartAfterDiscuss(lookupBasePath?: string): boolean {
692
- const entry = _getPendingAutoStart(lookupBasePath);
693
- if (!entry) return false;
694
-
695
- const { ctx, pi, basePath, milestoneId, step } = entry;
696
-
697
- // Gate 1: Primary milestone must have CONTEXT.md or ROADMAP.md
698
- // The "discuss" path creates CONTEXT.md; the "plan" path creates ROADMAP.md.
699
- // Use pinned scope (immune to cwd-drift) for existence checks.
700
- const contextFilePath = entry.scope.contextFile();
701
- const roadmapFilePath = entry.scope.roadmapFile();
702
- const contextFile = existsSync(contextFilePath) ? contextFilePath : null;
703
- const roadmapFile = existsSync(roadmapFilePath) ? roadmapFilePath : null;
704
- if (!contextFile && !roadmapFile) return false; // neither artifact yet — keep waiting
705
-
706
- // Gate 1a: a depth-verification gate is still pending for THIS milestone — the
707
- // LLM emitted the confirmation question (via ask_user_questions or plain chat)
708
- // but the user has not answered yet. Advancing now would skip the gate and
709
- // race ahead with unverified context.
710
- const basePathForGate = entry.scope.workspace.projectRoot;
711
- const pendingGateId = getPendingGate(basePathForGate);
712
- if (pendingGateId) {
713
- const pendingMilestoneId = extractDepthVerificationMilestoneId(pendingGateId);
714
- // Block advancement if the gate is for THIS milestone, OR if it's a
715
- // project/requirements gate (no milestone id encoded) for the deep setup flow.
716
- const isProjectGate =
717
- pendingGateId === "depth_verification_project_confirm" ||
718
- pendingGateId === "depth_verification_requirements_confirm" ||
719
- pendingGateId === "depth_verification_research_decision_confirm";
720
- if (pendingMilestoneId === milestoneId || isProjectGate) {
721
- return false;
722
- }
723
- }
724
-
725
- // Gate 1b: accept the in-flight discuss handoff. A queued DB row with pinned
726
- // CONTEXT.md is Discussion Complete, Planning Pending, not a plan-blocked
727
- // failure. If the row is missing, only this pending handoff may repair it.
728
- if (!ensureMilestoneRowForAcceptedHandoff(entry, contextFile)) return false;
729
-
730
- // Gate 2: Multi-milestone completeness warning
731
- // Parse PROJECT.md for milestone sequence, warn if any are missing context.
732
- // Don't block — milestones can be intentionally queued without context.
733
- const projectFile = resolveGsdRootFile(basePath, "PROJECT");
734
- let projectIds: string[] = [];
735
- if (projectFile) {
736
- try {
737
- const projectContent = readFileSync(projectFile, "utf-8");
738
- projectIds = parseMilestoneSequenceFromProject(projectContent);
739
- if (projectIds.length > 1) {
740
- const missing = projectIds.filter(id => {
741
- const hasContext = !!resolveMilestoneFile(basePath, id, "CONTEXT");
742
- const hasDraft = !!resolveMilestoneFile(basePath, id, "CONTEXT-DRAFT");
743
- const hasDir = existsSync(join(gsdRoot(basePath), "milestones", id));
744
- return !hasContext && !hasDraft && !hasDir;
745
- });
746
- if (missing.length > 0) {
747
- ctx.ui.notify(
748
- `Multi-milestone validation: ${missing.join(", ")} not found in filesystem. ` +
749
- `Discussion may not have completed all readiness gates.`,
750
- "warning",
751
- );
752
- }
753
- }
754
- } catch (e) { logWarning("guided", `PROJECT.md parsing failed: ${(e as Error).message}`); }
755
- }
756
-
757
- // Gate 3: Discussion manifest process verification (multi-milestone only)
758
- // The LLM writes DISCUSSION-MANIFEST.json after each Phase 3 gate decision.
759
- // When it exists, validate it before auto-starting. Project history alone is
760
- // not a reliable signal for the current discussion mode.
761
- const manifestPath = join(entry.scope.workspace.contract.projectGsd, "DISCUSSION-MANIFEST.json");
762
- if (existsSync(manifestPath)) {
763
- try {
764
- const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
765
- const total = typeof manifest.total === "number" ? manifest.total : 0;
766
- const completed = typeof manifest.gates_completed === "number" ? manifest.gates_completed : 0;
767
-
768
- if (total > 1 && completed < total) {
769
- // Discussion not complete — block auto-start until all gates are done
770
- return false;
771
- }
772
-
773
- // Cross-check manifest milestones against PROJECT.md if available
774
- if (projectIds.length > 0) {
775
- const manifestIds = Object.keys(manifest.milestones ?? {});
776
- const untracked = projectIds.filter(id => !manifestIds.includes(id));
777
- if (untracked.length > 0) {
778
- ctx.ui.notify(
779
- `Discussion manifest missing gates for: ${untracked.join(", ")}`,
780
- "warning",
781
- );
782
- }
783
- }
784
- } catch (e) { logWarning("guided", `discussion manifest verification failed: ${(e as Error).message}`); }
785
- }
786
-
787
- // Draft promotion cleanup: if a CONTEXT-DRAFT.md exists alongside the new
788
- // CONTEXT.md, delete the draft — it's been consumed by the discussion.
789
- try {
790
- const draftFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT-DRAFT");
791
- if (draftFile) unlinkSync(draftFile);
792
- } catch (e) { logWarning("guided", `CONTEXT-DRAFT.md unlink failed: ${(e as Error).message}`); }
793
-
794
- // Cleanup: remove discussion manifest after auto-start (only needed during discussion)
795
- if (existsSync(manifestPath)) {
796
- try { unlinkSync(manifestPath); } catch (e) { logWarning("guided", `manifest unlink failed: ${(e as Error).message}`); }
797
- }
798
-
799
- deletePendingAutoStart(basePath);
800
- const hasExecutablePlan = hasExecutablePlanForHandoff(milestoneId, roadmapFile);
801
- ctx.ui.notify(
802
- formatAcceptedDiscussHandoffMessage(milestoneId, contextFile, hasExecutablePlan),
803
- "success",
804
- );
805
- if (entry.startAuto !== false) {
806
- scheduleAutoStartAfterIdle(ctx, pi, basePath, false, { step: step ?? true });
807
- }
808
- return true;
809
- }
810
-
811
- /**
812
- * Extract the concatenated text content from an assistant message, whether it
813
- * stores content as a string or as an array of text blocks.
814
- */
815
- function extractAssistantText(msg: any): string {
816
- if (!msg) return "";
817
- const content = msg.content;
818
- if (typeof content === "string") return content;
819
- if (!Array.isArray(content)) return "";
820
- const parts: string[] = [];
821
- for (const block of content) {
822
- if (!block || typeof block !== "object") continue;
823
- if (block.type === "text" && typeof block.text === "string") parts.push(block.text);
824
- }
825
- return parts.join("\n");
826
- }
827
-
828
- /**
829
- * Return true if the assistant message contains any tool-use block.
830
- *
831
- * The canonical pi-ai `AssistantMessage.content` (see packages/pi-ai/src/types.ts)
832
- * uses `type: "toolCall"` and `type: "serverToolUse"` for tool invocations —
833
- * every provider (anthropic-direct, claude-code-cli, openai, etc.) normalizes
834
- * incoming tool blocks into these two shapes before they reach guided-flow.
835
- *
836
- * The Anthropic API wire shape `"tool_use"` / `"server_tool_use"` does NOT appear
837
- * in the internal AssistantMessage — those literals are only used when sending
838
- * messages back out to the Anthropic API. Matching them here was a latent bug:
839
- * `hasToolUse` returned `false` for every real tool call, which let the
840
- * empty-turn nudge fire and pre-empt MCP tools that block on the user
841
- * (e.g. `ask_user_questions`). See investigation in PR for #4658.
842
- */
843
- function hasToolUse(msg: any): boolean {
844
- if (!msg) return false;
845
- const content = msg.content;
846
- if (!Array.isArray(content)) return false;
847
- return content.some(
848
- (b: any) =>
849
- b &&
850
- typeof b === "object" &&
851
- (b.type === "toolCall" || b.type === "serverToolUse"),
852
- );
853
- }
854
-
855
- /**
856
- * #4573 — Detect and recover from the "ready phrase without files" failure mode.
857
- *
858
- * When the LLM emits "Milestone {{id}} ready." but has not written the
859
- * milestone CONTEXT/ROADMAP artifacts, `checkAutoStartAfterDiscuss()` silently
860
- * returns false and the next /gsd invocation loops into the "All milestones
861
- * complete" warning.
862
- *
863
- * This function, called from `handleAgentEnd` after `checkAutoStartAfterDiscuss`
864
- * returns false, pattern-matches the ready phrase on the last assistant message.
865
- * If it fired AND neither the canonical M###-CONTEXT.md/M###-ROADMAP.md nor
866
- * legacy CONTEXT.md/ROADMAP.md files exist, it:
867
- * 1. Notifies the user that the signal was rejected.
868
- * 2. Injects a system message via `pi.sendMessage(..., {triggerTurn:true})`
869
- * telling the LLM the signal was premature and to emit the writes now.
870
- * 3. Caps at `MAX_READY_REJECTS` per-entry; beyond that, gives up and asks
871
- * the user to re-run /gsd.
872
- *
873
- * Returns true when a nudge (or give-up) was emitted, signaling the caller to
874
- * skip `resolveAgentEnd`.
875
- */
876
- export function maybeHandleReadyPhraseWithoutFiles(event: { messages: any[] }, lookupBasePath?: string): boolean {
877
- const entry = _getPendingAutoStart(lookupBasePath);
878
- if (!entry) return false;
879
- const { ctx, pi, basePath, milestoneId } = entry;
880
-
881
- // Gate: last assistant message must contain the ready phrase
882
- const lastMsg = event.messages[event.messages.length - 1];
883
- const text = extractAssistantText(lastMsg);
884
- if (!READY_PHRASE_RE.test(text)) return false;
885
-
886
- // Bust paths.ts cached dir listings before checking for fresh writes. The
887
- // LLM's Write tool calls do not invalidate paths.ts caches, so a stale
888
- // listing taken before the milestone dir or its CONTEXT/ROADMAP files
889
- // existed would falsely report the artifacts as missing and trigger the
890
- // 3-strike "ready without files" abort even though the writes succeeded.
891
- clearPathCache();
892
-
893
- // Gate: artifacts must still be missing — if they exist, the happy path
894
- // already fired and we have nothing to do.
895
- const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
896
- const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
897
- if (contextFile || roadmapFile) return false;
898
-
899
- // Diagnostic: when the cached resolver reports both files missing, also probe
900
- // the canonical paths with uncached existsSync so we can tell whether the
901
- // recovery is firing on real-missing files or a path-resolution miss
902
- // (basePath/symlink mismatch, stale cache despite agent-end-recovery flush,
903
- // legacy descriptor dir not matching, etc.).
904
- try {
905
- const mDir = resolveMilestonePath(basePath, milestoneId);
906
- const canonicalCtx = mDir ? join(mDir, `${milestoneId}-CONTEXT.md`) : null;
907
- const canonicalRoadmap = mDir ? join(mDir, `${milestoneId}-ROADMAP.md`) : null;
908
- logWarning(
909
- "guided",
910
- `ready-phrase-reject diagnostic mid=${milestoneId} basePath=${basePath} ` +
911
- `mDir=${mDir ?? "null"} ` +
912
- `canonical-ctx=${canonicalCtx ?? "null"} ctx-exists=${canonicalCtx ? existsSync(canonicalCtx) : "n/a"} ` +
913
- `canonical-roadmap=${canonicalRoadmap ?? "null"} roadmap-exists=${canonicalRoadmap ? existsSync(canonicalRoadmap) : "n/a"}`,
914
- );
915
- } catch (e) {
916
- logWarning("guided", `ready-phrase-reject diagnostic failed: ${(e as Error).message}`);
917
- }
918
-
919
- entry.readyRejectCount = (entry.readyRejectCount ?? 0) + 1;
920
-
921
- if (entry.readyRejectCount > MAX_READY_REJECTS) {
922
- // Give up: clear state and tell the user to re-run /gsd. Avoids an
923
- // infinite nudge loop when the LLM never produces the writes.
924
- deletePendingAutoStart(basePath);
925
- ctx.ui.notify(
926
- `Milestone ${milestoneId}: LLM signaled "ready" ${entry.readyRejectCount} times without writing files. ` +
927
- `Stopping auto-nudge. Run /gsd to try again.`,
928
- "error",
929
- );
930
- return true;
931
- }
932
-
933
- const contextRel = relMilestoneFile(basePath, milestoneId, "CONTEXT");
934
- const roadmapRel = relMilestoneFile(basePath, milestoneId, "ROADMAP");
935
- ctx.ui.notify(
936
- `Milestone ${milestoneId}: "ready" signal rejected — ${contextRel} and ${roadmapRel} are missing. Asking the LLM to complete the writes.`,
937
- "warning",
938
- );
939
-
940
- const nudge =
941
- `You emitted "Milestone ${milestoneId} ready." but neither ` +
942
- `${contextRel} nor ${roadmapRel} exists on disk. ` +
943
- `The ready phrase is a POST-WRITE signal and has been rejected. ` +
944
- `In this turn: (1) write PROJECT.md, REQUIREMENTS.md, and the milestone ` +
945
- `CONTEXT.md, (2) call gsd_plan_milestone, then (3) emit the ready phrase. ` +
946
- `Do not describe these steps — execute them as tool calls. ` +
947
- `This is retry ${entry.readyRejectCount}/${MAX_READY_REJECTS}; further ` +
948
- `premature signals will clear the session.`;
949
-
950
- try {
951
- pi.sendMessage(
952
- { customType: "gsd-ready-no-files", content: nudge, display: false },
953
- { triggerTurn: true },
954
- );
955
- } catch (e) {
956
- logWarning("guided", `ready-phrase nudge sendMessage failed: ${(e as Error).message}`);
957
- return false;
958
- }
959
- return true;
960
- }
961
-
962
- /**
963
- * #4573 — Detect and recover from the "announces tool, never calls it" stall.
964
- *
965
- * The LLM emits text like "I'll now write the CONTEXT.md file" but the turn
966
- * ends with zero tool-use blocks. The harness has no post-turn tool-call
967
- * validation, so the unit promise resolves and the user sees a stalled state.
968
- *
969
- * This function, called from `handleAgentEnd`, inspects the last assistant
970
- * message. If ALL of the following are true, it injects a recovery message:
971
- * - Text-only (no tool-use blocks)
972
- * - Contains a commit-intent phrase ("I'll write", "I'll call", etc.)
973
- * - Auto-mode is active OR a discussion autostart is pending
974
- * - `emptyTurnRetryCount` is under the cap
975
- *
976
- * Per-handler state is held on the `PendingAutoStartEntry` when present, and
977
- * on a module-level map otherwise. The counter resets on any successful
978
- * tool-use turn via `resetEmptyTurnCounter`.
979
- */
980
- const emptyTurnCounterByBase = new Map<string, number>();
981
- const MAX_EMPTY_TURN_RETRIES = 2;
982
-
983
- // Phrases that indicate the LLM is about to do something but has not yet.
984
- // Kept tight to avoid flagging legitimate narration like "I'll wait for your answer."
985
- //
986
- // "make" was previously in the verb list but matches conversational meta phrases
987
- // like "Let me make sure I understand…" which are NOT action announcements —
988
- // removed to prevent the empty-turn nudge from auto-replying to user questions
989
- // in discuss flows.
990
- const COMMIT_INTENT_RE =
991
- /\b(?:I['’]ll|I will|Next,? I['’]ll|Now I['’]ll|Let me|I['’]m going to|I am going to)\s+(?:now\s+)?(?:write|create|call|invoke|update|add|run|execute|generate|produce|emit|compose|implement|save|apply|commit)\b/i;
992
-
993
- /**
994
- * Reset the empty-turn counter for a basePath after a successful tool-use turn.
995
- * Called from handleAgentEnd when the last message contains tool_use blocks.
996
- */
997
- export function resetEmptyTurnCounter(basePath?: string): void {
998
- if (basePath) emptyTurnCounterByBase.delete(basePath);
999
- else emptyTurnCounterByBase.clear();
1000
- }
1001
-
1002
- export function maybeHandleEmptyIntentTurn(
1003
- event: { messages: any[] },
1004
- isAuto: boolean,
1005
- lookupBasePath?: string,
1006
- ): boolean {
1007
- // Gate: only fire when there is system-driven work in flight. Interactive
1008
- // /gsd discuss (user-driven) produces legitimate text-only turns.
1009
- if (!isAuto && !hasPendingAutoStart(lookupBasePath)) return false;
1010
-
1011
- const lastMsg = event.messages[event.messages.length - 1];
1012
- if (!lastMsg) return false;
1013
- if (hasToolUse(lastMsg)) return false;
1014
-
1015
- const text = extractAssistantText(lastMsg).trim();
1016
- if (!text) return false;
1017
-
1018
- // Skip if the LLM is emitting the ready phrase — that is the ready-no-files
1019
- // path, handled by maybeHandleReadyPhraseWithoutFiles.
1020
- if (READY_PHRASE_RE.test(text)) return false;
1021
-
1022
- // Skip if the LLM is clearly handing back to the user. Discuss flows
1023
- // often pose a question and follow it with a conditional intent on the
1024
- // same line ("Did I capture that correctly? If so, I'll write the
1025
- // requirements."). A line-trailing `?` check misses these because the
1026
- // line ends in `.`. Match any sentence-terminating `?` (followed by
1027
- // whitespace or end-of-text) — false negatives here auto-reply to the
1028
- // user, which is a much worse failure mode than a missed nudge.
1029
- if (/\?(?:\s|$)/.test(text)) return false;
1030
-
1031
- // Must contain a commit-intent phrase — this is the stall we care about.
1032
- if (!COMMIT_INTENT_RE.test(text)) return false;
1033
-
1034
- // Resolve the target basePath + pi for injection. Prefer the pending
1035
- // autostart entry (discuss flow); otherwise we cannot inject.
1036
- const entry = _getPendingAutoStart(lookupBasePath);
1037
- if (!entry) return false;
1038
- const { ctx, pi, basePath } = entry;
1039
-
1040
- const count = (emptyTurnCounterByBase.get(basePath) ?? 0) + 1;
1041
- emptyTurnCounterByBase.set(basePath, count);
1042
-
1043
- if (count > MAX_EMPTY_TURN_RETRIES) {
1044
- ctx.ui.notify(
1045
- `Empty-turn recovery: LLM announced intent ${count} times without calling any tool. ` +
1046
- `Stopping auto-nudge.`,
1047
- "error",
1048
- );
1049
- return false; // let the normal flow resolve/pause the unit
1050
- }
1051
-
1052
- ctx.ui.notify(
1053
- `Empty-turn detected: LLM announced intent but called no tool. Prompting it to execute.`,
1054
- "info",
1055
- );
1056
-
1057
- const nudge =
1058
- `Your last turn announced an action (e.g. "I'll write…" or "Let me call…") ` +
1059
- `but contained no tool call. The system records zero tool-use blocks for ` +
1060
- `that turn. Execute the announced action NOW as a tool call in this turn. ` +
1061
- `Do not describe it again. Retry ${count}/${MAX_EMPTY_TURN_RETRIES}.`;
1062
-
1063
- try {
1064
- pi.sendMessage(
1065
- { customType: "gsd-empty-turn-recovery", content: nudge, display: false },
1066
- { triggerTurn: true },
1067
- );
1068
- } catch (e) {
1069
- logWarning("guided", `empty-turn nudge sendMessage failed: ${(e as Error).message}`);
1070
- return false;
1071
- }
1072
- return true;
1073
- }
1074
-
1075
- /**
1076
- * Extract milestone IDs from PROJECT.md milestone sequence table.
1077
- * Looks for rows like "| M001 | Name | Status |" and extracts the ID column.
1078
- */
1079
- function parseMilestoneSequenceFromProject(content: string): string[] {
1080
- const ids: string[] = [];
1081
- const lines = content.split(/\r?\n/);
1082
- for (const line of lines) {
1083
- const match = line.match(/^\|\s*(M\d{3}[A-Z0-9-]*)\s*\|/);
1084
- if (match) ids.push(match[1]);
1085
- }
1086
- return ids;
1087
- }
1088
-
1089
559
  // ─── Types ────────────────────────────────────────────────────────────────────
1090
560
 
1091
561
  type UIContext = ExtensionContext;
@@ -1097,7 +567,7 @@ interface DispatchWorkflowOptions {
1097
567
  deps?: {
1098
568
  loadPreferences?: typeof loadEffectiveGSDPreferences;
1099
569
  selectModel?: typeof selectAndApplyModel;
1100
- getTransportSupportError?: typeof getWorkflowTransportSupportError;
570
+ getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessError;
1101
571
  };
1102
572
  }
1103
573
 
@@ -1105,6 +575,93 @@ export function resolveGuidedDispatchProjectRoot(basePath?: string): string {
1105
575
  return basePath ?? process.cwd();
1106
576
  }
1107
577
 
578
+ /**
579
+ * Wait until the workflow MCP server is reachable and advertising its tool
580
+ * surface. Returns failure details when timed out, or null when ready (or MCP
581
+ * is not the transport). Called inside dispatchWorkflow() so every guided-flow
582
+ * dispatch path is gated automatically.
583
+ */
584
+ const MCP_READINESS_TIMEOUT_MS = 15_000;
585
+ const MCP_READINESS_POLL_MS = 200;
586
+
587
+ export interface WorkflowMcpReadinessFailure {
588
+ server: string;
589
+ error?: string;
590
+ }
591
+
592
+ async function awaitWorkflowMcpReadiness(
593
+ pi: ExtensionAPI,
594
+ ctx: ExtensionContext,
595
+ basePath: string,
596
+ options: {
597
+ unitType?: string;
598
+ timeoutMs?: number;
599
+ pollMs?: number;
600
+ probeTimeoutMs?: number;
601
+ probe?: typeof probeAndCacheWorkflowMcp;
602
+ } = {},
603
+ ): Promise<WorkflowMcpReadinessFailure | null> {
604
+ const provider = ctx.model?.provider;
605
+ const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
606
+ if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl)) return null;
607
+
608
+ const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
609
+ const launch = detectWorkflowMcpLaunchConfig(projectRoot);
610
+ if (!launch) return null;
611
+
612
+ const requiredTools = options.unitType
613
+ ? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
614
+ : [];
615
+ const coversExpectedSurface = (tools: readonly string[]) =>
616
+ requiredTools.length > 0
617
+ ? probeCoversRequiredWorkflowTools(tools, requiredTools)
618
+ : workflowMcpProbeAdvertisesSurface(tools);
619
+
620
+ const serverPrefix = `mcp__${launch.name}__`;
621
+ const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
622
+ const systemPromptCoversExpectedSurface = () => {
623
+ const prompt = systemPrompt();
624
+ return requiredTools.length > 0
625
+ ? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
626
+ : prompt.includes(serverPrefix);
627
+ };
628
+ const sessionAlreadyReady = () =>
629
+ coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
630
+ systemPromptCoversExpectedSurface();
631
+ if (sessionAlreadyReady()) return null;
632
+
633
+ if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
634
+ return null;
635
+ }
636
+
637
+ const probe = options.probe ?? probeAndCacheWorkflowMcp;
638
+ const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
639
+
640
+ ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
641
+ let lastError: string | undefined;
642
+ const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
643
+ const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
644
+ while (Date.now() < deadline) {
645
+ if (sessionAlreadyReady()) {
646
+ ctx.ui.setStatus("gsd-step", "");
647
+ return null;
648
+ }
649
+
650
+ const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
651
+ if (result.ok && coversExpectedSurface(result.tools)) {
652
+ ctx.ui.setStatus("gsd-step", "");
653
+ return null;
654
+ }
655
+ lastError = result.error;
656
+
657
+ await new Promise((r) => setTimeout(r, pollMs));
658
+ }
659
+ ctx.ui.setStatus("gsd-step", "");
660
+ return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
661
+ }
662
+
663
+ export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
664
+
1108
665
  /**
1109
666
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
1110
667
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -1126,7 +683,8 @@ async function dispatchWorkflow(
1126
683
  const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
1127
684
  const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
1128
685
  const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
1129
- const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
686
+ const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
687
+ ?? getUnitWorkflowDispatchReadinessError;
1130
688
 
1131
689
  // Route through the dynamic routing pipeline (complexity classification,
1132
690
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
@@ -1145,29 +703,49 @@ async function dispatchWorkflow(
1145
703
  });
1146
704
  }
1147
705
 
1148
- const compatibilityError = getTransportSupportError(
1149
- result.appliedModel?.provider ?? ctx.model?.provider,
1150
- getRequiredWorkflowToolsForGuidedUnit(unitType),
1151
- {
1152
- projectRoot,
1153
- surface: "guided flow",
1154
- unitType,
1155
- authMode: result.appliedModel?.provider
1156
- ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
1157
- : ctx.model?.provider
1158
- ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
1159
- : undefined,
1160
- baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
1161
- // Guided flow starts the MCP workflow server as part of dispatch, so the
1162
- // parent session's activeTools doesn't include MCP tools yet. The MCP
1163
- // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
1164
- // here — not whether MCP tools are pre-registered in the parent session.
1165
- },
1166
- );
706
+ const compatibilityError = getDispatchReadinessError({
707
+ provider: result.appliedModel?.provider ?? ctx.model?.provider,
708
+ projectRoot,
709
+ surface: "guided flow",
710
+ unitType,
711
+ authMode: result.appliedModel?.provider
712
+ ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
713
+ : ctx.model?.provider
714
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
715
+ : undefined,
716
+ baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
717
+ // Guided flow starts the MCP workflow server as part of dispatch, so the
718
+ // parent session's activeTools doesn't include MCP tools yet. The MCP
719
+ // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
720
+ // here not whether MCP tools are pre-registered in the parent session.
721
+ });
1167
722
  if (compatibilityError) {
1168
723
  ctx.ui.notify(compatibilityError, "error");
1169
724
  return;
1170
725
  }
726
+
727
+ // ── Live MCP readiness gate ────────────────────────────────────────
728
+ // Units with required workflow tools must not dispatch until the MCP
729
+ // surface covers that exact contract; otherwise the model can race into
730
+ // "No such tool available" before recovery sees a clean readiness error.
731
+ warmWorkflowMcpProbeInBackground(projectRoot);
732
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
733
+ const strictBlocking = requiredWorkflowTools.length > 0
734
+ && (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
735
+ if (strictBlocking) {
736
+ // If the workflow MCP server is configured but still connecting, wait
737
+ // for it instead of dispatching into a child session that will abort.
738
+ const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
739
+ if (readinessFailure) {
740
+ const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
741
+ ctx.ui.notify(
742
+ `GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
743
+ `Run \`/gsd mcp check ${readinessFailure.server}\` for details.`,
744
+ "warning",
745
+ );
746
+ return;
747
+ }
748
+ }
1171
749
  }
1172
750
 
1173
751
  // Scope tools for guided workflow turns (#2949, token-consumption savings).
@@ -2124,6 +1702,25 @@ function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { clea
2124
1702
  }
2125
1703
  }
2126
1704
 
1705
+ /**
1706
+ * True when an agent turn is currently streaming or a dispatched message is
1707
+ * still queued waiting to trigger one. Used by the pending-auto-start stale
1708
+ * check: a live discuss turn can run for minutes before writing its first
1709
+ * artifact, and deleting its entry as "stale" re-dispatches the workflow —
1710
+ * resetting the interview and producing a duplicate completion turn.
1711
+ */
1712
+ function isAgentTurnInFlight(ctx: ExtensionCommandContext): boolean {
1713
+ try {
1714
+ if (typeof ctx.isIdle === "function" && !ctx.isIdle()) return true;
1715
+ if (typeof ctx.hasPendingMessages === "function" && ctx.hasPendingMessages()) return true;
1716
+ } catch {
1717
+ // assertActive() throws on a stale runner context; fall through to
1718
+ // artifact/age staleness signals.
1719
+ logWarning("guided", "isAgentTurnInFlight: ctx method threw (stale runner); assuming no turn in flight");
1720
+ }
1721
+ return false;
1722
+ }
1723
+
2127
1724
  // ─── Milestone Actions Submenu ──────────────────────────────────────────────
2128
1725
 
2129
1726
  /**
@@ -2231,6 +1828,7 @@ export async function showSmartEntry(
2231
1828
  options?: { step?: boolean },
2232
1829
  ): Promise<void> {
2233
1830
  const stepMode = options?.step ?? true;
1831
+ warmWorkflowMcpProbeInBackground(basePath);
2234
1832
 
2235
1833
  // ── Clear stale milestone ID reservations from previous cancelled sessions ──
2236
1834
  // Reservations only need to survive within a single /gsd interaction.
@@ -2367,11 +1965,42 @@ export async function showSmartEntry(
2367
1965
  const { checkMarkdownHierarchyAgainstDb } = await import("./migration-auto-check.js");
2368
1966
  const result = await checkMarkdownHierarchyAgainstDb(basePath);
2369
1967
  if (result.action === "recovery-required") {
2370
- ctx.ui.notify(
2371
- result.message ??
2372
- `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "/gsd recover --confirm"}\` to import markdown explicitly.`,
2373
- "warning",
2374
- );
1968
+ if (result.recoveryCommand === "/gsd rebuild markdown") {
1969
+ try {
1970
+ const { rebuildMarkdownProjectionsFromDb } = await import("./commands-maintenance.js");
1971
+ const rebuild = await rebuildMarkdownProjectionsFromDb(basePath);
1972
+ const after = await checkMarkdownHierarchyAgainstDb(basePath);
1973
+ if (after.action === "none") {
1974
+ ctx.ui.notify(
1975
+ `Self-heal: rebuilt markdown projections from the authoritative DB ` +
1976
+ `(${rebuild.rendered} rendered${rebuild.errors.length > 0 ? `, ${rebuild.errors.length} error(s)` : ""}).`,
1977
+ rebuild.errors.length > 0 ? "warning" : "info",
1978
+ );
1979
+ } else {
1980
+ ctx.ui.notify(
1981
+ (result.message ?? "Markdown planning artifacts still diverge from the DB after auto-rebuild.") +
1982
+ (rebuild.errors.length > 0
1983
+ ? `\nAuto-rebuild had ${rebuild.errors.length} projection error(s). Run \`/gsd rebuild markdown\` after review.`
1984
+ : ""),
1985
+ "warning",
1986
+ );
1987
+ }
1988
+ } catch (rebuildErr) {
1989
+ const rebuildMessage = rebuildErr instanceof Error ? rebuildErr.message : String(rebuildErr);
1990
+ logWarning("guided", `markdown auto-rebuild failed: ${rebuildMessage}`, { file: "guided-flow.ts" });
1991
+ ctx.ui.notify(
1992
+ result.message ??
1993
+ `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "/gsd rebuild markdown"}\` to re-project from the DB.`,
1994
+ "warning",
1995
+ );
1996
+ }
1997
+ } else {
1998
+ ctx.ui.notify(
1999
+ result.message ??
2000
+ `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "/gsd recover --confirm"}\` to import markdown explicitly.`,
2001
+ "warning",
2002
+ );
2003
+ }
2375
2004
  }
2376
2005
  } catch (err) {
2377
2006
  const message = err instanceof Error ? err.message : String(err);
@@ -2422,12 +2051,18 @@ export async function showSmartEntry(
2422
2051
  // and fires another dispatchWorkflow, resetting the conversation mid-interview.
2423
2052
  if (hasPendingAutoStart(basePath)) {
2424
2053
  // #3274: If /clear interrupted the discussion, the pending entry is stale.
2425
- // Detect staleness: no manifest, no milestone CONTEXT artifact, AND entry is older than
2426
- // 30s (avoids race between .set() and LLM writing first artifact).
2054
+ // Detect staleness: no manifest, no milestone CONTEXT/CONTEXT-DRAFT artifact,
2055
+ // the entry is older than 30s (avoids race between .set() and LLM writing the
2056
+ // first artifact), AND no agent turn is in flight. A dispatched discuss turn
2057
+ // can think for well over 30s before its first question round writes any
2058
+ // artifact; deleting the entry while that turn is live re-dispatches the
2059
+ // workflow, which both resets the interview and queues a duplicate turn that
2060
+ // replays the final "context written" message after the real one.
2427
2061
  const entry = _getPendingAutoStart(basePath)!;
2428
2062
  const ageMs = Date.now() - (entry.createdAt || 0);
2429
2063
  const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
2430
2064
  const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
2065
+ const milestoneHasDraft = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT-DRAFT");
2431
2066
  const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
2432
2067
  const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
2433
2068
  const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
@@ -2435,10 +2070,30 @@ export async function showSmartEntry(
2435
2070
  // The discuss flow already completed, but pending auto-start cleanup handshake did not run.
2436
2071
  // Clear stale in-memory guard and continue through normal active-milestone routing.
2437
2072
  deletePendingAutoStart(basePath);
2438
- } else if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
2073
+ } else if (
2074
+ !manifestExists &&
2075
+ !milestoneHasContext &&
2076
+ !milestoneHasDraft &&
2077
+ ageMs > 30_000 &&
2078
+ !isAgentTurnInFlight(ctx)
2079
+ ) {
2439
2080
  // Stale entry from an interrupted discussion — clear and continue
2440
2081
  deletePendingAutoStart(basePath);
2441
2082
  } else {
2083
+ if (milestoneHasContext && !isAgentTurnInFlight(ctx)) {
2084
+ // The discussion already produced CONTEXT but the agent_end handoff
2085
+ // never consumed the entry — e.g. an external-engine post-hoc gate
2086
+ // re-arm wiped the depth verification after the save (write-gate
2087
+ // two-process sync). CONTEXT can only be written through a verified
2088
+ // depth gate, so a gate still pending for this milestone is stale:
2089
+ // clear it and re-run the handoff instead of dead-ending.
2090
+ const gateBasePath = entry.scope.workspace.projectRoot;
2091
+ const pendingGateId = getPendingGate(gateBasePath);
2092
+ if (pendingGateId && extractDepthVerificationMilestoneId(pendingGateId) === entry.milestoneId) {
2093
+ clearPendingGate(gateBasePath);
2094
+ }
2095
+ if (checkAutoStartAfterDiscuss(basePath)) return;
2096
+ }
2442
2097
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
2443
2098
  return;
2444
2099
  }