gsd-pi 2.45.0 → 2.46.0-dev.cc9d310

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 (347) hide show
  1. package/dist/help-text.js +1 -1
  2. package/dist/loader.js +34 -0
  3. package/dist/resources/extensions/gsd/auto/phases.js +27 -42
  4. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  5. package/dist/resources/extensions/gsd/auto/session.js +0 -11
  6. package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
  7. package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
  8. package/dist/resources/extensions/gsd/auto-start.js +2 -3
  9. package/dist/resources/extensions/gsd/auto-worktree.js +5 -4
  10. package/dist/resources/extensions/gsd/auto.js +12 -57
  11. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +15 -12
  12. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
  13. package/dist/resources/extensions/gsd/commands/context.js +0 -4
  14. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
  15. package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
  16. package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
  17. package/dist/resources/extensions/gsd/db-writer.js +9 -9
  18. package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
  19. package/dist/resources/extensions/gsd/doctor.js +5 -3
  20. package/dist/resources/extensions/gsd/gsd-db.js +16 -3
  21. package/dist/resources/extensions/gsd/guided-flow.js +1 -2
  22. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  23. package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
  24. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  25. package/dist/resources/extensions/gsd/preferences.js +8 -4
  26. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
  27. package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  28. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  29. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
  30. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  31. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  32. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  33. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  34. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  35. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  36. package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
  37. package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
  38. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  39. package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
  40. package/dist/resources/extensions/gsd/prompts/rethink.md +7 -2
  41. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  42. package/dist/resources/extensions/gsd/session-lock.js +1 -3
  43. package/dist/resources/extensions/gsd/state.js +7 -0
  44. package/dist/resources/extensions/gsd/sync-lock.js +89 -0
  45. package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
  46. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
  47. package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
  48. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
  49. package/dist/resources/extensions/gsd/tools/plan-slice.js +30 -1
  50. package/dist/resources/extensions/gsd/tools/plan-task.js +27 -1
  51. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
  52. package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
  53. package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
  54. package/dist/resources/extensions/gsd/tools/replan-slice.js +32 -2
  55. package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
  56. package/dist/resources/extensions/gsd/workflow-events.js +102 -0
  57. package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
  58. package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
  59. package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
  60. package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
  61. package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
  62. package/dist/resources/extensions/gsd/worktree-manager.js +4 -3
  63. package/dist/resources/extensions/gsd/worktree-resolver.js +37 -0
  64. package/dist/resources/extensions/gsd/write-intercept.js +84 -0
  65. package/dist/resources/extensions/voice/index.js +11 -16
  66. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  67. package/dist/web/standalone/.next/BUILD_ID +1 -1
  68. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  69. package/dist/web/standalone/.next/build-manifest.json +3 -3
  70. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  71. package/dist/web/standalone/.next/required-server-files.json +3 -3
  72. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  73. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  75. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  83. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  87. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  89. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  99. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  137. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  143. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  157. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  161. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/index.html +1 -1
  173. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  174. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  175. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  176. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  178. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/page.js +2 -2
  180. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  182. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  183. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  184. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/middleware.js +2 -2
  186. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  188. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  189. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  190. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  191. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  192. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  193. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  194. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  195. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  196. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  197. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  198. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  199. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  200. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  201. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  202. package/dist/web/standalone/server.js +1 -1
  203. package/package.json +2 -1
  204. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  206. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  208. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  210. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  211. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  213. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  215. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  216. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  217. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  218. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  219. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +2 -1
  221. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -2
  223. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  225. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  226. package/packages/pi-coding-agent/package.json +1 -1
  227. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  228. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  229. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  230. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  231. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  232. package/packages/pi-coding-agent/src/core/model-registry.ts +30 -3
  233. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  234. package/pkg/package.json +1 -1
  235. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
  236. package/src/resources/extensions/gsd/auto/phases.ts +24 -44
  237. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  238. package/src/resources/extensions/gsd/auto/session.ts +0 -18
  239. package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
  240. package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
  241. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
  242. package/src/resources/extensions/gsd/auto-start.ts +1 -3
  243. package/src/resources/extensions/gsd/auto-worktree.ts +8 -5
  244. package/src/resources/extensions/gsd/auto.ts +7 -83
  245. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -12
  246. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  247. package/src/resources/extensions/gsd/commands/context.ts +0 -5
  248. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
  249. package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
  250. package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
  251. package/src/resources/extensions/gsd/db-writer.ts +9 -17
  252. package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
  253. package/src/resources/extensions/gsd/doctor-types.ts +7 -1
  254. package/src/resources/extensions/gsd/doctor.ts +6 -3
  255. package/src/resources/extensions/gsd/gsd-db.ts +16 -3
  256. package/src/resources/extensions/gsd/guided-flow.ts +1 -2
  257. package/src/resources/extensions/gsd/journal.ts +6 -1
  258. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  259. package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
  260. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  261. package/src/resources/extensions/gsd/preferences.ts +7 -3
  262. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
  263. package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
  264. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  265. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
  266. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  267. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  268. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  269. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
  270. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  271. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  272. package/src/resources/extensions/gsd/prompts/queue.md +2 -2
  273. package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
  274. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  275. package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
  276. package/src/resources/extensions/gsd/prompts/rethink.md +7 -2
  277. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  278. package/src/resources/extensions/gsd/session-lock.ts +0 -4
  279. package/src/resources/extensions/gsd/state.ts +8 -0
  280. package/src/resources/extensions/gsd/sync-lock.ts +94 -0
  281. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +5 -13
  282. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
  283. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +96 -0
  284. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +264 -228
  285. package/src/resources/extensions/gsd/tests/complete-task.test.ts +317 -250
  286. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +2 -8
  287. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
  288. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  289. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +1 -1
  290. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +15 -24
  291. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  292. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  293. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  294. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -1
  295. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
  296. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +42 -3
  297. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
  298. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -7
  299. package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
  300. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
  301. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -2
  302. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  303. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  304. package/src/resources/extensions/gsd/tests/preferences.test.ts +7 -9
  305. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
  306. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +15 -14
  307. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  308. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  309. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +1 -4
  310. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
  311. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
  312. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
  313. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  314. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  315. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
  316. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
  317. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  318. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  319. package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
  320. package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
  321. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
  322. package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
  323. package/src/resources/extensions/gsd/tools/plan-slice.ts +38 -0
  324. package/src/resources/extensions/gsd/tools/plan-task.ts +35 -1
  325. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
  326. package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
  327. package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
  328. package/src/resources/extensions/gsd/tools/replan-slice.ts +38 -1
  329. package/src/resources/extensions/gsd/types.ts +8 -0
  330. package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
  331. package/src/resources/extensions/gsd/workflow-events.ts +154 -0
  332. package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
  333. package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
  334. package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
  335. package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
  336. package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
  337. package/src/resources/extensions/gsd/worktree-manager.ts +4 -9
  338. package/src/resources/extensions/gsd/worktree-resolver.ts +37 -0
  339. package/src/resources/extensions/gsd/write-intercept.ts +90 -0
  340. package/src/resources/extensions/voice/index.ts +11 -21
  341. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  342. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  343. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
  344. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  345. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  346. /package/dist/web/standalone/.next/static/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_buildManifest.js +0 -0
  347. /package/dist/web/standalone/.next/static/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_ssgManifest.js +0 -0
