@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.9bb7453

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 (395) 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 +44 -0
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
  15. package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
  16. package/dist/resources/extensions/gsd/auto-recovery.js +4 -4
  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 +2 -1
  21. package/dist/resources/extensions/gsd/auto.js +31 -6
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +83 -4
  23. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  24. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +39 -14
  25. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
  26. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
  29. package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
  30. package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
  31. package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
  32. package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
  33. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  34. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  35. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  36. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  37. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  38. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  39. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  40. package/dist/resources/extensions/gsd/escalation.js +4 -4
  41. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  42. package/dist/resources/extensions/gsd/forensics.js +74 -2
  43. package/dist/resources/extensions/gsd/gsd-db.js +42 -6
  44. package/dist/resources/extensions/gsd/guided-flow.js +30 -69
  45. package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
  46. package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
  47. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  48. package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
  49. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  50. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  51. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  52. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  53. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  54. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  55. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  57. package/dist/resources/extensions/gsd/prompts/run-uat.md +48 -24
  58. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  59. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  60. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  61. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  62. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  66. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  67. package/dist/resources/extensions/gsd/state.js +17 -14
  68. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  69. package/dist/resources/extensions/gsd/tool-presentation-plan.js +120 -0
  70. package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
  71. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  72. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  73. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
  74. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  75. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  76. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +403 -3
  77. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  78. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  79. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  80. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  81. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
  82. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -1
  83. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
  84. package/dist/resources/extensions/mcp-client/manager.js +31 -1
  85. package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
  86. package/dist/rtk.d.ts +7 -1
  87. package/dist/rtk.js +27 -11
  88. package/dist/update-check.d.ts +15 -1
  89. package/dist/update-check.js +87 -12
  90. package/dist/update-cmd.d.ts +1 -0
  91. package/dist/update-cmd.js +53 -2
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  94. package/dist/web/standalone/.next/build-manifest.json +2 -2
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/index.html +1 -1
  114. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  121. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  124. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  125. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  126. package/package.json +5 -3
  127. package/packages/cloud-mcp-gateway/package.json +2 -2
  128. package/packages/contracts/dist/workflow.d.ts +14 -0
  129. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  130. package/packages/contracts/dist/workflow.js +16 -0
  131. package/packages/contracts/dist/workflow.js.map +1 -1
  132. package/packages/contracts/package.json +1 -1
  133. package/packages/daemon/package.json +4 -4
  134. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  135. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  136. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  137. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  138. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  139. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  140. package/packages/gsd-agent-core/dist/index.js +1 -0
  141. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  142. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  143. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  144. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  145. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  146. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  147. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  148. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  149. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  150. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  152. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  153. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  154. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  155. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  156. package/packages/gsd-agent-core/package.json +6 -6
  157. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  158. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  159. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  160. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  161. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  162. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  163. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  165. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  171. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  172. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  173. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
  176. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  178. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  188. package/packages/gsd-agent-modes/package.json +7 -7
  189. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  190. package/packages/mcp-server/dist/remote-questions.js +23 -9
  191. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  192. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  193. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  194. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  195. package/packages/mcp-server/package.json +3 -3
  196. package/packages/native/package.json +1 -1
  197. package/packages/pi-agent-core/dist/agent-loop.js +38 -0
  198. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  199. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  200. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  201. package/packages/pi-agent-core/dist/agent.js +2 -0
  202. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  203. package/packages/pi-agent-core/dist/types.d.ts +3 -0
  204. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  205. package/packages/pi-agent-core/dist/types.js.map +1 -1
  206. package/packages/pi-agent-core/package.json +1 -1
  207. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  208. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/api-registry.js +23 -0
  210. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  211. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  212. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  214. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  215. package/packages/pi-ai/dist/models.generated.d.ts +406 -17
  216. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  217. package/packages/pi-ai/dist/models.generated.js +484 -116
  218. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  219. package/packages/pi-ai/dist/stream.js +6 -6
  220. package/packages/pi-ai/dist/stream.js.map +1 -1
  221. package/packages/pi-ai/package.json +1 -1
  222. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  224. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  226. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  228. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  229. package/packages/pi-coding-agent/package.json +7 -7
  230. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  231. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  232. package/packages/pi-tui/dist/terminal.js +8 -4
  233. package/packages/pi-tui/dist/terminal.js.map +1 -1
  234. package/packages/pi-tui/package.json +1 -1
  235. package/packages/rpc-client/package.json +2 -2
  236. package/pkg/package.json +1 -1
  237. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
  238. package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
  239. package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
  240. package/src/resources/extensions/browser-tools/index.ts +60 -9
  241. package/src/resources/extensions/browser-tools/package.json +5 -1
  242. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
  243. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
  244. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
  245. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
  246. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  247. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  248. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  249. package/src/resources/extensions/gsd/auto-dispatch.ts +53 -0
  250. package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
  251. package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
  252. package/src/resources/extensions/gsd/auto-recovery.ts +4 -4
  253. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  254. package/src/resources/extensions/gsd/auto-start.ts +112 -17
  255. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  256. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +2 -1
  257. package/src/resources/extensions/gsd/auto.ts +47 -5
  258. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +90 -4
  259. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  260. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +60 -19
  261. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
  262. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  263. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  264. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
  265. package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
  266. package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
  267. package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
  268. package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
  269. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  270. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  271. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  272. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  273. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  274. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  275. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  276. package/src/resources/extensions/gsd/escalation.ts +4 -4
  277. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  278. package/src/resources/extensions/gsd/forensics.ts +99 -5
  279. package/src/resources/extensions/gsd/gsd-db.ts +46 -8
  280. package/src/resources/extensions/gsd/guided-flow.ts +91 -83
  281. package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
  282. package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
  283. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  284. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  285. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  286. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  287. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  288. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  289. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  290. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  291. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  292. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  293. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  294. package/src/resources/extensions/gsd/prompts/run-uat.md +48 -24
  295. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  296. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  297. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  298. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  299. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  300. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  301. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
  302. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  303. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  304. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  305. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  306. package/src/resources/extensions/gsd/state.ts +18 -14
  307. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  308. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  309. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
  310. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
  311. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
  312. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  313. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  314. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  315. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  316. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  317. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  318. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  319. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  320. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
  321. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  322. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
  323. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  324. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  325. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  326. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  327. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  328. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  329. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  330. package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
  331. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
  332. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  333. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  334. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  335. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  336. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -10
  337. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
  338. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
  339. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
  340. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
  341. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  342. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
  343. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  344. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  345. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  346. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
  347. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  348. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  349. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  350. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +53 -1
  351. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  352. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  353. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  354. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  355. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +35 -0
  356. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  357. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  358. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
  359. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  360. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
  361. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  362. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  363. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  364. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  365. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
  366. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  367. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  368. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  369. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  370. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  371. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  372. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
  373. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +213 -0
  374. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
  375. package/src/resources/extensions/gsd/tool-presentation-plan.ts +167 -0
  376. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
  377. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  378. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  379. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
  380. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  381. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  382. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +489 -3
  383. package/src/resources/extensions/gsd/types.ts +69 -5
  384. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  385. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  386. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  387. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  388. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
  389. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -1
  390. package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
  391. package/src/resources/extensions/mcp-client/manager.ts +33 -1
  392. package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
  393. package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
  394. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
  395. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
