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
@@ -18,7 +18,6 @@ import {
18
18
  realpathSync,
19
19
  rmSync,
20
20
  unlinkSync,
21
- statSync,
22
21
  lstatSync as lstatSyncFn,
23
22
  } from "node:fs";
24
23
  import { isAbsolute, join, relative, sep as pathSep } from "node:path";
@@ -28,13 +27,13 @@ import {
28
27
  isDbAvailable,
29
28
  getMilestone,
30
29
  getMilestoneSlices,
30
+ getSliceTasks,
31
31
  closeDatabase,
32
32
  openDatabase,
33
33
  getDbPath,
34
34
  } from "./gsd-db.js";
35
35
  import { atomicWriteSync } from "./atomic-write.js";
36
36
  import { execFileSync } from "node:child_process";
37
- import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
38
37
  import { gsdRoot, resolveGsdPathContract } from "./paths.js";
39
38
  import {
40
39
  createWorktree,
@@ -78,9 +77,15 @@ import {
78
77
  nativeUpdateRef,
79
78
  nativeIsAncestor,
80
79
  nativeMergeAbort,
80
+ nativeWorktreeList,
81
81
  } from "./native-git-bridge.js";
82
82
  import { gsdHome } from "./gsd-home.js";
83
83
  import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
84
+ import {
85
+ _finalizeProjectionForMergeImpl,
86
+ _projectRootToWorktreeImpl,
87
+ _projectWorktreeToRootImpl,
88
+ } from "./worktree-state-projection.js";
84
89
 
85
90
  const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
86
91
  const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
@@ -114,11 +119,6 @@ const ROOT_STATE_FILES = [
114
119
  // because the project root is authoritative for preferences (#2684).
115
120
  ] as const;
116
121
 
117
- const ROOT_DIAGNOSTIC_FILES = [
118
- "completed-units.json",
119
- "metrics.json",
120
- ] as const;
121
-
122
122
  /**
123
123
  * Pop a stash entry by tracking the unique marker embedded in its message so
124
124
  * concurrent stash operations against the same project root cannot cause us to
@@ -193,68 +193,46 @@ function isSamePath(a: string, b: string): boolean {
193
193
  }
194
194
  }
195
195
 
196
- // ─── ASSESSMENT Force-Sync Helper (#2821) ─────────────────────────────────
197
-
198
- /** Regex matching YAML frontmatter `verdict:` field. */
199
- const VERDICT_RE = /verdict:\s*[\w-]+/i;
200
-
201
- /**
202
- * Walk a milestone directory and force-overwrite ASSESSMENT files in the
203
- * destination when the source copy contains a `verdict:` field.
204
- *
205
- * This is the targeted fix for the UAT stuck-loop (#2821): the main
206
- * safeCopyRecursive uses force:false to protect worktree-local projection
207
- * files (#1886), but ASSESSMENT files written by run-uat must be
208
- * forward-synced when the project root has a verdict. Without this,
209
- * the worktree retains a stale FAIL or missing ASSESSMENT and
210
- * checkNeedsRunUat re-dispatches run-uat indefinitely.
211
- *
212
- * Only overwrites when the source has a verdict — never clobbers a
213
- * worktree ASSESSMENT with a verdictless project-root copy.
214
- */
215
- function forceOverwriteAssessmentsWithVerdict(
216
- srcMilestoneDir: string,
217
- dstMilestoneDir: string,
218
- ): void {
219
- if (!existsSync(srcMilestoneDir)) return;
220
-
221
- // Walk slices/<SID>/ looking for *-ASSESSMENT.md files
222
- const slicesDir = join(srcMilestoneDir, "slices");
223
- if (!existsSync(slicesDir)) return;
196
+ export function _isSamePath(a: string, b: string): boolean {
197
+ return isSamePath(a, b);
198
+ }
224
199
 
225
- try {
226
- for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
227
- if (!sliceEntry.isDirectory()) continue;
228
- const srcSliceDir = join(slicesDir, sliceEntry.name);
229
- const dstSliceDir = join(dstMilestoneDir, "slices", sliceEntry.name);
200
+ export function _resolveAutoWorktreeStartPoint(
201
+ integrationBranch: string | null | undefined,
202
+ gitMainBranch: string | null | undefined,
203
+ branchExists: (branch: string) => boolean,
204
+ ): string | undefined {
205
+ if (integrationBranch) return integrationBranch;
206
+ return gitMainBranch &&
207
+ typeof gitMainBranch === "string" &&
208
+ gitMainBranch.length > 0 &&
209
+ branchExists(gitMainBranch)
210
+ ? gitMainBranch
211
+ : undefined;
212
+ }
230
213
 
231
- try {
232
- for (const fileEntry of readdirSync(srcSliceDir, { withFileTypes: true })) {
233
- if (!fileEntry.isFile()) continue;
234
- if (!fileEntry.name.endsWith("-ASSESSMENT.md")) continue;
214
+ export function _shouldReconcileWorktreeDb(
215
+ worktreeDbPath: string,
216
+ mainDbPath: string,
217
+ pathExists: (path: string) => boolean = existsSync,
218
+ samePath: (a: string, b: string) => boolean = isSamePath,
219
+ ): boolean {
220
+ return pathExists(worktreeDbPath) && !samePath(worktreeDbPath, mainDbPath);
221
+ }
235
222
 
236
- const srcFile = join(srcSliceDir, fileEntry.name);
237
- try {
238
- const srcContent = readFileSync(srcFile, "utf-8");
239
- if (!VERDICT_RE.test(srcContent)) continue; // no verdict in source — skip
223
+ export function _isExpectedWorktreeUnlinkError(
224
+ code: string | undefined,
225
+ ): boolean {
226
+ return code === "ENOENT" || code === "EISDIR";
227
+ }
240
228
 
241
- // Source has a verdict force-copy into worktree
242
- mkdirSync(dstSliceDir, { recursive: true });
243
- safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
244
- } catch (err) {
245
- /* non-fatal per file */
246
- logWarning("worktree", `assessment force-copy failed: ${err instanceof Error ? err.message : String(err)}`);
247
- }
248
- }
249
- } catch (err) {
250
- /* non-fatal per slice */
251
- logWarning("worktree", `assessment slice scan failed: ${err instanceof Error ? err.message : String(err)}`);
252
- }
253
- }
254
- } catch (err) {
255
- /* non-fatal */
256
- logWarning("worktree", `assessment sync failed: ${err instanceof Error ? err.message : String(err)}`);
257
- }
229
+ function stripGsdDisplayPrefix(value: string | undefined | null, id: string): string | undefined {
230
+ const raw = String(value ?? "").trim();
231
+ if (!raw) return undefined;
232
+ const lower = raw.toLowerCase();
233
+ const idLower = id.toLowerCase();
234
+ if (lower.startsWith(`${idLower}:`)) return raw.slice(id.length + 1).trim() || undefined;
235
+ return raw;
258
236
  }
259
237
 
260
238
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -356,7 +334,7 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
356
334
  } catch (err) {
357
335
  // ENOENT/EISDIR are expected for already-removed or directory entries (#3597)
358
336
  const code = (err as NodeJS.ErrnoException).code;
359
- if (code !== "ENOENT" && code !== "EISDIR") {
337
+ if (!_isExpectedWorktreeUnlinkError(code)) {
360
338
  logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
361
339
  }
362
340
  }
@@ -389,6 +367,42 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
389
367
  filePath.startsWith(".gsd/") ||
390
368
  SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
391
369
 
370
+ function removeMergeStateFiles(basePath: string, contextLabel: string): void {
371
+ try {
372
+ const gitDir_ = resolveGitDir(basePath);
373
+ for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
374
+ const p = join(gitDir_, f);
375
+ if (existsSync(p)) unlinkSync(p);
376
+ }
377
+ } catch (err) {
378
+ logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
379
+ }
380
+ }
381
+
382
+ function cleanupSquashConflictState(basePath: string): void {
383
+ // `git merge --squash` conflicts can leave unmerged index entries without
384
+ // MERGE_HEAD, so merge-abort alone is not enough. Reset the merge index, then
385
+ // remove merge message files that native/libgit2 paths may have created.
386
+ try {
387
+ nativeMergeAbort(basePath);
388
+ } catch (err) {
389
+ // Expected for squash conflicts when MERGE_HEAD was never written.
390
+ debugLog("squash-conflict-cleanup:merge-abort-skipped", {
391
+ error: err instanceof Error ? err.message : String(err),
392
+ });
393
+ }
394
+ try {
395
+ execFileSync("git", ["reset", "--merge"], {
396
+ cwd: basePath,
397
+ stdio: ["ignore", "pipe", "pipe"],
398
+ encoding: "utf-8",
399
+ });
400
+ } catch (err) {
401
+ logError("worktree", `git reset --merge failed after squash conflict: ${err instanceof Error ? err.message : String(err)}`);
402
+ }
403
+ removeMergeStateFiles(basePath, "squash conflict");
404
+ }
405
+
392
406
  // ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
