@opengsd/gsd-pi 1.5.0 → 1.6.0-dev.aa7f94e8

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 (633) hide show
  1. package/README.md +10 -10
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/ask-user-questions.js +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
  5. package/dist/resources/extensions/gsd/activity-log.js +1 -1
  6. package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
  7. package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
  8. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  9. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  10. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
  11. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
  13. package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +23 -6
  15. package/dist/resources/extensions/gsd/auto-prompts.js +49 -117
  16. package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
  17. package/dist/resources/extensions/gsd/auto-start.js +57 -33
  18. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
  19. package/dist/resources/extensions/gsd/auto-timers.js +9 -2
  20. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  21. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  22. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  24. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  25. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  26. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  27. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  32. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  33. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  34. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  35. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  36. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  37. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  38. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  39. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  40. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  41. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  42. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  43. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2073
  44. package/dist/resources/extensions/gsd/auto.js +118 -34
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  48. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
  49. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +68 -2
  50. package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
  51. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  52. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  53. package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
  54. package/dist/resources/extensions/gsd/config-overlay.js +7 -2
  55. package/dist/resources/extensions/gsd/db/engine.js +33 -0
  56. package/dist/resources/extensions/gsd/db/queries.js +9 -9
  57. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  58. package/dist/resources/extensions/gsd/db-adapter.js +30 -3
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  60. package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
  61. package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
  62. package/dist/resources/extensions/gsd/forensics.js +1 -1
  63. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  64. package/dist/resources/extensions/gsd/git-service.js +45 -0
  65. package/dist/resources/extensions/gsd/gsd-db.js +23 -11
  66. package/dist/resources/extensions/gsd/guided-flow.js +22 -17
  67. package/dist/resources/extensions/gsd/journal.js +1 -1
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
  69. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  70. package/dist/resources/extensions/gsd/metrics.js +2 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  72. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
  73. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  74. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  75. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  76. package/dist/resources/extensions/gsd/paths.js +87 -52
  77. package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
  78. package/dist/resources/extensions/gsd/preferences-models.js +66 -15
  79. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  80. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  81. package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
  82. package/dist/resources/extensions/gsd/preferences.js +20 -0
  83. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  84. package/dist/resources/extensions/gsd/quick.js +12 -3
  85. package/dist/resources/extensions/gsd/reopen-reason.js +98 -0
  86. package/dist/resources/extensions/gsd/rule-registry.js +106 -10
  87. package/dist/resources/extensions/gsd/session-status-io.js +31 -0
  88. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  89. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  90. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  91. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
  92. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
  93. package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
  94. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  95. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
  96. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
  97. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  98. package/dist/resources/extensions/gsd/tools/reopen-task.js +28 -5
  99. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
  100. package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
  101. package/dist/resources/extensions/gsd/unit-registry.js +12 -2
  102. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  103. package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
  104. package/dist/resources/extensions/gsd/uok/audit.js +3 -0
  105. package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
  106. package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
  107. package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
  108. package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
  109. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  110. package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
  111. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  112. package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
  113. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  114. package/dist/resources/extensions/gsd/workspace.js +5 -14
  115. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  116. package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
  117. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  118. package/dist/resources/extensions/shared/gsd-browser-cli.js +51 -5
  119. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  120. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  121. package/dist/web/standalone/.next/BUILD_ID +1 -1
  122. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  123. package/dist/web/standalone/.next/build-manifest.json +3 -3
  124. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  125. package/dist/web/standalone/.next/required-server-files.json +3 -3
  126. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  127. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  218. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  226. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  254. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/index.html +1 -1
  267. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  268. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  270. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  272. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  273. package/dist/web/standalone/.next/server/app/page.js +2 -2
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  276. package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
  277. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  278. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware.js +3 -3
  281. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  282. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  283. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  284. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  285. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  287. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  288. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  289. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  290. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  291. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  292. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  293. package/dist/web/standalone/server.js +1 -1
  294. package/dist/worktree-cli-create.d.ts +10 -0
  295. package/dist/worktree-cli-create.js +11 -0
  296. package/dist/worktree-cli-format.d.ts +12 -0
  297. package/dist/worktree-cli-format.js +38 -0
  298. package/dist/worktree-cli-plan.d.ts +16 -0
  299. package/dist/worktree-cli-plan.js +19 -0
  300. package/dist/worktree-cli-session.d.ts +13 -0
  301. package/dist/worktree-cli-session.js +18 -0
  302. package/dist/worktree-cli-status.d.ts +35 -0
  303. package/dist/worktree-cli-status.js +54 -0
  304. package/dist/worktree-cli.d.ts +1 -16
  305. package/dist/worktree-cli.js +28 -122
  306. package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
  307. package/integrations/hermes/pyproject.toml +1 -1
  308. package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
  309. package/package.json +6 -6
  310. package/packages/cloud-mcp-gateway/package.json +2 -2
  311. package/packages/contracts/package.json +1 -1
  312. package/packages/daemon/dist/cloud-cli.d.ts +1 -1
  313. package/packages/daemon/dist/cloud-cli.d.ts.map +1 -1
  314. package/packages/daemon/dist/cloud-cli.js +42 -2
  315. package/packages/daemon/dist/cloud-cli.js.map +1 -1
  316. package/packages/daemon/dist/cloud-config.d.ts +1 -0
  317. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  318. package/packages/daemon/dist/cloud-config.js +1 -1
  319. package/packages/daemon/dist/cloud-config.js.map +1 -1
  320. package/packages/daemon/dist/device-flow.d.ts +24 -0
  321. package/packages/daemon/dist/device-flow.d.ts.map +1 -0
  322. package/packages/daemon/dist/device-flow.js +128 -0
  323. package/packages/daemon/dist/device-flow.js.map +1 -0
  324. package/packages/daemon/dist/device-flow.test.d.ts +2 -0
  325. package/packages/daemon/dist/device-flow.test.d.ts.map +1 -0
  326. package/packages/daemon/dist/device-flow.test.js +172 -0
  327. package/packages/daemon/dist/device-flow.test.js.map +1 -0
  328. package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
  329. package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
  330. package/packages/daemon/dist/orchestrator-agent.js +113 -0
  331. package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
  332. package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
  333. package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
  334. package/packages/daemon/dist/orchestrator-tools.js +137 -0
  335. package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
  336. package/packages/daemon/dist/orchestrator.d.ts +4 -56
  337. package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
  338. package/packages/daemon/dist/orchestrator.js +13 -303
  339. package/packages/daemon/dist/orchestrator.js.map +1 -1
  340. package/packages/daemon/dist/orchestrator.test.js +11 -1
  341. package/packages/daemon/dist/orchestrator.test.js.map +1 -1
  342. package/packages/daemon/package.json +5 -5
  343. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  344. package/packages/gsd-agent-core/package.json +5 -5
  345. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  346. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  347. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  348. package/packages/gsd-agent-modes/package.json +7 -7
  349. package/packages/gsd-cloud/README.md +34 -0
  350. package/packages/gsd-cloud/bin/gsd-cloud.js +27 -0
  351. package/packages/gsd-cloud/package.json +38 -0
  352. package/packages/mcp-server/package.json +4 -4
  353. package/packages/native/package.json +1 -1
  354. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  355. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  356. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  357. package/packages/pi-agent-core/package.json +1 -1
  358. package/packages/pi-ai/dist/index.d.ts +1 -0
  359. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  360. package/packages/pi-ai/dist/index.js +1 -0
  361. package/packages/pi-ai/dist/index.js.map +1 -1
  362. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  363. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  364. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  365. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  366. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  367. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  368. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  369. package/packages/pi-ai/dist/types.d.ts +8 -20
  370. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  371. package/packages/pi-ai/dist/types.js.map +1 -1
  372. package/packages/pi-ai/package.json +1 -1
  373. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  374. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  376. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  378. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  380. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  382. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  383. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  384. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  385. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  386. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  388. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  390. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/index.js +1 -0
  392. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  393. package/packages/pi-coding-agent/package.json +7 -7
  394. package/packages/pi-tui/package.json +2 -2
  395. package/packages/rpc-client/package.json +2 -2
  396. package/pkg/dist/core/export-html/template.js +53 -4
  397. package/pkg/package.json +1 -1
  398. package/src/resources/extensions/ask-user-questions.ts +1 -1
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
  400. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +44 -0
  401. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
  402. package/src/resources/extensions/gsd/activity-log.ts +1 -1
  403. package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
  404. package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
  405. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  406. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  407. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
  408. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
  409. package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
  410. package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
  411. package/src/resources/extensions/gsd/auto-post-unit.ts +26 -5
  412. package/src/resources/extensions/gsd/auto-prompts.ts +73 -113
  413. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  414. package/src/resources/extensions/gsd/auto-start.ts +62 -31
  415. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
  416. package/src/resources/extensions/gsd/auto-timers.ts +9 -2
  417. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  418. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  419. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  420. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  421. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  422. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  423. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  424. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  425. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  426. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  427. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  428. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  429. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  430. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  431. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  432. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  433. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  434. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  435. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  436. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  437. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  438. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  439. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  440. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
  441. package/src/resources/extensions/gsd/auto.ts +126 -47
  442. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  443. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
  444. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  445. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
  446. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +77 -1
  447. package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
  448. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  449. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  450. package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
  451. package/src/resources/extensions/gsd/config-overlay.ts +7 -1
  452. package/src/resources/extensions/gsd/db/engine.ts +36 -0
  453. package/src/resources/extensions/gsd/db/queries.ts +9 -9
  454. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  455. package/src/resources/extensions/gsd/db-adapter.ts +29 -3
  456. package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  457. package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
  458. package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
  459. package/src/resources/extensions/gsd/forensics.ts +1 -1
  460. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  461. package/src/resources/extensions/gsd/git-service.ts +53 -0
  462. package/src/resources/extensions/gsd/gsd-db.ts +33 -11
  463. package/src/resources/extensions/gsd/guided-flow.ts +26 -18
  464. package/src/resources/extensions/gsd/journal.ts +1 -1
  465. package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
  466. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  467. package/src/resources/extensions/gsd/metrics.ts +2 -2
  468. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  469. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
  470. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  471. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  472. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  473. package/src/resources/extensions/gsd/paths.ts +108 -51
  474. package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
  475. package/src/resources/extensions/gsd/preferences-models.ts +74 -20
  476. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  477. package/src/resources/extensions/gsd/preferences-types.ts +54 -1
  478. package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
  479. package/src/resources/extensions/gsd/preferences.ts +20 -0
  480. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  481. package/src/resources/extensions/gsd/quick.ts +11 -3
  482. package/src/resources/extensions/gsd/reopen-reason.ts +109 -0
  483. package/src/resources/extensions/gsd/rule-registry.ts +111 -9
  484. package/src/resources/extensions/gsd/session-status-io.ts +34 -0
  485. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  486. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  487. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  488. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
  489. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
  490. package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
  491. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  492. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  493. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
  494. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
  495. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
  496. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
  498. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
  499. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
  500. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  502. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  503. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  504. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  505. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  506. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  507. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  508. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  509. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  510. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  511. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  512. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  513. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  514. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +26 -0
  515. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  516. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
  517. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
  518. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
  519. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  520. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
  521. package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
  522. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  523. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
  524. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  525. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
  526. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
  527. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
  528. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  529. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  530. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  531. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  532. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  533. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  534. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  535. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  536. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  537. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  538. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  539. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  540. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
  541. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  542. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  543. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  544. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  545. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  546. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  547. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
  548. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
  549. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
  550. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  551. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  552. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  553. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
  554. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
  555. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
  556. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  557. package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
  558. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
  559. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
  561. package/src/resources/extensions/gsd/tests/reopen-reason.test.ts +117 -0
  562. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
  564. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  565. package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
  566. package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
  567. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  568. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
  569. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  570. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
  571. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  572. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  573. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  574. package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
  575. package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
  576. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  577. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  578. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  579. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  580. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  581. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
  582. package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
  583. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  584. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
  585. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
  586. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
  587. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
  588. package/src/resources/extensions/gsd/tests/worker-resume-wait.test.ts +73 -0
  589. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
  590. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  593. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  594. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  595. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  596. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  597. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  598. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
  599. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  600. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  601. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  602. package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
  603. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
  604. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  605. package/src/resources/extensions/gsd/tools/reopen-task.ts +28 -5
  606. package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
  607. package/src/resources/extensions/gsd/types.ts +23 -4
  608. package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
  609. package/src/resources/extensions/gsd/unit-registry.ts +16 -2
  610. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  611. package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
  612. package/src/resources/extensions/gsd/uok/audit.ts +2 -0
  613. package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
  614. package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
  615. package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
  616. package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
  617. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  618. package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
  619. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  620. package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
  621. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  622. package/src/resources/extensions/gsd/workspace.ts +5 -21
  623. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  624. package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
  625. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  626. package/src/resources/extensions/shared/gsd-browser-cli.ts +64 -7
  627. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  628. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  629. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  630. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  632. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_buildManifest.js +0 -0
  633. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_ssgManifest.js +0 -0
