@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7

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 (452) hide show
  1. package/dist/cli.js +3 -2
  2. package/dist/help-text.js +10 -6
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
  5. package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
  6. package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
  7. package/dist/resources/extensions/browser-tools/index.js +57 -9
  8. package/dist/resources/extensions/browser-tools/package.json +5 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
  11. package/dist/resources/extensions/gsd/auto/phases.js +4 -3
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +55 -0
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
  15. package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
  16. package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
  17. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  18. package/dist/resources/extensions/gsd/auto-start.js +94 -15
  19. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  20. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +18 -65
  21. package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
  22. package/dist/resources/extensions/gsd/auto.js +31 -6
  23. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
  24. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
  27. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  28. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
  29. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  30. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
  31. package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
  32. package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
  33. package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
  34. package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  36. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  37. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  41. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  42. package/dist/resources/extensions/gsd/escalation.js +4 -4
  43. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  44. package/dist/resources/extensions/gsd/forensics.js +74 -2
  45. package/dist/resources/extensions/gsd/gsd-db.js +42 -6
  46. package/dist/resources/extensions/gsd/guided-flow.js +119 -176
  47. package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
  48. package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
  49. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  50. package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
  51. package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
  52. package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
  53. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  54. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  55. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  56. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  57. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  58. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  59. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  60. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  61. package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
  62. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  63. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  64. package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
  65. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  66. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  67. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  68. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
  69. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  70. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  71. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  72. package/dist/resources/extensions/gsd/state.js +17 -14
  73. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  74. package/dist/resources/extensions/gsd/tool-contract.js +5 -0
  75. package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
  76. package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
  77. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  78. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  79. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
  80. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  81. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  82. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
  83. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  84. package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
  85. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  86. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  87. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  88. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
  89. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
  90. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
  91. package/dist/resources/extensions/mcp-client/manager.js +31 -1
  92. package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
  93. package/dist/rtk.d.ts +7 -1
  94. package/dist/rtk.js +27 -11
  95. package/dist/update-check.d.ts +15 -1
  96. package/dist/update-check.js +87 -12
  97. package/dist/update-cmd.d.ts +1 -0
  98. package/dist/update-cmd.js +53 -2
  99. package/dist/web/standalone/.next/BUILD_ID +1 -1
  100. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  101. package/dist/web/standalone/.next/build-manifest.json +2 -2
  102. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  103. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/index.html +1 -1
  121. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  128. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  129. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  131. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  132. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  133. package/package.json +5 -3
  134. package/packages/cloud-mcp-gateway/package.json +2 -2
  135. package/packages/contracts/dist/workflow.d.ts +14 -0
  136. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  137. package/packages/contracts/dist/workflow.js +16 -0
  138. package/packages/contracts/dist/workflow.js.map +1 -1
  139. package/packages/contracts/package.json +1 -1
  140. package/packages/daemon/package.json +4 -4
  141. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  142. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  143. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  144. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  145. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  146. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  147. package/packages/gsd-agent-core/dist/index.js +1 -0
  148. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  149. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  150. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  152. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  153. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  154. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  155. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  156. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  157. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  158. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  159. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  160. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  161. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  162. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  163. package/packages/gsd-agent-core/package.json +6 -6
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  165. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  167. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  168. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  169. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  171. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  172. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  173. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  177. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
  178. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  188. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  197. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  198. package/packages/gsd-agent-modes/package.json +7 -7
  199. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  200. package/packages/mcp-server/dist/remote-questions.js +23 -9
  201. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  203. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  204. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  205. package/packages/mcp-server/package.json +3 -3
  206. package/packages/native/package.json +1 -1
  207. package/packages/pi-agent-core/dist/agent-loop.js +42 -3
  208. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  209. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  210. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  211. package/packages/pi-agent-core/dist/agent.js +2 -0
  212. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  213. package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  214. package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
  215. package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  216. package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
  217. package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  218. package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
  219. package/packages/pi-agent-core/dist/types.d.ts +6 -1
  220. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  221. package/packages/pi-agent-core/dist/types.js.map +1 -1
  222. package/packages/pi-agent-core/package.json +1 -1
  223. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  224. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  225. package/packages/pi-ai/dist/api-registry.js +23 -0
  226. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  227. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  228. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  229. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  230. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  231. package/packages/pi-ai/dist/models.generated.d.ts +411 -39
  232. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  233. package/packages/pi-ai/dist/models.generated.js +504 -153
  234. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  235. package/packages/pi-ai/dist/stream.js +6 -6
  236. package/packages/pi-ai/dist/stream.js.map +1 -1
  237. package/packages/pi-ai/package.json +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
  239. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  243. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  245. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  247. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
  249. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
  252. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
  254. package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
  256. package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
  259. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  260. package/packages/pi-coding-agent/package.json +7 -7
  261. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  262. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  263. package/packages/pi-tui/dist/terminal.js +8 -4
  264. package/packages/pi-tui/dist/terminal.js.map +1 -1
  265. package/packages/pi-tui/package.json +1 -1
  266. package/packages/rpc-client/package.json +2 -2
  267. package/pkg/package.json +1 -1
  268. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
  269. package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
  270. package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
  271. package/src/resources/extensions/browser-tools/index.ts +60 -9
  272. package/src/resources/extensions/browser-tools/package.json +5 -1
  273. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
  274. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
  275. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
  276. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
  277. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  278. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  279. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  280. package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
  281. package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
  282. package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
  283. package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
  284. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  285. package/src/resources/extensions/gsd/auto-start.ts +112 -17
  286. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  287. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
  288. package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
  289. package/src/resources/extensions/gsd/auto.ts +47 -5
  290. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
  291. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  292. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
  293. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
  294. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  295. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
  296. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  297. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
  298. package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
  299. package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
  300. package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
  301. package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
  302. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  303. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  304. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  305. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  306. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  307. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  308. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  309. package/src/resources/extensions/gsd/escalation.ts +4 -4
  310. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  311. package/src/resources/extensions/gsd/forensics.ts +99 -5
  312. package/src/resources/extensions/gsd/gsd-db.ts +46 -8
  313. package/src/resources/extensions/gsd/guided-flow.ts +215 -217
  314. package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
  315. package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
  316. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  317. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  318. package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
  319. package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
  320. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  321. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  322. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  323. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  324. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  325. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  326. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  327. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  328. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  329. package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
  330. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  331. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  332. package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
  333. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  334. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  335. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  336. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  337. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
  338. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  339. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  340. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  341. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  342. package/src/resources/extensions/gsd/state.ts +18 -14
  343. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  344. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  345. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
  346. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
  347. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
  348. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
  349. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
  350. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
  351. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  352. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
  353. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
  354. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
  355. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  356. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  357. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  358. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  359. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  360. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  361. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  362. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
  363. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  364. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
  365. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
  366. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  367. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  368. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  369. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  370. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  371. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  372. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  373. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
  374. package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
  375. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
  376. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  377. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  378. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
  379. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
  380. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  381. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  382. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
  383. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
  384. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
  385. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
  386. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
  387. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
  388. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
  389. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  390. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
  391. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
  392. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
  393. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
  394. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  395. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  396. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  397. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
  398. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  399. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  400. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  401. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
  402. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  403. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  404. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  405. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  406. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
  407. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  408. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  409. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
  410. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
  411. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
  412. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  413. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
  414. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  415. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  416. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  417. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  418. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
  419. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  420. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  421. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  422. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  423. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  424. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  425. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
  426. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
  427. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
  428. package/src/resources/extensions/gsd/tool-contract.ts +6 -0
  429. package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
  430. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
  431. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  432. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  433. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
  434. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  435. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  436. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
  437. package/src/resources/extensions/gsd/types.ts +69 -5
  438. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  439. package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
  440. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  441. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  442. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  443. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
  444. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
  445. package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
  446. package/src/resources/extensions/mcp-client/manager.ts +33 -1
  447. package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
  448. package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
  449. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
  450. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
  451. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
  452. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
