gsd-pi 2.80.0 → 2.81.0

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 (1172) hide show
  1. package/README.md +35 -59
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/github-sync/templates.js +90 -74
  18. package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
  19. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  20. package/dist/resources/extensions/gsd/auto/loop.js +462 -525
  21. package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
  22. package/dist/resources/extensions/gsd/auto/phases.js +311 -154
  23. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  24. package/dist/resources/extensions/gsd/auto/run-unit.js +41 -45
  25. package/dist/resources/extensions/gsd/auto/session.js +9 -1
  26. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  30. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  32. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  33. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +80 -0
  34. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  35. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  36. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  37. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  38. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  39. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  40. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  41. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  42. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  43. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  44. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  45. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +23 -0
  46. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -15
  47. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  48. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  49. package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
  50. package/dist/resources/extensions/gsd/auto-prompts.js +382 -20
  51. package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
  52. package/dist/resources/extensions/gsd/auto-start.js +254 -17
  53. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  54. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  55. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  56. package/dist/resources/extensions/gsd/auto-worktree.js +316 -374
  57. package/dist/resources/extensions/gsd/auto.js +273 -87
  58. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +136 -11
  59. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +54 -37
  60. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  61. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  62. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  63. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  64. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  65. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  66. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +349 -57
  67. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  68. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  69. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +147 -2
  70. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  71. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  72. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  73. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  74. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  75. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  76. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  77. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  78. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  79. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  80. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  81. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  82. package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
  83. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  84. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  85. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  86. package/dist/resources/extensions/gsd/db-base-schema.js +353 -0
  87. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  88. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  89. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  90. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  91. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  92. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  93. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  94. package/dist/resources/extensions/gsd/db-migration-steps.js +416 -0
  95. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  96. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  97. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  98. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  99. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  100. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  101. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  102. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  103. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  104. package/dist/resources/extensions/gsd/detection.js +106 -0
  105. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  106. package/dist/resources/extensions/gsd/escalation.js +2 -0
  107. package/dist/resources/extensions/gsd/git-service.js +73 -5
  108. package/dist/resources/extensions/gsd/graph.js +9 -3
  109. package/dist/resources/extensions/gsd/gsd-db.js +331 -1535
  110. package/dist/resources/extensions/gsd/guided-flow.js +149 -48
  111. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  112. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  113. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  114. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  115. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  116. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  117. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  118. package/dist/resources/extensions/gsd/model-router.js +9 -6
  119. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  120. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  121. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  122. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  123. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  124. package/dist/resources/extensions/gsd/post-execution-checks.js +2 -0
  125. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  126. package/dist/resources/extensions/gsd/pre-execution-checks.js +24 -0
  127. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  128. package/dist/resources/extensions/gsd/prompt-loader.js +37 -7
  129. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +41 -35
  130. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  131. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  132. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  133. package/dist/resources/extensions/gsd/prompts/execute-task.md +42 -67
  134. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  135. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  136. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  137. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  138. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  139. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  140. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  141. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  142. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  143. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  144. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  145. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  146. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  147. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  148. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  149. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  150. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  151. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  152. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  153. package/dist/resources/extensions/gsd/quick.js +34 -2
  154. package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
  155. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  156. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  157. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  158. package/dist/resources/extensions/gsd/state-reconciliation.js +27 -0
  159. package/dist/resources/extensions/gsd/state.js +4 -0
  160. package/dist/resources/extensions/gsd/tool-contract.js +50 -0
  161. package/dist/resources/extensions/gsd/tools/complete-milestone.js +20 -16
  162. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -1
  163. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  164. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  165. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  166. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  167. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  168. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  169. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  170. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +7 -2
  171. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  172. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  173. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  174. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  175. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  176. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  177. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  178. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  179. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  180. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  181. package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
  182. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  183. package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
  184. package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
  185. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  186. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  187. package/dist/web/standalone/.next/BUILD_ID +1 -1
  188. package/dist/web/standalone/.next/app-path-routes-manifest.json +3 -3
  189. package/dist/web/standalone/.next/build-manifest.json +3 -3
  190. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  191. package/dist/web/standalone/.next/required-server-files.json +1 -1
  192. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  194. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  203. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  258. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  268. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  272. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/index.html +1 -1
  275. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  276. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  277. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  278. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  279. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  280. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/app-paths-manifest.json +3 -3
  283. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  284. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  285. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/middleware.js +2 -2
  288. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  289. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  290. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  291. package/dist/web/standalone/.next/static/chunks/app/{page-ff639266d978f2a0.js → page-200592a7f3baf579.js} +1 -1
  292. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-de742b64187e13fe.js} +1 -1
  293. package/dist/web/standalone/package.json +1 -0
  294. package/dist/web/standalone/server.js +1 -1
  295. package/dist/welcome-screen.d.ts +2 -0
  296. package/dist/welcome-screen.js +9 -7
  297. package/package.json +20 -9
  298. package/packages/contracts/dist/index.d.ts +3 -0
  299. package/packages/contracts/dist/index.d.ts.map +1 -0
  300. package/packages/contracts/dist/index.js +5 -0
  301. package/packages/contracts/dist/index.js.map +1 -0
  302. package/packages/contracts/dist/rpc.d.ts +549 -0
  303. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  304. package/packages/contracts/dist/rpc.js +53 -0
  305. package/packages/contracts/dist/rpc.js.map +1 -0
  306. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  307. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  308. package/packages/contracts/dist/rpc.test.js +47 -0
  309. package/packages/contracts/dist/rpc.test.js.map +1 -0
  310. package/packages/contracts/dist/workflow.d.ts +180 -0
  311. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  312. package/packages/contracts/dist/workflow.js +201 -0
  313. package/packages/contracts/dist/workflow.js.map +1 -0
  314. package/packages/contracts/package.json +39 -0
  315. package/packages/contracts/src/index.ts +5 -0
  316. package/packages/contracts/src/rpc.test.ts +72 -0
  317. package/packages/contracts/src/rpc.ts +286 -0
  318. package/packages/contracts/src/workflow.ts +213 -0
  319. package/packages/contracts/tsconfig.json +25 -0
  320. package/packages/daemon/package.json +3 -2
  321. package/packages/daemon/src/event-bridge.test.ts +2 -1
  322. package/packages/daemon/src/event-bridge.ts +1 -1
  323. package/packages/daemon/src/event-formatter.test.ts +1 -2
  324. package/packages/daemon/src/event-formatter.ts +1 -2
  325. package/packages/daemon/src/session-manager.ts +2 -2
  326. package/packages/daemon/src/types.ts +3 -18
  327. package/packages/mcp-server/dist/server.d.ts +13 -0
  328. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  329. package/packages/mcp-server/dist/server.js +77 -0
  330. package/packages/mcp-server/dist/server.js.map +1 -1
  331. package/packages/mcp-server/dist/session-manager.js +1 -1
  332. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  333. package/packages/mcp-server/dist/types.d.ts +3 -11
  334. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  335. package/packages/mcp-server/dist/types.js.map +1 -1
  336. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  337. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  338. package/packages/mcp-server/dist/workflow-tools.js +24 -57
  339. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  340. package/packages/mcp-server/package.json +3 -2
  341. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  342. package/packages/mcp-server/src/server.ts +99 -1
  343. package/packages/mcp-server/src/session-manager.ts +2 -2
  344. package/packages/mcp-server/src/types.ts +7 -18
  345. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  346. package/packages/mcp-server/src/workflow-tools.ts +32 -56
  347. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  348. package/packages/native/package.json +1 -1
  349. package/packages/native/tsconfig.tsbuildinfo +1 -1
  350. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  351. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  352. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  353. package/packages/pi-agent-core/dist/agent.d.ts +9 -2
  354. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  355. package/packages/pi-agent-core/dist/agent.js +43 -11
  356. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  357. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  358. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  359. package/packages/pi-agent-core/dist/index.js +2 -0
  360. package/packages/pi-agent-core/dist/index.js.map +1 -1
  361. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  362. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  363. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  364. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  365. package/packages/pi-agent-core/dist/types.d.ts +31 -0
  366. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  367. package/packages/pi-agent-core/dist/types.js.map +1 -1
  368. package/packages/pi-agent-core/package.json +1 -1
  369. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  370. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  371. package/packages/pi-agent-core/src/agent.ts +52 -11
  372. package/packages/pi-agent-core/src/index.ts +2 -0
  373. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  374. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  375. package/packages/pi-agent-core/src/types.ts +26 -10
  376. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  377. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  378. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  379. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  380. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  381. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  382. package/packages/pi-ai/dist/models/index.js +8 -0
  383. package/packages/pi-ai/dist/models/index.js.map +1 -1
  384. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  385. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  386. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  387. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  388. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  389. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  390. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  391. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  392. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  393. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  394. package/packages/pi-ai/dist/providers/fake.js +319 -0
  395. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  396. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  397. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  398. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  399. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  400. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  401. package/packages/pi-ai/dist/types.d.ts +2 -0
  402. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  403. package/packages/pi-ai/dist/types.js.map +1 -1
  404. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  405. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  406. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  407. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  408. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  409. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  410. package/packages/pi-ai/package.json +1 -1
  411. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  412. package/packages/pi-ai/src/models/index.ts +9 -0
  413. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  414. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  415. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  416. package/packages/pi-ai/src/providers/fake.ts +376 -0
  417. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  418. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  419. package/packages/pi-ai/src/types.ts +3 -0
  420. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  421. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  422. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  423. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  424. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +36 -1
  425. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  427. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  428. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +21 -2
  429. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  430. package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
  431. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  433. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  434. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  435. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  437. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  439. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  440. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  441. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  442. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  443. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  444. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  445. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  446. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  447. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  448. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  449. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  450. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  451. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  452. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  454. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  456. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  458. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  459. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +60 -4
  460. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  463. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  465. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  466. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  468. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  469. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  470. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  471. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  472. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  473. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  474. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  475. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +24 -0
  476. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  477. package/packages/pi-coding-agent/dist/core/settings-manager.js +33 -0
  478. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  479. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  480. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  482. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  483. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  484. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  485. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  486. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  487. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  488. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  489. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  490. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  491. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  492. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  493. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  494. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  495. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  496. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  497. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  498. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  499. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  500. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  501. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  502. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  503. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  504. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  505. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  506. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  507. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  508. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  509. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  511. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  513. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  514. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  515. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  516. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  517. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  518. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  519. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  520. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  521. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  523. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  524. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  525. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  526. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  527. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  528. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  529. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  530. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  531. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  532. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  533. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  534. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  535. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  537. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  538. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +154 -14
  539. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  540. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  541. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  542. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  543. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  544. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  545. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  546. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  547. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  548. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  549. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  550. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  551. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
  552. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  553. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  554. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  555. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  556. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  557. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +51 -6
  558. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +22 -0
  560. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  561. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +262 -20
  562. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  564. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +86 -2
  565. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +111 -1
  567. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  568. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  569. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  570. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  571. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  572. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  573. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -1
  574. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  575. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +77 -11
  576. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  577. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  578. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  579. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  580. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  581. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  582. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  583. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  584. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  585. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  586. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  587. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  588. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  589. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  590. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  591. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  593. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  594. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  596. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  597. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  598. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  599. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  600. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  601. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
  602. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  603. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  604. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  605. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  606. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  607. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  608. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  609. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  610. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  611. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  612. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  613. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  614. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  615. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  616. package/packages/pi-coding-agent/package.json +2 -1
  617. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
  618. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  619. package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
  620. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  621. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  622. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  623. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  624. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  625. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  626. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  627. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  628. package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -2
  629. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  630. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  631. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  632. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  633. package/packages/pi-coding-agent/src/core/settings-manager.ts +51 -1
  634. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  635. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  636. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  637. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  638. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  639. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  640. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  641. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  642. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  643. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  644. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  645. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  646. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  647. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  648. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  649. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  650. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  651. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +217 -16
  652. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  653. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  654. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  655. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
  656. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  657. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +71 -9
  658. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +299 -20
  659. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +118 -1
  660. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +108 -3
  661. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  662. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  663. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +101 -11
  664. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  665. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  666. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  667. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  668. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  669. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
  670. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  671. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  672. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  673. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  674. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  675. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  676. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  677. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  678. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  679. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  680. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  681. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  682. package/packages/pi-tui/dist/index.d.ts +1 -0
  683. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  684. package/packages/pi-tui/dist/index.js +2 -0
  685. package/packages/pi-tui/dist/index.js.map +1 -1
  686. package/packages/pi-tui/dist/style.d.ts +41 -0
  687. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  688. package/packages/pi-tui/dist/style.js +158 -0
  689. package/packages/pi-tui/dist/style.js.map +1 -0
  690. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  691. package/packages/pi-tui/dist/tui.js +19 -8
  692. package/packages/pi-tui/dist/tui.js.map +1 -1
  693. package/packages/pi-tui/package.json +1 -1
  694. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  695. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  696. package/packages/pi-tui/src/index.ts +9 -0
  697. package/packages/pi-tui/src/style.ts +225 -0
  698. package/packages/pi-tui/src/tui.ts +21 -8
  699. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  700. package/packages/rpc-client/README.md +10 -3
  701. package/packages/rpc-client/dist/index.d.ts +1 -1
  702. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  703. package/packages/rpc-client/dist/index.js.map +1 -1
  704. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  705. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  706. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  707. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  708. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  709. package/packages/rpc-client/dist/rpc-types.js +3 -11
  710. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  711. package/packages/rpc-client/package.json +4 -1
  712. package/packages/rpc-client/src/index.ts +1 -1
  713. package/packages/rpc-client/src/rpc-client.ts +3 -6
  714. package/packages/rpc-client/src/rpc-types.ts +3 -398
  715. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  716. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  717. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  718. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  719. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  720. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  721. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  722. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  723. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  724. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  725. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  726. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  727. package/pkg/package.json +1 -1
  728. package/src/resources/GSD-WORKFLOW.md +2 -2
  729. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  730. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  731. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  732. package/src/resources/extensions/github-sync/sync.ts +8 -1
  733. package/src/resources/extensions/github-sync/templates.ts +93 -88
  734. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  735. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  736. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  737. package/src/resources/extensions/gsd/auto/contracts.ts +19 -2
  738. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  739. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
  740. package/src/resources/extensions/gsd/auto/loop.ts +540 -602
  741. package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
  742. package/src/resources/extensions/gsd/auto/phases.ts +427 -220
  743. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  744. package/src/resources/extensions/gsd/auto/run-unit.ts +52 -44
  745. package/src/resources/extensions/gsd/auto/session.ts +9 -1
  746. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  747. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -0
  748. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  749. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  750. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  751. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  752. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  753. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  754. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +159 -0
  755. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  756. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  757. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  758. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  759. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  760. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  761. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  762. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  763. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  764. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  765. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  766. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +51 -0
  767. package/src/resources/extensions/gsd/auto-dashboard.ts +81 -8
  768. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  769. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  770. package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
  771. package/src/resources/extensions/gsd/auto-prompts.ts +398 -19
  772. package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
  773. package/src/resources/extensions/gsd/auto-start.ts +326 -25
  774. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  775. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  776. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  777. package/src/resources/extensions/gsd/auto-worktree.ts +344 -396
  778. package/src/resources/extensions/gsd/auto.ts +336 -89
  779. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +162 -11
  780. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +56 -37
  781. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  782. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  783. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  784. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  785. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  786. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  787. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +406 -57
  788. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  789. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  790. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +153 -2
  791. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  792. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  793. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  794. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  795. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  796. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  797. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  798. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  799. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  800. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  801. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  802. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  803. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  804. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  805. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  806. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  807. package/src/resources/extensions/gsd/db-base-schema.ts +385 -0
  808. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  809. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  810. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  811. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  812. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  813. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  814. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  815. package/src/resources/extensions/gsd/db-migration-steps.ts +459 -0
  816. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  817. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  818. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  819. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  820. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  821. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  822. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  823. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  824. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  825. package/src/resources/extensions/gsd/detection.ts +128 -0
  826. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  827. package/src/resources/extensions/gsd/escalation.ts +3 -1
  828. package/src/resources/extensions/gsd/git-service.ts +87 -10
  829. package/src/resources/extensions/gsd/graph.ts +12 -5
  830. package/src/resources/extensions/gsd/gsd-db.ts +399 -1677
  831. package/src/resources/extensions/gsd/guided-flow.ts +175 -55
  832. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  833. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  834. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  835. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  836. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  837. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  838. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  839. package/src/resources/extensions/gsd/model-router.ts +10 -6
  840. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  841. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  842. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  843. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  844. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  845. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -1
  846. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  847. package/src/resources/extensions/gsd/pre-execution-checks.ts +27 -1
  848. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  849. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  850. package/src/resources/extensions/gsd/prompt-loader.ts +36 -7
  851. package/src/resources/extensions/gsd/prompts/complete-milestone.md +41 -35
  852. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  853. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  854. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  855. package/src/resources/extensions/gsd/prompts/execute-task.md +42 -67
  856. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  857. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  858. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  859. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  860. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  861. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  862. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  863. package/src/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  864. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  865. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  866. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  867. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  868. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  869. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  870. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  871. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  872. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  873. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  874. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  875. package/src/resources/extensions/gsd/quick.ts +37 -2
  876. package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
  877. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  878. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  879. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  880. package/src/resources/extensions/gsd/state-reconciliation.ts +57 -0
  881. package/src/resources/extensions/gsd/state.ts +6 -3
  882. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  883. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  884. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  885. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +7 -1
  886. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +133 -9
  887. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +660 -40
  888. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  889. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
  890. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  891. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  892. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +175 -11
  893. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -76
  894. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  895. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +184 -2
  896. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  897. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  898. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  899. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  900. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  901. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +142 -0
  902. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  903. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  904. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  905. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  906. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  907. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  908. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  909. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  910. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  911. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  912. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  913. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  914. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  915. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  916. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  917. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  918. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  919. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  920. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +159 -5
  921. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  922. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  923. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  924. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  925. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  926. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  927. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  928. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  929. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +162 -10
  930. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  931. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  932. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  933. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  934. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  935. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  936. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  937. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  938. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  939. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  940. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  941. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  942. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  943. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  944. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  945. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  946. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  947. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  948. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  949. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  950. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  951. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  952. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  953. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
  954. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  955. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  956. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  957. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  958. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  959. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  960. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  961. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  962. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  963. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  964. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  965. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  966. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +62 -0
  967. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  968. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  969. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  970. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  971. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  972. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  973. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  974. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  975. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  976. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  977. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  978. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  979. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  980. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  981. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  982. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  983. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +77 -0
  984. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  985. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  986. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  987. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  988. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  989. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  990. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  991. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +248 -10
  992. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  993. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  994. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  995. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  996. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  997. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  998. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +53 -43
  999. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +37 -7
  1000. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  1001. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  1002. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
  1003. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -98
  1004. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  1005. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  1006. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  1007. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  1008. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  1009. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  1010. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  1011. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +44 -9
  1012. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  1013. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  1014. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  1015. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  1016. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  1017. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +95 -75
  1018. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  1019. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  1020. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  1021. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  1022. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  1023. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  1024. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  1025. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  1026. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  1027. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  1028. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  1029. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  1030. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  1031. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  1032. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  1033. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  1034. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  1035. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  1036. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  1037. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -91
  1038. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  1039. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  1040. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  1041. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  1042. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  1043. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  1044. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  1045. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  1046. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  1047. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  1048. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  1049. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  1050. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  1051. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  1052. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
  1053. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  1054. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  1055. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  1056. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  1057. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  1058. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +222 -0
  1059. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  1060. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  1061. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  1062. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  1063. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  1064. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  1065. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  1066. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  1067. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  1068. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  1069. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  1070. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  1071. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  1072. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  1073. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  1074. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  1075. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
  1076. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  1077. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  1078. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  1079. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  1080. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  1081. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  1082. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  1083. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  1084. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  1085. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  1086. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  1087. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  1088. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +140 -8
  1089. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  1090. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  1091. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  1092. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  1093. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  1094. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  1095. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  1096. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  1097. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  1098. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  1099. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  1100. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  1101. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  1102. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +300 -0
  1103. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  1104. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  1105. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  1106. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  1107. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  1108. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  1109. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  1110. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  1111. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  1112. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  1113. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  1114. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  1115. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  1116. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  1117. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +35 -0
  1118. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  1119. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  1120. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +154 -0
  1121. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  1122. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  1123. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  1124. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  1125. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
  1126. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
  1127. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  1128. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  1129. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  1130. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  1131. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  1132. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +373 -76
  1133. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
  1134. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  1135. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  1136. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  1137. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  1138. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  1139. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  1140. package/src/resources/extensions/gsd/tools/complete-milestone.ts +29 -24
  1141. package/src/resources/extensions/gsd/tools/complete-task.ts +5 -2
  1142. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  1143. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  1144. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  1145. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  1146. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  1147. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  1148. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  1149. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +7 -2
  1150. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  1151. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  1152. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  1153. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  1154. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  1155. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  1156. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  1157. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  1158. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  1159. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  1160. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
  1161. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  1162. package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
  1163. package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
  1164. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  1165. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  1166. package/dist/resources/extensions/gsd/worktree-resolver.js +0 -733
  1167. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  1168. package/dist/web/standalone/.next/static/chunks/8336.6f6f30e410419aff.js +0 -10
  1169. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
  1170. package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
  1171. /package/dist/web/standalone/.next/static/{V-3Ehy4B24f9FCGiLPWIM → drLMkgfHQ8lzS229_HWYR}/_buildManifest.js +0 -0
  1172. /package/dist/web/standalone/.next/static/{V-3Ehy4B24f9FCGiLPWIM → drLMkgfHQ8lzS229_HWYR}/_ssgManifest.js +0 -0
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Auto-mode worktree lifecycle, merge, and cleanup management.
3
+
1
4
  /**
2
5
  * GSD Auto-Worktree -- lifecycle management for auto-mode worktrees.
3
6
  *
@@ -15,23 +18,22 @@ import {
15
18
  realpathSync,
16
19
  rmSync,
17
20
  unlinkSync,
18
- statSync,
19
21
  lstatSync as lstatSyncFn,
20
22
  } from "node:fs";
21
- import { isAbsolute, join, sep as pathSep } from "node:path";
23
+ import { isAbsolute, join, relative, sep as pathSep } from "node:path";
22
24
  import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
23
25
  import {
24
26
  reconcileWorktreeDb,
25
27
  isDbAvailable,
26
28
  getMilestone,
27
29
  getMilestoneSlices,
30
+ getSliceTasks,
28
31
  closeDatabase,
29
32
  openDatabase,
30
33
  getDbPath,
31
34
  } from "./gsd-db.js";
32
35
  import { atomicWriteSync } from "./atomic-write.js";
33
36
  import { execFileSync } from "node:child_process";
34
- import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
35
37
  import { gsdRoot, resolveGsdPathContract } from "./paths.js";
36
38
  import {
37
39
  createWorktree,
@@ -50,7 +52,8 @@ import {
50
52
  normalizeWorktreePathForCompare,
51
53
  resolveWorktreeProjectRoot,
52
54
  } from "./worktree-root.js";
53
- import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
55
+ import { MergeConflictError, createDraftPR, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
56
+ import { buildPrEvidence } from "./pr-evidence.js";
54
57
  import { debugLog } from "./debug-logger.js";
55
58
  import { logWarning, logError } from "./workflow-logger.js";
56
59
  import { loadEffectiveGSDPreferences } from "./preferences.js";
@@ -74,9 +77,15 @@ import {
74
77
  nativeUpdateRef,
75
78
  nativeIsAncestor,
76
79
  nativeMergeAbort,
80
+ nativeWorktreeList,
77
81
  } from "./native-git-bridge.js";
78
82
  import { gsdHome } from "./gsd-home.js";
79
83
  import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
84
+ import {
85
+ _finalizeProjectionForMergeImpl,
86
+ _projectRootToWorktreeImpl,
87
+ _projectWorktreeToRootImpl,
88
+ } from "./worktree-state-projection.js";
80
89
 
81
90
  const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
82
91
  const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
@@ -110,11 +119,6 @@ const ROOT_STATE_FILES = [
110
119
  // because the project root is authoritative for preferences (#2684).
111
120
  ] as const;
112
121
 
113
- const ROOT_DIAGNOSTIC_FILES = [
114
- "completed-units.json",
115
- "metrics.json",
116
- ] as const;
117
-
118
122
  /**
119
123
  * Pop a stash entry by tracking the unique marker embedded in its message so
120
124
  * concurrent stash operations against the same project root cannot cause us to
@@ -189,68 +193,46 @@ function isSamePath(a: string, b: string): boolean {
189
193
  }
190
194
  }
191
195
 
192
- // ─── ASSESSMENT Force-Sync Helper (#2821) ─────────────────────────────────
193
-
194
- /** Regex matching YAML frontmatter `verdict:` field. */
195
- const VERDICT_RE = /verdict:\s*[\w-]+/i;
196
-
197
- /**
198
- * Walk a milestone directory and force-overwrite ASSESSMENT files in the
199
- * destination when the source copy contains a `verdict:` field.
200
- *
201
- * This is the targeted fix for the UAT stuck-loop (#2821): the main
202
- * safeCopyRecursive uses force:false to protect worktree-local projection
203
- * files (#1886), but ASSESSMENT files written by run-uat must be
204
- * forward-synced when the project root has a verdict. Without this,
205
- * the worktree retains a stale FAIL or missing ASSESSMENT and
206
- * checkNeedsRunUat re-dispatches run-uat indefinitely.
207
- *
208
- * Only overwrites when the source has a verdict — never clobbers a
209
- * worktree ASSESSMENT with a verdictless project-root copy.
210
- */
211
- function forceOverwriteAssessmentsWithVerdict(
212
- srcMilestoneDir: string,
213
- dstMilestoneDir: string,
214
- ): void {
215
- if (!existsSync(srcMilestoneDir)) return;
216
-
217
- // Walk slices/<SID>/ looking for *-ASSESSMENT.md files
218
- const slicesDir = join(srcMilestoneDir, "slices");
219
- if (!existsSync(slicesDir)) return;
196
+ export function _isSamePath(a: string, b: string): boolean {
197
+ return isSamePath(a, b);
198
+ }
220
199
 
221
- try {
222
- for (const sliceEntry of readdirSync(slicesDir, { withFileTypes: true })) {
223
- if (!sliceEntry.isDirectory()) continue;
224
- const srcSliceDir = join(slicesDir, sliceEntry.name);
225
- 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
+ }
226
213
 
227
- try {
228
- for (const fileEntry of readdirSync(srcSliceDir, { withFileTypes: true })) {
229
- if (!fileEntry.isFile()) continue;
230
- 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
+ }
231
222
 
232
- const srcFile = join(srcSliceDir, fileEntry.name);
233
- try {
234
- const srcContent = readFileSync(srcFile, "utf-8");
235
- 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
+ }
236
228
 
237
- // Source has a verdict force-copy into worktree
238
- mkdirSync(dstSliceDir, { recursive: true });
239
- safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
240
- } catch (err) {
241
- /* non-fatal per file */
242
- logWarning("worktree", `assessment force-copy failed: ${err instanceof Error ? err.message : String(err)}`);
243
- }
244
- }
245
- } catch (err) {
246
- /* non-fatal per slice */
247
- logWarning("worktree", `assessment slice scan failed: ${err instanceof Error ? err.message : String(err)}`);
248
- }
249
- }
250
- } catch (err) {
251
- /* non-fatal */
252
- logWarning("worktree", `assessment sync failed: ${err instanceof Error ? err.message : String(err)}`);
253
- }
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;
254
236
  }
