@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
@@ -83,6 +83,10 @@ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
83
83
  const TOOLS_ALL = { mode: "all" };
84
84
  const TOOLS_PLANNING = { mode: "planning" };
85
85
  const TOOLS_VERIFICATION = { mode: "verification" };
86
+ const TOOLS_VERIFICATION_DISPATCH_UAT = {
87
+ mode: "verification",
88
+ allowedSubagents: ["mnemo", "scout", "reviewer", "tester"],
89
+ };
86
90
  // Like TOOLS_PLANNING but permits dispatch to read-only recon/planning
87
91
  // specialists. Runtime-enforced by write-gate.ts before the subagent tool runs.
88
92
  const TOOLS_PLANNING_DISPATCH_RECON = {
@@ -372,7 +376,7 @@ export const UNIT_MANIFESTS = {
372
376
  codebaseMap: false,
373
377
  preferences: "active-only",
374
378
  contextMode: "verification",
375
- tools: TOOLS_VERIFICATION,
379
+ tools: TOOLS_VERIFICATION_DISPATCH_UAT,
376
380
  artifacts: {
377
381
  inline: ["slice-uat"],
378
382
  excerpt: ["slice-summary"],
@@ -551,9 +555,10 @@ export function compileSubagentPermissionContract(policy) {
551
555
  if (policy.mode === "all") {
552
556
  return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
553
557
  }
554
- if (policy.mode === "planning-dispatch") {
558
+ if ((policy.mode === "planning-dispatch" || policy.mode === "verification") &&
559
+ Array.isArray(policy.allowedSubagents)) {
555
560
  return {
556
- allowed: true,
561
+ allowed: policy.allowedSubagents.length > 0,
557
562
  allowedSubagents: [...policy.allowedSubagents],
558
563
  toolsMode: policy.mode,
559
564
  };
@@ -0,0 +1,169 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Central Unit-to-tool contracts for phase-aware GSD tool surfaces.
3
+ export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
4
+ "gsd_uat_exec",
5
+ "gsd_uat_result_save",
6
+ "gsd_resume",
7
+ "gsd_milestone_status",
8
+ "gsd_journal_query",
9
+ ];
10
+ export const RUN_UAT_READ_ONLY_TOOL_NAMES = [
11
+ "find",
12
+ "glob",
13
+ "grep",
14
+ "ls",
15
+ "read",
16
+ ];
17
+ export const RUN_UAT_BROWSER_TOOL_NAMES = [
18
+ "browser_navigate",
19
+ "browser_click",
20
+ "browser_type",
21
+ "browser_fill_form",
22
+ "browser_click_ref",
23
+ "browser_fill_ref",
24
+ "browser_wait_for",
25
+ "browser_assert",
26
+ "browser_verify",
27
+ "browser_screenshot",
28
+ "browser_snapshot_refs",
29
+ "browser_find",
30
+ "browser_get_console_logs",
31
+ "browser_get_network_logs",
32
+ "browser_evaluate",
33
+ "browser_reload",
34
+ "browser_batch",
35
+ "browser_act",
36
+ ];
37
+ export const RUN_UAT_TOOL_PRESENTATION_PLAN_ID = "run-uat/default-v1";
38
+ export const UNIT_TOOL_CONTRACTS = {
39
+ "research-milestone": {
40
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
41
+ requiredWorkflowTools: ["gsd_summary_save"],
42
+ },
43
+ "plan-milestone": {
44
+ allowedGsdTools: ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
45
+ requiredWorkflowTools: ["gsd_plan_milestone"],
46
+ },
47
+ "discuss-milestone": {
48
+ allowedGsdTools: [
49
+ "gsd_summary_save",
50
+ "gsd_decision_save",
51
+ "gsd_requirement_save",
52
+ "gsd_requirement_update",
53
+ "gsd_plan_milestone",
54
+ "gsd_milestone_generate_id",
55
+ ],
56
+ requiredWorkflowTools: [
57
+ "gsd_summary_save",
58
+ "gsd_requirement_save",
59
+ "gsd_requirement_update",
60
+ "gsd_plan_milestone",
61
+ "gsd_milestone_generate_id",
62
+ ],
63
+ },
64
+ "discuss-slice": {
65
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
66
+ requiredWorkflowTools: ["gsd_summary_save"],
67
+ },
68
+ "validate-milestone": {
69
+ allowedGsdTools: ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
70
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
71
+ },
72
+ "complete-milestone": {
73
+ allowedGsdTools: ["gsd_complete_milestone", "subagent"],
74
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_complete_milestone"],
75
+ },
76
+ "research-slice": {
77
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
78
+ requiredWorkflowTools: ["gsd_summary_save"],
79
+ },
80
+ "plan-slice": {
81
+ allowedGsdTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
82
+ requiredWorkflowTools: ["gsd_plan_slice"],
83
+ },
84
+ "refine-slice": {
85
+ allowedGsdTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
86
+ requiredWorkflowTools: [],
87
+ },
88
+ "replan-slice": {
89
+ allowedGsdTools: ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
90
+ requiredWorkflowTools: ["gsd_replan_slice"],
91
+ },
92
+ "complete-slice": {
93
+ allowedGsdTools: [
94
+ "gsd_slice_complete",
95
+ "gsd_task_reopen",
96
+ "gsd_replan_slice",
97
+ "gsd_decision_save",
98
+ "gsd_requirement_update",
99
+ "subagent",
100
+ ],
101
+ requiredWorkflowTools: ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"],
102
+ forbiddenGsdTools: {
103
+ gsd_uat_result_save: "Run UAT owns persisted UAT Assessment.",
104
+ },
105
+ },
106
+ "reassess-roadmap": {
107
+ allowedGsdTools: ["gsd_reassess_roadmap"],
108
+ requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
109
+ },
110
+ "execute-task": {
111
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
112
+ requiredWorkflowTools: ["gsd_task_complete"],
113
+ },
114
+ "execute-task-simple": {
115
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
116
+ requiredWorkflowTools: ["gsd_task_complete"],
117
+ },
118
+ "reactive-execute": {
119
+ allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
120
+ requiredWorkflowTools: ["gsd_task_complete"],
121
+ },
122
+ "run-uat": {
123
+ allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
124
+ requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
125
+ forbiddenGsdTools: {
126
+ gsd_exec: "Use gsd_uat_exec so acceptance evidence is typed as UAT-owned.",
127
+ gsd_save_gate_result: "gsd_uat_result_save owns the aggregate UAT gate.",
128
+ gsd_summary_save: "gsd_uat_result_save owns persisted UAT Assessment writes.",
129
+ },
130
+ },
131
+ "gate-evaluate": {
132
+ allowedGsdTools: ["gsd_save_gate_result"],
133
+ requiredWorkflowTools: ["gsd_save_gate_result"],
134
+ },
135
+ "rewrite-docs": {
136
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
137
+ requiredWorkflowTools: [],
138
+ },
139
+ "workflow-preferences": {
140
+ allowedGsdTools: ["gsd_summary_save"],
141
+ requiredWorkflowTools: [],
142
+ },
143
+ "discuss-project": {
144
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
145
+ requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
146
+ },
147
+ "discuss-requirements": {
148
+ allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
149
+ requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
150
+ },
151
+ "research-decision": {
152
+ allowedGsdTools: ["gsd_summary_save"],
153
+ requiredWorkflowTools: ["ask_user_questions"],
154
+ },
155
+ "research-project": {
156
+ allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
157
+ requiredWorkflowTools: [],
158
+ },
159
+ };
160
+ export const AUTO_UNIT_SCOPED_TOOLS = Object.fromEntries(Object.entries(UNIT_TOOL_CONTRACTS).map(([unitType, contract]) => [unitType, contract.allowedGsdTools]));
161
+ export function getUnitToolSurfaceContract(unitType) {
162
+ return UNIT_TOOL_CONTRACTS[unitType];
163
+ }
164
+ export function getRequiredWorkflowToolsForUnit(unitType) {
165
+ return [...(UNIT_TOOL_CONTRACTS[unitType]?.requiredWorkflowTools ?? [])];
166
+ }
167
+ export function getForbiddenGsdToolReason(unitType, toolName) {
168
+ return UNIT_TOOL_CONTRACTS[unitType]?.forbiddenGsdTools?.[toolName];
169
+ }
@@ -8,6 +8,8 @@ import { deriveState } from "./state.js";
8
8
  import { detectWorktreeName } from "./worktree.js";
9
9
  const VALIDATION_BLOCK_RE = /milestone validation returned needs-(?:attention|remediation)|validation verdict is needs-(?:attention|remediation)/i;
10
10
  const VALIDATION_SAFE_DISPATCH_COMMANDS = new Set([
11
+ "reassess",
12
+ "reassess-roadmap",
11
13
  "validate",
12
14
  "validate-milestone",
13
15
  ]);
@@ -5,7 +5,62 @@
5
5
  * (e.g. `passed` → `pass`) are applied consistently across the codebase.
6
6
  */
7
7
  import { extractUatType } from "./files.js";
8
+ import { splitFrontmatter, parseFrontmatterMap } from "../shared/frontmatter.js";
9
+ import { parse as parseYaml } from "yaml";
10
+ function normalizeVerdict(value) {
11
+ if (typeof value !== "string")
12
+ return undefined;
13
+ let verdict = value.trim().toLowerCase();
14
+ if (!verdict)
15
+ return undefined;
16
+ if (verdict === "passed")
17
+ verdict = "pass";
18
+ return verdict;
19
+ }
20
+ function getCaseInsensitive(obj, key) {
21
+ const lowerKey = key.toLowerCase();
22
+ for (const [candidate, value] of Object.entries(obj)) {
23
+ if (candidate.toLowerCase() === lowerKey)
24
+ return value;
25
+ }
26
+ return undefined;
27
+ }
8
28
  // ── Verdict extraction ──────────────────────────────────────────────────
29
+ /**
30
+ * Extract and normalize the frontmatter `verdict` value.
31
+ *
32
+ * Supports both top-level `verdict` and the hook outcome shape
33
+ * `outcome.verdict`. Returns `undefined` when frontmatter is absent or has no
34
+ * verdict field.
35
+ */
36
+ export function extractFrontmatterVerdict(content) {
37
+ const [frontmatterLines] = splitFrontmatter(content);
38
+ if (!frontmatterLines)
39
+ return undefined;
40
+ try {
41
+ const parsed = parseYaml(frontmatterLines.join("\n"));
42
+ if (parsed && typeof parsed === "object") {
43
+ const root = parsed;
44
+ const topLevel = normalizeVerdict(getCaseInsensitive(root, "verdict"));
45
+ if (topLevel)
46
+ return topLevel;
47
+ const outcome = getCaseInsensitive(root, "outcome");
48
+ if (outcome && typeof outcome === "object") {
49
+ const nested = normalizeVerdict(getCaseInsensitive(outcome, "verdict"));
50
+ if (nested)
51
+ return nested;
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // Fall through to the permissive parser used by legacy frontmatter paths.
57
+ }
58
+ const frontmatter = parseFrontmatterMap(frontmatterLines);
59
+ const topLevel = normalizeVerdict(getCaseInsensitive(frontmatter, "verdict"));
60
+ if (topLevel)
61
+ return topLevel;
62
+ return undefined;
63
+ }
9
64
  /**
10
65
  * Extract and normalize the `verdict` value from YAML frontmatter.
11
66
  *
@@ -17,25 +72,14 @@ import { extractUatType } from "./files.js";
17
72
  */
18
73
  export function extractVerdict(content) {
19
74
  // Primary: YAML frontmatter verdict (canonical format)
20
- const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
21
- if (fmMatch) {
22
- const verdictMatch = fmMatch[1].match(/verdict:\s*([\w-]+)/i);
23
- if (verdictMatch) {
24
- let v = verdictMatch[1].toLowerCase();
25
- if (v === "passed")
26
- v = "pass";
27
- return v;
28
- }
29
- return undefined;
30
- }
75
+ const [frontmatterLines] = splitFrontmatter(content);
76
+ if (frontmatterLines)
77
+ return extractFrontmatterVerdict(content);
31
78
  // Fallback: detect verdict in markdown body (LLM manual writes, #2960).
32
79
  // Matches patterns like: **Verdict:** PASS, **Verdict:** ✅ PASS, **Verdict** needs-remediation
33
80
  const bodyMatch = content.match(/\*\*Verdict:?\*\*\s*(?:✅\s*)?(\w[\w-]*)/i);
34
81
  if (bodyMatch) {
35
- let v = bodyMatch[1].toLowerCase();
36
- if (v === "passed")
37
- v = "pass";
38
- return v;
82
+ return normalizeVerdict(bodyMatch[1]);
39
83
  }
40
84
  return undefined;
41
85
  }
@@ -246,6 +246,76 @@ function hasUnsafeShellSyntax(cmd) {
246
246
  }
247
247
  return false;
248
248
  }
249
+ function splitLeadingShellWords(cmd) {
250
+ const words = [];
251
+ let current = "";
252
+ let inSingle = false;
253
+ let inDouble = false;
254
+ let escaped = false;
255
+ for (let i = 0; i < cmd.length; i += 1) {
256
+ const ch = cmd[i];
257
+ if (escaped) {
258
+ current += ch;
259
+ escaped = false;
260
+ continue;
261
+ }
262
+ if (ch === "\\" && !inSingle) {
263
+ escaped = true;
264
+ continue;
265
+ }
266
+ if (ch === "'" && !inDouble) {
267
+ inSingle = !inSingle;
268
+ continue;
269
+ }
270
+ if (ch === "\"" && !inSingle) {
271
+ inDouble = !inDouble;
272
+ continue;
273
+ }
274
+ if (!inSingle && !inDouble) {
275
+ if (/\s/.test(ch)) {
276
+ if (current) {
277
+ words.push(current);
278
+ current = "";
279
+ }
280
+ continue;
281
+ }
282
+ if ([";", "|", "&", "<", ">"].includes(ch)) {
283
+ break;
284
+ }
285
+ }
286
+ current += ch;
287
+ }
288
+ if (current) {
289
+ words.push(current);
290
+ }
291
+ return words;
292
+ }
293
+ function isCountFlag(token) {
294
+ return (token === "--count" ||
295
+ token.startsWith("--count=") ||
296
+ token === "--count-matches" ||
297
+ token.startsWith("--count-matches=") ||
298
+ /^-[A-Za-z]*c[A-Za-z]*$/.test(token));
299
+ }
300
+ function countSearchWarning(command, exitCode) {
301
+ if (exitCode !== 1)
302
+ return null;
303
+ const trimmed = command.trim();
304
+ if (trimmed.startsWith("!"))
305
+ return null;
306
+ const [tool, ...args] = splitLeadingShellWords(trimmed);
307
+ if (tool !== "grep" && tool !== "rg")
308
+ return null;
309
+ if (!args.some(isCountFlag))
310
+ return null;
311
+ return `verification-gate: warning: '${tool} -c' returns exit 1 when count=0; for absence checks use '! ${tool} -q ...' instead.`;
312
+ }
313
+ function appendStderrWarning(stderr, warning) {
314
+ if (!warning)
315
+ return stderr;
316
+ const trimmed = stderr.trimEnd();
317
+ return trimmed ? `${trimmed}\n${warning}` : warning;
318
+ }
249
319
  /**
250
320
  * Known executable first-tokens that are safe to run.
251
321
  * Lowercase commands, common build/test tools, and npm/yarn/pnpm invocations.
@@ -411,11 +481,12 @@ export function runVerificationGate(options) {
411
481
  exitCode = result.status ?? 1;
412
482
  stderr = truncate(result.stderr, MAX_OUTPUT_BYTES);
413
483
  }
484
+ const warning = countSearchWarning(command, exitCode);
414
485
  checks.push({
415
486
  command,
416
487
  exitCode,
417
488
  stdout: truncate(result.stdout, MAX_OUTPUT_BYTES),
418
- stderr,
489
+ stderr: truncate(appendStderrWarning(stderr, warning), MAX_OUTPUT_BYTES),
419
490
  durationMs,
420
491
  });
421
492
  }
@@ -33,6 +33,8 @@ export function shouldAutoPrepareWorkflowMcp(ctx) {
33
33
  const authMode = getAuthModeSafe(ctx, provider);
34
34
  if (provider !== "claude-code")
35
35
  return false;
36
+ if (authMode === undefined)
37
+ return true;
36
38
  return usesWorkflowMcpTransport(authMode, baseUrl) || authMode === "externalCli";
37
39
  }
38
40
  export function prepareWorkflowMcpForProject(ctx, projectRoot, modelOverride) {
@@ -42,7 +44,7 @@ export function prepareWorkflowMcpForProject(ctx, projectRoot, modelOverride) {
42
44
  try {
43
45
  const result = ensureProjectWorkflowMcpConfig(projectRoot);
44
46
  if (result.status !== "unchanged") {
45
- prepCtx.ui?.notify?.(`Claude Code MCP prepared at ${result.configPath}`, "info");
47
+ prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
46
48
  }
47
49
  return result;
48
50
  }
@@ -2,6 +2,7 @@ import { execSync } from "node:child_process";
2
2
  import { existsSync, realpathSync } from "node:fs";
3
3
  import { dirname, resolve, sep } from "node:path";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
5
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
5
6
  /** Session cwd may be a milestone worktree; MCP config and server discovery use the project root. */
6
7
  export function resolveWorkflowMcpProjectRoot(sessionCwd) {
7
8
  let resolved;
@@ -77,6 +78,8 @@ const MCP_WORKFLOW_TOOL_SURFACE = new Set([
77
78
  "gsd_task_complete",
78
79
  "gsd_task_reopen",
79
80
  "gsd_update_requirement",
81
+ "gsd_uat_exec",
82
+ "gsd_uat_result_save",
80
83
  "gsd_validate_milestone",
81
84
  ]);
82
85
  /** Workflow MCP tools are validated by transport compatibility, not pi tool-compat profiles. */
@@ -347,81 +350,10 @@ export function buildWorkflowMcpServers(projectRoot = process.cwd(), env = proce
347
350
  };
348
351
  }
349
352
  export function getRequiredWorkflowToolsForGuidedUnit(unitType) {
350
- switch (unitType) {
351
- case "discuss-project":
352
- return ["ask_user_questions", "gsd_summary_save"];
353
- case "discuss-requirements":
354
- return ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"];
355
- case "research-decision":
356
- return ["ask_user_questions"];
357
- case "discuss-milestone":
358
- return [
359
- "gsd_summary_save",
360
- "gsd_requirement_save",
361
- "gsd_requirement_update",
362
- "gsd_plan_milestone",
363
- "gsd_milestone_generate_id",
364
- ];
365
- case "discuss-slice":
366
- return ["gsd_summary_save"];
367
- case "research-milestone":
368
- case "research-slice":
369
- return ["gsd_summary_save"];
370
- case "plan-milestone":
371
- return ["gsd_plan_milestone"];
372
- case "plan-slice":
373
- return ["gsd_plan_slice"];
374
- case "execute-task":
375
- return ["gsd_task_complete"];
376
- case "complete-slice":
377
- return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
378
- default:
379
- return [];
380
- }
353
+ return getRequiredWorkflowToolsForUnit(unitType);
381
354
  }
382
355
  export function getRequiredWorkflowToolsForAutoUnit(unitType) {
383
- switch (unitType) {
384
- case "discuss-project":
385
- return ["ask_user_questions", "gsd_summary_save"];
386
- case "discuss-requirements":
387
- return ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"];
388
- case "research-decision":
389
- return ["ask_user_questions"];
390
- case "discuss-milestone":
391
- return [
392
- "gsd_summary_save",
393
- "gsd_requirement_save",
394
- "gsd_requirement_update",
395
- "gsd_plan_milestone",
396
- "gsd_milestone_generate_id",
397
- ];
398
- case "research-milestone":
399
- case "research-slice":
400
- case "run-uat":
401
- return ["gsd_summary_save"];
402
- case "plan-milestone":
403
- return ["gsd_plan_milestone"];
404
- case "plan-slice":
405
- return ["gsd_plan_slice"];
406
- case "execute-task":
407
- case "execute-task-simple":
408
- case "reactive-execute":
409
- return ["gsd_task_complete"];
410
- case "complete-slice":
411
- return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
412
- case "replan-slice":
413
- return ["gsd_replan_slice"];
414
- case "reassess-roadmap":
415
- return ["gsd_milestone_status", "gsd_reassess_roadmap"];
416
- case "gate-evaluate":
417
- return ["gsd_save_gate_result"];
418
- case "validate-milestone":
419
- return ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"];
420
- case "complete-milestone":
421
- return ["gsd_milestone_status", "gsd_complete_milestone"];
422
- default:
423
- return [];
424
- }
356
+ return getRequiredWorkflowToolsForUnit(unitType);
425
357
  }
426
358
  export function usesWorkflowMcpTransport(authMode, baseUrl) {
427
359
  return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
@@ -34,6 +34,8 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
34
34
  import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
35
35
  import { invalidateAllCaches } from "./cache.js";
36
36
  import { resolveMilestoneFile } from "./paths.js";
37
+ import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
38
+ import { isClosedStatus } from "./status-guards.js";
37
39
  import { createWorkspace, scopeMilestone } from "./workspace.js";
38
40
  // ADR-016 phase 2 / C1 (#5624): file-system + git-CLI leaf primitives
39
41
  // inlined as direct imports rather than injected through `WorktreeLifecycleDeps`.
@@ -55,6 +57,26 @@ const MERGE_FAILURE_DEDUPE_MS = 60_000;
55
57
  export function resetRecentWorktreeMergeFailuresForTest() {
56
58
  recentWorktreeMergeFailures.clear();
57
59
  }
60
+ function markMilestoneClosedAfterMerge(milestoneId, completedAt) {
61
+ if (!isDbAvailable())
62
+ return;
63
+ try {
64
+ const existing = getMilestone(milestoneId);
65
+ if (!existing) {
66
+ insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
67
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
68
+ invalidateAllCaches();
69
+ return;
70
+ }
71
+ if (!isClosedStatus(existing.status)) {
72
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
73
+ invalidateAllCaches();
74
+ }
75
+ }
76
+ catch (err) {
77
+ logWarning("worktree", `Merged ${milestoneId} but failed to mark milestone complete in DB: ${err instanceof Error ? err.message : String(err)}`);
78
+ }
79
+ }
58
80
  /**
59
81
  * Internal sentinel — thrown by `_mergeBranchMode` when it has already
60
82
  * emitted a user-visible error. The outer `mergeAndExit` catches the type
@@ -1195,6 +1217,8 @@ export class WorktreeLifecycle {
1195
1217
  }
1196
1218
  // #4764 — record merge completion. Only reaches here when an actual
1197
1219
  // merge ran; failure paths throw out before this point.
1220
+ const mergeCompletedAt = new Date().toISOString();
1221
+ markMilestoneClosedAfterMerge(milestoneId, mergeCompletedAt);
1198
1222
  try {
1199
1223
  emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
1200
1224
  reason: "milestone-complete",
@@ -29,6 +29,7 @@ const CHILD_ENV_ALLOWLIST = new Set([
29
29
  "XDG_CONFIG_HOME",
30
30
  "XDG_CACHE_HOME",
31
31
  ]);
32
+ const MCP_STDERR_MAX_BYTES = 4096;
32
33
  let cachedStatus = null;
33
34
  let cachedStatusKey = "";
34
35
  export function clearMcpConfigCache() {
@@ -126,6 +127,33 @@ export function resolveMcpEnv(env) {
126
127
  export function resolveMcpString(value) {
127
128
  return value.replace(/\$\{([^}]+)\}/g, (_match, varName) => process.env[varName] ?? "");
128
129
  }
130
+ function captureTransportStderr(transport) {
131
+ const chunks = [];
132
+ let totalBytes = 0;
133
+ const stderr = transport.stderr;
134
+ stderr?.on("data", (chunk) => {
135
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
136
+ totalBytes += buffer.byteLength;
137
+ chunks.push(buffer);
138
+ while (chunks.reduce((sum, entry) => sum + entry.byteLength, 0) > MCP_STDERR_MAX_BYTES) {
139
+ chunks.shift();
140
+ }
141
+ });
142
+ return () => {
143
+ const captured = Buffer.concat(chunks).toString("utf-8").trim();
144
+ if (!captured)
145
+ return "";
146
+ return totalBytes > MCP_STDERR_MAX_BYTES
147
+ ? `[stderr truncated to last ${MCP_STDERR_MAX_BYTES} bytes]\n${captured}`
148
+ : captured;
149
+ };
150
+ }
151
+ function formatConnectionError(error, stderr) {
152
+ const message = error instanceof Error ? error.message : String(error);
153
+ if (!stderr)
154
+ return message;
155
+ return `${message}\nStderr:\n${stderr}`;
156
+ }
129
157
  export function upsertProjectLocalMcpServer(input, options = {}) {
130
158
  const projectDir = options.projectDir ?? process.cwd();
131
159
  const nextName = input.name.trim();
@@ -224,6 +252,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
224
252
  }
225
253
  const client = new Client({ name: "gsd", version: "1.0.0" });
226
254
  let transport;
255
+ let readCapturedStderr;
227
256
  const timeout = options.timeoutMs ?? 30_000;
228
257
  try {
229
258
  if (config.transport === "stdio") {
@@ -234,6 +263,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
234
263
  cwd: config.cwd,
235
264
  stderr: "pipe",
236
265
  });
266
+ readCapturedStderr = captureTransportStderr(transport);
237
267
  }
238
268
  else {
239
269
  const resolvedUrl = resolveMcpString(config.url ?? "");
@@ -259,7 +289,7 @@ export async function testMcpServerConnection(nameOrConfig, options = {}) {
259
289
  toolCount: 0,
260
290
  tools: [],
261
291
  warnings: config.envWarnings,
262
- error: error instanceof Error ? error.message : String(error),
292
+ error: formatConnectionError(error, readCapturedStderr?.() ?? ""),
263
293
  };
264
294
  }
265
295
  finally {