gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.6e23363

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 (275) hide show
  1. package/dist/cli.js +85 -0
  2. package/dist/headless-query.js +4 -1
  3. package/dist/help-text.js +23 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +16 -0
  5. package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
  6. package/dist/resources/extensions/gsd/auto/loop.js +147 -10
  7. package/dist/resources/extensions/gsd/auto/phases.js +158 -4
  8. package/dist/resources/extensions/gsd/auto/session.js +10 -0
  9. package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
  10. package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +213 -14
  12. package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
  13. package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
  14. package/dist/resources/extensions/gsd/auto-verification.js +100 -2
  15. package/dist/resources/extensions/gsd/auto.js +36 -4
  16. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +21 -8
  17. package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
  18. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  19. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
  20. package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
  21. package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
  22. package/dist/resources/extensions/gsd/commands-do.js +79 -0
  23. package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
  24. package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
  25. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
  26. package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
  27. package/dist/resources/extensions/gsd/commands-ship.js +187 -0
  28. package/dist/resources/extensions/gsd/db-writer.js +3 -5
  29. package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  30. package/dist/resources/extensions/gsd/git-service.js +49 -1
  31. package/dist/resources/extensions/gsd/graph-context.js +157 -0
  32. package/dist/resources/extensions/gsd/gsd-db.js +581 -2
  33. package/dist/resources/extensions/gsd/guided-flow.js +23 -0
  34. package/dist/resources/extensions/gsd/index.js +15 -2
  35. package/dist/resources/extensions/gsd/init-wizard.js +1 -0
  36. package/dist/resources/extensions/gsd/journal.js +27 -0
  37. package/dist/resources/extensions/gsd/md-importer.js +3 -4
  38. package/dist/resources/extensions/gsd/memory-store.js +19 -51
  39. package/dist/resources/extensions/gsd/metrics.js +19 -0
  40. package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
  41. package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
  42. package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
  43. package/dist/resources/extensions/gsd/preferences-models.js +20 -3
  44. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  45. package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
  46. package/dist/resources/extensions/gsd/preferences.js +26 -0
  47. package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
  48. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
  49. package/dist/resources/extensions/gsd/state.js +5 -1
  50. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  51. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
  52. package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
  53. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
  54. package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
  55. package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
  56. package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
  57. package/dist/resources/extensions/gsd/uok/audit.js +40 -0
  58. package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
  59. package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
  60. package/dist/resources/extensions/gsd/uok/flags.js +29 -0
  61. package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
  62. package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
  63. package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
  64. package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
  65. package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
  66. package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
  67. package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
  68. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
  69. package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
  70. package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
  71. package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
  72. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  73. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  74. package/dist/web/standalone/.next/BUILD_ID +1 -1
  75. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  76. package/dist/web/standalone/.next/build-manifest.json +2 -2
  77. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  78. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  87. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/index.html +1 -1
  95. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  102. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  104. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  105. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  106. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  107. package/package.json +3 -2
  108. package/packages/daemon/package.json +2 -2
  109. package/packages/mcp-server/dist/index.d.ts +3 -0
  110. package/packages/mcp-server/dist/index.d.ts.map +1 -1
  111. package/packages/mcp-server/dist/index.js +3 -0
  112. package/packages/mcp-server/dist/index.js.map +1 -1
  113. package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
  114. package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
  115. package/packages/mcp-server/dist/readers/graph.js +548 -0
  116. package/packages/mcp-server/dist/readers/graph.js.map +1 -0
  117. package/packages/mcp-server/dist/readers/index.d.ts +2 -0
  118. package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
  119. package/packages/mcp-server/dist/readers/index.js +1 -0
  120. package/packages/mcp-server/dist/readers/index.js.map +1 -1
  121. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  122. package/packages/mcp-server/dist/server.js +65 -0
  123. package/packages/mcp-server/dist/server.js.map +1 -1
  124. package/packages/mcp-server/package.json +2 -2
  125. package/packages/mcp-server/src/index.ts +15 -0
  126. package/packages/mcp-server/src/readers/graph.test.ts +426 -0
  127. package/packages/mcp-server/src/readers/graph.ts +708 -0
  128. package/packages/mcp-server/src/readers/index.ts +12 -0
  129. package/packages/mcp-server/src/server.ts +83 -0
  130. package/packages/mcp-server/tsconfig.json +1 -0
  131. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
  132. package/packages/native/package.json +2 -2
  133. package/packages/native/tsconfig.tsbuildinfo +1 -0
  134. package/packages/pi-agent-core/package.json +1 -1
  135. package/packages/pi-agent-core/tsconfig.json +1 -0
  136. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
  137. package/packages/pi-ai/package.json +1 -1
  138. package/packages/pi-ai/tsconfig.json +1 -0
  139. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
  140. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +120 -0
  141. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  142. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
  143. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
  144. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
  145. package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
  146. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  148. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  150. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +48 -4
  151. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  152. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +166 -0
  153. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  154. package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
  155. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +53 -4
  156. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  157. package/packages/pi-coding-agent/tsconfig.json +3 -2
  158. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
  159. package/packages/pi-tui/package.json +1 -1
  160. package/packages/pi-tui/tsconfig.json +1 -0
  161. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  162. package/packages/rpc-client/package.json +1 -1
  163. package/packages/rpc-client/tsconfig.json +1 -0
  164. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
  165. package/src/resources/extensions/gsd/activity-log.ts +21 -0
  166. package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
  167. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
  168. package/src/resources/extensions/gsd/auto/loop.ts +159 -10
  169. package/src/resources/extensions/gsd/auto/phases.ts +191 -4
  170. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  171. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
  172. package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
  173. package/src/resources/extensions/gsd/auto-post-unit.ts +231 -15
  174. package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
  175. package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
  176. package/src/resources/extensions/gsd/auto-verification.ts +129 -2
  177. package/src/resources/extensions/gsd/auto.ts +41 -2
  178. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -8
  179. package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
  180. package/src/resources/extensions/gsd/commands/handlers/ops.ts +20 -0
  181. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
  182. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  183. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  184. package/src/resources/extensions/gsd/commands-do.ts +109 -0
  185. package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
  186. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  187. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
  188. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  189. package/src/resources/extensions/gsd/commands-ship.ts +219 -0
  190. package/src/resources/extensions/gsd/db-writer.ts +3 -5
  191. package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
  192. package/src/resources/extensions/gsd/git-service.ts +68 -0
  193. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  194. package/src/resources/extensions/gsd/gsd-db.ts +788 -3
  195. package/src/resources/extensions/gsd/guided-flow.ts +32 -0
  196. package/src/resources/extensions/gsd/index.ts +18 -2
  197. package/src/resources/extensions/gsd/init-wizard.ts +3 -2
  198. package/src/resources/extensions/gsd/journal.ts +30 -0
  199. package/src/resources/extensions/gsd/md-importer.ts +3 -5
  200. package/src/resources/extensions/gsd/memory-store.ts +31 -62
  201. package/src/resources/extensions/gsd/metrics.ts +26 -0
  202. package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
  203. package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
  204. package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
  205. package/src/resources/extensions/gsd/preferences-models.ts +20 -3
  206. package/src/resources/extensions/gsd/preferences-types.ts +32 -0
  207. package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
  208. package/src/resources/extensions/gsd/preferences.ts +28 -0
  209. package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
  210. package/src/resources/extensions/gsd/session-lock.ts +14 -2
  211. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
  212. package/src/resources/extensions/gsd/state.ts +9 -2
  213. package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
  214. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
  215. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
  216. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
  217. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
  218. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  219. package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
  220. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  221. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  222. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  223. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
  224. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  225. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  226. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
  227. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
  228. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  229. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  230. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
  231. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
  232. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
  233. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
  234. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  235. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
  236. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
  237. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  238. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
  239. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  240. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
  241. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
  242. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
  243. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
  244. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
  245. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
  246. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  247. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
  248. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  249. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
  250. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
  251. package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
  252. package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
  253. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
  254. package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
  255. package/src/resources/extensions/gsd/types.ts +1 -1
  256. package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
  257. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  258. package/src/resources/extensions/gsd/uok/audit.ts +51 -0
  259. package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
  260. package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
  261. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  262. package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
  263. package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
  264. package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
  265. package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
  266. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  267. package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
  268. package/src/resources/extensions/gsd/workflow-logger.ts +25 -0
  269. package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
  270. package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
  271. package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
  272. package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
  273. package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
  274. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → bc2gRVFTgD7j--BsJE7vP}/_buildManifest.js +0 -0
  275. /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → bc2gRVFTgD7j--BsJE7vP}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- import { _getAdapter, transaction, } from "./gsd-db.js";
