gsd-pi 2.80.0-dev.4ea7d80e7 → 2.80.0-dev.7582bf37a

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 (656) hide show
  1. package/README.md +4 -2
  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/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  29. package/dist/resources/extensions/gsd/auto-start.js +238 -12
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
  33. package/dist/resources/extensions/gsd/auto.js +159 -44
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -54
  43. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  44. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  46. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  47. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  48. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  50. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  51. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  52. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  53. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  54. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  55. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  56. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  57. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  58. package/dist/resources/extensions/gsd/detection.js +106 -0
  59. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  60. package/dist/resources/extensions/gsd/git-service.js +73 -5
  61. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  62. package/dist/resources/extensions/gsd/guided-flow.js +141 -46
  63. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  64. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  65. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  67. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  70. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  71. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  72. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  73. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  74. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  78. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  80. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/quick.js +34 -2
  83. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  84. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  85. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  86. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  88. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  89. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  94. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  96. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  97. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  98. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  99. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  100. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  101. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  102. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  103. package/dist/web/standalone/.next/BUILD_ID +1 -1
  104. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  105. package/dist/web/standalone/.next/build-manifest.json +3 -3
  106. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  107. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  108. package/dist/web/standalone/.next/required-server-files.json +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.html +1 -1
  128. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  129. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  130. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  136. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware.js +3 -3
  139. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  140. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  141. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  142. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  143. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  145. package/dist/web/standalone/server.js +1 -1
  146. package/dist/welcome-screen.d.ts +2 -0
  147. package/dist/welcome-screen.js +9 -7
  148. package/package.json +3 -3
  149. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  150. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  151. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  152. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  153. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  154. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  155. package/packages/native/tsconfig.tsbuildinfo +1 -1
  156. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  157. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  158. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  159. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  160. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  161. package/packages/pi-agent-core/dist/agent.js +2 -0
  162. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  163. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  164. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  165. package/packages/pi-agent-core/dist/index.js +2 -0
  166. package/packages/pi-agent-core/dist/index.js.map +1 -1
  167. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  168. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  169. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  170. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  171. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  172. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  173. package/packages/pi-agent-core/dist/types.js.map +1 -1
  174. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  175. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  176. package/packages/pi-agent-core/src/agent.ts +8 -0
  177. package/packages/pi-agent-core/src/index.ts +2 -0
  178. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  179. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  180. package/packages/pi-agent-core/src/types.ts +14 -0
  181. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  182. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  183. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  184. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  185. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  186. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  187. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  188. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  189. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  190. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  192. package/packages/pi-ai/dist/types.d.ts +2 -0
  193. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  194. package/packages/pi-ai/dist/types.js.map +1 -1
  195. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  196. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  197. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  198. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  199. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  200. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  201. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  202. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  203. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  204. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  205. package/packages/pi-ai/src/types.ts +3 -0
  206. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  207. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  208. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  209. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  210. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  211. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +17 -0
  215. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
  217. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  219. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  221. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  223. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  225. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  226. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  227. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  228. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  229. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  230. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  231. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  232. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  233. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  234. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  235. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  240. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  242. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  249. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  251. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  252. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  253. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  254. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  255. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  259. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  261. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  263. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  265. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  267. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  269. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  277. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  279. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  281. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  283. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  285. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  287. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  289. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  291. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  293. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  295. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  297. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  301. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  303. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  307. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  309. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  311. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  313. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  315. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +155 -7
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +22 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  336. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  340. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  341. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +59 -7
  343. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  344. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  345. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  346. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  347. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  348. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  349. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  350. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  351. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  352. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  353. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  354. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  355. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  356. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  357. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  358. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  359. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  360. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  361. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  362. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  363. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  365. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  366. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  367. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  368. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  369. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  370. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  372. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
  374. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
  377. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  378. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  379. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  381. package/packages/pi-tui/dist/tui.js +18 -8
  382. package/packages/pi-tui/dist/tui.js.map +1 -1
  383. package/packages/pi-tui/src/tui.ts +20 -8
  384. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +2 -2
  386. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  387. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  388. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  389. package/src/resources/extensions/github-sync/sync.ts +8 -1
  390. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  392. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  393. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  394. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  395. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  396. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  397. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  398. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  399. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  400. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  401. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  402. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  403. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  404. package/src/resources/extensions/gsd/auto-start.ts +286 -15
  405. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  406. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  407. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  408. package/src/resources/extensions/gsd/auto.ts +208 -39
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  410. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  411. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  412. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  413. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  414. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  415. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  416. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  417. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  418. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  419. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  420. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  421. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  422. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  423. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  424. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  425. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  426. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  427. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  428. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  429. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  430. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  431. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  432. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  433. package/src/resources/extensions/gsd/detection.ts +128 -0
  434. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  435. package/src/resources/extensions/gsd/git-service.ts +87 -10
  436. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  437. package/src/resources/extensions/gsd/guided-flow.ts +167 -53
  438. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  439. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  440. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  441. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  442. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  443. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  444. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  445. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  446. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  447. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  448. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  449. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  450. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  451. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  452. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  453. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  454. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  455. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  456. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  457. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  458. package/src/resources/extensions/gsd/quick.ts +37 -2
  459. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  460. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  461. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  462. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  463. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  464. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  465. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  466. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  467. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  468. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  469. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  470. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  471. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  472. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  473. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  474. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  475. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  476. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  477. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  478. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  479. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  480. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  481. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  482. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  483. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  484. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  485. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  486. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  487. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  488. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  489. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  490. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  491. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  492. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  493. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  494. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  495. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  496. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  497. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  498. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  499. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  500. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  501. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  502. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  503. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  504. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  505. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  506. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  507. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  508. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  509. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  510. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  511. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  512. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  513. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  514. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  515. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  516. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  517. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  518. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  519. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  520. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  521. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  522. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  523. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  524. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  525. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  526. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  527. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  528. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  529. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  530. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  531. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  532. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  533. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  534. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  535. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  536. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  537. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  538. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  540. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  541. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  542. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  543. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  544. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  545. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  546. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  547. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  548. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  549. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  550. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  551. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  552. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  553. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  554. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  555. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  556. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  557. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  558. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  560. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  561. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  562. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  563. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  564. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  565. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  566. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  567. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  568. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  569. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  570. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  572. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  573. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  574. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  575. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  576. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  577. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  578. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  579. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  580. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  581. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  582. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  583. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  584. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  585. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  586. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  587. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  588. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  589. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  590. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  591. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  592. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  593. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  594. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  595. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  596. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  597. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  598. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  599. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  600. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  601. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  602. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  603. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  604. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  605. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  606. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  607. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  608. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  609. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  610. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  611. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  612. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  613. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  614. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  615. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  616. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  617. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  618. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  619. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  620. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  621. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  622. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  623. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  624. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  625. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  626. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  627. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  628. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  629. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  630. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  631. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  632. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  633. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  634. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  635. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  636. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  637. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  638. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  639. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  640. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  641. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  642. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  643. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  644. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  645. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  646. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  647. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  648. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  649. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  650. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  651. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  652. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  653. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  654. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  655. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
  656. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_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,
