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,909 +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
-
17
- import { existsSync, unlinkSync } from "node:fs";
18
- import { randomUUID } from "node:crypto";
19
- import { join } from "node:path";
20
- import type { AutoSession } from "./auto/session.js";
21
- import { debugLog } from "./debug-logger.js";
22
- import { MergeConflictError } from "./git-service.js";
23
- import { emitJournalEvent } from "./journal.js";
24
- import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
25
- import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
26
- import { loadEffectiveGSDPreferences } from "./preferences.js";
27
- import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
28
- import { claimMilestoneLease, releaseMilestoneLease } from "./db/milestone-leases.js";
29
-
30
- // ─── Path Comparison Helper ────────────────────────────────────────────────
31
- /**
32
- * Compare two paths for physical identity, tolerating trailing slashes,
33
- * symlink differences, and case variations on case-insensitive volumes.
34
- *
35
- * Used in place of string `===` / `!==` wherever one operand may be
36
- * realpath-normalised (e.g. from the workspace registry) and the other
37
- * may not be (e.g. a raw caller-supplied basePath).
38
- */
39
- function isSamePath(a: string, b: string): boolean {
40
- return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
41
- }
42
-
43
- // ─── Dependency Interface ──────────────────────────────────────────────────
44
-
45
- export interface WorktreeResolverDeps {
46
- isInAutoWorktree: (basePath: string) => boolean;
47
- shouldUseWorktreeIsolation: () => boolean;
48
- getIsolationMode: (basePath?: string) => "worktree" | "branch" | "none";
49
- mergeMilestoneToMain: (
50
- basePath: string,
51
- milestoneId: string,
52
- roadmapContent: string,
53
- ) => { pushed: boolean; codeFilesChanged: boolean };
54
- syncWorktreeStateBack: (
55
- mainBasePath: string,
56
- worktreePath: string,
57
- milestoneId: string,
58
- ) => { synced: string[] };
59
- teardownAutoWorktree: (
60
- basePath: string,
61
- milestoneId: string,
62
- opts?: { preserveBranch?: boolean },
63
- ) => void;
64
- createAutoWorktree: (basePath: string, milestoneId: string) => string;
65
- enterAutoWorktree: (basePath: string, milestoneId: string) => string;
66
- enterBranchModeForMilestone: (basePath: string, milestoneId: string) => void;
67
- getAutoWorktreePath: (basePath: string, milestoneId: string) => string | null;
68
- autoCommitCurrentBranch: (
69
- basePath: string,
70
- reason: string,
71
- milestoneId: string,
72
- ) => void;
73
- getCurrentBranch: (basePath: string) => string;
74
- autoWorktreeBranch: (milestoneId: string) => string;
75
- resolveMilestoneFile: (
76
- basePath: string,
77
- milestoneId: string,
78
- fileType: string,
79
- ) => string | null;
80
- readFileSync: (path: string, encoding: string) => string;
81
- GitServiceImpl: new (basePath: string, gitConfig: unknown) => unknown;
82
- loadEffectiveGSDPreferences: () =>
83
- | { preferences?: { git?: Record<string, unknown> } }
84
- | undefined;
85
- invalidateAllCaches: () => void;
86
- captureIntegrationBranch: (
87
- basePath: string,
88
- mid: string,
89
- ) => void;
90
- }
91
-
92
- // ─── Notify Context ────────────────────────────────────────────────────────
93
-
94
- export interface NotifyCtx {
95
- notify: (
96
- msg: string,
97
- level?: "info" | "warning" | "error" | "success",
98
- ) => void;
99
- }
100
-
101
- // ─── Path Helpers ──────────────────────────────────────────────────────────
102
-
103
- /**
104
- * Resolve the project root from session path state.
105
- *
106
- * Prefers `originalBasePath` (always the project root when set), but falls
107
- * back to `basePath` when `originalBasePath` is falsy (e.g. fresh AutoSession
108
- * with default empty string). If `basePath` itself is inside a worktree
109
- * directory (including symlink-resolved ~/.gsd/projects/<hash>/worktrees
110
- * paths), recover the actual project root to prevent double nesting (#3729).
111
- */
112
- export function resolveProjectRoot(
113
- originalBasePath: string,
114
- basePath: string,
115
- ): string {
116
- return resolveWorktreeProjectRoot(basePath, originalBasePath);
117
- }
118
-
119
- // ─── WorktreeResolver ──────────────────────────────────────────────────────
120
-
121
- export class WorktreeResolver {
122
- private readonly s: AutoSession;
123
- private readonly deps: WorktreeResolverDeps;
124
-
125
- constructor(session: AutoSession, deps: WorktreeResolverDeps) {
126
- this.s = session;
127
- this.deps = deps;
128
- }
129
-
130
- // ── Getters ────────────────────────────────────────────────────────────
131
-
132
- /** Current working path — may be worktree or project root. */
133
- get workPath(): string {
134
- return this.s.basePath;
135
- }
136
-
137
- /** Original project root — always the non-worktree path. */
138
- get projectRoot(): string {
139
- return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
140
- }
141
-
142
- /** Path for auto.lock file — same as the old lockBase(). */
143
- get lockPath(): string {
144
- return resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
145
- }
146
-
147
- // ── Private Helpers ────────────────────────────────────────────────────
148
-
149
- private rebuildGitService(): void {
150
- const gitConfig =
151
- this.deps.loadEffectiveGSDPreferences()?.preferences?.git ?? {};
152
- this.s.gitService = new this.deps.GitServiceImpl(
153
- this.s.basePath,
154
- gitConfig,
155
- ) as AutoSession["gitService"];
156
- }
157
-
158
- /** Restore basePath to originalBasePath and rebuild GitService. */
159
- private restoreToProjectRoot(): void {
160
- if (!this.s.originalBasePath) return;
161
- this.s.basePath = this.s.originalBasePath;
162
- this.rebuildGitService();
163
- this.deps.invalidateAllCaches();
164
- }
165
-
166
- // ── Validation ──────────────────────────────────────────────────────────
167
-
168
- /** Validate milestoneId to prevent path traversal. */
169
- private validateMilestoneId(milestoneId: string): void {
170
- if (/[\/\\]|\.\./.test(milestoneId)) {
171
- throw new Error(
172
- `Invalid milestoneId: ${milestoneId} — contains path separators or traversal`,
173
- );
174
- }
175
- }
176
-
177
- // ── Enter Milestone ────────────────────────────────────────────────────
178
-
179
- /**
180
- * Enter or create a worktree for the given milestone.
181
- *
182
- * Only acts if `shouldUseWorktreeIsolation()` returns true.
183
- * Delegates to `enterAutoWorktree` (existing) or `createAutoWorktree` (new).
184
- * Those functions call `process.chdir()` internally — we do NOT double-chdir.
185
- *
186
- * Updates `s.basePath` and rebuilds GitService on success.
187
- * On failure: notifies a warning and does NOT update `s.basePath`.
188
- */
189
- enterMilestone(milestoneId: string, ctx: NotifyCtx): void {
190
- this.validateMilestoneId(milestoneId);
191
-
192
- // If worktree creation failed earlier this session, skip all future attempts
193
- if (this.s.isolationDegraded) {
194
- debugLog("WorktreeResolver", {
195
- action: "enterMilestone",
196
- milestoneId,
197
- skipped: true,
198
- reason: "isolation-degraded",
199
- });
200
- return;
201
- }
202
-
203
- // Phase B: claim a milestone lease before any worktree mutation. Two
204
- // workers cannot enter the same milestone concurrently. Best-effort:
205
- // skip if no worker registered (single-worker fallback) or DB
206
- // unavailable; reuse existing lease if we already hold it on this
207
- // milestone (re-entry within the same session).
208
- if (this.s.workerId) {
209
- if (this.s.currentMilestoneId === milestoneId && this.s.milestoneLeaseToken !== null) {
210
- // Already held — no-op, the heartbeat in loop.ts refreshes TTL.
211
- } else {
212
- // If we held a different milestone, release it first so other
213
- // workers don't have to wait for TTL.
214
- if (this.s.currentMilestoneId && this.s.currentMilestoneId !== milestoneId && this.s.milestoneLeaseToken !== null) {
215
- try {
216
- releaseMilestoneLease(this.s.workerId, this.s.currentMilestoneId, this.s.milestoneLeaseToken);
217
- } catch (err) {
218
- debugLog("WorktreeResolver", {
219
- action: "enterMilestone",
220
- milestoneId,
221
- releasePriorLeaseError: err instanceof Error ? err.message : String(err),
222
- });
223
- }
224
- this.s.milestoneLeaseToken = null;
225
- }
226
-
227
- try {
228
- const claim = claimMilestoneLease(this.s.workerId, milestoneId);
229
- if (claim.ok) {
230
- this.s.milestoneLeaseToken = claim.token;
231
- debugLog("WorktreeResolver", {
232
- action: "enterMilestone",
233
- milestoneId,
234
- leaseAcquired: true,
235
- fencingToken: claim.token,
236
- expiresAt: claim.expiresAt,
237
- });
238
- } else {
239
- // Lease held by another worker — fail loud so the user can
240
- // see the conflict instead of silently double-running.
241
- const msg = `Milestone ${milestoneId} is held by worker ${claim.byWorker} until ${claim.expiresAt}.`;
242
- debugLog("WorktreeResolver", {
243
- action: "enterMilestone",
244
- milestoneId,
245
- leaseHeldByOther: claim.byWorker,
246
- expiresAt: claim.expiresAt,
247
- });
248
- ctx.notify(`${msg} Another auto-mode worker is active. Stop it before entering ${milestoneId}.`, "error");
249
- return;
250
- }
251
- } catch (err) {
252
- // DB unavailable or other error — log and fall through to the
253
- // pre-Phase-B single-worker behavior so a fresh project before
254
- // DB init still works.
255
- debugLog("WorktreeResolver", {
256
- action: "enterMilestone",
257
- milestoneId,
258
- leaseError: err instanceof Error ? err.message : String(err),
259
- });
260
- }
261
- }
262
- }
263
-
264
- // Resolve the project root for worktree operations via shared helper.
265
- // Handles the case where originalBasePath is falsy and basePath is itself
266
- // a worktree path — prevents double-nested worktree paths (#3729).
267
- const basePath = resolveProjectRoot(this.s.originalBasePath, this.s.basePath);
268
- const mode = this.deps.getIsolationMode(basePath);
269
-
270
- if (mode === "none") {
271
- debugLog("WorktreeResolver", {
272
- action: "enterMilestone",
273
- milestoneId,
274
- skipped: true,
275
- reason: "isolation-disabled",
276
- });
277
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
278
- ts: new Date().toISOString(),
279
- flowId: randomUUID(),
280
- seq: 0,
281
- eventType: "worktree-skip",
282
- data: { milestoneId, reason: "isolation-disabled" },
283
- });
284
- return;
285
- }
286
-
287
- debugLog("WorktreeResolver", {
288
- action: "enterMilestone",
289
- milestoneId,
290
- mode,
291
- basePath,
292
- });
293
-
294
- // ── Branch mode: create/checkout milestone branch, stay in project root ──
295
- if (mode === "branch") {
296
- try {
297
- this.deps.enterBranchModeForMilestone(basePath, milestoneId);
298
- // basePath does not change — no worktree, no chdir.
299
- // Rebuild GitService so the new HEAD is reflected, then flush any
300
- // path-keyed caches that may have been populated before the checkout.
301
- this.rebuildGitService();
302
- this.deps.invalidateAllCaches();
303
- debugLog("WorktreeResolver", {
304
- action: "enterMilestone",
305
- milestoneId,
306
- mode: "branch",
307
- result: "success",
308
- });
309
- emitJournalEvent(basePath, {
310
- ts: new Date().toISOString(),
311
- flowId: randomUUID(),
312
- seq: 0,
313
- eventType: "worktree-skip",
314
- data: { milestoneId, reason: "branch-mode-no-worktree" },
315
- });
316
- ctx.notify(`Switched to branch milestone/${milestoneId}.`, "info");
317
- } catch (err) {
318
- const msg = err instanceof Error ? err.message : String(err);
319
- debugLog("WorktreeResolver", {
320
- action: "enterMilestone",
321
- milestoneId,
322
- mode: "branch",
323
- result: "error",
324
- error: msg,
325
- });
326
- ctx.notify(
327
- `Branch isolation setup for ${milestoneId} failed: ${msg}. Continuing on current branch.`,
328
- "warning",
329
- );
330
- this.s.isolationDegraded = true;
331
- }
332
- return;
333
- }
334
-
335
- // ── Worktree mode ─────────────────────────────────────────────────────────
336
- try {
337
- const existingPath = this.deps.getAutoWorktreePath(basePath, milestoneId);
338
- let wtPath: string;
339
-
340
- if (existingPath) {
341
- wtPath = this.deps.enterAutoWorktree(basePath, milestoneId);
342
- } else {
343
- wtPath = this.deps.createAutoWorktree(basePath, milestoneId);
344
- }
345
-
346
- this.s.basePath = wtPath;
347
- this.rebuildGitService();
348
-
349
- debugLog("WorktreeResolver", {
350
- action: "enterMilestone",
351
- milestoneId,
352
- result: "success",
353
- wtPath,
354
- });
355
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
356
- ts: new Date().toISOString(),
357
- flowId: randomUUID(),
358
- seq: 0,
359
- eventType: "worktree-enter",
360
- data: { milestoneId, wtPath, created: !existingPath },
361
- });
362
- // #4764 — record creation/enter as a lifecycle event so the telemetry
363
- // aggregator can pair it with the eventual worktree-merged event.
364
- try {
365
- emitWorktreeCreated(this.s.originalBasePath || this.s.basePath, milestoneId, {
366
- reason: existingPath ? "enter-milestone" : "create-milestone",
367
- });
368
- } catch (telemetryErr) {
369
- debugLog("WorktreeResolver", {
370
- action: "enterMilestone",
371
- phase: "telemetry-emit",
372
- error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
373
- });
374
- }
375
- ctx.notify(`Entered worktree for ${milestoneId} at ${wtPath}`, "info");
376
- } catch (err) {
377
- const msg = err instanceof Error ? err.message : String(err);
378
- debugLog("WorktreeResolver", {
379
- action: "enterMilestone",
380
- milestoneId,
381
- result: "error",
382
- error: msg,
383
- });
384
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
385
- ts: new Date().toISOString(),
386
- flowId: randomUUID(),
387
- seq: 0,
388
- eventType: "worktree-create-failed",
389
- data: { milestoneId, error: msg, fallback: "project-root" },
390
- });
391
- ctx.notify(
392
- `Auto-worktree creation for ${milestoneId} failed: ${msg}. Continuing in project root.`,
393
- "warning",
394
- );
395
- // Degrade isolation for the rest of this session so mergeAndExit
396
- // doesn't try to merge a nonexistent worktree branch (#2483)
397
- this.s.isolationDegraded = true;
398
- // Do NOT update s.basePath — stay in project root
399
- }
400
- }
401
-
402
- // ── Exit Milestone ─────────────────────────────────────────────────────
403
-
404
- /**
405
- * Exit the current worktree: auto-commit, teardown, reset basePath.
406
- *
407
- * Only acts if currently in an auto-worktree (checked via `isInAutoWorktree`).
408
- * Resets `s.basePath` to `s.originalBasePath` and rebuilds GitService.
409
- */
410
- exitMilestone(
411
- milestoneId: string,
412
- ctx: NotifyCtx,
413
- opts?: { preserveBranch?: boolean },
414
- ): void {
415
- this.validateMilestoneId(milestoneId);
416
- if (!this.deps.isInAutoWorktree(this.s.basePath)) {
417
- debugLog("WorktreeResolver", {
418
- action: "exitMilestone",
419
- milestoneId,
420
- skipped: true,
421
- reason: "not-in-worktree",
422
- });
423
- return;
424
- }
425
-
426
- debugLog("WorktreeResolver", {
427
- action: "exitMilestone",
428
- milestoneId,
429
- basePath: this.s.basePath,
430
- });
431
-
432
- try {
433
- this.deps.autoCommitCurrentBranch(this.s.basePath, "stop", milestoneId);
434
- } catch (err) {
435
- debugLog("WorktreeResolver", {
436
- action: "exitMilestone",
437
- milestoneId,
438
- phase: "auto-commit-failed",
439
- error: err instanceof Error ? err.message : String(err),
440
- });
441
- }
442
-
443
- try {
444
- this.deps.teardownAutoWorktree(this.s.originalBasePath, milestoneId, {
445
- preserveBranch: opts?.preserveBranch ?? false,
446
- });
447
- } catch (err) {
448
- debugLog("WorktreeResolver", {
449
- action: "exitMilestone",
450
- milestoneId,
451
- phase: "teardown-failed",
452
- error: err instanceof Error ? err.message : String(err),
453
- });
454
- }
455
-
456
- this.restoreToProjectRoot();
457
- debugLog("WorktreeResolver", {
458
- action: "exitMilestone",
459
- milestoneId,
460
- result: "done",
461
- basePath: this.s.basePath,
462
- });
463
- ctx.notify(`Exited worktree for ${milestoneId}`, "info");
464
- }
465
-
466
- // ── Merge and Exit ─────────────────────────────────────────────────────
467
-
468
- /**
469
- * Merge the completed milestone branch back to main and exit the worktree.
470
- *
471
- * Handles all three isolation modes:
472
- * - **worktree**: Read roadmap, merge, teardown worktree, reset paths.
473
- * Falls back to bare teardown if no roadmap exists.
474
- * - **branch**: Check if on milestone branch, merge if so (no chdir/teardown).
475
- * - **none**: No-op.
476
- *
477
- * Error recovery: on merge failure, always restore `s.basePath` to
478
- * `s.originalBasePath` and `process.chdir(s.originalBasePath)`.
479
- */
480
- mergeAndExit(milestoneId: string, ctx: NotifyCtx): void {
481
- this.validateMilestoneId(milestoneId);
482
-
483
- // Anchor cwd at the project root before any merge work. Some merge code
484
- // paths (mergeMilestoneToMain, slice-cadence) chdir explicitly; others
485
- // (branch-mode, isolation-degraded skip, missing-original-base skip)
486
- // do not. If the worktree dir is later torn down while cwd still points
487
- // into it, every subsequent process.cwd() throws ENOENT — and after
488
- // de73fb43d that surfaces as a session-failed cancel and (in headless
489
- // mode) terminates the whole gsd process. Best-effort: silent on
490
- // failure so existing test fixtures that use synthetic paths still pass.
491
- if (this.s.originalBasePath) {
492
- try {
493
- // process.cwd() can throw ENOENT when cwd was removed, so attempt
494
- // recovery directly.
495
- process.chdir(this.s.originalBasePath);
496
- } catch (err) {
497
- debugLog("WorktreeResolver", {
498
- action: "mergeAndExit",
499
- phase: "pre-merge-chdir-failed",
500
- milestoneId,
501
- originalBasePath: this.s.originalBasePath,
502
- error: err instanceof Error ? err.message : String(err),
503
- });
504
- }
505
- }
506
-
507
- // #4764 — telemetry: record start timestamp so we can emit merge duration.
508
- const mergeStartedAt = new Date().toISOString();
509
- const mergeStartMs = Date.now();
510
-
511
- // If worktree creation failed earlier, skip merge — work is on current branch (#2483)
512
- if (this.s.isolationDegraded) {
513
- debugLog("WorktreeResolver", {
514
- action: "mergeAndExit",
515
- milestoneId,
516
- skipped: true,
517
- reason: "isolation-degraded",
518
- });
519
- ctx.notify(
520
- `Skipping worktree merge for ${milestoneId} — isolation was degraded (worktree creation failed earlier). Work is on the current branch.`,
521
- "info",
522
- );
523
- return;
524
- }
525
-
526
- const mode = this.deps.getIsolationMode(this.s.originalBasePath || this.s.basePath);
527
- debugLog("WorktreeResolver", {
528
- action: "mergeAndExit",
529
- milestoneId,
530
- mode,
531
- basePath: this.s.basePath,
532
- });
533
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
534
- ts: new Date().toISOString(),
535
- flowId: randomUUID(),
536
- seq: 0,
537
- eventType: "worktree-merge-start",
538
- data: { milestoneId, mode },
539
- });
540
-
541
- // #2625: If we are physically inside an auto-worktree, we MUST merge
542
- // regardless of the current isolation config. This prevents data loss when
543
- // the default isolation mode changes between versions (e.g., "worktree" ->
544
- // "none"): the worktree branch still holds real commits that need merging.
545
- const inWorktree = this.deps.isInAutoWorktree(this.s.basePath) && this.s.originalBasePath;
546
-
547
- if (mode === "none" && !inWorktree) {
548
- debugLog("WorktreeResolver", {
549
- action: "mergeAndExit",
550
- milestoneId,
551
- skipped: true,
552
- reason: "mode-none",
553
- });
554
- return;
555
- }
556
-
557
- let actuallyMerged = false;
558
- if (
559
- mode === "worktree" || inWorktree
560
- ) {
561
- actuallyMerged = this._mergeWorktreeMode(milestoneId, ctx);
562
- } else if (mode === "branch") {
563
- actuallyMerged = this._mergeBranchMode(milestoneId, ctx);
564
- }
565
-
566
- // The remainder of this function emits telemetry and runs re-squash.
567
- // Both are gated on actuallyMerged — if the _merge* helper took a
568
- // no-merge path (missing originalBase, no roadmap, wrong branch) the
569
- // milestone branch was intentionally left unmerged and we must not
570
- // emit a worktree-merged event or collapse commits on main.
571
- if (!actuallyMerged) {
572
- // Always clear the start-SHA tracker to avoid leaking across sessions.
573
- this.s.milestoneStartShas.delete(milestoneId);
574
- return;
575
- }
576
-
577
- // #4765 — when collapse_cadence=slice AND milestone_resquash=true, the
578
- // N per-slice commits on main should be collapsed into one milestone
579
- // commit. Done AFTER the primary merge-and-teardown so the branch and
580
- // worktree are already cleaned up; we operate on main directly.
581
- try {
582
- const startSha = this.s.milestoneStartShas.get(milestoneId);
583
- if (startSha) {
584
- const prefs = loadEffectiveGSDPreferences(this.s.originalBasePath || this.s.basePath)?.preferences;
585
- if (getCollapseCadence(prefs) === "slice" && getMilestoneResquash(prefs)) {
586
- const result = resquashMilestoneOnMain(
587
- this.s.originalBasePath || this.s.basePath,
588
- milestoneId,
589
- startSha,
590
- );
591
- if (result.resquashed) {
592
- ctx.notify(
593
- `slice-cadence: re-squashed slice commits for ${milestoneId} into a single milestone commit.`,
594
- "info",
595
- );
596
- }
597
- }
598
- this.s.milestoneStartShas.delete(milestoneId);
599
- }
600
- } catch (err) {
601
- debugLog("WorktreeResolver", {
602
- action: "mergeAndExit",
603
- milestoneId,
604
- phase: "resquash",
605
- error: err instanceof Error ? err.message : String(err),
606
- });
607
- }
608
-
609
- // #4764 — record merge completion. Only reaches here when an actual
610
- // merge ran; failure paths throw out of _merge* before this point and
611
- // no-merge paths returned above.
612
- try {
613
- emitWorktreeMerged(this.s.originalBasePath || this.s.basePath, milestoneId, {
614
- reason: "milestone-complete",
615
- startedAt: mergeStartedAt,
616
- durationMs: Date.now() - mergeStartMs,
617
- });
618
- } catch (telemetryErr) {
619
- debugLog("WorktreeResolver", {
620
- action: "mergeAndExit",
621
- phase: "telemetry-emit",
622
- error: telemetryErr instanceof Error ? telemetryErr.message : String(telemetryErr),
623
- });
624
- }
625
- }
626
-
627
- /** Worktree-mode merge: read roadmap, merge, teardown, reset paths.
628
- * Returns true when a squash-merge actually ran (false on skip paths). */
629
- private _mergeWorktreeMode(milestoneId: string, ctx: NotifyCtx): boolean {
630
- const originalBase = this.s.originalBasePath;
631
- if (!originalBase) {
632
- debugLog("WorktreeResolver", {
633
- action: "mergeAndExit",
634
- milestoneId,
635
- mode: "worktree",
636
- skipped: true,
637
- reason: "missing-original-base",
638
- });
639
- return false;
640
- }
641
-
642
- let merged = false;
643
- try {
644
- const { synced } = this.deps.syncWorktreeStateBack(
645
- originalBase,
646
- this.s.basePath,
647
- milestoneId,
648
- );
649
- if (synced.length > 0) {
650
- debugLog("WorktreeResolver", {
651
- action: "mergeAndExit",
652
- milestoneId,
653
- phase: "reverse-sync",
654
- synced: synced.length,
655
- });
656
- }
657
-
658
- // Resolve roadmap — try project root first, then worktree path as fallback.
659
- // The worktree may hold the only copy when syncWorktreeStateBack fails
660
- // silently or .gsd/ is not symlinked. Without the fallback, a missing
661
- // roadmap triggers bare teardown which deletes the branch and orphans all
662
- // milestone commits (#1573).
663
- let roadmapPath = this.deps.resolveMilestoneFile(
664
- originalBase,
665
- milestoneId,
666
- "ROADMAP",
667
- );
668
- if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
669
- roadmapPath = this.deps.resolveMilestoneFile(
670
- this.s.basePath,
671
- milestoneId,
672
- "ROADMAP",
673
- );
674
- if (roadmapPath) {
675
- debugLog("WorktreeResolver", {
676
- action: "mergeAndExit",
677
- milestoneId,
678
- phase: "roadmap-fallback",
679
- note: "resolved from worktree path",
680
- });
681
- }
682
- }
683
-
684
- if (roadmapPath) {
685
- const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
686
- const mergeResult = this.deps.mergeMilestoneToMain(
687
- originalBase,
688
- milestoneId,
689
- roadmapContent,
690
- );
691
- merged = true;
692
-
693
- // #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
694
- // cleanup internally (step 12), but it can silently fail on Windows
695
- // or when the worktree directory is locked. Perform a secondary
696
- // teardown here to ensure the worktree is properly cleaned up.
697
- // This is idempotent — if the worktree was already removed,
698
- // teardownAutoWorktree handles the no-op case gracefully.
699
- try {
700
- this.deps.teardownAutoWorktree(originalBase, milestoneId);
701
- } catch {
702
- // Best-effort — the primary cleanup in mergeMilestoneToMain may
703
- // have already removed the worktree.
704
- }
705
-
706
- if (mergeResult.codeFilesChanged) {
707
- ctx.notify(
708
- `Milestone ${milestoneId} merged to main.${mergeResult.pushed ? " Pushed to remote." : ""}`,
709
- "info",
710
- );
711
- } else {
712
- // (#1906) Milestone produced only .gsd/ metadata — no actual code was
713
- // merged. This typically means the LLM wrote planning artifacts
714
- // (summaries, roadmaps) but never implemented the code. Surface this
715
- // clearly so the user knows the milestone is not truly complete.
716
- ctx.notify(
717
- `WARNING: Milestone ${milestoneId} merged to main but contained NO code changes — only .gsd/ metadata files. ` +
718
- `The milestone summary may describe planned work that was never implemented. ` +
719
- `Review the milestone output and re-run if code is missing.`,
720
- "warning",
721
- );
722
- }
723
- } else {
724
- // No roadmap at either location — teardown but PRESERVE the branch so
725
- // commits are not orphaned. The user can merge manually later (#1573).
726
- this.deps.teardownAutoWorktree(originalBase, milestoneId, {
727
- preserveBranch: true,
728
- });
729
- ctx.notify(
730
- `Exited worktree for ${milestoneId} (no roadmap found — branch preserved for manual merge).`,
731
- "warning",
732
- );
733
- }
734
- } catch (err) {
735
- const msg = err instanceof Error ? err.message : String(err);
736
- debugLog("WorktreeResolver", {
737
- action: "mergeAndExit",
738
- milestoneId,
739
- result: "error",
740
- error: msg,
741
- fallback: "chdir-to-project-root",
742
- });
743
- emitJournalEvent(this.s.originalBasePath || this.s.basePath, {
744
- ts: new Date().toISOString(),
745
- flowId: randomUUID(),
746
- seq: 0,
747
- eventType: "worktree-merge-failed",
748
- data: { milestoneId, error: msg },
749
- });
750
- // Surface a clear, actionable error. The worktree and milestone branch are
751
- // intentionally preserved — nothing has been deleted. The user can retry
752
- // /gsd dispatch complete-milestone or merge manually once the underlying
753
- // issue is fixed (e.g. checkout to wrong branch, unresolved conflicts).
754
- // (#1668, #1891)
755
- ctx.notify(
756
- `Milestone merge failed: ${msg}. Your worktree and milestone branch are preserved — retry with \`/gsd dispatch complete-milestone\` or merge manually.`,
757
- "warning",
758
- );
759
-
760
- // Clean up stale merge state left by failed squash-merge (#1389)
761
- try {
762
- const gitDir = join(originalBase || this.s.basePath, ".git");
763
- for (const f of ["SQUASH_MSG", "MERGE_HEAD", "MERGE_MSG"]) {
764
- const p = join(gitDir, f);
765
- if (existsSync(p)) unlinkSync(p);
766
- }
767
- } catch { /* best-effort */ }
768
-
769
- // Error recovery: always restore to project root
770
- if (originalBase) {
771
- try {
772
- process.chdir(originalBase);
773
- } catch {
774
- /* best-effort */
775
- }
776
- }
777
-
778
- // Restore state before re-throwing so callers always get a consistent
779
- // session (#4380).
780
- this.restoreToProjectRoot();
781
- // Re-throw: MergeConflictError stops the auto loop (#2330); non-conflict
782
- // errors (permission denied, filesystem failures) must also propagate so
783
- // broken states are diagnosable (#4380).
784
- throw err;
785
- }
786
-
787
- // Always restore basePath and rebuild — whether merge succeeded or failed
788
- this.restoreToProjectRoot();
789
- debugLog("WorktreeResolver", {
790
- action: "mergeAndExit",
791
- milestoneId,
792
- result: "done",
793
- basePath: this.s.basePath,
794
- });
795
- return merged;
796
- }
797
-
798
- /** Branch-mode merge: check current branch, merge if on milestone branch.
799
- * Returns true when a merge actually ran (false on skip paths). */
800
- private _mergeBranchMode(milestoneId: string, ctx: NotifyCtx): boolean {
801
- try {
802
- const currentBranch = this.deps.getCurrentBranch(this.s.basePath);
803
- const milestoneBranch = this.deps.autoWorktreeBranch(milestoneId);
804
-
805
- if (currentBranch !== milestoneBranch) {
806
- debugLog("WorktreeResolver", {
807
- action: "mergeAndExit",
808
- milestoneId,
809
- mode: "branch",
810
- skipped: true,
811
- reason: "not-on-milestone-branch",
812
- currentBranch,
813
- milestoneBranch,
814
- });
815
- return false;
816
- }
817
-
818
- const roadmapPath = this.deps.resolveMilestoneFile(
819
- this.s.basePath,
820
- milestoneId,
821
- "ROADMAP",
822
- );
823
- if (!roadmapPath) {
824
- debugLog("WorktreeResolver", {
825
- action: "mergeAndExit",
826
- milestoneId,
827
- mode: "branch",
828
- skipped: true,
829
- reason: "no-roadmap",
830
- });
831
- return false;
832
- }
833
-
834
- const roadmapContent = this.deps.readFileSync(roadmapPath, "utf-8");
835
- const mergeResult = this.deps.mergeMilestoneToMain(
836
- this.s.basePath,
837
- milestoneId,
838
- roadmapContent,
839
- );
840
-
841
- // Rebuild GitService after merge (branch HEAD changed)
842
- this.rebuildGitService();
843
-
844
- if (mergeResult.codeFilesChanged) {
845
- ctx.notify(
846
- `Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`,
847
- "info",
848
- );
849
- } else {
850
- ctx.notify(
851
- `WARNING: Milestone ${milestoneId} merged (branch mode) but contained NO code changes — only .gsd/ metadata. ` +
852
- `Review the milestone output and re-run if code is missing.`,
853
- "warning",
854
- );
855
- }
856
- debugLog("WorktreeResolver", {
857
- action: "mergeAndExit",
858
- milestoneId,
859
- mode: "branch",
860
- result: "success",
861
- });
862
- return true;
863
- } catch (err) {
864
- const msg = err instanceof Error ? err.message : String(err);
865
- debugLog("WorktreeResolver", {
866
- action: "mergeAndExit",
867
- milestoneId,
868
- mode: "branch",
869
- result: "error",
870
- error: msg,
871
- });
872
- ctx.notify(`Milestone merge failed (branch mode): ${msg}`, "warning");
873
- // Re-throw all errors so callers can apply their own recovery logic (#4380).
874
- throw err;
875
- }
876
- }
877
-
878
- // ── Merge and Enter Next ───────────────────────────────────────────────
879
-
880
- /**
881
- * Milestone transition: merge the current milestone, then enter the next one.
882
- *
883
- * This is the pattern used when the loop detects that the active milestone
884
- * has changed (e.g., current completed, next one is now active). The caller
885
- * is responsible for re-deriving state between the merge and the enter.
886
- */
887
- mergeAndEnterNext(
888
- currentMilestoneId: string,
889
- nextMilestoneId: string,
890
- ctx: NotifyCtx,
891
- ): void {
892
- debugLog("WorktreeResolver", {
893
- action: "mergeAndEnterNext",
894
- currentMilestoneId,
895
- nextMilestoneId,
896
- });
897
- try {
898
- this.mergeAndExit(currentMilestoneId, ctx);
899
- } catch (err) {
900
- // mergeAndExit emits a warning and restores state when it fails during
901
- // merge/cleanup. But if it throws before recovery runs (e.g., in
902
- // validateMilestoneId or emitJournalEvent), basePath won't be restored
903
- // to projectRoot — re-throw so we don't enter the next milestone with
904
- // the current one unmerged.
905
- if (this.s.basePath !== this.projectRoot) throw err;
906
- }
907
- this.enterMilestone(nextMilestoneId, ctx);
908
- }
909
- }