gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.a947d025c

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 (720) hide show
  1. package/README.md +35 -59
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  18. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  20. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  21. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  23. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +18 -0
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  31. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  32. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  33. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  34. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  35. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  36. package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
  37. package/dist/resources/extensions/gsd/auto.js +273 -87
  38. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
  39. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  40. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  41. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  42. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  43. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  44. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +341 -55
  47. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  48. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +147 -2
  50. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  51. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  52. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  54. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  55. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  56. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  57. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  58. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  59. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  60. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  61. package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
  62. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
  63. package/dist/resources/extensions/gsd/detection.js +106 -0
  64. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  65. package/dist/resources/extensions/gsd/git-service.js +73 -5
  66. package/dist/resources/extensions/gsd/gsd-db.js +146 -13
  67. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  68. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  69. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  70. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  71. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  72. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  74. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  75. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  76. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  82. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  84. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  86. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  88. package/dist/resources/extensions/gsd/quick.js +34 -2
  89. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  90. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  91. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  92. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  93. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  94. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  95. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  96. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  97. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  98. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  99. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  100. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  101. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  103. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  104. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  105. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  106. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  107. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  108. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  109. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  110. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  111. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  112. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  113. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  114. package/dist/web/standalone/.next/BUILD_ID +1 -1
  115. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  116. package/dist/web/standalone/.next/build-manifest.json +3 -3
  117. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  118. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  119. package/dist/web/standalone/.next/required-server-files.json +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/index.html +1 -1
  139. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  142. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  147. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/middleware.js +3 -3
  150. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  151. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  152. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  153. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  154. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  155. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  156. package/dist/web/standalone/server.js +1 -1
  157. package/dist/welcome-screen.d.ts +2 -0
  158. package/dist/welcome-screen.js +9 -7
  159. package/package.json +6 -4
  160. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  161. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  162. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  163. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  164. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  165. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  166. package/packages/native/tsconfig.tsbuildinfo +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  169. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  170. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  171. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  172. package/packages/pi-agent-core/dist/agent.js +43 -11
  173. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  174. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  175. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  176. package/packages/pi-agent-core/dist/index.js +2 -0
  177. package/packages/pi-agent-core/dist/index.js.map +1 -1
  178. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  179. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  180. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  181. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  182. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  183. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  184. package/packages/pi-agent-core/dist/types.js.map +1 -1
  185. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  186. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  187. package/packages/pi-agent-core/src/agent.ts +52 -11
  188. package/packages/pi-agent-core/src/index.ts +2 -0
  189. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  190. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  191. package/packages/pi-agent-core/src/types.ts +26 -10
  192. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  194. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  196. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  198. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  199. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  200. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  202. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  203. package/packages/pi-ai/dist/types.d.ts +2 -0
  204. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  205. package/packages/pi-ai/dist/types.js.map +1 -1
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  207. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  209. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  211. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  212. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  213. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  214. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  215. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  216. package/packages/pi-ai/src/types.ts +3 -0
  217. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  218. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  219. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  220. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  226. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  228. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  230. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  234. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  238. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  246. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  249. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  255. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  257. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  260. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  264. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  266. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  268. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  270. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  272. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  274. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  276. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  278. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  280. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  282. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  284. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  288. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  292. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  296. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  300. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  304. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  306. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  308. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  310. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  312. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  314. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  322. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  324. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  326. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  352. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  355. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  359. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  366. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  369. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  370. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  371. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  372. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  374. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  375. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  376. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  377. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  378. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  379. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  380. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  381. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  382. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  383. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  384. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  385. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  386. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  387. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  389. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  390. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  391. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  392. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  393. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  394. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  395. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  396. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  397. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  399. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  400. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  401. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  402. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  404. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  406. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  408. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  409. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  410. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  412. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  413. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  414. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  415. package/packages/pi-tui/dist/tui.js +18 -8
  416. package/packages/pi-tui/dist/tui.js.map +1 -1
  417. package/packages/pi-tui/src/tui.ts +20 -8
  418. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  419. package/packages/rpc-client/README.md +7 -0
  420. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  421. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  422. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  423. package/src/resources/GSD-WORKFLOW.md +2 -2
  424. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  425. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  426. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  427. package/src/resources/extensions/github-sync/sync.ts +8 -1
  428. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  429. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  430. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  431. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  432. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  433. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  434. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  435. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  436. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  437. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  438. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  439. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  440. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  441. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  442. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  443. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  444. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  445. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  446. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  447. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  448. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  449. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  450. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  451. package/src/resources/extensions/gsd/auto.ts +336 -89
  452. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  453. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  454. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  455. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  456. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  457. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  458. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  459. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  460. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +396 -55
  461. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  462. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  463. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +153 -2
  464. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  465. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  466. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  467. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  468. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  469. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  470. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  471. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  472. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  473. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  474. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  475. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  476. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  477. package/src/resources/extensions/gsd/detection.ts +128 -0
  478. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  479. package/src/resources/extensions/gsd/git-service.ts +87 -10
  480. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  481. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  482. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  483. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  484. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  485. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  486. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  487. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  488. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  489. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  490. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  491. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  492. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  493. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  494. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  495. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  497. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  499. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  500. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  501. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  502. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  503. package/src/resources/extensions/gsd/quick.ts +37 -2
  504. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  505. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  506. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  507. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  508. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  509. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  510. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  511. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  512. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  513. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  514. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  515. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  516. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  517. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  518. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  519. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  520. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  521. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  522. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  523. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  524. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  525. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  526. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  527. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  528. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  529. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  530. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  531. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  532. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  533. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  534. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  535. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  537. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  538. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  539. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  540. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  541. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  542. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  544. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  545. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  546. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  547. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  548. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  549. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  550. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  551. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  552. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  553. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  554. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  555. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  556. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  557. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  558. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  559. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  560. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  561. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  562. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  563. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  564. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  565. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  566. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  567. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  568. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  569. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  570. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  571. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  572. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  573. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  574. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  575. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  576. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  577. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  578. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  579. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  580. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  581. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  583. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  584. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  585. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  586. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  587. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  588. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  589. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  590. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  591. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  592. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  593. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  594. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  595. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  596. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  597. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  598. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  599. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  600. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  601. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  602. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  603. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  604. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  605. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  606. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  607. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  608. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  609. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  610. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  611. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  612. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  613. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  614. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  615. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  616. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  617. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  618. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  619. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  620. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  621. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  622. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  623. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  624. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  625. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  626. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  627. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  628. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  629. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  630. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  632. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  633. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  634. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  635. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  636. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  637. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  638. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  639. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  640. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  641. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  642. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  643. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  644. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  645. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  646. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  647. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  648. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  649. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  650. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  651. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  652. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  653. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  654. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  655. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  656. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  657. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  658. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  659. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  660. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  661. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  662. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  663. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  664. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  665. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  666. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  667. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  668. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  669. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  670. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  671. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  672. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  673. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  674. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  675. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  676. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  677. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  678. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  679. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  680. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  681. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  682. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  683. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  684. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  685. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  686. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  687. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  688. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  689. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  690. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  691. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  692. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  693. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  694. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  695. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  696. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  697. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  698. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  699. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  700. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  701. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  702. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  703. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  704. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  705. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  706. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  707. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  708. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  709. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  710. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  711. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  712. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  713. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  714. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  715. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  716. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  717. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  718. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  719. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  720. /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -1,3 +1,4 @@
