@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 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 (631) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  24. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  25. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  31. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  33. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  34. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  35. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  36. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  37. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  38. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  39. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  40. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  42. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  46. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  47. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  48. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  49. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  50. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  51. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  52. package/dist/resources/extensions/gsd/auto.js +52 -2
  53. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  54. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  55. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  56. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  57. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
  58. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  59. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  62. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  63. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  64. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  69. package/dist/resources/extensions/gsd/db/engine.js +5 -3
  70. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  71. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  72. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  73. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  74. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  75. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  76. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  77. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  78. package/dist/resources/extensions/gsd/files.js +33 -19
  79. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  80. package/dist/resources/extensions/gsd/gsd-db.js +11 -8
  81. package/dist/resources/extensions/gsd/guidance.js +60 -0
  82. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  83. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  84. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  85. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  86. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  87. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  88. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  89. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  90. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  91. package/dist/resources/extensions/gsd/notifications.js +12 -7
  92. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  93. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  94. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  96. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  107. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  108. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  111. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  112. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  113. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  114. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  115. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  116. package/dist/resources/extensions/gsd/state.js +11 -2
  117. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  120. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  122. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  123. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  124. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  125. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  126. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  127. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  128. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  129. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  132. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  133. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  134. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  135. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  136. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  137. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  138. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  139. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  140. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  141. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  142. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  144. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  145. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  146. package/dist/resources/extensions/gsd/worktree.js +8 -1
  147. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  148. package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
  149. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  150. package/dist/resources/shared/package-manager-detection.js +1 -1
  151. package/dist/resources/shared/package.json +3 -0
  152. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  153. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  154. package/dist/runtime-checks.d.ts +10 -0
  155. package/dist/runtime-checks.js +27 -0
  156. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  157. package/dist/update-check.d.ts +2 -0
  158. package/dist/update-check.js +24 -1
  159. package/dist/update-cmd.js +20 -3
  160. package/dist/web/standalone/.next/BUILD_ID +1 -1
  161. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  162. package/dist/web/standalone/.next/build-manifest.json +3 -3
  163. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  164. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/index.html +1 -1
  184. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  191. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  195. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  196. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  197. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  198. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  199. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  200. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  201. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  202. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  203. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  204. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  205. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  206. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  207. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  208. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  209. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  210. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  211. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  212. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  213. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  214. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  215. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  216. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  217. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  218. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  219. package/package.json +3 -3
  220. package/packages/cloud-mcp-gateway/package.json +2 -2
  221. package/packages/contracts/dist/rpc.d.ts +1 -0
  222. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  223. package/packages/contracts/dist/rpc.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  228. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  229. package/packages/gsd-agent-core/package.json +5 -5
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/package.json +7 -7
  265. package/packages/mcp-server/README.md +12 -3
  266. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  267. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  268. package/packages/mcp-server/dist/cli-runner.js +137 -0
  269. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  270. package/packages/mcp-server/dist/cli.js +2 -53
  271. package/packages/mcp-server/dist/cli.js.map +1 -1
  272. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  273. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  275. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  276. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  277. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/pid-registry.js +452 -0
  279. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  280. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  281. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  282. package/packages/mcp-server/dist/probe-mode.js +10 -0
  283. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  284. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  285. package/packages/mcp-server/dist/server.js +4 -0
  286. package/packages/mcp-server/dist/server.js.map +1 -1
  287. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  288. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  289. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  290. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  291. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  292. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  293. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +5 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  298. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  302. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  303. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  304. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  305. package/packages/pi-agent-core/dist/index.js +3 -0
  306. package/packages/pi-agent-core/dist/index.js.map +1 -1
  307. package/packages/pi-agent-core/package.json +1 -1
  308. package/packages/pi-ai/README.md +1 -0
  309. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  310. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  311. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  312. package/packages/pi-ai/dist/index.d.ts +2 -0
  313. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/index.js +2 -0
  315. package/packages/pi-ai/dist/index.js.map +1 -1
  316. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  317. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models.generated.js +460 -261
  319. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  322. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  323. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  324. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  326. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  329. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  331. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  333. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  334. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  336. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  337. package/packages/pi-ai/package.json +3 -2
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  341. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  344. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  346. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  348. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  350. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  352. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  354. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/index.js +1 -1
  356. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  361. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  363. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  364. package/packages/pi-coding-agent/package.json +7 -7
  365. package/packages/pi-tui/dist/index.d.ts +1 -1
  366. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  367. package/packages/pi-tui/dist/index.js +1 -1
  368. package/packages/pi-tui/dist/index.js.map +1 -1
  369. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  370. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/terminal-image.js +54 -2
  372. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts +8 -0
  374. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/tui.js +63 -18
  376. package/packages/pi-tui/dist/tui.js.map +1 -1
  377. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/utils.js +110 -36
  379. package/packages/pi-tui/dist/utils.js.map +1 -1
  380. package/packages/pi-tui/package.json +2 -2
  381. package/packages/rpc-client/package.json +2 -2
  382. package/pkg/dist/theme/theme.d.ts.map +1 -1
  383. package/pkg/dist/theme/theme.js +45 -17
  384. package/pkg/dist/theme/theme.js.map +1 -1
  385. package/pkg/package.json +1 -1
  386. package/src/resources/GSD-WORKFLOW.md +5 -4
  387. package/src/resources/extensions/ask-user-questions.ts +7 -2
  388. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  389. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  390. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  391. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  392. package/src/resources/extensions/async-jobs/index.ts +79 -0
  393. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  394. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  395. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  396. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  397. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  398. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  399. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  400. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  401. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  402. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  403. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  404. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  405. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  406. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  407. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  408. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  409. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  410. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  411. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  412. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  413. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  414. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  415. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  416. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  417. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  418. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  419. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  420. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  421. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  422. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  423. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  424. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  425. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  426. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  427. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  428. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  429. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  430. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  431. package/src/resources/extensions/gsd/auto.ts +64 -2
  432. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  434. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  435. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  436. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
  437. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  440. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  441. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  442. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  443. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  444. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  445. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  446. package/src/resources/extensions/gsd/constants.ts +0 -3
  447. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  448. package/src/resources/extensions/gsd/db/engine.ts +5 -3
  449. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  450. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  451. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  452. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  453. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  454. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  455. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  456. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  457. package/src/resources/extensions/gsd/files.ts +33 -12
  458. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  459. package/src/resources/extensions/gsd/gsd-db.ts +13 -10
  460. package/src/resources/extensions/gsd/guidance.ts +78 -0
  461. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  462. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  463. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  464. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  465. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  466. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  467. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  468. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  469. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  470. package/src/resources/extensions/gsd/notifications.ts +13 -6
  471. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  472. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  473. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  474. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  475. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  476. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  477. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  479. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  486. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  487. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  489. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  490. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  492. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  493. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  494. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  495. package/src/resources/extensions/gsd/state.ts +12 -1
  496. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  498. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  499. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  500. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  501. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  503. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  504. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  505. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  506. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  507. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  508. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  509. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  510. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  511. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  512. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  513. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  514. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  515. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  516. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  517. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  518. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  519. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  520. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  521. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  522. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  523. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  525. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  526. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  527. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  528. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  529. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  530. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  532. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  533. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  534. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  535. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  536. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  537. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  538. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  540. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  541. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  542. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  543. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  544. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  545. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  546. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  547. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  549. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  551. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  552. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  554. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  556. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  557. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  558. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  559. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  560. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  561. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  562. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  564. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +45 -2
  565. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  566. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  567. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  568. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  569. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  570. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  571. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  572. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  573. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  575. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  576. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  577. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  578. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  579. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  580. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  582. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  583. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  584. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  585. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  587. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  588. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  589. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  590. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  591. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  592. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  593. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  594. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  595. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  596. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  597. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  598. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  599. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  600. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  601. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  602. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  603. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  604. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  605. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  606. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  607. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  608. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  609. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  610. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  611. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  612. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  613. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  614. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  615. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  616. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  617. package/src/resources/extensions/gsd/worktree.ts +7 -1
  618. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  619. package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
  620. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  621. package/src/resources/shared/package-manager-detection.ts +1 -1
  622. package/src/resources/shared/package.json +3 -0
  623. package/src/resources/skills/create-skill/SKILL.md +3 -0
  624. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  625. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  626. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  627. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  628. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  629. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  630. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  631. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -76,13 +76,25 @@ import {
76
76
  countUnmappedActiveRequirements,
77
77
  showRequirementsBacklogReview,
78
78
  } from "./requirements-backlog.js";