@@ -200,6 +204,8 @@ import {
200
204
  detectWorkingTreeActivity,
201
205
  } from "./auto-supervisor.js";
202
206
  import { isDbAvailable, getMilestone } from "./gsd-db.js";
207
+ import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
208
+ import { writeUnitRuntimeRecord } from "./unit-runtime.js";
203
209
  import { countPendingCaptures } from "./captures.js";
204
210
  import { CMUX_CHANNELS, type CmuxLogLevel } from "../shared/cmux-events.js";
205
211
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
@@ -242,6 +248,20 @@ import {
242
248
  type WorktreeResolverDeps,
243
249
  } from "./worktree-resolver.js";
244
250
  import { reorderForCaching } from "./prompt-ordering.js";
251
+ import { initTokenCounter } from "./token-counter.js";
252
+
253
+ // Warm the tiktoken encoder at extension startup so context-budget computations
254
+ // can use accurate token counts via countTokensSync without paying the load
255
+ // cost mid-prompt-build. Fire-and-forget — failure falls back to the
256
+ // provider-aware char-ratio estimator already used by getCharsPerToken().
257
+ // Catch rejections explicitly: an unhandled rejection at module-import time
258
+ // can destabilize startup before the engine logger is configured.
259
+ void initTokenCounter().catch((err) => {
260
+ logWarning(
261
+ "engine",
262
+ `token counter warm-up failed: ${err instanceof Error ? err.message : String(err)}`,
263
+ );
264
+ });
245
265
 
