@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
@@ -78,6 +78,9 @@ function readDetails(result: any): any {
78
78
 
79
79
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- result shape varies by tool
80
80
  function formatToolErrorText(result: any, details: any): string {
81
+ if (typeof details?.displayReason === "string" && details.displayReason) {
82
+ return details.displayReason;
83
+ }
81
84
  const message = details?.error
82
85
  ?? result?.content?.find((entry: { type?: string; text?: string }) => entry.type === "text")?.text
83
86
  ?? "unknown";
@@ -413,6 +416,95 @@ export function registerDbTools(pi: ExtensionAPI): void {
413
416
  pi.registerTool(summarySaveTool);
414
417
  registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
415
418
 
419
+ // ─── gsd_uat_result_save ─────────────────────────────────────────────────
420
+
421
+ const uatResultSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
422
+ const { executeUatResultSave } = await loadWorkflowExecutors();
423
+ return executeUatResultSave(params, resolveWorkflowToolBasePath(_ctx, params));
424
+ };
425
+
426
+ const uatEvidenceRef = Type.Object({
427
+ kind: StringEnum(["gsd_uat_exec", "gsd_exec", "screenshot", "log", "url", "browser"], { description: "Evidence kind" }),
428
+ ref: Type.String({ description: "Evidence ID, approved .gsd path, or URL" }),
429
+ note: Type.Optional(Type.String({ description: "Short evidence note" })),
430
+ unitType: Type.Optional(Type.String({ description: "Unit that produced the evidence" })),
431
+ tool: Type.Optional(Type.String({ description: "Tool that produced the evidence" })),
432
+ executionId: Type.Optional(Type.String({ description: "Stable execution or artifact id" })),
433
+ });
434
+
435
+ const uatCheck = Type.Object({
436
+ id: Type.String({ description: "Stable check ID from the UAT spec" }),
437
+ description: Type.String({ description: "Check description" }),
438
+ mode: StringEnum(["artifact", "runtime", "browser", "human-follow-up"], { description: "Evidence mode" }),
439
+ result: StringEnum(["PASS", "FAIL", "NEEDS-HUMAN"], { description: "Check result" }),
440
+ evidence: Type.Optional(Type.Array(uatEvidenceRef, { description: "Objective evidence references" })),
441
+ notes: Type.Optional(Type.String({ description: "Observed result, failure notes, or human instruction" })),
442
+ nonAutomatable: Type.Optional(Type.Boolean({ description: "True when the check is explicitly non-automatable" })),
443
+ });
444
+
445
+ const toolPresentationBlock = Type.Object({
446
+ surface: Type.Optional(StringEnum(["provider-tools", "claude-code-sdk", "mcp", "hybrid"], { description: "Tool presentation surface" })),
447
+ model: Type.Optional(Type.Object({
448
+ provider: Type.Optional(Type.String()),
449
+ api: Type.Optional(Type.String()),
450
+ id: Type.Optional(Type.String()),
451
+ })),
452
+ presentedTools: Type.Optional(Type.Array(Type.String(), { description: "Tool names actually presented to the model" })),
453
+ blockedTools: Type.Optional(Type.Array(Type.Object({
454
+ name: Type.String(),
455
+ reason: Type.String(),
456
+ }), { description: "Tool names blocked from the model with reasons" })),
457
+ aliases: Type.Optional(Type.Array(Type.Object({
458
+ requested: Type.String(),
459
+ canonical: Type.String(),
460
+ }))),
461
+ fallbackToolsUsed: Type.Optional(Type.Array(Type.String())),
462
+ toolPresentationPlanId: Type.Optional(Type.String()),
463
+ notes: Type.Optional(Type.String()),
464
+ });
465
+
466
+ const uatResultSaveTool = {
467
+ name: "gsd_uat_result_save",
468
+ label: "Save UAT Result",
469
+ description:
470
+ "Save a structured UAT result for a slice. Validates evidence, writes the ASSESSMENT artifact, " +
471
+ "records attempt history, and saves the aggregate UAT gate result.",
472
+ promptSnippet: "Save structured UAT checks, evidence, verdict, and tool-presentation proof",
473
+ promptGuidelines: [
474
+ "Call gsd_uat_result_save once after all UAT checks have been executed.",
475
+ "Every PASS or FAIL check must cite objective evidence, preferably a gsd_uat_exec evidence ID.",
476
+ "Include the presented and blocked tool set in presentation so tool timing is auditable.",
477
+ "Do not use raw gsd_summary_save as a substitute for UAT results.",
478
+ ],
479
+ parameters: Type.Object({
480
+ milestoneId: Type.Optional(Type.String({ description: "Milestone ID (e.g. M001)" })),
481
+ sliceId: Type.Optional(Type.String({ description: "Slice ID (e.g. S01)" })),
482
+ uatType: Type.Optional(Type.String({ description: "Declared UAT mode" })),
483
+ verdict: Type.Optional(Type.String({ description: "Overall UAT verdict: PASS, FAIL, or PARTIAL" })),
484
+ checks: Type.Optional(Type.Array(uatCheck, { description: "Structured check results" })),
485
+ presentation: Type.Optional(toolPresentationBlock),
486
+ notes: Type.Optional(Type.String({ description: "Overall verdict rationale" })),
487
+ attempt: Type.Optional(Type.String({ description: "Attempt number or auto" })),
488
+ previousAttemptId: Type.Optional(Type.String({ description: "Prior attempt ID, when retrying" })),
489
+ }),
490
+ execute: uatResultSaveExecute,
491
+ renderCall(args: any, theme: any) {
492
+ let text = theme.fg("toolTitle", theme.bold("uat_result_save "));
493
+ text += theme.fg("accent", `${args.milestoneId ?? "?"}/${args.sliceId ?? "?"}`);
494
+ if (args.verdict) text += theme.fg("dim", ` → ${args.verdict}`);
495
+ return new Text(text, 0, 0);
496
+ },
497
+ renderResult(result: any, _options: any, theme: any) {
498
+ const d = readDetails(result);
499
+ if (result.isError || d?.error) {
500
+ return new Text(theme.fg("error", formatToolErrorText(result, d)), 0, 0);
501
+ }
502
+ return new Text(theme.fg("success", `UAT ${d?.sliceId ?? ""}: ${d?.verdict ?? "saved"}`), 0, 0);
503
+ },
504
+ };
505
+
506
+ pi.registerTool(uatResultSaveTool);
507
+
416
508
  // ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
417
509
 
418
510
  const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
@@ -746,7 +838,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
746
838
  recommendation: Type.String({ description: "Option id the executor recommends." }),
747
839
  recommendationRationale: Type.String({ description: "Why the recommendation — 1–2 sentences." }),
748
840
  continueWithDefault: Type.Boolean({
749
- description: "When true, loop continues (artifact logged for later review). When false, auto-mode pauses until the user resolves via /gsd escalate resolve.",
841
+ description: "When true, the recommendation is recorded as the default, but auto-mode still pauses until the user resolves via /gsd escalate resolve.",
750
842
  }),
751
843
  }, { description: "ADR-011 Phase 2: optional escalation payload. Only honored when phases.mid_execution_escalation is true." })),