79
- import { selectAndApplyModel } from "./auto-model-selection.js";
79
+ import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
80
80
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
81
81
  import {
82
- getWorkflowTransportSupportError,
83
- getRequiredWorkflowToolsForGuidedUnit,
82
+ detectWorkflowMcpLaunchConfig,
83
+ resolveWorkflowMcpProjectRoot,
84
84
  supportsStructuredQuestions,
85
85
  } from "./workflow-mcp.js";
86
+ import { usesWorkflowMcpTransport } from "./question-transport.js";
87
+ import {
88
+ getCachedWorkflowMcpProbe,
89
+ probeAndCacheWorkflowMcp,
90
+ warmWorkflowMcpProbeInBackground,
91
+ workflowMcpProbeAdvertisesSurface,
92
+ WORKFLOW_MCP_PROBE_TIMEOUT_MS,
93
+ } from "./workflow-mcp-readiness-cache.js";
94
+ import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
95
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
96
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
97
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
86
98
  import {
87
99
  runPreparation,
88
100
  formatCodebaseBrief,
@@ -555,7 +567,7 @@ interface DispatchWorkflowOptions {
555
567
  deps?: {
556
568
  loadPreferences?: typeof loadEffectiveGSDPreferences;
557
569
  selectModel?: typeof selectAndApplyModel;
558
- getTransportSupportError?: typeof getWorkflowTransportSupportError;
570
+ getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessError;
559
571
  };
560
572
  }
561
573
 
@@ -563,6 +575,93 @@ export function resolveGuidedDispatchProjectRoot(basePath?: string): string {
563
575
  return basePath ?? process.cwd();
564
576
  }
565
577
 
578
+ /**
579
+ * Wait until the workflow MCP server is reachable and advertising its tool
580
+ * surface. Returns failure details when timed out, or null when ready (or MCP
581
+ * is not the transport). Called inside dispatchWorkflow() so every guided-flow
582
+ * dispatch path is gated automatically.
583
+ */
584
+ const MCP_READINESS_TIMEOUT_MS = 15_000;
585
+ const MCP_READINESS_POLL_MS = 200;
586
+
587
+ export interface WorkflowMcpReadinessFailure {
588
+ server: string;
589
+ error?: string;
590
+ }
591
+
592
+ async function awaitWorkflowMcpReadiness(
593
+ pi: ExtensionAPI,
594
+ ctx: ExtensionContext,
595
+ basePath: string,
596
+ options: {
597
+ unitType?: string;
598
+ timeoutMs?: number;
599
+ pollMs?: number;
600
+ probeTimeoutMs?: number;
601
+ probe?: typeof probeAndCacheWorkflowMcp;
602
+ } = {},
603
+ ): Promise<WorkflowMcpReadinessFailure | null> {
604
+ const provider = ctx.model?.provider;
605
+ const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
606
+ if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl)) return null;
607
+
608
+ const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
609
+ const launch = detectWorkflowMcpLaunchConfig(projectRoot);
610
+ if (!launch) return null;
611
+
612
+ const requiredTools = options.unitType
613
+ ? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
614
+ : [];
615
+ const coversExpectedSurface = (tools: readonly string[]) =>
616
+ requiredTools.length > 0
617
+ ? probeCoversRequiredWorkflowTools(tools, requiredTools)
618
+ : workflowMcpProbeAdvertisesSurface(tools);
619
+
620
+ const serverPrefix = `mcp__${launch.name}__`;
621
+ const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
622
+ const systemPromptCoversExpectedSurface = () => {
623
+ const prompt = systemPrompt();
624
+ return requiredTools.length > 0
625
+ ? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
626
+ : prompt.includes(serverPrefix);
627
+ };
628
+ const sessionAlreadyReady = () =>
629
+ coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
630
+ systemPromptCoversExpectedSurface();
631
+ if (sessionAlreadyReady()) return null;
632
+
633
+ if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
634
+ return null;
635
+ }
636
+
637
+ const probe = options.probe ?? probeAndCacheWorkflowMcp;
638
+ const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
639
+
640
+ ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
641
+ let lastError: string | undefined;
642
+ const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
643
+ const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
644
+ while (Date.now() < deadline) {
645
+ if (sessionAlreadyReady()) {
646
+ ctx.ui.setStatus("gsd-step", "");
647
+ return null;
648
+ }
649
+
650
+ const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
651
+ if (result.ok && coversExpectedSurface(result.tools)) {
652
+ ctx.ui.setStatus("gsd-step", "");
653
+ return null;
654
+ }
655
+ lastError = result.error;
656
+
657
+ await new Promise((r) => setTimeout(r, pollMs));
658
+ }
659
+ ctx.ui.setStatus("gsd-step", "");
660
+ return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
661
+ }
662
+
663
+ export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
664
+
566
665
  /**
567
666
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
568
667
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -584,7 +683,8 @@ async function dispatchWorkflow(
584
683
  const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
585
684
  const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
586
685
  const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
587
- const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
686
+ const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
687
+ ?? getUnitWorkflowDispatchReadinessError;
588
688
 
589
689
  // Route through the dynamic routing pipeline (complexity classification,
590
690
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
@@ -603,29 +703,49 @@ async function dispatchWorkflow(
603
703
  });
604
704
  }
605
705
 
606
- const compatibilityError = getTransportSupportError(
607
- result.appliedModel?.provider ?? ctx.model?.provider,
608
- getRequiredWorkflowToolsForGuidedUnit(unitType),
609
- {
610
- projectRoot,
611
- surface: "guided flow",
612
- unitType,
613
- authMode: result.appliedModel?.provider
614
- ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
615
- : ctx.model?.provider
616
- ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
617
- : undefined,
618
- baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
619
- // Guided flow starts the MCP workflow server as part of dispatch, so the
620
- // parent session's activeTools doesn't include MCP tools yet. The MCP
621
- // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
622
- // here — not whether MCP tools are pre-registered in the parent session.
623
- },
624
- );
706
+ const compatibilityError = getDispatchReadinessError({
707
+ provider: result.appliedModel?.provider ?? ctx.model?.provider,
708
+ projectRoot,
709
+ surface: "guided flow",
710
+ unitType,
711
+ authMode: result.appliedModel?.provider
712
+ ? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
713
+ : ctx.model?.provider
714
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
715
+ : undefined,
716
+ baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
717
+ // Guided flow starts the MCP workflow server as part of dispatch, so the
718
+ // parent session's activeTools doesn't include MCP tools yet. The MCP
719
+ // launch config check (detectWorkflowMcpLaunchConfig) is the right gate
720
+ // here not whether MCP tools are pre-registered in the parent session.
721
+ });
625
722
  if (compatibilityError) {
626
723
  ctx.ui.notify(compatibilityError, "error");
627
724
  return;
628
725
  }
726
+
727
+ // ── Live MCP readiness gate ────────────────────────────────────────
728
+ // Units with required workflow tools must not dispatch until the MCP
729
+ // surface covers that exact contract; otherwise the model can race into
730
+ // "No such tool available" before recovery sees a clean readiness error.
731
+ warmWorkflowMcpProbeInBackground(projectRoot);
732
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
733
+ const strictBlocking = requiredWorkflowTools.length > 0
734
+ && (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
735
+ if (strictBlocking) {
736
+ // If the workflow MCP server is configured but still connecting, wait
737
+ // for it instead of dispatching into a child session that will abort.
738
+ const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
739
+ if (readinessFailure) {
740
+ const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
741
+ ctx.ui.notify(
742
+ `GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
743
+ `Run \`/gsd mcp check ${readinessFailure.server}\` for details.`,
744
+ "warning",
745
+ );
746
+ return;
747
+ }
748
+ }
629
749
  }
630
750
 
631
751
  // Scope tools for guided workflow turns (#2949, token-consumption savings).
@@ -1708,6 +1828,7 @@ export async function showSmartEntry(
1708
1828
  options?: { step?: boolean },
1709
1829
  ): Promise<void> {
1710
1830
  const stepMode = options?.step ?? true;
1831
+ warmWorkflowMcpProbeInBackground(basePath);
1711
1832
 
1712
1833
  // ── Clear stale milestone ID reservations from previous cancelled sessions ──
1713
1834
  // Reservations only need to survive within a single /gsd interaction.
@@ -4,7 +4,7 @@
4
4
  import type { ExtensionContext } from "@gsd/pi-coding-agent";
5
5
  import type { GSDState } from "./types.js";
6
6
  import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
7
- import { runEnvironmentChecks } from "./doctor-environment.js";
7
+ import { runEnvironmentChecks, runEnvironmentChecksAsync } from "./doctor-environment.js";
8
8
  import { loadEffectiveGSDPreferences } from "./preferences.js";
9
9
  import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
10
10
  import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
@@ -22,7 +22,31 @@ export const HEALTH_WIDGET_ACTIVE_HINTS =
22
22
 
23
23
  // ── Data loader ────────────────────────────────────────────────────────────────
24
24
 
25
- function loadHealthWidgetData(basePath: string): HealthWidgetData {
25
+ // Last-commit lookup is subprocess-backed (native-git-bridge git spawns),
26
+ // so it is treated like the other expensive checks: skipped on first paint,
27
+ // run only by the background refresh.
28
+ function loadLastCommitInfo(basePath: string): { epoch: number | null; message: string | null } {
29
+ try {
30
+ if (nativeIsRepo(basePath)) {
31
+ const branch = nativeGetCurrentBranch(basePath);
32
+ const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
33
+ if (epoch > 0) {
34
+ return { epoch, message: nativeCommitSubject(basePath, branch || "HEAD") || null };
35
+ }
36
+ }
37
+ } catch { /* non-fatal */ }
38
+ return { epoch: null, message: null };
39
+ }
40
+
41
+ function loadHealthWidgetData(
42
+ basePath: string,
43
+ options?: { includeChecks?: boolean },
44
+ ): HealthWidgetData {
45
+ // `includeChecks` gates the expensive subprocess-backed checks (provider +
46
+ // environment doctor: `lsof`, `docker`, `node --version`, ...). The initial
47
+ // synchronous render passes `false` so first paint is never blocked on them;
48
+ // the async refresh (off the first-paint path) runs the full suite.
49
+ const includeChecks = options?.includeChecks ?? true;
26
50
  let budgetCeiling: number | undefined;
27
51
  let budgetSpent = 0;
28
52
  let providerIssue: string | null = null;
@@ -44,40 +68,73 @@ function loadHealthWidgetData(basePath: string): HealthWidgetData {
44
68
  }
45
69
  } catch { /* non-fatal */ }
