@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
@@ -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,58 +1,13 @@
1
1
  import { parseUnitId } from "./unit-id.js";
2
+ import {
3
+ AUTO_UNIT_SCOPED_TOOLS,
4
+ getForbiddenGsdToolReason,
5
+ } from "./unit-tool-contracts.js";
2
6
 
3
- export const RUN_UAT_BROWSER_TOOL_NAMES = [
4
- "browser_navigate",
5
- "browser_click",
6
- "browser_type",
7
- "browser_fill_form",
8
- "browser_click_ref",
9
- "browser_fill_ref",
10
- "browser_wait_for",
11
- "browser_assert",
12
- "browser_verify",
13
- "browser_screenshot",
14
- "browser_snapshot_refs",
15
- "browser_find",
16
- "browser_get_console_logs",
17
- "browser_get_network_logs",
18
- "browser_evaluate",
19
- "browser_reload",
20
- "browser_batch",
21
- "browser_act",
22
- ] as const;
23
-
24
- export const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = {
25
- "research-milestone": ["gsd_summary_save", "gsd_decision_save"],
26
- "plan-milestone": ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
27
- "discuss-milestone": [
28
- "gsd_summary_save",
29
- "gsd_decision_save",
30
- "gsd_requirement_save",
31
- "gsd_requirement_update",
32
- "gsd_plan_milestone",
33
- "gsd_milestone_generate_id",
34
- ],
35
- "discuss-slice": ["gsd_summary_save", "gsd_decision_save"],
36
- "validate-milestone": ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
37
- "complete-milestone": ["gsd_complete_milestone", "subagent"],
38
- "research-slice": ["gsd_summary_save", "gsd_decision_save"],
39
- "plan-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
40
- "refine-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
41
- "replan-slice": ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
42
- "complete-slice": ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice", "gsd_decision_save", "gsd_requirement_update", "subagent"],
43
- "reassess-roadmap": ["gsd_reassess_roadmap"],
44
- "execute-task": ["gsd_task_complete", "gsd_decision_save"],
45
- "execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
46
- "reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
47
- "run-uat": ["gsd_summary_save", ...RUN_UAT_BROWSER_TOOL_NAMES],
48
- "gate-evaluate": ["gsd_save_gate_result"],
49
- "rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
50
- "workflow-preferences": ["gsd_summary_save"],
51
- "discuss-project": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
52
- "discuss-requirements": ["gsd_requirement_save", "gsd_summary_save"],
53
- "research-decision": ["gsd_summary_save"],
54
- "research-project": ["gsd_summary_save", "gsd_decision_save"],
55
- };
7
+ export {
8
+ AUTO_UNIT_SCOPED_TOOLS,
9
+ RUN_UAT_BROWSER_TOOL_NAMES,
10
+ } from "./unit-tool-contracts.js";
56
11
 
57
12
  const WORKFLOW_TOOL_ALIASES: Record<string, string> = {
58
13
  gsd_save_decision: "gsd_decision_save",
@@ -96,6 +51,14 @@ const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
96
51
  .map(canonicalWorkflowToolName),
97
52
  );
98
53
 