393
407
 
394
408
  /**
@@ -399,199 +413,30 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
399
413
  * Non-fatal — sync failure should never block dispatch.
400
414
  */
401
415
  /**
402
- * Scope-typed variant of syncProjectRootToWorktree.
403
- *
404
- * Takes an explicit (rootScope, worktreeScope) pair where rootScope is the
405
- * project root and worktreeScope is the auto-worktree. Direction is encoded
406
- * in argument order. Asserts both scopes belong to the same workspace identity
407
- * to prevent silent mismatch bugs.
408
- */
409
- export function syncProjectRootToWorktreeByScope(
410
- rootScope: MilestoneScope,
411
- worktreeScope: MilestoneScope,
412
- ): void {
413
- if (rootScope.workspace.identityKey !== worktreeScope.workspace.identityKey) {
414
- throw new Error(
415
- `syncProjectRootToWorktreeByScope: scope identity mismatch — ` +
416
- `rootScope.identityKey="${rootScope.workspace.identityKey}" ` +
417
- `worktreeScope.identityKey="${worktreeScope.workspace.identityKey}"`,
418
- );
419
- }
420
- if (rootScope.milestoneId !== worktreeScope.milestoneId) {
421
- throw new Error(
422
- `syncProjectRootToWorktreeByScope: milestoneId mismatch — ` +
423
- `rootScope.milestoneId="${rootScope.milestoneId}" worktreeScope.milestoneId="${worktreeScope.milestoneId}"`,
424
- );
425
- }
426
- const projectRoot = rootScope.workspace.projectRoot;
427
- const worktreePath_ = worktreeScope.workspace.worktreeRoot ?? worktreeScope.workspace.projectRoot;
428
- const milestoneId = rootScope.milestoneId;
429
- syncProjectRootToWorktree(projectRoot, worktreePath_, milestoneId);
430
- }
431
-
432
- /**
433
- * @deprecated Use syncProjectRootToWorktreeByScope instead.
434
- * TODO(C-future): remove once all callers migrated.
416
+ * Path-string entry point to WorktreeStateProjection.projectRootToWorktree.
417
+ * Production code goes through the Module class; this delegator survives so
418
+ * the projection-invariant tests (#1886, #2184, #2478, #2821) can exercise
419
+ * the bodies with raw paths.
435
420
  */
