@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.d6c5343c

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 (551) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/models-resolver.d.ts +3 -13
  7. package/dist/models-resolver.js +3 -22
  8. package/dist/resource-loader.js +2 -14
  9. package/dist/resources/.managed-resources-content-hash +1 -1
  10. package/dist/resources/GSD-WORKFLOW.md +5 -4
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  12. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  13. package/dist/resources/extensions/async-jobs/index.js +65 -0
  14. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  15. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  17. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  18. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  19. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  20. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  21. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  22. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  23. package/dist/resources/extensions/browser-tools/index.js +69 -12
  24. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  25. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  31. package/dist/resources/extensions/gsd/auto/orchestrator.js +94 -48
  32. package/dist/resources/extensions/gsd/auto/phases.js +8 -3
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
  37. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  38. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  39. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  41. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  42. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  43. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  44. package/dist/resources/extensions/gsd/auto.js +8 -20
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  47. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  50. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  51. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  52. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  53. package/dist/resources/extensions/gsd/captures.js +5 -15
  54. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  55. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  56. package/dist/resources/extensions/gsd/consent-question.js +337 -0
  57. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  58. package/dist/resources/extensions/gsd/constants.js +0 -2
  59. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  60. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  61. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  62. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  63. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  64. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  65. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  66. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  67. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  68. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  69. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  70. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  71. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
  72. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  73. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  74. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  75. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  76. package/dist/resources/extensions/gsd/files.js +33 -19
  77. package/dist/resources/extensions/gsd/git-service.js +1 -0
  78. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  79. package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
  80. package/dist/resources/extensions/gsd/guidance.js +158 -0
  81. package/dist/resources/extensions/gsd/guided-flow.js +51 -5
  82. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  83. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  84. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  85. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  86. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  87. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  88. package/dist/resources/extensions/gsd/milestone-closeout.js +13 -23
  89. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  90. package/dist/resources/extensions/gsd/model-router.js +3 -0
  91. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  92. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  93. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  94. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  95. package/dist/resources/extensions/gsd/paths.js +37 -24
  96. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  97. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  98. package/dist/resources/extensions/gsd/preferences.js +14 -0
  99. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  100. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  104. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  105. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  106. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  107. package/dist/resources/extensions/gsd/publication.js +87 -0
  108. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  109. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  110. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  111. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  112. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  113. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  114. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  115. package/dist/resources/extensions/gsd/state.js +6 -20
  116. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  117. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  120. package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
  121. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  122. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  123. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
  124. package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
  125. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  126. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  127. package/dist/resources/extensions/gsd/undo.js +8 -7
  128. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  129. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  130. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  131. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  132. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  133. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  134. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  135. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  136. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  137. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  138. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  139. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  140. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  141. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  142. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  143. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  144. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  145. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  146. package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
  147. package/dist/resources/shared/package.json +3 -0
  148. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  149. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  150. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  151. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  152. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  153. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  154. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  155. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  156. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  157. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  158. package/dist/web/standalone/.next/BUILD_ID +1 -1
  159. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  160. package/dist/web/standalone/.next/build-manifest.json +3 -3
  161. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  162. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  172. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  215. package/dist/web/standalone/.next/server/app/index.html +1 -1
  216. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  223. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  224. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  225. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  226. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  229. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  230. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  231. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  232. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  233. package/dist/web/standalone/package.json +1 -1
  234. package/dist/worktree-cli.js +3 -6
  235. package/dist/worktree-status-banner.js +7 -11
  236. package/package.json +1 -1
  237. package/packages/cloud-mcp-gateway/package.json +2 -2
  238. package/packages/contracts/dist/rpc.d.ts +1 -0
  239. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  240. package/packages/contracts/dist/rpc.js.map +1 -1
  241. package/packages/contracts/dist/workflow.d.ts +4 -0
  242. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  243. package/packages/contracts/dist/workflow.js.map +1 -1
  244. package/packages/contracts/package.json +1 -1
  245. package/packages/daemon/package.json +4 -4
  246. package/packages/gsd-agent-core/package.json +5 -5
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  265. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  266. package/packages/gsd-agent-modes/package.json +7 -7
  267. package/packages/mcp-server/dist/cli.js +6 -3
  268. package/packages/mcp-server/dist/cli.js.map +1 -1
  269. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  270. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  271. package/packages/mcp-server/dist/workflow-tools.js +46 -21
  272. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  273. package/packages/mcp-server/package.json +3 -3
  274. package/packages/native/package.json +1 -1
  275. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  276. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  277. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  278. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  279. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  280. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  281. package/packages/pi-agent-core/dist/index.js +3 -0
  282. package/packages/pi-agent-core/dist/index.js.map +1 -1
  283. package/packages/pi-agent-core/package.json +1 -1
  284. package/packages/pi-ai/README.md +1 -0
  285. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  286. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  287. package/packages/pi-ai/dist/models.generated.js +166 -0
  288. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  289. package/packages/pi-ai/package.json +3 -2
  290. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  293. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  296. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  299. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  301. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  303. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  305. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/index.js +1 -1
  307. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  309. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  311. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  312. package/packages/pi-coding-agent/package.json +7 -7
  313. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  314. package/packages/pi-tui/dist/tui.js +9 -0
  315. package/packages/pi-tui/dist/tui.js.map +1 -1
  316. package/packages/pi-tui/package.json +2 -2
  317. package/packages/rpc-client/package.json +2 -2
  318. package/pkg/package.json +1 -1
  319. package/src/resources/GSD-WORKFLOW.md +5 -4
  320. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  321. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  322. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  323. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  324. package/src/resources/extensions/async-jobs/index.ts +79 -0
  325. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  326. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  327. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  328. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  329. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  330. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  331. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  332. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  333. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  334. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  335. package/src/resources/extensions/browser-tools/index.ts +71 -13
  336. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  337. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
  338. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  339. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  340. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  341. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  342. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  343. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  344. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  345. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  346. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  347. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  348. package/src/resources/extensions/gsd/auto/orchestrator.ts +109 -51
  349. package/src/resources/extensions/gsd/auto/phases.ts +12 -3
  350. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  351. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  352. package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
  353. package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
  354. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  355. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  356. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  357. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  358. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  359. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  360. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  361. package/src/resources/extensions/gsd/auto.ts +20 -24
  362. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  363. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  364. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  365. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  366. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  367. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  368. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  369. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  370. package/src/resources/extensions/gsd/captures.ts +5 -16
  371. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  372. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  373. package/src/resources/extensions/gsd/consent-question.ts +416 -0
  374. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  375. package/src/resources/extensions/gsd/constants.ts +0 -3
  376. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  377. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  378. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  379. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  380. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  381. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  382. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  383. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  384. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  385. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  386. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  387. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  388. package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
  389. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  390. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  391. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  392. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  393. package/src/resources/extensions/gsd/files.ts +33 -12
  394. package/src/resources/extensions/gsd/git-service.ts +1 -0
  395. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  396. package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
  397. package/src/resources/extensions/gsd/guidance.ts +217 -0
  398. package/src/resources/extensions/gsd/guided-flow.ts +50 -5
  399. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  400. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  401. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  402. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  403. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  404. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  405. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -23
  406. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  407. package/src/resources/extensions/gsd/model-router.ts +3 -0
  408. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  409. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  410. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  411. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  412. package/src/resources/extensions/gsd/paths.ts +42 -22
  413. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  414. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  415. package/src/resources/extensions/gsd/preferences.ts +18 -0
  416. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  417. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  418. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  419. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  420. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  421. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  422. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  423. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  424. package/src/resources/extensions/gsd/publication.ts +122 -0
  425. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  426. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  427. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  428. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  429. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  430. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  431. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  432. package/src/resources/extensions/gsd/state.ts +9 -21
  433. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  434. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  435. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  436. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
  437. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +101 -26
  438. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  439. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  440. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  441. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  442. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  443. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  444. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  445. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  446. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  447. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  448. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  449. package/src/resources/extensions/gsd/tests/consent-question.test.ts +336 -0
  450. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  451. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  452. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  453. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  454. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  455. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  456. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  457. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  458. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  459. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  460. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  461. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  462. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  463. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  464. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  465. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  466. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  467. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  468. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  469. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  470. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  471. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  472. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  473. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  474. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  475. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +139 -0
  476. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  477. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  478. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  479. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  480. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  481. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  482. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  483. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  484. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  485. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  486. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  487. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  488. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  489. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  490. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  491. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  492. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  493. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  494. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  495. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  496. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  497. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  498. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  499. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  500. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  501. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  502. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  503. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  504. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  505. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  506. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  507. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  508. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  509. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  510. package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
  511. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  512. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  513. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
  514. package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
  515. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  516. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  517. package/src/resources/extensions/gsd/undo.ts +9 -8
  518. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  519. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  520. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  521. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  522. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  523. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  524. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  525. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  526. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  527. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  528. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  529. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  530. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  531. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  532. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  533. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  534. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  535. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  536. package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
  537. package/src/resources/shared/package.json +3 -0
  538. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  539. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  540. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  541. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  542. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  543. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  544. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  545. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  546. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  547. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  548. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  549. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  550. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_buildManifest.js +0 -0
  551. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → jmTLg6xZmAuq_LIqKOxrH}/_ssgManifest.js +0 -0
