gsd-pi 2.80.0-dev.8b3a59f5c → 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 (714) 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 +43 -1
  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 +330 -54
  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 +19 -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-handlers.js +23 -9
  56. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  57. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  58. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  59. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  60. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  62. package/dist/resources/extensions/gsd/detection.js +106 -0
  63. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  64. package/dist/resources/extensions/gsd/git-service.js +73 -5
  65. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  66. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  67. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  68. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  69. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  70. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  72. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  73. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  75. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  76. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  77. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  81. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  85. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  87. package/dist/resources/extensions/gsd/quick.js +34 -2
  88. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  89. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  90. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  91. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  92. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  93. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  94. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  95. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  96. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  97. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  98. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  99. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  100. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  101. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  102. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  103. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  104. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  105. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  106. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  107. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  108. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  109. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  110. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  111. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  112. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  113. package/dist/web/standalone/.next/BUILD_ID +1 -1
  114. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  115. package/dist/web/standalone/.next/build-manifest.json +3 -3
  116. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  117. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  118. package/dist/web/standalone/.next/required-server-files.json +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/index.html +1 -1
  138. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  139. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  146. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware.js +3 -3
  149. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  150. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  151. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  152. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  153. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  154. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  155. package/dist/web/standalone/server.js +1 -1
  156. package/dist/welcome-screen.d.ts +2 -0
  157. package/dist/welcome-screen.js +9 -7
  158. package/package.json +6 -4
  159. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  160. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  161. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  162. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  163. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  164. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  165. package/packages/native/tsconfig.tsbuildinfo +1 -1
  166. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  167. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  168. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  169. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  170. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  171. package/packages/pi-agent-core/dist/agent.js +43 -11
  172. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  173. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  174. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  175. package/packages/pi-agent-core/dist/index.js +2 -0
  176. package/packages/pi-agent-core/dist/index.js.map +1 -1
  177. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  178. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  179. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  180. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  181. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  182. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  183. package/packages/pi-agent-core/dist/types.js.map +1 -1
  184. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  185. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  186. package/packages/pi-agent-core/src/agent.ts +52 -11
  187. package/packages/pi-agent-core/src/index.ts +2 -0
  188. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  189. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  190. package/packages/pi-agent-core/src/types.ts +26 -10
  191. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  192. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  193. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  194. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  195. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  196. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  197. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  198. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  199. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  200. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  201. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  202. package/packages/pi-ai/dist/types.d.ts +2 -0
  203. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  204. package/packages/pi-ai/dist/types.js.map +1 -1
  205. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  206. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  207. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  208. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  209. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  210. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  211. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  212. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  213. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  214. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  215. package/packages/pi-ai/src/types.ts +3 -0
  216. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  217. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  218. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  219. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  220. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  221. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  223. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  225. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  227. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +35 -1
  229. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  231. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  233. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  235. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  237. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  239. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  241. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  242. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  245. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  248. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  250. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  252. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  254. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  256. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  259. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  263. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  265. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  267. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  269. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  271. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  273. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  275. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  277. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  279. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  281. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  283. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  289. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  291. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  295. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  297. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  299. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  301. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  303. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  307. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  311. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  313. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  315. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  317. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  319. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  321. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  322. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  323. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  325. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +114 -22
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +177 -19
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +33 -6
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  354. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  360. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  361. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  362. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  363. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  365. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  366. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  367. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  368. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  369. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +41 -1
  370. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  371. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  372. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  373. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  374. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  375. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  376. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  377. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  378. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  379. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  380. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  381. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  382. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  383. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  384. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  385. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  386. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  387. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  388. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  389. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  390. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  391. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  392. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  393. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  394. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  395. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  396. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  397. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  398. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +144 -22
  399. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  400. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  401. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  402. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  403. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +208 -19
  404. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  405. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +41 -8
  406. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  407. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  408. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  409. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  410. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  411. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  412. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  413. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  414. package/packages/pi-tui/dist/tui.js +18 -8
  415. package/packages/pi-tui/dist/tui.js.map +1 -1
  416. package/packages/pi-tui/src/tui.ts +20 -8
  417. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  418. package/packages/rpc-client/README.md +7 -0
  419. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  420. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  421. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  422. package/src/resources/GSD-WORKFLOW.md +2 -2
  423. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  424. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  425. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  426. package/src/resources/extensions/github-sync/sync.ts +8 -1
  427. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  428. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  429. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  430. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  431. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  432. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  433. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  434. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  435. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  436. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  437. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  438. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  439. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  440. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -0
  441. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  442. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  443. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  444. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  445. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  446. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  447. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  448. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  449. package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
  450. package/src/resources/extensions/gsd/auto.ts +336 -89
  451. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
  452. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  453. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  454. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  455. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  456. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  457. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  458. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  459. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
  460. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  461. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  462. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  463. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  464. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  465. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  466. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  467. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  468. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  469. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  470. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  471. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  472. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  473. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  474. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  475. package/src/resources/extensions/gsd/detection.ts +128 -0
  476. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  477. package/src/resources/extensions/gsd/git-service.ts +87 -10
  478. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  479. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  480. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  481. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  482. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  483. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  484. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  485. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  486. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  487. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  488. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  490. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  491. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  492. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  495. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  497. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  499. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  501. package/src/resources/extensions/gsd/quick.ts +37 -2
  502. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  503. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  504. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  505. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  506. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  507. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  508. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  509. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  510. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  511. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +544 -41
  512. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  513. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  514. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  515. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  516. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  517. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  518. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  519. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  520. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  521. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  522. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  523. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  524. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  525. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  526. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  527. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  528. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  529. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  530. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  531. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  532. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  533. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  534. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  535. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  536. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  537. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  538. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  539. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  540. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  541. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  542. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  543. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  544. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  545. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  546. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  547. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  548. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
  549. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  550. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  551. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  552. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  553. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  554. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  555. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  556. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  557. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  558. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  559. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  560. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  561. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  562. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  563. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  564. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  565. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  566. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  567. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  568. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  569. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  570. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  572. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  573. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  574. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  575. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  576. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  577. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  578. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  579. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  580. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  581. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  582. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  583. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  584. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  585. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  586. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  587. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  588. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  589. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  590. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  591. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  592. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  593. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  594. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  595. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  596. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  597. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  598. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  599. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  600. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  601. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  602. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  603. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  604. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  605. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  606. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  607. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  608. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  609. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  610. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  611. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  612. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  613. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  614. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  615. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  616. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  617. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  618. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  619. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  620. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  621. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  622. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  623. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  624. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  625. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  626. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  627. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  628. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  629. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  630. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  631. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  632. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  633. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  634. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  635. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  636. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  637. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  638. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  639. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  640. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  641. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  642. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  643. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  644. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  645. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  646. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  647. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  648. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  649. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  650. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  651. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  652. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  653. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  654. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  655. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  656. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  657. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  658. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  659. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  660. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  661. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  662. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  663. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  664. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  665. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  666. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  667. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  668. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  669. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  670. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  671. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  672. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  673. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  674. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  675. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  676. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  677. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  678. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  679. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  680. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  681. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  682. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  683. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  684. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  685. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  686. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  687. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  688. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  689. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  690. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  691. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  692. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  693. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  694. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  695. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  696. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  697. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  698. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  699. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  700. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  701. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  702. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  703. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  704. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  705. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  706. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  707. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  708. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  709. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  710. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  711. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  712. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  713. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
  714. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode orchestration, session lifecycle, and stop handling.