436
421
  export function syncProjectRootToWorktree(
437
422
  projectRoot: string,
438
423
  worktreePath_: string,
439
424
  milestoneId: string | null,
440
425
  ): void {
441
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot) return;
442
- if (!milestoneId) return;
443
-
444
- const contract = resolveGsdPathContract(worktreePath_, projectRoot);
445
- const prGsd = contract.projectGsd;
446
- const wtGsd = contract.worktreeGsd ?? join(worktreePath_, ".gsd");
447
-
448
- // When .gsd is a symlink to the same external directory in both locations,
449
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
450
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
451
- if (isSamePath(prGsd, wtGsd)) return;
452
-
453
- // Copy milestone directory from project root to worktree — additive only.
454
- // force:false prevents cpSync from overwriting existing worktree files.
455
- // Without this, worktree-local files (e.g. VALIDATION.md written
456
- // by validate-milestone) get clobbered by stale project root copies,
457
- // causing an infinite re-validation loop (#1886).
458
- safeCopyRecursive(
459
- join(prGsd, "milestones", milestoneId),
460
- join(wtGsd, "milestones", milestoneId),
461
- { force: false },
462
- );
463
-
464
- // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
465
- // The additive-only copy above preserves worktree-local files, but
466
- // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
467
- // syncs it to the project root, the worktree may retain a stale copy (e.g.
468
- // verdict:fail while the project root has verdict:pass from a retry). On
469
- // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
470
- // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
471
- // run-uat indefinitely (stuck-loop ×9).
472
- forceOverwriteAssessmentsWithVerdict(
473
- join(prGsd, "milestones", milestoneId),
474
- join(wtGsd, "milestones", milestoneId),
475
- );
476
-
477
- // Forward-sync completed-units.json from project root to worktree.
478
- // Project root is authoritative for completion state after crash recovery;
479
- // without this, the worktree re-dispatches already-completed units (#1886).
480
- safeCopy(
481
- join(prGsd, "completed-units.json"),
482
- join(wtGsd, "completed-units.json"),
483
- { force: true },
484
- );
485
-
486
- // Delete a legacy worktree-local gsd.db ONLY if it is empty (0 bytes).
487
- // Runtime opens contract.projectDb; this cleanup only removes corrupt
488
- // pre-upgrade local DB projections.
489
- try {
490
- const wtDb = join(wtGsd, "gsd.db");
491
- let deleteSidecars = false;
492
- if (existsSync(wtDb)) {
493
- const size = statSync(wtDb).size;
494
- if (size === 0) {
495
- unlinkSync(wtDb);
496
- deleteSidecars = true;
497
- }
498
- } else {
499
- // Main DB already missing — sidecars are orphaned from a previous
500
- // partial cleanup and must still be removed.
501
- deleteSidecars = true;
502
- }
503
- // Always clean up WAL/SHM sidecar files when the main DB was deleted
504
- // or is already missing. Orphaned WAL/SHM files cause SQLite WAL
505
- // recovery on next open, which triggers a CPU spin on Node 24's
506
- // node:sqlite DatabaseSync implementation (#2478).
507
- if (deleteSidecars) {
508
- for (const suffix of ["-wal", "-shm"]) {
509
- const f = wtDb + suffix;
510
- if (existsSync(f)) {
511
- unlinkSync(f);
512
- }
513
- }
514
- }
515
- } catch (err) {
516
- /* non-fatal */
517
- logWarning("worktree", `worktree DB cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
518
- }
519
- }
520
-
521
- /**
522
- * Scope-typed variant of syncStateToProjectRoot.
523
- *
524
- * Takes an explicit (worktreeScope, rootScope) pair. Direction is encoded in
525
- * argument order (worktree → root). Asserts both scopes belong to the same
526
- * workspace identity to prevent silent mismatch bugs.
527
- */
528
- export function syncStateToProjectRootByScope(
529
- worktreeScope: MilestoneScope,
530
- rootScope: MilestoneScope,
531
- ): void {
532
- if (worktreeScope.workspace.identityKey !== rootScope.workspace.identityKey) {
533
- throw new Error(
534
- `syncStateToProjectRootByScope: scope identity mismatch — ` +
535
- `worktreeScope.identityKey="${worktreeScope.workspace.identityKey}" ` +
536
- `rootScope.identityKey="${rootScope.workspace.identityKey}"`,
537
- );
538
- }
539
- if (worktreeScope.milestoneId !== rootScope.milestoneId) {
540
- throw new Error(
541
- `syncStateToProjectRootByScope: milestoneId mismatch — ` +
542
- `worktreeScope.milestoneId="${worktreeScope.milestoneId}" rootScope.milestoneId="${rootScope.milestoneId}"`,
543
- );
544
- }
545
- const worktreePath_ = worktreeScope.workspace.worktreeRoot ?? worktreeScope.workspace.projectRoot;
546
- const projectRoot = rootScope.workspace.projectRoot;
547
- const milestoneId = worktreeScope.milestoneId;
548
- syncStateToProjectRoot(worktreePath_, projectRoot, milestoneId);
426
+ _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
549
427
  }
550
428
 
551
429
  /**
552
- * Sync worktree diagnostics from worktree to project root.
553
- * Only runs when inside an auto-worktree (worktreePath differs from projectRoot).
554
- * DB/project-root state remains authoritative; markdown projections are not
555
- * copied from the worktree back to the project root.
556
- * Non-fatal — sync failure should never block dispatch.
557
- * @deprecated Use syncStateToProjectRootByScope instead.
558
- * TODO(C-future): remove once all callers migrated.
430
+ * Path-string entry point to WorktreeStateProjection.projectWorktreeToRoot.
431
+ * Production code goes through the Module class; this delegator survives so
432
+ * the projection-invariant tests can exercise the body with raw paths.
559
433
  */
560
434
  export function syncStateToProjectRoot(
561
435
  worktreePath_: string,
562
436
  projectRoot: string,
563
437
  milestoneId: string | null,
564
438
  ): void {
565
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot) return;
566
- if (!milestoneId) return;
567
-
568
- const contract = resolveGsdPathContract(worktreePath_, projectRoot);
569
- const wtGsd = contract.worktreeGsd ?? join(worktreePath_, ".gsd");
570
- const prGsd = contract.projectGsd;
571
-
572
- // When .gsd is a symlink to the same external directory in both locations,
573
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
574
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
575
- if (isSamePath(wtGsd, prGsd)) return;
576
-
577
- // metrics.json — session cost/token tracking (#2313).
578
- // Without this, metrics accumulated in the worktree are invisible from the
579
- // project root and never appear in the dashboard or skill-health reports.
580
- safeCopy(join(wtGsd, "metrics.json"), join(prGsd, "metrics.json"), { force: true });
581
-
582
- // completed-units.json — runtime completion diagnostics used to avoid
583
- // re-dispatching work already completed in an isolated worktree.
584
- safeCopy(join(wtGsd, "completed-units.json"), join(prGsd, "completed-units.json"), { force: true });
585
-
586
- // Runtime records — unit dispatch diagnostics used by selfHealRuntimeRecords().
587
- // Without this, a crash during a unit leaves the runtime record only in the
588
- // worktree. If the next session resolves basePath before worktree re-entry,
589
- // selfHeal can't find or clear the stale record (#769).
590
- safeCopyRecursive(
591
- join(wtGsd, "runtime", "units"),
592
- join(prGsd, "runtime", "units"),
593
- { force: true },
594
- );
439
+ _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
595
440
  }
596
441
 
597
442
  // ─── Resource Staleness ───────────────────────────────────────────────────
@@ -953,51 +798,7 @@ export function syncWorktreeStateBack(
953
798
  worktreePath: string,
954
799
  milestoneId: string,
955
800
  ): { synced: string[] } {
956
- const contract = resolveGsdPathContract(worktreePath, mainBasePath);
957
- const mainGsd = contract.projectGsd;
958
- const wtGsd = contract.worktreeGsd ?? join(worktreePath, ".gsd");
959
- const synced: string[] = [];
960
-
961
- // If both resolve to the same directory (symlink), no sync needed
962
- if (isSamePath(mainGsd, wtGsd)) return { synced };
963
-
964
- if (!existsSync(wtGsd) || !existsSync(mainGsd)) return { synced };
965
-
966
- // ── 0. Pre-upgrade worktree DB reconciliation ────────────────────────
967
- // If the worktree has its own gsd.db (copied before the WAL transition),
968
- // reconcile its hierarchy data into the project root DB before syncing
969
- // files. This handles in-flight worktrees that were created before the
970
- // upgrade to shared WAL mode.
971
- const wtLocalDb = join(wtGsd, "gsd.db");
972
- const mainDb = contract.projectDb;
973
- if (existsSync(wtLocalDb) && existsSync(mainDb)) {
974
- try {
975
- reconcileWorktreeDb(mainDb, wtLocalDb);
976
- synced.push("gsd.db (pre-upgrade reconcile)");
977
- } catch (err) {
978
- // Non-fatal — file sync below is the fallback
979
- logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
980
- }
981
- }
982
-
983
- // ── 1. Sync root-level diagnostic files back ─────────────────────────
984
- // Markdown/JSON state projections remain project-root/DB authoritative.
985
- // These diagnostic files are copied for observability only.
986
- for (const f of ROOT_DIAGNOSTIC_FILES) {
987
- const src = join(wtGsd, f);
988
- const dst = join(mainGsd, f);
989
- if (existsSync(src)) {
990
- try {
991
- cpSync(src, dst, { force: true });
992
- synced.push(f);
993
- } catch (err) {
994
- /* non-fatal */
995
- logWarning("worktree", `state file copy-back failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
996
- }
997
- }
998
- }
999
-
1000
- return { synced };
801
+ return _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
1001
802
  }