@@ -27,18 +27,19 @@ import { ensureGitignore, untrackRuntimeFiles } from "./gitignore.js";
27
27
  import { nativeIsRepo, nativeInit, nativeAddAll, nativeCommit, nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchList, nativeBranchExists, nativeBranchListMerged, nativeBranchDelete, nativeWorktreeRemove, nativeCommitCountBetween, nativeHasChanges, } from "./native-git-bridge.js";
28
28
  import { GitServiceImpl } from "./git-service.js";
29
29
  import { captureIntegrationBranch, detectWorktreeName, setActiveMilestoneId, } from "./worktree.js";
30
- import { getAutoWorktreePath } from "./auto-worktree.js";
30
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
31
31
  import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
32
- import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
32
+ import { cleanStaleRuntimeUnits } from "./auto-worktree-runtime-cleanup.js";
33
+ import { readResourceVersion } from "./auto-worktree-resource-version.js";
33
34
  import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
34
35
  import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
35
36
  import { queryJournal } from "./journal.js";
36
37
  import { initMetrics } from "./metrics.js";
37
38
  import { initRoutingHistory } from "./routing-history.js";
38
- import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
39
+ import { restoreHookState, resetHookState, reconcileRestoredHookDispatch } from "./post-unit-hooks.js";
39
40
  import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
