@opengsd/gsd-pi 1.4.0-dev.c18009cd → 1.5.0-dev.553dc518

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 (274) hide show
  1. package/README.md +10 -10
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
  4. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
  5. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  6. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  7. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +4 -5
  8. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  9. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  10. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  11. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  12. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  13. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  14. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  15. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  16. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  17. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  18. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  19. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  20. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  21. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  22. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  24. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  25. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  26. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  27. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  32. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
  33. package/dist/resources/extensions/gsd/auto.js +9 -3
  34. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -1
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  37. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +118 -21
  38. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  39. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  40. package/dist/resources/extensions/gsd/db/queries.js +9 -9
  41. package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
  42. package/dist/resources/extensions/gsd/flat-phase-migration.js +14 -3
  43. package/dist/resources/extensions/gsd/forensics.js +1 -1
  44. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  45. package/dist/resources/extensions/gsd/git-service.js +45 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +11 -0
  47. package/dist/resources/extensions/gsd/guided-flow.js +6 -10
  48. package/dist/resources/extensions/gsd/markdown-renderer.js +15 -3
  49. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
  50. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  51. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  52. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  53. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  54. package/dist/resources/extensions/gsd/preferences-validation.js +82 -0
  55. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  56. package/dist/resources/extensions/gsd/quick.js +12 -3
  57. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  58. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  59. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  60. package/dist/resources/extensions/gsd/unit-registry.js +12 -2
  61. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  62. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  63. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  64. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  65. package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
  66. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  67. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  68. package/dist/web/standalone/.next/BUILD_ID +1 -1
  69. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  70. package/dist/web/standalone/.next/build-manifest.json +2 -2
  71. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  72. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.html +1 -1
  89. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  96. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  98. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  99. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  100. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  101. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  102. package/integrations/hermes/open_gsd_hermes/gsd_client.py +24 -35
  103. package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
  104. package/package.json +6 -6
  105. package/packages/cloud-mcp-gateway/package.json +2 -2
  106. package/packages/contracts/package.json +1 -1
  107. package/packages/daemon/package.json +4 -4
  108. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  109. package/packages/gsd-agent-core/package.json +5 -5
  110. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  111. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  112. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  113. package/packages/gsd-agent-modes/package.json +7 -7
  114. package/packages/mcp-server/package.json +4 -4
  115. package/packages/native/package.json +1 -1
  116. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  117. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  118. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  119. package/packages/pi-agent-core/package.json +1 -1
  120. package/packages/pi-ai/dist/index.d.ts +1 -0
  121. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  122. package/packages/pi-ai/dist/index.js +1 -0
  123. package/packages/pi-ai/dist/index.js.map +1 -1
  124. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  125. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  126. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  127. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  128. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  129. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  130. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  131. package/packages/pi-ai/dist/types.d.ts +8 -20
  132. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  133. package/packages/pi-ai/dist/types.js.map +1 -1
  134. package/packages/pi-ai/package.json +1 -1
  135. package/packages/pi-coding-agent/package.json +7 -7
  136. package/packages/pi-tui/package.json +2 -2
  137. package/packages/rpc-client/package.json +2 -2
  138. package/pkg/dist/core/export-html/template.js +53 -4
  139. package/pkg/package.json +1 -1
  140. package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
  141. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
  142. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  143. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  144. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +4 -5
  145. package/src/resources/extensions/gsd/auto-start.ts +4 -2
  146. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  147. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  148. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  149. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  150. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  151. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  152. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  153. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  154. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  155. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  156. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  157. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  158. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  159. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  160. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  161. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  162. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  163. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  164. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  165. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  166. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  167. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  168. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  169. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
  170. package/src/resources/extensions/gsd/auto.ts +11 -17
  171. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  172. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -1
  173. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  174. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +152 -21
  175. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  176. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  177. package/src/resources/extensions/gsd/db/queries.ts +9 -9
  178. package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
  179. package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -3
  180. package/src/resources/extensions/gsd/forensics.ts +1 -1
  181. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  182. package/src/resources/extensions/gsd/git-service.ts +53 -0
  183. package/src/resources/extensions/gsd/gsd-db.ts +13 -0
  184. package/src/resources/extensions/gsd/guided-flow.ts +7 -11
  185. package/src/resources/extensions/gsd/markdown-renderer.ts +15 -3
  186. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
  187. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  188. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  189. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  190. package/src/resources/extensions/gsd/preferences-types.ts +30 -0
  191. package/src/resources/extensions/gsd/preferences-validation.ts +69 -0
  192. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  193. package/src/resources/extensions/gsd/quick.ts +11 -3
  194. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  195. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  196. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  197. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  198. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
  199. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  200. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  201. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  202. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  203. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  204. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  205. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  206. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  207. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  208. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  209. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  210. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  211. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  212. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  213. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  214. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  215. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
  216. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  217. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +44 -1
  218. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
  219. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  220. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  221. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  222. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  223. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  224. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  225. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  226. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  227. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  228. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  229. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  230. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  231. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  232. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  233. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  234. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
  235. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
  236. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  237. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  238. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  239. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  240. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
  241. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  242. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  243. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  244. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  245. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  246. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  247. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  248. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  249. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  250. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  251. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +103 -0
  252. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  253. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
  254. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  255. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  256. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  257. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  258. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  259. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  260. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  261. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  262. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
  263. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  264. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  265. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  266. package/src/resources/extensions/gsd/unit-registry.ts +16 -2
  267. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  268. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  269. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  270. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  271. package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
  272. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  273. /package/dist/web/standalone/.next/static/{L2UMqXELiDH3oz-7yguXp → ZpFDazP-38PXBPiI_LdZf}/_buildManifest.js +0 -0
  274. /package/dist/web/standalone/.next/static/{L2UMqXELiDH3oz-7yguXp → ZpFDazP-38PXBPiI_LdZf}/_ssgManifest.js +0 -0
