gsd-pi 2.80.0-dev.fbe7c8c6f → 2.81.0-dev.3cddbbba2

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 (814) hide show
  1. package/README.md +47 -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/extensions/claude-code-cli/readiness.js +18 -7
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  15. package/dist/resources/extensions/github-sync/sync.js +4 -1
  16. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +214 -17
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  19. package/dist/resources/extensions/gsd/auto/phases.js +372 -134
  20. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +88 -33
  22. package/dist/resources/extensions/gsd/auto/session.js +18 -1
  23. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  24. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -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 +199 -177
  28. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +30 -11
  30. package/dist/resources/extensions/gsd/auto-post-unit.js +119 -79
  31. package/dist/resources/extensions/gsd/auto-prompts.js +103 -16
  32. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  33. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  34. package/dist/resources/extensions/gsd/auto-start.js +251 -16
  35. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  36. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  37. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  38. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  39. package/dist/resources/extensions/gsd/auto-worktree.js +237 -336
  40. package/dist/resources/extensions/gsd/auto.js +493 -129
  41. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +133 -12
  42. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  43. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  44. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  45. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  46. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  47. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  48. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  49. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +337 -55
  50. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  51. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  52. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  53. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  54. package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
  55. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  56. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  57. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  58. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  59. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  60. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  61. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  62. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  64. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  65. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  66. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  67. package/dist/resources/extensions/gsd/git-service.js +75 -6
  68. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  69. package/dist/resources/extensions/gsd/guided-flow.js +119 -42
  70. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  71. package/dist/resources/extensions/gsd/health-widget.js +6 -9
  72. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  73. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  74. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  75. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  76. package/dist/resources/extensions/gsd/native-git-bridge.js +46 -22
  77. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  78. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  79. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  80. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  81. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  82. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  83. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  84. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  85. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  86. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  87. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  88. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  89. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  90. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  93. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  94. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  95. package/dist/resources/extensions/gsd/quick.js +34 -2
  96. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  97. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  98. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  99. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  100. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  102. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  103. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  104. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  105. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  106. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  107. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  108. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  109. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  110. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  111. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  112. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  113. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  114. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  115. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  117. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1364 -0
  119. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  122. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  123. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  124. package/dist/web/standalone/.next/BUILD_ID +1 -1
  125. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  126. package/dist/web/standalone/.next/build-manifest.json +3 -3
  127. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  128. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  129. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.html +1 -1
  148. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  149. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  150. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  151. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  156. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/middleware.js +3 -3
  159. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  160. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  161. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  162. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  163. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  164. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  165. package/dist/welcome-screen.d.ts +2 -7
  166. package/dist/welcome-screen.js +68 -75
  167. package/package.json +3 -3
  168. package/packages/daemon/package.json +2 -2
  169. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  170. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  171. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  172. package/packages/mcp-server/package.json +2 -2
  173. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  174. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  175. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  176. package/packages/native/package.json +1 -1
  177. package/packages/native/tsconfig.tsbuildinfo +1 -1
  178. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  179. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  180. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  181. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  182. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  183. package/packages/pi-agent-core/dist/agent.js +43 -11
  184. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  185. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  186. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  187. package/packages/pi-agent-core/dist/index.js +2 -0
  188. package/packages/pi-agent-core/dist/index.js.map +1 -1
  189. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  190. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  191. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  192. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  193. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  194. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  195. package/packages/pi-agent-core/dist/types.js.map +1 -1
  196. package/packages/pi-agent-core/package.json +1 -1
  197. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  198. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  199. package/packages/pi-agent-core/src/agent.ts +52 -11
  200. package/packages/pi-agent-core/src/index.ts +2 -0
  201. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  202. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  203. package/packages/pi-agent-core/src/types.ts +26 -10
  204. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  205. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  206. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  207. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  208. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  209. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  210. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  211. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  212. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  213. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  214. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  215. package/packages/pi-ai/dist/types.d.ts +2 -0
  216. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  217. package/packages/pi-ai/dist/types.js.map +1 -1
  218. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  219. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  220. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  221. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  222. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  223. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  224. package/packages/pi-ai/package.json +1 -1
  225. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  226. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  227. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  228. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  229. package/packages/pi-ai/src/types.ts +3 -0
  230. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  231. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  232. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  233. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  234. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  235. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  237. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  239. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  241. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  243. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  245. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  247. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  249. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  250. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  251. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  252. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  253. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  254. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  255. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  256. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  257. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  259. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  262. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  264. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  266. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  268. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  270. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  273. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  277. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  279. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  281. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  283. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  285. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  287. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  289. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  291. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  293. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  295. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  297. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  301. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  303. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  305. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  307. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  309. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  311. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  313. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  315. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  317. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  319. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  321. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  323. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  325. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  327. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  329. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  330. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  331. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  332. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  333. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  335. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  337. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  339. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +161 -7
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  362. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -73
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
  390. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -3
  396. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  400. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  401. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  408. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  410. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  412. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  413. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  414. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  415. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  417. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  418. package/packages/pi-coding-agent/package.json +1 -1
  419. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  420. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  421. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  422. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  423. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  424. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  425. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  426. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  427. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  428. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  429. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  430. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  431. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  432. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  433. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  434. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  435. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  436. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  437. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  438. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  439. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  440. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  441. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  442. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  443. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  444. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  445. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  446. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  447. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  448. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  449. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  450. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  451. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +228 -7
  452. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  453. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  454. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  455. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  456. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  457. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  458. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  459. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  460. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +247 -94
  461. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  462. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  463. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  464. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  466. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
  467. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  468. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  469. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  470. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  471. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  472. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  473. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  474. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  475. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  476. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  477. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  478. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  479. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  480. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  481. package/packages/pi-tui/dist/tui.js +18 -8
  482. package/packages/pi-tui/dist/tui.js.map +1 -1
  483. package/packages/pi-tui/package.json +1 -1
  484. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  485. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  486. package/packages/pi-tui/src/tui.ts +20 -8
  487. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  488. package/packages/rpc-client/README.md +7 -0
  489. package/packages/rpc-client/package.json +1 -1
  490. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  491. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  492. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  493. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  494. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  495. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  496. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  497. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  498. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  499. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  500. package/pkg/package.json +1 -1
  501. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  502. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  503. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  504. package/src/resources/extensions/github-sync/sync.ts +8 -1
  505. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  506. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  507. package/src/resources/extensions/gsd/auto/loop-deps.ts +19 -16
  508. package/src/resources/extensions/gsd/auto/loop.ts +247 -25
  509. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  510. package/src/resources/extensions/gsd/auto/phases.ts +512 -202
  511. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  512. package/src/resources/extensions/gsd/auto/run-unit.ts +97 -34
  513. package/src/resources/extensions/gsd/auto/session.ts +19 -1
  514. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  515. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  516. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  517. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  518. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  519. package/src/resources/extensions/gsd/auto-dashboard.ts +249 -182
  520. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  521. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -1
  522. package/src/resources/extensions/gsd/auto-post-unit.ts +131 -81
  523. package/src/resources/extensions/gsd/auto-prompts.ts +112 -15
  524. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  525. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  526. package/src/resources/extensions/gsd/auto-start.ts +321 -21
  527. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  528. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  529. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  530. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  531. package/src/resources/extensions/gsd/auto-worktree.ts +267 -360
  532. package/src/resources/extensions/gsd/auto.ts +578 -126
  533. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +166 -12
  534. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  535. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  536. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  537. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  538. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  539. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  540. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  541. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +384 -55
  542. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  543. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  544. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  545. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  546. package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
  547. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  548. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  549. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  550. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  551. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  552. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  553. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  554. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  555. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  556. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  557. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  558. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  559. package/src/resources/extensions/gsd/git-service.ts +89 -10
  560. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  561. package/src/resources/extensions/gsd/guided-flow.ts +148 -49
  562. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  563. package/src/resources/extensions/gsd/health-widget.ts +8 -9
  564. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  565. package/src/resources/extensions/gsd/journal.ts +2 -0
  566. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  567. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  568. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  569. package/src/resources/extensions/gsd/native-git-bridge.ts +53 -19
  570. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  571. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  572. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  573. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  574. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  575. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  576. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  577. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  578. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  579. package/src/resources/extensions/gsd/prompts/complete-milestone.md +22 -17
  580. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  581. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  582. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  583. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  584. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  585. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  586. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  587. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  588. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  589. package/src/resources/extensions/gsd/quick.ts +37 -2
  590. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  591. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  592. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  593. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  594. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  595. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  596. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  597. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +134 -9
  598. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1125 -215
  599. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  600. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  601. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  602. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +363 -18
  603. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  604. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  605. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  606. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  607. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  608. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +16 -1
  609. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  610. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  611. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  612. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  613. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +160 -0
  614. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  615. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  616. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  617. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  618. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  619. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  620. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  621. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  622. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
  623. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  624. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  625. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  626. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  627. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  628. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  629. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  630. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  631. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  632. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  633. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  634. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  635. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  636. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  637. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +46 -11
  638. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  639. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  640. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +24 -11
  641. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  642. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  643. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +100 -38
  644. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  645. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  646. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  647. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  648. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  649. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  650. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  651. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  652. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  653. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  654. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  655. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  656. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  657. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  658. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  659. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  660. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  661. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  662. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  663. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +92 -0
  664. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  665. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  666. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  667. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  668. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -11
  669. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  670. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  671. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  672. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  673. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  674. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +77 -12
  675. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  676. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  677. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  678. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  679. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  680. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  681. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  682. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  683. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  684. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  685. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -182
  686. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  687. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  688. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  689. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  690. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  691. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  692. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  693. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  694. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  695. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  696. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  697. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  698. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  699. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  700. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  701. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  702. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  703. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  704. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  705. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -1
  706. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  707. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  708. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  709. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  710. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  711. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  712. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  713. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  714. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  715. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  716. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  717. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  718. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  719. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +36 -164
  720. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  721. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  722. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  723. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  724. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  725. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  726. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  727. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  728. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  729. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  730. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  731. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  732. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  733. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  734. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  735. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -77
  736. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  737. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  738. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  739. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  740. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  741. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  742. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  743. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -56
  744. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  745. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  746. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  747. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  748. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  749. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  750. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  751. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  752. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +295 -0
  753. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  754. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
  755. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  756. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  757. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  758. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  759. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  760. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  761. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  762. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  763. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  764. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  765. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  766. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -57
  767. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  768. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  769. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  770. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  771. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  772. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
  773. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +197 -78
  774. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +888 -0
  775. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  776. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  777. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  778. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  779. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  780. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  781. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  782. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  783. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  784. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  785. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  786. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  787. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  788. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  789. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  790. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  791. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  792. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  793. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  794. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  795. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  796. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  797. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  798. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  799. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  800. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  801. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  802. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1882 -0
  803. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  804. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  805. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  806. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  807. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  808. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  809. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  810. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  811. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1247
  812. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  813. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_buildManifest.js +0 -0
  814. /package/dist/web/standalone/.next/static/{yTuahMMuJzVnsov5PreWl → F5x9E6H9k_52fjqyql93y}/_ssgManifest.js +0 -0