@@ -115,15 +115,10 @@ async function runQuickTaskChoice(ctx, pi) {
115
115
  }
116
116
  async function dispatchDiscussForNextMilestoneWithBacklog(ctx, pi, basePath, nextId) {
117
117
  const backlogContext = buildRequirementsBacklogDiscussContext(nextId);
118
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
119
118
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
120
- const basePrompt = loadPrompt("guided-discuss-milestone", {
121
- workingDirectory: basePath,
122
- milestoneId: nextId,
123
- milestoneTitle: `New milestone ${nextId}`,
124
- inlinedTemplates: discussMilestoneTemplates,
125
- structuredQuestionsAvailable,
119
+ const basePrompt = await buildDiscussMilestonePrompt(nextId, `New milestone ${nextId}`, basePath, structuredQuestionsAvailable, {
126
120
  commitInstruction: buildDocsCommitInstruction(`docs(${nextId}): milestone context from discuss`),
121
+ includeContextMode: false,
127
122
  fastPathInstruction: [
128
123
  "> **Requirements backlog active.**",
129
124
  "> Map unmapped active requirements to this milestone before finalizing context.",
@@ -183,6 +178,84 @@ export function _roadmapHasParseableSlicesForTest(roadmapContent) {
183
178
  return false;
184
179
  return parseRoadmapSlices(roadmapContent).length > 0;
185
180
  }
181
+ function hasExecutablePlanForHandoff(milestoneId, roadmapFile) {
182
+ if (isDbAvailable()) {
183
+ return getMilestoneSlices(milestoneId).length > 0;
184
+ }
185
+ if (!roadmapFile)
186
+ return false;
187
+ try {
188
+ return parseRoadmapSlices(readFileSync(roadmapFile, "utf-8")).length > 0;
189
+ }
190
+ catch (e) {
191
+ logWarning("guided", `failed to parse roadmap slices for ${milestoneId}: ${e.message}`);
192
+ return false;
193
+ }
194
+ }
195
+ function formatAcceptedDiscussHandoffMessage(milestoneId, contextFile, hasExecutablePlan) {
196
+ if (hasExecutablePlan)
197
+ return `Milestone ${milestoneId} ready.`;
198
+ if (contextFile)
199
+ return `Milestone ${milestoneId} context captured. Continuing the planning pipeline.`;
200
+ return `Milestone ${milestoneId} planning artifacts captured. Continuing the planning pipeline.`;
201
+ }
202
+ function manifestContainsMilestone(basePath, milestoneId) {
203
+ try {
204
+ const manifest = readManifest(basePath);
205
+ return (Array.isArray(manifest?.milestones) &&
206
+ manifest.milestones.some(m => m.id === milestoneId));
207
+ }
208
+ catch (e) {
209
+ logWarning("guided", `R3b: failed to read state manifest: ${e.message}`);
210
+ return false;
211
+ }
212
+ }
213
+ function notifyDbRowRecoveryFailed(entry) {
214
+ entry.ctx.ui.notify(`Milestone ${entry.milestoneId}: DB row recovery failed ${entry.r3bRecoveryCount} times. ` +
215
+ `Re-run /gsd to reset the recovery counter, or run /gsd-debug to diagnose without resetting.`, "error");
216
+ }
217
+ function noteDbRowRecoveryMiss(entry) {
218
+ entry.r3bRecoveryCount += 1;
219
+ if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
220
+ notifyDbRowRecoveryFailed(entry);
221
+ }
222
+ }
223
+ function ensureMilestoneRowForAcceptedHandoff(entry, contextFile) {
224
+ if (!isDbAvailable())
225
+ return true;
226
+ const { basePath, milestoneId } = entry;
227
+ const milestoneRow = getMilestone(milestoneId);
228
+ if (milestoneRow)
229
+ return true;
230
+ if (manifestContainsMilestone(basePath, milestoneId)) {
231
+ logWarning("guided", `R3b: getMilestone(${milestoneId}) returned null but manifest has the row — treating as stale read`);
232
+ return true;
233
+ }
234
+ if (!contextFile) {
235
+ entry.ctx.ui.notify(`Milestone ${milestoneId}: discuss artifacts on disk but no DB row exists. ` +
236
+ `PROJECT.md may have failed to register milestones. ` +
237
+ `Re-save PROJECT.md with canonical "- [ ] M001: Title — One-liner" lines, ` +
238
+ `then re-run /gsd to recover.`, "error");
239
+ return false;
240
+ }
241
+ if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
242
+ logWarning("guided", `R3b: milestone ${milestoneId} DB-row recovery limit reached ` +
243
+ `(${entry.r3bRecoveryCount}/${MAX_DB_ROW_RECOVERIES}); user already notified`);
244
+ return false;
245
+ }
246
+ logWarning("guided", `R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
247
+ `(attempt ${entry.r3bRecoveryCount + 1}/${MAX_DB_ROW_RECOVERIES})`);
248
+ try {
249
+ insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
250
+ }
251
+ catch (e) {
252
+ logWarning("guided", `R3b: insertMilestone failed: ${e.message}`);
253
+ }
254
+ if (getMilestone(milestoneId))
255
+ return true;
256
+ noteDbRowRecoveryMiss(entry);
257
+ return false;
258
+ }
186
259
  // ─── Commit Instruction Helpers ──────────────────────────────────────────────
187
260
  /** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
188
261
  function buildDocsCommitInstruction(_message) {
@@ -191,10 +264,8 @@ function buildDocsCommitInstruction(_message) {
191
264
  // #4573: cap for how many times we nudge the LLM after a premature ready
192
265
  // phrase before giving up and asking the user to re-run /gsd.
193
266
  const MAX_READY_REJECTS = 2;
194
- // H1 (#5012): cap for Gate 1b plan-blocked recovery hints. After this many
195
- // consecutive recovery attempts the loop is stopped and the user is directed
196
- // to investigate manually.
197
- const MAX_PLAN_BLOCKED_RECOVERIES = 3;
267
+ // Cap failed in-flight DB row repair attempts before escalating to the user.
268
+ const MAX_DB_ROW_RECOVERIES = 3;
198
269
  // #4573: matches the canonical ready phrase the discuss prompt asks the LLM
199
270
  // to emit. Accepts any M-prefixed milestone ID (three digits + optional
200
271
  // suffix) with optional trailing punctuation.
@@ -425,56 +496,12 @@ export function checkAutoStartAfterDiscuss(lookupBasePath) {
425
496
  return false;
426
497
  }
427
498
  }
428
- // Gate 1b: Discriminate plan-blocked from discuss-incomplete when the DB row is queued.
429
- // If the DB is available and the row is still "queued" but CONTEXT.md already exists on
430
- // disk, the discuss phase completed but gsd_plan_milestone was hard-blocked by the
431
- // depth-verification gate. Emit a recovery hint so the next agent turn can retry
432
- // gsd_plan_milestone, then return false (keep blocking auto-start).
433
- // If CONTEXT.md does not exist (discuss-incomplete), Gate 1 already blocked above.
434
- if (isDbAvailable()) {
435
- const dbRow = getMilestone(milestoneId);
436
- if (dbRow?.status === "queued" && contextFile) {
437
- if (entry.planBlockedRecoveryCount >= MAX_PLAN_BLOCKED_RECOVERIES) {
438
- // H1: recovery loop cap reached — stop triggering new turns, escalate to user.
439
- logWarning("guided", `Gate 1b: milestone ${milestoneId} plan-blocked recovery limit reached ` +
440
- `(${entry.planBlockedRecoveryCount}/${MAX_PLAN_BLOCKED_RECOVERIES}); escalating to user`);
441
- ctx.ui.notify(`Milestone ${milestoneId} plan_milestone has been blocked ${entry.planBlockedRecoveryCount} times. ` +
442
- `Re-run /gsd to reset the recovery counter, or run /gsd-debug to diagnose without resetting.`, "error");
443
- return false;
444
- }
445
- logWarning("guided", `Gate 1b: milestone ${milestoneId} queued with CONTEXT.md present — ` +
446
- `plan_milestone was blocked; emitting recovery hint ` +
447
- `(attempt ${entry.planBlockedRecoveryCount + 1}/${MAX_PLAN_BLOCKED_RECOVERIES})`);
448
- ctx.ui.notify(`Milestone ${milestoneId}: context file exists but milestone is still queued. ` +
449
- `Retrying gsd_plan_milestone to complete the blocked planning step.`, "warning");
450
- try {
451
- pi.sendMessage({
452
- customType: "gsd-plan-milestone-blocked-recovery",
453
- content: `Milestone ${milestoneId} has ${contextFile} on disk but its DB row is still ` +
454
- `"queued". The gsd_plan_milestone tool was previously blocked by the ` +
455
- `depth-verification gate. Call gsd_plan_milestone now to complete the ` +
456
- `planning phase.`,
457
- display: false,
458
- }, { triggerTurn: true });
459
- // Increment only after a successful dispatch so transient sendMessage
460
- // failures do not consume recovery budget.
461
- entry.planBlockedRecoveryCount += 1;
462
- }
463
- catch (e) {
464
- logWarning("guided", `Gate 1b recovery sendMessage failed: ${e.message}`);
465
- }
466
- return false;
467
- }
468
- }
469
- // Gate 2: STATE.md must exist — written as the last step in the discuss
470
- // output phase. This prevents auto-start from firing during Phase 3
471
- // (sequential readiness gates for remaining milestones) in multi-milestone
472
- // discussions, where M001-CONTEXT.md exists but M002/M003 haven't been
473
- // processed yet.
474
- const stateFilePath = entry.scope.stateFile();
475
- if (!existsSync(stateFilePath))
476
- return false; // discussion not finalized yet
477
- // Gate 3: Multi-milestone completeness warning
499
+ // Gate 1b: accept the in-flight discuss handoff. A queued DB row with pinned
500
+ // CONTEXT.md is Discussion Complete, Planning Pending, not a plan-blocked
501
+ // failure. If the row is missing, only this pending handoff may repair it.
502
+ if (!ensureMilestoneRowForAcceptedHandoff(entry, contextFile))
503
+ return false;
504
+ // Gate 2: Multi-milestone completeness warning
478
505
  // Parse PROJECT.md for milestone sequence, warn if any are missing context.
479
506
  // Don't block — milestones can be intentionally queued without context.
480
507
  const projectFile = resolveGsdRootFile(basePath, "PROJECT");
@@ -500,7 +527,7 @@ export function checkAutoStartAfterDiscuss(lookupBasePath) {
500
527
  logWarning("guided", `PROJECT.md parsing failed: ${e.message}`);
501
528
  }
502
529
  }
503
- // Gate 4: Discussion manifest process verification (multi-milestone only)
530
+ // Gate 3: Discussion manifest process verification (multi-milestone only)
504
531
  // The LLM writes DISCUSSION-MANIFEST.json after each Phase 3 gate decision.
505
532
  // When it exists, validate it before auto-starting. Project history alone is
506
533
  // not a reliable signal for the current discussion mode.
@@ -546,59 +573,9 @@ export function checkAutoStartAfterDiscuss(lookupBasePath) {
546
573
  logWarning("guided", `manifest unlink failed: ${e.message}`);
547
574
  }
548
575
  }
549
- // R3b: belt-and-suspenders for silent registration failure. The discuss flow
550
- // finished and STATE.md exists, but the milestone may never have landed in
551
- // the DB. Without this guard, the user sees "Milestone M001 ready." and then
552
- // /gsd reports "No Active Milestone".
553
- if (isDbAvailable()) {
554
- const milestoneRow = getMilestone(milestoneId);
555
- if (!milestoneRow) {
556
- let manifestHasMilestone = false;
557
- try {
558
- const manifest = readManifest(basePath);
559
- manifestHasMilestone = Array.isArray(manifest?.milestones) && manifest.milestones.some(m => m.id === milestoneId);
560
- }
561
- catch (e) {
562
- logWarning("guided", `R3b: failed to read state manifest: ${e.message}`);
563
- }
564
- if (manifestHasMilestone) {
565
- logWarning("guided", `R3b: getMilestone(${milestoneId}) returned null but manifest has the row — treating as stale read`);
566
- }
567
- else if (contextFile) {
568
- // R3b-recovery: CONTEXT.md is on disk but gsd_plan_milestone was never called
569
- // (likely blocked by the depth-verification gate re-firing on post-verification
570
- // text). Auto-register as "queued" so Gate 1b can pick it up and retry
571
- // gsd_plan_milestone on the next checkAutoStartAfterDiscuss call.
572
- if (entry.r3bRecoveryCount >= MAX_PLAN_BLOCKED_RECOVERIES) {
573
- logWarning("guided", `R3b: milestone ${milestoneId} DB-row recovery limit reached ` +
574
- `(${entry.r3bRecoveryCount}/${MAX_PLAN_BLOCKED_RECOVERIES}); escalating to user`);
575
- ctx.ui.notify(`Milestone ${milestoneId}: DB row recovery failed ${entry.r3bRecoveryCount} times. ` +
576
- `Re-run /gsd to reset the recovery counter, or run /gsd-debug to diagnose without resetting.`, "error");
577
- return false;
578
- }
579
- logWarning("guided", `R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
580
- `for Gate 1b recovery (attempt ${entry.r3bRecoveryCount + 1}/${MAX_PLAN_BLOCKED_RECOVERIES})`);
581
- try {
582
- insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
583
- }
584
- catch (e) {
585
- logWarning("guided", `R3b: insertMilestone failed: ${e.message}`);
586
- }
587
- entry.r3bRecoveryCount += 1;
588
- ctx.ui.notify(`Milestone ${milestoneId}: context file exists but DB row was missing — recovering. Retrying gsd_plan_milestone.`, "warning");
589
- return false;
590
- }
591
- else {
592
- ctx.ui.notify(`Milestone ${milestoneId}: discuss artifacts on disk but no DB row exists. ` +
593
- `PROJECT.md may have failed to register milestones. ` +
594
- `Re-save PROJECT.md with canonical "- [ ] M001: Title — One-liner" lines, ` +
595
- `then re-run /gsd to recover.`, "error");
596
- return false;
597
- }
598
- }
599
- }
600
576
  deletePendingAutoStart(basePath);
601
- ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
577
+ const hasExecutablePlan = hasExecutablePlanForHandoff(milestoneId, roadmapFile);
578
+ ctx.ui.notify(formatAcceptedDiscussHandoffMessage(milestoneId, contextFile, hasExecutablePlan), "success");
602
579
  if (entry.startAuto !== false) {
603
580
  scheduleAutoStartAfterIdle(ctx, pi, basePath, false, { step: step ?? true });
604
581
  }
@@ -1054,7 +1031,7 @@ function buildHeadlessDiscussPrompt(nextId, seedContext, _basePath) {
1054
1031
  * @param basePath - Root directory of the project
1055
1032
  * @returns The discuss prompt string
1056
1033
  */
1057
- async function buildDiscussPreparationContext(ctx, basePath, mode = "greenfield") {
1034
+ async function buildDiscussPreparationContext(ctx, basePath, mode = "greenfield", skipPriorContext = false) {
1058
1035
  const prefs = loadEffectiveGSDPreferences()?.preferences ?? {};
1059
1036
  if (prefs.discuss_preparation === false)
1060
1037
  return "";
@@ -1071,7 +1048,7 @@ async function buildDiscussPreparationContext(ctx, basePath, mode = "greenfield"
1071
1048
  const parts = [];
1072
1049
  if (codebaseBrief)
1073
1050
  parts.push(`### Codebase Brief\n\n${codebaseBrief}`);
1074
- if (priorContextBrief)
1051
+ if (priorContextBrief && !skipPriorContext)
1075
1052
  parts.push(`### Prior Context Brief\n\n${priorContextBrief}`);
1076
1053
  if (parts.length === 0)
1077
1054
  return "";
@@ -1103,17 +1080,11 @@ async function dispatchNewMilestoneDiscuss(ctx, pi, basePath, nextId, stepMode,
1103
1080
  await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone", { basePath });
1104
1081
  return;
1105
1082
  }
1106
- const preparationContext = await buildDiscussPreparationContext(ctx, basePath, "milestone");
1107
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
1083
+ const preparationContext = await buildDiscussPreparationContext(ctx, basePath, "milestone", true);
1108
1084
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1109
- let prompt = loadPrompt("guided-discuss-milestone", {
1110
- workingDirectory: basePath,
1111
- milestoneId: nextId,
1112
- milestoneTitle: `New milestone ${nextId}`,
1113
- inlinedTemplates: discussMilestoneTemplates,
1114
- structuredQuestionsAvailable,
1085
+ let prompt = await buildDiscussMilestonePrompt(nextId, `New milestone ${nextId}`, basePath, structuredQuestionsAvailable, {
1115
1086
  commitInstruction: buildDocsCommitInstruction(`docs(${nextId}): milestone context from discuss`),
1116
- fastPathInstruction: "",
1087
+ includeContextMode: false,
1117
1088
  });
1118
1089
  if (preparationContext)
1119
1090
  prompt += preparationContext;
@@ -1364,8 +1335,6 @@ export async function showDiscuss(ctx, pi, basePath, options) {
1364
1335
  // Special case: milestone is in needs-discussion phase (has CONTEXT-DRAFT.md but no roadmap yet).
1365
1336
  // Route to the draft discussion flow instead of erroring — the discussion IS how the roadmap gets created.
1366
1337
  if (state.phase === "needs-discussion") {
1367
- const draftFile = resolveMilestoneFile(basePath, mid, "CONTEXT-DRAFT");
1368
- const draftContent = draftFile ? await loadFile(draftFile) : null;
1369
1338
  const choice = await showNextAction(ctx, {
1370
1339
  title: `GSD — ${mid}: ${milestoneTitle}`,
1371
1340
  summary: ["This milestone has a draft context from a prior discussion.", "It needs a dedicated discussion before auto-planning can begin."],
@@ -1390,30 +1359,23 @@ export async function showDiscuss(ctx, pi, basePath, options) {
1390
1359
  notYetMessage: "Run /gsd discuss when ready to discuss this milestone.",
1391
1360
  });
1392
1361
  if (choice === "discuss_draft") {
1393
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
1394
1362
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1395
- const basePrompt = loadPrompt("guided-discuss-milestone", {
1396
- workingDirectory: basePath,
1397
- milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1363
+ const seed = await buildDiscussMilestonePrompt(mid, milestoneTitle, basePath, structuredQuestionsAvailable, {
1398
1364
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1399
- fastPathInstruction: "",
1365
+ includeContextMode: false,
1400
1366
  });
1401
- const seed = draftContent
1402
- ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1403
- : basePrompt;
1404
1367
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: true });
1405
1368
  await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1406
1369
  }
1407
1370
  else if (choice === "discuss_fresh") {
1408
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
1409
1371
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1410
- setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: true });
1411
- await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1412
- workingDirectory: basePath,
1413
- milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1372
+ const prompt = await buildDiscussMilestonePrompt(mid, milestoneTitle, basePath, structuredQuestionsAvailable, {
1414
1373
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1415
- fastPathInstruction: "",
1416
- }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1374
+ includeContextMode: false,
1375
+ includeDraftSeed: false,
1376
+ });
1377
+ setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: true });
1378
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1417
1379
  }
1418
1380
  else if (choice === "skip_milestone") {
1419
1381
  const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
@@ -1631,20 +1593,12 @@ async function dispatchDiscussForMilestone(ctx, pi, basePath, mid, milestoneTitl
1631
1593
  "> Ask only questions where the answer would materially change scope.",
1632
1594
  ].join("\n")
1633
1595
  : "";
1634
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
1635
1596
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1636
- const basePrompt = loadPrompt("guided-discuss-milestone", {
1637
- workingDirectory: basePath,
1638
- milestoneId: mid,
1639
- milestoneTitle,
1640
- inlinedTemplates: discussMilestoneTemplates,
1641
- structuredQuestionsAvailable,
1597
+ const prompt = await buildDiscussMilestonePrompt(mid, milestoneTitle, basePath, structuredQuestionsAvailable, {
1642
1598
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1599
+ includeContextMode: false,
1643
1600
  fastPathInstruction,
1644
1601
  });
1645
- const prompt = draftContent
1646
- ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1647
- : basePrompt;
1648
1602
  await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1649
1603
  }
1650
1604
  // ─── Smart Entry Point ────────────────────────────────────────────────────────
@@ -1908,7 +1862,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1908
1862
  const result = await checkMarkdownHierarchyAgainstDb(basePath);
1909
1863
  if (result.action === "recovery-required") {
1910
1864
  ctx.ui.notify(result.message ??
1911
- `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "/gsd recover"}\` to import markdown explicitly.`, "warning");
1865
+ `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "/gsd recover --confirm"}\` to import markdown explicitly.`, "warning");
1912
1866
  }
1913
1867
  }
1914
1868
  catch (err) {
@@ -2122,8 +2076,6 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2122
2076
  }
2123
2077
  // ── Draft milestone — needs discussion before planning ────────────────
2124
2078
  if (state.phase === "needs-discussion") {
2125
- const draftFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT-DRAFT");
2126
- const draftContent = draftFile ? await loadFile(draftFile) : null;
2127
2079
  const choice = await showNextAction(ctx, {
2128
2080
  title: `GSD — ${milestoneId}: ${milestoneTitle}`,
2129
2081
  summary: ["This milestone has a draft context from a prior discussion.", "It needs a dedicated discussion before auto-planning can begin."],
@@ -2148,30 +2100,23 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2148
2100
  notYetMessage: "Run /gsd when ready to discuss this milestone.",
2149
2101
  });
2150
2102
  if (choice === "discuss_draft") {
2151
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
2152
2103
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2153
- const basePrompt = loadPrompt("guided-discuss-milestone", {
2154
- workingDirectory: basePath,
2155
- milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2104
+ const seed = await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, structuredQuestionsAvailable, {
2156
2105
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2157
- fastPathInstruction: "",
2106
+ includeContextMode: false,
2158
2107
  });
2159
- const seed = draftContent
2160
- ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
2161
- : basePrompt;
2162
2108
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2163
2109
  await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
2164
2110
  }
2165
2111
  else if (choice === "discuss_fresh") {
2166
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
2167
2112
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2168
- setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2169
- await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2170
- workingDirectory: basePath,
2171
- milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2113
+ const prompt = await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, structuredQuestionsAvailable, {
2172
2114
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2173
- fastPathInstruction: "",
2174
- }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
2115
+ includeContextMode: false,
2116
+ includeDraftSeed: false,
2117
+ });
2118
+ setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2119
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone", { basePath });
2175
2120
  }
2176
2121
  else if (choice === "skip_milestone") {
2177
2122
  const milestoneIds = findMilestoneIds(basePath);
@@ -2279,14 +2224,12 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2279
2224
  await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone", { basePath });
2280
2225
  }
2281
2226
  else if (choice === "discuss") {
2282
- const discussMilestoneTemplates = inlineTemplate("context", "Context");
2283
2227
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2284
- await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2285
- workingDirectory: basePath,
2286
- milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2228
+ const prompt = await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, structuredQuestionsAvailable, {
2287
2229
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2288
- fastPathInstruction: "",
2289
- }), "gsd-run", ctx, "discuss-milestone", { basePath });
2230
+ includeContextMode: false,
2231
+ });
2232
+ await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone", { basePath });
2290
2233
  }
2291
2234
  else if (choice === "skip_milestone") {
2292
2235
  const milestoneIds = findMilestoneIds(basePath);
@@ -24,14 +24,17 @@ function collectServerEntries(servers) {
24
24
  export function discoverMcpServers(projectDir) {
25
25
  const mcpJsonPath = resolve(projectDir, ".mcp.json");
26
26
  const settingsPath = resolve(projectDir, ".claude", "settings.json");
27
+ const localSettingsPath = resolve(projectDir, ".claude", "settings.local.json");
27
28
  const mcpJson = readJsonFile(mcpJsonPath);
28
29
  const settings = readJsonFile(settingsPath, true);
30
+ const localSettings = readJsonFile(localSettingsPath, true);
29
31
  const seen = new Set();
30
32
  const discovered = [];
31
33
  for (const entry of [
32
34
  ...collectServerEntries(mcpJson?.mcpServers),
33
35
  ...collectServerEntries(mcpJson?.servers),
34
36
  ...collectServerEntries(settings?.mcpServers),
37
+ ...collectServerEntries(localSettings?.mcpServers),
35
38
  ]) {
36
39
  if (seen.has(entry.name))
37
40
  continue;