@@ -0,0 +1,237 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Domain Write Operations (Hierarchy Status Cascades) for the
3
+ // single-writer layer. Each operation owns its own transaction() and mutates
4
+ // the related rows of one logical hierarchy change in a single commit, so the
5
+ // atomicity rule lives in one place instead of being hand-rolled (or missed)
6
+ // in callers. Operations own DB-row atomicity only — markdown re-projection,
7
+ // validation, and messaging stay in callers / db-writer.ts.
8
+ import { getDbOrNull, transaction } from "../engine.js";
9
+ import { GSDError, GSD_STALE_STATE } from "../../errors.js";
10
+ import { isClosedStatus } from "../../status-guards.js";
11
+ import { getMilestone, getSlice, getSliceTasks, getMilestoneSlices } from "../queries.js";
12
+ // completeSliceCascade reuses the complex hierarchy write primitives (ON CONFLICT
13
+ // upserts with null sentinels) rather than re-inlining their SQL. This is a
14
+ // back-edge to gsd-db.ts, which re-exports this module — safe because the
15
+ // imported bindings are hoisted function declarations only called at runtime.
16
+ // It dissolves when these primitives move to db/writers/hierarchy.ts.
17
+ import { insertMilestone, insertSlice, updateSliceStatus, updateMilestoneStatus } from "../../gsd-db.js";
18
+
19
+ function requireDb(): void {
20
+ if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
21
+ }
22
+
23
+ // ─── Reopen cascades ───────────────────────────────────────────────────────
24
+ // A reopen blocked by a structural precondition returns a discriminated reason
25
+ // (carrying the offending entity's status where the caller's message needs it).
26
+ // Structural guards run inside the transaction for TOCTOU safety; the caller
27
+ // owns user-facing message formatting and projection.
28
+
29
+ export type ReopenSliceOutcome =
30
+ | { ok: true; tasksReset: number }
31
+ | { ok: false; reason: "milestone-not-found" }
32
+ | { ok: false; reason: "milestone-closed"; status: string }
33
+ | { ok: false; reason: "slice-not-found" }
34
+ | { ok: false; reason: "slice-not-complete"; status: string };
35
+
36
+ /**
37
+ * Reopen a completed slice: slice → "in_progress", all its tasks → "pending",
38
+ * completion timestamps cleared, in one commit. Folds the hand-rolled
39
+ * transaction-plus-cascade previously in tools/reopen-slice.ts. Guards run
40
+ * inside the transaction (TOCTOU-safe).
41
+ */
42
+ export function reopenSliceCascade(milestoneId: string, sliceId: string): ReopenSliceOutcome {
43
+ requireDb();
44
+ let outcome: ReopenSliceOutcome = { ok: true, tasksReset: 0 };
45
+ transaction(() => {
46
+ const milestone = getMilestone(milestoneId);
47
+ if (!milestone) { outcome = { ok: false, reason: "milestone-not-found" }; return; }
48
+ if (isClosedStatus(milestone.status)) { outcome = { ok: false, reason: "milestone-closed", status: milestone.status }; return; }
49
+ const slice = getSlice(milestoneId, sliceId);
50
+ if (!slice) { outcome = { ok: false, reason: "slice-not-found" }; return; }
51
+ if (!isClosedStatus(slice.status)) { outcome = { ok: false, reason: "slice-not-complete", status: slice.status }; return; }
52
+
53
+ const tasks = getSliceTasks(milestoneId, sliceId);
54
+ getDbOrNull()!.prepare(
55
+ `UPDATE slices SET status = 'in_progress', completed_at = NULL WHERE milestone_id = :mid AND id = :sid`,
56
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
57
+ getDbOrNull()!.prepare(
58
+ `UPDATE tasks SET status = 'pending', completed_at = NULL WHERE milestone_id = :mid AND slice_id = :sid`,
59
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
60
+ outcome = { ok: true, tasksReset: tasks.length };
61
+ });
62
+ return outcome;
63
+ }
64
+
65
+ export type ReopenMilestoneOutcome =
66
+ | { ok: true; slicesReset: number; tasksReset: number }
67
+ | { ok: false; reason: "milestone-not-found" }
68
+ | { ok: false; reason: "milestone-not-closed"; status: string };
69
+
70
+ /**
71
+ * Reopen a closed milestone: milestone → "active", every slice → "in_progress",
72
+ * every task → "pending", completion timestamps cleared, in one commit. Folds
73
+ * the hand-rolled transaction-plus-cascade previously in tools/reopen-milestone.ts.
74
+ */
75
+ export function reopenMilestoneCascade(milestoneId: string): ReopenMilestoneOutcome {
76
+ requireDb();
77
+ let outcome: ReopenMilestoneOutcome = { ok: true, slicesReset: 0, tasksReset: 0 };
78
+ transaction(() => {
79
+ const milestone = getMilestone(milestoneId);
80
+ if (!milestone) { outcome = { ok: false, reason: "milestone-not-found" }; return; }
81
+ if (!isClosedStatus(milestone.status)) { outcome = { ok: false, reason: "milestone-not-closed", status: milestone.status }; return; }
82
+
83
+ const slices = getMilestoneSlices(milestoneId);
84
+
85
+ getDbOrNull()!.prepare(
86
+ `UPDATE milestones SET status = 'active', completed_at = NULL WHERE id = :mid`,
87
+ ).run({ ":mid": milestoneId });
88
+ getDbOrNull()!.prepare(
89
+ `UPDATE slices SET status = 'in_progress', completed_at = NULL WHERE milestone_id = :mid`,
90
+ ).run({ ":mid": milestoneId });
91
+ const tasksResult = getDbOrNull()!.prepare(
92
+ `UPDATE tasks SET status = 'pending', completed_at = NULL WHERE milestone_id = :mid`,
93
+ ).run({ ":mid": milestoneId });
94
+ const tasksReset = (tasksResult as { changes?: number }).changes ?? 0;
95
+ outcome = { ok: true, slicesReset: slices.length, tasksReset };
96
+ });
97
+ return outcome;
98
+ }
99
+
100
+ export type CompleteSliceOutcome =
101
+ | { ok: true; duplicate: boolean; existingSummaryMd: string }
102
+ | { ok: false; reason: "milestone-closed"; status: string }
103
+ | { ok: false; reason: "no-tasks" }
104
+ | { ok: false; reason: "incomplete-tasks"; incomplete: Array<{ id: string; status: string }> };
105
+
106
+ /**
107
+ * Complete a slice: verify preconditions, auto-create the milestone/slice rows
108
+ * if absent, mark the slice "complete", and activate a still-"planned"
109
+ * milestone once all its slices are closed — all in one transaction. Folds the
110
+ * hand-rolled cascade previously in tools/complete-slice.ts.
111
+ *
112
+ * Returns a discriminated outcome. The `duplicate: true` success case means the
113
+ * slice was already closed (no writes performed); the caller handles the stale/
114
+ * idempotent path. `existingSummaryMd` carries the slice's prior summary so the
115
+ * caller can backfill omitted requirement fields. Markdown rendering, file
116
+ * writes, and summary persistence stay in the caller.
117
+ */
118
+ export function completeSliceCascade(
119
+ milestoneId: string,
120
+ sliceId: string,
121
+ opts: { sliceTitle?: string; completedAt: string },
122
+ ): CompleteSliceOutcome {
123
+ requireDb();
124
+ let outcome: CompleteSliceOutcome = { ok: true, duplicate: false, existingSummaryMd: "" };
125
+ transaction(() => {
126
+ // Preconditions inside the txn for atomicity. A missing milestone/slice is
127
+ // fine — they are auto-created below; only a closed one blocks.
128
+ const milestone = getMilestone(milestoneId);
129
+ if (milestone && isClosedStatus(milestone.status)) {
130
+ outcome = { ok: false, reason: "milestone-closed", status: milestone.status };
131
+ return;
132
+ }
133
+
134
+ const slice = getSlice(milestoneId, sliceId);
135
+ const existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
136
+ if (slice && isClosedStatus(slice.status)) {
137
+ outcome = { ok: true, duplicate: true, existingSummaryMd };
138
+ return;
139
+ }
140
+
141
+ const tasks = getSliceTasks(milestoneId, sliceId);
142
+ if (tasks.length === 0) {
143
+ outcome = { ok: false, reason: "no-tasks" };
144
+ return;
145
+ }
146
+ const incomplete = tasks
147
+ .filter((t) => !isClosedStatus(t.status))
148
+ .map((t) => ({ id: t.id, status: t.status }));
149
+ if (incomplete.length > 0) {
150
+ outcome = { ok: false, reason: "incomplete-tasks", incomplete };
151
+ return;
152
+ }
153
+
154
+ // All guards passed — perform writes. Preserve existing planning metadata:
155
+ // completion must not overwrite title/risk/depends/demo/sequence.
156
+ insertMilestone({ id: milestoneId, title: milestoneId });
157
+ if (!slice) {
158
+ insertSlice({ id: sliceId, milestoneId, title: opts.sliceTitle || sliceId });
159
+ }
160
+ updateSliceStatus(milestoneId, sliceId, "complete", opts.completedAt);
161
+
162
+ const updatedSlices = getMilestoneSlices(milestoneId);
163
+ if (
164
+ milestone?.status === "planned" &&
165
+ updatedSlices.length > 0 &&
166
+ updatedSlices.every((s) => isClosedStatus(s.status))
167
+ ) {
168
+ updateMilestoneStatus(milestoneId, "active");
169
+ }
170
+ outcome = { ok: true, duplicate: false, existingSummaryMd };
171
+ });
172
+ return outcome;
173
+ }
174
+
175
+ export type SkipSliceOutcome =
176
+ | { ok: true; tasksSkipped: number; wasAlreadySkipped: boolean }
177
+ | { ok: false; reason: "slice-not-found" }
178
+ | { ok: false; reason: "slice-already-complete" };
179
+
180
+ /**
181
+ * Skip a slice: slice → "skipped" (unless already skipped) and every non-closed
182
+ * task → "skipped", in one commit. Completed/done slices are rejected; closed
183
+ * tasks are never downgraded. Folds the hand-rolled cascade previously in
184
+ * tools/skip-slice.ts. Guards run inside the transaction (TOCTOU-safe).
185
+ */
186
+ export function skipSliceCascade(milestoneId: string, sliceId: string): SkipSliceOutcome {
187
+ requireDb();
188
+ let outcome: SkipSliceOutcome = { ok: true, tasksSkipped: 0, wasAlreadySkipped: false };
189
+ transaction(() => {
190
+ const slice = getSlice(milestoneId, sliceId);
191
+ if (!slice) { outcome = { ok: false, reason: "slice-not-found" }; return; }
192
+ if (slice.status === "complete" || slice.status === "done") {
193
+ outcome = { ok: false, reason: "slice-already-complete" };
194
+ return;
195
+ }
196
+ const wasAlreadySkipped = slice.status === "skipped";
197
+ if (!wasAlreadySkipped) {
198
+ getDbOrNull()!.prepare(
199
+ `UPDATE slices SET status = 'skipped', completed_at = NULL WHERE milestone_id = :mid AND id = :sid`,
200
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
201
+ }
202
+ // Cascade: skip every non-closed task so milestone completion doesn't trip
203
+ // the deep-task guard (#4375). Closed tasks are left untouched.
204
+ const tasks = getSliceTasks(milestoneId, sliceId);
205
+ let tasksSkipped = 0;
206
+ for (const task of tasks) {
207
+ if (!isClosedStatus(task.status)) {
208
+ getDbOrNull()!.prepare(
209
+ `UPDATE tasks SET status = 'skipped', completed_at = NULL WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
210
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": task.id });
211
+ tasksSkipped++;
212
+ }
213
+ }
214
+ outcome = { ok: true, tasksSkipped, wasAlreadySkipped };
215
+ });
216
+ return outcome;
217
+ }
218
+
219
+ /**
220
+ * Reset a slice to "active" and all of its tasks to "pending" in one commit,
221
+ * clearing completion timestamps. Equivalent to the historical per-task
222
+ * updateTaskStatus loop + updateSliceStatus in undo's reset-slice, but atomic:
223
+ * an interruption can no longer leave some tasks reset and others not.
224
+ */
225
+ export function resetSliceCascade(milestoneId: string, sliceId: string): void {
226
+ if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
227
+ transaction(() => {
228
+ getDbOrNull()!.prepare(
229
+ `UPDATE tasks SET status = 'pending', completed_at = NULL
230
+ WHERE milestone_id = :mid AND slice_id = :sid`,
231
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
232
+ getDbOrNull()!.prepare(
233
+ `UPDATE slices SET status = 'active', completed_at = NULL
234
+ WHERE milestone_id = :mid AND id = :sid`,
235
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
236
+ });
237
+ }
@@ -0,0 +1,310 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Bulk import/restore writers for the single-writer layer.
3
+ // restoreManifest rebuilds the engine DB from a StateManifest;
4
+ // bulkInsertLegacyHierarchy replaces the milestone/slice/task hierarchy from
5
+ // markdown-parsed payloads. Both own their own transaction() and contain only
6
+ // write SQL, read through the shared engine handle.
7
+ import { createHash } from "node:crypto";
8
+ import { getDbOrNull, transaction } from "../engine.js";
9
+ import { GSDError, GSD_STALE_STATE } from "../../errors.js";
10
+ import type { StateManifest } from "../../workflow-manifest.js";
11
+
12
+ export function restoreManifest(manifest: StateManifest): void {
13
+ if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
14
+ const db = getDbOrNull()!;
15
+
16
+ transaction(() => {
17
+ const restoredMilestoneIds = new Set(manifest.milestones.map((m) => m.id));
18
+ const restoredSliceKeys = new Set(manifest.slices.map((s) => JSON.stringify([s.milestone_id, s.id])));
19
+ const preservedReplanHistory = manifest.replan_history === undefined
20
+ ? db.prepare("SELECT * FROM replan_history ORDER BY id").all() as unknown as NonNullable<StateManifest["replan_history"]>
21
+ : [];
22
+ const preservedAssessments = manifest.assessments === undefined
23
+ ? db.prepare("SELECT * FROM assessments ORDER BY path").all() as unknown as NonNullable<StateManifest["assessments"]>
24
+ : [];
25
+ const preservedQualityGates = manifest.quality_gates === undefined
26
+ ? db.prepare("SELECT * FROM quality_gates ORDER BY milestone_id, slice_id, gate_id, task_id").all() as unknown as NonNullable<StateManifest["quality_gates"]>
27
+ : [];
28
+ const preservedCommitAttributions = manifest.milestone_commit_attributions === undefined
29
+ ? db.prepare("SELECT * FROM milestone_commit_attributions ORDER BY milestone_id, commit_sha").all() as unknown as NonNullable<StateManifest["milestone_commit_attributions"]>
30
+ : [];
31
+
32
+ // Clear workflow tables in dependency order.
33
+ db.exec("DELETE FROM verification_evidence");
34
+ db.exec("DELETE FROM quality_gates");
35
+ db.exec("DELETE FROM slice_dependencies");
36
+ db.exec("DELETE FROM assessments");
37
+ db.exec("DELETE FROM replan_history");
38
+ db.exec("DELETE FROM milestone_commit_attributions");
39
+ db.exec("DELETE FROM tasks");
40
+ db.exec("DELETE FROM slices");
41
+ db.exec("DELETE FROM milestone_leases");
42
+ db.exec("DELETE FROM milestones");
43
+ db.exec("DELETE FROM decisions WHERE 1=1");
44
+ db.exec(`DELETE FROM memories WHERE category = 'architecture' AND structured_fields LIKE '%"sourceDecisionId":"%'`);
45
+ if (manifest.artifacts !== undefined) db.exec("DELETE FROM artifacts");
46
+ if (manifest.requirements !== undefined) db.exec("DELETE FROM requirements");
47
+
48
+ if (manifest.requirements !== undefined) {
49
+ const reqStmt = db.prepare(
50
+ `INSERT INTO requirements (
51
+ id, class, status, description, why, source, primary_owner,
52
+ supporting_slices, validation, notes, full_content, superseded_by
53
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
54
+ );
55
+ for (const r of manifest.requirements) {
56
+ reqStmt.run(
57
+ r.id, r.class, r.status, r.description, r.why, r.source, r.primary_owner,
58
+ r.supporting_slices, r.validation, r.notes, r.full_content, r.superseded_by,
59
+ );
60
+ }
61
+ }
62
+
63
+ if (manifest.artifacts !== undefined) {
64
+ const artStmt = db.prepare(
65
+ `INSERT INTO artifacts (
66
+ path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at, content_hash
67
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
68
+ );
69
+ for (const a of manifest.artifacts) {
70
+ const fullContent = a.full_content ?? "";
71
+ artStmt.run(
72
+ a.path, a.artifact_type, a.milestone_id, a.slice_id, a.task_id,
73
+ fullContent, a.imported_at, a.content_hash ?? createHash("sha256").update(fullContent).digest("hex"),
74
+ );
75
+ }
76
+ }
77
+
78
+ // Restore milestones
79
+ const msStmt = db.prepare(
80
+ `INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
81
+ vision, success_criteria, key_risks, proof_strategy,
82
+ verification_contract, verification_integration, verification_operational, verification_uat,
83
+ definition_of_done, requirement_coverage, boundary_map_markdown, sequence)
84
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
85
+ );
86
+ for (const m of manifest.milestones) {
87
+ msStmt.run(
88
+ m.id, m.title, m.status,
89
+ JSON.stringify(m.depends_on), m.created_at, m.completed_at,
90
+ m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks),
91
+ JSON.stringify(m.proof_strategy),
92
+ m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat,
93
+ JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown, m.sequence ?? 0,
94
+ );
95
+ }
96
+
97
+ // Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
98
+ const slStmt = db.prepare(
99
+ `INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
100
+ created_at, completed_at, full_summary_md, full_uat_md,
101
+ goal, success_criteria, proof_level, integration_closure, observability_impact,
102
+ target_repositories, sequence, replan_triggered_at, is_sketch, sketch_scope)
103
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
104
+ );
105
+ for (const s of manifest.slices) {
106
+ slStmt.run(
107
+ s.milestone_id, s.id, s.title, s.status, s.risk,
108
+ JSON.stringify(s.depends), s.demo,
109
+ s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md,
110
+ s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact,
111
+ JSON.stringify(s.target_repositories ?? []),
112
+ s.sequence, s.replan_triggered_at,
113
+ s.is_sketch ?? 0,
114
+ s.sketch_scope ?? "",
115
+ );
116
+ }
117
+
118
+ const depStmt = db.prepare(
119
+ "INSERT OR IGNORE INTO slice_dependencies (milestone_id, slice_id, depends_on_slice_id) VALUES (?, ?, ?)",
120
+ );
121
+ for (const s of manifest.slices) {
122
+ for (const dep of s.depends ?? []) {
123
+ depStmt.run(s.milestone_id, s.id, dep);
124
+ }
125
+ }
126
+
127
+ // Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
128
+ const tkStmt = db.prepare(
129
+ `INSERT INTO tasks (milestone_id, slice_id, id, title, status,
130
+ one_liner, narrative, verification_result, duration, completed_at,
131
+ blocker_discovered, deviations, known_issues, key_files, key_decisions,
132
+ full_summary_md, description, estimate, files, verify,
133
+ inputs, expected_output, observability_impact, full_plan_md, target_repositories, sequence,
134
+ blocker_source, escalation_pending, escalation_awaiting_review,
135
+ escalation_artifact_path, escalation_override_applied_at)
136
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
137
+ );
138
+ for (const t of manifest.tasks) {
139
+ tkStmt.run(
140
+ t.milestone_id, t.slice_id, t.id, t.title, t.status,
141
+ t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at,
142
+ t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues,
143
+ JSON.stringify(t.key_files), JSON.stringify(t.key_decisions),
144
+ t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify,
145
+ JSON.stringify(t.inputs), JSON.stringify(t.expected_output),
146
+ t.observability_impact, t.full_plan_md ?? "", JSON.stringify(t.target_repositories ?? []), t.sequence,
147
+ t.blocker_source ?? "",
148
+ t.escalation_pending ?? 0,
149
+ t.escalation_awaiting_review ?? 0,
150
+ t.escalation_artifact_path ?? null,
151
+ t.escalation_override_applied_at ?? null,
152
+ );
153
+ }
154
+
155
+ // Restore decisions (ADR-011 P2: include source so escalation decisions survive)
156
+ const dcStmt = db.prepare(
157
+ `INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
158
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
159
+ );
160
+ for (const d of manifest.decisions) {
161
+ dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
162
+ }
163
+
164
+ const replanHistoryRows = manifest.replan_history ?? preservedReplanHistory.filter((r) => restoredMilestoneIds.has(r.milestone_id));
165
+ if (replanHistoryRows.length > 0) {
166
+ const replStmt = db.prepare(
167
+ `INSERT INTO replan_history (
168
+ id, milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at
169
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
170
+ );
171
+ for (const r of replanHistoryRows) {
172
+ replStmt.run(
173
+ r.id, r.milestone_id, r.slice_id, r.task_id, r.summary,
174
+ r.previous_artifact_path, r.replacement_artifact_path, r.created_at,
175
+ );
176
+ }
177
+ }
178
+
179
+ const assessmentRows = manifest.assessments ?? preservedAssessments.filter((a) => restoredMilestoneIds.has(a.milestone_id));
180
+ if (assessmentRows.length > 0) {
181
+ const assessStmt = db.prepare(
182
+ `INSERT INTO assessments (
183
+ path, milestone_id, slice_id, task_id, status, scope, full_content, created_at
184
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
185
+ );
186
+ for (const a of assessmentRows) {
187
+ assessStmt.run(
188
+ a.path, a.milestone_id, a.slice_id, a.task_id,
189
+ a.status, a.scope, a.full_content, a.created_at,
190
+ );
191
+ }
192
+ }
193
+
194
+ const qualityGateRows = manifest.quality_gates ?? preservedQualityGates.filter((g) => (
195
+ restoredSliceKeys.has(JSON.stringify([g.milestone_id, g.slice_id]))
196
+ ));
197
+ if (qualityGateRows.length > 0) {
198
+ const gateStmt = db.prepare(
199
+ `INSERT INTO quality_gates (
200
+ milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at
201
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
202
+ );
203
+ for (const g of qualityGateRows) {
204
+ gateStmt.run(
205
+ g.milestone_id, g.slice_id, g.gate_id, g.scope, g.task_id,
206
+ g.status, g.verdict ?? "", g.rationale, g.findings, g.evaluated_at,
207
+ );
208
+ }
209
+ }
210
+
211
+ const commitAttributionRows = manifest.milestone_commit_attributions ??
212
+ preservedCommitAttributions.filter((a) => restoredMilestoneIds.has(a.milestone_id));
213
+ if (commitAttributionRows.length > 0) {
214
+ const attrStmt = db.prepare(
215
+ `INSERT OR REPLACE INTO milestone_commit_attributions (
216
+ commit_sha, milestone_id, slice_id, task_id, source, confidence, files_json, created_at
217
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
218
+ );
219
+ for (const a of commitAttributionRows) {
220
+ attrStmt.run(
221
+ a.commit_sha, a.milestone_id, a.slice_id, a.task_id,
222
+ a.source, a.confidence, a.files_json, a.created_at,
223
+ );
224
+ }
225
+ }
226
+
227
+ // Restore verification evidence
228
+ const evStmt = db.prepare(
229
+ `INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
230
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
231
+ );
232
+ for (const e of manifest.verification_evidence) {
233
+ evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
234
+ }
235
+ });
236
+ }
237
+
238
+ // ─── Legacy markdown → DB bulk migration ─────────────────────────────────
239
+
240
+ export interface LegacyMilestoneInsert {
241
+ id: string;
242
+ title: string;
243
+ status: string;
244
+ }
245
+
246
+ export interface LegacySliceInsert {
247
+ id: string;
248
+ milestoneId: string;
249
+ title: string;
250
+ status: string;
251
+ risk: string;
252
+ sequence: number;
253
+ }
254
+
255
+ export interface LegacyTaskInsert {
256
+ id: string;
257
+ sliceId: string;
258
+ milestoneId: string;
259
+ title: string;
260
+ status: string;
261
+ sequence: number;
262
+ }
263
+
264
+ /**
265
+ * Bulk delete + insert a legacy milestone hierarchy for markdown → DB migration.
266
+ * Used by workflow-migration.ts to populate engine tables from parsed ROADMAP/PLAN
267
+ * files. All operations run inside a single transaction.
268
+ */
269
+ export function bulkInsertLegacyHierarchy(payload: {
270
+ milestones: LegacyMilestoneInsert[];
271
+ slices: LegacySliceInsert[];
272
+ tasks: LegacyTaskInsert[];
273
+ clearMilestoneIds: string[];
274
+ createdAt: string;
275
+ }): void {
276
+ if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
277
+ const db = getDbOrNull()!;
278
+ const { milestones, slices, tasks, clearMilestoneIds, createdAt } = payload;
279
+
280
+ if (clearMilestoneIds.length === 0) return;
281
+ const placeholders = clearMilestoneIds.map(() => "?").join(",");
282
+
283
+ transaction(() => {
284
+ db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
285
+ db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
286
+ db.prepare(`DELETE FROM milestone_leases WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
287
+ db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...clearMilestoneIds);
288
+
289
+ const insertMilestone = db.prepare(
290
+ "INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)",
291
+ );
292
+ for (const m of milestones) {
293
+ insertMilestone.run(m.id, m.title, m.status, createdAt);
294
+ }
295
+
296
+ const insertSliceStmt = db.prepare(
297
+ "INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
298
+ );
299
+ for (const s of slices) {
300
+ insertSliceStmt.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, createdAt);
301
+ }
302
+
303
+ const insertTaskStmt = db.prepare(
304
+ "INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
305
+ );
306
+ for (const t of tasks) {
307
+ insertTaskStmt.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
308
+ }
309
+ });
310
+ }