@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87

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 (657) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli-web-branch.d.ts +2 -0
  4. package/dist/cli-web-branch.js +9 -2
  5. package/dist/cli.js +1 -1
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +7 -29
  8. package/dist/help-text.js +5 -0
  9. package/dist/models-resolver.d.ts +3 -13
  10. package/dist/models-resolver.js +3 -22
  11. package/dist/resource-loader.js +2 -14
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/ask-user-questions.js +78 -23
  14. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  15. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  16. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  17. package/dist/resources/extensions/browser-tools/index.js +69 -12
  18. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  19. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
  20. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  21. package/dist/resources/extensions/github-sync/templates.js +3 -3
  22. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  24. package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
  25. package/dist/resources/extensions/gsd/auto/phases.js +34 -4
  26. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  27. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  28. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  29. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  30. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  31. package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
  32. package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
  33. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  34. package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
  35. package/dist/resources/extensions/gsd/auto-start.js +24 -37
  36. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  37. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  38. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
  39. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  40. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  41. package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
  42. package/dist/resources/extensions/gsd/auto.js +19 -27
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  44. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
  46. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  47. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
  50. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  51. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  52. package/dist/resources/extensions/gsd/captures.js +5 -15
  53. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  54. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  55. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  56. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  57. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  58. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  59. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  60. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  61. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  62. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  63. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  64. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  65. package/dist/resources/extensions/gsd/db/queries.js +372 -0
  66. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  67. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  68. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  69. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  70. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  71. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  72. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  73. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  74. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  75. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  76. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  77. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  78. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  79. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  80. package/dist/resources/extensions/gsd/doctor.js +16 -9
  81. package/dist/resources/extensions/gsd/error-classifier.js +10 -1
  82. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  83. package/dist/resources/extensions/gsd/git-service.js +1 -0
  84. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  85. package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
  86. package/dist/resources/extensions/gsd/guidance.js +98 -0
  87. package/dist/resources/extensions/gsd/guided-flow.js +83 -471
  88. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  89. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
  90. package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
  91. package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
  92. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  93. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  94. package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
  95. package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
  96. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  97. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  98. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  100. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  101. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  102. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  103. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  104. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  105. package/dist/resources/extensions/gsd/model-router.js +3 -0
  106. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  107. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  108. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  109. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  110. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  111. package/dist/resources/extensions/gsd/paths.js +37 -24
  112. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  113. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  114. package/dist/resources/extensions/gsd/preferences-models.js +12 -46
  115. package/dist/resources/extensions/gsd/preferences.js +161 -29
  116. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  117. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  118. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  119. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  120. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  121. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  122. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  124. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  125. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  126. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  127. package/dist/resources/extensions/gsd/publication.js +87 -0
  128. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  129. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  130. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  131. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  132. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +14 -25
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  142. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  143. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  144. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  145. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  148. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
  150. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
  151. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  153. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  154. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  155. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  156. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  157. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  158. package/dist/resources/extensions/gsd/uat-policy.js +17 -10
  159. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  160. package/dist/resources/extensions/gsd/undo.js +8 -7
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  165. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  166. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
  167. package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
  168. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  169. package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
  170. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  171. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  172. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  173. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  174. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  175. package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
  176. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  177. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  178. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  179. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  180. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  182. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  183. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
  187. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  188. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  189. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  190. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  191. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  192. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  193. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  195. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  196. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  197. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  198. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  199. package/dist/update-cmd.js +20 -0
  200. package/dist/web/standalone/.next/BUILD_ID +1 -1
  201. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  202. package/dist/web/standalone/.next/build-manifest.json +3 -3
  203. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  204. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  205. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +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/stream/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  254. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/index.html +1 -1
  256. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  261. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  262. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  263. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  264. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  265. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  266. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  269. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  270. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  271. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  272. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  273. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  274. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  275. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  277. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  279. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  280. package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
  281. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
  282. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  283. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  284. package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
  285. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
  286. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
  287. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
  288. package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
  289. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  290. package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
  291. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  292. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
  293. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  294. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  295. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  296. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
  297. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
  298. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  299. package/dist/web/standalone/package.json +1 -1
  300. package/dist/web-mode.d.ts +2 -0
  301. package/dist/web-mode.js +20 -8
  302. package/dist/worktree-cli.js +3 -6
  303. package/dist/worktree-status-banner.js +7 -11
  304. package/package.json +2 -1
  305. package/packages/cloud-mcp-gateway/package.json +2 -2
  306. package/packages/contracts/dist/workflow.d.ts +4 -0
  307. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  308. package/packages/contracts/dist/workflow.js.map +1 -1
  309. package/packages/contracts/package.json +1 -1
  310. package/packages/daemon/package.json +4 -4
  311. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  312. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  313. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  314. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  315. package/packages/gsd-agent-core/package.json +5 -5
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  320. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  321. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  323. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  324. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  325. package/packages/gsd-agent-modes/package.json +7 -7
  326. package/packages/mcp-server/dist/cli.js +6 -3
  327. package/packages/mcp-server/dist/cli.js.map +1 -1
  328. package/packages/mcp-server/dist/server.d.ts +10 -0
  329. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  330. package/packages/mcp-server/dist/server.js +8 -0
  331. package/packages/mcp-server/dist/server.js.map +1 -1
  332. package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
  333. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  334. package/packages/mcp-server/dist/workflow-tools.js +48 -22
  335. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  336. package/packages/mcp-server/package.json +3 -3
  337. package/packages/native/package.json +1 -1
  338. package/packages/pi-agent-core/package.json +1 -1
  339. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  340. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  341. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  342. package/packages/pi-ai/dist/models.generated.d.ts +455 -546
  343. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  344. package/packages/pi-ai/dist/models.generated.js +481 -599
  345. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  346. package/packages/pi-ai/package.json +1 -1
  347. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  349. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  350. package/packages/pi-coding-agent/package.json +7 -7
  351. package/packages/pi-tui/dist/components/input.js +1 -1
  352. package/packages/pi-tui/dist/components/input.js.map +1 -1
  353. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  354. package/packages/pi-tui/dist/keys.js +39 -30
  355. package/packages/pi-tui/dist/keys.js.map +1 -1
  356. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  357. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  358. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  359. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/tui.js +9 -0
  361. package/packages/pi-tui/dist/tui.js.map +1 -1
  362. package/packages/pi-tui/package.json +2 -2
  363. package/packages/rpc-client/package.json +2 -2
  364. package/pkg/package.json +1 -1
  365. package/src/resources/extensions/ask-user-questions.ts +87 -24
  366. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  367. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  368. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  369. package/src/resources/extensions/browser-tools/index.ts +71 -13
  370. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  371. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  372. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  373. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
  374. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
  375. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  376. package/src/resources/extensions/github-sync/templates.ts +3 -3
  377. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  378. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  379. package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
  380. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
  381. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  382. package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
  383. package/src/resources/extensions/gsd/auto/phases.ts +45 -4
  384. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  385. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  386. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  387. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  388. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  389. package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
  390. package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
  391. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  392. package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
  393. package/src/resources/extensions/gsd/auto-start.ts +29 -35
  394. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  395. package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
  396. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
  397. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  398. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  399. package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
  400. package/src/resources/extensions/gsd/auto.ts +35 -32
  401. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  402. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  403. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
  404. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  405. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  406. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
  407. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
  408. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  409. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  410. package/src/resources/extensions/gsd/captures.ts +5 -16
  411. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  412. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  413. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  414. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  415. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  416. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  417. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  418. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  419. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  420. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  421. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  422. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  423. package/src/resources/extensions/gsd/db/queries.ts +453 -0
  424. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  425. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  426. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  427. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  428. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  429. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  430. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  431. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  432. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  433. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  434. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  435. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  436. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  437. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  438. package/src/resources/extensions/gsd/doctor.ts +15 -5
  439. package/src/resources/extensions/gsd/error-classifier.ts +12 -1
  440. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  441. package/src/resources/extensions/gsd/git-service.ts +1 -0
  442. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  443. package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
  444. package/src/resources/extensions/gsd/guidance.ts +139 -0
  445. package/src/resources/extensions/gsd/guided-flow.ts +95 -561
  446. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  447. package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
  448. package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
  449. package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
  450. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  451. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  452. package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
  453. package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
  454. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  455. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  456. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  457. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  458. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  459. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  460. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  461. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  462. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  463. package/src/resources/extensions/gsd/model-router.ts +3 -0
  464. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  465. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  466. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  467. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  468. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  469. package/src/resources/extensions/gsd/paths.ts +42 -22
  470. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  471. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  472. package/src/resources/extensions/gsd/preferences-models.ts +10 -46
  473. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  474. package/src/resources/extensions/gsd/preferences.ts +191 -28
  475. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  476. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  477. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
  478. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  479. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  483. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  484. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  485. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  486. package/src/resources/extensions/gsd/publication.ts +122 -0
  487. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  488. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  489. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  490. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  492. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  493. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  494. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  495. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  496. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  497. package/src/resources/extensions/gsd/state.ts +19 -26
  498. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  499. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  500. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  501. package/src/resources/extensions/gsd/templates/project.md +1 -0
  502. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  503. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  504. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  505. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  506. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
  507. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  508. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  509. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
  510. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  511. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  512. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  513. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  515. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  516. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  517. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  518. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  519. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  520. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  521. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  522. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
  523. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  524. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
  525. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  526. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  527. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  528. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  529. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  530. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  531. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  532. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  533. package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
  534. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  535. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  536. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  537. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  538. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  539. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
  540. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  541. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  542. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  543. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  544. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  545. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  546. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  547. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  548. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  549. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  551. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
  554. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  556. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  557. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  558. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  559. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  560. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
  561. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  562. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
  563. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  564. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  566. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
  567. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  568. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
  569. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  570. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  571. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  572. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  573. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  574. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  575. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  576. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  577. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
  578. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  579. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
  580. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  581. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
  582. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  583. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
  584. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
  585. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  586. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  587. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  588. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
  589. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  591. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  592. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  593. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  594. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  596. package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
  597. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  598. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  599. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  600. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  601. package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
  602. package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
  603. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  604. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  605. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  606. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  607. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  608. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  609. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  610. package/src/resources/extensions/gsd/uat-policy.ts +20 -10
  611. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  612. package/src/resources/extensions/gsd/undo.ts +9 -8
  613. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  614. package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
  615. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  616. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  617. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  618. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
  619. package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
  620. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  621. package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
  622. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  623. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  624. package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
  625. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  626. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  627. package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
  628. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  629. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  630. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  631. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  632. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  633. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  634. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  635. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  636. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  637. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  638. package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
  639. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  640. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  641. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  642. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  643. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  644. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  645. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  646. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  647. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  648. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  649. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  650. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  653. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  655. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  656. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
  657. /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