@@ -60,12 +60,13 @@ import { getAutoWorktreePath, isInAutoWorktree, checkoutBranchWithStashGuard } f
60
60
  import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
61
61
  import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
62
62
  import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
63
+ import { queryJournal } from "./journal.js";
63
64
  import { initMetrics } from "./metrics.js";
64
65
  import { initRoutingHistory } from "./routing-history.js";
65
66
  import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
66
67
  import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
67
68
  import { snapshotSkills } from "./skill-discovery.js";
68
- import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus } from "./gsd-db.js";
69
+ import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, openDatabase, getDbStatus, updateMilestoneStatus } from "./gsd-db.js";
69
70
  import { isClosedStatus } from "./status-guards.js";
70
71
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
71
72
  import { extractVerdict } from "./verdict-parser.js";
@@ -100,6 +101,7 @@ import {
100
101
  } from "./preferences-models.js";
101
102
  import type { WorktreeLifecycle } from "./worktree-lifecycle.js";
102
103
  import { getSessionModelOverride } from "./session-model-override.js";
104
+ import { setAutoActiveStatus } from "./auto-dashboard.js";
103
105
 
104
106
  export interface BootstrapDeps {
105
107
  shouldUseWorktreeIsolation: (basePath?: string) => boolean;
@@ -187,6 +189,40 @@ export function reconcileProjectMilestonesFromDisk(basePath: string): number {
187
189
  }
188
190
  }