255
237
 
256
238
  // ─── Module State ──────────────────────────────────────────────────────────
@@ -266,6 +248,40 @@ function getActiveWorkspace(): GsdWorkspace | null {
266
248
  return activeWorkspace;
267
249
  }
268
250
 
251
+ function gitPathspecForWorktreePath(basePath: string, targetPath: string): string | null {
252
+ let base = basePath;
253
+ let target = targetPath;
254
+ try {
255
+ base = realpathSync.native(basePath);
256
+ } catch {
257
+ /* keep original */
258
+ void base;
259
+ }
260
+ try {
261
+ target = realpathSync.native(targetPath);
262
+ } catch {
263
+ /* keep original */
264
+ void target;
265
+ }
266
+
267
+ const rel = relative(base, target);
268
+ if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
269
+ return rel.replaceAll("\\", "/");
270
+ }
271
+
272
+ function gitRemoteExists(basePath: string, remote: string): boolean {
273
+ try {
274
+ execFileSync("git", ["remote", "get-url", remote], {
275
+ cwd: basePath,
276
+ stdio: ["ignore", "pipe", "pipe"],
277
+ encoding: "utf-8",
278
+ });
279
+ return true;
280
+ } catch {
281
+ return false;
282
+ }
283
+ }
284
+
269
285
  function clearProjectRootStateFiles(basePath: string, milestoneId: string): void {
270
286
  const gsdDir = gsdRoot(basePath);
271
287
  // Phase C pt 2: auto.lock removed from this list — the file is gone
@@ -301,11 +317,14 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
301
317
  for (const dir of syncedDirs) {
302
318
  try {
303
319
  if (existsSync(dir)) {
320
+ const pathspec = gitPathspecForWorktreePath(basePath, dir);
321
+ if (!pathspec) continue;
322
+
304
323
  // Only remove files that are untracked by git — tracked files are
305
324
  // managed by the branch checkout and should not be deleted.
306
325
  const untrackedOutput = execFileSync(
307
326
  "git",
308
- ["ls-files", "--others", "--exclude-standard", dir],
327
+ ["ls-files", "--others", "--exclude-standard", pathspec],
309
328
  { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
310
329
  ).trim();
311
330
  if (untrackedOutput) {
@@ -315,7 +334,7 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
315
334
  } catch (err) {
316
335
  // ENOENT/EISDIR are expected for already-removed or directory entries (#3597)
317
336
  const code = (err as NodeJS.ErrnoException).code;
318
- if (code !== "ENOENT" && code !== "EISDIR") {
337
+ if (!_isExpectedWorktreeUnlinkError(code)) {
319
338
  logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
320
339
  }
321
340
  }
@@ -348,6 +367,42 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
348
367
  filePath.startsWith(".gsd/") ||
349
368
  SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
350
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
+
351
406
  // ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
352
407
 
353
408
  /**
@@ -358,199 +413,30 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
358
413
  * Non-fatal — sync failure should never block dispatch.
359
414
  */
360
415
  /**
361
- * Scope-typed variant of syncProjectRootToWorktree.
362
- *
363
- * Takes an explicit (rootScope, worktreeScope) pair where rootScope is the
364
- * project root and worktreeScope is the auto-worktree. Direction is encoded
365
- * in argument order. Asserts both scopes belong to the same workspace identity
366
- * to prevent silent mismatch bugs.
367
- */
368
- export function syncProjectRootToWorktreeByScope(
369
- rootScope: MilestoneScope,
370
- worktreeScope: MilestoneScope,
371
- ): void {
372
- if (rootScope.workspace.identityKey !== worktreeScope.workspace.identityKey) {
373
- throw new Error(
374
- `syncProjectRootToWorktreeByScope: scope identity mismatch — ` +
375
- `rootScope.identityKey="${rootScope.workspace.identityKey}" ` +
376
- `worktreeScope.identityKey="${worktreeScope.workspace.identityKey}"`,
377
- );
378
- }
379
- if (rootScope.milestoneId !== worktreeScope.milestoneId) {
380
- throw new Error(
381
- `syncProjectRootToWorktreeByScope: milestoneId mismatch — ` +
382
- `rootScope.milestoneId="${rootScope.milestoneId}" worktreeScope.milestoneId="${worktreeScope.milestoneId}"`,
383
- );
384
- }
385
- const projectRoot = rootScope.workspace.projectRoot;
386
- const worktreePath_ = worktreeScope.workspace.worktreeRoot ?? worktreeScope.workspace.projectRoot;
387
- const milestoneId = rootScope.milestoneId;
388
- syncProjectRootToWorktree(projectRoot, worktreePath_, milestoneId);
389
- }
390
-
391
- /**
392
- * @deprecated Use syncProjectRootToWorktreeByScope instead.
393
- * 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.
394
420
  */
395
421
  export function syncProjectRootToWorktree(
396
422
  projectRoot: string,
397
423
  worktreePath_: string,
398
424
  milestoneId: string | null,
399
425
  ): void {
400
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot) return;
401
- if (!milestoneId) return;
402
-
403
- const contract = resolveGsdPathContract(worktreePath_, projectRoot);
404
- const prGsd = contract.projectGsd;
405
- const wtGsd = contract.worktreeGsd ?? join(worktreePath_, ".gsd");
406
-
407
- // When .gsd is a symlink to the same external directory in both locations,
408
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
409
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
410
- if (isSamePath(prGsd, wtGsd)) return;
411
-
412
- // Copy milestone directory from project root to worktree — additive only.
413
- // force:false prevents cpSync from overwriting existing worktree files.
414
- // Without this, worktree-local files (e.g. VALIDATION.md written
415
- // by validate-milestone) get clobbered by stale project root copies,
416
- // causing an infinite re-validation loop (#1886).
417
- safeCopyRecursive(
418
- join(prGsd, "milestones", milestoneId),
419
- join(wtGsd, "milestones", milestoneId),
420
- { force: false },
421
- );
422
-
423
- // Force-sync ASSESSMENT files that have a verdict from project root (#2821).
424
- // The additive-only copy above preserves worktree-local files, but
425
- // ASSESSMENT files are special: after run-uat writes a verdict and post-unit
426
- // syncs it to the project root, the worktree may retain a stale copy (e.g.
427
- // verdict:fail while the project root has verdict:pass from a retry). On
428
- // session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
429
- // persists, checkNeedsRunUat finds no passing verdict → re-dispatches
430
- // run-uat indefinitely (stuck-loop ×9).
431
- forceOverwriteAssessmentsWithVerdict(
432
- join(prGsd, "milestones", milestoneId),
433
- join(wtGsd, "milestones", milestoneId),
434
- );
435
-
436
- // Forward-sync completed-units.json from project root to worktree.
437
- // Project root is authoritative for completion state after crash recovery;
438
- // without this, the worktree re-dispatches already-completed units (#1886).
439
- safeCopy(
440
- join(prGsd, "completed-units.json"),
441
- join(wtGsd, "completed-units.json"),
442
- { force: true },
443
- );
444
-
445
- // Delete a legacy worktree-local gsd.db ONLY if it is empty (0 bytes).
446
- // Runtime opens contract.projectDb; this cleanup only removes corrupt
447
- // pre-upgrade local DB projections.
448
- try {
449
- const wtDb = join(wtGsd, "gsd.db");
450
- let deleteSidecars = false;
451
- if (existsSync(wtDb)) {
452
- const size = statSync(wtDb).size;
453
- if (size === 0) {
454
- unlinkSync(wtDb);
455
- deleteSidecars = true;
456
- }
457
- } else {
458
- // Main DB already missing — sidecars are orphaned from a previous
459
- // partial cleanup and must still be removed.
460
- deleteSidecars = true;
461
- }
462
- // Always clean up WAL/SHM sidecar files when the main DB was deleted
463
- // or is already missing. Orphaned WAL/SHM files cause SQLite WAL
464
- // recovery on next open, which triggers a CPU spin on Node 24's
465
- // node:sqlite DatabaseSync implementation (#2478).
466
- if (deleteSidecars) {
467
- for (const suffix of ["-wal", "-shm"]) {
468
- const f = wtDb + suffix;
469
- if (existsSync(f)) {
470
- unlinkSync(f);
471
- }
472
- }
473
- }
474
- } catch (err) {
475
- /* non-fatal */
476
- logWarning("worktree", `worktree DB cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
477
- }
478
- }
479
-
480
- /**
481
- * Scope-typed variant of syncStateToProjectRoot.
482
- *
483
- * Takes an explicit (worktreeScope, rootScope) pair. Direction is encoded in
484
- * argument order (worktree → root). Asserts both scopes belong to the same
485
- * workspace identity to prevent silent mismatch bugs.
486
- */
487
- export function syncStateToProjectRootByScope(
488
- worktreeScope: MilestoneScope,
489
- rootScope: MilestoneScope,
490
- ): void {
491
- if (worktreeScope.workspace.identityKey !== rootScope.workspace.identityKey) {
492
- throw new Error(
493
- `syncStateToProjectRootByScope: scope identity mismatch — ` +
494
- `worktreeScope.identityKey="${worktreeScope.workspace.identityKey}" ` +
495
- `rootScope.identityKey="${rootScope.workspace.identityKey}"`,
496
- );
497
- }
498
- if (worktreeScope.milestoneId !== rootScope.milestoneId) {
499
- throw new Error(
500
- `syncStateToProjectRootByScope: milestoneId mismatch — ` +
501
- `worktreeScope.milestoneId="${worktreeScope.milestoneId}" rootScope.milestoneId="${rootScope.milestoneId}"`,
502
- );
503
- }
504
- const worktreePath_ = worktreeScope.workspace.worktreeRoot ?? worktreeScope.workspace.projectRoot;
505
- const projectRoot = rootScope.workspace.projectRoot;
506
- const milestoneId = worktreeScope.milestoneId;
507
- syncStateToProjectRoot(worktreePath_, projectRoot, milestoneId);
426
+ _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
508
427
  }
509
428
 
510
429
  /**
511
- * Sync worktree diagnostics from worktree to project root.
512
- * Only runs when inside an auto-worktree (worktreePath differs from projectRoot).
513
- * DB/project-root state remains authoritative; markdown projections are not
514
- * copied from the worktree back to the project root.
515
- * Non-fatal — sync failure should never block dispatch.
516
- * @deprecated Use syncStateToProjectRootByScope instead.
517
- * 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.
518
433
  */
519
434
  export function syncStateToProjectRoot(
520
435
  worktreePath_: string,
521
436
  projectRoot: string,
522
437
  milestoneId: string | null,
523
438
  ): void {
524
- if (!worktreePath_ || !projectRoot || worktreePath_ === projectRoot) return;
525
- if (!milestoneId) return;
526
-
527
- const contract = resolveGsdPathContract(worktreePath_, projectRoot);
528
- const wtGsd = contract.worktreeGsd ?? join(worktreePath_, ".gsd");
529
- const prGsd = contract.projectGsd;
530
-
531
- // When .gsd is a symlink to the same external directory in both locations,
532
- // cpSync rejects the copy because source === destination (ERR_FS_CP_EINVAL).
533
- // Compare realpaths and skip when they resolve to the same physical path (#2184).
534
- if (isSamePath(wtGsd, prGsd)) return;
535
-
536
- // metrics.json — session cost/token tracking (#2313).
537
- // Without this, metrics accumulated in the worktree are invisible from the
538
- // project root and never appear in the dashboard or skill-health reports.
539
- safeCopy(join(wtGsd, "metrics.json"), join(prGsd, "metrics.json"), { force: true });
540
-
541
- // completed-units.json — runtime completion diagnostics used to avoid
542
- // re-dispatching work already completed in an isolated worktree.
543
- safeCopy(join(wtGsd, "completed-units.json"), join(prGsd, "completed-units.json"), { force: true });
544
-
545
- // Runtime records — unit dispatch diagnostics used by selfHealRuntimeRecords().
546
- // Without this, a crash during a unit leaves the runtime record only in the
547
- // worktree. If the next session resolves basePath before worktree re-entry,
548
- // selfHeal can't find or clear the stale record (#769).
549
- safeCopyRecursive(
550
- join(wtGsd, "runtime", "units"),
551
- join(prGsd, "runtime", "units"),
552
- { force: true },
553
- );
439
+ _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
554
440
  }
555
441
 
556
442
  // ─── Resource Staleness ───────────────────────────────────────────────────
@@ -912,51 +798,7 @@ export function syncWorktreeStateBack(
912
798
  worktreePath: string,
913
799
  milestoneId: string,
914
800
  ): { synced: string[] } {
915
- const contract = resolveGsdPathContract(worktreePath, mainBasePath);
916
- const mainGsd = contract.projectGsd;
917
- const wtGsd = contract.worktreeGsd ?? join(worktreePath, ".gsd");
918
- const synced: string[] = [];
919
-
920
- // If both resolve to the same directory (symlink), no sync needed
921
- if (isSamePath(mainGsd, wtGsd)) return { synced };
922
-
923
- if (!existsSync(wtGsd) || !existsSync(mainGsd)) return { synced };
924
-
925
- // ── 0. Pre-upgrade worktree DB reconciliation ────────────────────────
926
- // If the worktree has its own gsd.db (copied before the WAL transition),
927
- // reconcile its hierarchy data into the project root DB before syncing
928
- // files. This handles in-flight worktrees that were created before the
929
- // upgrade to shared WAL mode.
930
- const wtLocalDb = join(wtGsd, "gsd.db");
931
- const mainDb = contract.projectDb;
932
- if (existsSync(wtLocalDb) && existsSync(mainDb)) {
933
- try {
934
- reconcileWorktreeDb(mainDb, wtLocalDb);
935
- synced.push("gsd.db (pre-upgrade reconcile)");
936
- } catch (err) {
937
- // Non-fatal — file sync below is the fallback
938
- logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
939
- }
940
- }
941
-
942
- // ── 1. Sync root-level diagnostic files back ─────────────────────────
943
- // Markdown/JSON state projections remain project-root/DB authoritative.
944
- // These diagnostic files are copied for observability only.
945
- for (const f of ROOT_DIAGNOSTIC_FILES) {
946
- const src = join(wtGsd, f);
947
- const dst = join(mainGsd, f);
948
- if (existsSync(src)) {
949
- try {
950
- cpSync(src, dst, { force: true });
951
- synced.push(f);
952
- } catch (err) {
953
- /* non-fatal */
954
- logWarning("worktree", `state file copy-back failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
955
- }
956
- }
957
- }
958
-
959
- return { synced };
801
+ return _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
960
802
  }
961
803
  // ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
962
804
 
@@ -1054,19 +896,12 @@ export function enterBranchModeForMilestone(
1054
896
  const integrationBranch =
1055
897
  readIntegrationBranch(basePath, milestoneId) ?? undefined;
1056
898
  const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
1057
- // Validate main_branch preference exists in the repo before using it —
1058
- // a stale preference (e.g. "master" when repo uses "main") would cause
1059
- // nativeBranchForceReset to fail with a bad start-point reference.
1060
- const validatedPrefBranch =
1061
- gitPrefs?.main_branch &&
1062
- typeof gitPrefs.main_branch === "string" &&
1063
- gitPrefs.main_branch.length > 0 &&
1064
- nativeBranchExists(basePath, gitPrefs.main_branch)
1065
- ? gitPrefs.main_branch
1066
- : undefined;
1067
899
  const startPoint =
1068
- integrationBranch ??
1069
- validatedPrefBranch ??
900
+ _resolveAutoWorktreeStartPoint(
901
+ integrationBranch,
902
+ gitPrefs?.main_branch,
903
+ (branchName) => nativeBranchExists(basePath, branchName),
904
+ ) ??
1070
905
  nativeDetectMainBranch(basePath);
1071
906
 
1072
907
  // TOCTOU ancestry guard (Issue #4980 HIGH-3).
@@ -1139,6 +974,122 @@ export function enterBranchModeForMilestone(
1139
974
  * (both formerly here) became dead.
1140
975
  */
1141
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
+
1142
1093
  export function createAutoWorktree(
1143
1094
  basePath: string,
1144
1095
  milestoneId: string,
@@ -1165,6 +1116,12 @@ export function createAutoWorktree(
1165
1116
 
1166
1117
  let info: { name: string; path: string; branch: string; exists: boolean };
1167
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
+
1168
1125
  // Re-attach worktree to the existing milestone branch (preserving commits)
1169
1126
  info = createWorktree(basePath, milestoneId, {
1170
1127
  branch,
@@ -1181,14 +1138,11 @@ export function createAutoWorktree(
1181
1138
  const integrationBranch =
1182
1139
  readIntegrationBranch(basePath, milestoneId) ?? undefined;
1183
1140
  const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
1184
- const validatedPrefBranch =
1185
- gitPrefs?.main_branch &&
1186
- typeof gitPrefs.main_branch === "string" &&
1187
- gitPrefs.main_branch.length > 0 &&
1188
- nativeBranchExists(basePath, gitPrefs.main_branch)
1189
- ? gitPrefs.main_branch
1190
- : undefined;
1191
- const startPoint = integrationBranch ?? validatedPrefBranch ?? undefined;
1141
+ const startPoint = _resolveAutoWorktreeStartPoint(
1142
+ integrationBranch,
1143
+ gitPrefs?.main_branch,
1144
+ (branchName) => nativeBranchExists(basePath, branchName),
1145
+ );
1192
1146
  info = createWorktree(basePath, milestoneId, {
1193
1147
  branch,
1194
1148
  startPoint,
@@ -1284,7 +1238,7 @@ export function teardownAutoWorktree(
1284
1238
  const contract = resolveGsdPathContract(previousCwd, originalBasePath);
1285
1239
  const worktreeDbPath = join(contract.worktreeGsd ?? join(previousCwd, ".gsd"), "gsd.db");
1286
1240
  const mainDbPath = contract.projectDb;
1287
- if (existsSync(worktreeDbPath) && !isSamePath(worktreeDbPath, mainDbPath)) {
1241
+ if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
1288
1242
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1289
1243
  }
1290
1244
  } catch (err) {
@@ -1464,6 +1418,15 @@ export function getAutoWorktreeOriginalBase(): string | null {
1464
1418
  return getActiveWorkspace()?.projectRoot ?? null;
1465
1419
  }
1466
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
+ */
1467
1430
  export function _resetAutoWorktreeOriginalBaseForTests(): void {
1468
1431
  setActiveWorkspace(null);
1469
1432
  }
@@ -1583,7 +1546,7 @@ export function mergeMilestoneToMain(
1583
1546
  const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
1584
1547
  const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1585
1548
  const mainDbPath = contract.projectDb;
1586
- if (existsSync(worktreeDbPath) && !isSamePath(worktreeDbPath, mainDbPath)) {
1549
+ if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
1587
1550
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1588
1551
  }
1589
1552
  } catch (err) {
@@ -1593,18 +1556,27 @@ export function mergeMilestoneToMain(
1593
1556
  }
1594
1557
 
1595
1558
  // 2. Get completed slices for commit message
1596
- let completedSlices: { id: string; title: string }[] = [];
1559
+ let completedSlices: { id: string; title: string; tasks: Array<{ id: string; title: string }> }[] = [];
1597
1560
  if (isDbAvailable()) {
1598
1561
  completedSlices = getMilestoneSlices(milestoneId)
1599
1562
  .filter(s => s.status === "complete")
1600
- .map(s => ({ id: s.id, title: s.title }));
1563
+ .map(s => ({
1564
+ id: s.id,
1565
+ title: stripGsdDisplayPrefix(s.title, s.id) ?? s.id,
1566
+ tasks: getSliceTasks(milestoneId, s.id)
1567
+ .filter((task) => task.status === "complete")
1568
+ .map((task) => ({
1569
+ id: task.id,
1570
+ title: stripGsdDisplayPrefix(task.title, task.id) ?? task.id,
1571
+ })),
1572
+ }));
1601
1573
  }
1602
1574
  // Fallback: parse roadmap content when DB is unavailable
1603
1575
  if (completedSlices.length === 0 && roadmapContent) {
1604
1576
  const sliceRe = /- \[x\] \*\*(\w+):\s*(.+?)\*\*/gi;
1605
1577
  let m: RegExpExecArray | null;
1606
1578
  while ((m = sliceRe.exec(roadmapContent)) !== null) {
1607
- completedSlices.push({ id: m[1], title: m[2] });
1579
+ completedSlices.push({ id: m[1], title: m[2], tasks: [] });
1608
1580
  }
1609
1581
  }
1610
1582
 
@@ -1677,8 +1649,7 @@ export function mergeMilestoneToMain(
1677
1649
 
1678
1650
  // 6. Build rich commit message
1679
1651
  const dbMilestone = getMilestone(milestoneId);
1680
- let milestoneTitle =
1681
- (dbMilestone?.title ?? "").replace(/^M\d+:\s*/, "").trim();
1652
+ let milestoneTitle = stripGsdDisplayPrefix(dbMilestone?.title, milestoneId) ?? "";
1682
1653
  // Fallback: parse title from roadmap content header (e.g. "# M020: Backend foundation")
1683
1654
  if (!milestoneTitle && roadmapContent) {
1684
1655
  const titleMatch = roadmapContent.match(new RegExp(`^#\\s+${milestoneId}:\\s*(.+)`, "m"));
@@ -1686,14 +1657,21 @@ export function mergeMilestoneToMain(
1686
1657
  }
1687
1658
  milestoneTitle = milestoneTitle || milestoneId;
1688
1659
  const subject = `feat: ${milestoneTitle}`;
1660
+ const milestoneContext = milestoneTitle === milestoneId
1661
+ ? `Milestone: ${milestoneId}`
1662
+ : `Milestone: ${milestoneId} - ${milestoneTitle}`;
1689
1663
  let body = "";
1690
1664
  if (completedSlices.length > 0) {
1691
1665
  const sliceLines = completedSlices
1692
1666
  .map((s) => `- ${s.id}: ${s.title}`)
1693
1667
  .join("\n");
1694
- body = `\n\nCompleted slices:\n${sliceLines}\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1668
+ const taskLines = completedSlices
1669
+ .flatMap((s) => s.tasks.map((task) => `- ${s.id}/${task.id}: ${task.title}`))
1670
+ .join("\n");
1671
+ const taskBlock = taskLines ? `\n\nCompleted tasks:\n${taskLines}` : "";
1672
+ body = `\n\nCompleted slices:\n${sliceLines}${taskBlock}\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1695
1673
  } else {
1696
- body = `\n\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1674
+ body = `\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
1697
1675
  }
1698
1676
  const commitMessage = subject + body;
1699
1677
 
@@ -1901,15 +1879,7 @@ export function mergeMilestoneToMain(
1901
1879
  // or interrupted operation) causes `git merge --squash` to refuse with
1902
1880
  // "fatal: You have not concluded your merge (MERGE_HEAD exists)".
1903
1881
  // Defensively remove merge artifacts before starting.
1904
- try {
1905
- const gitDir_ = resolveGitDir(originalBasePath_);
1906
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1907
- const p = join(gitDir_, f);
1908
- if (existsSync(p)) unlinkSync(p);
1909
- }
1910
- } catch (err) { /* best-effort */
1911
- logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1912
- }
1882
+ removeMergeStateFiles(originalBasePath_, "pre-merge");
1913
1883
 
1914
1884
  // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1915
1885
  const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
@@ -1921,15 +1891,7 @@ export function mergeMilestoneToMain(
1921
1891
  if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
1922
1892
  // Defensively clean merge state — the native path may leave MERGE_HEAD
1923
1893
  // even when the merge is rejected (#2912).
1924
- try {
1925
- const gitDir_ = resolveGitDir(originalBasePath_);
1926
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1927
- const p = join(gitDir_, f);
1928
- if (existsSync(p)) unlinkSync(p);
1929
- }
1930
- } catch (err) { /* best-effort */
1931
- logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1932
- }
1894
+ removeMergeStateFiles(originalBasePath_, "dirty-tree rejection");
1933
1895
 
1934
1896
  // Pop stash before throwing so local work is not lost.
1935
1897
  if (stashed) {
@@ -1987,21 +1949,7 @@ export function mergeMilestoneToMain(
1987
1949
 
1988
1950
  // If there are still real code conflicts, escalate
1989
1951
  if (codeConflicts.length > 0) {
1990
- // Abort merge state so MERGE_HEAD is not left on disk (#2912).
1991
- // libgit2's merge creates MERGE_HEAD even for squash merges; if left
1992
- // dangling, subsequent merges fail and doctor reports corrupt state.
1993
- try { nativeMergeAbort(originalBasePath_); } catch (err) { /* best-effort */
1994
- logError("worktree", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
1995
- }
1996
- try {
1997
- const gitDir_ = resolveGitDir(originalBasePath_);
1998
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1999
- const p = join(gitDir_, f);
2000
- if (existsSync(p)) unlinkSync(p);
2001
- }
2002
- } catch (err) { /* best-effort */
2003
- logError("worktree", `merge state file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
2004
- }
1952
+ cleanupSquashConflictState(originalBasePath_);
2005
1953
 
2006
1954
  // Pop stash before throwing so local work is not lost (#2151).
2007
1955
  if (stashed) {
@@ -2039,15 +1987,7 @@ export function mergeMilestoneToMain(
2039
1987
  // of which trigger git's SQUASH_MSG cleanup. MERGE_HEAD is created by
2040
1988
  // libgit2's merge even in squash mode and is not removed by nativeCommit.
2041
1989
  // If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
2042
- try {
2043
- const gitDir_ = resolveGitDir(originalBasePath_);
2044
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
2045
- const p = join(gitDir_, f);
2046
- if (existsSync(p)) unlinkSync(p);
2047
- }
2048
- } catch (err) { /* best-effort */
2049
- logError("worktree", `post-commit merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
2050
- }
1990
+ removeMergeStateFiles(originalBasePath_, "post-commit");
2051
1991
 
2052
1992
  // 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
2053
1993
  // Pop after commit so stashed changes do not interfere with the squash merge
@@ -2187,16 +2127,18 @@ export function mergeMilestoneToMain(
2187
2127
  let pushed = false;
2188
2128
  if (prefs.auto_push === true && prefs.auto_pr !== true && !nothingToCommit) {
2189
2129
  const remote = prefs.remote ?? "origin";
2190
- try {
2191
- execFileSync("git", ["push", remote, mainBranch], {
2192
- cwd: originalBasePath_,
2193
- stdio: ["ignore", "pipe", "pipe"],
2194
- encoding: "utf-8",
2195
- });
2196
- pushed = true;
2197
- } catch (err) {
2198
- // Push failure is non-fatal
2199
- logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
2130
+ if (gitRemoteExists(originalBasePath_, remote)) {
2131
+ try {
2132
+ execFileSync("git", ["push", remote, mainBranch], {
2133
+ cwd: originalBasePath_,
2134
+ stdio: ["ignore", "pipe", "pipe"],
2135
+ encoding: "utf-8",
2136
+ });
2137
+ pushed = true;
2138
+ } catch (err) {
2139
+ // Push failure is non-fatal
2140
+ logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
2141
+ }
2200
2142
  }
2201
2143
  }
2202
2144
 
@@ -2205,29 +2147,35 @@ export function mergeMilestoneToMain(
2205
2147
  if (prefs.auto_pr === true && !nothingToCommit) {
2206
2148
  const remote = prefs.remote ?? "origin";
2207
2149
  const prTarget = prefs.pr_target_branch ?? mainBranch;
2208
- try {
2209
- // Push the milestone branch to remote first
2210
- execFileSync("git", ["push", remote, milestoneBranch], {
2211
- cwd: originalBasePath_,
2212
- stdio: ["ignore", "pipe", "pipe"],
2213
- encoding: "utf-8",
2214
- });
2215
- // Create PR via gh CLI with explicit --head and --base (#2302)
2216
- execFileSync("gh", [
2217
- "pr", "create", "--draft",
2218
- "--base", prTarget,
2219
- "--head", milestoneBranch,
2220
- "--title", `Milestone ${milestoneId} complete`,
2221
- "--body", "Auto-created by GSD on milestone completion.",
2222
- ], {
2223
- cwd: originalBasePath_,
2224
- stdio: ["ignore", "pipe", "pipe"],
2225
- encoding: "utf-8",
2226
- });
2227
- prCreated = true;
2228
- } catch (err) {
2229
- // PR creation failure is non-fatal — gh may not be installed or authenticated
2230
- logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
2150
+ if (gitRemoteExists(originalBasePath_, remote)) {
2151
+ try {
2152
+ // Push the milestone branch to remote first
2153
+ execFileSync("git", ["push", remote, milestoneBranch], {
2154
+ cwd: originalBasePath_,
2155
+ stdio: ["ignore", "pipe", "pipe"],
2156
+ encoding: "utf-8",
2157
+ });
2158
+ const prEvidence = buildPrEvidence({
2159
+ milestoneId,
2160
+ milestoneTitle,
2161
+ changeType: "feat",
2162
+ summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
2163
+ testsRun: ["Auto-created after milestone merge. Run `npm run verify:pr` before marking this draft ready."],
2164
+ rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
2165
+ how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
2166
+ });
2167
+ const prUrl = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
2168
+ head: milestoneBranch,
2169
+ base: prTarget,
2170
+ });
2171
+ if (!prUrl) {
2172
+ throw new Error("gh pr create returned no URL");
2173
+ }
2174
+ prCreated = true;
2175
+ } catch (err) {
2176
+ // PR creation failure is non-fatal — gh may not be installed or authenticated
2177
+ logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
2178
+ }
2231
2179
  }
2232
2180
  }
2233
2181