@@ -5,6 +5,7 @@ import { existsSync, lstatSync, readdirSync, type Stats } from "node:fs";
5
5
  import { join } from "node:path";
6
6
 
7
7
  import { worktreePath } from "./worktree-manager.js";
8
+ import { worktreesDirs } from "./worktree-placement.js";
8
9
  import { normalizeWorktreePathForCompare } from "./worktree-root.js";
9
10
  import type { WorktreeSafetyResult } from "./worktree-safety.js";
10
11
 
@@ -39,6 +40,16 @@ export function expectedAutoWorktreePath(
39
40
  return worktreePath(projectRoot, id);
40
41
  }
41
42
 
43
+ /** Every path the milestone worktree may legitimately live at (canonical + legacy). */
44
+ function candidateAutoWorktreePaths(
45
+ projectRoot: string,
46
+ milestoneId: string | null | undefined,
47
+ ): string[] {
48
+ const id = milestoneId?.trim();
49
+ if (!id || !isValidMilestoneId(id)) return [];
50
+ return worktreesDirs(projectRoot).map((dir) => join(dir, id));
51
+ }
52
+
42
53
  export function resolvePausedAutoWorktreePath(input: {
43
54
  basePath: string;
44
55
  originalBasePath?: string | null;
@@ -82,8 +93,8 @@ export function assessAutoWorktreeRepairTarget(input: {
82
93
  if (!expectedPath) {
83
94
  return { ok: false, reason: "missing expected worktree path" };
84
95
  }
85
- const computedExpectedPath = expectedAutoWorktreePath(input.projectRoot, input.milestoneId);
86
- if (!computedExpectedPath || !samePath(expectedPath, computedExpectedPath)) {
96
+ const candidatePaths = candidateAutoWorktreePaths(input.projectRoot, input.milestoneId);
97
+ if (candidatePaths.length === 0 || !candidatePaths.some((candidate) => samePath(expectedPath, candidate))) {
87
98
  return { ok: false, reason: "expected worktree path does not match milestone" };
88
99
  }
89
100
  if (!samePath(input.activeRoot, input.projectRoot) && !samePath(input.activeRoot, expectedPath)) {
@@ -20,7 +20,7 @@ import {
20
20
  unlinkSync,
21
21
  lstatSync as lstatSyncFn,
22
22
  } from "node:fs";
23
- import { dirname, isAbsolute, join, relative, resolve, sep as pathSep } from "node:path";
23
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
24
24
  import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
25
25
  import {
26
26
  reconcileWorktreeDb,
@@ -28,10 +28,12 @@ import {
28
28
  getMilestone,
29
29
  getMilestoneSlices,
30
30
  getSliceTasks,
31
- closeDatabase,
32
- openDatabase,
33
- getDbPath,
34
31
  } from "./gsd-db.js";
32
+ import {
33
+ closeWorkflowDatabase,
34
+ getWorkflowDatabasePath,
35
+ openWorkflowDatabasePath,
36
+ } from "./db-workspace.js";
35
37
  import { atomicWriteSync } from "./atomic-write.js";
36
38
  import { execFileSync } from "node:child_process";
37
39
  import { gsdRoot, resolveGsdPathContract } from "./paths.js";
@@ -42,6 +44,7 @@ import {
42
44
  worktreePath,
43
45
  isInsideWorktreesDir,
44
46
  } from "./worktree-manager.js";
47
+ import { worktreePathFor } from "./worktree-placement.js";
45
48
  import {
46
49
  detectWorktreeName,
47
50
  resolveGitHeadPath,
@@ -49,14 +52,25 @@ import {
49
52
  } from "./worktree.js";
50
53
  import {
51
54
  isGsdWorktreePath,
55
+ projectRootFromWorktreePath,
52
56
  normalizeWorktreePathForCompare,
53
57
  resolveWorktreeProjectRoot,
54
58
  } from "./worktree-root.js";
55
59
  import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
56
- import { MergeConflictError, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
57
- import { buildPrEvidence } from "./pr-evidence.js";
60
+ import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
61
+ import { publishMilestone } from "./publication.js";
58
62
  import { debugLog } from "./debug-logger.js";
59
63
  import { logWarning, logError } from "./workflow-logger.js";
64
+ import {
65
+ checkoutBranchWithStashGuard,
66
+ cleanupConflictState,
67
+ gsdJsonlFilesWithConflictMarkers,
68
+ hasConflictMarkers,
69
+ popStashByRef,
70
+ removeMergeStateFiles,
71
+ stashAlreadyExistsFilesFromError,
72
+ stashRefFromError,
73
+ } from "./worktree-git-recovery.js";
60
74
  import { loadEffectiveGSDPreferences } from "./preferences.js";
61
75
  import { MILESTONE_ID_RE } from "./milestone-ids.js";
62
76
  import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
@@ -80,22 +94,19 @@ import {
80
94
  nativeDiffNumstat,
81
95
  nativeUpdateRef,
82
96
  nativeIsAncestor,
83
- nativeMergeAbort,
84
97
  nativeWorktreeList,
85
98
  nativeLsFiles,
86
99
  } from "./native-git-bridge.js";
87
100
  import {
88
101
  CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
89
- checkCloseoutConsistencyGate,
90
- formatCloseoutConsistencyBlock,
91
102
  } from "./closeout-consistency-gate.js";
103
+ import {
104
+ formatCloseoutProofBlock,
105
+ proveMilestoneCloseout,
106
+ } from "./milestone-closeout-proof.js";
92
107
  import { gsdHome } from "./gsd-home.js";
93
108
  import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
94
- import {
95
- _finalizeProjectionForMergeImpl,
96
- _projectRootToWorktreeImpl,
97
- _projectWorktreeToRootImpl,
98
- } from "./worktree-state-projection.js";
109
+ import { WorktreeStateProjection } from "./worktree-state-projection.js";
99
110
 
100
111
  const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
101
112
  const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
@@ -129,111 +140,6 @@ const ROOT_STATE_FILES = [
129
140
  // because the project root is authoritative for preferences (#2684).
130
141
  ] as const;
131
142
 
132
- /**
133
- * Pop a stash entry by tracking the unique marker embedded in its message so
134
- * concurrent stash operations against the same project root cannot cause us to
135
- * pop the wrong entry.
136
- *
137
- * If `stashMarker` is null or no longer present in the stash list (e.g. a
138
- * concurrent process popped/dropped it), leaves the stash list untouched and
139
- * returns null.
140
- *
141
- * Throws on pop failure so callers can handle conflict cases the same way
142
- * they would with the prior `git stash pop` form. When throwing after a
143
- * targeted pop attempt, the error is annotated with the targeted stash ref.
144
- *
145
- * (Issue #4980 HIGH-6)
146
- */
147
- function popStashByRef(basePath: string, stashMarker: string | null): string | null {
148
- let popArg: string | null = null;
149
- if (stashMarker) {
150
- try {
151
- const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
152
- cwd: basePath,
153
- stdio: ["ignore", "pipe", "pipe"],
154
- encoding: "utf-8",
155
- }).trim().split("\n").filter(Boolean);
156
- for (const entry of list) {
157
- const [ref, subject] = entry.split("\0");
158
- if (ref && subject?.includes(stashMarker)) {
159
- popArg = ref;
160
- break;
161
- }
162
- }
163
- } catch (err) {
164
- logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
165
- }
166
- }
167
- if (!popArg) {
168
- logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
169
- return null;
170
- }
171
- try {
172
- execFileSync("git", ["stash", "pop", popArg], {
173
- cwd: basePath,
174
- stdio: ["ignore", "pipe", "pipe"],
175
- encoding: "utf-8",
176
- });
177
- } catch (err) {
178
- if (err && typeof err === "object") {
179
- (err as { stashRef?: string }).stashRef = popArg;
180
- }
181
- throw err;
182
- }
183
- return popArg;
184
- }
185
-
186
- /**
187
- * Extract a stash ref annotation injected by popStashByRef() when git stash
188
- * pop fails and we need to conditionally drop the exact stash entry later.
189
- */
190
- function stashRefFromError(err: unknown): string | null {
191
- if (!err || typeof err !== "object") return null;
192
- const stashRef = (err as { stashRef?: unknown }).stashRef;
193
- return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
194
- }
195
-
196
- function stashAlreadyExistsFilesFromError(err: unknown): string[] {
197
- if (!err || typeof err !== "object") return [];
198
- const stderr = (err as { stderr?: unknown }).stderr;
199
- const stderrText = typeof stderr === "string"
200
- ? stderr
201
- : stderr instanceof Uint8Array
202
- ? Buffer.from(stderr).toString("utf-8")
203
- : "";
204
- const message = err instanceof Error ? err.message : String(err);
205
- const text = `${stderrText}\n${message}`;
206
- const files = new Set<string>();
207
- for (const line of text.split("\n")) {
208
- const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
209
- if (!m) continue;
210
- const filePath = m[1]?.trim();
211
- if (filePath) files.add(filePath);
212
- }
213
- return [...files];
214
- }
215
-
216
- /**
217
- * Detect whether an on-disk file still contains unresolved merge conflict
218
- * markers from a failed stash-pop or merge attempt.
219
- *
220
- * Returns false when the file cannot be read.
221
- */
222
- function hasConflictMarkers(filePath: string): boolean {
223
- try {
224
- const content = readFileSync(filePath, "utf-8");
225
- return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
226
- } catch {
227
- return false;
228
- }
229
- }
230
-
231
- function gsdJsonlFilesWithConflictMarkers(basePath: string): string[] {
232
- return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) =>
233
- hasConflictMarkers(join(basePath, f)),
234
- );
235
- }
236
-
237
143
  /**
238
144
  * Check if two filesystem paths resolve to the same real location.
239
145
  * Returns false if either path cannot be resolved (e.g. doesn't exist).
@@ -379,19 +285,6 @@ export function _gitPathspecForWorktreePath(basePath: string, targetPath: string
379
285
  return gitPathspecForWorktreePath(basePath, targetPath);
380
286
  }
381
287
 
382
- function gitRemoteExists(basePath: string, remote: string): boolean {
383
- try {
384
- execFileSync("git", ["remote", "get-url", remote], {
385
- cwd: basePath,
386
- stdio: ["ignore", "pipe", "pipe"],
387
- encoding: "utf-8",
388
- });
389
- return true;
390
- } catch {
391
- return false;
392
- }
393
- }
394
-
395
288
  function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
396
289
  const changedPaths = new Set<string>();
397
290
  let mergeLog = "";
@@ -521,49 +414,6 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
521
414
  filePath.startsWith(".gsd/") ||
522
415
  SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
523
416
 
524
- function removeMergeStateFiles(basePath: string, contextLabel: string): void {
525
- try {
526
- for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
527
- const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
528
- cwd: basePath,
529
- stdio: ["ignore", "pipe", "pipe"],
530
- encoding: "utf-8",
531
- }).trim();
532
- const p = rawPath.length > 0
533
- ? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
534
- : join(resolveGitDir(basePath), f);
535
- if (existsSync(p)) unlinkSync(p);
536
- }
537
- } catch (err) {
538
- logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
539
- }
540
- }
541
-
542
- function cleanupConflictState(basePath: string): void {
543
- // Merge conflicts can leave unmerged index entries; merge-abort alone is not
544
- // enough for squash merges (MERGE_HEAD is never written). Reset the merge
545
- // index, then remove merge message files that native/libgit2 paths may have
546
- // created.
547
- try {
548
- nativeMergeAbort(basePath);
549
- } catch (err) {
550
- // MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
551
- debugLog("conflict-cleanup:merge-abort-skipped", {
552
- error: err instanceof Error ? err.message : String(err),
553
- });
554
- }
555
- try {
556
- execFileSync("git", ["reset", "--merge"], {
557
- cwd: basePath,
558
- stdio: ["ignore", "pipe", "pipe"],
559
- encoding: "utf-8",
560
- });
561
- } catch (err) {
562
- logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
563
- }
564
- removeMergeStateFiles(basePath, "conflict");
565
- }
566
-
567
417
  // ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
568
418
 
569
419
  /**
@@ -584,7 +434,7 @@ export function syncProjectRootToWorktree(
584
434
  worktreePath_: string,
585
435
  milestoneId: string | null,
586
436
  ): void {
587
- _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
437
+ new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
588
438
  }
589
439
 
590
440
  /**
@@ -597,7 +447,7 @@ export function syncStateToProjectRoot(
597
447
  projectRoot: string,
598
448
  milestoneId: string | null,
599
449
  ): void {
600
- _projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
450
+ new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
601
451
  }
602
452
 
603
453
  // ─── Resource Staleness ───────────────────────────────────────────────────
@@ -652,21 +502,8 @@ export function checkResourcesStale(
652
502
  * Returns the corrected base path.
653
503
  */
654
504
  export function escapeStaleWorktree(base: string): string {
655
- // Direct layout: /.gsd/worktrees/
656
- const directMarker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
657
- let idx = base.indexOf(directMarker);
658
- if (idx === -1) {
659
- // Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
660
- const symlinkRe = new RegExp(
661
- `\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`,
662
- );
663
- const match = base.match(symlinkRe);
664
- if (!match || match.index === undefined) return base;
665
- idx = match.index;
666
- }
667
-
668
- // base is inside .gsd/worktrees/<something> — extract the project root
669
- const projectRoot = base.slice(0, idx);
505
+ const projectRoot = projectRootFromWorktreePath(base);
506
+ if (projectRoot === null) return base;
670
507
 
671
508
  // Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
672
509
  // the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
@@ -960,7 +797,11 @@ export function syncWorktreeStateBack(
960
797
  worktreePath: string,
961
798
  milestoneId: string,
962
799
  ): { synced: string[] } {
963
- return _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
800
+ return new WorktreeStateProjection().finalizeProjectionForMergePaths(
801
+ mainBasePath,
802
+ worktreePath,
803
+ milestoneId,
804
+ );
964
805
  }
965
806
  export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
966
807
 
@@ -1059,122 +900,6 @@ export function enterBranchModeForMilestone(
1059
900
  checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
1060
901
  }
1061
902
 
1062
- export function checkoutBranchWithStashGuard(
1063
- basePath: string,
1064
- branch: string,
1065
- reason: string,
1066
- ): void {
1067
- let stashMarker: string | null = null;
1068
- let stashed = false;
1069
-
1070
- const status = nativeWorkingTreeStatus(basePath).trim();
1071
- if (status.length > 0) {
1072
- stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
1073
- const stashListBefore = execFileSync("git", ["stash", "list"], {
1074
- cwd: basePath,
1075
- stdio: ["ignore", "pipe", "pipe"],
1076
- encoding: "utf-8",
1077
- });
1078
- execFileSync(
1079
- "git",
1080
- ["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
1081
- {
1082
- cwd: basePath,
1083
- stdio: ["ignore", "pipe", "pipe"],
1084
- encoding: "utf-8",
1085
- },
1086
- );
1087
- const stashListAfter = execFileSync("git", ["stash", "list"], {
1088
- cwd: basePath,
1089
- stdio: ["ignore", "pipe", "pipe"],
1090
- encoding: "utf-8",
1091
- });
1092
- stashed = stashListAfter !== stashListBefore;
1093
- }
1094
-
1095
- // Checkout and stash-restore are split so we can distinguish two failure
1096
- // modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
1097
- // (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
1098
- // the working-tree changes remain in the stash list. We surface a distinct
1099
- // error in case (b) so callers don't assume the branch switch was rolled back.
1100
- try {
1101
- nativeCheckoutBranch(basePath, branch);
1102
- } catch (checkoutErr) {
1103
- if (stashed) {
1104
- try {
1105
- popStashByRef(basePath, stashMarker);
1106
- } catch (restoreErr) {
1107
- logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
1108
- }
1109
- }
1110
- throw checkoutErr;
1111
- }
1112
-
1113
- if (stashed) {
1114
- try {
1115
- popStashByRef(basePath, stashMarker);
1116
- } catch (popErr) {
1117
- const msg = popErr instanceof Error ? popErr.message : String(popErr);
1118
- const stderr = popErr && typeof popErr === "object"
1119
- ? (popErr as { stderr?: unknown }).stderr
1120
- : undefined;
1121
- const stderrText = typeof stderr === "string"
1122
- ? stderr
1123
- : stderr instanceof Uint8Array
1124
- ? Buffer.from(stderr).toString("utf-8")
1125
- : "";
1126
- const stashPopMessage = `${stderrText}\n${msg}`.trim();
1127
- const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
1128
- const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
1129
- const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
1130
- const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
1131
- const stashRefForDrop = stashRefFromError(popErr);
1132
- const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
1133
- const gsdContentConflicts = isUntrackedRestoreFailure
1134
- ? gsdJsonlFilesWithConflictMarkers(basePath)
1135
- : [];
1136
- const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
1137
-
1138
- if (
1139
- isUntrackedRestoreFailure &&
1140
- gsdConflictFiles.length > 0 &&
1141
- nonGsdAlreadyExists.length === 0 &&
1142
- nonGsdUnmerged.length === 0
1143
- ) {
1144
- for (const f of gsdConflictFiles) {
1145
- execFileSync("git", ["checkout", "HEAD", "--", f], {
1146
- cwd: basePath,
1147
- stdio: ["ignore", "pipe", "pipe"],
1148
- encoding: "utf-8",
1149
- });
1150
- nativeAddPaths(basePath, [f]);
1151
- }
1152
-
1153
- if (stashRefForDrop) {
1154
- try {
1155
- execFileSync("git", ["stash", "drop", stashRefForDrop], {
1156
- cwd: basePath,
1157
- stdio: ["ignore", "pipe", "pipe"],
1158
- encoding: "utf-8",
1159
- });
1160
- } catch (err) { /* stash may already be consumed */
1161
- logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
1162
- }
1163
- } else {
1164
- logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
1165
- }
1166
- return;
1167
- }
1168
-
1169
- const wrapped = new Error(
1170
- `checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
1171
- );
1172
- if (stashRefForDrop) (wrapped as { stashRef?: string }).stashRef = stashRefForDrop;
1173
- throw wrapped;
1174
- }
1175
- }
1176
- }
1177
-
1178
903
  // ─── Public API ────────────────────────────────────────────────────────────
1179
904
 
1180
905
  /**
@@ -1560,7 +1285,9 @@ export function getAutoWorktreePath(
1560
1285
  ): string | null {
1561
1286
  basePath = resolveWorktreeProjectRoot(basePath);
1562
1287
 
1563
- const p = worktreePath(basePath, milestoneId);
1288
+ // basePath is already the resolved project root — go straight to placement
1289
+ // instead of worktreePath(), which would re-resolve the root.
1290
+ const p = worktreePathFor(basePath, milestoneId);
1564
1291
  if (!existsSync(p)) return null;
1565
1292
 
1566
1293
  // Validate this is a real git worktree, not a stray directory.
@@ -1782,10 +1509,10 @@ export function mergeMilestoneToMain(
1782
1509
  const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
1783
1510
  const mainDbPath = contract.projectDb;
1784
1511
  try {
1785
- const activeDbPath = getDbPath();
1512
+ const activeDbPath = getWorkflowDatabasePath();
1786
1513
  if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
1787
- closeDatabase();
1788
- if (!openDatabase(mainDbPath)) {
1514
+ closeWorkflowDatabase();
1515
+ if (!openWorkflowDatabasePath(mainDbPath)) {
1789
1516
  throw new Error(`cannot open project DB at ${mainDbPath}`);
1790
1517
  }
1791
1518
  }
@@ -1798,9 +1525,9 @@ export function mergeMilestoneToMain(
1798
1525
  throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
1799
1526
  }
1800
1527
 
1801
- const closeoutGate = checkCloseoutConsistencyGate(milestoneId);
1802
- if (!closeoutGate.ok) {
1803
- throw new GSDError(GSD_GIT_ERROR, formatCloseoutConsistencyBlock(closeoutGate));
1528
+ const closeoutProof = proveMilestoneCloseout(milestoneId);
1529
+ if (!closeoutProof.ok) {
1530
+ throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
1804
1531
  }
1805
1532
  }
1806
1533
 
@@ -2127,10 +1854,10 @@ export function mergeMilestoneToMain(
2127
1854
  // stashing so Windows releases the handles; reopen after. No-op on
2128
1855
  // POSIX, where advisory locks don't block git.
2129
1856
  const needsDbCycle = process.platform === "win32" && isDbAvailable();
2130
- const dbPathToReopen = needsDbCycle ? getDbPath() : null;
1857
+ const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
2131
1858
  if (needsDbCycle) {
2132
1859
  try {
2133
- closeDatabase();
1860
+ closeWorkflowDatabase();
2134
1861
  } catch (err) {
2135
1862
  logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
2136
1863
  }
@@ -2180,7 +1907,7 @@ export function mergeMilestoneToMain(
2180
1907
  : nativeMergeSquash(originalBasePath_, milestoneBranch);
2181
1908
  if (needsDbCycle && dbPathToReopen) {
2182
1909
  try {
2183
- openDatabase(dbPathToReopen);
1910
+ openWorkflowDatabasePath(dbPathToReopen);
2184
1911
  } catch (err) {
2185
1912
  logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
2186
1913
  }
@@ -2302,8 +2029,6 @@ export function mergeMilestoneToMain(
2302
2029
  const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
2303
2030
  const gsdContentConflicts: string[] = [];
2304
2031
  const alreadyExists = stashAlreadyExistsFilesFromError(e);
2305
- const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
2306
- const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
2307
2032
 
2308
2033
  // Untracked-file restore failures can leave marker conflicts in tracked
2309
2034
  // .gsd JSONL files without producing `U` status entries.
@@ -2367,11 +2092,12 @@ export function mergeMilestoneToMain(
2367
2092
  } else if (
2368
2093
  gsdUU.length === 0 &&
2369
2094
  nonGsdUU.length === 0 &&
2370
- gsdAlreadyExists.length > 0 &&
2371
- nonGsdAlreadyExists.length === 0
2095
+ alreadyExists.length > 0
2372
2096
  ) {
2373
- // Untracked-file restore failure from stash pop where all collided
2374
- // paths are .gsd/ artifacts that already exist after merge.
2097
+ // Untracked-file restore failure from stash pop where all collided paths
2098
+ // already exist after merge (committed on target). Safe to drop the stash
2099
+ // for the full alreadyExists set — they were untracked on source by
2100
+ // definition of the "already exists, no checkout" failure.
2375
2101
  if (stashRefForDrop) {
2376
2102
  try {
2377
2103
  execFileSync("git", ["stash", "drop", stashRefForDrop], {
@@ -2390,10 +2116,6 @@ export function mergeMilestoneToMain(
2390
2116
  logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
2391
2117
  files: nonGsdUU.join(", "),
2392
2118
  });
2393
- } else if (nonGsdAlreadyExists.length > 0) {
2394
- logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
2395
- files: nonGsdAlreadyExists.join(", "),
2396
- });
2397
2119
  } else {
2398
2120
  logWarning(
2399
2121
  "worktree",
@@ -2511,62 +2233,24 @@ export function mergeMilestoneToMain(
2511
2233
  };
2512
2234
 
2513
2235
  let shouldCleanup = false;
2514
- let pushed = false;
2515
- let prCreated = false;
2516
2236
  try {
2517
- // 10. Auto-push if enabled
2518
- if (prefs.auto_push === true && prefs.auto_pr !== true && !nothingToCommit) {
2519
- const remote = prefs.remote ?? "origin";
2520
- if (gitRemoteExists(originalBasePath_, remote)) {
2521
- try {
2522
- execFileSync("git", ["push", remote, mainBranch], {
2523
- cwd: originalBasePath_,
2524
- stdio: ["ignore", "pipe", "pipe"],
2525
- encoding: "utf-8",
2526
- });
2527
- pushed = true;
2528
- } catch (err) {
2529
- // Push failure is non-fatal
2530
- logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
2531
- }
2532
- }
2533
- }
2534
-
2535
- // 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
2536
- if (prefs.auto_pr === true && !nothingToCommit) {
2537
- const remote = prefs.remote ?? "origin";
2538
- const prTarget = prefs.pr_target_branch ?? mainBranch;
2539
- if (gitRemoteExists(originalBasePath_, remote)) {
2540
- try {
2541
- // Push the milestone branch to remote first
2542
- execFileSync("git", ["push", remote, milestoneBranch], {
2543
- cwd: originalBasePath_,
2544
- stdio: ["ignore", "pipe", "pipe"],
2545
- encoding: "utf-8",
2546
- });
2547
- const prEvidence = buildPrEvidence({
2548
- milestoneId,
2549
- milestoneTitle,
2550
- changeType: "feat",
2551
- summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
2552
- testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
2553
- rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
2554
- how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
2555
- });
2556
- const prUrl = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
2557
- head: milestoneBranch,
2558
- base: prTarget,
2559
- });
2560
- if (!prUrl) {
2561
- throw new Error("gh pr create returned no URL");
2562
- }
2563
- prCreated = true;
2564
- } catch (err) {
2565
- // PR creation failure is non-fatal — gh may not be installed or authenticated
2566
- logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
2567
- }
2568
- }
2569
- }
2237
+ // 10/9b. Publication (auto-push / draft PR) — Publication module seam (ADR-034).
2238
+ const publication = publishMilestone({
2239
+ basePath: originalBasePath_,
2240
+ milestoneId,
2241
+ milestoneTitle,
2242
+ integrationBranch: mainBranch,
2243
+ milestoneBranch,
2244
+ sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
2245
+ nothingToCommit,
2246
+ prefs: {
2247
+ autoPush: prefs.auto_push === true,
2248
+ autoPr: prefs.auto_pr === true,
2249
+ remote: prefs.remote,
2250
+ prTargetBranch: prefs.pr_target_branch,
2251
+ },
2252
+ });
2253
+ const { pushed, prCreated } = publication;
2570
2254
 
2571
2255
  // 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
2572
2256
  // throws only when the milestone has unanchored code changes, passes