1
3
  /**
2
4
  * GSD Auto Mode — Fresh Session Per Unit
3
5
  *
@@ -59,6 +61,7 @@ import {
59
61
  isLockProcessAlive,
60
62
  formatCrashInfo,
61
63
  emitCrashRecoveredUnitEnd,
64
+ emitOpenUnitEndForUnit,
62
65
  } from "./crash-recovery.js";
63
66
  import {
64
67
  acquireSessionLock,
@@ -150,6 +153,7 @@ import {
150
153
  resolveProjectRoot,
151
154
  } from "./worktree.js";
152
155
  import { GitServiceImpl } from "./git-service.js";
156
+ import { nativeCheckoutBranch } from "./native-git-bridge.js";
153
157
  import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
154
158
  import {
155
159
  createAutoWorktree,
@@ -162,8 +166,6 @@ import {
162
166
  mergeMilestoneToMain,
163
167
  autoWorktreeBranch,
164
168
  syncWorktreeStateBack,
165
- syncProjectRootToWorktree,
166
- syncStateToProjectRoot,
167
169
  readResourceVersion,
168
170
  checkResourcesStale,
169
171
  escapeStaleWorktree,
@@ -200,6 +202,8 @@ import {
200
202
  detectWorkingTreeActivity,
201
203
  } from "./auto-supervisor.js";
202
204
  import { isDbAvailable, getMilestone } from "./gsd-db.js";
205
+ import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
206
+ import { writeUnitRuntimeRecord } from "./unit-runtime.js";
203
207
  import { countPendingCaptures } from "./captures.js";
204
208
  import { CMUX_CHANNELS, type CmuxLogLevel } from "../shared/cmux-events.js";
205
209
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
@@ -234,14 +238,34 @@ import { resolveUokFlags } from "./uok/flags.js";
234
238
  import { validateDirectory } from "./validate-directory.js";
235
239
  import { createAutoOrchestrator } from "./auto/orchestrator.js";
236
240
  import type { AutoOrchestrationModule, AutoOrchestratorDeps } from "./auto/contracts.js";
241
+ import { reconcileBeforeDispatch } from "./state-reconciliation.js";
242
+ import { compileUnitToolContract } from "./tool-contract.js";
243
+ import { createWorktreeSafetyModule } from "./worktree-safety.js";
244
+ import { resolveManifest } from "./unit-context-manifest.js";
245
+ import { classifyFailure } from "./recovery-classification.js";
237
246
  // Slice-level parallelism (#2340)
238
247
  import { getEligibleSlices } from "./slice-parallel-eligibility.js";
239
248
  import { startSliceParallel } from "./slice-parallel-orchestrator.js";
240
249
  import {
241
- WorktreeResolver,
242
- type WorktreeResolverDeps,
243
- } from "./worktree-resolver.js";
250
+ WorktreeLifecycle,
251
+ type WorktreeLifecycleDeps,
252
+ } from "./worktree-lifecycle.js";
253
+ import { WorktreeStateProjection } from "./worktree-state-projection.js";
244
254
  import { reorderForCaching } from "./prompt-ordering.js";
255
+ import { initTokenCounter } from "./token-counter.js";
256
+
257
+ // Warm the tiktoken encoder at extension startup so context-budget computations
258
+ // can use accurate token counts via countTokensSync without paying the load
259
+ // cost mid-prompt-build. Fire-and-forget — failure falls back to the
260
+ // provider-aware char-ratio estimator already used by getCharsPerToken().
261
+ // Catch rejections explicitly: an unhandled rejection at module-import time
262
+ // can destabilize startup before the engine logger is configured.
263
+ void initTokenCounter().catch((err) => {
264
+ logWarning(
265
+ "engine",
266
+ `token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`,
267
+ );
268
+ });
245
269
 
246
270
  // ─── Session State ─────────────────────────────────────────────────────────
247
271
 
@@ -293,11 +317,15 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
293
317
  * the DB is unavailable (e.g. fresh project before init) we skip registration
294
318
  * silently rather than blocking session start.
295
319
  */