@@ -0,0 +1,33 @@
1
+ // gsd-pi — Regression tests: system.md documents the flat-phase layout, not legacy milestone/slice/task paths
2
+
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+ import { readFileSync } from "node:fs";
6
+ import { join } from "node:path";
7
+
8
+ const promptsDir = join(process.cwd(), "src/resources/extensions/gsd/prompts");
9
+
10
+ function readPrompt(name: string): string {
11
+ return readFileSync(join(promptsDir, `${name}.md`), "utf-8");
12
+ }
13
+
14
+ test("system.md does not advertise legacy milestone/slice/task artifact paths", () => {
15
+ const prompt = readPrompt("system");
16
+ for (const legacy of [".gsd/milestones", "milestones/M001", "slices/S01", "tasks/T01-PLAN.md"]) {
17
+ assert.ok(
18
+ !prompt.includes(legacy),
19
+ `system.md must not reference the legacy path fragment "${legacy}" after flat-phase migration`,
20
+ );
21
+ }
22
+ });
23
+
24
+ test("system.md documents the flat-phase directory structure", () => {
25
+ const prompt = readPrompt("system");
26
+ assert.match(prompt, /phases\/\{MM\}-\{slug\}/, "system.md must document phases/{MM}-{slug}/ directories");
27
+ assert.match(prompt, /\{MM\}-\{SS\}-PLAN\.md/, "system.md must document {MM}-{SS}-PLAN.md slice plans");
28
+ assert.match(
29
+ prompt,
30
+ /do not expect `tasks\/T##-PLAN\.md`/,
31
+ "system.md must state task plan content lives inside the slice plan, not tasks/T##-PLAN.md",
32
+ );
33
+ });
@@ -36,13 +36,13 @@ import { join } from "node:path";
36
36
  import { tmpdir } from "node:os";
37
37
  import { execFileSync } from "node:child_process";
38
38
 
39
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
39
40
  import {
40
- createAutoWorktree,
41
- teardownAutoWorktree,
42
- getAutoWorktreeOriginalBase,
43
41
  getActiveAutoWorktreeContext,
42
+ getAutoWorktreeOriginalBase,
44
43
  _resetAutoWorktreeOriginalBaseForTests,
45
- } from "../auto-worktree.ts";
44
+ } from "../auto-worktree-session-registry.ts";
45
+ import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
46
46
 
47
47
  // ─── Helpers ─────────────────────────────────────────────────────────────────
48
48
 
@@ -22,7 +22,8 @@ import { join } from "node:path";
22
22
  import { tmpdir } from "node:os";
23
23
  import { execFileSync } from "node:child_process";
24
24
 
