@opengsd/gsd-pi 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) 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 +4 -3
  15. package/dist/resources/extensions/gsd/auto-prompts.js +29 -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 +106 -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/codebase-generator.js +7 -1
  50. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  51. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  52. package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
  53. package/dist/resources/extensions/gsd/config-overlay.js +7 -2
  54. package/dist/resources/extensions/gsd/db/engine.js +33 -0
  55. package/dist/resources/extensions/gsd/db/queries.js +9 -9
  56. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  57. package/dist/resources/extensions/gsd/db-adapter.js +30 -3
  58. package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  59. package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
  60. package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
  61. package/dist/resources/extensions/gsd/forensics.js +1 -1
  62. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  63. package/dist/resources/extensions/gsd/git-service.js +45 -0
  64. package/dist/resources/extensions/gsd/gsd-db.js +23 -11
  65. package/dist/resources/extensions/gsd/guided-flow.js +22 -17
  66. package/dist/resources/extensions/gsd/journal.js +1 -1
  67. package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
  68. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  69. package/dist/resources/extensions/gsd/metrics.js +2 -2
  70. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  71. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
  72. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  73. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  75. package/dist/resources/extensions/gsd/paths.js +87 -52
  76. package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
  77. package/dist/resources/extensions/gsd/preferences-models.js +66 -15
  78. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  79. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  80. package/dist/resources/extensions/gsd/preferences-validation.js +148 -10
  81. package/dist/resources/extensions/gsd/preferences.js +20 -0
  82. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  83. package/dist/resources/extensions/gsd/quick.js +12 -3
  84. package/dist/resources/extensions/gsd/rule-registry.js +106 -10
  85. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  87. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  88. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
  89. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
  90. package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
  91. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  92. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
  96. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
  97. package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
  98. package/dist/resources/extensions/gsd/unit-registry.js +12 -2
  99. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  100. package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
  101. package/dist/resources/extensions/gsd/uok/audit.js +3 -0
  102. package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
  103. package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
  104. package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
  105. package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
  106. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  107. package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
  108. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  109. package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
  110. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  111. package/dist/resources/extensions/gsd/workspace.js +5 -14
  112. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  113. package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
  114. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  115. package/dist/resources/extensions/shared/gsd-browser-cli.js +29 -0
  116. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  117. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  118. package/dist/web/standalone/.next/BUILD_ID +1 -1
  119. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  120. package/dist/web/standalone/.next/build-manifest.json +2 -2
  121. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  122. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/index.html +1 -1
  173. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  180. package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
  181. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  182. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  184. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  185. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  186. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  187. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  188. package/dist/worktree-cli-create.d.ts +10 -0
  189. package/dist/worktree-cli-create.js +11 -0
  190. package/dist/worktree-cli-format.d.ts +12 -0
  191. package/dist/worktree-cli-format.js +38 -0
  192. package/dist/worktree-cli-plan.d.ts +16 -0
  193. package/dist/worktree-cli-plan.js +19 -0
  194. package/dist/worktree-cli-session.d.ts +13 -0
  195. package/dist/worktree-cli-session.js +18 -0
  196. package/dist/worktree-cli-status.d.ts +35 -0
  197. package/dist/worktree-cli-status.js +54 -0
  198. package/dist/worktree-cli.d.ts +1 -16
  199. package/dist/worktree-cli.js +28 -122
  200. package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
  201. package/integrations/hermes/pyproject.toml +1 -1
  202. package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
  203. package/package.json +6 -6
  204. package/packages/cloud-mcp-gateway/package.json +2 -2
  205. package/packages/contracts/package.json +1 -1
  206. package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
  207. package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
  208. package/packages/daemon/dist/orchestrator-agent.js +113 -0
  209. package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
  210. package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
  211. package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
  212. package/packages/daemon/dist/orchestrator-tools.js +137 -0
  213. package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
  214. package/packages/daemon/dist/orchestrator.d.ts +4 -56
  215. package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
  216. package/packages/daemon/dist/orchestrator.js +13 -303
  217. package/packages/daemon/dist/orchestrator.js.map +1 -1
  218. package/packages/daemon/dist/orchestrator.test.js +11 -1
  219. package/packages/daemon/dist/orchestrator.test.js.map +1 -1
  220. package/packages/daemon/package.json +4 -4
  221. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  222. package/packages/gsd-agent-core/package.json +5 -5
  223. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  224. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  225. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  226. package/packages/gsd-agent-modes/package.json +7 -7
  227. package/packages/mcp-server/package.json +4 -4
  228. package/packages/native/package.json +1 -1
  229. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  230. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  231. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  232. package/packages/pi-agent-core/package.json +1 -1
  233. package/packages/pi-ai/dist/index.d.ts +1 -0
  234. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  235. package/packages/pi-ai/dist/index.js +1 -0
  236. package/packages/pi-ai/dist/index.js.map +1 -1
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  241. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  243. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  244. package/packages/pi-ai/dist/types.d.ts +8 -20
  245. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/types.js.map +1 -1
  247. package/packages/pi-ai/package.json +1 -1
  248. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  249. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  251. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  253. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  255. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  257. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  259. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  261. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  263. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  265. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/index.js +1 -0
  267. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  268. package/packages/pi-coding-agent/package.json +7 -7
  269. package/packages/pi-tui/package.json +2 -2
  270. package/packages/rpc-client/package.json +2 -2
  271. package/pkg/dist/core/export-html/template.js +53 -4
  272. package/pkg/package.json +1 -1
  273. package/src/resources/extensions/ask-user-questions.ts +1 -1
  274. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
  275. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +25 -0
  276. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
  277. package/src/resources/extensions/gsd/activity-log.ts +1 -1
  278. package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
  279. package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
  280. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  281. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  282. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
  283. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
  284. package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
  285. package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
  286. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -2
  287. package/src/resources/extensions/gsd/auto-prompts.ts +53 -113
  288. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  289. package/src/resources/extensions/gsd/auto-start.ts +62 -31
  290. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
  291. package/src/resources/extensions/gsd/auto-timers.ts +9 -2
  292. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  293. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  294. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  295. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  296. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  297. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  298. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  299. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  300. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  301. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  302. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  303. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  304. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  305. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  306. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  307. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  308. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  309. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  310. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  311. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  312. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  313. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  314. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  315. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2429
  316. package/src/resources/extensions/gsd/auto.ts +114 -47
  317. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
  319. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  320. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
  321. package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
  322. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  323. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  324. package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
  325. package/src/resources/extensions/gsd/config-overlay.ts +7 -1
  326. package/src/resources/extensions/gsd/db/engine.ts +36 -0
  327. package/src/resources/extensions/gsd/db/queries.ts +9 -9
  328. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  329. package/src/resources/extensions/gsd/db-adapter.ts +29 -3
  330. package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  331. package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
  332. package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
  333. package/src/resources/extensions/gsd/forensics.ts +1 -1
  334. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  335. package/src/resources/extensions/gsd/git-service.ts +53 -0
  336. package/src/resources/extensions/gsd/gsd-db.ts +33 -11
  337. package/src/resources/extensions/gsd/guided-flow.ts +26 -18
  338. package/src/resources/extensions/gsd/journal.ts +1 -1
  339. package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
  340. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  341. package/src/resources/extensions/gsd/metrics.ts +2 -2
  342. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  343. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
  344. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  345. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  346. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  347. package/src/resources/extensions/gsd/paths.ts +108 -51
  348. package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
  349. package/src/resources/extensions/gsd/preferences-models.ts +74 -20
  350. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  351. package/src/resources/extensions/gsd/preferences-types.ts +54 -1
  352. package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
  353. package/src/resources/extensions/gsd/preferences.ts +20 -0
  354. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  355. package/src/resources/extensions/gsd/quick.ts +11 -3
  356. package/src/resources/extensions/gsd/rule-registry.ts +111 -9
  357. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  358. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  359. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  360. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
  361. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
  362. package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
  363. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  364. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  365. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
  366. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
  367. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
  368. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  369. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
  370. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
  371. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -1
  372. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  373. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  374. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  375. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  376. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  377. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  378. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  379. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  380. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  382. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  383. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  384. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  385. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  386. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  387. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
  388. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
  389. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
  390. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  391. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
  392. package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
  393. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  394. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -0
  395. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  396. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +71 -1
  397. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
  398. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
  399. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  400. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  401. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  402. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  403. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  404. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  405. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  406. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  407. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  408. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  410. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  411. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
  412. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  413. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  414. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  415. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  416. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  417. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  418. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
  419. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
  420. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
  421. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  422. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  423. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  424. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
  425. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
  426. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
  427. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  428. package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
  429. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
  430. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
  431. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
  432. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  433. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  435. package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
  436. package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
  437. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  438. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
  439. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  440. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
  441. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  442. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  443. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  444. package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
  445. package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
  446. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  447. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  448. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  449. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  450. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  451. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +196 -0
  452. package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
  453. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
  455. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
  456. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
  457. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
  458. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
  459. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  461. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  462. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  464. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  465. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  466. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  467. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -2
  468. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  469. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  470. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  471. package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
  472. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
  473. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  474. package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
  475. package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
  476. package/src/resources/extensions/gsd/types.ts +23 -4
  477. package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
  478. package/src/resources/extensions/gsd/unit-registry.ts +16 -2
  479. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  480. package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
  481. package/src/resources/extensions/gsd/uok/audit.ts +2 -0
  482. package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
  483. package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
  484. package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
  485. package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
  486. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  487. package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
  488. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  489. package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
  490. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  491. package/src/resources/extensions/gsd/workspace.ts +5 -21
  492. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  493. package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
  494. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  495. package/src/resources/extensions/shared/gsd-browser-cli.ts +29 -0
  496. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  497. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  498. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_buildManifest.js +0 -0
  499. /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_ssgManifest.js +0 -0