1
+ // GSD2 - Claude Code CLI provider stream adapter
1
2
  /**
2
3
  * Stream adapter: bridges the Claude Agent SDK into GSD's streamSimple contract.
3
4
  *
@@ -61,6 +62,11 @@ interface ClaudeCodeStreamOptions extends SimpleStreamOptions {
61
62
  extensionUIContext?: ExtensionUIContext;
62
63
  }
63
64
 
65
+ /** Resolve the workspace root for local Claude Code process execution. */
66
+ export function resolveClaudeCodeCwd(options?: SimpleStreamOptions): string {
67
+ return options?.cwd && options.cwd.trim().length > 0 ? options.cwd : process.cwd();
68
+ }
69
+
64
70
  /** A single selectable option within an SDK elicitation schema field. */
65
71
  interface SdkElicitationRequestOption {
66
72
  const?: string;
@@ -418,6 +424,27 @@ function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
418
424
  };
419
425
  }
420
426
 
427
+ export function isClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
428
+ if (!message) return false;
429
+ return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
430
+ }
431
+
432
+ function isBareClaudeCodeAbortErrorMessage(message: string | undefined | null): boolean {
433
+ if (!message) return false;
434
+ const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
435
+ return normalized === "claude code process aborted by user"
436
+ || normalized === "request aborted by user"
437
+ || normalized === "process aborted by user";
438
+ }
439
+
440
+ export function resolveClaudeCodeAbortedMessageText(errorMsg: string, lastTextContent: string): string {
441
+ const trimmedError = errorMsg.trim();
442
+ if (trimmedError && !isBareClaudeCodeAbortErrorMessage(trimmedError)) {
443
+ return trimmedError;
444
+ }
445
+ return lastTextContent;
446
+ }
447
+
421
448
  /**
422
449
  * Generator exhaustion without a terminal result means the SDK stream was
423
450
  * interrupted mid-turn. Surface it as an error so downstream recovery logic
@@ -1286,8 +1313,9 @@ export function buildSdkOptions(
1286
1313
  overrides?: { permissionMode?: "bypassPermissions" | "acceptEdits" | "default" | "plan" },
1287
1314
  extraOptions: Record<string, unknown> & { reasoning?: ThinkingLevel } = {},
1288
1315
  ): Record<string, unknown> {
1289
- const { reasoning, ...sdkExtraOptions } = extraOptions;
1290
- const mcpServers = buildWorkflowMcpServers();
1316
+ const { reasoning, cwd, ...sdkExtraOptions } = extraOptions;
1317
+ const sdkCwd = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : process.cwd();
1318
+ const mcpServers = buildWorkflowMcpServers(sdkCwd);
1291
1319
  const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
1292
1320
  // Globally unblock the tools GSD expects Claude Code to run. When the
1293
1321
  // workflow MCP server is available, prefer its `ask_user_questions` tool over
@@ -1328,7 +1356,7 @@ export function buildSdkOptions(
1328
1356
  model: modelId,
1329
1357
  includePartialMessages: true,
1330
1358
  persistSession: true,
1331
- cwd: process.cwd(),
1359
+ cwd: sdkCwd,
1332
1360
  permissionMode,
1333
1361
  allowDangerouslySkipPermissions: permissionMode === "bypassPermissions",
1334
1362
  settingSources: ["project"],
@@ -1640,6 +1668,7 @@ async function pumpSdkMessages(
1640
1668
  const queryPrompt = buildSdkQueryPrompt(context, prompt);
1641
1669
  const permissionMode = await resolveClaudePermissionMode();
1642
1670
  const uiContext = (options as ClaudeCodeStreamOptions | undefined)?.extensionUIContext;
1671
+ const cwd = resolveClaudeCodeCwd(options);
1643
1672
  const canUseToolHandler = createClaudeCodeCanUseToolHandler(uiContext);
1644
1673
  // When no UI is available (headless / auto-mode), auto-approve all
1645
1674
  // tool requests. This replaces the old bypassPermissions workaround.
@@ -1651,6 +1680,7 @@ async function pumpSdkMessages(
1651
1680
  prompt,
1652
1681
  { permissionMode },
1653
1682
  {
1683
+ cwd,
1654
1684
  reasoning: options?.reasoning,
1655
1685
  canUseTool: canUseToolFallback,
1656
1686
  ...(uiContext
@@ -1840,6 +1870,15 @@ async function pumpSdkMessages(
1840
1870
  stream.push({ type: "error", reason: "error", error: fallback });
1841
1871
  } catch (err) {
1842
1872
  const errorMsg = err instanceof Error ? err.message : String(err);
1873
+ if (options?.signal?.aborted || isClaudeCodeAbortErrorMessage(errorMsg)) {
1874
+ const abortedText = resolveClaudeCodeAbortedMessageText(errorMsg, lastTextContent);
1875
+ stream.push({
1876
+ type: "error",
1877
+ reason: "aborted",
1878
+ error: makeAbortedMessage(modelId, abortedText),
1879
+ });
1880
+ return;
1881
+ }
1843
1882
  stream.push({
1844
1883
  type: "error",
1845
1884
  reason: "error",
@@ -1,3 +1,4 @@
1
+ // GSD2 - Claude Code stream adapter regression tests
1
2
  import { describe, test } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
@@ -5,6 +6,8 @@ import { join, resolve } from "node:path";
5
6
  import { tmpdir } from "node:os";
6
7
  import {
7
8
  makeStreamExhaustedErrorMessage,
9
+ isClaudeCodeAbortErrorMessage,
10
+ resolveClaudeCodeAbortedMessageText,
8
11
  getResultErrorMessage,
9
12
  makeAbortedMessage,
10
13
  mergePendingToolCalls,
@@ -13,6 +16,7 @@ import {
13
16
  buildPromptFromContext,
14
17
  buildSdkQueryPrompt,
15
18
  buildSdkOptions,
19
+ resolveClaudeCodeCwd,
16
20
  createClaudeCodeCanUseToolHandler,
17
21
  buildBashPermissionPattern,
18
22
  buildBashPermissionPatternOptions,
@@ -669,6 +673,45 @@ describe("stream-adapter — session persistence (#2859)", () => {
669
673
  assert.equal(options.model, "claude-sonnet-4-20250514");
670
674
  });
671
675
 
676
+ test("buildSdkOptions prefers explicit cwd over process cwd for local SDK execution", () => {
677
+ const explicitCwd = "/tmp/gsd-session-root";
678
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "hello world", undefined, { cwd: explicitCwd });
679
+ assert.equal(options.cwd, explicitCwd);
680
+ });
681
+
682
+ test("buildSdkOptions uses explicit cwd when auto-detecting workflow MCP launch config", () => {
683
+ const explicitCwd = realpathSync(mkdtempSync(join(tmpdir(), "claude-sdk-cwd-")));
684
+ const restore = setWorkflowMcpEnv({});
685
+ try {
686
+ delete process.env.GSD_WORKFLOW_MCP_COMMAND;
687
+ delete process.env.GSD_WORKFLOW_MCP_NAME;
688
+ delete process.env.GSD_WORKFLOW_MCP_ARGS;
689
+ delete process.env.GSD_WORKFLOW_MCP_ENV;
690
+ delete process.env.GSD_WORKFLOW_MCP_CWD;
691
+
692
+ const distDir = join(explicitCwd, "packages", "mcp-server", "dist");
693
+ mkdirSync(distDir, { recursive: true });
694
+ writeFileSync(join(distDir, "cli.js"), "#!/usr/bin/env node\n");
695
+
696
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "hello world", undefined, { cwd: explicitCwd });
697
+ const mcpServers = options.mcpServers as Record<string, any>;
698
+ assert.equal(mcpServers["gsd-workflow"].cwd, explicitCwd);
699
+ assert.equal(mcpServers["gsd-workflow"].env.GSD_WORKFLOW_PROJECT_ROOT, explicitCwd);
700
+ } finally {
701
+ restore();
702
+ rmSync(explicitCwd, { recursive: true, force: true });
703
+ }
704
+ });
705
+
706
+ test("resolveClaudeCodeCwd falls back to process cwd when no stream cwd is provided", () => {
707
+ assert.equal(resolveClaudeCodeCwd(), process.cwd());
708
+ assert.equal(resolveClaudeCodeCwd({ cwd: " " }), process.cwd());
709
+ });
710
+
711
+ test("resolveClaudeCodeCwd returns stream cwd when provided", () => {
712
+ assert.equal(resolveClaudeCodeCwd({ cwd: "/tmp/current-session" }), "/tmp/current-session");
713
+ });
714
+
672
715
  test("buildSdkOptions enables betas for sonnet models", () => {
673
716
  const sonnetOpts = buildSdkOptions("claude-sonnet-4-20250514", "test");
674
717
  assert.ok(
@@ -1212,6 +1255,12 @@ describe("stream-adapter — MCP elicitation bridge", () => {
1212
1255
  // ---------------------------------------------------------------------------
1213
1256
 
1214
1257
  describe("stream-adapter — abort classification (F2)", () => {
1258
+ test("recognizes Claude Code SDK abort exceptions", () => {
1259
+ assert.equal(isClaudeCodeAbortErrorMessage("Claude Code process aborted by user"), true);
1260
+ assert.equal(isClaudeCodeAbortErrorMessage("Request aborted by user"), true);
1261
+ assert.equal(isClaudeCodeAbortErrorMessage("rate limit exceeded"), false);
1262
+ });
1263
+
1215
1264
  test("makeAbortedMessage sets stopReason to 'aborted', not 'error'", () => {
1216
1265
  const message = makeAbortedMessage("claude-sonnet-4-6", "");
1217
1266
  assert.equal(message.stopReason, "aborted");
@@ -1229,6 +1278,24 @@ describe("stream-adapter — abort classification (F2)", () => {
1229
1278
  assert.notEqual(aborted.stopReason, exhausted.stopReason);
1230
1279
  assert.equal(exhausted.errorMessage, "stream_exhausted_without_result");
1231
1280
  });
1281
+
1282
+ test("abort catch preserves SDK diagnostic text instead of partial output", () => {
1283
+ const text = resolveClaudeCodeAbortedMessageText(
1284
+ "Request aborted by user\nAPI Error: 529 overloaded",
1285
+ "partial mid-stream text",
1286
+ );
1287
+
1288
+ assert.equal(text, "Request aborted by user\nAPI Error: 529 overloaded");
1289
+ });
1290
+
1291
+ test("abort catch falls back to partial output for bare abort markers", () => {
1292
+ const text = resolveClaudeCodeAbortedMessageText(
1293
+ "Request aborted by user",
1294
+ "partial mid-stream text",
1295
+ );
1296
+
1297
+ assert.equal(text, "partial mid-stream text");
1298
+ });
1232
1299
  });
1233
1300
 
1234
1301
  // ---------------------------------------------------------------------------
@@ -122,6 +122,13 @@ export async function runGitHubSync(
122
122
  }
123
123
  }
124
124
 
125
+ export function shouldCreateSlicePrForSyncEvent(
126
+ unitType: string,
127
+ config: Pick<GitHubSyncConfig, "slice_prs">,
128
+ ): boolean {
129
+ return unitType === "complete-slice" && config.slice_prs !== false;
130
+ }
131
+
125
132
  // ─── Per-Event Sync Functions ───────────────────────────────────────────────
126
133
 
127
134
  async function syncMilestonePlan(
@@ -406,7 +413,7 @@ async function syncSliceComplete(
406
413
  sliceRecord = getSliceRecord(mapping, mid, sid);
407
414
  }
408
415
  if (!sliceRecord || sliceRecord.state === "closed") return;
409
- if (!sliceRecord.prNumber && config.slice_prs !== false) {
416
+ if (!sliceRecord.prNumber && shouldCreateSlicePrForSyncEvent("complete-slice", config)) {
410
417
  await ensureSlicePullRequest(basePath, mapping, mid, sid);
411
418
  sliceRecord = getSliceRecord(mapping, mid, sid);
412
419
  if (!sliceRecord || !sliceRecord.prNumber) return;
@@ -1,26 +1,14 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- const source = readFileSync(join(import.meta.dirname, "..", "sync.ts"), "utf8");
3
+ import { shouldCreateSlicePrForSyncEvent } from "../sync.ts";
7
4
 
8
5
  test("slice plan sync records issues without creating a draft PR", () => {
9
- const planStart = source.indexOf("async function syncSlicePlan");
10
- const prHelperStart = source.indexOf("async function ensureSlicePullRequest");
11
- assert.ok(planStart >= 0 && prHelperStart > planStart, "slice plan and PR helper functions are present");
12
-
13
- const planBody = source.slice(planStart, prHelperStart);
14
- assert.match(planBody, /prNumber:\s*0/);
15
- assert.doesNotMatch(planBody, /ghCreatePR\(/);
16
- assert.doesNotMatch(planBody, /ghPushBranch\(/);
6
+ assert.equal(shouldCreateSlicePrForSyncEvent("plan-slice", { slice_prs: true }), false);
7
+ assert.equal(shouldCreateSlicePrForSyncEvent("research-slice", { slice_prs: true }), false);
17
8
  });
18
9
 
19
10
  test("slice completion creates the PR only after slice work is complete", () => {
20
- const completeStart = source.indexOf("async function syncSliceComplete");
21
- const milestoneStart = source.indexOf("async function syncMilestoneComplete");
22
- assert.ok(completeStart >= 0 && milestoneStart > completeStart, "slice complete function is present");
23
-
24
- const completeBody = source.slice(completeStart, milestoneStart);
25
- assert.match(completeBody, /ensureSlicePullRequest\(basePath, mapping, mid, sid\)/);
11
+ assert.equal(shouldCreateSlicePrForSyncEvent("complete-slice", { slice_prs: true }), true);
12
+ assert.equal(shouldCreateSlicePrForSyncEvent("complete-slice", {}), true);
13
+ assert.equal(shouldCreateSlicePrForSyncEvent("complete-slice", { slice_prs: false }), false);
26
14
  });
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto Orchestration module interfaces and ADR-015 invariant adapter contracts.
3
+
1
4
  import type { GSDState } from "../types.js";
2
5
 
3
6
  export interface AutoSessionContext {
@@ -30,7 +33,7 @@ export interface AutoOrchestrationModule {
30
33
  }
31
34
 
32
35
  export interface DispatchAdapter {
33
- decideNextUnit(): Promise<{
36
+ decideNextUnit(input: { stateSnapshot: GSDState }): Promise<{
34
37
  unitType: string;
35
38
  unitId: string;
36
39
  reason: string;
@@ -49,8 +52,20 @@ export interface RecoveryAdapter {
49
52
  }>;
50
53
  }
51
54
 
55
+ export type InvariantAdapterResult =
56
+ | { ok: true; reason?: string; stateSnapshot?: GSDState }
57
+ | { ok: false; reason: string; stateSnapshot?: GSDState };
58
+
59
+ export interface StateReconciliationAdapter {
60
+ reconcileBeforeDispatch(): Promise<InvariantAdapterResult & { stateSnapshot?: GSDState }>;
61
+ }
62
+
63
+ export interface ToolContractAdapter {
64
+ compileUnitToolContract(unitType: string, unitId: string): Promise<InvariantAdapterResult>;
65
+ }
66
+
52
67
  export interface WorktreeAdapter {
53
- prepareForUnit(unitType: string, unitId: string): Promise<void>;
68
+ prepareForUnit(unitType: string, unitId: string): Promise<InvariantAdapterResult>;
54
69
  syncAfterUnit(unitType: string, unitId: string): Promise<void>;
55
70
  cleanupOnStop(reason: string): Promise<void>;
56
71
  }
@@ -78,7 +93,9 @@ export interface NotificationAdapter {
78
93
  }
79
94
 
80
95
  export interface AutoOrchestratorDeps {
96
+ stateReconciliation: StateReconciliationAdapter;
81
97
  dispatch: DispatchAdapter;
98
+ toolContract: ToolContractAdapter;
82
99
  recovery: RecoveryAdapter;
83
100
  worktree: WorktreeAdapter;
84
101
  health: HealthAdapter;
@@ -18,12 +18,13 @@ import type {
18
18
  VerificationResult,
19
19
  } from "../auto-verification.js";
20
20
  import type { DispatchAction, DispatchContext } from "../auto-dispatch.js";
21
- import type { WorktreeResolver } from "../worktree-resolver.js";
21
+ import type { WorktreeLifecycle } from "../worktree-lifecycle.js";
22
+ import type { WorktreeStateProjection } from "../worktree-state-projection.js";
22
23
  import type { CmuxLogLevel } from "../../shared/cmux-events.js";
23
24
  import type { JournalEntry } from "../journal.js";
24
25
  import type { MergeReconcileResult } from "../auto-recovery.js";
25
26
  import type { UokTurnObserver } from "../uok/contracts.js";
26
- import type { PreflightResult } from "../clean-root-preflight.js";
27
+ import type { PostflightResult, PreflightResult } from "../clean-root-preflight.js";
27
28
 
28
29
  type PauseAutoFn = (
29
30
  ctx?: ExtensionContext,
@@ -74,12 +75,9 @@ export interface LoopDeps {
74
75
  basePath: string,
75
76
  ) => Promise<{ proceed: boolean; reason?: string; fixesApplied: string[] }>;
76
77
 
77
- // Worktree sync
78
- syncProjectRootToWorktree: (
79
- originalBase: string,
80
- basePath: string,
81
- milestoneId: string | null,
82
- ) => void;
78
+ // Worktree state projection (ADR-016 — single Module Interface for all
79
+ // direction-typed projection verbs)
80
+ worktreeProjection: WorktreeStateProjection;
83
81
 
84
82
  // Resource version guard
85
83
  checkResourcesStale: (version: string | null) => string | null;
@@ -139,8 +137,9 @@ export interface LoopDeps {
139
137
  postflightPopStash: (
140
138
  basePath: string,
141
139
  milestoneId: string,
140
+ stashMarker: string | undefined,
142
141
  notify: (message: string, level: "info" | "warning" | "error") => void,
143
- ) => void;
142
+ ) => PostflightResult;
144
143
 
145
144
  // Budget/context/secrets
146
145
  getLedger: () => unknown;
@@ -268,8 +267,9 @@ export interface LoopDeps {
268
267
  // Git
269
268
  GitServiceImpl: new (basePath: string, gitConfig: unknown) => unknown;
270
269
 
271
- // WorktreeResolver
272
- resolver: WorktreeResolver;
270
+ // Worktree Lifecycle Module (ADR-016 — single Module Interface for the
271
+ // milestone create/enter/exit/merge verbs)
272
+ lifecycle: WorktreeLifecycle;
273
273
 
274
274
  // Post-unit processing
275
275
  postUnitPreVerification: (
@@ -38,7 +38,7 @@ import {
38
38
  getRecentForUnit as getRecentDispatchesForUnit,
39
39
  getRecentUnitKeysForProjectRoot,
40
40
  } from "../db/unit-dispatches.js";
41
- import { refreshMilestoneLease } from "../db/milestone-leases.js";
41
+ import { claimMilestoneLease, refreshMilestoneLease } from "../db/milestone-leases.js";
42
42
  import { heartbeatAutoWorker } from "../db/auto-workers.js";
43
43
  import { getRuntimeKv, setRuntimeKv } from "../db/runtime-kv.js";
44
44
  import { resolveUokFlags } from "../uok/flags.js";
@@ -68,7 +68,9 @@ import {
68
68
  settleDispatchCompleted,
69
69
  settleDispatchFailed,
70
70
  } from "./workflow-dispatch-ledger.js";
71
- import { openDispatchClaim } from "./workflow-dispatch-claim.js";
71
+ import { emitOpenUnitEndForUnit } from "../crash-recovery.js";
72
+ import { writeUnitRuntimeRecord } from "../unit-runtime.js";
73
+ import { ensureDispatchLease, openDispatchClaim } from "./workflow-dispatch-claim.js";
72
74
  import { completeWorkflowIteration } from "./workflow-iteration-completion.js";
73
75
  import { createWorkflowJournalReporter } from "./workflow-journal-reporter.js";
74
76
  import { createWorkflowPhaseReporter } from "./workflow-phase-reporter.js";
@@ -163,6 +165,29 @@ function logDispatchClaimFailed(err: unknown): void {
163
165
  });
164
166
  }
165
167
 
168
+ function logDispatchLeaseRecovered(details: {
169
+ milestoneId: string;
170
+ workerId: string;
171
+ token: number;
172
+ recovered: boolean;
173
+ }): void {
174
+ debugLog("autoLoop", {
175
+ phase: details.recovered ? "dispatch-lease-recovered" : "dispatch-lease-acquired",
176
+ ...details,
177
+ });
178
+ }
179
+
180
+ function logDispatchLeaseRecoveryFailed(details: {
181
+ milestoneId?: string;
182
+ workerId?: string;
183
+ reason: string;
184
+ }): void {
185
+ debugLog("autoLoop", {
186
+ phase: "dispatch-lease-recovery-failed",
187
+ ...details,
188
+ });
189
+ }
190
+
166
191
  function logCustomVerifyRetryLoadFailure(err: unknown): void {
167
192
  debugLog("autoLoop", {
168
193
  phase: "load-custom-verify-retries-failed",
@@ -201,6 +226,36 @@ async function enforceMinRequestInterval(s: AutoSession, prefs: IterationContext
201
226
  }
202
227
  }
203
228
 
229
+ function closeOutCrashedUnit(s: AutoSession, iterData: IterationData, err: unknown): void {
230
+ const summary = formatDispatchExceptionSummary({ error: err });
231
+ try {
232
+ emitOpenUnitEndForUnit(
233
+ s.basePath,
234
+ iterData.unitType,
235
+ iterData.unitId,
236
+ "cancelled",
237
+ {
238
+ message: summary,
239
+ category: "unit-exception",
240
+ isTransient: false,
241
+ },
242
+ );
243
+ writeUnitRuntimeRecord(
244
+ s.basePath,
245
+ iterData.unitType,
246
+ iterData.unitId,
247
+ s.currentUnit?.startedAt ?? Date.now(),
248
+ {
249
+ phase: "crashed",
250
+ lastProgressAt: Date.now(),
251
+ lastProgressKind: "unit-exception",
252
+ },
253
+ );
254
+ } catch (closeoutErr) {
255
+ logWarning("dispatch", `unit crash closeout failed: ${closeoutErr instanceof Error ? closeoutErr.message : String(closeoutErr)}`);
256
+ }
257
+ }
258
+
204
259
  /**
205
260
  * Main auto-mode execution loop. Iterates: derive → dispatch → guards →
206
261
  * runUnit → finalize → repeat. Exits when s.active becomes false or a
@@ -242,6 +297,10 @@ export async function autoLoop(
242
297
  phase: "heartbeat-failed",
243
298
  error: err instanceof Error ? err.message : String(err),
244
299
  }),
300
+ logLeaseRefreshMiss: details => debugLog("autoLoop", {
301
+ phase: "lease-refresh-missed",
302
+ ...details,
303
+ }),
245
304
  });
246
305
 
247
306
  // ── Journal: per-iteration flow grouping ──
@@ -493,14 +552,23 @@ export async function autoLoop(
493
552
 
494
553
  // ── Unit execution (shared with dev path) ──
495
554
  await enforceMinRequestInterval(s, prefs);
496
- const unitPhaseResult = await runUnitPhaseViaContract(
497
- dispatchContract,
498
- ic,
499
- iterData,
500
- loopState,
501
- undefined,
502
- unitDispatchDeps,
503
- );
555
+ let unitPhaseResult: Awaited<ReturnType<typeof runUnitPhaseViaContract>>;
556
+ try {
557
+ unitPhaseResult = await runUnitPhaseViaContract(
558
+ dispatchContract,
559
+ ic,
560
+ iterData,
561
+ loopState,
562
+ undefined,
563
+ unitDispatchDeps,
564
+ );
565
+ } catch (err) {
566
+ if (err instanceof ModelPolicyDispatchBlockedError) {
567
+ throw err;
568
+ }
569
+ closeOutCrashedUnit(s, iterData, err);
570
+ throw err;
571
+ }
504
572
  if (unitPhaseResult.action === "next") {
505
573
  const requestTimestamp = resolveUnitRequestTimestamp(unitPhaseResult.data);
506
574
  if (requestTimestamp !== undefined) s.lastRequestTimestamp = requestTimestamp;
@@ -662,25 +730,74 @@ export async function autoLoop(
662
730
 
663
731
  // Phase B: claim a unit_dispatches row before invoking the unit. The
664
732
  // partial unique index idx_unit_dispatches_active_per_unit prevents
665
- // a second worker from claiming the same unit concurrently. Returns
666
- // null when DB unavailable, no worker registered, or no active lease
667
- // those degraded paths fall through to the existing single-worker
668
- // semantics with no ledger entry, preserving back-compat.
669
- const dispatchClaim = openDispatchClaim(s, flowId, turnId, iterData, {
733
+ // a second worker from claiming the same unit concurrently. When this
734
+ // process has a worker identity, make the milestone lease explicit before
735
+ // claiming so a step-mode handoff cannot leave us running with a stale
736
+ // in-memory token and no backing lease row.
737
+ const leaseBeforeClaim = ensureDispatchLease(s, iterData.mid, {
738
+ claimMilestoneLease,
739
+ logLeaseRecovered: logDispatchLeaseRecovered,
740
+ logLeaseRecoveryFailed: logDispatchLeaseRecoveryFailed,
741
+ });
742
+ if (leaseBeforeClaim.kind === "blocked" || leaseBeforeClaim.kind === "failed") {
743
+ const msg = `Lost milestone lease for ${iterData.mid ?? "unknown"} before dispatching ${iterData.unitType} ${iterData.unitId}: ${leaseBeforeClaim.reason}`;
744
+ ctx.ui.notify(msg, "error");
745
+ finishTurn("stopped", "execution", msg);
746
+ await deps.stopAuto(ctx, pi, msg);
747
+ break;
748
+ }
749
+
750
+ let dispatchClaim = openDispatchClaim(s, flowId, turnId, iterData, {
670
751
  getRecentDispatchesForUnit,
671
752
  recordDispatchClaim,
672
753
  markDispatchRunning,
673
754
  logClaimRejected: logDispatchClaimRejected,
674
755
  logClaimFailed: logDispatchClaimFailed,
675
756
  });
676
- const dispatchDecision = decideDispatchClaim(
757
+ let dispatchDecision = decideDispatchClaim(
677
758
  dispatchClaim.kind === "opened"
678
759
  ? { kind: "opened", dispatchId: dispatchClaim.dispatchId }
679
760
  : dispatchClaim.kind === "skip"
680
761
  ? { kind: "skip", reason: dispatchClaim.reason }
681
762
  : { kind: "degraded" },
682
763
  );
764
+ if (dispatchDecision.action === "skip" && dispatchDecision.reason === "stale-lease") {
765
+ const leaseRecovery = ensureDispatchLease(s, iterData.mid, {
766
+ claimMilestoneLease,
767
+ logLeaseRecovered: logDispatchLeaseRecovered,
768
+ logLeaseRecoveryFailed: logDispatchLeaseRecoveryFailed,
769
+ }, { forceReclaim: true });
770
+ if (leaseRecovery.kind === "ready") {
771
+ dispatchClaim = openDispatchClaim(s, flowId, turnId, iterData, {
772
+ getRecentDispatchesForUnit,
773
+ recordDispatchClaim,
774
+ markDispatchRunning,
775
+ logClaimRejected: logDispatchClaimRejected,
776
+ logClaimFailed: logDispatchClaimFailed,
777
+ });
778
+ dispatchDecision = decideDispatchClaim(
779
+ dispatchClaim.kind === "opened"
780
+ ? { kind: "opened", dispatchId: dispatchClaim.dispatchId }
781
+ : dispatchClaim.kind === "skip"
782
+ ? { kind: "skip", reason: dispatchClaim.reason }
783
+ : { kind: "degraded" },
784
+ );
785
+ } else {
786
+ const msg = `Lost milestone lease for ${iterData.mid ?? "unknown"} while claiming ${iterData.unitType} ${iterData.unitId}: ${leaseRecovery.reason}`;
787
+ ctx.ui.notify(msg, "error");
788
+ finishTurn("stopped", "execution", msg);
789
+ await deps.stopAuto(ctx, pi, msg);
790
+ break;
791
+ }
792
+ }
683
793
  if (dispatchDecision.action === "skip") {
794
+ if (dispatchDecision.reason === "stale-lease") {
795
+ const msg = `Lost milestone lease for ${iterData.mid ?? "unknown"} while claiming ${iterData.unitType} ${iterData.unitId}; dispatch claim still failed after recovery.`;
796
+ ctx.ui.notify(msg, "error");
797
+ finishTurn("stopped", "execution", msg);
798
+ await deps.stopAuto(ctx, pi, msg);
799
+ break;
800
+ }
684
801
  finishTurn("skipped", "execution", dispatchDecision.reason);
685
802
  continue;
686
803
  }
@@ -700,6 +817,7 @@ export async function autoLoop(
700
817
  if (err instanceof ModelPolicyDispatchBlockedError) {
701
818
  throw err;
702
819
  }
820
+ closeOutCrashedUnit(s, iterData, err);
703
821
  dispatchSettled = settleDispatchFailed(
704
822
  dispatchId,
705
823
  formatDispatchExceptionSummary({ error: err }),
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto Orchestration module implementation and ADR-015 invariant pipeline owner.
3
+
1
4
  import type { AutoAdvanceResult, AutoOrchestrationModule, AutoOrchestratorDeps, AutoSessionContext, AutoStatus } from "./contracts.js";
2
5
 
3
6
  function now(): number {
@@ -36,9 +39,21 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
36
39
  return blocked;
37
40
  }
38
41
 
39
- const decision = await this.deps.dispatch.decideNextUnit();
42
+ const reconciliation = await this.deps.stateReconciliation.reconcileBeforeDispatch();
43
+ if (!reconciliation.ok || !reconciliation.stateSnapshot) {
44
+ const blocked: AutoAdvanceResult = {
45
+ kind: "blocked",
46
+ reason: reconciliation.reason,
47
+ stateSnapshot: reconciliation.stateSnapshot,
48
+ };
49
+ await this.deps.runtime.journalTransition({ name: "advance-blocked", reason: blocked.reason });
50
+ await this.deps.health.postAdvanceRecord(blocked);
51
+ return blocked;
52
+ }
53
+
54
+ const decision = await this.deps.dispatch.decideNextUnit({ stateSnapshot: reconciliation.stateSnapshot });
40
55
  if (!decision) {
41
- const stopped: AutoAdvanceResult = { kind: "stopped", reason: "no remaining units" };
56
+ const stopped: AutoAdvanceResult = { kind: "stopped", reason: "no remaining units", stateSnapshot: reconciliation.stateSnapshot };
42
57
  this.status.phase = "stopped";
43
58
  this.status.activeUnit = undefined;
44
59
  this.lastAdvanceKey = null;
@@ -61,6 +76,40 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
61
76
  return blocked;
62
77
  }
63
78
 
79
+ const contract = await this.deps.toolContract.compileUnitToolContract(decision.unitType, decision.unitId);
80
+ if (!contract.ok) {
81
+ const blocked: AutoAdvanceResult = {
82
+ kind: "blocked",
83
+ reason: contract.reason,
84
+ stateSnapshot: reconciliation.stateSnapshot,
85
+ };
86
+ await this.deps.runtime.journalTransition({
87
+ name: "advance-blocked",
88
+ reason: blocked.reason,
89
+ unitType: decision.unitType,
90
+ unitId: decision.unitId,
91
+ });
92
+ await this.deps.health.postAdvanceRecord(blocked);
93
+ return blocked;
94
+ }
95
+
96
+ const worktree = await this.deps.worktree.prepareForUnit(decision.unitType, decision.unitId);
97
+ if (!worktree.ok) {
98
+ const blocked: AutoAdvanceResult = {
99
+ kind: "blocked",
100
+ reason: worktree.reason,
101
+ stateSnapshot: reconciliation.stateSnapshot,
102
+ };
103
+ await this.deps.runtime.journalTransition({
104
+ name: "advance-blocked",
105
+ reason: blocked.reason,
106
+ unitType: decision.unitType,
107
+ unitId: decision.unitId,
108
+ });
109
+ await this.deps.health.postAdvanceRecord(blocked);
110
+ return blocked;
111
+ }
112
+
64
113
  this.status.activeUnit = { unitType: decision.unitType, unitId: decision.unitId };
65
114
  this.status.phase = "running";
66
115
  this.lastAdvanceKey = nextKey;
@@ -72,10 +121,9 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
72
121
  unitType: decision.unitType,
73
122
  unitId: decision.unitId,
74
123
  });
75
- await this.deps.worktree.prepareForUnit(decision.unitType, decision.unitId);
76
124
  await this.deps.worktree.syncAfterUnit(decision.unitType, decision.unitId);
77
125
 
78
- const advanced: AutoAdvanceResult = { kind: "advanced" };
126
+ const advanced: AutoAdvanceResult = { kind: "advanced", stateSnapshot: reconciliation.stateSnapshot };
79
127
  await this.deps.health.postAdvanceRecord(advanced);
80
128
  return advanced;
81
129
  } catch (error) {