189
191
 
192
+ export function reconcileMergedMilestonesFromJournal(basePath: string): number {
193
+ if (!isDbAvailable()) return 0;
194
+
195
+ const mergedAtByMilestone = new Map<string, string>();
196
+ for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
197
+ const data = entry.data ?? {};
198
+ const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
199
+ if (!milestoneId) continue;
200
+ if (data.conflict === true) continue;
201
+
202
+ const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
203
+ const previous = mergedAtByMilestone.get(milestoneId);
204
+ if (!previous || endedAt > previous) mergedAtByMilestone.set(milestoneId, endedAt);
205
+ }
206
+
207
+ let closed = 0;
208
+ for (const [milestoneId, completedAt] of mergedAtByMilestone) {
209
+ const existing = getMilestone(milestoneId);
210
+ if (!existing) {
211
+ insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
212
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
213
+ closed++;
214
+ continue;
215
+ }
216
+ if (!isClosedStatus(existing.status)) {
217
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
218
+ closed++;
219
+ }
220
+ }
221
+
222
+ if (closed > 0) invalidateAllCaches();
223
+ return closed;
224
+ }
225
+
190
226
  /**
191
227
  * Audit for orphaned milestone branches at bootstrap.
192
228
  *
@@ -258,6 +294,7 @@ export interface OrphanAuditAction {
258
294
  message: string;
259
295
  severity: "info" | "warning";
260
296
  branch?: string;
297
+ mainBranch?: string;
261
298
  commitsAhead?: number;
262
299
  dirtyWorktree?: boolean;
263
300
  worktreeDirExists?: boolean;
@@ -276,6 +313,27 @@ function isBlockingStrandedWorkAction(action: OrphanAuditAction): boolean {
276
313
  return action.kind === "in-progress-stranded-work" && action.blocksAuto;
277
314
  }
278
315
 
316
+ function strandedWorkEvidence(args: {
317
+ branch?: string;
318
+ commitsAhead: number;
319
+ mainBranch: string;
320
+ dirtyWorktree: boolean;
321
+ }): string[] {
322
+ const evidence: string[] = [];
323
+ if (args.branch && args.commitsAhead > 0) {
324
+ evidence.push(
325
+ `branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
326
+ );
327
+ }
328
+ if (args.dirtyWorktree) {
329
+ evidence.push("the worktree has uncommitted changes");
330
+ }
331
+ if (evidence.length === 0) {
332
+ evidence.push("physical git evidence exists");
333
+ }
334
+ return evidence;
335
+ }
336
+
279
337
  function detectWorktreeEvidence(
280
338
  basePath: string,
281
339
  milestoneId: string,
@@ -307,18 +365,7 @@ function strandedWorkMessage(args: {
307
365
  worktreeDirExists: boolean;
308
366
  recoveryMode: StrandedWorkRecoveryMode;
309
367
  }): string {
310
- const evidence: string[] = [];
311
- if (args.branch && args.commitsAhead > 0) {
312
- evidence.push(
313
- `branch ${args.branch} has ${args.commitsAhead} commit(s) ahead of ${args.mainBranch}`,
314
- );
315
- }
316
- if (args.dirtyWorktree) {
317
- evidence.push("the worktree has uncommitted changes");
318
- }
319
- if (evidence.length === 0) {
320
- evidence.push("physical git evidence exists");
321
- }
368
+ const evidence = strandedWorkEvidence(args);
322
369
 
323
370
  const wtSuffix = args.worktreeDirExists
324
371
  ? ` Worktree directory at .gsd/worktrees/${args.milestoneId}/ holds live work.`
@@ -334,6 +381,45 @@ function strandedWorkMessage(args: {
334
381
  );
335
382
  }
336
383
 
384
+ function formatStrandedWorkRecoveryMessage(action: OrphanAuditAction): string {
385
+ const recoveryMode = action.recoveryMode === "worktree"
386
+ ? "existing worktree"
387
+ : "milestone branch";
388
+ const evidence = strandedWorkEvidence({
389
+ branch: action.branch,
390
+ commitsAhead: action.commitsAhead ?? 0,
391
+ mainBranch: action.mainBranch ?? "main",
392
+ dirtyWorktree: action.dirtyWorktree ?? false,
393
+ });
394
+ const wtSuffix = action.worktreeDirExists
395
+ ? ` Worktree directory at .gsd/worktrees/${action.milestoneId}/ holds live work.`
396
+ : "";
397
+ return (
398
+ `Resuming saved milestone work for ${action.milestoneId}: ${evidence.join("; ")}.` +
399
+ wtSuffix +
400
+ ` Adopting the ${recoveryMode} before dispatching new units. Park or discard explicitly if abandoning.`
401
+ );
402
+ }
403
+
404
+ function formatStrandedWorkBlockerMessage(
405
+ action: OrphanAuditAction,
406
+ activeMilestoneId: string | null,
407
+ ): string {
408
+ const target = action.milestoneId;
409
+ const mode = action.recoveryMode === "worktree" ? "existing worktree" : "milestone branch";
410
+ const intro = activeMilestoneId
411
+ ? `Stranded work for ${target} blocks auto-mode before ${activeMilestoneId}.`
412
+ : `Stranded work for ${target} blocks auto-mode, but that milestone is not active in project state.`;
413
+
414
+ return [
415
+ intro,
416
+ "Choose one explicit next step:",
417
+ `1. Recover it: run \`/gsd auto ${target}\` to adopt the ${mode}.`,
418
+ `2. Defer it: run \`/gsd park ${target} "reason"\`, then rerun \`/gsd auto\`.`,
419
+ `3. Abandon it: run \`/gsd rethink\` and explicitly discard ${target}.`,
420
+ ].join("\n");
421
+ }
422
+
337
423
  export function auditOrphanedMilestoneBranches(
338
424
  basePath: string,
339
425
  _isolationMode: "worktree" | "branch" | "none",
@@ -435,6 +521,7 @@ export function auditOrphanedMilestoneBranches(
435
521
  kind: "in-progress-stranded-work",
436
522
  milestoneId,
437
523
  branch,
524
+ mainBranch,
438
525
  commitsAhead,
439
526
  dirtyWorktree: worktreeEvidence.dirty,
440
527
  worktreeDirExists: worktreeEvidence.dirExists,
@@ -589,6 +676,7 @@ export function auditOrphanedMilestoneBranches(
589
676
  pushAction({
590
677
  kind: "in-progress-stranded-work",
591
678
  milestoneId: m.id,
679
+ mainBranch,
592
680
  commitsAhead: 0,
593
681
  dirtyWorktree: true,
594
682
  worktreeDirExists: worktreeEvidence.dirExists,
@@ -1066,6 +1154,7 @@ export async function bootstrapAutoSession(
1066
1154
  await openProjectDbIfPresent(base);
1067
1155
  registerAutoWorkerForSession(base);
1068
1156
  reconcileProjectMilestonesFromDisk(base);
1157
+ reconcileMergedMilestonesFromJournal(base);
1069
1158
 
1070
1159
  // Clean stale runtime unit files for completed milestones (#887).
1071
1160
  // DB-authoritative: when DB is available, require DB status to be closed
@@ -1103,7 +1192,13 @@ export async function bootstrapAutoSession(
1103
1192
  for (const msg of auditResult.recovered) {
1104
1193
  ctx.ui.notify(`Orphan audit: ${msg}`, "info");
1105
1194
  }
1195
+ const deferredStrandedMessages = new Set(
1196
+ auditResult.actions
1197
+ .filter(isBlockingStrandedWorkAction)
1198
+ .map((action) => action.message),
1199
+ );
1106
1200
  for (const msg of auditResult.warnings) {
1201
+ if (deferredStrandedMessages.has(msg)) continue;
1107
1202
  const prefix = msg.startsWith("Stranded work") ? "" : "Orphan audit: ";
1108
1203
  ctx.ui.notify(`${prefix}${msg}`, "warning");
1109
1204
  }
@@ -1177,21 +1272,21 @@ export async function bootstrapAutoSession(
1177
1272
  if (blockingStrandedRecoveryAction) {
1178
1273
  if (!state.activeMilestone) {
1179
1274
  ctx.ui.notify(
1180
- `Stranded work for ${blockingStrandedRecoveryAction.milestoneId} blocks auto-mode, but that milestone is not active in project state. Park or discard it explicitly before continuing.`,
1275
+ formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null),
1181
1276
  "error",
1182
1277
  );
1183
1278
  return releaseLockAndReturn();
1184
1279
  }
1185
1280
  if (state.activeMilestone.id !== blockingStrandedRecoveryAction.milestoneId) {
1186
1281
  ctx.ui.notify(
1187
- `Stranded work for ${blockingStrandedRecoveryAction.milestoneId} blocks auto-mode before ${state.activeMilestone.id}. Recover, park, or discard ${blockingStrandedRecoveryAction.milestoneId} explicitly before continuing.`,
1282
+ formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, state.activeMilestone.id),
1188
1283
  "error",
1189
1284
  );
1190
1285
  return releaseLockAndReturn();
1191
1286
  }
1192
1287
  strandedRecoveryAction = blockingStrandedRecoveryAction;
1193
1288
  ctx.ui.notify(
1194
- `Recovering stranded work for ${strandedRecoveryAction.milestoneId} before dispatching new units.`,
1289
+ formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
1195
1290
  "info",
1196
1291
  );
1197
1292
  }
@@ -1663,7 +1758,7 @@ export async function bootstrapAutoSession(
1663
1758
  snapshotSkills();
1664
1759
  }
1665
1760
 
1666
- ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
1761
+ setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
1667
1762
  ctx.ui.setWidget("gsd-health", undefined);
1668
1763
  const modeLabel = s.stepMode ? "Step-mode" : "Auto-mode";
1669
1764
  const pendingCount = (state.registry ?? []).filter(
@@ -94,7 +94,7 @@ export function clearInFlightTools(): void {
94
94
  * from the tool handler. When these errors occur, retrying the same unit will
95
95
  * produce the same failure, so the retry loop must be broken.
96
96
  */
