gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82

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 (653) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +146 -49
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  17. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  19. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  26. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  27. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  31. package/dist/resources/extensions/gsd/auto.js +135 -74
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  37. package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  41. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  43. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
  45. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  47. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  48. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  49. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  50. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  52. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
  56. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  58. package/dist/resources/extensions/gsd/doctor.js +2 -28
  59. package/dist/resources/extensions/gsd/export-html.js +27 -425
  60. package/dist/resources/extensions/gsd/forensics.js +10 -3
  61. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  62. package/dist/resources/extensions/gsd/git-service.js +152 -15
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  69. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  70. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  75. package/dist/resources/extensions/gsd/paths.js +4 -0
  76. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  77. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  80. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  81. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  82. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  83. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  84. package/dist/resources/extensions/gsd/preferences.js +35 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  90. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  94. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  95. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  98. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  99. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  100. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  102. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  103. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  104. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  105. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  106. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  108. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  109. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  110. package/dist/resources/extensions/gsd/state.js +28 -7
  111. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  112. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  113. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  114. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  115. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  116. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  118. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  119. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  120. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  121. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  122. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  123. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  124. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  125. package/dist/resources/extensions/gsd/validation.js +23 -1
  126. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  127. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  128. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  129. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  131. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  132. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  133. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  134. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  135. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  136. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  140. package/dist/resources/extensions/subagent/index.js +448 -78
  141. package/dist/resources/extensions/subagent/launch.js +77 -0
  142. package/dist/resources/extensions/subagent/run-store.js +148 -0
  143. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  144. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  145. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  146. package/dist/resources/extensions/visual-brief/index.js +5 -0
  147. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  148. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  149. package/dist/resources/skills/forensics/SKILL.md +1 -1
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/web/standalone/.next/BUILD_ID +1 -1
  152. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  153. package/dist/web/standalone/.next/build-manifest.json +3 -3
  154. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  155. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  156. package/dist/web/standalone/.next/required-server-files.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/index.html +1 -1
  180. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  181. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  183. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  186. package/dist/web/standalone/.next/server/app/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  190. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  191. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  199. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  200. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  203. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  204. package/dist/web/standalone/server.js +1 -1
  205. package/dist/welcome-screen.js +7 -8
  206. package/package.json +4 -4
  207. package/packages/contracts/dist/rpc.test.js +7 -0
  208. package/packages/contracts/dist/rpc.test.js.map +1 -1
  209. package/packages/contracts/dist/workflow.d.ts +21 -0
  210. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  211. package/packages/contracts/dist/workflow.js +24 -0
  212. package/packages/contracts/dist/workflow.js.map +1 -1
  213. package/packages/contracts/src/rpc.test.ts +8 -0
  214. package/packages/contracts/src/workflow.ts +24 -0
  215. package/packages/daemon/package.json +2 -2
  216. package/packages/mcp-server/README.md +13 -4
  217. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  218. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  220. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  223. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  224. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  225. package/packages/native/package.json +1 -1
  226. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  227. package/packages/native/tsconfig.json +2 -1
  228. package/packages/native/tsconfig.tsbuildinfo +1 -1
  229. package/packages/pi-agent-core/package.json +1 -1
  230. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  232. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  236. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  239. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  240. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  241. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  243. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  244. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  245. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  247. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  248. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  249. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  250. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  251. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  252. package/packages/pi-ai/package.json +1 -1
  253. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  254. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  255. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  256. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  257. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  258. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  263. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  265. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  267. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  273. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  275. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  300. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/pi-coding-agent/package.json +1 -1
  302. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  303. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  304. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  305. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  306. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  307. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  308. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  309. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  310. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  313. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  315. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  316. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  317. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  320. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  321. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  322. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  323. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  324. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  325. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  326. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  327. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  328. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  329. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  330. package/packages/pi-tui/dist/components/loader.js +3 -0
  331. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  332. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  333. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  334. package/packages/pi-tui/dist/terminal.js +12 -0
  335. package/packages/pi-tui/dist/terminal.js.map +1 -1
  336. package/packages/pi-tui/dist/tui.d.ts +1 -0
  337. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  338. package/packages/pi-tui/dist/tui.js +117 -33
  339. package/packages/pi-tui/dist/tui.js.map +1 -1
  340. package/packages/pi-tui/package.json +1 -1
  341. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  342. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  343. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  344. package/packages/pi-tui/src/components/loader.ts +3 -0
  345. package/packages/pi-tui/src/terminal.ts +11 -0
  346. package/packages/pi-tui/src/tui.ts +116 -33
  347. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  348. package/packages/rpc-client/package.json +1 -1
  349. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  350. package/pkg/package.json +1 -1
  351. package/src/resources/GSD-WORKFLOW.md +10 -1
  352. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  353. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  354. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  355. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  356. package/src/resources/extensions/cmux/index.ts +6 -0
  357. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  358. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  360. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  361. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  362. package/src/resources/extensions/gsd/auto/phases.ts +172 -60
  363. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  364. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  365. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  369. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  370. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  371. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  372. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  373. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  374. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  375. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  376. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  377. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  378. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  379. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  380. package/src/resources/extensions/gsd/auto.ts +172 -81
  381. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  382. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  383. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  384. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  385. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  386. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  387. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  388. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  389. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  390. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  391. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  392. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  394. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  395. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  396. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  397. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  398. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  399. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  400. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  401. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  402. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  403. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  404. package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
  405. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  407. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  408. package/src/resources/extensions/gsd/doctor.ts +2 -27
  409. package/src/resources/extensions/gsd/export-html.ts +27 -427
  410. package/src/resources/extensions/gsd/forensics.ts +9 -3
  411. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  412. package/src/resources/extensions/gsd/git-service.ts +182 -16
  413. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  414. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  415. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  416. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  417. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  418. package/src/resources/extensions/gsd/journal.ts +8 -1
  419. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  420. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  421. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  422. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  423. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  424. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  425. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  426. package/src/resources/extensions/gsd/paths.ts +5 -0
  427. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  428. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  431. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  432. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  433. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  434. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  435. package/src/resources/extensions/gsd/preferences.ts +39 -0
  436. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  437. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  440. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  441. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  442. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  445. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  446. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  448. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  449. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  450. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  451. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  454. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  455. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  456. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  457. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  458. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  459. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  460. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  461. package/src/resources/extensions/gsd/state.ts +33 -7
  462. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  463. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  464. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  465. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  466. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  467. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  468. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  469. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  470. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  471. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  472. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  473. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  474. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  477. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  478. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  479. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  480. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  481. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  482. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  484. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  486. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  487. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  488. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  489. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  490. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  491. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  492. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  493. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  494. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  495. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  497. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  498. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  499. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  500. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  501. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  502. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  503. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  504. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  505. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  506. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  507. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  508. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  510. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  511. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  512. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  513. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  514. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  515. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  517. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  518. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
  519. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  520. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  521. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  522. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  524. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  525. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  527. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  528. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  529. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  530. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  531. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  532. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  533. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  534. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  535. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  536. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  537. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  539. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  540. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  542. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  543. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  544. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  545. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  546. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  547. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  548. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  549. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  551. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  553. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  554. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  555. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  556. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  557. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  558. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  559. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  561. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  562. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  564. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  566. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  567. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  568. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  572. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  573. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  574. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  575. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  576. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  579. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  581. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  582. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  584. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  585. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  587. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  589. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  591. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  592. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  593. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  594. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  597. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  598. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  599. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  600. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  601. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  602. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  603. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  604. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  605. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  606. package/src/resources/extensions/gsd/types.ts +1 -1
  607. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  608. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  609. package/src/resources/extensions/gsd/validation.ts +23 -1
  610. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  611. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  612. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  614. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  615. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  616. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  617. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  618. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  619. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  620. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  621. package/src/resources/extensions/shared/html-shell.ts +412 -0
  622. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  623. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  624. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  625. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  626. package/src/resources/extensions/subagent/index.ts +567 -103
  627. package/src/resources/extensions/subagent/launch.ts +131 -0
  628. package/src/resources/extensions/subagent/run-store.ts +218 -0
  629. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  630. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  631. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  632. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  633. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  634. package/src/resources/extensions/visual-brief/index.ts +8 -0
  635. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  636. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  637. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  638. package/src/resources/skills/forensics/SKILL.md +1 -1
  639. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  640. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  642. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  644. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  645. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  646. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  647. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  648. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  649. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  650. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  651. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  652. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  653. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -16,6 +16,7 @@ import { gsdRoot } from "./paths.js";