54
+ export const GSD_PHASE_SCOPE_DISPLAY_REASON = "This GSD phase only allows its scoped workflow tools.";
55
+
56
+ type AutoUnitToolScopeResult = {
57
+ block: boolean;
58
+ reason?: string;
59
+ displayReason?: string;
60
+ };
61
+
99
62
  function stripMcpToolPrefix(toolName: string): string {
100
63
  if (!toolName.startsWith("mcp__")) return toolName;
101
64
  const toolSeparator = toolName.indexOf("__", "mcp__".length);
@@ -113,12 +76,20 @@ export function isWorkflowAliasTool(toolName: string): boolean {
113
76
 
114
77
  function hardBlockReason(unitType: string, what: string): string {
115
78
  return [
116
- `HARD BLOCK: unit "${unitType}" is constrained by auto-unit tool scope — ${what}.`,
79
+ `HARD BLOCK: Tool Contract failure for unit "${unitType}" — ${what}.`,
117
80
  "This is a mechanical phase-boundary gate. You MUST NOT proceed, retry the same call,",
118
81
  "or route around this block; the orchestrator owns phase transitions.",
119
82
  ].join(" ");
120
83
  }
121
84
 
85
+ function hardBlock(unitType: string, what: string): AutoUnitToolScopeResult {
86
+ return {
87
+ block: true,
88
+ reason: hardBlockReason(unitType, what),
89
+ displayReason: GSD_PHASE_SCOPE_DISPLAY_REASON,
90
+ };
91
+ }
92
+
122
93
  function allowedGsdToolsForUnit(unitType: string): string[] {
123
94
  return [...new Set(
124
95
  (AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [])
@@ -143,7 +114,7 @@ function shouldBlockTaskCompletionScope(
143
114
  unitId: string | undefined,
144
115
  toolName: string,
145
116
  input: unknown,
146
- ): { block: boolean; reason?: string } {
117
+ ): AutoUnitToolScopeResult {
147
118
  if (!EXECUTE_TASK_UNIT_TYPES.has(unitType)) return { block: false };
148
119
  if (canonicalWorkflowToolName(toolName) !== "gsd_task_complete") return { block: false };
149
120
  if (!unitId) return { block: false };
@@ -164,13 +135,10 @@ function shouldBlockTaskCompletionScope(
164
135
  return { block: false };
165
136
  }
166
137
 
167
- return {
168
- block: true,
169
- reason: hardBlockReason(
170
- unitType,
171
- `gsd_task_complete may only complete the active task ${expected.milestone}/${expected.slice}/${expected.task}; requested ${actualMilestone}/${actualSlice}/${actualTask}`,
172
- ),
173
- };
138
+ return hardBlock(
139
+ unitType,
140
+ `gsd_task_complete may only complete the active task ${expected.milestone}/${expected.slice}/${expected.task}; requested ${actualMilestone}/${actualSlice}/${actualTask}`,
141
+ );
174
142
  }
175
143
 
176
144
  export function shouldBlockAutoUnitToolCall(
@@ -178,15 +146,12 @@ export function shouldBlockAutoUnitToolCall(
178
146
  toolName: string,
179
147
  input?: unknown,
180
148
  unitId?: string,
181
- ): { block: boolean; reason?: string } {
149
+ ): AutoUnitToolScopeResult {
182
150
  const scopedTools = AUTO_UNIT_SCOPED_TOOLS[unitType];
183
151
  if (!scopedTools) return { block: false };
184
152
 
185
153
  if (isNativeWorkflowTool(toolName)) {
186
- return {
187
- block: true,
188
- reason: hardBlockReason(unitType, "native Workflow is not permitted inside a dispatched GSD auto-mode unit"),
189
- };
154
+ return hardBlock(unitType, "native Workflow is not permitted inside a dispatched GSD auto-mode unit");
190
155
  }
191
156
 
192
157
  const taskScope = shouldBlockTaskCompletionScope(unitType, unitId, toolName, input);
@@ -198,11 +163,16 @@ export function shouldBlockAutoUnitToolCall(
198
163
  const allowedTools = allowedGsdToolsForUnit(unitType);
199
164
  if (allowedTools.includes(canonicalTool)) return { block: false };
200
165
 
201
- return {
202
- block: true,
203
- reason: hardBlockReason(
166
+ const forbiddenReason = getForbiddenGsdToolReason(unitType, canonicalTool);
167
+ if (forbiddenReason) {
168
+ return hardBlock(
204
169
  unitType,
205
- `GSD lifecycle tool "${canonicalTool}" is not permitted; allowed GSD tools: ${allowedTools.length > 0 ? allowedTools.join(", ") : "(none)"}`,
206
- ),
207
- };
170
+ `GSD lifecycle tool "${canonicalTool}" is not permitted; ${forbiddenReason} Fix unit-tool-contracts.ts or the ${unitType} prompt.`,
171
+ );
172
+ }
173
+
174
+ return hardBlock(
175
+ unitType,
176
+ `GSD lifecycle tool "${canonicalTool}" is not permitted; allowed GSD tools: ${allowedTools.length > 0 ? allowedTools.join(", ") : "(none)"}`,
177
+ );
208
178
  }
@@ -83,6 +83,11 @@ import {
83
83
  nativeWorktreeList,
84
84
  nativeLsFiles,
85
85
  } from "./native-git-bridge.js";
86
+ import {
87
+ CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
88
+ checkCloseoutConsistencyGate,
89
+ formatCloseoutConsistencyBlock,
90
+ } from "./closeout-consistency-gate.js";
86
91
  import { gsdHome } from "./gsd-home.js";
87
92
  import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
88
93
  import {
@@ -1771,16 +1776,29 @@ export function mergeMilestoneToMain(
1771
1776
  // symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
1772
1777
  // database (#2823).
1773
1778
  if (isDbAvailable()) {
1779
+ const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
1780
+ const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1781
+ const mainDbPath = contract.projectDb;
1774
1782
  try {
1775
- const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
1776
- const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1777
- const mainDbPath = contract.projectDb;
1783
+ const activeDbPath = getDbPath();
1784
+ if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
1785
+ closeDatabase();
1786
+ if (!openDatabase(mainDbPath)) {
1787
+ throw new Error(`cannot open project DB at ${mainDbPath}`);
1788
+ }
1789
+ }
1778
1790
  if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
1779
1791
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1780
1792
  }
1781
1793
  } catch (err) {
1782
- /* non-fatal */
1783
- logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
1794
+ const message = `DB reconciliation failed before milestone ${milestoneId} merge: ${err instanceof Error ? err.message : String(err)}`;
1795
+ logError("worktree", message);
1796
+ throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
1797
+ }
1798
+
1799
+ const closeoutGate = checkCloseoutConsistencyGate(milestoneId);
1800
+ if (!closeoutGate.ok) {
1801
+ throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
1784
1802
  }
1785
1803
  }
1786
1804
 
@@ -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", {