296
- function registerAutoWorkerForSession(session: AutoSession): void {
320
+ function registerAutoWorkerForSession(
321
+ session: AutoSession,
322
+ projectRootOverride?: string,
323
+ ): void {
297
324
  if (session.workerId) return; // already registered (e.g. resume re-runs)
298
325
  try {
299
326
  const projectRootRealpath = normalizeRealPath(
300
- session.scope?.workspace.projectRoot
327
+ projectRootOverride
328
+ ?? session.scope?.workspace.projectRoot
301
329
  ?? (session.originalBasePath || session.basePath),
302
330
  );
303
331
  session.workerId = registerAutoWorker({ projectRootRealpath });
@@ -332,6 +360,14 @@ function restoreProjectRootEnv(): void {
332
360
  s.projectRootEnvCaptured = false;
333
361
  }
334
362
 
363
+ export function _captureProjectRootEnvForTest(projectRoot: string): void {
364
+ captureProjectRootEnv(projectRoot);
365
+ }
366
+
367
+ export function _restoreProjectRootEnvForTest(): void {
368
+ restoreProjectRootEnv();
369
+ }
370
+
335
371
  function captureMilestoneLockEnv(milestoneId: string | null): void {
336
372
  if (!s.milestoneLockEnvCaptured) {
337
373
  s.hadMilestoneLockEnv = Object.prototype.hasOwnProperty.call(process.env, "GSD_MILESTONE_LOCK");
@@ -420,6 +456,27 @@ export function _synthesizePausedSessionRecoveryForTest(
420
456
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
421
457
  }
422
458
 
459
+ export function _resolvePausedResumeBasePathForTest(
460
+ basePath: string,
461
+ pausedWorktreePath: string | null | undefined,
462
+ pathExists: (path: string) => boolean = existsSync,
463
+ ): string {
464
+ return pausedWorktreePath && pathExists(pausedWorktreePath)
465
+ ? pausedWorktreePath
466
+ : basePath;
467
+ }
468
+
469
+ const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
470
+
471
+ function withDetachedAutoKeepalive<T>(run: Promise<T>): Promise<T> {
472
+ const keepAlive = setInterval(() => {}, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
473
+ return run.finally(() => {
474
+ clearInterval(keepAlive);
475
+ });
476
+ }
477
+
478
+ export const _withDetachedAutoKeepaliveForTest = withDetachedAutoKeepalive;
479
+
423
480
  export function startAutoDetached(
424
481
  ctx: ExtensionCommandContext,
425
482
  pi: ExtensionAPI,
@@ -431,7 +488,7 @@ export function startAutoDetached(
431
488
  milestoneLock?: string | null;
432
489
  },
433
490
  ): void {
434
- void startAuto(ctx, pi, base, verboseMode, options).catch((err) => {
491
+ void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch((err) => {
435
492
  const message = getErrorMessage(err);
436
493
  ctx.ui.notify(`Auto-start failed: ${message}`, "error");
437
494
  logWarning("engine", `auto start error: ${message}`, { file: "auto.ts" });
@@ -490,9 +547,54 @@ export {
490
547
  getBudgetEnforcementAction,
491
548
  } from "./auto-budget.js";
492
549
 
550
+ function closeOutSignalInterruptedUnit(currentBasePath: string): void {
551
+ const currentUnit = s.currentUnit;
552
+ if (!currentUnit) return;
553
+
554
+ const reason = "Auto-mode process received a termination signal";
555
+ const errorContext: ErrorContext = {
556
+ message: reason,
557
+ category: "aborted",
558
+ isTransient: false,
559
+ };
560
+ const basePath = s.basePath || currentBasePath;
561
+
562
+ try {
563
+ emitOpenUnitEndForUnit(basePath, currentUnit.type, currentUnit.id, "cancelled", errorContext);
564
+ } catch (err) {
565
+ logWarning("engine", `signal unit-end cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
566
+ }
567
+
568
+ try {
569
+ writeUnitRuntimeRecord(basePath, currentUnit.type, currentUnit.id, currentUnit.startedAt, {
570
+ phase: "crashed",
571
+ lastProgressAt: Date.now(),
572
+ lastProgressKind: "signal",
573
+ });
574
+ } catch (err) {
575
+ logWarning("engine", `signal runtime cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
576
+ }
577
+
578
+ try {
579
+ if (s.workerId) markLatestActiveForWorkerCanceled(s.workerId, "signal-exit");
580
+ } catch (err) {
581
+ logWarning("engine", `signal dispatch cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
582
+ }
583
+
584
+ try {
585
+ resolveAgentEndCancelled(errorContext);
586
+ } catch (err) {
587
+ logWarning("engine", `signal resolve cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
588
+ }
589
+ }
590
+
493
591
  /** Wrapper: register SIGTERM handler and store reference. */
494
592
  function registerSigtermHandler(currentBasePath: string): void {
495
- s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler);
593
+ s.sigtermHandler = _registerSigtermHandler(
594
+ currentBasePath,
595
+ s.sigtermHandler,
596
+ () => closeOutSignalInterruptedUnit(currentBasePath),
597
+ );
496
598
  }
497
599
 
498
600
  /** Wrapper: deregister SIGTERM handler and clear reference. */
@@ -595,6 +697,30 @@ export function isAutoPaused(): boolean {
595
697
  return s.paused;
596
698
  }
597
699
 
700
+ export interface ResumeResourceRefreshDeps {
701
+ env?: NodeJS.ProcessEnv;
702
+ importModule?: (specifier: string) => Promise<any>;
703
+ openProjectDb?: (basePath: string) => Promise<void>;
704
+ }
705
+
706
+ export async function refreshResumeResourcesAndDb(
707
+ basePath: string,
708
+ deps: ResumeResourceRefreshDeps = {},
709
+ ): Promise<void> {
710
+ const env = deps.env ?? process.env;
711
+ const importModule = deps.importModule ?? ((specifier: string) => import(specifier));
712
+ const agentDir = env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
713
+ const pkgRoot = env.GSD_PKG_ROOT;
714
+ const resourceLoaderPath = pkgRoot
715
+ ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
716
+ : new URL("../../../resource-loader.js", import.meta.url).href;
717
+ const { initResources } = await importModule(resourceLoaderPath);
718
+ initResources(agentDir);
719
+ const { primeCache } = await importModule("./prompt-loader.js");
720
+ primeCache();
721
+ await (deps.openProjectDb ?? openProjectDbIfPresent)(basePath);
722
+ }
723
+
598
724
  export function setActiveEngineId(id: string | null): void {
599
725
  s.activeEngineId = id;
600
726
  }
@@ -849,7 +975,23 @@ function handleLostSessionLock(
849
975
  * the stale unit state, progress widget, status badge, and restores CWD so
850
976
  * the dashboard does not show an orphaned timer and the shell is usable.
851
977
  */
852
- function cleanupAfterLoopExit(ctx: ExtensionContext): void {
978
+ export async function rerootCommandSession(
979
+ cmdCtx: Pick<ExtensionCommandContext, "newSession"> | null | undefined,
980
+ workspaceRoot: string,
981
+ ): Promise<{ status: "skipped" | "ok" | "cancelled" | "failed"; error?: string }> {
982
+ if (!cmdCtx || !workspaceRoot) return { status: "skipped" };
983
+ try {
984
+ const result = await cmdCtx.newSession({ workspaceRoot });
985
+ return result.cancelled ? { status: "cancelled" } : { status: "ok" };
986
+ } catch (err) {
987
+ return {
988
+ status: "failed",
989
+ error: err instanceof Error ? err.message : String(err),
990
+ };
991
+ }
992
+ }
993
+
994
+ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void> {
853
995
  s.currentUnit = null;
854
996
  s.active = false;
855
997
  deactivateGSD();
@@ -887,6 +1029,34 @@ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
887
1029
  logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
888
1030
  }
889
1031
  }
1032
+
1033
+ if (s.originalBasePath && s.cmdCtx) {
1034
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1035
+ if (result.status === "cancelled") {
1036
+ logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1037
+ } else if (result.status === "failed") {
1038
+ logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1039
+ }
1040
+ }
1041
+ }
1042
+
1043
+ export function _cleanupAfterLoopExitForTest(ctx: ExtensionContext): Promise<void> {
1044
+ return cleanupAfterLoopExit(ctx);
1045
+ }
1046
+
1047
+ export type AutoWorktreeExitAction = "skip" | "merge" | "preserve";
1048
+
1049
+ export function _resolveAutoWorktreeExitActionForTest(
1050
+ currentMilestoneId: string | null | undefined,
1051
+ milestoneMergedInPhases: boolean,
1052
+ milestoneComplete: boolean,
1053
+ ): AutoWorktreeExitAction {
1054
+ const action = _selectStopAutoWorktreeExit({
1055
+ currentMilestoneId: currentMilestoneId ?? null,
1056
+ milestoneComplete,
1057
+ milestoneMergedInPhases,
1058
+ });
1059
+ return action === "none" ? "skip" : action;
890
1060
  }
891
1061
 
892
1062
  export async function stopAuto(
@@ -957,6 +1127,8 @@ export async function stopAuto(
957
1127
  if (s.workerId) {
958
1128
  markWorkerStopping(s.workerId);
959
1129
  }
1130
+ s.workerId = null;
1131
+ s.milestoneLeaseToken = null;
960
1132
  } catch (e) {
961
1133
  debugLog("stop-cleanup-coordination", { error: e instanceof Error ? e.message : String(e) });
962
1134
  }
@@ -1000,7 +1172,7 @@ export async function stopAuto(
1000
1172
  const notifyCtx = ctx
1001
1173
  ? { notify: ctx.ui.notify.bind(ctx.ui) }
1002
1174
  : { notify: () => {} };
1003
- const resolver = buildResolver();
1175
+ const lifecycle = buildLifecycle();
1004
1176
 
1005
1177
  // Check if the milestone is complete. DB status is the authoritative
1006
1178
  // signal — only a successful gsd_complete_milestone call flips it to
@@ -1038,17 +1210,35 @@ export async function stopAuto(
1038
1210
  logWarning("engine", `milestone summary check failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1039
1211
  }
1040
1212
 
1041
- if (milestoneComplete) {
1213
+ const exitAction = _selectStopAutoWorktreeExit({
1214
+ currentMilestoneId: s.currentMilestoneId,
1215
+ milestoneComplete,
1216
+ milestoneMergedInPhases: s.milestoneMergedInPhases,
1217
+ });
1218
+
1219
+ if (exitAction === "merge") {
1042
1220
  // Milestone is complete — merge worktree branch back to main
1043
- resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
1044
- } else {
1221
+ const r = lifecycle.exitMilestone(
1222
+ s.currentMilestoneId,
1223
+ { merge: true },
1224
+ notifyCtx,
1225
+ );
1226
+ if (!r.ok && r.cause instanceof Error) throw r.cause;
1227
+ } else if (exitAction === "preserve") {
1045
1228
  // Milestone still in progress — preserve branch for later resumption
1046
- resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
1047
- preserveBranch: true,
1048
- });
1229
+ const r = lifecycle.exitMilestone(
1230
+ s.currentMilestoneId,
1231
+ { merge: false, preserveBranch: true },
1232
+ notifyCtx,
1233
+ );
1234
+ if (!r.ok && r.cause instanceof Error) throw r.cause;
1049
1235
  }
1050
1236
  }
1051
1237
  } catch (e) {
1238
+ ctx?.ui.notify(
1239
+ `Worktree cleanup failed for ${s.currentMilestoneId ?? "current milestone"}: ${e instanceof Error ? e.message : String(e)}. Resolve the preserved branch/worktree and run /gsd auto to resume.`,
1240
+ "warning",
1241
+ );
1052
1242
  debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
1053
1243
  }
1054
1244
 
@@ -1094,6 +1284,19 @@ export async function stopAuto(
1094
1284
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1095
1285
  }
1096
1286
 
1287
+ // Re-root the active command session/tool runtime after worktree teardown.
1288
+ // mergeAndExit restores process.cwd(), but AgentSession has already captured
1289
+ // its own cwd for tools and system prompt; refresh it before returning to the
1290
+ // user so follow-up commands do not target a removed milestone worktree.
1291
+ if (s.originalBasePath && ctx && s.cmdCtx) {
1292
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1293
+ if (result.status === "cancelled") {
1294
+ logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1295
+ } else if (result.status === "failed") {
1296
+ logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1297
+ }
1298
+ }
1299
+
1097
1300
  // ── Step 8: Ledger notification ──
1098
1301
  try {
1099
1302
  const ledger = getLedger();
@@ -1222,6 +1425,17 @@ export async function stopAuto(
1222
1425
  }
1223
1426
  }
1224
1427
 
1428
+ export type StopAutoWorktreeExitAction = "none" | "merge" | "preserve";
1429
+
1430
+ export function _selectStopAutoWorktreeExit(args: {
1431
+ currentMilestoneId: string | null;
1432
+ milestoneComplete: boolean;
1433
+ milestoneMergedInPhases: boolean;
1434
+ }): StopAutoWorktreeExitAction {
1435
+ if (!args.currentMilestoneId || args.milestoneMergedInPhases) return "none";
1436
+ return args.milestoneComplete ? "merge" : "preserve";
1437
+ }
1438
+
1225
1439
  /**
1226
1440
  * Pause auto-mode without destroying state. Context is preserved.
1227
1441
  * The user can interact with the agent, then `/gsd auto` resumes
@@ -1340,43 +1554,36 @@ export async function pauseAuto(
1340
1554
  }
1341
1555
 
1342
1556
  /**
1343
- * Build a WorktreeResolverDeps from auto.ts private scope.
1344
- * Shared by buildResolver() and buildLoopDeps().
1557
+ * Build a WorktreeLifecycle Module wrapping the current session.
1558
+ *
1559
+ * Per ADR-016, the Lifecycle Module is the typed-Interface owner of milestone
1560
+ * entry/exit/merge verbs and calls Projection on lifecycle transitions. The
1561
+ * deps bag is intentionally focused — Lifecycle does not see the wider auto-
1562
+ * mode dependency graph.
1345
1563
  */
1346
- function buildResolverDeps(): WorktreeResolverDeps {
1347
- return {
1348
- isInAutoWorktree,
1349
- shouldUseWorktreeIsolation,
1350
- getIsolationMode,
1351
- mergeMilestoneToMain,
1352
- syncWorktreeStateBack,
1353
- teardownAutoWorktree,
1354
- createAutoWorktree,
1564
+ function buildLifecycle(): WorktreeLifecycle {
1565
+ const lifecycleDeps = {
1355
1566
  enterAutoWorktree,
1567
+ createAutoWorktree,
1356
1568
  enterBranchModeForMilestone,
1357
1569
  getAutoWorktreePath,
1570
+ getIsolationMode,
1571
+ invalidateAllCaches,
1572
+ GitServiceImpl,
1573
+ loadEffectiveGSDPreferences,
1574
+ worktreeProjection: new WorktreeStateProjection(),
1575
+ isInAutoWorktree,
1358
1576
  autoCommitCurrentBranch,
1359
- getCurrentBranch,
1360
1577
  autoWorktreeBranch,
1578
+ teardownAutoWorktree,
1579
+ mergeMilestoneToMain,
1580
+ getCurrentBranch,
1581
+ checkoutBranch: nativeCheckoutBranch,
1361
1582
  resolveMilestoneFile,
1362
1583
  readFileSync: (path: string, encoding: string) =>
1363
1584
  readFileSync(path, encoding as BufferEncoding),
1364
- GitServiceImpl:
1365
- GitServiceImpl as unknown as WorktreeResolverDeps["GitServiceImpl"],
1366
- loadEffectiveGSDPreferences:
1367
- loadEffectiveGSDPreferences as unknown as WorktreeResolverDeps["loadEffectiveGSDPreferences"],
1368
- invalidateAllCaches,
1369
- captureIntegrationBranch,
1370
- };
1371
- }
1372
-
1373
- /**
1374
- * Build a WorktreeResolver wrapping the current session.
1375
- * Cheap to construct — it's just a thin wrapper over `s` + deps.
1376
- * Used by stopAuto(), resume path, and buildLoopDeps().
1377
- */
1378
- function buildResolver(): WorktreeResolver {
1379
- return new WorktreeResolver(s, buildResolverDeps());
1585
+ } as unknown as WorktreeLifecycleDeps;
1586
+ return new WorktreeLifecycle(s, lifecycleDeps);
1380
1587
  }
1381
1588
 
1382
1589
  /**
@@ -1396,9 +1603,26 @@ export function createWiredAutoOrchestrationModule(
1396
1603
  let seq = 0;
1397
1604
 
1398
1605
  const deps: AutoOrchestratorDeps = {
1606
+ stateReconciliation: {
1607
+ async reconcileBeforeDispatch() {
1608
+ const result = await reconcileBeforeDispatch(dispatchBasePath);
1609
+ if (!result.ok) {
1610
+ return {
1611
+ ok: false,
1612
+ reason: result.reason,
1613
+ stateSnapshot: result.stateSnapshot,
1614
+ };
1615
+ }
1616
+ return {
1617
+ ok: true,
1618
+ reason: result.repaired.join(", "),
1619
+ stateSnapshot: result.stateSnapshot,
1620
+ };
1621
+ },
1622
+ },
1399
1623
  dispatch: {
1400
- async decideNextUnit() {
1401
- const state = await deriveState(dispatchBasePath);
1624
+ async decideNextUnit(input) {
1625
+ const state = input.stateSnapshot;
1402
1626
  const active = state.activeMilestone;
1403
1627
  if (!active) return null;
1404
1628
 
@@ -1422,12 +1646,48 @@ export function createWiredAutoOrchestrationModule(
1422
1646
  },
1423
1647
  recovery: {
1424
1648
  async classifyAndRecover(input) {
1425
- const reason = input.error instanceof Error ? input.error.message : String(input.error ?? "unknown auto error");
1426
- return { action: "escalate" as const, reason };
1649
+ const recovery = classifyFailure(input);
1650
+ return { action: recovery.action, reason: recovery.reason };
1651
+ },
1652
+ },
1653
+ toolContract: {
1654
+ async compileUnitToolContract(unitType) {
1655
+ const result = compileUnitToolContract(unitType);
1656
+ if (!result.ok) return { ok: false, reason: result.detail };
1657
+ return { ok: true, reason: result.contract.validationRules.join(", ") };
1427
1658
  },
1428
1659
  },
1429
1660
  worktree: {
1430
- async prepareForUnit() {},
1661
+ async prepareForUnit(unitType, unitId) {
1662
+ const manifest = resolveManifest(unitType);
1663
+ if (!manifest) {
1664
+ return {
1665
+ ok: false,
1666
+ reason: `No Unit manifest is registered for ${unitType}`,
1667
+ };
1668
+ }
1669
+ const writeScope =
1670
+ manifest.tools.mode === "all" || manifest.tools.mode === "docs"
1671
+ ? "source-writing"
1672
+ : "planning-only";
1673
+ const safety = createWorktreeSafetyModule();
1674
+ const snapshot = await deriveState(dispatchBasePath);
1675
+ const milestoneId = snapshot.activeMilestone?.id ?? null;
1676
+ const expectedBranch = milestoneId ? autoWorktreeBranch(milestoneId) : null;
1677
+ const result = safety.validateUnitRoot({
1678
+ unitType,
1679
+ unitId,
1680
+ writeScope,
1681
+ projectRoot: runtimeBasePath,
1682
+ unitRoot: dispatchBasePath,
1683
+ milestoneId,
1684
+ expectedBranch,
1685
+ });
1686
+ if (!result.ok) {
1687
+ return { ok: false, reason: `${result.kind}: ${result.reason}` };
1688
+ }
1689
+ return { ok: true, reason: result.kind };
1690
+ },
1431
1691
  async syncAfterUnit() {},
1432
1692
  async cleanupOnStop() {},
1433
1693
  },
@@ -1525,6 +1785,7 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
1525
1785
  initRegistry(convertDispatchRules(DISPATCH_RULES));
1526
1786
 
1527
1787
  const cmux = makeCmuxEmitters(pi);
1788
+ const worktreeProjection = new WorktreeStateProjection();
1528
1789
 
1529
1790
  return {
1530
1791
  lockBase,
@@ -1548,8 +1809,8 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
1548
1809
  // Pre-dispatch health gate
1549
1810
  preDispatchHealthGate,
1550
1811
 
1551
- // Worktree sync
1552
- syncProjectRootToWorktree,
1812
+ // Worktree state projection (ADR-016 — single Module Interface)
1813
+ worktreeProjection,
1553
1814
 
1554
1815
  // Resource version guard
1555
1816
  checkResourcesStale,
@@ -1621,8 +1882,9 @@ function buildLoopDeps(pi: ExtensionAPI): LoopDeps {
1621
1882
  // Git
1622
1883
  GitServiceImpl: GitServiceImpl as unknown as LoopDeps["GitServiceImpl"],
1623
1884
 
1624
- // WorktreeResolver
1625
- resolver: buildResolver(),
1885
+ // Worktree Lifecycle Module (ADR-016 — single Module Interface for the
1886
+ // milestone create/enter/exit/merge verbs)
1887
+ lifecycle: buildLifecycle(),
1626
1888
 
1627
1889
  // Post-unit processing
1628
1890
  postUnitPreVerification,
@@ -1899,9 +2161,7 @@ export async function startAuto(
1899
2161
  { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
1900
2162
  );
1901
2163
  }
1902
- if (resumeWorktreePath && existsSync(resumeWorktreePath)) {
1903
- s.basePath = resumeWorktreePath;
1904
- }
2164
+ s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
1905
2165
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
1906
2166
  rebuildScope(s.basePath, s.currentMilestoneId);
1907
2167
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -1929,9 +2189,17 @@ export async function startAuto(
1929
2189
  !detectWorktreeName(s.basePath) &&
1930
2190
  !detectWorktreeName(s.originalBasePath)
1931
2191
  ) {
1932
- buildResolver().enterMilestone(s.currentMilestoneId, {
2192
+ const enterResult = buildLifecycle().enterMilestone(s.currentMilestoneId, {
1933
2193
  notify: ctx.ui.notify.bind(ctx.ui),
1934
2194
  });
2195
+ if (!enterResult.ok && enterResult.reason === "lease-conflict") {
2196
+ ctx.ui.notify(
2197
+ `Cannot resume milestone ${s.currentMilestoneId}: lease is held by another worker.`,
2198
+ "error",
2199
+ );
2200
+ await stopAuto(ctx, pi, "lease-conflict during resume");
2201
+ return;
2202
+ }
1935
2203
  // s.basePath may have been updated to a worktree path by enterMilestone.
1936
2204
  rebuildScope(s.basePath, s.currentMilestoneId);
1937
2205
  }
@@ -1953,16 +2221,7 @@ export async function startAuto(
1953
2221
  // tree; deployed extensions live at ~/.gsd/agent/extensions/gsd/ where the
1954
2222
  // relative path resolves to ~/.gsd/agent/resource-loader.js which doesn't exist.
1955
2223
  // Using GSD_PKG_ROOT constructs a correct absolute path in both contexts (#3949).
1956
- const agentDir = process.env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
1957
- const pkgRoot = process.env.GSD_PKG_ROOT;
1958
- const resourceLoaderPath = pkgRoot
1959
- ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
1960
- : new URL("../../../resource-loader.js", import.meta.url).href;
1961
- const { initResources } = await import(resourceLoaderPath);
1962
- initResources(agentDir);
1963
- // Open the project DB before rebuild/derive so resume uses DB-backed
1964
- // state instead of falling back to stale markdown parsing (#2940).
1965
- await openProjectDbIfPresent(s.basePath);
2224
+ await refreshResumeResourcesAndDb(s.basePath);
1966
2225
  try {
1967
2226
  await rebuildState(s.basePath);
1968
2227
  pi.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "sync" as const, preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, state: await deriveState(s.basePath) });
@@ -2034,7 +2293,7 @@ export async function startAuto(
2034
2293
  runKernelLoop: runUokKernelLoop,
2035
2294
  runLegacyLoop: runLegacyAutoLoop,
2036
2295
  });
2037
- cleanupAfterLoopExit(ctx);
2296
+ await cleanupAfterLoopExit(ctx);
2038
2297
  return;
2039
2298
  }
2040
2299
 
@@ -2043,9 +2302,14 @@ export async function startAuto(
2043
2302
  shouldUseWorktreeIsolation,
2044
2303
  registerSigtermHandler,
2045
2304
  lockBase,
2046
- buildResolver,
2305
+ buildLifecycle,
2047
2306
  };
2048
2307
 
2308
+ // Register the worker before bootstrap enters a milestone worktree.
2309
+ // This ensures enterMilestone can claim a lease and seed dispatch claims
2310
+ // for crash-recovery fidelity (#5405).
2311
+ registerAutoWorkerForSession(s, base);
2312
+
2049
2313
  const ready = await bootstrapAutoSession(
2050
2314
  s,
2051
2315
  ctx,
@@ -2089,7 +2353,7 @@ export async function startAuto(
2089
2353
  runKernelLoop: runUokKernelLoop,
2090
2354
  runLegacyLoop: runLegacyAutoLoop,
2091
2355
  });
2092
- cleanupAfterLoopExit(ctx);
2356
+ await cleanupAfterLoopExit(ctx);
2093
2357
  }
2094
2358
 
2095
2359
  // describeNextUnit is imported from auto-dashboard.ts and re-exported
@@ -2213,24 +2477,7 @@ export async function dispatchHookUnit(
2213
2477
  startedAt: hookStartedAt,
2214
2478
  };
2215
2479
 
2216
- // Ensure cwd matches basePath BEFORE newSession() captures it (#1389).
2217
- // newSession() snapshots process.cwd() during construction; chdir-ing
2218
- // afterward leaves the session rooted to whatever cwd was when the call
2219
- // was made. Must be synchronous — no awaits between chdir and newSession.
2220
- try { if (process.cwd() !== s.basePath) process.chdir(s.basePath); } catch (err) {
2221
- const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
2222
- logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
2223
- ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
2224
- if (wasActive) {
2225
- s.basePath = previousBasePath;
2226
- s.currentUnit = previousCurrentUnit;
2227
- } else {
2228
- s.reset();
2229
- }
2230
- return false;
2231
- }
2232
-
2233
- const result = await s.cmdCtx!.newSession();
2480
+ const result = await s.cmdCtx!.newSession({ workspaceRoot: s.basePath });
2234
2481
  if (result.cancelled) {
2235
2482
  await stopAuto(ctx, pi);
2236
2483
  return false;