16
16
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
17
17
  import { loadEffectiveGSDPreferences } from "./preferences.js";
18
18
  import { logWarning } from "./workflow-logger.js";
19
+ import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
19
20
  import { detectWorktreeName, } from "./worktree.js";
20
21
  import { SLICE_BRANCH_RE, QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
21
22
  import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, nativeAddPaths, nativeResetSoft, nativeCommitSubject, nativeIsIgnored, _resetHasChangesCache, } from "./native-git-bridge.js";
@@ -139,6 +140,30 @@ function isExcludedScopedPath(path, exclusions) {
139
140
  }
140
141
  return false;
141
142
  }
143
+ function submodulePathsFromLsFiles(output) {
144
+ const submodulePaths = new Set();
145
+ if (!output)
146
+ return submodulePaths;
147
+ for (const line of output.split("\n")) {
148
+ const match = line.match(/^160000\s+\S+\s+\d+\t(.+)$/);
149
+ if (!match)
150
+ continue;
151
+ submodulePaths.add(match[1].replace(/\\/g, "/").replace(/\/+$/, ""));
152
+ }
153
+ return submodulePaths;
154
+ }
155
+ function isInsideSubmodule(path, submodulePaths) {
156
+ const normalizedPath = path.replace(/\\/g, "/");
157
+ if (submodulePaths.has(normalizedPath))
158
+ return true;
159
+ let slashIndex = normalizedPath.lastIndexOf("/");
160
+ while (slashIndex > 0) {
161
+ if (submodulePaths.has(normalizedPath.slice(0, slashIndex)))
162
+ return true;
163
+ slashIndex = normalizedPath.lastIndexOf("/", slashIndex - 1);
164
+ }
165
+ return false;
166
+ }
142
167
  /**
143
168
  * Thrown when a slice merge hits code conflicts in non-.gsd files.
144
169
  * The working tree is left in a conflicted state (no reset) so the
@@ -213,6 +238,8 @@ export function readIntegrationBranch(basePath, milestoneId) {
213
238
  return null;
214
239
  }
215
240
  }
241
+ /** Re-export for backward compatibility — canonical definitions in branch-patterns.ts */
242
+ export { QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
216
243
  /**
217
244
  * Persist the integration branch for a milestone.
218
245
  *
@@ -223,9 +250,11 @@ export function readIntegrationBranch(basePath, milestoneId) {
223
250
  *
224
251
  * The file is committed immediately so the metadata is persisted in git.
225
252
  */
226
- /** Re-export for backward compatibility — canonical definitions in branch-patterns.ts */
227
- export { QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
228
253
  export function writeIntegrationBranch(basePath, milestoneId, branch) {
254
+ // Never persist milestone branches as integration targets.
255
+ // They are ephemeral execution branches and can cause self-diff corruption.
256
+ if (branch.startsWith("milestone/"))
257
+ return;
229
258
  // Don't record slice branches as the integration target
230
259
  if (SLICE_BRANCH_RE.test(branch))
231
260
  return;
@@ -262,6 +291,9 @@ export function writeIntegrationBranch(basePath, milestoneId, branch) {
262
291
  writeFileSync(metaFile, JSON.stringify(existing, null, 2) + "\n", "utf-8");
263
292
  // .gsd/ is managed externally (symlinked) — metadata is not committed to git.
264
293
  }
294
+ function normalizeLocalBranchRef(branch) {
295
+ return branch.replace(/^refs\/heads\//, "");
296
+ }
265
297
  /**
266
298
  * Resolve a milestone's recorded integration branch into an actionable status.
267
299
  *
@@ -280,7 +312,13 @@ export function resolveMilestoneIntegrationBranch(basePath, milestoneId, prefs =
280
312
  reason: `Milestone ${milestoneId} has no recorded integration branch metadata.`,
281
313
  };
282
314
  }
283
- if (nativeBranchExists(basePath, recordedBranch)) {
315
+ const normalizedRecordedBranch = normalizeLocalBranchRef(recordedBranch);
316
+ const isRecordedMilestoneBranch = normalizedRecordedBranch.startsWith("milestone/");
317
+ const recordedBranchUsable = !isRecordedMilestoneBranch;
318
+ const recordedBranchStateMessage = isRecordedMilestoneBranch
319
+ ? `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} is invalid (milestone branches cannot be merge targets)`
320
+ : `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists`;
321
+ if (recordedBranchUsable && nativeBranchExists(basePath, recordedBranch)) {
284
322
  return {
285
323
  recordedBranch,
286
324
  effectiveBranch: recordedBranch,
@@ -297,14 +335,14 @@ export function resolveMilestoneIntegrationBranch(basePath, milestoneId, prefs =
297
335
  recordedBranch,
298
336
  effectiveBranch: configuredBranch,
299
337
  status: "fallback",
300
- reason: `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists; using configured git.main_branch "${configuredBranch}" instead.`,
338
+ reason: `${recordedBranchStateMessage}; using configured git.main_branch "${configuredBranch}" instead.`,
301
339
  };
302
340
  }
303
341
  return {
304
342
  recordedBranch,
305
343
  effectiveBranch: null,
306
344
  status: "missing",
307
- reason: `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists, and configured git.main_branch "${configuredBranch}" is unavailable.`,
345
+ reason: `${recordedBranchStateMessage}, and configured git.main_branch "${configuredBranch}" is unavailable.`,
308
346
  };
309
347
  }
310
348
  try {
@@ -314,7 +352,7 @@ export function resolveMilestoneIntegrationBranch(basePath, milestoneId, prefs =
314
352
  recordedBranch,
315
353
  effectiveBranch: detectedBranch,
316
354
  status: "fallback",
317
- reason: `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists; using detected fallback branch "${detectedBranch}" instead.`,
355
+ reason: `${recordedBranchStateMessage}; using detected fallback branch "${detectedBranch}" instead.`,
318
356
  };
319
357
  }
320
358
  }
@@ -325,7 +363,7 @@ export function resolveMilestoneIntegrationBranch(basePath, milestoneId, prefs =
325
363
  recordedBranch,
326
364
  effectiveBranch: null,
327
365
  status: "missing",
328
- reason: `Recorded integration branch "${recordedBranch}" for milestone ${milestoneId} no longer exists, and no safe fallback branch could be determined.`,
366
+ reason: `${recordedBranchStateMessage}, and no safe fallback branch could be determined.`,
329
367
  };
330
368
  }
331
369
  // ─── Pre-Merge Command Tokenizer ──────────────────────────────────────────
@@ -572,6 +610,20 @@ export class GitServiceImpl {
572
610
  .filter((file) => file !== null)
573
611
  .filter(file => !nativeIsIgnored(this.basePath, file))
574
612
  .filter(file => !isExcludedScopedPath(file, allExclusions));
613
+ const scopedPaths = [];
614
+ const submodulePaths = [];
615
+ const repoSubmodules = submodulePathsFromLsFiles(runGit(this.basePath, ["ls-files", "--stage"], { allowFailure: true }));
616
+ for (const path of normalized) {
617
+ if (isInsideSubmodule(path, repoSubmodules)) {
618
+ submodulePaths.push(path);
619
+ }
620
+ else {
621
+ scopedPaths.push(path);
622
+ }
623
+ }
624
+ if (submodulePaths.length > 0) {
625
+ logWarning("engine", `scoped stage: dropping ${submodulePaths.length} keyFile(s) inside git submodule(s): ${submodulePaths.join(", ")}`, { file: "git-service.ts" });
626
+ }
575
627
  // Drop entries that don't exist on disk. The LLM occasionally lists files
576
628
  // it intended to write but didn't (or names them with wrong casing/path).
577
629
  // Pre-`b304f738b` `git add -A` swallowed these silently; the scoped
@@ -579,7 +631,7 @@ export class GitServiceImpl {
579
631
  // the whole commit fail (see #5500). Filter so valid paths still commit.
580
632
  const missing = [];
581
633
  const existing = [];
582
- for (const path of normalized) {
634
+ for (const path of scopedPaths) {
583
635
  if (existsSync(join(this.basePath, path))) {
584
636
  existing.push(path);
585
637
  }
@@ -651,7 +703,23 @@ export class GitServiceImpl {
651
703
  const message = taskContext
652
704
  ? buildTaskCommitMessage(taskContext)
653
705
  : `chore: auto-commit after ${unitType}\n\nGSD-Unit: ${unitId}`;
654
- nativeCommit(this.basePath, message, { allowEmpty: false });
706
+ try {
707
+ nativeCommit(this.basePath, message, { allowEmpty: false });
708
+ }
709
+ catch (err) {
710
+ // Some pre-commit hooks intentionally rewrite files and fail the first
711
+ // commit to force a re-stage + retry.
712
+ if (!nativeHasChanges(this.basePath))
713
+ throw err;
714
+ const retriedScoped = taskContext
715
+ ? this.scopedStageTaskFiles(taskContext, extraExclusions)
716
+ : false;
717
+ if (!retriedScoped)
718
+ this.smartStage(extraExclusions);
719
+ if (!nativeHasStagedChanges(this.basePath))
720
+ throw err;
721
+ nativeCommit(this.basePath, message, { allowEmpty: false });
722
+ }
655
723
  // Absorb any preceding gsd snapshot commits into this real commit.
656
724
  // Walk backwards from HEAD~1 counting consecutive snapshot subjects,
657
725
  // then soft-reset to before them and re-commit with the same message.
@@ -919,21 +987,70 @@ export function handleTurnGitActionError(action, err) {
919
987
  if (isInfrastructureError(err)) {
920
988
  throw err;
921
989
  }
990
+ const errorWithStreams = err;
922
991
  return {
923
992
  action,
924
993
  status: "failed",
925
- error: getErrorMessage(err),
994
+ error: errorWithStreams.stderr?.trim() || errorWithStreams.message || getErrorMessage(err),
926
995
  };
927
996
  }
997
+ function collectRepositoryDirtyStatus(basePath) {
998
+ const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
999
+ const registry = createRepositoryRegistryFromPreferences(basePath, preferences);
1000
+ const dirtyByRepository = {};
1001
+ for (const repo of registry.repositories) {
1002
+ try {
1003
+ dirtyByRepository[repo.id] = runGit(repo.root, ["status", "--porcelain"]).length > 0;
1004
+ }
1005
+ catch {
1006
+ // Fallback preserves legacy behavior if explicit status probing fails.
1007
+ dirtyByRepository[repo.id] = nativeHasChanges(repo.root);
1008
+ }
1009
+ }
1010
+ return dirtyByRepository;
1011
+ }
1012
+ function runPerRepositoryCommitAction(args) {
1013
+ const preferences = loadEffectiveGSDPreferences(args.basePath)?.preferences;
1014
+ const registry = createRepositoryRegistryFromPreferences(args.basePath, preferences);
1015
+ const repoIds = args.targetRepositories ?? ["project"];
1016
+ const gitPrefs = preferences?.git ?? {};
1017
+ const commitMessages = {};
1018
+ const commitErrors = {};
1019
+ const skippedRepositories = [];
1020
+ for (const repoId of repoIds) {
1021
+ const repo = registry.byId.get(repoId);
1022
+ if (!repo) {
1023
+ commitErrors[repoId] = `unknown repository target: ${repoId}`;
1024
+ continue;
1025
+ }
1026
+ if (repo.commitPolicy === "skip") {
1027
+ skippedRepositories.push(repo.id);
1028
+ continue;
1029
+ }
1030
+ try {
1031
+ const message = new GitServiceImpl(repo.root, gitPrefs).autoCommit(args.unitType, args.unitId, [], args.taskContext) ?? "";
1032
+ if (message) {
1033
+ commitMessages[repo.id] = message;
1034
+ }
1035
+ }
1036
+ catch (err) {
1037
+ commitErrors[repo.id] = getErrorMessage(err);
1038
+ }
1039
+ }
1040
+ return { commitMessages, commitErrors, skippedRepositories };
1041
+ }
928
1042
  export function runTurnGitAction(args) {
929
1043
  try {
930
1044
  // Force fresh working-tree status per turn; nativeHasChanges caches briefly.
931
1045
  _resetHasChangesCache();
1046
+ const dirtyRepositories = collectRepositoryDirtyStatus(args.basePath);
1047
+ const dirty = Object.values(dirtyRepositories).some(Boolean);
932
1048
  if (args.action === "status-only") {
933
1049
  return {
934
1050
  action: args.action,
935
1051
  status: "ok",
936
- dirty: nativeHasChanges(args.basePath),
1052
+ dirty,
1053
+ dirtyRepositories,
937
1054
  };
938
1055
  }
939
1056
  const git = createGitService(args.basePath);
@@ -944,15 +1061,35 @@ export function runTurnGitAction(args) {
944
1061
  action: args.action,
945
1062
  status: "ok",
946
1063
  snapshotLabel: label,
947
- dirty: nativeHasChanges(args.basePath),
1064
+ dirty,
1065
+ dirtyRepositories,
1066
+ };
1067
+ }
1068
+ const repoCommitResult = runPerRepositoryCommitAction(args);
1069
+ if (Object.keys(repoCommitResult.commitErrors).length > 0) {
1070
+ return {
1071
+ action: args.action,
1072
+ status: "failed",
1073
+ error: Object.entries(repoCommitResult.commitErrors)
1074
+ .map(([repoId, msg]) => `${repoId}: ${msg}`)
1075
+ .join("; "),
1076
+ dirty,
1077
+ dirtyRepositories,
1078
+ commitMessages: repoCommitResult.commitMessages,
1079
+ commitErrors: repoCommitResult.commitErrors,
1080
+ skippedRepositories: repoCommitResult.skippedRepositories,
948
1081
  };
949
1082
  }
950
- const commitMessage = git.autoCommit(args.unitType, args.unitId, [], args.taskContext) ?? undefined;
1083
+ const primaryMessage = repoCommitResult.commitMessages[args.targetRepositories?.[0] ?? "project"]
1084
+ ?? Object.values(repoCommitResult.commitMessages)[0];
951
1085
  return {
952
1086
  action: args.action,
953
1087
  status: "ok",
954
- commitMessage,
955
- dirty: nativeHasChanges(args.basePath),
1088
+ commitMessage: primaryMessage,
1089
+ dirty,
1090
+ dirtyRepositories,
1091
+ commitMessages: repoCommitResult.commitMessages,
1092
+ skippedRepositories: repoCommitResult.skippedRepositories,
956
1093
  };
957
1094
  }
958
1095
  catch (err) {
@@ -37,7 +37,7 @@ import { rowToActiveDecision, rowToActiveRequirement, rowToDecision, rowToRequir
37
37
  import { rowToGate } from "./db-gate-rows.js";
38
38
  import { rowToArtifact, rowToMilestone } from "./db-milestone-artifact-rows.js";
39
39
  import { backupDatabaseBeforeMigration } from "./db-migration-backup.js";
40
- import { applyMigrationV2Artifacts, applyMigrationV3Memories, applyMigrationV4DecisionMadeBy, applyMigrationV5HierarchyTables, applyMigrationV6SliceSummaries, applyMigrationV7Dependencies, applyMigrationV8PlanningFields, applyMigrationV9Ordering, applyMigrationV10ReplanTrigger, applyMigrationV11TaskPlanning, applyMigrationV12QualityGates, applyMigrationV13HotPathIndexes, applyMigrationV14SliceDependencies, applyMigrationV15AuditTables, applyMigrationV16EscalationSource, applyMigrationV17TaskEscalation, applyMigrationV18MemorySources, applyMigrationV19MemoryFts, applyMigrationV20MemoryRelations, applyMigrationV21StructuredMemories, applyMigrationV22QualityGateRepair, applyMigrationV23MilestoneQueue, applyMigrationV26MilestoneCommitAttributions, applyMigrationV27ArtifactHash, applyMigrationV28MemoryLastHitAt, } from "./db-migration-steps.js";
40
+ import { applyMigrationV2Artifacts, applyMigrationV3Memories, applyMigrationV4DecisionMadeBy, applyMigrationV5HierarchyTables, applyMigrationV6SliceSummaries, applyMigrationV7Dependencies, applyMigrationV8PlanningFields, applyMigrationV9Ordering, applyMigrationV10ReplanTrigger, applyMigrationV11TaskPlanning, applyMigrationV12QualityGates, applyMigrationV13HotPathIndexes, applyMigrationV14SliceDependencies, applyMigrationV15AuditTables, applyMigrationV16EscalationSource, applyMigrationV17TaskEscalation, applyMigrationV18MemorySources, applyMigrationV19MemoryFts, applyMigrationV20MemoryRelations, applyMigrationV21StructuredMemories, applyMigrationV22QualityGateRepair, applyMigrationV23MilestoneQueue, applyMigrationV26MilestoneCommitAttributions, applyMigrationV27ArtifactHash, applyMigrationV28MemoryLastHitAt, applyMigrationV29RepositoryTargets, } from "./db-migration-steps.js";
41
41
  import { isMemoriesFtsAvailableSchema, tryCreateMemoriesFtsSchema } from "./db-memory-fts-schema.js";
42
42
  import { createDbOpenState } from "./db-open-state.js";
43
43
  import { createRuntimeKvTableV25 } from "./db-runtime-kv-schema.js";
@@ -53,19 +53,21 @@ const providerLoader = createSqliteProviderLoader({
53
53
  nodeVersion: process.versions.node,
54
54
  writeStderr: (message) => process.stderr.write(message),
55
55
  });
56
- export const SCHEMA_VERSION = 28;
57
- function initSchema(db, fileBacked) {
56
+ export const SCHEMA_VERSION = 29;
57
+ const TERMINAL_STATUS_SQL = "'complete', 'done', 'skipped', 'closed'";
58
+ function initSchema(db, fileBacked, dbPath) {
59
+ const conservativeFilePragmas = fileBacked && _isLikelyWslDrvFsPathForTest(dbPath);
58
60
  if (fileBacked)
59
- db.exec("PRAGMA journal_mode=WAL");
61
+ db.exec(conservativeFilePragmas ? "PRAGMA journal_mode=DELETE" : "PRAGMA journal_mode=WAL");
60
62
  if (fileBacked)
61
63
  db.exec("PRAGMA busy_timeout = 5000");
62
64
  if (fileBacked)
63
- db.exec("PRAGMA synchronous = NORMAL");
65
+ db.exec(conservativeFilePragmas ? "PRAGMA synchronous = FULL" : "PRAGMA synchronous = NORMAL");
64
66
  if (fileBacked)
65
67
  db.exec("PRAGMA auto_vacuum = INCREMENTAL");
66
68
  if (fileBacked)
67
69
  db.exec("PRAGMA cache_size = -8000"); // 8 MB page cache
68
- if (fileBacked && process.platform !== "darwin")
70
+ if (fileBacked && !conservativeFilePragmas && process.platform !== "darwin")
69
71
  db.exec("PRAGMA mmap_size = 67108864"); // 64 MB mmap
70
72
  db.exec("PRAGMA temp_store = MEMORY");
71
73
  db.exec("PRAGMA foreign_keys = ON");
@@ -99,6 +101,19 @@ function initSchema(db, fileBacked) {
99
101
  }
100
102
  migrateSchema(db);
101
103
  }
104
+ export function _isLikelyWslDrvFsPathForTest(dbPath) {
105
+ if (!dbPath || process.platform !== "linux")
106
+ return false;
107
+ const drvFsPathPattern = /^\/mnt\/[a-z](?:\/|$)/i;
108
+ if (drvFsPathPattern.test(dbPath))
109
+ return true;
110
+ try {
111
+ return drvFsPathPattern.test(realpathSync(dbPath));
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
102
117
  /**
103
118
  * Create the FTS5 virtual table for memories plus the triggers that keep it
104
119
  * in sync with the base table. FTS5 may be unavailable on stripped-down
@@ -259,6 +274,10 @@ function migrateSchema(db) {
259
274
  applyMigrationV28MemoryLastHitAt(db);
260
275
  recordSchemaVersion(db, 28);
261
276
  }
277
+ if (currentVersion < 29) {
278
+ applyMigrationV29RepositoryTargets(db);
279
+ recordSchemaVersion(db, 29);
280
+ }
262
281
  db.exec("COMMIT");
263
282
  }
264
283
  catch (err) {
@@ -504,7 +523,7 @@ export function openDatabase(path) {
504
523
  const adapter = createDbAdapter(rawDb);
505
524
  const fileBacked = path !== ":memory:";
506
525
  try {
507
- initSchema(adapter, fileBacked);
526
+ initSchema(adapter, fileBacked, path);
508
527
  }
509
528
  catch (err) {
510
529
  // Corrupt freelist: DDL fails with "malformed" but VACUUM can rebuild.
@@ -512,7 +531,7 @@ export function openDatabase(path) {
512
531
  if (fileBacked && err instanceof Error && err.message?.includes("malformed")) {
513
532
  try {
514
533
  adapter.exec("VACUUM");
515
- initSchema(adapter, fileBacked);
534
+ initSchema(adapter, fileBacked, path);
516
535
  process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
517
536
  }
518
537
  catch (retryErr) {
@@ -916,16 +935,16 @@ export function insertSlice(s) {
916
935
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
917
936
  currentDb.prepare(`INSERT INTO slices (
918
937
  milestone_id, id, title, status, risk, depends, demo, created_at,
919
- goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
938
+ goal, success_criteria, proof_level, integration_closure, observability_impact, target_repositories, sequence,
920
939
  is_sketch, sketch_scope
921
940
  ) VALUES (
922
941
  :milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
923
- :goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
942
+ :goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :target_repositories, :sequence,
924
943
  :is_sketch, :sketch_scope
925
944
  )
926
945
  ON CONFLICT (milestone_id, id) DO UPDATE SET
927
946
  title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
928
- status = CASE WHEN slices.status IN ('complete', 'done') THEN slices.status ELSE excluded.status END,
947
+ status = CASE WHEN slices.status IN (${TERMINAL_STATUS_SQL}) THEN slices.status ELSE excluded.status END,
929
948
  risk = CASE WHEN :raw_risk IS NOT NULL THEN excluded.risk ELSE slices.risk END,
930
949
  depends = excluded.depends,
931
950
  demo = CASE WHEN :raw_demo IS NOT NULL THEN excluded.demo ELSE slices.demo END,
@@ -934,6 +953,7 @@ export function insertSlice(s) {
934
953
  proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
935
954
  integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
936
955
  observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
956
+ target_repositories = CASE WHEN :raw_target_repositories IS NOT NULL THEN excluded.target_repositories ELSE slices.target_repositories END,
937
957
  sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
938
958
  is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
939
959
  sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`).run({
@@ -950,6 +970,7 @@ export function insertSlice(s) {
950
970
  ":proof_level": s.planning?.proofLevel ?? "",
951
971
  ":integration_closure": s.planning?.integrationClosure ?? "",
952
972
  ":observability_impact": s.planning?.observabilityImpact ?? "",
973
+ ":target_repositories": JSON.stringify(s.planning?.targetRepositories ?? []),
953
974
  ":sequence": s.sequence ?? 0,
954
975
  ":is_sketch": s.isSketch ? 1 : 0,
955
976
  ":sketch_scope": s.sketchScope ?? "",
@@ -962,6 +983,7 @@ export function insertSlice(s) {
962
983
  ":raw_proof_level": s.planning?.proofLevel ?? null,
963
984
  ":raw_integration_closure": s.planning?.integrationClosure ?? null,
964
985
  ":raw_observability_impact": s.planning?.observabilityImpact ?? null,
986
+ ":raw_target_repositories": s.planning?.targetRepositories ? JSON.stringify(s.planning.targetRepositories) : null,
965
987
  ":raw_sequence": s.sequence ?? null,
966
988
  ":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
967
989
  // NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
@@ -996,7 +1018,8 @@ export function upsertSlicePlanning(milestoneId, sliceId, planning) {
996
1018
  success_criteria = COALESCE(:success_criteria, success_criteria),
997
1019
  proof_level = COALESCE(:proof_level, proof_level),
998
1020
  integration_closure = COALESCE(:integration_closure, integration_closure),
999
- observability_impact = COALESCE(:observability_impact, observability_impact)
1021
+ observability_impact = COALESCE(:observability_impact, observability_impact),
1022
+ target_repositories = COALESCE(:target_repositories, target_repositories)
1000
1023
  WHERE milestone_id = :milestone_id AND id = :id`).run({
1001
1024
  ":milestone_id": milestoneId,
1002
1025
  ":id": sliceId,
@@ -1005,6 +1028,7 @@ export function upsertSlicePlanning(milestoneId, sliceId, planning) {
1005
1028
  ":proof_level": planning.proofLevel ?? null,
1006
1029
  ":integration_closure": planning.integrationClosure ?? null,
1007
1030
  ":observability_impact": planning.observabilityImpact ?? null,
1031
+ ":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
1008
1032
  });
1009
1033
  }
1010
1034
  export function insertTask(t) {
@@ -1015,11 +1039,13 @@ export function insertTask(t) {
1015
1039
  verification_result, duration, completed_at, blocker_discovered,
1016
1040
  deviations, known_issues, key_files, key_decisions, full_summary_md,
1017
1041
  description, estimate, files, verify, inputs, expected_output, observability_impact, sequence
1042
+ , target_repositories
1018
1043
  ) VALUES (
1019
1044
  :milestone_id, :slice_id, :id, :title, :status, :one_liner, :narrative,
1020
1045
  :verification_result, :duration, :completed_at, :blocker_discovered,
1021
1046
  :deviations, :known_issues, :key_files, :key_decisions, :full_summary_md,
1022
1047
  :description, :estimate, :files, :verify, :inputs, :expected_output, :observability_impact, :sequence
1048
+ , :target_repositories
1023
1049
  )
1024
1050
  ON CONFLICT(milestone_id, slice_id, id) DO UPDATE SET
1025
1051
  title = CASE WHEN NULLIF(:title, '') IS NOT NULL THEN :title ELSE tasks.title END,
@@ -1042,7 +1068,11 @@ export function insertTask(t) {
1042
1068
  inputs = CASE WHEN NULLIF(:inputs, '[]') IS NOT NULL THEN :inputs ELSE tasks.inputs END,
1043
1069
  expected_output = CASE WHEN NULLIF(:expected_output, '[]') IS NOT NULL THEN :expected_output ELSE tasks.expected_output END,
1044
1070
  observability_impact = CASE WHEN NULLIF(:observability_impact, '') IS NOT NULL THEN :observability_impact ELSE tasks.observability_impact END,
1045
- sequence = :sequence`).run({
1071
+ sequence = :sequence,
1072
+ target_repositories = CASE
1073
+ WHEN :raw_target_repositories IS NOT NULL THEN :target_repositories
1074
+ ELSE tasks.target_repositories
1075
+ END`).run({
1046
1076
  ":milestone_id": t.milestoneId,
1047
1077
  ":slice_id": t.sliceId,
1048
1078
  ":id": t.id,
@@ -1067,6 +1097,10 @@ export function insertTask(t) {
1067
1097
  ":expected_output": JSON.stringify(t.planning?.expectedOutput ?? []),
1068
1098
  ":observability_impact": t.planning?.observabilityImpact ?? "",
1069
1099
  ":sequence": t.sequence ?? 0,
1100
+ ":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
1101
+ ":raw_target_repositories": t.planning && "targetRepositories" in t.planning
1102
+ ? JSON.stringify(t.planning.targetRepositories ?? [])
1103
+ : null,
1070
1104
  });
1071
1105
  }
1072
1106
  export function updateTaskStatus(milestoneId, sliceId, taskId, status, completedAt) {
@@ -1098,7 +1132,8 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
1098
1132
  inputs = COALESCE(:inputs, inputs),
1099
1133
  expected_output = COALESCE(:expected_output, expected_output),
1100
1134
  observability_impact = COALESCE(:observability_impact, observability_impact),
1101
- full_plan_md = COALESCE(:full_plan_md, full_plan_md)
1135
+ full_plan_md = COALESCE(:full_plan_md, full_plan_md),
1136
+ target_repositories = COALESCE(:target_repositories, target_repositories)
1102
1137
  WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`).run({
1103
1138
  ":milestone_id": milestoneId,
1104
1139
  ":slice_id": sliceId,
@@ -1112,6 +1147,7 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
1112
1147
  ":expected_output": planning.expectedOutput ? JSON.stringify(planning.expectedOutput) : null,
1113
1148
  ":observability_impact": planning.observabilityImpact ?? null,
1114
1149
  ":full_plan_md": planning.fullPlanMd ?? null,
1150
+ ":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
1115
1151
  });
1116
1152
  }
1117
1153
  export function getSlice(milestoneId, sliceId) {
@@ -1352,7 +1388,7 @@ export function updateMilestoneStatus(milestoneId, status, completedAt) {
1352
1388
  export function getActiveMilestoneFromDb() {
1353
1389
  if (!currentDb)
1354
1390
  return null;
1355
- const row = currentDb.prepare("SELECT * FROM milestones WHERE status NOT IN ('complete', 'parked') ORDER BY id LIMIT 1").get();
1391
+ const row = currentDb.prepare("SELECT * FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1").get();
1356
1392
  if (!row)
1357
1393
  return null;
1358
1394
  return rowToMilestone(row);
@@ -1404,7 +1440,7 @@ export function getArtifact(path) {
1404
1440
  export function getActiveMilestoneIdFromDb() {
1405
1441
  if (!currentDb)
1406
1442
  return null;
1407
- const row = currentDb.prepare("SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'parked') ORDER BY id LIMIT 1").get();
1443
+ const row = currentDb.prepare("SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1").get();
1408
1444
  if (!row)
1409
1445
  return null;
1410
1446
  return rowToIdStatusSummary(row);
@@ -1510,12 +1546,14 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1510
1546
  const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
1511
1547
  const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
1512
1548
  const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
1549
+ const hasSliceTargetRepositories = wtSliceInfo.some((col) => col["name"] === "target_repositories");
1513
1550
  const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
1514
1551
  const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
1515
1552
  const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
1516
1553
  const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
1517
1554
  const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
1518
1555
  const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
1556
+ const hasTaskTargetRepositories = wtTaskInfo.some((col) => col["name"] === "target_repositories");
1519
1557
  const wtArtifactInfo = adapter.prepare("PRAGMA wt.table_info('artifacts')").all();
1520
1558
  const hasArtifactContentHash = wtArtifactInfo.some((col) => col["name"] === "content_hash");
1521
1559
  const wtMemoryInfo = adapter.prepare("PRAGMA wt.table_info('memories')").all();
@@ -1580,16 +1618,16 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1580
1618
  )
1581
1619
  SELECT w.id, w.title,
1582
1620
  CASE
1583
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1621
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1584
1622
  THEN m.status ELSE w.status
1585
1623
  END,
1586
1624
  w.depends_on,
1587
1625
  CASE
1588
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1626
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1589
1627
  THEN m.created_at ELSE w.created_at
1590
1628
  END,
1591
1629
  CASE
1592
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1630
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1593
1631
  THEN m.completed_at ELSE w.completed_at
1594
1632
  END,
1595
1633
  w.vision, w.success_criteria, w.key_risks, w.proof_strategy,
@@ -1607,21 +1645,23 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1607
1645
  INSERT OR REPLACE INTO slices (
1608
1646
  milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
1609
1647
  full_summary_md, full_uat_md, goal, success_criteria, proof_level,
1610
- integration_closure, observability_impact, sequence, replan_triggered_at,
1648
+ integration_closure, observability_impact, target_repositories, sequence, replan_triggered_at,
1611
1649
  is_sketch, sketch_scope
1612
1650
  )
1613
1651
  SELECT w.milestone_id, w.id, w.title,
1614
1652
  CASE
1615
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1653
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1616
1654
  THEN m.status ELSE w.status
1617
1655
  END,
1618
1656
  w.risk, w.depends, w.demo, w.created_at,
1619
1657
  CASE
1620
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1658
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1621
1659
  THEN m.completed_at ELSE w.completed_at
1622
1660
  END,
1623
1661
  w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
1624
- w.integration_closure, w.observability_impact, w.sequence, w.replan_triggered_at,
1662
+ w.integration_closure, w.observability_impact,
1663
+ ${hasSliceTargetRepositories ? "w.target_repositories" : "COALESCE(m.target_repositories, '[]')"},
1664
+ w.sequence, w.replan_triggered_at,
1625
1665
  ${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
1626
1666
  ${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
1627
1667
  FROM wt.slices w
@@ -1636,25 +1676,27 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
1636
1676
  verification_result, duration, completed_at, blocker_discovered,
1637
1677
  deviations, known_issues, key_files, key_decisions, full_summary_md,
1638
1678
  description, estimate, files, verify, inputs, expected_output,
1639
- observability_impact, full_plan_md, sequence,
1679
+ observability_impact, full_plan_md, target_repositories, sequence,
1640
1680
  blocker_source, escalation_pending, escalation_awaiting_review,
1641
1681
  escalation_artifact_path, escalation_override_applied_at
1642
1682
  )
1643
1683
  SELECT w.milestone_id, w.slice_id, w.id, w.title,
1644
1684
  CASE
1645
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1685
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1646
1686
  THEN m.status ELSE w.status
1647
1687
  END,
1648
1688
  w.one_liner, w.narrative,
1649
1689
  w.verification_result, w.duration,
1650
1690
  CASE
1651
- WHEN m.status IN ('complete', 'done') AND w.status NOT IN ('complete', 'done')
1691
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1652
1692
  THEN m.completed_at ELSE w.completed_at
1653
1693
  END,
1654
1694
  w.blocker_discovered,
1655
1695
  w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
1656
1696
  w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
1657
- w.observability_impact, w.full_plan_md, w.sequence,
1697
+ w.observability_impact, w.full_plan_md,
1698
+ ${hasTaskTargetRepositories ? "w.target_repositories" : "COALESCE(m.target_repositories, '[]')"},
1699
+ w.sequence,
1658
1700
  ${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
1659
1701
  ${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
1660
1702
  ${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
@@ -1769,6 +1811,7 @@ export function deleteTask(milestoneId, sliceId, taskId) {
1769
1811
  transaction(() => {
1770
1812
  // Must delete verification_evidence first (FK constraint)
1771
1813
  currentDb.prepare(`DELETE FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1814
+ currentDb.prepare(`DELETE FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1772
1815
  currentDb.prepare(`DELETE FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1773
1816
  });
1774
1817
  }
@@ -2266,22 +2309,22 @@ export function restoreManifest(manifest) {
2266
2309
  const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
2267
2310
  created_at, completed_at, full_summary_md, full_uat_md,
2268
2311
  goal, success_criteria, proof_level, integration_closure, observability_impact,
2269
- sequence, replan_triggered_at, is_sketch, sketch_scope)
2270
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2312
+ target_repositories, sequence, replan_triggered_at, is_sketch, sketch_scope)
2313
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2271
2314
  for (const s of manifest.slices) {
2272
- slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, s.sequence, s.replan_triggered_at, s.is_sketch ?? 0, s.sketch_scope ?? "");
2315
+ slStmt.run(s.milestone_id, s.id, s.title, s.status, s.risk, JSON.stringify(s.depends), s.demo, s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md, s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact, JSON.stringify(s.target_repositories ?? []), s.sequence, s.replan_triggered_at, s.is_sketch ?? 0, s.sketch_scope ?? "");
2273
2316
  }
2274
2317
  // Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
2275
2318
  const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
2276
2319
  one_liner, narrative, verification_result, duration, completed_at,
2277
2320
  blocker_discovered, deviations, known_issues, key_files, key_decisions,
2278
2321
  full_summary_md, description, estimate, files, verify,
2279
- inputs, expected_output, observability_impact, sequence,
2322
+ inputs, expected_output, observability_impact, target_repositories, sequence,
2280
2323
  blocker_source, escalation_pending, escalation_awaiting_review,
2281
2324
  escalation_artifact_path, escalation_override_applied_at)
2282
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2325
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
2283
2326
  for (const t of manifest.tasks) {
2284
- tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, t.sequence, t.blocker_source ?? "", t.escalation_pending ?? 0, t.escalation_awaiting_review ?? 0, t.escalation_artifact_path ?? null, t.escalation_override_applied_at ?? null);
2327
+ tkStmt.run(t.milestone_id, t.slice_id, t.id, t.title, t.status, t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at, t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues, JSON.stringify(t.key_files), JSON.stringify(t.key_decisions), t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify, JSON.stringify(t.inputs), JSON.stringify(t.expected_output), t.observability_impact, JSON.stringify(t.target_repositories ?? []), t.sequence, t.blocker_source ?? "", t.escalation_pending ?? 0, t.escalation_awaiting_review ?? 0, t.escalation_artifact_path ?? null, t.escalation_override_applied_at ?? null);
2285
2328
  }
2286
2329
  // Restore decisions (ADR-011 P2: include source so escalation decisions survive)
2287
2330
  const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)