752
844
  verificationEvidence: Type.Optional(Type.Array(
@@ -795,7 +887,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
795
887
  sliceTitle: Type.String({ description: "Title of the slice" }),
796
888
  oneLiner: Type.String({ description: "One-line summary of what the slice accomplished" }),
797
889
  narrative: Type.String({ description: "Detailed narrative of what happened across all tasks" }),
798
- verification: Type.String({ description: "What was verified across all tasks" }),
890
+ verification: Type.Optional(Type.String({ description: "What was verified across all tasks — if omitted, summary records verification as passed without detail." })),
799
891
  uatContent: Type.String({ description: "UAT test content (markdown body)" }),
800
892
  // ── Enrichment metadata (optional — defaults to empty) ────────────
801
893
  deviations: Type.Optional(Type.String({ description: "Deviations from the slice plan, or 'None.'" })),
@@ -1009,7 +1101,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1009
1101
  promptGuidelines: [
1010
1102
  "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
1011
1103
  "Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verificationClasses (optional), verdictRationale, remediationPlan (optional).",
1012
- "If verification classes were planned, verificationClasses must include canonical class rows using the exact class names Contract, Integration, Operational, and UAT when present in planning.",
1104
+ "If verification classes were planned, verificationClasses must be a complete canonical table with one row for every applicable planned class using the exact class names Contract, Integration, Operational, and UAT. Do not submit a partial table.",
1013
1105
  "Planned verification text marked as none/not required/not applicable/N/A (including suffixed variants such as 'not required - backend-only') is treated as not applicable and does not require a class row.",
1014
1106
  "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
1015
1107
  "On success, returns validationPath where VALIDATION.md was written.",
@@ -1022,7 +1114,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1022
1114
  sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
1023
1115
  crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
1024
1116
  requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
1025
- verificationClasses: Type.Optional(Type.String({ description: "Markdown describing verification class compliance and gaps using canonical class names (Contract, Integration, Operational, UAT) for each applicable planned class" })),
1117
+ verificationClasses: Type.Optional(Type.String({ description: "Complete markdown table describing verification class compliance and gaps; include one canonical row for every applicable planned class (Contract, Integration, Operational, UAT)" })),
1026
1118
  verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
1027
1119
  remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
1028
1120
  }),
@@ -25,6 +25,57 @@ async function loadContextModePreferences(baseDir: string) {
25
25
  }
26
26
 
27
27
  export function registerExecTools(pi: ExtensionAPI): void {
28
+ pi.registerTool({
29
+ name: "gsd_uat_exec",
30
+ label: "UAT Exec",
31
+ description:
32
+ "Run a UAT-scoped bash/node/python check with milestone/slice/check metadata. " +
33
+ "Uses the same capped .gsd/exec evidence store as gsd_exec, but rejects commands that mutate dependencies, git state, credentials, or destructive files.",
34
+ promptSnippet: "Run one UAT check and save typed evidence under .gsd/exec",
35
+ promptGuidelines: [
36
+ "Use gsd_uat_exec for each automated UAT check.",
37
+ "Every PASS/FAIL check saved by gsd_uat_result_save must reference objective evidence from this tool or another approved GSD evidence path.",
38
+ "Do not install packages, mutate git state, edit source files, or dump credentials during UAT.",
39
+ ],
40
+ parameters: Type.Object({
41
+ milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
42
+ sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
43
+ checkId: Type.String({ description: "Stable check ID from the UAT spec (e.g. UAT-01)" }),
44
+ intent: Type.String({
45
+ description:
46
+ "UAT command intent. Use one canonical value: uat-artifact-check, uat-runtime-check, " +
47
+ "uat-browser-check, uat-service-start, or uat-log-inspection. Short aliases such as artifact, " +
48
+ "runtime, browser, service-start, and log-inspection are accepted.",
49
+ }),
50
+ runtime: Type.Optional(
51
+ Type.String({
52
+ description:
53
+ "Optional interpreter. Defaults to bash. Supported: bash, node, python; sh/shell, js/nodejs, and py/python3 aliases are accepted.",
54
+ }),
55
+ ),
56
+ script: Type.Optional(Type.String({ description: "Script body. Keep output small (log the finding, not the data)." })),
57
+ command: Type.Optional(Type.String({ description: "Alias for script; defaults to bash when runtime is omitted." })),
58
+ cmd: Type.Optional(Type.String({ description: "Short alias for script." })),
59
+ code: Type.Optional(Type.String({ description: "Alias for script, useful for node/python snippets." })),
60
+ expected: Type.Optional(Type.String({ description: "Expected outcome for this UAT check." })),
61
+ timeout_ms: Type.Optional(
62
+ Type.Number({
63
+ description: "Per-invocation timeout (ms). Capped at 600000. Default from preferences.",
64
+ minimum: 1_000,
65
+ maximum: 600_000,
66
+ }),
67
+ ),
68
+ }),
69
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
70
+ const { executeUatExec } = await import("../tools/exec-tool.js");
71
+ const baseDir = resolveCtxCwd(_ctx);
72
+ return executeUatExec(params as Parameters<typeof executeUatExec>[0], {
73
+ baseDir,
74
+ preferences: await loadContextModePreferences(baseDir),
75
+ });
76
+ },
77
+ });
78
+
28
79
  pi.registerTool({
29
80
  name: "gsd_exec",
30
81
  label: "Exec (Sandboxed)",
@@ -17,7 +17,7 @@ import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer,
17
17
  import { resolveManifest } from "../unit-context-manifest.js";
18
18
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
19
19
  import { loadFile, saveFile, formatContinue } from "../files.js";
20
- import { clearToolInvocationError, getAutoRuntimeSnapshot, isAutoActive, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
20
+ import { clearToolInvocationError, getAutoRuntimeSnapshot, isAutoActive, isAutoCompletionStopInProgress, isAutoPaused, markToolEnd, markToolStart, recordToolInvocationError } from "../auto-runtime-state.js";
21
21
 
22
22
  import { checkToolCallLoop, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
23
23
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
@@ -36,7 +36,9 @@ import { resolveSkillManifest } from "../skill-manifest.js";
36
36
  import { applyUnitSkillVisibility, unitHasSkillManifest } from "../skill-scope.js";
37
37
  import { getGuidedUnitContext } from "../guided-unit-context.js";
38
38
  import { registerPlanMilestoneSchemaRecovery } from "./plan-milestone-schema-recovery.js";
39
- import { AUTO_UNIT_SCOPED_TOOLS, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
39
+ import { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, isWorkflowAliasTool } from "../auto-unit-tool-scope.js";
40
+ import { filterToolsForProvider } from "../model-router.js";
41
+ import { RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES } from "../tool-presentation-plan.js";
40
42
 
41
43
  let approvalQuestionAbortInFlight = false;
42
44
 
@@ -123,6 +125,7 @@ export const MINIMAL_GSD_TOOL_NAMES = [
123
125
  "gsd_resume",
124
126
  "gsd_milestone_status",
125
127
  "gsd_checkpoint_db",
128
+ "gsd_plan_milestone",
126
129
  "memory_query",
127
130
  "capture_thought",
128
131
  ] as const;
@@ -226,6 +229,9 @@ export function buildMinimalAutoGsdToolSet(
226
229
  unitType: string | undefined,
227
230
  registeredToolNames: readonly string[] = activeToolNames,
228
231
  ): string[] {
232
+ if (unitType === "run-uat") {
233
+ return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
234
+ }
229
235
  const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
230
236
  const autoBaseTools = new Set<string>(MINIMAL_AUTO_BASE_TOOL_NAMES);
231
237
  const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
@@ -240,6 +246,22 @@ export function buildMinimalAutoGsdToolSet(
240
246
  return withPreservedShimTools([...new Set([...preserved, ...scoped])]);
241
247
  }
242
248
 
249
+ export function buildRunUatGsdToolSet(
250
+ activeToolNames: readonly string[],
251
+ registeredToolNames: readonly string[] = activeToolNames,
252
+ ): string[] {
253
+ const scoped = resolveScopedToolNames(
254
+ [...activeToolNames, ...registeredToolNames],
255
+ [
256
+ ...RUN_UAT_WORKFLOW_TOOL_NAMES,
257
+ ...RUN_UAT_READ_ONLY_TOOL_NAMES,
258
+ "subagent",
259
+ ...RUN_UAT_BROWSER_TOOL_NAMES,
260
+ ],
261
+ );
262
+ return [...new Set(scoped)];
263
+ }
264
+
243
265
  export function buildMinimalGsdWorkflowToolSet(
244
266
  activeToolNames: readonly string[],
245
267
  registeredToolNames: readonly string[] = activeToolNames,
@@ -463,22 +485,30 @@ function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
463
485
  return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
464
486
  }
465
487
 
488
+ function withDepthGateDisplayReason<T extends { block: boolean; reason?: string }>(
489
+ result: T,
490
+ displayReason = "Depth confirmation is waiting for your answer.",
491
+ ): T & { displayReason?: string } {
492
+ if (!result.block) return result;
493
+ return { ...result, displayReason };
494
+ }
495
+
466
496
  function shouldBlockDeferredApprovalTool(
467
497
  toolName: string,
468
498
  input: unknown,
469
499
  basePath: string,
470
- ): { block: boolean; reason?: string } {
500
+ ): { block: boolean; reason?: string; displayReason?: string } {
471
501
  if (deferredApprovalGate?.basePath !== basePath) return { block: false };
472
502
  if (toolName === "ask_user_questions") return { block: false };
473
503
  if (isContextDraftSummarySave(toolName, input)) return { block: false };
474
- return {
504
+ return withDepthGateDisplayReason({
475
505
  block: true,
476
506
  reason: [
477
507
  `HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
478
508
  `Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
479
509
  `Wait for the user's answer before calling additional tools.`,
480
510
  ].join(" "),
481
- };
511
+ });
482
512
  }
483
513
 
484
514
  export function resolveNotificationStoreBasePath(basePath: string): string {
@@ -518,8 +548,9 @@ export function registerHooks(
518
548
 
519
549
  pi.on("session_start", async (_event, ctx) => {
520
550
  const basePath = contextBasePath(ctx);
551
+ const preserveCloseoutSurface = isAutoCompletionStopInProgress();
521
552
  initSessionNotifications(ctx);
522
- if (!isAutoActive()) {
553
+ if (!isAutoActive() && !preserveCloseoutSurface) {
523
554
  const { initHealthWidget } = await import("../health-widget.js");
524
555
  initHealthWidget(ctx);
525
556
  }
@@ -539,15 +570,18 @@ export function registerHooks(
539
570
  const prefs = loadEffectiveGSDPreferences(basePath);
540
571
  process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
541
572
  } catch { /* non-fatal */ }
542
- await installWelcomeHeader(ctx);
573
+ if (!preserveCloseoutSurface) {
574
+ await installWelcomeHeader(ctx);
575
+ }
543
576
  await loadToolApiKeysForSession();
544
- if (isAutoActive()) {
577
+ if (isAutoActive() || preserveCloseoutSurface) {
545
578
  ctx.ui.setWidget("gsd-health", undefined);
546
579
  }
547
580
  });
548
581
 
549
582
  pi.on("session_switch", async (_event, ctx) => {
550
583
  const basePath = contextBasePath(ctx);
584
+ const preserveCloseoutSurface = isAutoCompletionStopInProgress();
551
585
  initSessionNotifications(ctx);
552
586
  resetWriteGateState(basePath);
553
587
  resetToolCallLoopGuard();
@@ -559,7 +593,7 @@ export function registerHooks(
559
593
  await applyCompactionThresholdOverride(ctx);
560
594
  await prepareWorkflowMcpForHookContext(ctx, basePath);
561
595
  await loadToolApiKeysForSession();
562
- if (!isAutoActive()) {
596
+ if (!isAutoActive() && !preserveCloseoutSurface) {
563
597
  ctx.ui.setWidget("gsd-progress", undefined);
564
598
  ctx.ui.setWidget("gsd-outcome", undefined);
565
599
  const { initHealthWidget } = await import("../health-widget.js");
@@ -896,7 +930,7 @@ export function registerHooks(
896
930
  "Depth confirmation is waiting for your answer — pausing auto-mode.",
897
931
  );
898
932
  }
899
- return bashGuard;
933
+ return withDepthGateDisplayReason(bashGuard);
900
934
  }
901
935
  } else {
902
936
  const gateGuard = shouldBlockPendingGate(
@@ -914,7 +948,7 @@ export function registerHooks(
914
948
  "Depth confirmation is waiting for your answer — pausing auto-mode.",
915
949
  );
916
950
  }
917
- return gateGuard;
951
+ return withDepthGateDisplayReason(gateGuard);
918
952
  }
919
953
  }
920
954
  }
@@ -1019,12 +1053,13 @@ export function registerHooks(
1019
1053
  isQueuePhaseActive(discussionBasePath),
1020
1054
  discussionBasePath,
1021
1055
  );
1022
- if (result.block) return result;
1056
+ if (result.block) {
1057
+ return withDepthGateDisplayReason(result, "Depth check required before writing milestone context.");
1058
+ }
1023
1059
  });
1024
1060
 
1025
- // ── Safety harness: evidence collection + destructive command warnings ──
1061
+ // ── Safety harness: evidence collection + destructive command blocking ──
1026
1062
  pi.on("tool_call", async (event, ctx) => {
1027
- if (!isAutoActive()) return;
1028
1063
  markToolStart(event.toolCallId, event.toolName);
1029
1064
  safetyRecordToolCall(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
1030
1065
 
@@ -1041,17 +1076,28 @@ export function registerHooks(
1041
1076
  }
1042
1077
  }
1043
1078
 
1044
- // Destructive command classification (warn only, never block)
1079
+ // Destructive command classification + hard gate in all modes.
1045
1080
  if (isToolCallEventType("bash", event)) {
1046
1081
  const classification = classifyCommand(event.input.command);
1047
1082
  if (classification.destructive) {
1083
+ const reason = [
1084
+ "HARD BLOCK: destructive Bash command requires explicit human confirmation.",
1085
+ `Detected: ${classification.labels.join(", ")}`,
1086
+ "Run this via ask_user_questions, wait for the user's response,",
1087
+ "then issue the command only when confirmed in the current turn.",
1088
+ ].join(" ");
1048
1089
  safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
1049
1090
  command: String(event.input.command).slice(0, 200),
1050
1091
  });
1051
- ctx.ui.notify(
1052
- `Destructive command detected: ${classification.labels.join(", ")}`,
1053
- "warning",
1054
- );
1092
+ if (ctx) {
1093
+ await maybePauseAutoForApprovalGate(
1094
+ ctx,
1095
+ pi,
1096
+ isAutoActive(),
1097
+ "Depth confirmation is waiting for your answer — pausing auto-mode.",
1098
+ );
1099
+ }
1100
+ return { block: true, reason };
1055
1101
  }
1056
1102
  }
1057
1103
  });
@@ -1320,19 +1366,27 @@ export function registerHooks(
1320
1366
  const fullToolsRequested = isFullGsdToolSurfaceRequested();
1321
1367
  const dropAliases = !fullToolsRequested;
1322
1368
  const dropBrowser = !fullToolsRequested && !isBrowserToolSurfaceRequested();
1323
- const providerCompatible = compatible.filter(
1324
- (name) => !(dropAliases && isWorkflowAliasTool(name)) && !(dropBrowser && isBrowserTool(name)),
1369
+ const aliasFilteredCompatible = compatible.filter(
1370
+ (name) => !(dropAliases && isWorkflowAliasTool(name)),
1371
+ );
1372
+ const providerCompatible = aliasFilteredCompatible.filter(
1373
+ (name) => !(dropBrowser && isBrowserTool(name)),
1325
1374
  );
1326
1375
  const surfaceReduced = providerCompatible.length !== compatible.length;
1327
1376
  if (fullToolsRequested) {
1328
1377
  return surfaceReduced ? { toolNames: providerCompatible } : undefined;
1329
1378
  }
1330
1379
  const registeredToolNames = resolveRegisteredToolNames(pi, event.activeToolNames);
1380
+ const compatibleRegisteredToolNames = filterToolsForProvider(
1381
+ registeredToolNames,
1382
+ event.selectedModelApi,
1383
+ event.selectedModelProvider,
1384
+ ).compatible.filter((name) => !(dropAliases && isWorkflowAliasTool(name)));
1331
1385
  const guidedUnit = getGuidedUnitContext();
1332
1386
  const requestScoped = buildRequestScopedGsdToolSet(
1333
- providerCompatible,
1387
+ guidedUnit?.unitType === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1334
1388
  event.requestCustomMessages,
1335
- registeredToolNames,
1389
+ guidedUnit?.unitType === "run-uat" ? compatibleRegisteredToolNames : registeredToolNames,
1336
1390
  guidedUnit?.unitType,
1337
1391
  );
1338
1392
  if (requestScoped) {
@@ -1342,9 +1396,11 @@ export function registerHooks(
1342
1396
  if (dash.active && dash.currentUnit) {
1343
1397
  return {
1344
1398
  toolNames: buildMinimalAutoGsdToolSet(
1345
- providerCompatible,
1399
+ dash.currentUnit.type === "run-uat" ? aliasFilteredCompatible : providerCompatible,
1346
1400
  dash.currentUnit.type,
1347
- resolveRegisteredToolNames(pi, event.activeToolNames),
1401
+ dash.currentUnit.type === "run-uat"
1402
+ ? compatibleRegisteredToolNames
1403
+ : resolveRegisteredToolNames(pi, event.activeToolNames),
1348
1404
  ),
1349
1405
  };
1350
1406
  }