@@ -1,733 +0,0 @@
1
- // GSD-2 — WorktreeResolver: encapsulates worktree path state and merge/exit lifecycle.
2
- /**
3
- * WorktreeResolver — encapsulates worktree path state and merge/exit lifecycle.
4
- *
5
- * Replaces scattered `s.basePath`/`s.originalBasePath` mutation and 3 duplicated
6
- * merge-or-teardown blocks in auto-loop.ts with single method calls. All
7
- * `s.basePath` mutations (except session.reset() and initial setup) happen
8
- * through this class.
9
- *
10
- * Design: Option A — mutates AutoSession fields directly so existing `s.basePath`
11
- * reads continue to work everywhere without wiring changes.
12
- *
13
- * Key invariant: `createAutoWorktree()` and `enterAutoWorktree()` call
14
- * `process.chdir()` internally — this class MUST NOT double-chdir.
15
- */
16
- import { existsSync, unlinkSync } from "node:fs";
17
- import { randomUUID } from "node:crypto";
18
- import { join } from "node:path";
19
- import { debugLog } from "./debug-logger.js";
20
- import { emitJournalEvent } from "./journal.js";
21
- import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
22
- import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
23
- import { loadEffectiveGSDPreferences } from "./preferences.js";
24
- import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
25
- import { claimMilestoneLease, releaseMilestoneLease } from "./db/milestone-leases.js";
26
- // ─── Path Comparison Helper ────────────────────────────────────────────────
27
- /**
28
- * Compare two paths for physical identity, tolerating trailing slashes,
29
- * symlink differences, and case variations on case-insensitive volumes.
30
- *
31
- * Used in place of string `===` / `!==` wherever one operand may be
32
- * realpath-normalised (e.g. from the workspace registry) and the other
33
- * may not be (e.g. a raw caller-supplied basePath).
34
- */
35
- function isSamePath(a, b) {
36
- return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
37
- }
38
- // ─── Path Helpers ──────────────────────────────────────────────────────────
39
- /**
40
- * Resolve the project root from session path state.
41
- *
42
- * Prefers `originalBasePath` (always the project root when set), but falls
43
- * back to `basePath` when `originalBasePath` is falsy (e.g. fresh AutoSession
44
- * with default empty string). If `basePath` itself is inside a worktree
45
- * directory (including symlink-resolved ~/.gsd/projects/<hash>/worktrees
46
- * paths), recover the actual project root to prevent double nesting (#3729).
47
- */
48
- export function resolveProjectRoot(originalBasePath, basePath) {
49
- return resolveWorktreeProjectRoot(basePath, originalBasePath);
50
- }
51
- // ─── WorktreeResolver ──────────────────────────────────────────────────────
52
- export class WorktreeResolver {
53
- s;
54
- deps;
55
- constructor(session, deps) {
56
- this.s = session;
57
- this.deps = deps;
58
- }
59
- // ── Getters ────────────────────────────────────────────────────────────
60
- /** Current working path — may be worktree or project root. */
61
- get workPath() {
62
- return this.s.basePath;
63
- }
64
- /** Original project root — always the non-worktree path. */
65
- get projectRoot() {
66
- return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
67
- }
68
- /** Path for auto.lock file — same as the old lockBase(). */
69
- get lockPath() {
70
- return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
71
- }
72
- // ── Private Helpers ────────────────────────────────────────────────────
73
- rebuildGitService() {
74
- const gitConfig = this.deps.loadEffectiveGSDPreferences()?.preferences?.git ?? {};
75
- this.s.gitService = new this.deps.GitServiceImpl(this.s.basePath, gitConfig);
76
- }
77
- /** Restore basePath to originalBasePath and rebuild GitService. */
78
- restoreToProjectRoot() {
79
- if (!this.s.originalBasePath)
80
- return;
81
- this.s.basePath = this.s.originalBasePath;
82
- this.rebuildGitService();
83
- this.deps.invalidateAllCaches();
84
- }
85
- // ── Validation ──────────────────────────────────────────────────────────
86
- /** Validate milestoneId to prevent path traversal. */
87
- validateMilestoneId(milestoneId) {
88
- if (/[\/\\]|\.\./.test(milestoneId)) {
89
- throw new Error(`Invalid milestoneId: ${milestoneId} — contains path separators or traversal`);
90
- }
91
- }
92
- // ── Enter Milestone ────────────────────────────────────────────────────
93
- /**
94
- * Enter or create a worktree for the given milestone.
95
- *
96
- * Only acts if `shouldUseWorktreeIsolation()` returns true.
97
- * Delegates to `enterAutoWorktree` (existing) or `createAutoWorktree` (new).
98
- * Those functions call `process.chdir()` internally — we do NOT double-chdir.
99
- *
100
- * Updates `s.basePath` and rebuilds GitService on success.
101
- * On failure: notifies a warning and does NOT update `s.basePath`.
102
- */
103
- enterMilestone(milestoneId, ctx) {
104
- this.validateMilestoneId(milestoneId);
105
- // If worktree creation failed earlier this session, skip all future attempts
106
- if (this.s.isolationDegraded) {
107
- debugLog("WorktreeResolver", {
108
- action: "enterMilestone",
109
- milestoneId,
110
- skipped: true,
111
- reason: "isolation-degraded",
112
- });
113
- return;
114
- }
115
- // Phase B: claim a milestone lease before any worktree mutation. Two
116
- // workers cannot enter the same milestone concurrently. Best-effort:
117
- // skip if no worker registered (single-worker fallback) or DB
118
- // unavailable; reuse existing lease if we already hold it on this
119
- // milestone (re-entry within the same session).
120
- if (this.s.workerId) {
121
- if (this.s.currentMilestoneId === milestoneId && this.s.milestoneLeaseToken !== null) {
122
- // Already held — no-op, the heartbeat in loop.ts refreshes TTL.
123
- }
124
- else {
125
- // If we held a different milestone, release it first so other
126
- // workers don't have to wait for TTL.
127
- if (this.s.currentMilestoneId && this.s.currentMilestoneId !== milestoneId && this.s.milestoneLeaseToken !== null) {
128
- try {
129
- releaseMilestoneLease(this.s.workerId, this.s.currentMilestoneId, this.s.milestoneLeaseToken);
130
- }
131
- catch (err) {
132
- debugLog("WorktreeResolver", {
133
- action: "enterMilestone",
134
- milestoneId,
135
- releasePriorLeaseError: err instanceof Error ? err.message : String(err),
136
- });
137
- }
138
- this.s.milestoneLeaseToken = null;
139
- }
140
- try {
141
- const claim = claimMilestoneLease(this.s.workerId, milestoneId);
142
- if (claim.ok) {
143
- this.s.milestoneLeaseToken = claim.token;
144
- debugLog("WorktreeResolver", {
145
- action: "enterMilestone",
146
- milestoneId,
147
- leaseAcquired: true,
148
- fencingToken: claim.token,
149
- expiresAt: claim.expiresAt,
150
- });
151
- }
152
- else {
153
- // Lease held by another worker — fail loud so the user can
154
- // see the conflict instead of silently double-running.
155
- const msg = `Milestone ${milestoneId} is held by worker ${claim.byWorker} until ${claim.expiresAt}.`;
156
- debugLog("WorktreeResolver", {
157
- action: "enterMilestone",
158
- milestoneId,
159
- leaseHeldByOther: claim.byWorker,
160
- expiresAt: claim.expiresAt,
161
- });
162
- ctx.notify(`${msg} Another auto-mode worker is active. Stop it before entering ${milestoneId}.`, "error");
163
- return;
164
- }
165
- }
166
- catch (err) {
167
- // DB unavailable or other error — log and fall through to the
168
- // pre-Phase-B single-worker behavior so a fresh project before
169
- // DB init still works.
170
- debugLog("WorktreeResolver", {
171
- action: "enterMilestone",
172
- milestoneId,
173
- leaseError: err instanceof Error ? err.message : String(err),
174
- });
175
- }
176
- }
177
- }
178
- // Resolve the project root for worktree operations via shared helper.
179
- // Handles the case where originalBasePath is falsy and basePath is itself
180
- // a worktree path — prevents double-nested worktree paths (#3729).
181
- const basePath = resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
182
- const mode = this.deps.getIsolationMode(basePath);
183
- if (mode === "none") {
184
- debugLog("WorktreeResolver", {
185
- action: "enterMilestone",
186
- milestoneId,
187
- skipped: true,
188
- reason: "isolation-disabled",
189
- });
190
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
191
- ts: new Date().toISOString(),
192
- flowId: randomUUID(),
193
- seq: 0,
194
- eventType: "worktree-skip",
195
- data: { milestoneId, reason: "isolation-disabled" },
196
- });
197
- return;
198
- }
199
- debugLog("WorktreeResolver", {
200
- action: "enterMilestone",
201
- milestoneId,
202
- mode,
203
- basePath,
204
- });
205
- // ── Branch mode: create/checkout milestone branch, stay in project root ──
206
- if (mode === "branch") {
207
- try {
208
- this.deps.enterBranchModeForMilestone(basePath, milestoneId);
209
- // basePath does not change — no worktree, no chdir.
210
- // Rebuild GitService so the new HEAD is reflected, then flush any
211
- // path-keyed caches that may have been populated before the checkout.
212
- this.rebuildGitService();
213
- this.deps.invalidateAllCaches();
214
- debugLog("WorktreeResolver", {
215
- action: "enterMilestone",
216
- milestoneId,
217
- mode: "branch",
218
- result: "success",
219
- });
220
- emitJournalEvent(basePath, {
221
- ts: new Date().toISOString(),
222
- flowId: randomUUID(),
223
- seq: 0,
224
- eventType: "worktree-skip",
225
- data: { milestoneId, reason: "branch-mode-no-worktree" },
226
- });
227
- ctx.notify(`Switched to branch milestone/${milestoneId}.`, "info");
228
- }
229
- catch (err) {
230
- const msg = err instanceof Error ? err.message : String(err);
231
- debugLog("WorktreeResolver", {
232
- action: "enterMilestone",
233
- milestoneId,
234
- mode: "branch",
235
- result: "error",
236
- error: msg,
237
- });
238
- ctx.notify(`Branch isolation setup for ${milestoneId} failed: ${msg}. Continuing on current branch.`, "warning");
239
- this.s.isolationDegraded = true;
240
- }
241
- return;
242
- }
243
- // ── Worktree mode ─────────────────────────────────────────────────────────
244
- try {
245
- const existingPath = this.deps.getAutoWorktreePath(basePath, milestoneId);
246
- let wtPath;
247
- if (existingPath) {
248
- wtPath = this.deps.enterAutoWorktree(basePath, milestoneId);
249
- }
250
- else {
251
- wtPath = this.deps.createAutoWorktree(basePath, milestoneId);
252
- }
253
- this.s.basePath = wtPath;
254
- this.rebuildGitService();
255
- debugLog("WorktreeResolver", {
256
- action: "enterMilestone",
257
- milestoneId,
258
- result: "success",
259
- wtPath,
260
- });
261
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
262
- ts: new Date().toISOString(),
263
- flowId: randomUUID(),
264
- seq: 0,
265
- eventType: "worktree-enter",
266
- data: { milestoneId, wtPath, created: !existingPath },
267
- });
268
- // #4764 — record creation/enter as a lifecycle event so the telemetry
269
- // aggregator can pair it with the eventual worktree-merged event.
270
- try {
271
- emitWorktreeCreated(this.s.originalBasePath || this.s.basePath, milestoneId, {
272
- reason: existingPath ? "enter-milestone" : "create-milestone",
273
- });
274
- }
275
- catch (telemetryErr) {
276
- debugLog("WorktreeResolver", {
277
- action: "enterMilestone",
278
- phase: "telemetry-emit",
279
- error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
280
- });
281
- }
282
- ctx.notify(`Entered worktree for ${milestoneId} at ${wtPath}`, "info");
283
- }
284
- catch (err) {
285
- const msg = err instanceof Error ? err.message : String(err);
286
- debugLog("WorktreeResolver", {
287
- action: "enterMilestone",
288
- milestoneId,
289
- result: "error",
290
- error: msg,
291
- });
292
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
293
- ts: new Date().toISOString(),
294
- flowId: randomUUID(),
295
- seq: 0,
296
- eventType: "worktree-create-failed",
297
- data: { milestoneId, error: msg, fallback: "project-root" },
298
- });
299
- ctx.notify(`Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`, "warning");
300
- // Degrade isolation for the rest of this session so mergeAndExit
301
- // doesn't try to merge a nonexistent worktree branch (#2483)
302
- this.s.isolationDegraded = true;
303
- // Do NOT update s.basePath — stay in project root
304
- }
305
- }
306
- // ── Exit Milestone ─────────────────────────────────────────────────────
307
- /**
308
- * Exit the current worktree: auto-commit, teardown, reset basePath.
309
- *
310
- * Only acts if currently in an auto-worktree (checked via `isInAutoWorktree`).
311
- * Resets `s.basePath` to `s.originalBasePath` and rebuilds GitService.
312
- */
313
- exitMilestone(milestoneId, ctx, opts) {
314
- this.validateMilestoneId(milestoneId);
315
- if (!this.deps.isInAutoWorktree(this.s.basePath)) {
316
- debugLog("WorktreeResolver", {
317
- action: "exitMilestone",
318
- milestoneId,
319
- skipped: true,
320
- reason: "not-in-worktree",
321
- });
322
- return;
323
- }
324
- debugLog("WorktreeResolver", {
325
- action: "exitMilestone",
326
- milestoneId,
327
- basePath: this.s.basePath,
328
- });
329
- try {
330
- this.deps.autoCommitCurrentBranch(this.s.basePath, "stop", milestoneId);
331
- }
332
- catch (err) {
333
- debugLog("WorktreeResolver", {
334
- action: "exitMilestone",
335
- milestoneId,
336
- phase: "auto-commit-failed",
337
- error: err instanceof Error ? err.message : String(err),
338
- });
339
- }
340
- try {
341
- this.deps.teardownAutoWorktree(this.s.originalBasePath, milestoneId, {
342
- preserveBranch: opts?.preserveBranch ?? false,
343
- });
344
- }
345
- catch (err) {
346
- debugLog("WorktreeResolver", {
347
- action: "exitMilestone",
348
- milestoneId,
349
- phase: "teardown-failed",
350
- error: err instanceof Error ? err.message : String(err),
351
- });
352
- }
353
- this.restoreToProjectRoot();
354
- debugLog("WorktreeResolver", {
355
- action: "exitMilestone",
356
- milestoneId,
357
- result: "done",
358
- basePath: this.s.basePath,
359
- });
360
- ctx.notify(`Exited worktree for ${milestoneId}`, "info");
361
- }
362
- // ── Merge and Exit ─────────────────────────────────────────────────────
363
- /**
364
- * Merge the completed milestone branch back to main and exit the worktree.
365
- *
366
- * Handles all three isolation modes:
367
- * - **worktree**: Read roadmap, merge, teardown worktree, reset paths.
368
- * Falls back to bare teardown if no roadmap exists.
369
- * - **branch**: Check if on milestone branch, merge if so (no chdir/teardown).
370
- * - **none**: No-op.
371
- *
372
- * Error recovery: on merge failure, always restore `s.basePath` to
373
- * `s.originalBasePath` and `process.chdir(s.originalBasePath)`.
374
- */
375
- mergeAndExit(milestoneId, ctx) {
376
- this.validateMilestoneId(milestoneId);
377
- // Anchor cwd at the project root before any merge work. Some merge code
378
- // paths (mergeMilestoneToMain, slice-cadence) chdir explicitly; others
379
- // (branch-mode, isolation-degraded skip, missing-original-base skip)
380
- // do not. If the worktree dir is later torn down while cwd still points
381
- // into it, every subsequent process.cwd() throws ENOENT — and after
382
- // de73fb43d that surfaces as a session-failed cancel and (in headless
383
- // mode) terminates the whole gsd process. Best-effort: silent on
384
- // failure so existing test fixtures that use synthetic paths still pass.
385
- if (this.s.originalBasePath) {
386
- try {
387
- // process.cwd() can throw ENOENT when cwd was removed, so attempt
388
- // recovery directly.
389
- process.chdir(this.s.originalBasePath);
390
- }
391
- catch (err) {
392
- debugLog("WorktreeResolver", {
393
- action: "mergeAndExit",
394
- phase: "pre-merge-chdir-failed",
395
- milestoneId,
396
- originalBasePath: this.s.originalBasePath,
397
- error: err instanceof Error ? err.message : String(err),
398
- });
399
- }
400
- }
401
- // #4764 — telemetry: record start timestamp so we can emit merge duration.
402
- const mergeStartedAt = new Date().toISOString();
403
- const mergeStartMs = Date.now();
404
- // If worktree creation failed earlier, skip merge — work is on current branch (#2483)
405
- if (this.s.isolationDegraded) {
406
- debugLog("WorktreeResolver", {
407
- action: "mergeAndExit",
408
- milestoneId,
409
- skipped: true,
410
- reason: "isolation-degraded",
411
- });
412
- ctx.notify(`Skipping worktree merge for ${milestoneId} — isolation was degraded (worktree creation failed earlier). Work is on the current branch.`, "info");
413
- return;
414
- }
415
- const mode = this.deps.getIsolationMode(this.s.originalBasePath || this.s.basePath);
416
- debugLog("WorktreeResolver", {
417
- action: "mergeAndExit",
418
- milestoneId,
419
- mode,
420
- basePath: this.s.basePath,
421
- });
422
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
423
- ts: new Date().toISOString(),
424
- flowId: randomUUID(),
425
- seq: 0,
426
- eventType: "worktree-merge-start",
427
- data: { milestoneId, mode },
428
- });
429
- // #2625: If we are physically inside an auto-worktree, we MUST merge
430
- // regardless of the current isolation config. This prevents data loss when
431
- // the default isolation mode changes between versions (e.g., "worktree" ->
432
- // "none"): the worktree branch still holds real commits that need merging.
433
- const inWorktree = this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath;
434
- if (mode === "none" && !inWorktree) {
435
- debugLog("WorktreeResolver", {
436
- action: "mergeAndExit",
437
- milestoneId,
438
- skipped: true,
439
- reason: "mode-none",
440
- });
441
- return;
442
- }
443
- let actuallyMerged = false;
444
- if (mode === "worktree" || inWorktree) {
445
- actuallyMerged = this._mergeWorktreeMode(milestoneId, ctx);
446
- }
447
- else if (mode === "branch") {
448
- actuallyMerged = this._mergeBranchMode(milestoneId, ctx);
449
- }
450
- // The remainder of this function emits telemetry and runs re-squash.
451
- // Both are gated on actuallyMerged — if the _merge* helper took a
452
- // no-merge path (missing originalBase, no roadmap, wrong branch) the
453
- // milestone branch was intentionally left unmerged and we must not
454
- // emit a worktree-merged event or collapse commits on main.
455
- if (!actuallyMerged) {
456
- // Always clear the start-SHA tracker to avoid leaking across sessions.
457
- this.s.milestoneStartShas.delete(milestoneId);
458
- return;
459
- }
460
- // #4765 — when collapse_cadence=slice AND milestone_resquash=true, the
461
- // N per-slice commits on main should be collapsed into one milestone
462
- // commit. Done AFTER the primary merge-and-teardown so the branch and
463
- // worktree are already cleaned up; we operate on main directly.
464
- try {
465
- const startSha = this.s.milestoneStartShas.get(milestoneId);
466
- if (startSha) {
467
- const prefs = loadEffectiveGSDPreferences(this.s.originalBasePath || this.s.basePath)?.preferences;
468
- if (getCollapseCadence(prefs) === "slice" && getMilestoneResquash(prefs)) {
469
- const result = resquashMilestoneOnMain(this.s.originalBasePath || this.s.basePath, milestoneId, startSha);
470
- if (result.resquashed) {
471
- ctx.notify(`slice-cadence: re-squashed slice commits for ${milestoneId} into a single milestone commit.`, "info");
472
- }
473
- }
474
- this.s.milestoneStartShas.delete(milestoneId);
475
- }
476
- }
477
- catch (err) {
478
- debugLog("WorktreeResolver", {
479
- action: "mergeAndExit",
480
- milestoneId,
481
- phase: "resquash",
482
- error: err instanceof Error ? err.message : String(err),
483
- });
484
- }
485
- // #4764 — record merge completion. Only reaches here when an actual
486
- // merge ran; failure paths throw out of _merge* before this point and
487
- // no-merge paths returned above.
488
- try {
489
- emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
490
- reason: "milestone-complete",
491
- startedAt: mergeStartedAt,
492
- durationMs: Date.now() - mergeStartMs,
493
- });
494
- }
495
- catch (telemetryErr) {
496
- debugLog("WorktreeResolver", {
497
- action: "mergeAndExit",
498
- phase: "telemetry-emit",
499
- error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
500
- });
501
- }
502
- }
503
- /** Worktree-mode merge: read roadmap, merge, teardown, reset paths.
504
- * Returns true when a squash-merge actually ran (false on skip paths). */
505
- _mergeWorktreeMode(milestoneId, ctx) {
506
- const originalBase = this.s.originalBasePath;
507
- if (!originalBase) {
508
- debugLog("WorktreeResolver", {
509
- action: "mergeAndExit",
510
- milestoneId,
511
- mode: "worktree",
512
- skipped: true,
513
- reason: "missing-original-base",
514
- });
515
- return false;
516
- }
517
- let merged = false;
518
- try {
519
- const { synced } = this.deps.syncWorktreeStateBack(originalBase, this.s.basePath, milestoneId);
520
- if (synced.length > 0) {
521
- debugLog("WorktreeResolver", {
522
- action: "mergeAndExit",
523
- milestoneId,
524
- phase: "reverse-sync",
525
- synced: synced.length,
526
- });
527
- }
528
- // Resolve roadmap — try project root first, then worktree path as fallback.
529
- // The worktree may hold the only copy when syncWorktreeStateBack fails
530
- // silently or .gsd/ is not symlinked. Without the fallback, a missing
531
- // roadmap triggers bare teardown which deletes the branch and orphans all
532
- // milestone commits (#1573).
533
- let roadmapPath = this.deps.resolveMilestoneFile(originalBase, milestoneId, "ROADMAP");
534
- if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
535
- roadmapPath = this.deps.resolveMilestoneFile(this.s.basePath, milestoneId, "ROADMAP");
536
- if (roadmapPath) {
537
- debugLog("WorktreeResolver", {
538
- action: "mergeAndExit",
539
- milestoneId,
540
- phase: "roadmap-fallback",
541
- note: "resolved from worktree path",
542
- });
543
- }
544
- }
545
- if (roadmapPath) {
546
- const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
547
- const mergeResult = this.deps.mergeMilestoneToMain(originalBase, milestoneId, roadmapContent);
548
- merged = true;
549
- // #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
550
- // cleanup internally (step 12), but it can silently fail on Windows
551
- // or when the worktree directory is locked. Perform a secondary
552
- // teardown here to ensure the worktree is properly cleaned up.
553
- // This is idempotent — if the worktree was already removed,
554
- // teardownAutoWorktree handles the no-op case gracefully.
555
- try {
556
- this.deps.teardownAutoWorktree(originalBase, milestoneId);
557
- }
558
- catch {
559
- // Best-effort — the primary cleanup in mergeMilestoneToMain may
560
- // have already removed the worktree.
561
- }
562
- if (mergeResult.codeFilesChanged) {
563
- ctx.notify(`Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
564
- }
565
- else {
566
- // (#1906) Milestone produced only .gsd/ metadata — no actual code was
567
- // merged. This typically means the LLM wrote planning artifacts
568
- // (summaries, roadmaps) but never implemented the code. Surface this
569
- // clearly so the user knows the milestone is not truly complete.
570
- ctx.notify(`WARNING: Milestone ${milestoneId} merged to main but contained NO code changes — only .gsd/ metadata files. ` +
571
- `The milestone summary may describe planned work that was never implemented. ` +
572
- `Review the milestone output and re-run if code is missing.`, "warning");
573
- }
574
- }
575
- else {
576
- // No roadmap at either location — teardown but PRESERVE the branch so
577
- // commits are not orphaned. The user can merge manually later (#1573).
578
- this.deps.teardownAutoWorktree(originalBase, milestoneId, {
579
- preserveBranch: true,
580
- });
581
- ctx.notify(`Exited worktree for ${milestoneId} (no roadmap found — branch preserved for manual merge).`, "warning");
582
- }
583
- }
584
- catch (err) {
585
- const msg = err instanceof Error ? err.message : String(err);
586
- debugLog("WorktreeResolver", {
587
- action: "mergeAndExit",
588
- milestoneId,
589
- result: "error",
590
- error: msg,
591
- fallback: "chdir-to-project-root",
592
- });
593
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
594
- ts: new Date().toISOString(),
595
- flowId: randomUUID(),
596
- seq: 0,
597
- eventType: "worktree-merge-failed",
598
- data: { milestoneId, error: msg },
599
- });
600
- // Surface a clear, actionable error. The worktree and milestone branch are
601
- // intentionally preserved — nothing has been deleted. The user can retry
602
- // /gsd dispatch complete-milestone or merge manually once the underlying
603
- // issue is fixed (e.g. checkout to wrong branch, unresolved conflicts).
604
- // (#1668, #1891)
605
- ctx.notify(`Milestone merge failed: ${msg}. Your worktree and milestone branch are preserved — retry with \`/gsd dispatch complete-milestone\` or merge manually.`, "warning");
606
- // Clean up stale merge state left by failed squash-merge (#1389)
607
- try {
608
- const gitDir = join(originalBase || this.s.basePath, ".git");
609
- for (const f of ["SQUASH_MSG", "MERGE_HEAD", "MERGE_MSG"]) {
610
- const p = join(gitDir, f);
611
- if (existsSync(p))
612
- unlinkSync(p);
613
- }
614
- }
615
- catch { /* best-effort */ }
616
- // Error recovery: always restore to project root
617
- if (originalBase) {
618
- try {
619
- process.chdir(originalBase);
620
- }
621
- catch {
622
- /* best-effort */
623
- }
624
- }
625
- // Restore state before re-throwing so callers always get a consistent
626
- // session (#4380).
627
- this.restoreToProjectRoot();
628
- // Re-throw: MergeConflictError stops the auto loop (#2330); non-conflict
629
- // errors (permission denied, filesystem failures) must also propagate so
630
- // broken states are diagnosable (#4380).
631
- throw err;
632
- }
633
- // Always restore basePath and rebuild — whether merge succeeded or failed
634
- this.restoreToProjectRoot();
635
- debugLog("WorktreeResolver", {
636
- action: "mergeAndExit",
637
- milestoneId,
638
- result: "done",
639
- basePath: this.s.basePath,
640
- });
641
- return merged;
642
- }
643
- /** Branch-mode merge: check current branch, merge if on milestone branch.
644
- * Returns true when a merge actually ran (false on skip paths). */
645
- _mergeBranchMode(milestoneId, ctx) {
646
- try {
647
- const currentBranch = this.deps.getCurrentBranch(this.s.basePath);
648
- const milestoneBranch = this.deps.autoWorktreeBranch(milestoneId);
649
- if (currentBranch !== milestoneBranch) {
650
- debugLog("WorktreeResolver", {
651
- action: "mergeAndExit",
652
- milestoneId,
653
- mode: "branch",
654
- skipped: true,
655
- reason: "not-on-milestone-branch",
656
- currentBranch,
657
- milestoneBranch,
658
- });
659
- return false;
660
- }
661
- const roadmapPath = this.deps.resolveMilestoneFile(this.s.basePath, milestoneId, "ROADMAP");
662
- if (!roadmapPath) {
663
- debugLog("WorktreeResolver", {
664
- action: "mergeAndExit",
665
- milestoneId,
666
- mode: "branch",
667
- skipped: true,
668
- reason: "no-roadmap",
669
- });
670
- return false;
671
- }
672
- const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
673
- const mergeResult = this.deps.mergeMilestoneToMain(this.s.basePath, milestoneId, roadmapContent);
674
- // Rebuild GitService after merge (branch HEAD changed)
675
- this.rebuildGitService();
676
- if (mergeResult.codeFilesChanged) {
677
- ctx.notify(`Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
678
- }
679
- else {
680
- ctx.notify(`WARNING: Milestone ${milestoneId} merged (branch mode) but contained NO code changes — only .gsd/ metadata. ` +
681
- `Review the milestone output and re-run if code is missing.`, "warning");
682
- }
683
- debugLog("WorktreeResolver", {
684
- action: "mergeAndExit",
685
- milestoneId,
686
- mode: "branch",
687
- result: "success",
688
- });
689
- return true;
690
- }
691
- catch (err) {
692
- const msg = err instanceof Error ? err.message : String(err);
693
- debugLog("WorktreeResolver", {
694
- action: "mergeAndExit",
695
- milestoneId,
696
- mode: "branch",
697
- result: "error",
698
- error: msg,
699
- });
700
- ctx.notify(`Milestone merge failed (branch mode): ${msg}`, "warning");
701
- // Re-throw all errors so callers can apply their own recovery logic (#4380).
702
- throw err;
703
- }
704
- }
705
- // ── Merge and Enter Next ───────────────────────────────────────────────
706
- /**
707
- * Milestone transition: merge the current milestone, then enter the next one.
708
- *
709
- * This is the pattern used when the loop detects that the active milestone
710
- * has changed (e.g., current completed, next one is now active). The caller
711
- * is responsible for re-deriving state between the merge and the enter.
712
- */
713
- mergeAndEnterNext(currentMilestoneId, nextMilestoneId, ctx) {
714
- debugLog("WorktreeResolver", {
715
- action: "mergeAndEnterNext",
716
- currentMilestoneId,
717
- nextMilestoneId,
718
- });
719
- try {
720
- this.mergeAndExit(currentMilestoneId, ctx);
721
- }
722
- catch (err) {
723
- // mergeAndExit emits a warning and restores state when it fails during
724
- // merge/cleanup. But if it throws before recovery runs (e.g., in
725
- // validateMilestoneId or emitJournalEvent), basePath won't be restored
726
- // to projectRoot — re-throw so we don't enter the next milestone with
727
- // the current one unmerged.
728
- if (this.s.basePath !== this.projectRoot)
729
- throw err;
730
- }
731
- this.enterMilestone(nextMilestoneId, ctx);
732
- }
733
- }