46
70
 
71
+ if (includeChecks) {
72
+ try {
73
+ const providerResults = runProviderChecks();
74
+ providerIssue = summariseProviderIssues(providerResults);
75
+ } catch { /* non-fatal */ }
76
+
77
+ try {
78
+ const envResults = runEnvironmentChecks(basePath);
79
+ for (const r of envResults) {
80
+ if (r.status === "error") environmentErrorCount++;
81
+ else if (r.status === "warning") environmentWarningCount++;
82
+ }
83
+ } catch { /* non-fatal */ }
84
+ }
85
+
86
+ // ── Last commit info ── (git spawns — gated like the other expensive checks)
87
+ if (includeChecks) {
88
+ const commit = loadLastCommitInfo(basePath);
89
+ lastCommitEpoch = commit.epoch;
90
+ lastCommitMessage = commit.message;
91
+ }
92
+
93
+ return {
94
+ projectState,
95
+ budgetCeiling,
96
+ budgetSpent,
97
+ providerIssue,
98
+ environmentErrorCount,
99
+ environmentWarningCount,
100
+ lastCommitEpoch,
101
+ lastCommitMessage,
102
+ lastRefreshed: Date.now(),
103
+ };
104
+ }
105
+
106
+ // Non-blocking variant used by the widget's background refresh: the cheap fields
107
+ // come from the synchronous snapshot, then provider + environment checks are
108
+ // layered in off the event-loop critical path (env checks run concurrently via
109
+ // runEnvironmentChecksAsync). Keeps the always-on widget from stalling the UI on
110
+ // its initial enrichment or its 60s refresh.
111
+ async function loadHealthWidgetDataAsync(basePath: string): Promise<HealthWidgetData> {
112
+ const data = loadHealthWidgetData(basePath, { includeChecks: false });
113
+ let providerIssue = data.providerIssue;
114
+ let environmentErrorCount = 0;
115
+ let environmentWarningCount = 0;
116
+
47
117
  try {
48
- const providerResults = runProviderChecks();
49
- providerIssue = summariseProviderIssues(providerResults);
118
+ providerIssue = summariseProviderIssues(runProviderChecks());
50
119
  } catch { /* non-fatal */ }
51
120
 
52
121
  try {
53
- const envResults = runEnvironmentChecks(basePath);
122
+ const envResults = await runEnvironmentChecksAsync(basePath);
54
123
  for (const r of envResults) {
55
124
  if (r.status === "error") environmentErrorCount++;
56
125
  else if (r.status === "warning") environmentWarningCount++;
57
126
  }
58
127
  } catch { /* non-fatal */ }
59
128
 
60
- // ── Last commit info ──
61
- try {
62
- if (nativeIsRepo(basePath)) {
63
- const branch = nativeGetCurrentBranch(basePath);
64
- const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
65
- if (epoch > 0) {
66
- lastCommitEpoch = epoch;
67
- lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
68
- }
69
- }
70
- } catch { /* non-fatal */ }
129
+ const commit = loadLastCommitInfo(basePath);
71
130
 
72
131
  return {
73
- projectState,
74
- budgetCeiling,
75
- budgetSpent,
132
+ ...data,
76
133
  providerIssue,
77
134
  environmentErrorCount,
78
135
  environmentWarningCount,
79
- lastCommitEpoch,
80
- lastCommitMessage,
136
+ lastCommitEpoch: commit.epoch,
137
+ lastCommitMessage: commit.message,
81
138
  lastRefreshed: Date.now(),
82
139
  };
83
140
  }