246
266
  // ─── Session State ─────────────────────────────────────────────────────────
247
267
 
@@ -293,11 +313,15 @@ const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
293
313
  * the DB is unavailable (e.g. fresh project before init) we skip registration
294
314
  * silently rather than blocking session start.
295
315
  */
296
- function registerAutoWorkerForSession(session: AutoSession): void {
316
+ function registerAutoWorkerForSession(
317
+ session: AutoSession,
318
+ projectRootOverride?: string,
319
+ ): void {
297
320
  if (session.workerId) return; // already registered (e.g. resume re-runs)
298
321
  try {
299
322
  const projectRootRealpath = normalizeRealPath(
300
- session.scope?.workspace.projectRoot
323
+ projectRootOverride
324
+ ?? session.scope?.workspace.projectRoot
301
325
  ?? (session.originalBasePath || session.basePath),
302
326
  );
303
327
  session.workerId = registerAutoWorker({ projectRootRealpath });
@@ -332,6 +356,14 @@ function restoreProjectRootEnv(): void {
332
356
  s.projectRootEnvCaptured = false;
333
357
  }
334
358
 
359
+ export function _captureProjectRootEnvForTest(projectRoot: string): void {
360
+ captureProjectRootEnv(projectRoot);
361
+ }
362
+
363
+ export function _restoreProjectRootEnvForTest(): void {
364
+ restoreProjectRootEnv();
365
+ }
366
+
335
367
  function captureMilestoneLockEnv(milestoneId: string | null): void {
336
368
  if (!s.milestoneLockEnvCaptured) {
337
369
  s.hadMilestoneLockEnv = Object.prototype.hasOwnProperty.call(process.env, "GSD_MILESTONE_LOCK");
@@ -420,6 +452,16 @@ export function _synthesizePausedSessionRecoveryForTest(
420
452
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
421
453
  }
422
454
 
455
+ export function _resolvePausedResumeBasePathForTest(
456
+ basePath: string,
457
+ pausedWorktreePath: string | null | undefined,
458
+ pathExists: (path: string) => boolean = existsSync,
459
+ ): string {
460
+ return pausedWorktreePath && pathExists(pausedWorktreePath)
461
+ ? pausedWorktreePath
462
+ : basePath;
463
+ }
464
+
423
465
  const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
424
466
 
425
467
  function withDetachedAutoKeepalive<T>(run: Promise<T>): Promise<T> {
@@ -501,9 +543,54 @@ export {
501
543
  getBudgetEnforcementAction,
502
544
  } from "./auto-budget.js";
503
545
 
546
+ function closeOutSignalInterruptedUnit(currentBasePath: string): void {
547
+ const currentUnit = s.currentUnit;
548
+ if (!currentUnit) return;
549
+
550
+ const reason = "Auto-mode process received a termination signal";
551
+ const errorContext: ErrorContext = {
552
+ message: reason,
553
+ category: "aborted",
554
+ isTransient: false,
555
+ };
556
+ const basePath = s.basePath || currentBasePath;
557
+
558
+ try {
559
+ emitOpenUnitEndForUnit(basePath, currentUnit.type, currentUnit.id, "cancelled", errorContext);
560
+ } catch (err) {
561
+ logWarning("engine", `signal unit-end cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
562
+ }
563
+
564
+ try {
565
+ writeUnitRuntimeRecord(basePath, currentUnit.type, currentUnit.id, currentUnit.startedAt, {
566
+ phase: "crashed",
567
+ lastProgressAt: Date.now(),
568
+ lastProgressKind: "signal",
569
+ });
570
+ } catch (err) {
571
+ logWarning("engine", `signal runtime cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
572
+ }
573
+
574
+ try {
575
+ if (s.workerId) markLatestActiveForWorkerCanceled(s.workerId, "signal-exit");
576
+ } catch (err) {
577
+ logWarning("engine", `signal dispatch cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
578
+ }
579
+
580
+ try {
581
+ resolveAgentEndCancelled(errorContext);
582
+ } catch (err) {
583
+ logWarning("engine", `signal resolve cleanup failed: ${getErrorMessage(err)}`, { file: "auto.ts" });
584
+ }
585
+ }
586
+
504
587
  /** Wrapper: register SIGTERM handler and store reference. */
505
588
  function registerSigtermHandler(currentBasePath: string): void {
506
- s.sigtermHandler = _registerSigtermHandler(currentBasePath, s.sigtermHandler);
589
+ s.sigtermHandler = _registerSigtermHandler(
590
+ currentBasePath,
591
+ s.sigtermHandler,
592
+ () => closeOutSignalInterruptedUnit(currentBasePath),
593
+ );
507
594
  }
508
595
 
509
596
  /** Wrapper: deregister SIGTERM handler and clear reference. */
@@ -606,6 +693,30 @@ export function isAutoPaused(): boolean {
606
693
  return s.paused;
607
694
  }
608
695
 
696
+ export interface ResumeResourceRefreshDeps {
697
+ env?: NodeJS.ProcessEnv;
698
+ importModule?: (specifier: string) => Promise<any>;
699
+ openProjectDb?: (basePath: string) => Promise<void>;
700
+ }
701
+
702
+ export async function refreshResumeResourcesAndDb(
703
+ basePath: string,
704
+ deps: ResumeResourceRefreshDeps = {},
705
+ ): Promise<void> {
706
+ const env = deps.env ?? process.env;
707
+ const importModule = deps.importModule ?? ((specifier: string) => import(specifier));
708
+ const agentDir = env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
709
+ const pkgRoot = env.GSD_PKG_ROOT;
710
+ const resourceLoaderPath = pkgRoot
711
+ ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
712
+ : new URL("../../../resource-loader.js", import.meta.url).href;
713
+ const { initResources } = await importModule(resourceLoaderPath);
714
+ initResources(agentDir);
715
+ const { primeCache } = await importModule("./prompt-loader.js");
716
+ primeCache();
717
+ await (deps.openProjectDb ?? openProjectDbIfPresent)(basePath);
718
+ }
719
+
609
720
  export function setActiveEngineId(id: string | null): void {
610
721
  s.activeEngineId = id;
611
722
  }
@@ -860,7 +971,23 @@ function handleLostSessionLock(
860
971
  * the stale unit state, progress widget, status badge, and restores CWD so
861
972
  * the dashboard does not show an orphaned timer and the shell is usable.
862
973
  */
863
- function cleanupAfterLoopExit(ctx: ExtensionContext): void {
974
+ export async function rerootCommandSession(
975
+ cmdCtx: Pick<ExtensionCommandContext, "newSession"> | null | undefined,
976
+ workspaceRoot: string,
977
+ ): Promise<{ status: "skipped" | "ok" | "cancelled" | "failed"; error?: string }> {
978
+ if (!cmdCtx || !workspaceRoot) return { status: "skipped" };
979
+ try {
980
+ const result = await cmdCtx.newSession({ workspaceRoot });
981
+ return result.cancelled ? { status: "cancelled" } : { status: "ok" };
982
+ } catch (err) {
983
+ return {
984
+ status: "failed",
985
+ error: err instanceof Error ? err.message : String(err),
986
+ };
987
+ }
988
+ }
989
+
990
+ export async function cleanupAfterLoopExit(ctx: ExtensionContext): Promise<void> {
864
991
  s.currentUnit = null;
865
992
  s.active = false;
866
993
  deactivateGSD();
@@ -898,6 +1025,34 @@ function cleanupAfterLoopExit(ctx: ExtensionContext): void {
898
1025
  logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
899
1026
  }
900
1027
  }
1028
+
1029
+ if (s.originalBasePath && s.cmdCtx) {
1030
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1031
+ if (result.status === "cancelled") {
1032
+ logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1033
+ } else if (result.status === "failed") {
1034
+ logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1035
+ }
1036
+ }
1037
+ }
1038
+
1039
+ export function _cleanupAfterLoopExitForTest(ctx: ExtensionContext): Promise<void> {
1040
+ return cleanupAfterLoopExit(ctx);
1041
+ }
1042
+
1043
+ export type AutoWorktreeExitAction = "skip" | "merge" | "preserve";
1044
+
1045
+ export function _resolveAutoWorktreeExitActionForTest(
1046
+ currentMilestoneId: string | null | undefined,
1047
+ milestoneMergedInPhases: boolean,
1048
+ milestoneComplete: boolean,
1049
+ ): AutoWorktreeExitAction {
1050
+ const action = _selectStopAutoWorktreeExit({
1051
+ currentMilestoneId: currentMilestoneId ?? null,
1052
+ milestoneComplete,
1053
+ milestoneMergedInPhases,
1054
+ });
1055
+ return action === "none" ? "skip" : action;
901
1056
  }
902
1057
 
903
1058
  export async function stopAuto(
@@ -968,6 +1123,8 @@ export async function stopAuto(
968
1123
  if (s.workerId) {
969
1124
  markWorkerStopping(s.workerId);
970
1125
  }
1126
+ s.workerId = null;
1127
+ s.milestoneLeaseToken = null;
971
1128
  } catch (e) {
972
1129
  debugLog("stop-cleanup-coordination", { error: e instanceof Error ? e.message : String(e) });
973
1130
  }
@@ -1049,10 +1206,16 @@ export async function stopAuto(
1049
1206
  logWarning("engine", `milestone summary check failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1050
1207
  }
1051
1208
 
1052
- if (milestoneComplete) {
1209
+ const exitAction = _selectStopAutoWorktreeExit({
1210
+ currentMilestoneId: s.currentMilestoneId,
1211
+ milestoneComplete,
1212
+ milestoneMergedInPhases: s.milestoneMergedInPhases,
1213
+ });
1214
+
1215
+ if (exitAction === "merge") {
1053
1216
  // Milestone is complete — merge worktree branch back to main
1054
1217
  resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
1055
- } else {
1218
+ } else if (exitAction === "preserve") {
1056
1219
  // Milestone still in progress — preserve branch for later resumption
1057
1220
  resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
1058
1221
  preserveBranch: true,
@@ -1060,6 +1223,10 @@ export async function stopAuto(
1060
1223
  }
1061
1224
  }
1062
1225
  } catch (e) {
1226
+ ctx?.ui.notify(
1227
+ `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.`,
1228
+ "warning",
1229
+ );
1063
1230
  debugLog("stop-cleanup-worktree", { error: e instanceof Error ? e.message : String(e) });
1064
1231
  }
1065
1232
 
@@ -1105,6 +1272,19 @@ export async function stopAuto(
1105
1272
  debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
1106
1273
  }
1107
1274
 
1275
+ // Re-root the active command session/tool runtime after worktree teardown.
1276
+ // mergeAndExit restores process.cwd(), but AgentSession has already captured
1277
+ // its own cwd for tools and system prompt; refresh it before returning to the
1278
+ // user so follow-up commands do not target a removed milestone worktree.
1279
+ if (s.originalBasePath && ctx && s.cmdCtx) {
1280
+ const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1281
+ if (result.status === "cancelled") {
1282
+ logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1283
+ } else if (result.status === "failed") {
1284
+ logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1285
+ }
1286
+ }
1287
+
1108
1288
  // ── Step 8: Ledger notification ──
1109
1289
  try {
1110
1290
  const ledger = getLedger();
@@ -1233,6 +1413,17 @@ export async function stopAuto(
1233
1413
  }
1234
1414
  }
1235
1415
 
1416
+ export type StopAutoWorktreeExitAction = "none" | "merge" | "preserve";
1417
+
1418
+ export function _selectStopAutoWorktreeExit(args: {
1419
+ currentMilestoneId: string | null;
1420
+ milestoneComplete: boolean;
1421
+ milestoneMergedInPhases: boolean;
1422
+ }): StopAutoWorktreeExitAction {
1423
+ if (!args.currentMilestoneId || args.milestoneMergedInPhases) return "none";
1424
+ return args.milestoneComplete ? "merge" : "preserve";
1425
+ }
1426
+
1236
1427
  /**
1237
1428
  * Pause auto-mode without destroying state. Context is preserved.
1238
1429
  * The user can interact with the agent, then `/gsd auto` resumes
@@ -1368,6 +1559,7 @@ function buildResolverDeps(): WorktreeResolverDeps {
1368
1559
  getAutoWorktreePath,
1369
1560
  autoCommitCurrentBranch,
1370
1561
  getCurrentBranch,
1562
+ checkoutBranch: nativeCheckoutBranch,
1371
1563
  autoWorktreeBranch,
1372
1564
  resolveMilestoneFile,
1373
1565
  readFileSync: (path: string, encoding: string) =>
@@ -1910,9 +2102,7 @@ export async function startAuto(
1910
2102
  { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" },
1911
2103
  );
1912
2104
  }
1913
- if (resumeWorktreePath && existsSync(resumeWorktreePath)) {
1914
- s.basePath = resumeWorktreePath;
1915
- }
2105
+ s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
1916
2106
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
1917
2107
  rebuildScope(s.basePath, s.currentMilestoneId);
1918
2108
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -1964,16 +2154,7 @@ export async function startAuto(
1964
2154
  // tree; deployed extensions live at ~/.gsd/agent/extensions/gsd/ where the
1965
2155
  // relative path resolves to ~/.gsd/agent/resource-loader.js which doesn't exist.
1966
2156
  // Using GSD_PKG_ROOT constructs a correct absolute path in both contexts (#3949).
1967
- const agentDir = process.env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
1968
- const pkgRoot = process.env.GSD_PKG_ROOT;
1969
- const resourceLoaderPath = pkgRoot
1970
- ? pathToFileURL(join(pkgRoot, "dist", "resource-loader.js")).href
1971
- : new URL("../../../resource-loader.js", import.meta.url).href;
1972
- const { initResources } = await import(resourceLoaderPath);
1973
- initResources(agentDir);
1974
- // Open the project DB before rebuild/derive so resume uses DB-backed
1975
- // state instead of falling back to stale markdown parsing (#2940).
1976
- await openProjectDbIfPresent(s.basePath);
2157
+ await refreshResumeResourcesAndDb(s.basePath);
1977
2158
  try {
1978
2159
  await rebuildState(s.basePath);
1979
2160
  pi.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "sync" as const, preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, state: await deriveState(s.basePath) });
@@ -2045,7 +2226,7 @@ export async function startAuto(
2045
2226
  runKernelLoop: runUokKernelLoop,
2046
2227
  runLegacyLoop: runLegacyAutoLoop,
2047
2228
  });
2048
- cleanupAfterLoopExit(ctx);
2229
+ await cleanupAfterLoopExit(ctx);
2049
2230
  return;
2050
2231
  }
2051
2232
 
@@ -2057,6 +2238,11 @@ export async function startAuto(
2057
2238
  buildResolver,
2058
2239
  };
2059
2240
 
2241
+ // Register the worker before bootstrap enters a milestone worktree.
2242
+ // This ensures enterMilestone can claim a lease and seed dispatch claims
2243
+ // for crash-recovery fidelity (#5405).
2244
+ registerAutoWorkerForSession(s, base);
2245
+
2060
2246
  const ready = await bootstrapAutoSession(
2061
2247
  s,
2062
2248
  ctx,
@@ -2100,7 +2286,7 @@ export async function startAuto(
2100
2286
  runKernelLoop: runUokKernelLoop,
2101
2287
  runLegacyLoop: runLegacyAutoLoop,
2102
2288
  });
2103
- cleanupAfterLoopExit(ctx);
2289
+ await cleanupAfterLoopExit(ctx);
2104
2290
  }
2105
2291
 
2106
2292
  // describeNextUnit is imported from auto-dashboard.ts and re-exported
@@ -2224,24 +2410,7 @@ export async function dispatchHookUnit(
2224
2410
  startedAt: hookStartedAt,
2225
2411
  };
2226
2412
 
2227
- // Ensure cwd matches basePath BEFORE newSession() captures it (#1389).
2228
- // newSession() snapshots process.cwd() during construction; chdir-ing
2229
- // afterward leaves the session rooted to whatever cwd was when the call
2230
- // was made. Must be synchronous — no awaits between chdir and newSession.
2231
- try { if (process.cwd() !== s.basePath) process.chdir(s.basePath); } catch (err) {
2232
- const msg = `Failed to chdir before hook newSession (basePath: ${s.basePath}): ${err instanceof Error ? err.message : String(err)}`;
2233
- logWarning("engine", msg, { file: "auto.ts", basePath: s.basePath, error: err instanceof Error ? err.message : String(err) });
2234
- ctx.ui.notify(`${msg}. Cancelling hook dispatch to avoid running in the wrong directory.`, "error");
2235
- if (wasActive) {
2236
- s.basePath = previousBasePath;
2237
- s.currentUnit = previousCurrentUnit;
2238
- } else {
2239
- s.reset();
2240
- }
2241
- return false;
2242
- }
2243
-
2244
- const result = await s.cmdCtx!.newSession();
2413
+ const result = await s.cmdCtx!.newSession({ workspaceRoot: s.basePath });
2245
2414
  if (result.cancelled) {
2246
2415
  await stopAuto(ctx, pi);
2247
2416
  return false;
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
4
4
 
5
+ import type { ErrorContext } from "../auto/types.js";
5
6
  import { logWarning } from "../workflow-logger.js";
6
7
  import {
7
8
  checkDeepProjectSetupAfterTurn,
@@ -14,7 +15,12 @@ import { clearPathCache } from "../paths.js";
14
15
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
15
16
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
16
17
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
17
- import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
18
+ import {
19
+ isSessionSwitchAbortGraceActive,
20
+ isSessionSwitchInFlight,
21
+ resolveAgentEnd,
22
+ resolveAgentEndCancelled,
23
+ } from "../auto/resolve.js";
18
24
  import { resolveModelId } from "../auto-model-selection.js";
19
25
  import { resolveProjectRoot } from "../worktree.js";
20
26
  import { clearDiscussionFlowState } from "./write-gate.js";
@@ -76,6 +82,103 @@ export function isUserInitiatedAbortMessage(message: string | undefined | null):
76
82
  return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
77
83
  }
78
84
 
85
+ function isBareClaudeCodeSessionSwitchAbortMarker(message: string | undefined | null): boolean {
86
+ if (!message) return false;
87
+ const normalized = message.trim().replace(/\s+/g, " ").toLowerCase();
88
+ return normalized === "claude code process aborted by user"
89
+ || normalized === "request aborted by user"
90
+ || normalized === "process aborted by user"
91
+ || normalized === "claude code stream aborted by caller";
92
+ }
93
+
94
+ function readAssistantTextContent(content: unknown): string {
95
+ if (!Array.isArray(content)) return "";
96
+ return content
97
+ .map((block) => {
98
+ if (!block || typeof block !== "object") return "";
99
+ const text = (block as { text?: unknown }).text;
100
+ return typeof text === "string" ? text : "";
101
+ })
102
+ .filter(Boolean)
103
+ .join("\n");
104
+ }
105
+
106
+ export function isClaudeCodeSessionSwitchAbortMessage(lastMsg: unknown): boolean {
107
+ if (!lastMsg || typeof lastMsg !== "object") return false;
108
+ const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
109
+ const carriers = [
110
+ m.errorMessage ? String(m.errorMessage) : "",
111
+ readAssistantTextContent(m.content),
112
+ ].filter((value) => value.trim().length > 0);
113
+
114
+ if ((m.stopReason === "error" || m.stopReason === "aborted") && carriers.length > 0) {
115
+ return carriers.every(isBareClaudeCodeSessionSwitchAbortMarker);
116
+ }
117
+
118
+ return false;
119
+ }
120
+
121
+ /**
122
+ * Resolve an agent_end event observed while a session switch is in flight.
123
+ *
124
+ * #5538-followup: When `newSession()` aborts an in-flight stream as part of a
125
+ * session transition (run-unit.ts:63 → _settleCurrentTurnForSessionTransition
126
+ * → agent.abort()), the SDK emits "Claude Code process aborted by user" or
127
+ * "Request aborted by user" against the previous unit's turn. The previous
128
+ * code path treated that as a user cancellation and propagated it to the next
129
+ * unit via the pending-switch-cancellation queue, killing auto-mode with
130
+ * "Auto-mode stopped — Unit aborted: Claude Code process aborted by user"
131
+ * even though no user input occurred.
132
+ *
133
+ * Claude Code abort markers are intentionally ignored when the abort fires
134
+ * while the session-switch is in flight: the abort is the expected side-effect
135
+ * of the transition, not a user signal. Other branches (genuine `stopReason
136
+ * === "aborted"` with diagnostic content/errorMessage) preserve the prior
137
+ * behavior.
138
+ */
139
+ export function _handleSessionSwitchAgentEnd(
140
+ lastMsg: unknown,
141
+ resolveCancelled: (ctx: ErrorContext) => boolean,
142
+ ): void {
143
+ if (!lastMsg || typeof lastMsg !== "object") return;
144
+ const m = lastMsg as { stopReason?: unknown; errorMessage?: unknown; content?: unknown };
145
+
146
+ if (isClaudeCodeSessionSwitchAbortMessage(m)) {
147
+ // Internal abort from in-flight session transition — drop on the floor.
148
+ return;
149
+ }
150
+
151
+ if (m.stopReason === "error") {
152
+ const rawErrorMsg = m.errorMessage ? String(m.errorMessage) : "";
153
+ if (isBareClaudeCodeSessionSwitchAbortMarker(rawErrorMsg)) {
154
+ // Internal abort from in-flight session transition — drop on the floor.
155
+ return;
156
+ }
157
+ return;
158
+ }
159
+
160
+ if (m.stopReason === "aborted") {
161
+ const content = m.content;
162
+ const hasEmptyContent = Array.isArray(content) && content.length === 0;
163
+ const hasErrorMessage = !!m.errorMessage;
164
+ if (!hasEmptyContent || hasErrorMessage) {
165
+ resolveCancelled(_buildAbortedPauseContext(m as { errorMessage?: unknown }));
166
+ }
167
+ }
168
+ }
169
+
170
+ export function resolveAgentEndErrorDisplay(
171
+ rawErrorMsg: string,
172
+ content: unknown,
173
+ ): string {
174
+ const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
175
+ if (isUseless && Array.isArray(content)) {
176
+ const textBlock = content.find((b: any) => b.type === "text" && b.text);
177
+ if (textBlock) return (textBlock as any).text.slice(0, 300);
178
+ }
179
+ return rawErrorMsg;
180
+ }
181
+
79
182
  async function pauseTransientWithBackoff(
80
183
  cls: ErrorClass,
81
184
  pi: ExtensionAPI,
@@ -153,9 +256,20 @@ export async function handleAgentEnd(
153
256
  if (maybeHandleEmptyIntentTurn(event, isAutoActive())) return;
154
257
 
155
258
  if (!isAutoActive()) return;
156
- if (isSessionSwitchInFlight()) return;
157
259
 
158
260
  const lastMsg = event.messages[event.messages.length - 1];
261
+ if (isSessionSwitchInFlight()) {
262
+ _handleSessionSwitchAgentEnd(lastMsg, resolveAgentEndCancelled);
263
+ return;
264
+ }
265
+
266
+ if (isSessionSwitchAbortGraceActive() && isClaudeCodeSessionSwitchAbortMessage(lastMsg)) {
267
+ // Claude Code can report the abort from `newSession()` a few hundred ms
268
+ // after the guard drops. That event belongs to the old turn; do not let it
269
+ // cancel the freshly-dispatched unit.
270
+ return;
271
+ }
272
+
159
273
  if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "aborted") {
160
274
  // Empty content with aborted stopReason is a non-fatal agent stop (the LLM
161
275
  // chose to end without producing output). Only pause on genuine fatal aborts
@@ -195,15 +309,13 @@ export async function handleAgentEnd(
195
309
  });
196
310
  return;
197
311
  }
198
- const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
199
312
  // #3588: When errorMessage is uninformative, extract the real error from
200
313
  // the assistant message text content for display purposes only.
201
314
  // Classification still uses rawErrorMsg to avoid false positives from prose.
202
- let displayMsg = rawErrorMsg;
203
- if (isUseless && "content" in lastMsg && Array.isArray(lastMsg.content)) {
204
- const textBlock = lastMsg.content.find((b: any) => b.type === "text" && b.text);
205
- if (textBlock) displayMsg = (textBlock as any).text.slice(0, 300);
206
- }
315
+ const displayMsg = resolveAgentEndErrorDisplay(
316
+ rawErrorMsg,
317
+ "content" in lastMsg ? lastMsg.content : undefined,
318
+ );
207
319
  const errorDetail = displayMsg ? `: ${displayMsg}` : "";
208
320
  const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
209
321