1
+ import { _getAdapter, readTransaction, restoreManifest, } from "./gsd-db.js";
2
2
  import { atomicWriteSync } from "./atomic-write.js";
3
3
  import { readFileSync, existsSync, mkdirSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -41,8 +41,7 @@ export function snapshotState() {
41
41
  const db = requireDb();
42
42
  // Wrap all reads in a deferred transaction so the snapshot is consistent
43
43
  // (all SELECTs see the same DB state even if a concurrent write lands between them).
44
- db.exec("BEGIN DEFERRED");
45
- try {
44
+ return readTransaction(() => {
46
45
  const rawMilestones = db.prepare("SELECT * FROM milestones ORDER BY id").all();
47
46
  const milestones = rawMilestones.map((r) => ({
48
47
  id: r["id"],
@@ -146,74 +145,14 @@ export function snapshotState() {
146
145
  decisions,
147
146
  verification_evidence,
148
147
  };
149
- db.exec("COMMIT");
150
148
  return result;
151
- }
152
- catch (err) {
153
- try {
154
- db.exec("ROLLBACK");
155
- }
156
- catch { /* ignore rollback failure */ }
157
- throw err;
158
- }
159
- }
160
- // ─── restore ─────────────────────────────────────────────────────────────
161
- /**
162
- * Atomically replace all workflow state from a manifest.
163
- * Runs inside a transaction — if any insert fails, no tables are modified.
164
- * Only touches engine tables + decisions. Does NOT modify artifacts or memories.
165
- */
166
- function restore(manifest) {
167
- const db = requireDb();
168
- transaction(() => {
169
- // Clear engine tables (order matters for foreign-key-like consistency)
170
- db.exec("DELETE FROM verification_evidence");
171
- db.exec("DELETE FROM tasks");
172
- db.exec("DELETE FROM slices");
173
- db.exec("DELETE FROM milestones");
174
- db.exec("DELETE FROM decisions WHERE 1=1");
175
- // Restore milestones
176
- const msStmt = db.prepare(`INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
177
- vision, success_criteria, key_risks, proof_strategy,
178
- verification_contract, verification_integration, verification_operational, verification_uat,
179
- definition_of_done, requirement_coverage, boundary_map_markdown)
180
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
181
- for (const m of manifest.milestones) {
182
- msStmt.run(m.id, m.title, m.status, JSON.stringify(m.depends_on), m.created_at, m.completed_at, m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks), JSON.stringify(m.proof_strategy), m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat, JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown);
183
- }
184
- // Restore slices
185
- const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
186
- created_at, completed_at, full_summary_md, full_uat_md,
187
- goal, success_criteria, proof_level, integration_closure, observability_impact,
188
- sequence, replan_triggered_at)
189
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
190
- for (const s of manifest.slices) {
191
- 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);
192
- }
193
- // Restore tasks
194
- const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
195
- one_liner, narrative, verification_result, duration, completed_at,
196
- blocker_discovered, deviations, known_issues, key_files, key_decisions,
197
- full_summary_md, description, estimate, files, verify,
198
- inputs, expected_output, observability_impact, sequence)
199
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
200
- for (const t of manifest.tasks) {
201
- 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);
202
- }
203
- // Restore decisions
204
- const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
205
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
206
- for (const d of manifest.decisions) {
207
- dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.superseded_by);
208
- }
209
- // Restore verification evidence
210
- const evStmt = db.prepare(`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
211
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
212
- for (const e of manifest.verification_evidence) {
213
- evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
214
- }
215
149
  });
216
150
  }
151
+ // ─── restore ─────────────────────────────────────────────────────────────
152
+ //
153
+ // The actual restore() implementation lives in gsd-db.ts (single-writer
154
+ // invariant). This module only orchestrates reading the manifest file
155
+ // and handing it to the writer.
217
156
  // ─── writeManifest ───────────────────────────────────────────────────────
218
157
  /**
219
158
  * Write current DB state to .gsd/state-manifest.json via atomicWriteSync.
@@ -258,6 +197,6 @@ export function bootstrapFromManifest(basePath) {
258
197
  if (!manifest) {
259
198
  return false;
260
199
  }
261
- restore(manifest);
200
+ restoreManifest(manifest);
262
201
  return true;
263
202
  }
@@ -4,7 +4,7 @@
4
4
  // Populates data into the already-existing v10 schema tables.
5
5
  import { existsSync, readdirSync, readFileSync } from "node:fs";
6
6
  import { join } from "node:path";
7
- import { _getAdapter, transaction } from "./gsd-db.js";
7
+ import { _getAdapter, bulkInsertLegacyHierarchy } from "./gsd-db.js";
8
8
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
9
9
  import { logWarning } from "./workflow-logger.js";
10
10
  // ─── needsAutoMigration ───────────────────────────────────────────────────
@@ -174,27 +174,26 @@ export function migrateFromMarkdown(basePath) {
174
174
  process.stderr.write("workflow-migration: no milestones collected, nothing to insert\n");
175
175
  return;
176
176
  }
177
- const placeholders = migratedMilestoneIds.map(() => "?").join(",");
178
- transaction(() => {
179
- // Clear existing data to handle stale DB shape (DELETE ... IN (...))
180
- db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...migratedMilestoneIds);
181
- db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...migratedMilestoneIds);
182
- db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...migratedMilestoneIds);
183
- // Insert milestones
184
- const insertMilestone = db.prepare("INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)");
185
- for (const m of milestoneInserts) {
186
- insertMilestone.run(m.id, m.title, m.status, now);
187
- }
188
- // Insert slices (using v10 column names: depends, sequence)
189
- const insertSlice = db.prepare("INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
190
- for (const s of sliceInserts) {
191
- insertSlice.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, now);
192
- }
193
- // Insert tasks (using v10 column names: sequence, blocker_discovered, full_summary_md)
194
- const insertTask = db.prepare("INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
195
- for (const t of taskInserts) {
196
- insertTask.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
197
- }
177
+ bulkInsertLegacyHierarchy({
178
+ milestones: milestoneInserts,
179
+ slices: sliceInserts.map(s => ({
180
+ id: s.id,
181
+ milestoneId: s.milestoneId,
182
+ title: s.title,
183
+ status: s.status,
184
+ risk: s.risk,
185
+ sequence: s.sequence,
186
+ })),
187
+ tasks: taskInserts.map(t => ({
188
+ id: t.id,
189
+ sliceId: t.sliceId,
190
+ milestoneId: t.milestoneId,
191
+ title: t.title,
192
+ status: t.status,
193
+ sequence: t.sequence,
194
+ })),
195
+ clearMilestoneIds: migratedMilestoneIds,
196
+ createdAt: now,
198
197
  });
199
198
  }
200
199
  // ─── validateMigration ────────────────────────────────────────────────────
@@ -303,7 +303,10 @@ export async function renderStateProjection(basePath) {
303
303
  try {
304
304
  adapter.prepare("SELECT 1").get();
305
305
  }
306
- catch {
306
+ catch (err) {
307
+ logWarning("projection", "renderStateProjection: DB handle probe failed, skipping render", {
308
+ error: err.message,
309
+ });
307
310
  return;
308
311
  }
309
312
  const state = await deriveState(basePath);
@@ -2,7 +2,7 @@ import { join } from "node:path";
2
2
  import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
3
3
  import { logWarning, logError } from "./workflow-logger.js";
4
4
  import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
5
- import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, _getAdapter, getMilestoneSlices, insertVerificationEvidence, upsertDecision, openDatabase, setTaskBlockerDiscovered, } from "./gsd-db.js";
5
+ import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, getMilestoneSlices, insertVerificationEvidence, upsertDecision, openDatabase, setTaskBlockerDiscovered, insertOrIgnoreSlice, insertOrIgnoreTask, } from "./gsd-db.js";
6
6
  import { isClosedStatus } from "./status-guards.js";
7
7
  import { invalidateStateCache } from "./state.js";
8
8
  import { clearPathCache } from "./paths.js";
@@ -132,11 +132,12 @@ function replayEvents(events) {
132
132
  const milestoneId = p["milestoneId"];
133
133
  const sliceId = p["sliceId"];
134
134
  if (milestoneId && sliceId) {
135
- const adapter = _getAdapter();
136
- if (adapter) {
137
- adapter.prepare(`INSERT OR IGNORE INTO slices (milestone_id, id, title, status, created_at)
138
- VALUES (:mid, :sid, :title, 'pending', :ts)`).run({ ":mid": milestoneId, ":sid": sliceId, ":title": p["title"] ?? sliceId, ":ts": event.ts });
139
- }
135
+ insertOrIgnoreSlice({
136
+ milestoneId,
137
+ sliceId,
138
+ title: p["title"] ?? sliceId,
139
+ createdAt: event.ts,
140
+ });
140
141
  }
141
142
  break;
142
143
  }
@@ -148,11 +149,13 @@ function replayEvents(events) {
148
149
  const sliceId = p["sliceId"];
149
150
  const taskId = p["taskId"];
150
151
  if (milestoneId && sliceId && taskId) {
151
- const adapter = _getAdapter();
152
- if (adapter) {
153
- adapter.prepare(`INSERT OR IGNORE INTO tasks (milestone_id, slice_id, id, title, status, created_at)
154
- VALUES (:mid, :sid, :tid, :title, 'pending', :ts)`).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId, ":title": p["title"] ?? taskId, ":ts": event.ts });
155
- }
152
+ insertOrIgnoreTask({
153
+ milestoneId,
154
+ sliceId,
155
+ taskId,
156
+ title: p["title"] ?? taskId,
157
+ createdAt: event.ts,
158
+ });
156
159
  }
157
160
  break;
158
161
  }
@@ -9,8 +9,10 @@
9
9
  * available, testing all patterns in a single DFA pass. Falls back to
10
10
  * per-rule JS RegExp iteration when the native module is not loaded.
11
11
  */
12
- import picomatch from "picomatch";
12
+ import { createRequire } from "node:module";
13
13
  import { debugTime, debugCount, debugPeak } from "../gsd/debug-logger.js";
14
+ const _require = createRequire(import.meta.url);
15
+ const picomatch = _require("picomatch");
14
16
  // ── Native TTSR engine (optional) ─────────────────────────────────────
15
17
  let nativeTtsr = null;
16
18
  try {