@@ -0,0 +1,193 @@
1
+ // GSD Extension — Workflow Logger
2
+ // Centralized warning/error accumulator for the workflow engine pipeline.
3
+ // Captures structured entries that the auto-loop can drain after each unit
4
+ // to surface root causes for stuck loops, silent degradation, and blocked writes.
5
+ // All entries are also persisted to .gsd/audit-log.jsonl for post-mortem analysis.
6
+ //
7
+ // Stderr policy: every logWarning/logError call writes immediately to stderr
8
+ // for terminal visibility. This is intentional — unlike debug-logger (which is
9
+ // opt-in and zero-overhead when disabled), workflow-logger covers operational
10
+ // warnings/errors that should always be visible. There is no disable flag.
11
+ //
12
+ // Singleton safety: _buffer is module-level and shared across all calls within
13
+ // a process. The auto-loop must call _resetLogs() (or drainAndSummarize()) at
14
+ // the start of each unit to prevent log bleed between units running in the same
15
+ // Node process.
16
+ import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ // ─── Buffer & Persistent Audit ──────────────────────────────────────────
19
+ const MAX_BUFFER = 100;
20
+ let _buffer = [];
21
+ let _auditBasePath = null;
22
+ /**
23
+ * Set the base path for persistent audit log writes.
24
+ * Should be called once at engine init with the project root.
25
+ * Until set, log entries are buffered in-memory only.
26
+ */
27
+ export function setLogBasePath(basePath) {
28
+ _auditBasePath = basePath;
29
+ }
30
+ // ─── Public API ─────────────────────────────────────────────────────────
31
+ /**
32
+ * Record a warning. Also writes to stderr for terminal visibility.
33
+ */
34
+ export function logWarning(component, message, context) {
35
+ _push("warn", component, message, context);
36
+ }
37
+ /**
38
+ * Record an error. Also writes to stderr for terminal visibility.
39
+ */
40
+ export function logError(component, message, context) {
41
+ _push("error", component, message, context);
42
+ }
43
+ /**
44
+ * Drain all accumulated entries and clear the buffer.
45
+ * Returns entries oldest-first.
46
+ *
47
+ * WARNING: Call summarizeLogs() or drainAndSummarize() BEFORE calling this
48
+ * if you need a summary — drainLogs() clears the buffer immediately.
49
+ */
50
+ export function drainLogs() {
51
+ const entries = _buffer;
52
+ _buffer = [];
53
+ return entries;
54
+ }
55
+ /**
56
+ * Atomically summarize then drain — the safe way to consume logs.
57
+ * Use this in the auto-loop instead of calling summarizeLogs() + drainLogs()
58
+ * separately to avoid the ordering footgun.
59
+ */
60
+ export function drainAndSummarize() {
61
+ const summary = summarizeLogs();
62
+ const logs = drainLogs();
63
+ return { logs, summary };
64
+ }
65
+ /**
66
+ * Peek at current entries without clearing.
67
+ */
68
+ export function peekLogs() {
69
+ return _buffer;
70
+ }
71
+ /**
72
+ * Returns true if the buffer contains any error-severity entries.
73
+ */
74
+ export function hasErrors() {
75
+ return _buffer.some((e) => e.severity === "error");
76
+ }
77
+ /**
78
+ * Returns true if the buffer contains any warn-severity entries.
79
+ * Use hasAnyIssues() if you want to check for either severity.
80
+ */
81
+ export function hasWarnings() {
82
+ return _buffer.some((e) => e.severity === "warn");
83
+ }
84
+ /**
85
+ * Returns true if the buffer contains any entries (warn or error).
86
+ */
87
+ export function hasAnyIssues() {
88
+ return _buffer.length > 0;
89
+ }
90
+ /**
91
+ * Get a one-line summary of accumulated issues for stuck detection messages.
92
+ * Returns null if no entries.
93
+ *
94
+ * Must be called BEFORE drainLogs() — use drainAndSummarize() for safe ordering.
95
+ */
96
+ export function summarizeLogs() {
97
+ if (_buffer.length === 0)
98
+ return null;
99
+ const errors = _buffer.filter((e) => e.severity === "error");
100
+ const warns = _buffer.filter((e) => e.severity === "warn");
101
+ const parts = [];
102
+ if (errors.length > 0) {
103
+ parts.push(`${errors.length} error(s): ${errors.map((e) => e.message).join("; ")}`);
104
+ }
105
+ if (warns.length > 0) {
106
+ parts.push(`${warns.length} warning(s): ${warns.map((e) => e.message).join("; ")}`);
107
+ }
108
+ return parts.join(" | ");
109
+ }
110
+ /**
111
+ * Format entries for display (used by auto-loop post-unit notification).
112
+ * Note: context fields are not included in the formatted output.
113
+ */
114
+ export function formatForNotification(entries) {
115
+ if (entries.length === 0)
116
+ return "";
117
+ if (entries.length === 1) {
118
+ const e = entries[0];
119
+ return `[${e.component}] ${e.message}`;
120
+ }
121
+ return entries
122
+ .map((e) => `[${e.component}] ${e.message}`)
123
+ .join("\n");
124
+ }
125
+ /**
126
+ * Read all entries from the persistent audit log.
127
+ * Returns empty array if no basePath is set or the file doesn't exist.
128
+ */
129
+ export function readAuditLog(basePath) {
130
+ const bp = basePath ?? _auditBasePath;
131
+ if (!bp)
132
+ return [];
133
+ const auditPath = join(bp, ".gsd", "audit-log.jsonl");
134
+ if (!existsSync(auditPath))
135
+ return [];
136
+ try {
137
+ const content = readFileSync(auditPath, "utf-8");
138
+ return content
139
+ .split("\n")
140
+ .filter((l) => l.length > 0)
141
+ .map((l) => {
142
+ try {
143
+ return JSON.parse(l);
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ })
149
+ .filter((e) => e !== null);
150
+ }
151
+ catch {
152
+ return [];
153
+ }
154
+ }
155
+ /**
156
+ * Reset buffer. Call at the start of each auto-loop unit to prevent log bleed
157
+ * between units running in the same process. Also used in tests via _resetLogs().
158
+ */
159
+ export function _resetLogs() {
160
+ _buffer = [];
161
+ _auditBasePath = null;
162
+ }
163
+ // ─── Internal ───────────────────────────────────────────────────────────
164
+ function _push(severity, component, message, context) {
165
+ const entry = {
166
+ ts: new Date().toISOString(),
167
+ severity,
168
+ component,
169
+ message,
170
+ ...(context ? { context } : {}),
171
+ };
172
+ // Always forward to stderr so terminal watchers see it (see module header for policy)
173
+ const prefix = severity === "error" ? "ERROR" : "WARN";
174
+ const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
175
+ process.stderr.write(`[gsd:${component}] ${prefix}: ${message}${ctxStr}\n`);
176
+ // Buffer for auto-loop to drain
177
+ _buffer.push(entry);
178
+ if (_buffer.length > MAX_BUFFER) {
179
+ _buffer.shift();
180
+ }
181
+ // Persist to .gsd/audit-log.jsonl so entries survive context resets
182
+ if (_auditBasePath) {
183
+ try {
184
+ const auditDir = join(_auditBasePath, ".gsd");
185
+ mkdirSync(auditDir, { recursive: true });
186
+ appendFileSync(join(auditDir, "audit-log.jsonl"), JSON.stringify(entry) + "\n", "utf-8");
187
+ }
188
+ catch (auditErr) {
189
+ // Best-effort — never let audit write failures bubble up
190
+ process.stderr.write(`[gsd:audit] failed to persist log entry: ${auditErr.message}\n`);
191
+ }
192
+ }
193
+ }
@@ -0,0 +1,244 @@
1
+ import { _getAdapter, transaction, } from "./gsd-db.js";
2
+ import { atomicWriteSync } from "./atomic-write.js";
3
+ import { readFileSync, existsSync, mkdirSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ // ─── helpers ─────────────────────────────────────────────────────────────
6
+ function requireDb() {
7
+ const db = _getAdapter();
8
+ if (!db)
9
+ throw new Error("workflow-manifest: No database open");
10
+ return db;
11
+ }
12
+ // ─── snapshotState ───────────────────────────────────────────────────────
13
+ /**
14
+ * Capture complete DB state as a StateManifest.
15
+ * Reads all rows from milestones, slices, tasks, decisions, verification_evidence.
16
+ *
17
+ * Note: rows returned from raw queries are plain objects with TEXT columns for
18
+ * JSON arrays. We parse them into typed Row objects using the same logic as
19
+ * gsd-db helper functions.
20
+ */
21
+ export function snapshotState() {
22
+ const db = requireDb();
23
+ // Wrap all reads in a deferred transaction so the snapshot is consistent
24
+ // (all SELECTs see the same DB state even if a concurrent write lands between them).
25
+ db.exec("BEGIN DEFERRED");
26
+ try {
27
+ const rawMilestones = db.prepare("SELECT * FROM milestones ORDER BY id").all();
28
+ const milestones = rawMilestones.map((r) => ({
29
+ id: r["id"],
30
+ title: r["title"],
31
+ status: r["status"],
32
+ depends_on: JSON.parse(r["depends_on"] || "[]"),
33
+ created_at: r["created_at"],
34
+ completed_at: r["completed_at"] ?? null,
35
+ vision: r["vision"] ?? "",
36
+ success_criteria: JSON.parse(r["success_criteria"] || "[]"),
37
+ key_risks: JSON.parse(r["key_risks"] || "[]"),
38
+ proof_strategy: JSON.parse(r["proof_strategy"] || "[]"),
39
+ verification_contract: r["verification_contract"] ?? "",
40
+ verification_integration: r["verification_integration"] ?? "",
41
+ verification_operational: r["verification_operational"] ?? "",
42
+ verification_uat: r["verification_uat"] ?? "",
43
+ definition_of_done: JSON.parse(r["definition_of_done"] || "[]"),
44
+ requirement_coverage: r["requirement_coverage"] ?? "",
45
+ boundary_map_markdown: r["boundary_map_markdown"] ?? "",
46
+ }));
47
+ const rawSlices = db.prepare("SELECT * FROM slices ORDER BY milestone_id, sequence, id").all();
48
+ const slices = rawSlices.map((r) => ({
49
+ milestone_id: r["milestone_id"],
50
+ id: r["id"],
51
+ title: r["title"],
52
+ status: r["status"],
53
+ risk: r["risk"],
54
+ depends: JSON.parse(r["depends"] || "[]"),
55
+ demo: r["demo"] ?? "",
56
+ created_at: r["created_at"],
57
+ completed_at: r["completed_at"] ?? null,
58
+ full_summary_md: r["full_summary_md"] ?? "",
59
+ full_uat_md: r["full_uat_md"] ?? "",
60
+ goal: r["goal"] ?? "",
61
+ success_criteria: r["success_criteria"] ?? "",
62
+ proof_level: r["proof_level"] ?? "",
63
+ integration_closure: r["integration_closure"] ?? "",
64
+ observability_impact: r["observability_impact"] ?? "",
65
+ sequence: r["sequence"] ?? 0,
66
+ replan_triggered_at: r["replan_triggered_at"] ?? null,
67
+ }));
68
+ const rawTasks = db.prepare("SELECT * FROM tasks ORDER BY milestone_id, slice_id, sequence, id").all();
69
+ const tasks = rawTasks.map((r) => ({
70
+ milestone_id: r["milestone_id"],
71
+ slice_id: r["slice_id"],
72
+ id: r["id"],
73
+ title: r["title"],
74
+ status: r["status"],
75
+ one_liner: r["one_liner"] ?? "",
76
+ narrative: r["narrative"] ?? "",
77
+ verification_result: r["verification_result"] ?? "",
78
+ duration: r["duration"] ?? "",
79
+ completed_at: r["completed_at"] ?? null,
80
+ blocker_discovered: r["blocker_discovered"] === 1,
81
+ deviations: r["deviations"] ?? "",
82
+ known_issues: r["known_issues"] ?? "",
83
+ key_files: JSON.parse(r["key_files"] || "[]"),
84
+ key_decisions: JSON.parse(r["key_decisions"] || "[]"),
85
+ full_summary_md: r["full_summary_md"] ?? "",
86
+ description: r["description"] ?? "",
87
+ estimate: r["estimate"] ?? "",
88
+ files: JSON.parse(r["files"] || "[]"),
89
+ verify: r["verify"] ?? "",
90
+ inputs: JSON.parse(r["inputs"] || "[]"),
91
+ expected_output: JSON.parse(r["expected_output"] || "[]"),
92
+ observability_impact: r["observability_impact"] ?? "",
93
+ full_plan_md: r["full_plan_md"] ?? "",
94
+ sequence: r["sequence"] ?? 0,
95
+ }));
96
+ const rawDecisions = db.prepare("SELECT * FROM decisions ORDER BY seq").all();
97
+ const decisions = rawDecisions.map((r) => ({
98
+ seq: r["seq"],
99
+ id: r["id"],
100
+ when_context: r["when_context"] ?? "",
101
+ scope: r["scope"] ?? "",
102
+ decision: r["decision"] ?? "",
103
+ choice: r["choice"] ?? "",
104
+ rationale: r["rationale"] ?? "",
105
+ revisable: r["revisable"] ?? "",
106
+ made_by: r["made_by"] ?? "agent",
107
+ superseded_by: r["superseded_by"] ?? null,
108
+ }));
109
+ const rawEvidence = db.prepare("SELECT * FROM verification_evidence ORDER BY id").all();
110
+ const verification_evidence = rawEvidence.map((r) => ({
111
+ id: r["id"],
112
+ task_id: r["task_id"],
113
+ slice_id: r["slice_id"],
114
+ milestone_id: r["milestone_id"],
115
+ command: r["command"],
116
+ exit_code: r["exit_code"] ?? null,
117
+ verdict: r["verdict"] ?? "",
118
+ duration_ms: r["duration_ms"] ?? null,
119
+ created_at: r["created_at"],
120
+ }));
121
+ const result = {
122
+ version: 1,
123
+ exported_at: new Date().toISOString(),
124
+ milestones,
125
+ slices,
126
+ tasks,
127
+ decisions,
128
+ verification_evidence,
129
+ };
130
+ db.exec("COMMIT");
131
+ return result;
132
+ }
133
+ catch (err) {
134
+ try {
135
+ db.exec("ROLLBACK");
136
+ }
137
+ catch { /* ignore rollback failure */ }
138
+ throw err;
139
+ }
140
+ }
141
+ // ─── restore ─────────────────────────────────────────────────────────────
142
+ /**
143
+ * Atomically replace all workflow state from a manifest.
144
+ * Runs inside a transaction — if any insert fails, no tables are modified.
145
+ * Only touches engine tables + decisions. Does NOT modify artifacts or memories.
146
+ */
147
+ function restore(manifest) {
148
+ const db = requireDb();
149
+ transaction(() => {
150
+ // Clear engine tables (order matters for foreign-key-like consistency)
151
+ db.exec("DELETE FROM verification_evidence");
152
+ db.exec("DELETE FROM tasks");
153
+ db.exec("DELETE FROM slices");
154
+ db.exec("DELETE FROM milestones");
155
+ db.exec("DELETE FROM decisions WHERE 1=1");
156
+ // Restore milestones
157
+ const msStmt = db.prepare(`INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
158
+ vision, success_criteria, key_risks, proof_strategy,
159
+ verification_contract, verification_integration, verification_operational, verification_uat,
160
+ definition_of_done, requirement_coverage, boundary_map_markdown)
161
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
162
+ for (const m of manifest.milestones) {
163
+ 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);
164
+ }
165
+ // Restore slices
166
+ const slStmt = db.prepare(`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
167
+ created_at, completed_at, full_summary_md, full_uat_md,
168
+ goal, success_criteria, proof_level, integration_closure, observability_impact,
169
+ sequence, replan_triggered_at)
170
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
171
+ for (const s of manifest.slices) {
172
+ 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);
173
+ }
174
+ // Restore tasks
175
+ const tkStmt = db.prepare(`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
176
+ one_liner, narrative, verification_result, duration, completed_at,
177
+ blocker_discovered, deviations, known_issues, key_files, key_decisions,
178
+ full_summary_md, description, estimate, files, verify,
179
+ inputs, expected_output, observability_impact, sequence)
180
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
181
+ for (const t of manifest.tasks) {
182
+ 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);
183
+ }
184
+ // Restore decisions
185
+ const dcStmt = db.prepare(`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, superseded_by)
186
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
187
+ for (const d of manifest.decisions) {
188
+ 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);
189
+ }
190
+ // Restore verification evidence
191
+ const evStmt = db.prepare(`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
192
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
193
+ for (const e of manifest.verification_evidence) {
194
+ evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
195
+ }
196
+ });
197
+ }
198
+ // ─── writeManifest ───────────────────────────────────────────────────────
199
+ /**
200
+ * Write current DB state to .gsd/state-manifest.json via atomicWriteSync.
201
+ * Uses JSON.stringify with 2-space indent for git three-way merge friendliness.
202
+ */
203
+ export function writeManifest(basePath) {
204
+ const manifest = snapshotState();
205
+ const json = JSON.stringify(manifest, null, 2);
206
+ const dir = join(basePath, ".gsd");
207
+ mkdirSync(dir, { recursive: true });
208
+ atomicWriteSync(join(dir, "state-manifest.json"), json);
209
+ }
210
+ // ─── readManifest ────────────────────────────────────────────────────────
211
+ /**
212
+ * Read state-manifest.json and return parsed manifest, or null if not found.
213
+ */
214
+ export function readManifest(basePath) {
215
+ const manifestPath = join(basePath, ".gsd", "state-manifest.json");
216
+ if (!existsSync(manifestPath)) {
217
+ return null;
218
+ }
219
+ const raw = readFileSync(manifestPath, "utf-8");
220
+ const parsed = JSON.parse(raw);
221
+ if (parsed.version !== 1) {
222
+ throw new Error(`Unsupported manifest version: ${parsed.version}`);
223
+ }
224
+ // Validate required fields to avoid cryptic errors during restore
225
+ if (!Array.isArray(parsed.milestones) || !Array.isArray(parsed.slices) ||
226
+ !Array.isArray(parsed.tasks) || !Array.isArray(parsed.decisions) ||
227
+ !Array.isArray(parsed.verification_evidence)) {
228
+ throw new Error("Malformed manifest: missing or invalid required arrays");
229
+ }
230
+ return parsed;
231
+ }
232
+ // ─── bootstrapFromManifest ──────────────────────────────────────────────
233
+ /**
234
+ * Read state-manifest.json and restore DB state from it.
235
+ * Returns true if bootstrap succeeded, false if manifest file doesn't exist.
236
+ */
237
+ export function bootstrapFromManifest(basePath) {
238
+ const manifest = readManifest(basePath);
239
+ if (!manifest) {
240
+ return false;
241
+ }
242
+ restore(manifest);
243
+ return true;
244
+ }