97
- const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
97
+ const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
98
98
  const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
99
99
 
100
100
  /**
@@ -1,4 +1,5 @@
1
1
  import { parseUnitId } from "./unit-id.js";
2
+ import { RUN_UAT_WORKFLOW_TOOL_NAMES } from "./tool-presentation-plan.js";
2
3
 
3
4
  export const RUN_UAT_BROWSER_TOOL_NAMES = [
4
5
  "browser_navigate",
@@ -44,7 +45,7 @@ export const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = {
44
45
  "execute-task": ["gsd_task_complete", "gsd_decision_save"],
45
46
  "execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
46
47
  "reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
47
- "run-uat": ["gsd_summary_save", ...RUN_UAT_BROWSER_TOOL_NAMES],
48
+ "run-uat": [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent", ...RUN_UAT_BROWSER_TOOL_NAMES],
48
49
  "gate-evaluate": ["gsd_save_gate_result"],
49
50
  "rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
50
51
  "workflow-preferences": ["gsd_summary_save"],
@@ -205,6 +205,7 @@ import {
205
205
  updateProgressWidget as _updateProgressWidget,
206
206
  setCompletionProgressWidget,
207
207
  setAutoOutcomeWidget,
208
+ setAutoActiveStatus,
208
209
  updateSliceProgressCache,
209
210
  clearSliceProgressCache,
210
211
  describeNextUnit as _describeNextUnit,
@@ -254,7 +255,12 @@ import {
254
255
  postUnitPreVerification,
255
256
  postUnitPostVerification,
256
257
  } from "./auto-post-unit.js";
257
- import { bootstrapAutoSession, openProjectDbIfPresent, type BootstrapDeps } from "./auto-start.js";
258
+ import {
259
+ bootstrapAutoSession,
260
+ openProjectDbIfPresent,
261
+ reconcileMergedMilestonesFromJournal,
262
+ type BootstrapDeps,
263
+ } from "./auto-start.js";
258
264
  import { initHealthWidget } from "./health-widget.js";
259
265
  import { runLegacyAutoLoop, runUokKernelLoop } from "./auto/loop.js";
260
266
  import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSessionSwitchInFlight } from "./auto/resolve.js";
@@ -2102,6 +2108,28 @@ export function createWiredDispatchAdapter(
2102
2108
  return null;
2103
2109
  }
2104
2110
 
2111
+ function shouldAdoptActiveMilestone(
2112
+ state: GSDState,
2113
+ activeSession: AutoSession | undefined,
2114
+ activeDispatchBasePath: string,
2115
+ ): boolean {
2116
+ const activeMilestoneId = state.activeMilestone?.id;
2117
+ const currentMilestoneId = activeSession?.currentMilestoneId;
2118
+ if (!activeSession || !activeMilestoneId || !currentMilestoneId || activeMilestoneId === currentMilestoneId) {
2119
+ return false;
2120
+ }
2121
+
2122
+ const scopedWorktreeMilestone =
2123
+ (activeSession.basePath ? detectWorktreeName(activeSession.basePath) : null) ??
2124
+ detectWorktreeName(activeDispatchBasePath);
2125
+ if (scopedWorktreeMilestone && scopedWorktreeMilestone !== activeMilestoneId) {
2126
+ return false;
2127
+ }
2128
+
2129
+ const currentMilestone = state.registry.find((milestone) => milestone.id === currentMilestoneId);
2130
+ return !!currentMilestone && isClosedStatus(currentMilestone.status);
2131
+ }
2132
+
2105
2133
  return {
2106
2134
  async decideNextUnit(input) {
2107
2135
  const state = input.stateSnapshot;
@@ -2110,6 +2138,9 @@ export function createWiredDispatchAdapter(
2110
2138
 
2111
2139
  const activeSession = input.session ?? session;
2112
2140
  const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
2141
+ if (activeSession && shouldAdoptActiveMilestone(state, activeSession, activeDispatchBasePath)) {
2142
+ activeSession.currentMilestoneId = active.id;
2143
+ }
2113
2144
  const prefs = loadEffectiveGSDPreferences(activeDispatchBasePath)?.preferences;
2114
2145
 
2115
2146
  // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
@@ -2280,10 +2311,20 @@ export function createWiredAutoOrchestrationModule(
2280
2311
  async reconcileBeforeDispatch() {
2281
2312
  const activeBasePath = getLiveDispatchBasePath();
2282
2313
  const result = await reconcileBeforeDispatch(activeBasePath);
2283
- if (result.blockers.length > 0) {
2314
+ // Failure-path summaries written by gsd_summary_save create
2315
+ // artifact-db-status-divergence blockers for tasks that are still
2316
+ // pending (gsd_task_complete never ran). These tasks can still be
2317
+ // dispatched and the drift self-heals once they complete successfully.
2318
+ const hardBlockers = result.blockers.filter(
2319
+ (b) =>
2320
+ !b.includes("has SUMMARY artifact while DB status is") &&
2321
+ !b.includes("has SUMMARY on disk while DB status is") &&
2322
+ !b.includes("has task SUMMARY artifacts but no DB tasks"),
2323
+ );
2324
+ if (hardBlockers.length > 0) {
2284
2325
  return {
2285
2326
  ok: false,
2286
- reason: result.blockers[0],
2327
+ reason: hardBlockers[0],
2287
2328
  stateSnapshot: result.stateSnapshot,
2288
2329
  };
2289
2330
  }
@@ -2955,6 +2996,7 @@ export async function startAuto(
2955
2996
  if (!getLedger()) initMetrics(base);
2956
2997
  if (s.currentMilestoneId) setActiveMilestoneId(base, s.currentMilestoneId);
2957
2998
  await openProjectDbIfPresent(base);
2999
+ reconcileMergedMilestonesFromJournal(base);
2958
3000
  registerAutoWorkerForSession(s, base);
2959
3001
 
2960
3002
  // Re-register health level notification callback lost across process restart
@@ -2991,7 +3033,7 @@ export async function startAuto(
2991
3033
  ensureOrchestrationModule(ctx, pi, s.basePath || base);
2992
3034
  registerSigtermHandler(lockBase());
2993
3035
 
2994
- ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
3036
+ setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
2995
3037
  ctx.ui.setWidget("gsd-health", undefined);
2996
3038
  ctx.ui.notify(
2997
3039
  s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.",
@@ -3320,7 +3362,7 @@ export async function dispatchHookUnit(
3320
3362
  await pauseAuto(ctx, pi);
3321
3363
  }, hookHardTimeoutMs);
3322
3364
 
3323
- ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
3365
+ setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
3324
3366
  ctx.ui.notify(`Running post-unit hook: ${hookName}`, "info");
3325
3367
 
3326
3368
  debugLog("dispatchHookUnit", {
@@ -413,6 +413,92 @@ export function registerDbTools(pi: ExtensionAPI): void {
413
413
  pi.registerTool(summarySaveTool);
414
414
  registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
415
415
 
416
+ // ─── gsd_uat_result_save ─────────────────────────────────────────────────
417
+
418
+ const uatResultSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
419
+ const { executeUatResultSave } = await loadWorkflowExecutors();
420
+ return executeUatResultSave(params, resolveWorkflowToolBasePath(_ctx, params));
421
+ };
422
+
423
+ const uatEvidenceRef = Type.Object({
424
+ kind: StringEnum(["gsd_uat_exec", "gsd_exec", "screenshot", "log", "url", "browser"], { description: "Evidence kind" }),
425
+ ref: Type.String({ description: "Evidence ID, approved .gsd path, or URL" }),
426
+ note: Type.Optional(Type.String({ description: "Short evidence note" })),
427
+ });
428
+
429
+ const uatCheck = Type.Object({
430
+ id: Type.String({ description: "Stable check ID from the UAT spec" }),
431
+ description: Type.String({ description: "Check description" }),
432
+ mode: StringEnum(["artifact", "runtime", "browser", "human-follow-up"], { description: "Evidence mode" }),
433
+ result: StringEnum(["PASS", "FAIL", "NEEDS-HUMAN"], { description: "Check result" }),
434
+ evidence: Type.Optional(Type.Array(uatEvidenceRef, { description: "Objective evidence references" })),
435
+ notes: Type.Optional(Type.String({ description: "Observed result, failure notes, or human instruction" })),
436
+ nonAutomatable: Type.Optional(Type.Boolean({ description: "True when the check is explicitly non-automatable" })),
437
+ });
438
+
439
+ const toolPresentationBlock = Type.Object({
440
+ surface: StringEnum(["provider-tools", "claude-code-sdk", "mcp", "hybrid"], { description: "Tool presentation surface" }),
441
+ model: Type.Optional(Type.Object({
442
+ provider: Type.Optional(Type.String()),
443
+ api: Type.Optional(Type.String()),
444
+ id: Type.Optional(Type.String()),
445
+ })),
446
+ presentedTools: Type.Array(Type.String(), { description: "Tool names actually presented to the model" }),
447
+ blockedTools: Type.Array(Type.Object({
448
+ name: Type.String(),
449
+ reason: Type.String(),
450
+ }), { description: "Tool names blocked from the model with reasons" }),
451
+ aliases: Type.Optional(Type.Array(Type.Object({
452
+ requested: Type.String(),
453
+ canonical: Type.String(),
454
+ }))),
455
+ fallbackToolsUsed: Type.Optional(Type.Array(Type.String())),
456
+ toolPresentationPlanId: Type.Optional(Type.String()),
457
+ notes: Type.Optional(Type.String()),
458
+ });
459
+
460
+ const uatResultSaveTool = {
461
+ name: "gsd_uat_result_save",
462
+ label: "Save UAT Result",
463
+ description:
464
+ "Save a structured UAT result for a slice. Validates evidence, writes the ASSESSMENT artifact, " +
465
+ "records attempt history, and saves the aggregate UAT gate result.",
466
+ promptSnippet: "Save structured UAT checks, evidence, verdict, and tool-presentation proof",
467
+ promptGuidelines: [
468
+ "Call gsd_uat_result_save once after all UAT checks have been executed.",
469
+ "Every PASS or FAIL check must cite objective evidence, preferably a gsd_uat_exec evidence ID.",
470
+ "Include the presented and blocked tool set in presentation so tool timing is auditable.",
471
+ "Do not use raw gsd_summary_save as a substitute for UAT results.",
472
+ ],
473
+ parameters: Type.Object({
474
+ milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
475
+ sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
476
+ uatType: StringEnum(["artifact-driven", "browser-executable", "runtime-executable", "live-runtime", "mixed", "human-experience"], { description: "Declared UAT mode" }),
477
+ verdict: StringEnum(["PASS", "FAIL", "PARTIAL"], { description: "Overall UAT verdict" }),
478
+ checks: Type.Array(uatCheck, { description: "Structured check results" }),
479
+ presentation: toolPresentationBlock,
480
+ notes: Type.Optional(Type.String({ description: "Overall verdict rationale" })),
481
+ attempt: Type.Optional(Type.String({ description: "Attempt number or auto" })),
482
+ previousAttemptId: Type.Optional(Type.String({ description: "Prior attempt ID, when retrying" })),
483
+ }),
484
+ execute: uatResultSaveExecute,
485
+ renderCall(args: any, theme: any) {
486
+ let text = theme.fg("toolTitle", theme.bold("uat_result_save "));
487
+ text += theme.fg("accent", `${args.milestoneId ?? "?"}/${args.sliceId ?? "?"}`);
488
+ if (args.verdict) text += theme.fg("dim", ` → ${args.verdict}`);
489
+ return new Text(text, 0, 0);
490
+ },
491
+ renderResult(result: any, _options: any, theme: any) {
492
+ const d = readDetails(result);
493
+ if (result.isError || d?.error) {
494
+ return new Text(theme.fg("error", formatToolErrorText(result, d)), 0, 0);
495
+ }
496
+ return new Text(theme.fg("success", `UAT ${d?.sliceId ?? ""}: ${d?.verdict ?? "saved"}`), 0, 0);
497
+ },
498
+ };
499
+
500
+ pi.registerTool(uatResultSaveTool);
501
+
416
502
  // ─── gsd_milestone_generate_id (formerly gsd_generate_milestone_id) ────
417
503
 
418
504
  const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
@@ -746,7 +832,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
746
832
  recommendation: Type.String({ description: "Option id the executor recommends." }),
747
833
  recommendationRationale: Type.String({ description: "Why the recommendation — 1–2 sentences." }),
748
834
  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.",
835
+ description: "When true, the recommendation is recorded as the default, but auto-mode still pauses until the user resolves via /gsd escalate resolve.",
750
836
  }),
751
837
  }, { description: "ADR-011 Phase 2: optional escalation payload. Only honored when phases.mid_execution_escalation is true." })),
752
838
  verificationEvidence: Type.Optional(Type.Array(
@@ -795,7 +881,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
795
881
  sliceTitle: Type.String({ description: "Title of the slice" }),
796
882
  oneLiner: Type.String({ description: "One-line summary of what the slice accomplished" }),
797
883
  narrative: Type.String({ description: "Detailed narrative of what happened across all tasks" }),
798
- verification: Type.String({ description: "What was verified across all tasks" }),
884
+ verification: Type.Optional(Type.String({ description: "What was verified across all tasks — if omitted, summary records verification as passed without detail." })),
799
885
  uatContent: Type.String({ description: "UAT test content (markdown body)" }),
800
886
  // ── Enrichment metadata (optional — defaults to empty) ────────────
801
887
  deviations: Type.Optional(Type.String({ description: "Deviations from the slice plan, or 'None.'" })),
@@ -1009,7 +1095,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1009
1095
  promptGuidelines: [
1010
1096
  "Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
1011
1097
  "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.",
1098
+ "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
1099
  "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
1100
  "If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
1015
1101
  "On success, returns validationPath where VALIDATION.md was written.",
@@ -1022,7 +1108,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1022
1108
  sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
1023
1109
  crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
1024
1110
  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" })),
1111
+ 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
1112
  verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
1027
1113
  remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
1028
1114
  }),
@@ -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)",