@@ -95,8 +152,13 @@ export function initHealthWidget(ctx: ExtensionContext): void {
95
152
 
96
153
  const basePath = projectRoot();
97
154
 
98
- // String-array fallback — used in RPC mode (factory is a no-op there)
99
- const initialData = loadHealthWidgetData(basePath);
155
+ // String-array fallback — used in RPC mode (factory is a no-op there).
156
+ // Skip the expensive provider/environment doctor checks here: this runs
157
+ // synchronously on the interactive-startup path, where running them would
158
+ // block first paint by ~0.9s (lsof/docker probes, otherwise run again
159
+ // immediately by the factory below). The factory's async refresh fills in
160
+ // real health once the screen is up.
161
+ const initialData = loadHealthWidgetData(basePath, { includeChecks: false });
100
162
  ctx.ui.setWidget("gsd-health", buildHealthLines(initialData), { placement: "belowEditor" });
101
163
 
102
164
  // Factory-based widget for TUI mode — replaces the string-array above
@@ -110,7 +172,7 @@ export function initHealthWidget(ctx: ExtensionContext): void {
110
172
  if (refreshInFlight) return;
111
173
  refreshInFlight = true;
112
174
  try {
113
- data = loadHealthWidgetData(basePath);
175
+ data = await loadHealthWidgetDataAsync(basePath);
114
176
  cachedLines = undefined;
115
177
  if (!isDisposed) _tui.requestRender();
116
178
  } catch { /* non-fatal */ } finally {
@@ -118,9 +180,11 @@ export function initHealthWidget(ctx: ExtensionContext): void {
118
180
  }
119
181
  };
120
182
 
121
- // Fire first enrichment immediately. requestRender() inside is a no-op
122
- // if the widget has not yet rendered, so this is safe before factory return.
123
- void refresh();
183
+ // Fire the first full enrichment off the first-paint path. setTimeout(0)
184
+ // yields to the initial render + input loop, so the expensive doctor checks
185
+ // (provider + environment) never delay the moment the user sees the UI.
186
+ // requestRender() inside refresh repaints the widget once data is ready.
187
+ setTimeout(() => { void refresh(); }, 0);
124
188
 
125
189
  const refreshTimer = setInterval(() => {
126
190
  void refresh();
@@ -911,6 +911,17 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
911
911
  return stale;
912
912
  }
913
913
 
914
+ /**
915
+ * Render-verification helper: does the rendered ROADMAP markdown mark a slice
916
+ * as done? Used by completion code to verify/repair the *projection* after a
917
+ * DB write — never as a source of truth for dispatch or completion decisions
918
+ * (ADR-017). Lives here so decision-path modules need not import
919
+ * parsers-legacy directly.
920
+ */
921
+ export function roadmapRenderMarksSliceDone(roadmapContent: string, sliceId: string): boolean {
922
+ return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
923
+ }
924
+
914
925
  // ─── Stale Repair ─────────────────────────────────────────────────────────
915
926
  // Body relocated to state-reconciliation/drift/stale-render.ts (ADR-017 #5702).
916
927
  // detectStaleRenders above stays as a useful diagnostic primitive; the
@@ -0,0 +1,39 @@
1
+ // mcp-bridge.ts — stable runtime seam for MCP server consumption (phase 1).
2
+ export {
3
+ loadWriteGateSnapshot,
4
+ shouldBlockPendingGateInSnapshot,
5
+ shouldBlockQueueExecutionInSnapshot,
6
+ } from "./bootstrap/write-gate.js";
7
+ export { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
8
+ export {
9
+ _getAdapter,
10
+ checkpointDatabase,
11
+ closeDatabase,
12
+ getAllMilestones,
13
+ getDb,
14
+ getGateResults,
15
+ getMilestoneSlices,
16
+ getPendingGates,
17
+ getSliceTasks,
18
+ insertDecision,
19
+ insertMilestone,
20
+ insertSlice,
21
+ openDatabase,
22
+ upsertMilestonePlanning,
23
+ } from "./gsd-db.js";
24
+ export { invalidateStateCache, isReusableGhostMilestone } from "./state.js";
25
+ export { loadEffectiveGSDPreferences } from "./preferences.js";
26
+ export {
27
+ saveDecisionToDb,
28
+ saveRequirementToDb,
29
+ updateRequirementInDb,
30
+ } from "./db-writer.js";
31
+ export { rebuildState } from "./doctor.js";
32
+ export { queryJournal } from "./journal.js";
33
+ export {
34
+ claimReservedId,
35
+ findMilestoneIds,
36
+ getReservedMilestoneIds,
37
+ milestoneIdSort,
38
+ nextMilestoneId,
39
+ } from "./milestone-ids.js";
@@ -3,7 +3,7 @@
3
3
  // Phase 4 companion to memory-store.ts. Edges live in the `memory_relations`
4
4
  // table and are created by (a) explicit LINK actions emitted by the memory
5
5
  // extractor, or (b) future `/gsd memory link` CLI commands. All writes go
6
- // through the single-writer gate in `gsd-db.ts`.
6
+ // through typed writer wrappers re-exported by `gsd-db.ts`.
7
7
 
8
8
  import {
9
9
  _getAdapter,
@@ -5,13 +5,23 @@
5
5
  // - postUnit: git commit, artifact verify, DB settle, then GitHub finalize
6
6
  // - recovery: DB repair from artifacts, then GitHub finalize
7
7
 
8
+ import { existsSync } from "node:fs";
9
+
8
10
  import { loadFile } from "./files.js";
9
- import { parseRoadmap } from "./parsers-legacy.js";
10
11
  import { resolveMilestoneFile } from "./paths.js";
11
- import { getMilestone, getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
12
+ import {
13
+ getMilestone,
14
+ getClosedSliceIds,
15
+ getLatestAssessmentByScope,
16
+ getMilestoneSlices,
17
+ isDbAvailable,
18
+ } from "./gsd-db.js";
12
19
  import { isClosedStatus } from "./status-guards.js";
20
+ import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
21
+ import { handleCompleteMilestone } from "./tools/complete-milestone.js";
13
22
  import { runSafely } from "./auto-utils.js";
14
23
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
24
+ import { uatSignoffBlockerGuidance } from "./guidance.js";
15
25
  import { logWarning } from "./workflow-logger.js";
16
26
  import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
17
27
  import { buildCompleteMilestonePrompt } from "./auto-prompts.js";
@@ -28,6 +38,76 @@ import {
28
38
  const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
29
39
  const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
30
40
 
41
+ /**
42
+ * True when a milestone is terminal for git cleanup (orphaned worktrees, stale branches).
43
+ * DB-authoritative (ADR-017): closed status, or validation-pass with all slices closed.
44
+ * When the DB is unavailable we cannot make this decision and conservatively
45
+ * return false so callers leave the worktree/branch alone instead of cleaning
46
+ * up based on parsed projections.
47
+ */
48
+ export async function isCompletedMilestoneTerminal(
49
+ _basePath: string,
50
+ milestoneId: string,
51
+ ): Promise<boolean> {
52
+ if (!isDbAvailable()) return false;
53
+
54
+ const milestone = getMilestone(milestoneId);
55
+ if (!milestone) return false;
56
+
57
+ if (isClosedStatus(milestone.status)) {
58
+ return true;
59
+ }
60
+
61
+ const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
62
+ if (validation?.status !== "pass") {
63
+ return false;
64
+ }
65
+
66
+ const slices = getMilestoneSlices(milestoneId);
67
+ if (slices.length === 0) return false;
68
+ return slices.every((slice) => isClosedStatus(slice.status));
69
+ }
70
+
71
+ /** Write a missing milestone SUMMARY projection when canonical DB closeout already settled. */
72
+ export async function repairMissingMilestoneSummaryProjection(
73
+ basePath: string,
74
+ milestoneId: string,
75
+ ): Promise<{ ok: true } | { ok: false; error: string }> {
76
+ const milestone = getMilestone(milestoneId);
77
+ if (!milestone) {
78
+ return { ok: false, error: `milestone not found: ${milestoneId}` };
79
+ }
80
+
81
+ const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, milestoneId);
82
+ const summaryPath = resolveExpectedArtifactPath("complete-milestone", milestoneId, artifactBasePath);
83
+ if (summaryPath && existsSync(summaryPath)) {
84
+ return { ok: true };
85
+ }
86
+
87
+ const result = await handleCompleteMilestone(
88
+ {
89
+ milestoneId,
90
+ title: milestone.title,
91
+ oneLiner: "Canonical closeout completed; summary projection repaired automatically.",
92
+ narrative:
93
+ "The workflow database recorded this milestone as complete, but the milestone SUMMARY artifact was missing on disk. " +
94
+ "Dispatch policy repaired the projection so closeout proof and cleanup can proceed.",
95
+ verificationPassed: true,
96
+ triggerReason: "closeout-projection-repair",
97
+ },
98
+ basePath,
99
+ );
100
+
101
+ if ("error" in result) {
102
+ return { ok: false, error: result.error };
103
+ }
104
+ const writtenSummaryPath = result.summaryPath;
105
+ if (result.stale || !writtenSummaryPath || !existsSync(writtenSummaryPath)) {
106
+ return { ok: false, error: "milestone SUMMARY projection write failed" };
107
+ }
108
+ return { ok: true };
109
+ }
110
+
31
111
  /**
32
112
  * True when the milestone is closed in the DB and the completion summary artifact exists.
33
113
  * Polls briefly so post-unit verification can observe the tool's DB write.
@@ -78,7 +158,22 @@ export async function evaluateCompleteMilestoneDispatch(
78
158
  if (isDbAvailable()) {
79
159
  const milestone = getMilestone(mid);
80
160
  if (milestone && isClosedStatus(milestone.status)) {
81
- return { action: "skip" };
161
+ const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, mid);
162
+ const summaryPath = resolveExpectedArtifactPath("complete-milestone", mid, artifactBasePath);
163
+ const summaryMissing = !summaryPath || !existsSync(summaryPath);
164
+ if (summaryMissing) {
165
+ const repair = await repairMissingMilestoneSummaryProjection(basePath, mid);
166
+ if (!repair.ok) {
167
+ logWarning(
168
+ "dispatch",
169
+ `Milestone ${mid} is closed in DB but SUMMARY repair failed: ${repair.error}. Dispatching complete-milestone to retry.`,
170
+ );
171
+ } else {
172
+ return { action: "skip" };
173
+ }
174
+ } else {
175
+ return { action: "skip" };
176
+ }
82
177
  }
83
178
  }
84
179
 
@@ -86,31 +181,21 @@ export async function evaluateCompleteMilestoneDispatch(
86
181
  if (closeoutGitStop) return closeoutGitStop;
87
182
 
88
183
  if (prefs?.uat_dispatch) {
89
- let closedSliceIds: string[];
90
- if (isDbAvailable()) {
91
- closedSliceIds = getMilestoneSlices(mid)
92
- .filter((slice) => isClosedStatus(slice.status))
93
- .map((slice) => slice.id);
94
- } else {
95
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
96
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
97
- if (!roadmapContent) {
98
- return {
99
- action: "stop",
100
- reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
101
- level: "warning",
102
- };
103
- }
104
- const roadmap = parseRoadmap(roadmapContent);
105
- closedSliceIds = roadmap.slices.filter((slice) => slice.done).map((slice) => slice.id);
184
+ // DB-authoritative (ADR-017): UAT sign-off gating never parses the
185
+ // ROADMAP projection. Without a DB we cannot verify — stop conservatively.
186
+ if (!isDbAvailable()) {
187
+ return {
188
+ action: "stop",
189
+ reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because the workflow DB is not accessible.`,
190
+ level: "warning",
191
+ };
106
192
  }
107
-
108
- for (const sliceId of closedSliceIds) {
193
+ for (const sliceId of getClosedSliceIds(mid)) {
109
194
  const result = await readUatGateVerdict(basePath, mid, sliceId);
110
195
  if (!result) {
111
196
  return {
112
197
  action: "stop",
113
- reason: `Cannot complete milestone ${mid}: missing UAT PASS verdict for ${sliceId}. Manual UAT sign-off (PASS) is required before milestone closure.`,
198
+ reason: uatSignoffBlockerGuidance(mid, sliceId),
114
199
  level: "warning",
115
200
  };
116
201
  }
@@ -118,7 +203,7 @@ export async function evaluateCompleteMilestoneDispatch(
118
203
  if (!isAcceptableUatVerdict(verdict, uatType)) {
119
204
  return {
120
205
  action: "stop",
121
- reason: `Cannot complete milestone ${mid}: UAT verdict for ${sliceId} is "${verdict}". Manual UAT sign-off (PASS) is required before milestone closure.`,
206
+ reason: uatSignoffBlockerGuidance(mid, sliceId, verdict),
122
207
  level: "warning",
123
208
  };
124
209
  }
@@ -15,7 +15,7 @@ import {
15
15
  } from "./gsd-db.js";
16
16
  import { invalidateStateCache } from "./state.js";
17
17
  import { renderRoadmapFromDb } from "./markdown-renderer.js";
18
- import { renderAllProjections } from "./workflow-projections.js";
18
+ import { flushWorkflowProjections } from "./projection-flush.js";
19
19
  import { writeManifest } from "./workflow-manifest.js";
20
20
  import { appendEvent } from "./workflow-events.js";
21
21
  import { logWarning } from "./workflow-logger.js";
@@ -171,7 +171,7 @@ async function renderPlanArtifacts(
171
171
 
172
172
  async function runPostPlanHooks(basePath: string, params: PersistMilestonePlanParams): Promise<void> {
173
173
  try {
174
- await renderAllProjections(basePath, params.milestoneId);
174
+ await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
175
175
  writeManifest(basePath);
176
176
  appendEvent(basePath, {
177
177
  cmd: "plan-milestone",
@@ -1,13 +1,10 @@
1
- import { join } from "node:path";
2
-
3
- import { gsdRoot } from "./paths.js";
1
+ import { workflowEventArchivePath, workflowEventLogPath } from "./workflow-event-ledger.js";
4
2
  import { readEvents } from "./workflow-events.js";
5
3
 
6
4
  export function latestExplicitReopenAt(basePath: string, milestoneId: string): string | null {
7
- const root = gsdRoot(basePath);
8
5
  const candidates = [
9
- join(root, "event-log.jsonl"),
10
- join(root, `event-log-${milestoneId}.jsonl.archived`),
6
+ workflowEventLogPath(basePath),
7
+ workflowEventArchivePath(basePath, milestoneId),
11
8
  ];
12
9
 
13
10
  let latest: string | null = null;