1002
803
  // ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
1003
804
 
@@ -1095,19 +896,12 @@ export function enterBranchModeForMilestone(
1095
896
  const integrationBranch =
1096
897
  readIntegrationBranch(basePath, milestoneId) ?? undefined;
1097
898
  const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
1098
- // Validate main_branch preference exists in the repo before using it —
1099
- // a stale preference (e.g. "master" when repo uses "main") would cause
1100
- // nativeBranchForceReset to fail with a bad start-point reference.
1101
- const validatedPrefBranch =
1102
- gitPrefs?.main_branch &&
1103
- typeof gitPrefs.main_branch === "string" &&
1104
- gitPrefs.main_branch.length > 0 &&
1105
- nativeBranchExists(basePath, gitPrefs.main_branch)
1106
- ? gitPrefs.main_branch
1107
- : undefined;
1108
899
  const startPoint =
1109
- integrationBranch ??
1110
- validatedPrefBranch ??
900
+ _resolveAutoWorktreeStartPoint(
901
+ integrationBranch,
902
+ gitPrefs?.main_branch,
903
+ (branchName) => nativeBranchExists(basePath, branchName),
904
+ ) ??
1111
905
  nativeDetectMainBranch(basePath);
1112
906
 
1113
907
  // TOCTOU ancestry guard (Issue #4980 HIGH-3).
@@ -1180,6 +974,122 @@ export function enterBranchModeForMilestone(
1180
974
  * (both formerly here) became dead.
1181
975
  */
1182
976
 
977
+ /**
978
+ * True when `branch` is checked out in any worktree listed by
979
+ * `git worktree list --porcelain`. Used to gate ref updates that would
980
+ * otherwise leave a concurrent worktree's HEAD inconsistent with its
981
+ * index/working tree (Codex peer-review of #5538-followup).
982
+ *
983
+ * Best-effort: a `nativeWorktreeList` failure returns true so we err on
984
+ * the side of NOT moving the ref. Better to skip a fast-forward than to
985
+ * silently corrupt another worktree.
986
+ */
987
+ export function _isBranchCheckedOutElsewhere(
988
+ basePath: string,
989
+ branch: string,
990
+ ): boolean {
991
+ try {
992
+ const entries = nativeWorktreeList(basePath);
993
+ return entries.some((entry) => entry.branch === branch);
994
+ } catch {
995
+ return true;
996
+ }
997
+ }
998
+
999
+ /**
1000
+ * Resolve the integration branch using the same 3-tier fallback as the
1001
+ * fresh-create path: META.json → git.main_branch preference → detected
1002
+ * main branch. Returns null when no usable target exists.
1003
+ */
1004
+ function _resolveIntegrationBranchForReuse(
1005
+ basePath: string,
1006
+ milestoneId: string,
1007
+ ): string | null {
1008
+ const fromMeta = readIntegrationBranch(basePath, milestoneId);
1009
+ if (fromMeta) return fromMeta;
1010
+
1011
+ const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
1012
+ const fromPref = gitPrefs?.main_branch &&
1013
+ typeof gitPrefs.main_branch === "string" &&
1014
+ gitPrefs.main_branch.length > 0 &&
1015
+ nativeBranchExists(basePath, gitPrefs.main_branch)
1016
+ ? gitPrefs.main_branch
1017
+ : null;
1018
+ if (fromPref) return fromPref;
1019
+
1020
+ try {
1021
+ return nativeDetectMainBranch(basePath);
1022
+ } catch {
1023
+ return null;
1024
+ }
1025
+ }
1026
+
1027
+ /**
1028
+ * When reusing an existing milestone branch, fast-forward it onto the
1029
+ * integration branch when that's safe (branch is a strict ancestor of
1030
+ * integration — no commits would be lost). Skips when the branch has its
1031
+ * own commits ahead of integration, when the integration branch can't be
1032
+ * resolved, or when any git operation fails — the merge gate at milestone
1033
+ * completion will surface real divergence as a conflict.
1034
+ *
1035
+ * The previous behavior re-attached the worktree to whatever stale tip
1036
+ * the branch held, which caused new milestone work to fork from a base
1037
+ * missing prior milestones' merges (#5538-followup).
1038
+ */
1039
+ export function fastForwardReusedMilestoneBranchIfSafe(
1040
+ basePath: string,
1041
+ milestoneId: string,
1042
+ branch: string,
1043
+ ): void {
1044
+ try {
1045
+ const integrationBranch = _resolveIntegrationBranchForReuse(basePath, milestoneId);
1046
+ if (!integrationBranch || integrationBranch === branch) return;
1047
+ if (!nativeBranchExists(basePath, integrationBranch)) return;
1048
+
1049
+ // Pure fast-forward only: branch must be a strict ancestor of integration.
1050
+ // If the branch has its own commits ahead, leave it alone.
1051
+ if (!nativeIsAncestor(basePath, branch, integrationBranch)) {
1052
+ debugLog("createAutoWorktree", {
1053
+ phase: "skip-ff-branch-not-ancestor",
1054
+ milestoneId,
1055
+ branch,
1056
+ integration: integrationBranch,
1057
+ });
1058
+ return;
1059
+ }
1060
+
1061
+ // Codex peer-review: `nativeUpdateRef` succeeds even when the branch is
1062
+ // currently checked out in another worktree, leaving that worktree's HEAD
1063
+ // inconsistent with its index/work tree. Skip the fast-forward if any
1064
+ // listed worktree has this branch checked out — the merge gate at
1065
+ // milestone-completion will surface stale-base divergence as a conflict
1066
+ // instead of silently corrupting the other worktree's state.
1067
+ if (_isBranchCheckedOutElsewhere(basePath, branch)) {
1068
+ debugLog("createAutoWorktree", {
1069
+ phase: "skip-ff-branch-checked-out-elsewhere",
1070
+ milestoneId,
1071
+ branch,
1072
+ });
1073
+ return;
1074
+ }
1075
+
1076
+ nativeUpdateRef(basePath, `refs/heads/${branch}`, integrationBranch);
1077
+ debugLog("createAutoWorktree", {
1078
+ phase: "fast-forward-reused-branch",
1079
+ milestoneId,
1080
+ branch,
1081
+ integration: integrationBranch,
1082
+ });
1083
+ } catch (err) {
1084
+ debugLog("createAutoWorktree", {
1085
+ phase: "fast-forward-reused-branch-failed",
1086
+ milestoneId,
1087
+ branch,
1088
+ error: err instanceof Error ? err.message : String(err),
1089
+ });
1090
+ }
1091
+ }
1092
+
1183
1093
  export function createAutoWorktree(
1184
1094
  basePath: string,
1185
1095
  milestoneId: string,
@@ -1206,6 +1116,12 @@ export function createAutoWorktree(
1206
1116
 
1207
1117
  let info: { name: string; path: string; branch: string; exists: boolean };
1208
1118
  if (branchExists) {
1119
+ // #5538-followup: fast-forward the reused branch onto the integration
1120
+ // branch when safe so the next milestone forks from up-to-date code.
1121
+ // Without this, a milestone that was created before another milestone
1122
+ // merged into main would carry a stale base into its worktree.
1123
+ fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch);
1124
+
1209
1125
  // Re-attach worktree to the existing milestone branch (preserving commits)
1210
1126
  info = createWorktree(basePath, milestoneId, {
1211
1127
  branch,
@@ -1222,14 +1138,11 @@ export function createAutoWorktree(
1222
1138
  const integrationBranch =
1223
1139
  readIntegrationBranch(basePath, milestoneId) ?? undefined;
1224
1140
  const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
1225
- const validatedPrefBranch =
1226
- gitPrefs?.main_branch &&
1227
- typeof gitPrefs.main_branch === "string" &&
1228
- gitPrefs.main_branch.length > 0 &&
1229
- nativeBranchExists(basePath, gitPrefs.main_branch)
1230
- ? gitPrefs.main_branch
1231
- : undefined;
1232
- const startPoint = integrationBranch ?? validatedPrefBranch ?? undefined;
1141
+ const startPoint = _resolveAutoWorktreeStartPoint(
1142
+ integrationBranch,
1143
+ gitPrefs?.main_branch,
1144
+ (branchName) => nativeBranchExists(basePath, branchName),
1145
+ );
1233
1146
  info = createWorktree(basePath, milestoneId, {
1234
1147
  branch,
1235
1148
  startPoint,
@@ -1325,7 +1238,7 @@ export function teardownAutoWorktree(
1325
1238
  const contract = resolveGsdPathContract(previousCwd, originalBasePath);
1326
1239
  const worktreeDbPath = join(contract.worktreeGsd ?? join(previousCwd, ".gsd"), "gsd.db");
1327
1240
  const mainDbPath = contract.projectDb;
1328
- if (existsSync(worktreeDbPath) && !isSamePath(worktreeDbPath, mainDbPath)) {
1241
+ if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
1329
1242
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1330
1243
  }
1331
1244
  } catch (err) {
@@ -1505,6 +1418,15 @@ export function getAutoWorktreeOriginalBase(): string | null {
1505
1418
  return getActiveWorkspace()?.projectRoot ?? null;
1506
1419
  }
1507
1420
 
1421
+ /**
1422
+ * Test-only — resets the module-level `activeWorkspace` registry between
1423
+ * runs. Production code never clears the registry directly; tests call this
1424
+ * in `beforeEach`/`afterEach` to isolate registry-mutating cases. Renaming
1425
+ * the underscore-prefixed `_*ForTest` exports it joins (slice 7 / step G of
1426
+ * ADR-016) was deliberate: those wrapped real production helpers and lost
1427
+ * the suffix; this one stays as the only legitimate test-scaffolding export
1428
+ * because it has no production caller.
1429
+ */
1508
1430
  export function _resetAutoWorktreeOriginalBaseForTests(): void {
1509
1431
  setActiveWorkspace(null);
1510
1432
  }
@@ -1580,6 +1502,14 @@ function autoCommitDirtyState(cwd: string): boolean {
1580
1502
  * On merge conflict: throws MergeConflictError.
1581
1503
  * On "nothing to commit" after squash: safe only if milestone work is already
1582
1504
  * on the integration branch. Throws if unanchored code changes would be lost.
1505
+ *
1506
+ * @internal **Do not call directly.** This is the inner squash-merge primitive
1507
+ * for the Worktree Lifecycle Module (ADR-016 phase 2 / A3, issue #5619).
1508
+ * Production callers must go through `WorktreeLifecycle.mergeMilestoneStandalone`
1509
+ * or `WorktreeLifecycle.exitMilestone({ merge: true })`. The export keyword
1510
+ * is preserved only so `auto.ts:buildWorktreeLifecycleDeps()` can wire this
1511
+ * function through the Module's deps seam — that is the construction of the
1512
+ * seam, not a bypass.
1583
1513
  */
1584
1514
  export function mergeMilestoneToMain(
1585
1515
  originalBasePath_: string,
@@ -1624,7 +1554,7 @@ export function mergeMilestoneToMain(
1624
1554
  const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
1625
1555
  const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1626
1556
  const mainDbPath = contract.projectDb;
1627
- if (existsSync(worktreeDbPath) && !isSamePath(worktreeDbPath, mainDbPath)) {
1557
+ if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
1628
1558
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1629
1559
  }
1630
1560
  } catch (err) {
@@ -1634,18 +1564,27 @@ export function mergeMilestoneToMain(
1634
1564
  }
1635
1565
 
1636
1566
  // 2. Get completed slices for commit message
1637
- let completedSlices: { id: string; title: string }[] = [];
1567
+ let completedSlices: { id: string; title: string; tasks: Array<{ id: string; title: string }> }[] = [];
1638
1568
  if (isDbAvailable()) {
1639
1569
  completedSlices = getMilestoneSlices(milestoneId)
1640
1570
  .filter(s => s.status === "complete")
1641
- .map(s => ({ id: s.id, title: s.title }));
1571
+ .map(s => ({
1572
+ id: s.id,
1573
+ title: stripGsdDisplayPrefix(s.title, s.id) ?? s.id,
1574
+ tasks: getSliceTasks(milestoneId, s.id)
1575
+ .filter((task) => task.status === "complete")
1576
+ .map((task) => ({
1577
+ id: task.id,
1578
+ title: stripGsdDisplayPrefix(task.title, task.id) ?? task.id,
1579
+ })),
1580
+ }));
1642
1581
  }
1643
1582
  // Fallback: parse roadmap content when DB is unavailable
1644
1583
  if (completedSlices.length === 0 && roadmapContent) {
1645
1584
  const sliceRe = /- \[x\] \*\*(\w+):\s*(.+?)\*\*/gi;
1646
1585
  let m: RegExpExecArray | null;
1647
1586
  while ((m = sliceRe.exec(roadmapContent)) !== null) {
1648
- completedSlices.push({ id: m[1], title: m[2] });
1587
+ completedSlices.push({ id: m[1], title: m[2], tasks: [] });
1649
1588
  }
1650
1589
  }
1651
1590
 
@@ -1718,8 +1657,7 @@ export function mergeMilestoneToMain(
1718
1657
 
1719
1658
  // 6. Build rich commit message
1720
1659
  const dbMilestone = getMilestone(milestoneId);
1721
- let milestoneTitle =
1722
- (dbMilestone?.title ?? "").replace(/^M\d+:\s*/, "").trim();
1660
+ let milestoneTitle = stripGsdDisplayPrefix(dbMilestone?.title, milestoneId) ?? "";
1723
1661
  // Fallback: parse title from roadmap content header (e.g. "# M020: Backend foundation")
1724
1662
  if (!milestoneTitle && roadmapContent) {
1725
1663
  const titleMatch = roadmapContent.match(new RegExp(`^#\\s+${milestoneId}:\\s*(.+)`, "m"));
@@ -1727,14 +1665,21 @@ export function mergeMilestoneToMain(
1727
1665
  }
1728
1666
  milestoneTitle = milestoneTitle || milestoneId;
1729
1667
  const subject = `feat: ${milestoneTitle}`;
1668
+ const milestoneContext = milestoneTitle === milestoneId
1669
+ ? `Milestone: ${milestoneId}`
1670
+ : `Milestone: ${milestoneId} - ${milestoneTitle}`;
1730
1671
  let body = "";
1731
1672
  if (completedSlices.length > 0) {
1732
1673
  const sliceLines = completedSlices
1733
1674
  .map((s) => `- ${s.id}: ${s.title}`)
1734
1675
  .join("\n");
1735
- body = `\n\nCompleted slices:\n${sliceLines}\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1676
+ const taskLines = completedSlices
1677
+ .flatMap((s) => s.tasks.map((task) => `- ${s.id}/${task.id}: ${task.title}`))
1678
+ .join("\n");
1679
+ const taskBlock = taskLines ? `\n\nCompleted tasks:\n${taskLines}` : "";
1680
+ body = `\n\nCompleted slices:\n${sliceLines}${taskBlock}\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1736
1681
  } else {
1737
- body = `\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1682
+ body = `\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1738
1683
  }
1739
1684
  const commitMessage = subject + body;
1740
1685
 
@@ -1942,15 +1887,7 @@ export function mergeMilestoneToMain(
1942
1887
  // or interrupted operation) causes `git merge --squash` to refuse with
1943
1888
  // "fatal: You have not concluded your merge (MERGE_HEAD exists)".
1944
1889
  // Defensively remove merge artifacts before starting.
1945
- try {
1946
- const gitDir_ = resolveGitDir(originalBasePath_);
1947
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1948
- const p = join(gitDir_, f);
1949
- if (existsSync(p)) unlinkSync(p);
1950
- }
1951
- } catch (err) { /* best-effort */
1952
- logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1953
- }
1890
+ removeMergeStateFiles(originalBasePath_, "pre-merge");
1954
1891
 
1955
1892
  // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1956
1893
  const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
@@ -1962,15 +1899,7 @@ export function mergeMilestoneToMain(
1962
1899
  if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
1963
1900
  // Defensively clean merge state — the native path may leave MERGE_HEAD
1964
1901
  // even when the merge is rejected (#2912).
1965
- try {
1966
- const gitDir_ = resolveGitDir(originalBasePath_);
1967
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1968
- const p = join(gitDir_, f);
1969
- if (existsSync(p)) unlinkSync(p);
1970
- }
1971
- } catch (err) { /* best-effort */
1972
- logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1973
- }
1902
+ removeMergeStateFiles(originalBasePath_, "dirty-tree rejection");
1974
1903
 
1975
1904
  // Pop stash before throwing so local work is not lost.
1976
1905
  if (stashed) {
@@ -2028,21 +1957,7 @@ export function mergeMilestoneToMain(
2028
1957
 
2029
1958
  // If there are still real code conflicts, escalate
2030
1959
  if (codeConflicts.length > 0) {
2031
- // Abort merge state so MERGE_HEAD is not left on disk (#2912).
2032
- // libgit2's merge creates MERGE_HEAD even for squash merges; if left
2033
- // dangling, subsequent merges fail and doctor reports corrupt state.
2034
- try { nativeMergeAbort(originalBasePath_); } catch (err) { /* best-effort */
2035
- logError("worktree", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
2036
- }
2037
- try {
2038
- const gitDir_ = resolveGitDir(originalBasePath_);
2039
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
2040
- const p = join(gitDir_, f);
2041
- if (existsSync(p)) unlinkSync(p);
2042
- }
2043
- } catch (err) { /* best-effort */
2044
- logError("worktree", `merge state file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
2045
- }
1960
+ cleanupSquashConflictState(originalBasePath_);
2046
1961
 
2047
1962
  // Pop stash before throwing so local work is not lost (#2151).
2048
1963
  if (stashed) {
@@ -2080,15 +1995,7 @@ export function mergeMilestoneToMain(
2080
1995
  // of which trigger git's SQUASH_MSG cleanup. MERGE_HEAD is created by
2081
1996
  // libgit2's merge even in squash mode and is not removed by nativeCommit.
2082
1997
  // If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
2083
- try {
2084
- const gitDir_ = resolveGitDir(originalBasePath_);
2085
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
2086
- const p = join(gitDir_, f);
2087
- if (existsSync(p)) unlinkSync(p);
2088
- }
2089
- } catch (err) { /* best-effort */
2090
- logError("worktree", `post-commit merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
2091
- }
1998
+ removeMergeStateFiles(originalBasePath_, "post-commit");
2092
1999
 
2093
2000
  // 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
2094
2001
  // Pop after commit so stashed changes do not interfere with the squash merge