25
- import { teardownAutoWorktree, _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree.ts";
25
+ import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
26
+ import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
26
27
 
27
28
  function git(args: string[], cwd: string): void {
28
29
  execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
@@ -38,13 +38,13 @@ import { join } from "node:path";
38
38
  import { tmpdir } from "node:os";
39
39
  import { execFileSync } from "node:child_process";
40
40
 
41
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
41
42
  import {
42
- createAutoWorktree,
43
- teardownAutoWorktree,
44
- getAutoWorktreeOriginalBase,
45
43
  getActiveAutoWorktreeContext,
44
+ getAutoWorktreeOriginalBase,
46
45
  _resetAutoWorktreeOriginalBaseForTests,
47
- } from "../auto-worktree.ts";
46
+ } from "../auto-worktree-session-registry.ts";
47
+ import { teardownAutoWorktree } from "../auto-worktree-teardown.ts";
48
48
 
49
49
  // ─── Helpers ─────────────────────────────────────────────────────────────────
50
50
 
@@ -7,6 +7,7 @@ import { test } from 'node:test';
7
7
  import assert from 'node:assert/strict';
8
8
  import {
9
9
  checkToolCallLoop,
10
+ configureToolCallLoopGuard,
10
11
  recordToolCallLoopMutation,
11
12
  resetToolCallLoopGuard,
12
13
  disableToolCallLoopGuard,
@@ -448,3 +449,105 @@ console.log('\n── Loop guard: browser exemption does not widen to other tool
448
449
  }
449
450
 
450
451
  // ═══════════════════════════════════════════════════════════════════════════
452
+ // Configurable thresholds (#1198)
453
+ // ═══════════════════════════════════════════════════════════════════════════
454
+
455
+ console.log('\n── Loop guard: master switch disables both guards (#1198) ──');
456
+
457
+ {
458
+ configureToolCallLoopGuard({ enabled: false });
459
+ resetToolCallLoopGuard();
460
+ // Neither identical-args nor per-tool cap should ever trip while disabled.
461
+ for (let i = 1; i <= 30; i++) {
462
+ const result = checkToolCallLoop('gsd_complete_milestone', { same: 'args' });
463
+ assert.ok(result.block === false, `disabled guard should allow call ${i}`);
464
+ }
465
+ // Restore defaults for subsequent tests.
466
+ configureToolCallLoopGuard(null);
467
+ }
468
+
469
+ console.log('\n── Loop guard: repeated_tool disabled keeps identical-args protection (#1198) ──');
470
+
471
+ {
472
+ configureToolCallLoopGuard({ repeated_tool: { enabled: false } });
473
+ resetToolCallLoopGuard();
474
+ // Per-tool cap is off: many varied-arg calls are allowed.
475
+ for (let i = 1; i <= 20; i++) {
476
+ const result = checkToolCallLoop('gsd_exec', { cmd: `run-${i}` });
477
+ assert.ok(result.block === false, `repeated_tool disabled should allow varied call ${i}`);
478
+ }
479
+ // Identical-args guard is still active.
480
+ resetToolCallLoopGuard();
481
+ for (let i = 1; i <= 4; i++) {
482
+ assert.ok(checkToolCallLoop('gsd_exec', { cmd: 'same' }).block === false);
483
+ }
484
+ const blocked = checkToolCallLoop('gsd_exec', { cmd: 'same' });
485
+ assert.ok(blocked.block === true, 'identical-args guard should still trip when repeated_tool is off');
486
+ assert.ok(blocked.reason?.includes('identical args'));
487
+ configureToolCallLoopGuard(null);
488
+ }
489
+
490
+ console.log('\n── Loop guard: raised caps allow more repeated calls (#1198) ──');
491
+
492
+ {
493
+ configureToolCallLoopGuard({ repeated_tool: { default_cap: 10 } });
494
+ resetToolCallLoopGuard();
495
+ for (let i = 1; i <= 10; i++) {
496
+ const result = checkToolCallLoop('gsd_complete_milestone', { arg: `v${i}` });
497
+ assert.ok(result.block === false, `raised-cap call ${i} should be allowed`);
498
+ }
499
+ const blocked = checkToolCallLoop('gsd_complete_milestone', { arg: 'v11' });
500
+ assert.ok(blocked.block === true, '11th call should trip the raised cap of 10');
501
+ assert.ok(blocked.reason?.includes('cap 10'), 'block message should mention the active cap');
502
+ assert.ok(blocked.reason?.includes('tool_call_loop_guard'), 'block message should mention the config key');
503
+ configureToolCallLoopGuard(null);
504
+ }
505
+
506
+ console.log('\n── Loop guard: user-added exempt tools bypass the per-tool cap (#1198) ──');
507
+
508
+ {
509
+ configureToolCallLoopGuard({ repeated_tool: { exempt_tools: ['ctx_execute'] } });
510
+ resetToolCallLoopGuard();
511
+ for (let i = 1; i <= 30; i++) {
512
+ const result = checkToolCallLoop('ctx_execute', { arg: `v${i}` });
513
+ assert.ok(result.block === false, `exempt tool call ${i} should be allowed`);
514
+ }
515
+ // Built-in exempt defaults are preserved alongside the user-added tool.
516
+ resetToolCallLoopGuard();
517
+ for (let i = 1; i <= 30; i++) {
518
+ assert.ok(checkToolCallLoop('read', { path: `f${i}` }).block === false, 'built-in exempt read should remain exempt');
519
+ }
520
+ configureToolCallLoopGuard(null);
521
+ }
522
+
523
+ console.log('\n── Loop guard: identical-args max is configurable (#1198) ──');
524
+
525
+ {
526
+ configureToolCallLoopGuard({ identical_args: { max_consecutive_calls: 2 } });
527
+ resetToolCallLoopGuard();
528
+ assert.ok(checkToolCallLoop('web_search', { q: 'x' }).block === false, 'call 1 allowed');
529
+ assert.ok(checkToolCallLoop('web_search', { q: 'x' }).block === false, 'call 2 allowed');
530
+ const blocked = checkToolCallLoop('web_search', { q: 'x' });
531
+ assert.ok(blocked.block === true, '3rd identical call should trip lowered max of 2');
532
+ assert.ok(blocked.reason?.includes('max 2'), 'block message should mention active max');
533
+ configureToolCallLoopGuard(null);
534
+ }
535
+
536
+ console.log('\n── Loop guard: env overrides win over preferences (#1198) ──');
537
+
538
+ {
539
+ process.env.GSD_TOOL_LOOP_REPEATED_DEFAULT_CAP = '2';
540
+ configureToolCallLoopGuard({ repeated_tool: { default_cap: 6 } });
541
+ resetToolCallLoopGuard();
542
+ assert.ok(checkToolCallLoop('gsd_complete_milestone', { a: '1' }).block === false, 'call 1 allowed');
543
+ assert.ok(checkToolCallLoop('gsd_complete_milestone', { a: '2' }).block === false, 'call 2 allowed');
544
+ const blocked = checkToolCallLoop('gsd_complete_milestone', { a: '3' });
545
+ assert.ok(blocked.block === true, 'env override cap of 2 should win over preference cap of 6');
546
+ delete process.env.GSD_TOOL_LOOP_REPEATED_DEFAULT_CAP;
547
+ configureToolCallLoopGuard(null);
548
+ }
549
+
550
+ // ═══════════════════════════════════════════════════════════════════════════
551
+ // Reset restores default guard state after configuration tests
552
+ // ═══════════════════════════════════════════════════════════════════════════
553
+ resetToolCallLoopGuard();
@@ -30,7 +30,7 @@ import { join } from "node:path";
30
30
  import { tmpdir } from "node:os";
31
31
  import { execFileSync } from "node:child_process";
32
32
 
33
- import { syncProjectRootToWorktree } from "../auto-worktree.ts";
33
+ import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
34
34
  import {
35
35
  createWorktree,
36
36
  removeWorktree,
@@ -18,6 +18,7 @@ import {
18
18
  getUnitDescriptor,
19
19
  getUnitPhaseChain,
20
20
  getUnitPromptTemplate,
21
+ getUnitPromptTemplates,
21
22
  } from "../unit-registry.ts";
22
23
  import {
23
24
  AUTO_UNIT_SCOPED_TOOLS,
@@ -123,13 +124,16 @@ const EXPECTED_DIRECT_PROMPT_TEMPLATES: Record<string, string> = {
123
124
  };
124
125
 
125
126
  const EXPECTED_UNDECLARED_PROMPT_TEMPLATE_TYPES = [
126
- "discuss-milestone",
127
127
  "discuss-slice",
128
128
  "execute-task-simple",
129
129
  "triage-captures",
130
130
  "quick-task",
131
131
  ];
132
132
 
133
+ const EXPECTED_CONDITIONAL_PROMPT_TEMPLATES: Record<string, string[]> = {
134
+ "discuss-milestone": ["discuss", "discuss-headless", "guided-discuss-milestone"],
135
+ };
136
+
133
137
  // ─── Derived-view parity ──────────────────────────────────────────────────
134
138
 
135
139
  test("KNOWN_UNIT_TYPES derives exactly the pre-registry list, in order", () => {
@@ -190,6 +194,27 @@ test("direct prompt-template associations live on the Unit Registry", () => {
190
194
  }
191
195
  });
192
196
 
197
+ test("conditional prompt-template associations live on the Unit Registry without pretending to be direct", () => {
198
+ for (const [unitType, promptTemplates] of Object.entries(EXPECTED_CONDITIONAL_PROMPT_TEMPLATES)) {
199
+ assert.equal(
200
+ getUnitPromptTemplate(unitType),
201
+ undefined,
202
+ `${unitType} must not expose a single direct prompt template`,
203
+ );
204
+ assert.deepEqual(
205
+ getUnitPromptTemplates(unitType),
206
+ promptTemplates,
207
+ `prompt templates for ${unitType}`,
208
+ );
209
+ for (const promptTemplate of promptTemplates) {
210
+ assert.ok(
211
+ existsSync(join(process.cwd(), "src/resources/extensions/gsd/prompts", `${promptTemplate}.md`)),
212
+ `prompt template file must exist for ${unitType}: ${promptTemplate}`,
213
+ );
214
+ }
215
+ }
216
+ });
217
+
193
218
  test("AUTO_UNIT_SCOPED_TOOLS mirrors each contract's allowed tools", () => {
194
219
  for (const [unitType, contract] of Object.entries(UNIT_TOOL_CONTRACTS)) {
195
220
  assert.deepEqual(AUTO_UNIT_SCOPED_TOOLS[unitType], contract.allowedGsdTools);
@@ -17,7 +17,7 @@ import { join } from "node:path";
17
17
  import { tmpdir } from "node:os";
18
18
  import { execSync } from "node:child_process";
19
19
 
20
- import { createAutoWorktree } from "../auto-worktree.ts";
20
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
21
21
  import { worktreePath } from "../worktree-manager.ts";
22
22
  import {
23
23
  copyWorktreeDb,
@@ -17,7 +17,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
17
17
  import { join } from 'node:path';
18
18
  import { tmpdir } from 'node:os';
19
19
 
20
- import { syncProjectRootToWorktree } from '../auto-worktree.ts';
20
+ import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
21
21
  import { describe, test } from 'node:test';
22
22
  import assert from 'node:assert/strict';
23
23
 
@@ -18,9 +18,7 @@ import {
18
18
  reconcileWorktreeDb,
19
19
  insertDecision,
20
20
  } from "../gsd-db.ts";
21
- import {
22
- _shouldReconcileWorktreeDb,
23
- } from "../auto-worktree.ts";
21
+ import { _shouldReconcileWorktreeDb } from "../auto-worktree-sync.ts";
24
22
  import { isInfrastructureError } from "../auto/infra-errors.ts";
25
23
 
26
24
  describe("#2823: reconcileWorktreeDb same-file guard", () => {
@@ -6,7 +6,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { join, resolve } from "node:path";
7
7
  import { tmpdir } from "node:os";
8
8
 
9
- import { _isExpectedWorktreeUnlinkError } from "../auto-worktree.ts";
9
+ import { _isExpectedWorktreeUnlinkError } from "../auto-worktree-path-utils.ts";
10
10
  import { resolveGitDir } from "../worktree-manager.ts";
11
11
 
12
12
  describe("worktree expected-condition warning suppression (#3665)", () => {
@@ -5,7 +5,7 @@ import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { execFileSync } from "node:child_process";
7
7
 
8
- import { _gitPathspecForWorktreePath } from "../auto-worktree.ts";
8
+ import { _gitPathspecForWorktreePath } from "../auto-worktree-path-utils.ts";
9
9
 
10
10
  function run(cmd: string, args: string[], cwd: string): string {
11
11
  return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -3,7 +3,7 @@
3
3
  import { test } from "node:test";
4
4
  import assert from "node:assert/strict";
5
5
 
6
- import { _resolveAutoWorktreeStartPoint } from "../auto-worktree.ts";
6
+ import { _resolveAutoWorktreeStartPoint } from "../auto-worktree-branch-lifecycle.ts";
7
7
 
8
8
  test("auto-worktree start point prefers milestone integration branch", () => {
9
9
  const startPoint = _resolveAutoWorktreeStartPoint(
@@ -26,7 +26,7 @@ import { tmpdir } from "node:os";
26
26
  import {
27
27
  syncGsdStateToWorktree,
28
28
  syncWorktreeStateBack,
29
- } from "../auto-worktree.ts";
29
+ } from "../auto-worktree-sync.ts";
30
30
 
31
31
  // ─── Helpers ─────────────────────────────────────────────────────────
32
32
 
@@ -13,7 +13,8 @@ import { join } from "node:path";
13
13
  import { tmpdir } from "node:os";
14
14
  import { execFileSync } from "node:child_process";
15
15
 
16
- import { createAutoWorktree, _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree.ts";
16
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
17
+ import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
17
18
  import { reenterActiveWorktreeIfNeeded } from "../worktree-reentry.ts";
18
19
 
19
20
  // Safe: all inputs below are hardcoded test strings, not user input.
@@ -27,8 +27,11 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
27
27
  import { join } from 'node:path';
28
28
  import { tmpdir } from 'node:os';
29
29
 
30
- import { syncProjectRootToWorktree } from '../auto-worktree.ts';
31
- import { syncGsdStateToWorktree, syncWorktreeStateBack } from '../auto-worktree.ts';
30
+ import {
31
+ syncGsdStateToWorktree,
32
+ syncProjectRootToWorktree,
33
+ syncWorktreeStateBack,
34
+ } from '../auto-worktree-sync.ts';
32
35
  import { describe, test } from 'node:test';
33
36
  import assert from 'node:assert/strict';
34
37
 
@@ -25,7 +25,7 @@ import {
25
25
  import { join } from "node:path";
26
26
  import { tmpdir } from "node:os";
27
27
 
28
- import { syncProjectRootToWorktree } from "../auto-worktree.ts";
28
+ import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
29
29
 
30
30
  function createBase(name: string): string {
31
31
  const base = mkdtempSync(join(tmpdir(), `gsd-wt-1886-${name}-`));
@@ -18,7 +18,7 @@ import {
18
18
  import { join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
 
21
- import { syncWorktreeStateBack } from "../auto-worktree.ts";
21
+ import { syncWorktreeStateBack } from "../auto-worktree-sync.ts";
22
22
 
23
23
  function makeTempDir(prefix: string): string {
24
24
  return mkdtempSync(join(tmpdir(), `gsd-sync-test-${prefix}-`));
@@ -85,6 +85,18 @@ export interface UnitWorkflowDispatchReadinessInput {
85
85
  activeTools?: string[];
86
86
  }
87
87
 
88
+ export interface WorkflowDispatchModelContext {
89
+ provider?: string;
90
+ baseUrl?: string;
91
+ }
92
+
93
+ export interface UnitWorkflowDispatchReadinessForModelInput
94
+ extends Omit<UnitWorkflowDispatchReadinessInput, "provider" | "authMode" | "baseUrl"> {
95
+ model?: WorkflowDispatchModelContext | null;
96
+ fallbackModel?: WorkflowDispatchModelContext | null;
97
+ getProviderAuthMode?: (provider: string) => WorkflowCapabilityOptions["authMode"] | undefined;
98
+ }
99
+
88
100
  export function compileUnitContextContract(unitType: string): UnitContextContractResult {
89
101
  const manifest = resolveManifest(unitType);
90
102
  if (!manifest) {
@@ -115,6 +127,23 @@ export function getUnitWorkflowDispatchReadinessError(
115
127
  );
116
128
  }
117
129
 
130
+ export function getUnitWorkflowDispatchReadinessErrorForModel(
131
+ input: UnitWorkflowDispatchReadinessForModelInput,
132
+ ): string | null {
133
+ const provider = input.model?.provider ?? input.fallbackModel?.provider;
134
+ const baseUrl = input.model?.baseUrl ?? input.fallbackModel?.baseUrl;
135
+ return getUnitWorkflowDispatchReadinessError({
136
+ provider,
137
+ unitType: input.unitType,
138
+ projectRoot: input.projectRoot,
139
+ env: input.env,
140
+ surface: input.surface,
141
+ authMode: provider ? input.getProviderAuthMode?.(provider) : undefined,
142
+ baseUrl,
143
+ activeTools: input.activeTools,
144
+ });
145
+ }
146
+
118
147
  export function compileUnitToolContract(unitType: string): ToolContractResult {
119
148
  const manifest = resolveManifest(unitType);
120
149
  const surfaceContract = getUnitToolSurfaceContract(unitType);
@@ -21,8 +21,8 @@
21
21
  // Not yet declared here (remaining ADR-033 steps): the manifest data
22
22
  // (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
23
23
  // against the registry's `UnitType`). Prompt-template association is declared
24
- // for direct one-template units; conditional/composite prompt selection stays
25
- // with the prompt builders until it has a richer registry shape.
24
+ // for direct one-template units and verified conditional template sets;
25
+ // composition logic stays with prompt builders.
26
26
 
27
27
  import type { CanonicalWorkflowToolName } from "@opengsd/contracts";
28
28
  import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
@@ -68,6 +68,11 @@ export interface UnitDescriptor {
68
68
  * verified prompt associations.
69
69
  */
70
70
  readonly promptTemplate?: string;
71
+ /**
72
+ * Prompt template ids a conditional or composite builder may choose from.
73
+ * Omitted unless every listed association is verified against the builder.
74
+ */
75
+ readonly promptTemplates?: readonly string[];
71
76
  /** `null` = the unit has no scoped gsd-tool contract. */
72
77
  readonly toolContract: UnitToolSurfaceContract | null;
73
78
  }
@@ -137,6 +142,7 @@ export const UNIT_REGISTRY = {
137
142
  kind: "primary",
138
143
  scopeClass: "standard",
139
144
  phaseChain: ["discuss", "planning"],
145
+ promptTemplates: ["discuss", "discuss-headless", "guided-discuss-milestone"],
140
146
  toolContract: {
141
147
  allowedGsdTools: [
142
148
  "gsd_summary_save",
@@ -526,3 +532,11 @@ export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[]
526
532
  export function getUnitPromptTemplate(unitType: string): string | undefined {
527
533
  return getUnitDescriptor(unitType)?.promptTemplate;
528
534
  }
535
+
536
+ /** Prompt template ids for any verified direct or conditional prompt builder. */
537
+ export function getUnitPromptTemplates(unitType: string): readonly string[] {
538
+ const descriptor = getUnitDescriptor(unitType);
539
+ if (!descriptor) return [];
540
+ if (descriptor.promptTemplates) return descriptor.promptTemplates;
541
+ return descriptor.promptTemplate ? [descriptor.promptTemplate] : [];
542
+ }
@@ -9,7 +9,7 @@ import {
9
9
  nativeDiffNumstat,
10
10
  nativeIsAncestor,
11
11
  } from "./native-git-bridge.js";
12
- import { autoWorktreeBranch } from "./auto-worktree.js";
12
+ import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
13
13
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
14
14
  import { getAllMilestones } from "./gsd-db.js";
15
15
  import { resolveMilestoneIntegrationBranch } from "./git-service.js";
@@ -3,7 +3,8 @@
3
3
 
4
4
  import { existsSync } from "node:fs";
5
5
 
6
- import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
6
+ import { isInAutoWorktree } from "./auto-worktree-entry.js";
7
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
7
8
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
8
9
  import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
9
10
  import { getIsolationMode } from "./preferences.js";
@@ -3,8 +3,8 @@
3
3
 
4
4
  import { existsSync, realpathSync } from "node:fs";
5
5
 
6
- import { getAutoWorktreePath } from "./auto-worktree.js";
7
- import { isSafeToAutoResolve } from "./auto-worktree.js";
6
+ import { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
7
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
8
8
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
9
9
  import {
10
10
  listMergeStateBlockers,
@@ -13,7 +13,7 @@
13
13
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
14
14
  import { loadPrompt } from "./prompt-loader.js";
15
15
  import { autoCommitCurrentBranch, getMainBranch, resolveGitHeadPath, nudgeGitBranchCache } from "./worktree.js";
16
- import { runWorktreePostCreateHook } from "./auto-worktree.js";
16
+ import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
17
17
  import { showConfirm } from "../shared/tui.js";
18
18
  import { gsdRoot, milestonesDir, resolveGsdPathContract } from "./paths.js";
19
19
  import {
@@ -68,19 +68,21 @@ import {
68
68
  getCurrentBranch,
69
69
  } from "./worktree.js";
70
70
  import { nativeCheckoutBranch } from "./native-git-bridge.js";
71
- // ADR-016 phase 2 / C2 (#5625): worktree-manager helpers inlined from
72
- // `./auto-worktree.js`. These seven functions are not real seams — Lifecycle
73
- // is the only Module that calls them, and they live alongside the Module's
74
- // other primitives in `auto-worktree.ts`.
71
+ // ADR-016 phase 2 / C2 (#5625): lifecycle uses focused auto-worktree
72
+ // modules instead of the legacy compatibility barrel. Branch, entry/path,
73
+ // creation, and teardown primitives are still implementation-level seams for
74
+ // Lifecycle; tests vary them through `WorktreeLifecycleTestOverrides` below.
75
75
  import {
76
76
  autoWorktreeBranch,
77
- createAutoWorktree,
78
- enterAutoWorktree,
79
77
  enterBranchModeForMilestone,
80
- getAutoWorktreePath,
78
+ } from "./auto-worktree-branch-lifecycle.js";
79
+ import { createAutoWorktree } from "./auto-worktree-creation.js";
80
+ import {
81
+ enterAutoWorktree,
81
82
  isInAutoWorktree,
82
- teardownAutoWorktree,
83
- } from "./auto-worktree.js";
83
+ } from "./auto-worktree-entry.js";
84
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
85
+ import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
84
86
  import { resolveRoadmapForMilestoneMerge } from "./milestone-merge-roadmap.js";
85
87
  import type { MilestoneMergeTransactionRunner } from "./milestone-merge-transaction.js";
86
88
 
@@ -353,7 +355,7 @@ export interface MergeContext {
353
355
  originalBasePath: string;
354
356
  /**
355
357
  * Current worktree path or project root when in branch mode. Used as the
356
- * cwd anchor for `mergeMilestoneToMain` and the source for
358
+ * cwd anchor for the milestone merge transaction and the source for
357
359
  * `Projection.finalizeProjectionForMerge`.
358
360
  */
359
361
  worktreeBasePath: string;
@@ -381,7 +383,8 @@ export interface MergeStandaloneResult {
381
383
  pushed: boolean;
382
384
  /**
383
385
  * Commit message produced by the squash merge, if available. Forwarded
384
- * from `mergeMilestoneToMain`. Only populated when `merged === true`.
386
+ * from the milestone merge transaction. Only populated when
387
+ * `merged === true`.
385
388
  */
386
389
  commitMessage?: string;
387
390
  }
@@ -1373,8 +1376,9 @@ function _mergeBranchModeImpl(
1373
1376
  * **CWD anchor**: anchors `process.cwd()` at `originalBasePath` before
1374
1377
  * non-worktree merge paths to mirror the single-loop guard against ENOENT
1375
1378
  * after teardown (de73fb43d). Worktree-mode merge paths keep the real
1376
- * worktree as cwd because `mergeMilestoneToMain()` infers source worktree
1377
- * state from `process.cwd()`. Best-effort; silent on failure.
1379
+ * worktree as cwd because the default milestone merge transaction delegates
1380
+ * to the legacy merge primitive, which infers source worktree state from
1381
+ * `process.cwd()`. Best-effort; silent on failure.
1378
1382
  *
1379
1383
  * **Failure handling**: `MergeConflictError` and other unrecoverable errors
1380
1384
  * propagate to the caller. The caller is responsible for any state restore
@@ -1475,8 +1479,8 @@ export function mergeMilestoneStandalone(
1475
1479
 
1476
1480
  // Set cwd to the correct anchor before dispatching to mode implementations.
1477
1481
  // Worktree mode / in-worktree override must run from the live worktree so
1478
- // mergeMilestoneToMain can find worktree-local state; branch mode runs from
1479
- // the original project root. Best-effort for synthetic test paths.
1482
+ // The default merge transaction can find worktree-local state; branch mode
1483
+ // runs from the original project root. Best-effort for synthetic test paths.
1480
1484
  const targetCwd = mode === "worktree" || inWorktree
1481
1485
  ? worktreeBasePath
1482
1486
  : originalBasePath;
@@ -8,7 +8,8 @@
8
8
 
9
9
  import { readdirSync } from "node:fs";
10
10
 
11
- import { enterAutoWorktree, getAutoWorktreePath } from "./auto-worktree.js";
11
+ import { enterAutoWorktree } from "./auto-worktree-entry.js";
12
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
12
13
  import { getIsolationMode } from "./preferences.js";
13
14
  import { allWorktreesDirs } from "./worktree-manager.js";
14
15
  import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";