40
41
  import { snapshotSkills } from "./skill-discovery.js";
41
- import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
42
+ import { isDbAvailable, probeDbWritable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
42
43
  import { getWorkflowDatabaseStatus, openExistingWorkflowDatabase, openWorkflowDatabase, resolveProjectRootDbPath, } from "./db-workspace.js";
43
44
  import { isClosedStatus } from "./status-guards.js";
44
45
  import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
@@ -118,36 +119,42 @@ export function reconcileProjectMilestonesFromDisk(basePath) {
118
119
  export function reconcileMergedMilestonesFromJournal(basePath) {
119
120
  if (!isDbAvailable())
120
121
  return 0;
121
- const mergedAtByMilestone = new Map();
122
- for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
123
- const data = entry.data ?? {};
124
- const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
125
- if (!milestoneId)
126
- continue;
127
- if (data.conflict === true)
128
- continue;
129
- const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
130
- const previous = mergedAtByMilestone.get(milestoneId);
131
- if (!previous || endedAt > previous)
132
- mergedAtByMilestone.set(milestoneId, endedAt);
133
- }
134
- let closed = 0;
135
- for (const [milestoneId, completedAt] of mergedAtByMilestone) {
136
- const existing = getMilestone(milestoneId);
137
- if (!existing) {
138
- insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
139
- updateMilestoneStatus(milestoneId, "complete", completedAt);
140
- closed++;
141
- continue;
142
- }
143
- if (!isClosedStatus(existing.status)) {
144
- updateMilestoneStatus(milestoneId, "complete", completedAt);
145
- closed++;
122
+ try {
123
+ const mergedAtByMilestone = new Map();
124
+ for (const entry of queryJournal(basePath, { eventType: "worktree-merged" })) {
125
+ const data = entry.data ?? {};
126
+ const milestoneId = typeof data.milestoneId === "string" ? data.milestoneId : null;
127
+ if (!milestoneId)
128
+ continue;
129
+ if (data.conflict === true)
130
+ continue;
131
+ const endedAt = typeof data.endedAt === "string" ? data.endedAt : entry.ts;
132
+ const previous = mergedAtByMilestone.get(milestoneId);
133
+ if (!previous || endedAt > previous)
134
+ mergedAtByMilestone.set(milestoneId, endedAt);
135
+ }
136
+ let closed = 0;
137
+ for (const [milestoneId, completedAt] of mergedAtByMilestone) {
138
+ const existing = getMilestone(milestoneId);
139
+ if (!existing) {
140
+ insertMilestone({ id: milestoneId, title: milestoneId, status: "complete" });
141
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
142
+ closed++;
143
+ continue;
144
+ }
145
+ if (!isClosedStatus(existing.status)) {
146
+ updateMilestoneStatus(milestoneId, "complete", completedAt);
147
+ closed++;
148
+ }
146
149
  }
150
+ if (closed > 0)
151
+ invalidateAllCaches();
152
+ return closed;
153
+ }
154
+ catch (err) {
155
+ logWarning("bootstrap", `merged-milestone journal reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
156
+ return 0;
147
157
  }
148
- if (closed > 0)
149
- invalidateAllCaches();
150
- return closed;
151
158
  }
152
159
  export function decideSurvivorAction(hasSurvivorBranch, phase) {
153
160
  if (!hasSurvivorBranch)
@@ -1253,6 +1260,10 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1253
1260
  s.unitLifetimeDispatches.clear();
1254
1261
  resetHookState();
1255
1262
  restoreHookState(base);
1263
+ // A restored activeHook has no live dispatch (the sidecar queue is not
1264
+ // persisted); re-enqueue it so the hook runs instead of blocking the next
1265
+ // unrelated unit's close-out (#1246).
1266
+ reconcileRestoredHookDispatch(base, s.sidecarQueue);
1256
1267
  resetProactiveHealing();
1257
1268
  // Notify user on health level transitions (green→yellow→red and back)
1258
1269
  setLevelChangeCallback((_from, to, summary) => {
@@ -1376,6 +1387,19 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1376
1387
  ctx.ui.notify(`SQLite database exists but failed to open: ${gsdDbPath}. ${phaseHint}${errorDetail}.${providerHint}`, "error");
1377
1388
  return releaseLockAndReturn();
1378
1389
  }
1390
+ // Gate: confirm the handle is actually writable, not just open. A
1391
+ // schema-current DB does zero writes during open, so a read-only /
1392
+ // DBMOVED handle otherwise passes the check above and only fails much
1393
+ // later at the first authoritative write (the uok-kernel-enter audit)
1394
+ // with an opaque "readonly database" error (#1234).
1395
+ if (existsSync(gsdDbPath) && isDbAvailable()) {
1396
+ const writable = probeDbWritable();
1397
+ if (!writable.ok) {
1398
+ const detail = writable.detail ? ` (${writable.detail})` : "";
1399
+ ctx.ui.notify(`SQLite database is not writable: ${gsdDbPath}.${detail} Check file/WAL permissions or reopen a stale handle before running auto-mode.`, "error");
1400
+ return releaseLockAndReturn();
1401
+ }
1402
+ }
1379
1403
  // Initialize metrics
1380
1404
  initMetrics(s.basePath);
1381
1405
  // Initialize routing history
@@ -1409,7 +1433,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
1409
1433
  }
1410
1434
  // Snapshot installed skills
1411
1435
  if (resolveSkillDiscoveryMode(base) !== "off") {
1412
- snapshotSkills();
1436
+ snapshotSkills({ cwd: s.basePath });
1413
1437
  }
1414
1438
  setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
1415
1439
  ctx.ui.setWidget("gsd-health", undefined);
@@ -8,6 +8,8 @@ import { resolveExpectedArtifactPath, diagnoseExpectedArtifact, verifyExpectedAr
8
8
  import { existsSync } from "node:fs";
9
9
  import { bumpAndResolveSynthetic } from "./auto/resolve.js";
10
10
  import { finalizeProjectResearchTimeout } from "./project-research-policy.js";
11
+ import { applySupervisorModelIfConfigured } from "./auto-model-selection.js";
12
+ import { getInFlightToolCount } from "./auto-tool-tracking.js";
11
13
  export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rctx) {
12
14
  // Note on turn epoch: the bump is intentionally NOT unconditional at
13
15
  // function entry. Two branches below (the "steering retry" paths) keep
@@ -79,11 +81,15 @@ export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rct
79
81
  "Immediately finish the required durable output for this unit.",
80
82
  "If full completion is impossible, write the partial artifact/state needed for recovery and make the blocker explicit.",
81
83
  ];
84
+ const recoveryTrigger = getInFlightToolCount() === 0;
85
+ if (recoveryTrigger) {
86
+ await applySupervisorModelIfConfigured(ctx, pi, basePath);
87
+ }
82
88
  pi.sendMessage({
83
89
  customType: "gsd-auto-timeout-recovery",
84
90
  display: verbose,
85
91
  content: steeringLines.join("\n"),
86
- }, { triggerTurn: true, deliverAs: "steer" });
92
+ }, { triggerTurn: recoveryTrigger, deliverAs: "steer" });
87
93
  ctx.ui.notify(`${reason === "idle" ? "Idle" : "Timeout"} recovery: steering ${unitType} ${unitId} to finish durable output (attempt ${attemptNumber}, session ${recoveryAttempts + 1}/${maxRecoveryAttempts}).`, "warning");
88
94
  return "recovered";
89
95
  }
@@ -176,11 +182,15 @@ export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rct
176
182
  "Write the required artifact now.",
177
183
  "If blocked, write the partial artifact and explicitly record the blocker instead of going silent.",
178
184
  ];
185
+ const recoveryTrigger = getInFlightToolCount() === 0;
186
+ if (recoveryTrigger) {
187
+ await applySupervisorModelIfConfigured(ctx, pi, basePath);
188
+ }
179
189
  pi.sendMessage({
180
190
  customType: "gsd-auto-timeout-recovery",
181
191
  display: verbose,
182
192
  content: steeringLines.join("\n"),
183
- }, { triggerTurn: true, deliverAs: "steer" });
193
+ }, { triggerTurn: recoveryTrigger, deliverAs: "steer" });
184
194
  ctx.ui.notify(`${reason === "idle" ? "Idle" : "Timeout"} recovery: steering ${unitType} ${unitId} to produce ${expected} (attempt ${attemptNumber}, session ${recoveryAttempts + 1}/${maxRecoveryAttempts}).`, "warning");
185
195
  return "recovered";
186
196
  }
@@ -11,6 +11,7 @@ import { resolveAutoSupervisorConfig } from "./preferences.js";
11
11
  import { computeBudgets, resolveExecutorContextWindow } from "./context-budget.js";
12
12
  import { getInFlightToolCount, getOldestInFlightToolStart, clearInFlightTools, hasInteractiveToolInFlight, } from "./auto-tool-tracking.js";
13
13
  import { detectWorkingTreeActivity } from "./auto-supervisor.js";
14
+ import { applySupervisorModelIfConfigured } from "./auto-model-selection.js";
14
15
  import { closeoutUnit } from "./auto-unit-closeout.js";
15
16
  import { saveActivityLog } from "./activity-log.js";
16
17
  import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
@@ -113,7 +114,7 @@ export function startUnitSupervision(sctx) {
113
114
  ? supervisor.stalled_tool_timeout_minutes * 60 * 1000
114
115
  : idleTimeoutMs;
115
116
  // ── 1. Soft timeout warning ──
116
- s.wrapupWarningHandle = setTimeout(() => {
117
+ s.wrapupWarningHandle = setTimeout(async () => {
117
118
  s.wrapupWarningHandle = null;
118
119
  if (!s.active || !s.currentUnit)
119
120
  return;
@@ -125,6 +126,9 @@ export function startUnitSupervision(sctx) {
125
126
  // Triggering during active tool calls causes tool results to be skipped
126
127
  // with "Skipped due to queued user message", leading to provider errors (#3512).
127
128
  const softTrigger = getInFlightToolCount() === 0;
129
+ if (softTrigger) {
130
+ await applySupervisorModelIfConfigured(ctx, pi, s.basePath);
131
+ }
128
132
  pi.sendMessage({
129
133
  customType: "gsd-auto-wrapup",
130
134
  display: s.verbose,
@@ -291,7 +295,7 @@ export function startUnitSupervision(sctx) {
291
295
  }
292
296
  const executorContextWindow = resolveExecutorContextWindow(ctx.modelRegistry, prefs, ctx.model?.contextWindow, ctx.model?.provider);
293
297
  const continueHereThreshold = computeBudgets(executorContextWindow).continueThresholdPercent;
294
- s.continueHereHandle = setInterval(() => {
298
+ s.continueHereHandle = setInterval(async () => {
295
299
  if (!s.active || !s.currentUnit || !s.cmdCtx)
296
300
  return;
297
301
  const runtime = readUnitRuntimeRecord(s.basePath, unitType, unitId);
@@ -316,6 +320,9 @@ export function startUnitSupervision(sctx) {
316
320
  }
317
321
  // Only trigger a new turn if no tools are currently in flight (#3512).
318
322
  const contextTrigger = getInFlightToolCount() === 0;
323
+ if (contextTrigger) {
324
+ await applySupervisorModelIfConfigured(ctx, pi, s.basePath);
325
+ }
319
326
  pi.sendMessage({
320
327
  customType: "gsd-auto-wrapup",
321
328
  display: s.verbose,
@@ -0,0 +1,189 @@
1
+ // gsd-pi — Auto-worktree branch lifecycle module.
2
+ //
3
+ // Owns milestone branch naming, branch-mode entry, and safe fast-forward of
4
+ // reused milestone branches. Worktree creation/merge code imports this module
5
+ // instead of keeping branch policy inside the legacy auto-worktree barrel.
6
+ import { GSDError, GSD_GIT_ERROR } from "./errors.js";
7
+ import { readIntegrationBranch } from "./git-service.js";
8
+ import { loadEffectiveGSDPreferences } from "./preferences.js";
9
+ import { debugLog } from "./debug-logger.js";
10
+ import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
11
+ import { nativeBranchExists, nativeBranchForceReset, nativeDetectMainBranch, nativeIsAncestor, nativeUpdateRef, nativeWorktreeList, } from "./native-git-bridge.js";
12
+ /** Returns the git branch name for a milestone worktree (`milestone/<MID>`). */
13
+ export function autoWorktreeBranch(milestoneId) {
14
+ return `milestone/${milestoneId}`;
15
+ }
16
+ export function _resolveAutoWorktreeStartPoint(integrationBranch, gitMainBranch, branchExists) {
17
+ if (integrationBranch)
18
+ return integrationBranch;
19
+ return gitMainBranch &&
20
+ typeof gitMainBranch === "string" &&
21
+ gitMainBranch.length > 0 &&
22
+ branchExists(gitMainBranch)
23
+ ? gitMainBranch
24
+ : undefined;
25
+ }
26
+ /**
27
+ * Enter branch isolation mode for a milestone.
28
+ *
29
+ * Creates `milestone/<MID>` from the integration branch (if it doesn't
30
+ * exist yet) and checks out to it. No worktree directory is created — the
31
+ * project root is the working copy; only HEAD changes.
32
+ *
33
+ * Uses the same 3-tier integration-branch fallback as createAutoWorktree:
34
+ * 1. META.json recorded integration branch
35
+ * 2. git.main_branch preference
36
+ * 3. nativeDetectMainBranch (origin/HEAD auto-detection)
37
+ */
38
+ export function enterBranchModeForMilestone(basePath, milestoneId) {
39
+ const branch = autoWorktreeBranch(milestoneId);
40
+ const branchExists = nativeBranchExists(basePath, branch);
41
+ if (!branchExists) {
42
+ // Create the milestone branch from the integration branch start-point.
43
+ const integrationBranch = readIntegrationBranch(basePath, milestoneId) ?? undefined;
44
+ const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
45
+ const startPoint = _resolveAutoWorktreeStartPoint(integrationBranch, gitPrefs?.main_branch, (branchName) => nativeBranchExists(basePath, branchName)) ??
46
+ nativeDetectMainBranch(basePath);
47
+ // TOCTOU ancestry guard (Issue #4980 HIGH-3).
48
+ //
49
+ // The outer `branchExists` check is racy: a concurrent process
50
+ // (parallel-orchestrator worker, side-by-side `gsd` instance, or manual
51
+ // `git branch` invocation) may have created the branch with real commits
52
+ // between that check and this point. `nativeBranchForceReset` does
53
+ // `git branch -f`, which silently overwrites the branch ref — orphaning
54
+ // any commits not reachable from `startPoint`. Re-check immediately
55
+ // before the destructive call and refuse if the branch suddenly exists
56
+ // with non-ancestor commits.
57
+ const concurrentlyCreated = nativeBranchExists(basePath, branch);
58
+ if (concurrentlyCreated &&
59
+ !nativeIsAncestor(basePath, branch, startPoint)) {
60
+ throw new GSDError(GSD_GIT_ERROR, `Branch "${branch}" was created concurrently with commits not reachable from "${startPoint}". ` +
61
+ `Refusing to force-reset — would orphan prior work. ` +
62
+ `Resume the existing milestone or run \`git branch -D ${branch}\` to discard.`);
63
+ }
64
+ // nativeBranchForceReset creates (or resets) branch at startPoint,
65
+ // then checkout switches HEAD to it.
66
+ nativeBranchForceReset(basePath, branch, startPoint);
67
+ debugLog("auto-worktree", {
68
+ action: "enterBranchMode",
69
+ milestoneId,
70
+ branch,
71
+ startPoint,
72
+ created: true,
73
+ });
74
+ }
75
+ else {
76
+ debugLog("auto-worktree", {
77
+ action: "enterBranchMode",
78
+ milestoneId,
79
+ branch,
80
+ reused: true,
81
+ });
82
+ }
83
+ checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
84
+ }
85
+ /**
86
+ * True when `branch` is checked out in any worktree listed by
87
+ * `git worktree list --porcelain`. Used to gate ref updates that would
88
+ * otherwise leave a concurrent worktree's HEAD inconsistent with its
89
+ * index/working tree (Codex peer-review of #5538-followup).
90
+ *
91
+ * Best-effort: a `nativeWorktreeList` failure returns true so we err on
92
+ * the side of NOT moving the ref. Better to skip a fast-forward than to
93
+ * silently corrupt another worktree.
94
+ */
95
+ export function _isBranchCheckedOutElsewhere(basePath, branch) {
96
+ try {
97
+ const entries = nativeWorktreeList(basePath);
98
+ return entries.some((entry) => entry.branch === branch);
99
+ }
100
+ catch {
101
+ return true;
102
+ }
103
+ }
104
+ /**
105
+ * Resolve the integration branch using the same 3-tier fallback as the
106
+ * fresh-create path: META.json → git.main_branch preference → detected
107
+ * main branch. Returns null when no usable target exists.
108
+ */
109
+ function resolveIntegrationBranchForReuse(basePath, milestoneId) {
110
+ const fromMeta = readIntegrationBranch(basePath, milestoneId);
111
+ if (fromMeta)
112
+ return fromMeta;
113
+ const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
114
+ const fromPref = gitPrefs?.main_branch &&
115
+ typeof gitPrefs.main_branch === "string" &&
116
+ gitPrefs.main_branch.length > 0 &&
117
+ nativeBranchExists(basePath, gitPrefs.main_branch)
118
+ ? gitPrefs.main_branch
119
+ : null;
120
+ if (fromPref)
121
+ return fromPref;
122
+ try {
123
+ return nativeDetectMainBranch(basePath);
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * When reusing an existing milestone branch, fast-forward it onto the
131
+ * integration branch when that's safe (branch is a strict ancestor of
132
+ * integration — no commits would be lost). Skips when the branch has its
133
+ * own commits ahead of integration, when the integration branch can't be
134
+ * resolved, or when any git operation fails — the merge gate at milestone
135
+ * completion will surface real divergence as a conflict.
136
+ *
137
+ * The previous behavior re-attached the worktree to whatever stale tip
138
+ * the branch held, which caused new milestone work to fork from a base
139
+ * missing prior milestones' merges (#5538-followup).
140
+ */
141
+ export function fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch) {
142
+ try {
143
+ const integrationBranch = resolveIntegrationBranchForReuse(basePath, milestoneId);
144
+ if (!integrationBranch || integrationBranch === branch)
145
+ return;
146
+ if (!nativeBranchExists(basePath, integrationBranch))
147
+ return;
148
+ // Pure fast-forward only: branch must be a strict ancestor of integration.
149
+ // If the branch has its own commits ahead, leave it alone.
150
+ if (!nativeIsAncestor(basePath, branch, integrationBranch)) {
151
+ debugLog("createAutoWorktree", {
152
+ phase: "skip-ff-branch-not-ancestor",
153
+ milestoneId,
154
+ branch,
155
+ integration: integrationBranch,
156
+ });
157
+ return;
158
+ }
159
+ // Codex peer-review: `nativeUpdateRef` succeeds even when the branch is
160
+ // currently checked out in another worktree, leaving that worktree's HEAD
161
+ // inconsistent with its index/work tree. Skip the fast-forward if any
162
+ // listed worktree has this branch checked out — the merge gate at
163
+ // milestone-completion will surface stale-base divergence as a conflict
164
+ // instead of silently corrupting the other worktree's state.
165
+ if (_isBranchCheckedOutElsewhere(basePath, branch)) {
166
+ debugLog("createAutoWorktree", {
167
+ phase: "skip-ff-branch-checked-out-elsewhere",
168
+ milestoneId,
169
+ branch,
170
+ });
171
+ return;
172
+ }
173
+ nativeUpdateRef(basePath, `refs/heads/${branch}`, integrationBranch);
174
+ debugLog("createAutoWorktree", {
175
+ phase: "fast-forward-reused-branch",
176
+ milestoneId,
177
+ branch,
178
+ integration: integrationBranch,
179
+ });
180
+ }
181
+ catch (err) {
182
+ debugLog("createAutoWorktree", {
183
+ phase: "fast-forward-reused-branch-failed",
184
+ milestoneId,
185
+ branch,
186
+ error: err instanceof Error ? err.message : String(err),
187
+ });
188
+ }
189
+ }
@@ -0,0 +1,133 @@
1
+ // gsd-pi — Auto-worktree cleanup helpers.
2
+ //
3
+ // Owns shared cleanup primitives used by teardown and merge cleanup paths:
4
+ // same-file DB reconciliation checks, transient project-root state removal,
5
+ // git pathspec conversion for externally-rooted .gsd paths, and expected
6
+ // unlink error classification.
7
+ import { execFileSync } from "node:child_process";
8
+ import { existsSync, realpathSync, unlinkSync } from "node:fs";
9
+ import { isAbsolute, join, relative } from "node:path";
10
+ import { gsdRoot } from "./paths.js";
11
+ import { logWarning } from "./workflow-logger.js";
12
+ function isSamePath(a, b) {
13
+ try {
14
+ return realpathSync(a) === realpathSync(b);
15
+ }
16
+ catch (e) {
17
+ if (e.code === "ENOENT")
18
+ return false;
19
+ logWarning("worktree", `isSamePath failed: ${e.message}`);
20
+ return false;
21
+ }
22
+ }
23
+ export function _isSamePath(a, b) {
24
+ return isSamePath(a, b);
25
+ }
26
+ export function _shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath, pathExists = existsSync, samePath = isSamePath) {
27
+ return pathExists(worktreeDbPath) && !samePath(worktreeDbPath, mainDbPath);
28
+ }
29
+ export function _isExpectedWorktreeUnlinkError(code) {
30
+ return code === "ENOENT" || code === "EISDIR";
31
+ }
32
+ function gitPathspecForWorktreePath(basePath, targetPath) {
33
+ let base = basePath;
34
+ let target = targetPath;
35
+ try {
36
+ base = execFileSync("git", ["rev-parse", "--show-toplevel"], {
37
+ cwd: basePath,
38
+ stdio: ["ignore", "pipe", "ignore"],
39
+ encoding: "utf-8",
40
+ }).trim() || basePath;
41
+ }
42
+ catch {
43
+ /* keep original */
44
+ void base;
45
+ }
46
+ try {
47
+ base = realpathSync.native(base);
48
+ }
49
+ catch {
50
+ /* keep original */
51
+ void base;
52
+ }
53
+ try {
54
+ target = realpathSync.native(targetPath);
55
+ }
56
+ catch {
57
+ /* keep original */
58
+ void target;
59
+ }
60
+ const rel = relative(base, target);
61
+ if (rel === "" || rel.startsWith("..") || isAbsolute(rel))
62
+ return null;
63
+ return rel.replaceAll("\\", "/");
64
+ }
65
+ export function _gitPathspecForWorktreePath(basePath, targetPath) {
66
+ return gitPathspecForWorktreePath(basePath, targetPath);
67
+ }
68
+ export function clearProjectRootStateFiles(basePath, milestoneId) {
69
+ const gsdDir = gsdRoot(basePath);
70
+ // Phase C pt 2: auto.lock removed from this list — the file is gone
71
+ // (migrated to the workers + unit_dispatches + runtime_kv tables). The
72
+ // remaining transient files (STATE.md, {MID}-META.json) are still
73
+ // worth removing on teardown.
74
+ const transientFiles = [
75
+ join(gsdDir, "STATE.md"),
76
+ join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
77
+ ];
78
+ for (const file of transientFiles) {
79
+ try {
80
+ unlinkSync(file);
81
+ }
82
+ catch (err) {
83
+ // ENOENT is expected — file may not exist (#3597)
84
+ if (err.code !== "ENOENT") {
85
+ logWarning("worktree", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
86
+ }
87
+ }
88
+ }
89
+ // Clean up legacy synced milestone directories and runtime/units.
90
+ // Older versions copied these into the project root during execution.
91
+ // If they remain as untracked files when we attempt
92
+ // `git merge --squash`, git rejects the merge with "local changes would
93
+ // be overwritten", causing silent data loss (#1738).
94
+ const syncedDirs = [
95
+ join(gsdDir, "milestones", milestoneId),
96
+ join(gsdDir, "runtime", "units"),
97
+ ];
98
+ for (const dir of syncedDirs) {
99
+ try {
100
+ if (!existsSync(dir))
101
+ continue;
102
+ const pathspec = gitPathspecForWorktreePath(basePath, dir);
103
+ if (!pathspec)
104
+ continue;
105
+ // Only remove files that are untracked by git — tracked files are
106
+ // managed by the branch checkout and should not be deleted.
107
+ const untrackedOutput = execFileSync("git", ["ls-files", "--others", "--exclude-standard", pathspec], {
108
+ cwd: basePath,
109
+ stdio: ["ignore", "pipe", "pipe"],
110
+ encoding: "utf-8",
111
+ }).trim();
112
+ if (!untrackedOutput)
113
+ continue;
114
+ for (const f of untrackedOutput.split("\n").filter(Boolean)) {
115
+ try {
116
+ unlinkSync(join(basePath, f));
117
+ }
118
+ catch (err) {
119
+ // ENOENT/EISDIR are expected for already-removed or
120
+ // directory entries (#3597).
121
+ const code = err.code;
122
+ if (!_isExpectedWorktreeUnlinkError(code)) {
123
+ logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ catch (err) {
129
+ /* non-fatal — git command may fail if not in repo */
130
+ logWarning("worktree", `untracked file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,35 @@
1
+ // gsd-pi — Conflict auto-resolve policy for auto-worktree merges.
2
+ //
3
+ // Owns the pure path policy for conflict paths that are safe to resolve
4
+ // mechanically. Git mutation stays in git-conflict-resolve.ts.
5
+ /** Patterns for machine-generated build artifacts that can be safely
6
+ * auto-resolved by accepting --theirs during merge. These files are
7
+ * regenerable and never contain meaningful manual edits. */
8
+ export const SAFE_AUTO_RESOLVE_PATTERNS = [
9
+ /\.tsbuildinfo$/,
10
+ /\.pyc$/,
11
+ /\/__pycache__\//,
12
+ /\.DS_Store$/,
13
+ /\.map$/,
14
+ // Regenerable dependency lockfiles. These are fully derivable from their
15
+ // manifests by the package manager, so accepting the merge side during
16
+ // auto-resolve clears the conflict markers without losing meaningful edits —
17
+ // and stops auto-mode from hard-pausing on a lockfile conflict (issue #828).
18
+ /(?:^|\/)pnpm-lock\.yaml$/,
19
+ /(?:^|\/)package-lock\.json$/,
20
+ /(?:^|\/)npm-shrinkwrap\.json$/,
21
+ /(?:^|\/)yarn\.lock$/,
22
+ /(?:^|\/)bun\.lockb?$/,
23
+ /(?:^|\/)Cargo\.lock$/,
24
+ /(?:^|\/)composer\.lock$/,
25
+ /(?:^|\/)Gemfile\.lock$/,
26
+ /(?:^|\/)Pipfile\.lock$/,
27
+ /(?:^|\/)poetry\.lock$/,
28
+ ];
29
+ /** Returns true if the file path is safe to auto-resolve during merge.
30
+ * Covers `.gsd/` state files, common build artifacts, and regenerable
31
+ * dependency lockfiles. */
32
+ export function isSafeToAutoResolve(filePath) {
33
+ return filePath.startsWith(".gsd/")
34
+ || SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
35
+ }