@@ -0,0 +1,71 @@
1
+ // gsd-pi — Code-change safety checks for auto-worktree merge closeout.
2
+ //
3
+ // Owns the git diff policy that decides whether a completed milestone actually
4
+ // changed user code, and whether an empty merge result is safe to clean up.
5
+
6
+ import { execFileSync } from "node:child_process";
7
+
8
+ import { GSDError, GSD_GIT_ERROR } from "./errors.js";
9
+ import { nativeDiffNumstat } from "./native-git-bridge.js";
10
+ import { logWarning } from "./workflow-logger.js";
11
+
12
+ const GIT_EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
13
+
14
+ export function assertNoUnanchoredCodeChangesAfterEmptyMerge(
15
+ basePath: string,
16
+ mainBranch: string,
17
+ milestoneBranch: string,
18
+ effectiveStrategy: "merge" | "squash",
19
+ nothingToCommit: boolean,
20
+ ): void {
21
+ if (!nothingToCommit) return;
22
+
23
+ const codeChanges = nativeDiffNumstat(basePath, mainBranch, milestoneBranch)
24
+ .filter((entry) => !entry.path.startsWith(".gsd/"));
25
+ if (codeChanges.length === 0) return;
26
+
27
+ throw new GSDError(
28
+ GSD_GIT_ERROR,
29
+ `${effectiveStrategy === "merge" ? "Merge" : "Squash merge"} produced nothing to commit but milestone branch "${milestoneBranch}" ` +
30
+ `has ${codeChanges.length} code file(s) not on "${mainBranch}". ` +
31
+ `Aborting worktree teardown to prevent data loss.`,
32
+ );
33
+ }
34
+
35
+ export function detectMergedCodeFilesChanged(basePath: string, nothingToCommit: boolean): boolean {
36
+ if (nothingToCommit) return false;
37
+
38
+ try {
39
+ const diffTreeOutput = execFileSync(
40
+ "git",
41
+ ["diff-tree", "--root", "--no-commit-id", "-r", "--name-only", "HEAD"],
42
+ { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
43
+ ).trim();
44
+ return containsCodeFile(diffTreeOutput);
45
+ } catch (err) {
46
+ return detectCodeFilesChangedFromEmptyTree(basePath, err);
47
+ }
48
+ }
49
+
50
+ function detectCodeFilesChangedFromEmptyTree(basePath: string, originalError: unknown): boolean {
51
+ try {
52
+ const fallbackOutput = execFileSync(
53
+ "git",
54
+ ["diff", "--name-only", GIT_EMPTY_TREE, "HEAD"],
55
+ { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
56
+ ).trim();
57
+ return containsCodeFile(fallbackOutput);
58
+ } catch {
59
+ // Truly unable to determine — assume code was changed to avoid silent data loss.
60
+ logWarning(
61
+ "worktree",
62
+ `diff-tree and empty-tree fallback both failed (assuming code changed): ${originalError instanceof Error ? originalError.message : String(originalError)}`,
63
+ );
64
+ return true;
65
+ }
66
+ }
67
+
68
+ function containsCodeFile(output: string): boolean {
69
+ const files = output ? output.split("\n").filter(Boolean) : [];
70
+ return files.some((file) => !file.startsWith(".gsd/"));
71
+ }
@@ -0,0 +1,112 @@
1
+ // gsd-pi — Milestone merge DB readiness guard.
2
+ //
3
+ // Owns the invariant that, before leaving worktree context for a milestone
4
+ // merge, the project DB is the active DB, worktree DB state is reconciled, and
5
+ // canonical closeout state proves the milestone is safe to merge.
6
+
7
+ import { join } from "node:path";
8
+
9
+ import { CLOSEOUT_CONSISTENCY_BLOCKED_REASON } from "./closeout-consistency-gate.js";
10
+ import {
11
+ closeWorkflowDatabase,
12
+ getWorkflowDatabasePath,
13
+ openWorkflowDatabasePath,
14
+ } from "./db-workspace.js";
15
+ import { GSDError, GSD_GIT_ERROR } from "./errors.js";
16
+ import {
17
+ isDbAvailable,
18
+ reconcileWorktreeDb,
19
+ } from "./gsd-db.js";
20
+ import {
21
+ formatCloseoutProofBlock,
22
+ proveMilestoneCloseout,
23
+ } from "./milestone-closeout-proof.js";
24
+ import { resolveGsdPathContract } from "./paths.js";
25
+ import { _shouldReconcileWorktreeDb } from "./auto-worktree-cleanup.js";
26
+ import { logError } from "./workflow-logger.js";
27
+
28
+ export interface MilestoneDbReadyRequest {
29
+ milestoneId: string;
30
+ projectRoot: string;
31
+ worktreeCwd: string;
32
+ }
33
+
34
+ interface MergeDbReadyDeps {
35
+ closeWorkflowDatabase: typeof closeWorkflowDatabase;
36
+ formatCloseoutProofBlock: typeof formatCloseoutProofBlock;
37
+ getWorkflowDatabasePath: typeof getWorkflowDatabasePath;
38
+ isDbAvailable: typeof isDbAvailable;
39
+ logError: typeof logError;
40
+ openWorkflowDatabasePath: typeof openWorkflowDatabasePath;
41
+ proveMilestoneCloseout: typeof proveMilestoneCloseout;
42
+ reconcileWorktreeDb: typeof reconcileWorktreeDb;
43
+ resolveGsdPathContract: typeof resolveGsdPathContract;
44
+ shouldReconcileWorktreeDb: typeof _shouldReconcileWorktreeDb;
45
+ }
46
+
47
+ const defaultDeps: MergeDbReadyDeps = {
48
+ closeWorkflowDatabase,
49
+ formatCloseoutProofBlock,
50
+ getWorkflowDatabasePath,
51
+ isDbAvailable,
52
+ logError,
53
+ openWorkflowDatabasePath,
54
+ proveMilestoneCloseout,
55
+ reconcileWorktreeDb,
56
+ resolveGsdPathContract,
57
+ shouldReconcileWorktreeDb: _shouldReconcileWorktreeDb,
58
+ };
59
+
60
+ let deps: MergeDbReadyDeps = defaultDeps;
61
+
62
+ export function _setMergeDbReadyDepsForTests(
63
+ overrides: Partial<MergeDbReadyDeps>,
64
+ ): void {
65
+ deps = { ...defaultDeps, ...overrides };
66
+ }
67
+
68
+ export function _resetMergeDbReadyDepsForTests(): void {
69
+ deps = defaultDeps;
70
+ }
71
+
72
+ function reconcileWorktreeDatabase(request: MilestoneDbReadyRequest): void {
73
+ const { milestoneId, projectRoot, worktreeCwd } = request;
74
+ const contract = deps.resolveGsdPathContract(worktreeCwd, projectRoot);
75
+ const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
76
+ const mainDbPath = contract.projectDb;
77
+
78
+ try {
79
+ const activeDbPath = deps.getWorkflowDatabasePath();
80
+ if (activeDbPath && deps.shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
81
+ deps.closeWorkflowDatabase();
82
+ if (!deps.openWorkflowDatabasePath(mainDbPath)) {
83
+ throw new Error(`cannot open project DB at ${mainDbPath}`);
84
+ }
85
+ }
86
+ if (deps.shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
87
+ deps.reconcileWorktreeDb(mainDbPath, worktreeDbPath);
88
+ }
89
+ } catch (err) {
90
+ const message = `DB reconciliation failed before milestone ${milestoneId} merge: ${err instanceof Error ? err.message : String(err)}`;
91
+ deps.logError("worktree", message);
92
+ throw new GSDError(
93
+ GSD_GIT_ERROR,
94
+ `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`,
95
+ );
96
+ }
97
+ }
98
+
99
+ function assertCloseoutProof(milestoneId: string): void {
100
+ const closeoutProof = deps.proveMilestoneCloseout(milestoneId);
101
+ if (!closeoutProof.ok) {
102
+ throw new GSDError(GSD_GIT_ERROR, deps.formatCloseoutProofBlock(closeoutProof));
103
+ }
104
+ }
105
+
106
+ export function assertMilestoneDbReadyForMerge(
107
+ request: MilestoneDbReadyRequest,
108
+ ): void {
109
+ if (!deps.isDbAvailable()) return;
110
+ reconcileWorktreeDatabase(request);
111
+ assertCloseoutProof(request.milestoneId);
112
+ }
@@ -0,0 +1,99 @@
1
+ // gsd-pi — Milestone merge integration-branch preparation.
2
+ //
3
+ // Owns branch-selection safety before the merge transaction touches the project
4
+ // root: resolve integration branch, fail closed on self-merge metadata, clear
5
+ // transient milestone state, reject detached HEAD, and checkout when needed.
6
+
7
+ import { GSDError, GSD_GIT_ERROR } from "./errors.js";
8
+ import {
9
+ resolveMilestoneIntegrationBranch,
10
+ } from "./git-service.js";
11
+ import {
12
+ nativeCheckoutBranch,
13
+ nativeDetectMainBranch,
14
+ nativeGetCurrentBranch,
15
+ } from "./native-git-bridge.js";
16
+ import { clearProjectRootStateFiles } from "./auto-worktree-cleanup.js";
17
+
18
+ export interface PrepareIntegrationBranchRequest {
19
+ milestoneBranch: string;
20
+ milestoneId: string;
21
+ prefs: Parameters<typeof resolveMilestoneIntegrationBranch>[2];
22
+ previousCwd: string;
23
+ projectRoot: string;
24
+ }
25
+
26
+ export interface PreparedIntegrationBranch {
27
+ mainBranch: string;
28
+ }
29
+
30
+ interface MergeIntegrationBranchDeps {
31
+ chdir: typeof process.chdir;
32
+ clearProjectRootStateFiles: typeof clearProjectRootStateFiles;
33
+ nativeCheckoutBranch: typeof nativeCheckoutBranch;
34
+ nativeDetectMainBranch: typeof nativeDetectMainBranch;
35
+ nativeGetCurrentBranch: typeof nativeGetCurrentBranch;
36
+ resolveMilestoneIntegrationBranch: typeof resolveMilestoneIntegrationBranch;
37
+ }
38
+
39
+ const defaultDeps: MergeIntegrationBranchDeps = {
40
+ chdir: process.chdir.bind(process),
41
+ clearProjectRootStateFiles,
42
+ nativeCheckoutBranch,
43
+ nativeDetectMainBranch,
44
+ nativeGetCurrentBranch,
45
+ resolveMilestoneIntegrationBranch,
46
+ };
47
+
48
+ let deps: MergeIntegrationBranchDeps = defaultDeps;
49
+
50
+ export function _setMergeIntegrationBranchDepsForTests(
51
+ overrides: Partial<MergeIntegrationBranchDeps>,
52
+ ): void {
53
+ deps = { ...defaultDeps, ...overrides };
54
+ }
55
+
56
+ export function _resetMergeIntegrationBranchDepsForTests(): void {
57
+ deps = defaultDeps;
58
+ }
59
+
60
+ function normalizeLocalBranchRef(branch: string): string {
61
+ return branch.startsWith("refs/heads/")
62
+ ? branch.slice("refs/heads/".length)
63
+ : branch;
64
+ }
65
+
66
+ export function prepareIntegrationBranchForMilestoneMerge(
67
+ request: PrepareIntegrationBranchRequest,
68
+ ): PreparedIntegrationBranch {
69
+ const { milestoneBranch, milestoneId, prefs, previousCwd, projectRoot } = request;
70
+ const branchResolution = deps.resolveMilestoneIntegrationBranch(projectRoot, milestoneId, prefs);
71
+ const mainBranch = branchResolution.effectiveBranch ?? deps.nativeDetectMainBranch(projectRoot);
72
+
73
+ if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
74
+ deps.chdir(previousCwd);
75
+ throw new GSDError(
76
+ GSD_GIT_ERROR,
77
+ `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
78
+ `"${milestoneBranch}" — refusing to self-merge. ${branchResolution.reason}. ` +
79
+ `Repair milestone integration metadata before retrying milestone completion.`,
80
+ );
81
+ }
82
+
83
+ deps.clearProjectRootStateFiles(projectRoot, milestoneId);
84
+
85
+ const currentBranchAtBase = deps.nativeGetCurrentBranch(projectRoot);
86
+ if (!currentBranchAtBase || currentBranchAtBase.length === 0) {
87
+ deps.chdir(previousCwd);
88
+ throw new GSDError(
89
+ GSD_GIT_ERROR,
90
+ `Project root is in detached HEAD state — cannot perform milestone merge. ` +
91
+ `Checkout an integration branch (e.g. \`git checkout ${mainBranch}\`) before resuming.`,
92
+ );
93
+ }
94
+ if (currentBranchAtBase !== mainBranch) {
95
+ deps.nativeCheckoutBranch(projectRoot, mainBranch);
96
+ }
97
+
98
+ return { mainBranch };
99
+ }
@@ -0,0 +1,166 @@
1
+ // gsd-pi — Milestone merge commit-message construction.
2
+ //
3
+ // Owns the completed-slice/task summary and milestone title fallback policy used
4
+ // by auto-worktree milestone merge commits and publication summaries.
5
+
6
+ import {
7
+ getMilestone,
8
+ getMilestoneSlices,
9
+ getSliceTasks,
10
+ isDbAvailable,
11
+ } from "./gsd-db.js";
12
+
13
+ interface CompletedTaskSummary {
14
+ id: string;
15
+ title: string;
16
+ }
17
+
18
+ interface CompletedSliceSummary {
19
+ id: string;
20
+ title: string;
21
+ tasks: CompletedTaskSummary[];
22
+ }
23
+
24
+ export interface MilestoneMergeMessageRequest {
25
+ milestoneId: string;
26
+ milestoneBranch: string;
27
+ roadmapContent: string;
28
+ }
29
+
30
+ export interface MilestoneMergeMessage {
31
+ commitMessage: string;
32
+ milestoneTitle: string;
33
+ sliceSummaries: string[];
34
+ }
35
+
36
+ interface MilestoneMergeMessageDeps {
37
+ isDbAvailable: typeof isDbAvailable;
38
+ getMilestone: typeof getMilestone;
39
+ getMilestoneSlices: typeof getMilestoneSlices;
40
+ getSliceTasks: typeof getSliceTasks;
41
+ }
42
+
43
+ const defaultDeps: MilestoneMergeMessageDeps = {
44
+ isDbAvailable,
45
+ getMilestone,
46
+ getMilestoneSlices,
47
+ getSliceTasks,
48
+ };
49
+
50
+ let deps: MilestoneMergeMessageDeps = defaultDeps;
51
+
52
+ export function _setMilestoneMergeMessageDepsForTests(
53
+ overrides: Partial<MilestoneMergeMessageDeps>,
54
+ ): void {
55
+ deps = { ...defaultDeps, ...overrides };
56
+ }
57
+
58
+ export function _resetMilestoneMergeMessageDepsForTests(): void {
59
+ deps = defaultDeps;
60
+ }
61
+
62
+ function stripGsdDisplayPrefix(value: string | undefined | null, id: string): string | undefined {
63
+ const raw = String(value ?? "").trim();
64
+ if (!raw) return undefined;
65
+
66
+ const lower = raw.toLowerCase();
67
+ const idLower = id.toLowerCase();
68
+ if (lower.startsWith(`${idLower}:`)) {
69
+ return raw.slice(id.length + 1).trim() || undefined;
70
+ }
71
+ return raw;
72
+ }
73
+
74
+ function getDbCompletedSlices(milestoneId: string): CompletedSliceSummary[] {
75
+ if (!deps.isDbAvailable()) return [];
76
+ return deps.getMilestoneSlices(milestoneId)
77
+ .filter((slice) => slice.status === "complete")
78
+ .map((slice) => ({
79
+ id: slice.id,
80
+ title: stripGsdDisplayPrefix(slice.title, slice.id) ?? slice.id,
81
+ tasks: deps.getSliceTasks(milestoneId, slice.id)
82
+ .filter((task) => task.status === "complete")
83
+ .map((task) => ({
84
+ id: task.id,
85
+ title: stripGsdDisplayPrefix(task.title, task.id) ?? task.id,
86
+ })),
87
+ }));
88
+ }
89
+
90
+ function getRoadmapCompletedSlices(roadmapContent: string): CompletedSliceSummary[] {
91
+ if (!roadmapContent) return [];
92
+
93
+ const completedSlices: CompletedSliceSummary[] = [];
94
+ const sliceRe = /- \[x\] \*\*(\w+):\s*(.+?)\*\*/gi;
95
+ let match: RegExpExecArray | null;
96
+ while ((match = sliceRe.exec(roadmapContent)) !== null) {
97
+ completedSlices.push({ id: match[1], title: match[2], tasks: [] });
98
+ }
99
+ return completedSlices;
100
+ }
101
+
102
+ function getCompletedSlices(
103
+ milestoneId: string,
104
+ roadmapContent: string,
105
+ ): CompletedSliceSummary[] {
106
+ const dbCompletedSlices = getDbCompletedSlices(milestoneId);
107
+ if (dbCompletedSlices.length > 0) return dbCompletedSlices;
108
+ return getRoadmapCompletedSlices(roadmapContent);
109
+ }
110
+
111
+ function getRoadmapMilestoneTitle(milestoneId: string, roadmapContent: string): string | undefined {
112
+ if (!roadmapContent) return undefined;
113
+ const titleMatch = roadmapContent.match(new RegExp(`^#\\s+${milestoneId}:\\s*(.+)`, "m"));
114
+ return titleMatch?.[1]?.trim() || undefined;
115
+ }
116
+
117
+ function getMilestoneTitle(milestoneId: string, roadmapContent: string): string {
118
+ const dbMilestone = deps.getMilestone(milestoneId);
119
+ const dbTitle = stripGsdDisplayPrefix(dbMilestone?.title, milestoneId);
120
+ return dbTitle ?? getRoadmapMilestoneTitle(milestoneId, roadmapContent) ?? milestoneId;
121
+ }
122
+
123
+ function buildCommitMessage(request: {
124
+ completedSlices: CompletedSliceSummary[];
125
+ milestoneBranch: string;
126
+ milestoneId: string;
127
+ milestoneTitle: string;
128
+ }): string {
129
+ const { completedSlices, milestoneBranch, milestoneId, milestoneTitle } = request;
130
+ const subject = `feat: ${milestoneTitle}`;
131
+ const milestoneContext = milestoneTitle === milestoneId
132
+ ? `Milestone: ${milestoneId}`
133
+ : `Milestone: ${milestoneId} - ${milestoneTitle}`;
134
+
135
+ if (completedSlices.length === 0) {
136
+ return `${subject}\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
137
+ }
138
+
139
+ const sliceLines = completedSlices
140
+ .map((slice) => `- ${slice.id}: ${slice.title}`)
141
+ .join("\n");
142
+ const taskLines = completedSlices
143
+ .flatMap((slice) => slice.tasks.map((task) => `- ${slice.id}/${task.id}: ${task.title}`))
144
+ .join("\n");
145
+ const taskBlock = taskLines ? `\n\nCompleted tasks:\n${taskLines}` : "";
146
+
147
+ return `${subject}\n\nCompleted slices:\n${sliceLines}${taskBlock}\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
148
+ }
149
+
150
+ export function buildMilestoneMergeMessage(
151
+ request: MilestoneMergeMessageRequest,
152
+ ): MilestoneMergeMessage {
153
+ const { milestoneId, milestoneBranch, roadmapContent } = request;
154
+ const completedSlices = getCompletedSlices(milestoneId, roadmapContent);
155
+ const milestoneTitle = getMilestoneTitle(milestoneId, roadmapContent);
156
+ return {
157
+ commitMessage: buildCommitMessage({
158
+ completedSlices,
159
+ milestoneBranch,
160
+ milestoneId,
161
+ milestoneTitle,
162
+ }),
163
+ milestoneTitle,
164
+ sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
165
+ };
166
+ }
@@ -0,0 +1,93 @@
1
+ // gsd-pi — Milestone merge pre-teardown safety guard.
2
+ //
3
+ // Owns the final data-loss check before deleting a merged milestone worktree:
4
+ // if the milestone worktree still has uncommitted work, abort teardown so the
5
+ // milestone branch remains a recovery ref.
6
+
7
+ import { existsSync } from "node:fs";
8
+
9
+ import { debugLog } from "./debug-logger.js";
10
+ import { GSDError, GSD_GIT_ERROR } from "./errors.js";
11
+ import {
12
+ nativeGetCurrentBranch,
13
+ nativeWorkingTreeStatus,
14
+ } from "./native-git-bridge.js";
15
+
16
+ export interface PreTeardownSafetyRequest {
17
+ milestoneBranch: string;
18
+ previousCwd: string;
19
+ worktreeCwd: string;
20
+ }
21
+
22
+ interface PreTeardownSafetyDeps {
23
+ chdir: typeof process.chdir;
24
+ debugLog: typeof debugLog;
25
+ existsSync: typeof existsSync;
26
+ nativeGetCurrentBranch: typeof nativeGetCurrentBranch;
27
+ nativeWorkingTreeStatus: typeof nativeWorkingTreeStatus;
28
+ }
29
+
30
+ const defaultDeps: PreTeardownSafetyDeps = {
31
+ chdir: process.chdir.bind(process),
32
+ debugLog,
33
+ existsSync,
34
+ nativeGetCurrentBranch,
35
+ nativeWorkingTreeStatus,
36
+ };
37
+
38
+ let deps: PreTeardownSafetyDeps = defaultDeps;
39
+
40
+ export function _setPreTeardownSafetyDepsForTests(
41
+ overrides: Partial<PreTeardownSafetyDeps>,
42
+ ): void {
43
+ deps = { ...defaultDeps, ...overrides };
44
+ }
45
+
46
+ export function _resetPreTeardownSafetyDepsForTests(): void {
47
+ deps = defaultDeps;
48
+ }
49
+
50
+ /**
51
+ * Abort teardown when the milestone worktree still has uncommitted changes.
52
+ *
53
+ * The guard is intentionally scoped to worktree paths that are still on the
54
+ * milestone branch. In branch-mode or parallel merge paths, `worktreeCwd` can
55
+ * point at the integration branch; blocking on that dirty state would conflate
56
+ * unrelated milestones and preserve the wrong recovery ref.
57
+ */
58
+ export function assertMilestoneWorktreeCleanBeforeTeardown(
59
+ request: PreTeardownSafetyRequest,
60
+ ): void {
61
+ const { milestoneBranch, previousCwd, worktreeCwd } = request;
62
+ if (!deps.existsSync(worktreeCwd)) return;
63
+
64
+ let preTeardownBranch: string | null = null;
65
+ try {
66
+ preTeardownBranch = deps.nativeGetCurrentBranch(worktreeCwd);
67
+ } catch (err) {
68
+ deps.debugLog("mergeMilestoneToMain", {
69
+ phase: "pre-teardown-branch-detect-failed",
70
+ error: String(err),
71
+ });
72
+ }
73
+
74
+ if (preTeardownBranch !== milestoneBranch) return;
75
+
76
+ try {
77
+ const dirtyCheck = deps.nativeWorkingTreeStatus(worktreeCwd);
78
+ if (!dirtyCheck) return;
79
+
80
+ deps.chdir(previousCwd);
81
+ throw new GSDError(
82
+ GSD_GIT_ERROR,
83
+ `Milestone worktree still has uncommitted changes after squash merge. ` +
84
+ `Aborting teardown to preserve ${milestoneBranch}. Status:\n${dirtyCheck}`,
85
+ );
86
+ } catch (err) {
87
+ if (err instanceof GSDError) throw err;
88
+ deps.debugLog("mergeMilestoneToMain", {
89
+ phase: "pre-teardown-dirty-check-error",
90
+ error: String(err),
91
+ });
92
+ }
93
+ }