@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.738160b9

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 (488) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
  10. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  11. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
  13. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  14. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  15. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  16. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +34 -20
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  19. package/dist/resources/extensions/gsd/auto-prompts.js +29 -14
  20. package/dist/resources/extensions/gsd/auto-recovery.js +9 -510
  21. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  22. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  23. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  24. package/dist/resources/extensions/gsd/auto.js +19 -10
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
  26. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  27. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
  28. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -21
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
  32. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  34. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  35. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  36. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +17 -11
  38. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  39. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  40. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
  41. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  42. package/dist/resources/extensions/gsd/db/queries.js +60 -0
  43. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  44. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  45. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  46. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  47. package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
  48. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  50. package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
  51. package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
  52. package/dist/resources/extensions/gsd/forensics.js +2 -32
  53. package/dist/resources/extensions/gsd/git-service.js +61 -4
  54. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  55. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  56. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  57. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  59. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  60. package/dist/resources/extensions/gsd/markdown-renderer.js +8 -9
  61. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  62. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  63. package/dist/resources/extensions/gsd/metrics.js +4 -4
  64. package/dist/resources/extensions/gsd/migrate-external.js +11 -2
  65. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  66. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  67. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  69. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  70. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  71. package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  72. package/dist/resources/extensions/gsd/quick.js +45 -2
  73. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  74. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  75. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  76. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  77. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  78. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  79. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  80. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  81. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  82. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  83. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +45 -2
  85. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  86. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  87. package/dist/resources/extensions/gsd/state.js +12 -611
  88. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  89. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
  91. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +28 -5
  94. package/dist/resources/extensions/gsd/undo.js +43 -6
  95. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  96. package/dist/resources/extensions/gsd/unit-registry.js +36 -6
  97. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
  98. package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
  99. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  101. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  102. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  103. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  104. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/index.html +1 -1
  130. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  132. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  133. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  138. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  139. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  142. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  143. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  146. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  147. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  148. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  149. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  150. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  151. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  152. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  153. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  154. package/package.json +1 -1
  155. package/packages/cloud-mcp-gateway/package.json +2 -2
  156. package/packages/contracts/dist/workflow.d.ts +1 -0
  157. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  158. package/packages/contracts/dist/workflow.js +2 -0
  159. package/packages/contracts/dist/workflow.js.map +1 -1
  160. package/packages/contracts/package.json +1 -1
  161. package/packages/daemon/package.json +4 -4
  162. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  163. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  164. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  165. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  166. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  167. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  168. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  169. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  170. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  171. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/index.js +2 -0
  173. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  174. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  175. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  176. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  177. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  178. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  179. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  180. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  181. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  182. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  183. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  184. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  185. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  186. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  187. package/packages/gsd-agent-core/package.json +5 -5
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  193. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  195. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  197. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  198. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  199. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  201. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  202. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  203. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  204. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  205. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  206. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  207. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  209. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  211. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  213. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  214. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  215. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  227. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  234. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  236. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  237. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
  239. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  242. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  243. package/packages/gsd-agent-modes/package.json +7 -7
  244. package/packages/mcp-server/README.md +1 -1
  245. package/packages/mcp-server/dist/server.d.ts +1 -1
  246. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  247. package/packages/mcp-server/dist/server.js +3 -3
  248. package/packages/mcp-server/dist/server.js.map +1 -1
  249. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  250. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  251. package/packages/mcp-server/dist/workflow-tools.js +35 -21
  252. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  253. package/packages/mcp-server/package.json +4 -4
  254. package/packages/native/package.json +1 -1
  255. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  256. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  257. package/packages/pi-agent-core/package.json +1 -1
  258. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  259. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/models.generated.js +38 -0
  261. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  262. package/packages/pi-ai/package.json +1 -1
  263. package/packages/pi-coding-agent/README.md +3 -2
  264. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  265. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  266. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  267. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  268. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  269. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  270. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  271. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  272. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  273. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  274. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  275. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  276. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  277. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  279. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  281. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  283. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  284. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  285. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  287. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  290. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  291. package/packages/pi-coding-agent/package.json +7 -7
  292. package/packages/pi-tui/package.json +2 -2
  293. package/packages/rpc-client/package.json +2 -2
  294. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  295. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  296. package/pkg/dist/theme/theme-schema.js +1 -1
  297. package/pkg/dist/theme/theme-schema.js.map +1 -1
  298. package/pkg/dist/theme/theme.d.ts.map +1 -1
  299. package/pkg/dist/theme/theme.js +11 -7
  300. package/pkg/dist/theme/theme.js.map +1 -1
  301. package/pkg/package.json +1 -1
  302. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  303. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
  304. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  305. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
  306. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  307. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  308. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  309. package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
  310. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  311. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  312. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  313. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  314. package/src/resources/extensions/gsd/auto-dispatch.ts +35 -24
  315. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  316. package/src/resources/extensions/gsd/auto-prompts.ts +41 -15
  317. package/src/resources/extensions/gsd/auto-recovery.ts +13 -511
  318. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  319. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  320. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  321. package/src/resources/extensions/gsd/auto.ts +23 -8
  322. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
  323. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  324. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
  325. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  326. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  327. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -21
  328. package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
  329. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
  330. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  331. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  332. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  333. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  334. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -10
  335. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  336. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  337. package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
  338. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  339. package/src/resources/extensions/gsd/db/queries.ts +79 -0
  340. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  341. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  342. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  343. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  344. package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
  345. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  346. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  347. package/src/resources/extensions/gsd/doctor-types.ts +3 -0
  348. package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
  349. package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
  350. package/src/resources/extensions/gsd/forensics.ts +2 -33
  351. package/src/resources/extensions/gsd/git-service.ts +69 -5
  352. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  353. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  354. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  355. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  356. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  357. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  358. package/src/resources/extensions/gsd/markdown-renderer.ts +8 -11
  359. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  360. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  361. package/src/resources/extensions/gsd/metrics.ts +4 -4
  362. package/src/resources/extensions/gsd/migrate-external.ts +8 -2
  363. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  364. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  365. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  366. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  367. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  368. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  369. package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
  370. package/src/resources/extensions/gsd/quick.ts +43 -2
  371. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  372. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  373. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  374. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  375. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  376. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  377. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  378. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  379. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  380. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  381. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  382. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +81 -7
  383. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  384. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  385. package/src/resources/extensions/gsd/state.ts +32 -732
  386. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  387. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  388. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  389. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  390. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  391. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
  392. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  393. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  394. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  395. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  396. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  397. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  398. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  400. package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
  401. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
  402. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  403. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  404. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  405. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  406. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  407. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  408. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  409. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
  410. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  411. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  412. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  413. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  414. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
  415. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  416. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  417. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  418. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  419. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  420. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  421. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  422. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  423. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  424. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +14 -0
  425. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  426. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  427. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  428. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  429. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  430. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  431. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  432. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
  433. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  434. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  435. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  436. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  439. package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
  440. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  441. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  442. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  443. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  444. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  445. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
  446. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  447. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
  449. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  450. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  451. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  452. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  453. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
  454. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
  455. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  456. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
  457. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
  458. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +38 -0
  459. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
  460. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  461. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
  462. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  463. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  464. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  465. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +6 -5
  466. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  467. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  468. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  469. package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
  470. package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
  471. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  472. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  473. package/src/resources/extensions/gsd/tools/plan-task.ts +30 -5
  474. package/src/resources/extensions/gsd/undo.ts +47 -6
  475. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  476. package/src/resources/extensions/gsd/unit-registry.ts +36 -6
  477. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
  478. package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
  479. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  480. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  481. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  482. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  483. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  484. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  485. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  486. package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
  487. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_buildManifest.js +0 -0
  488. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_ssgManifest.js +0 -0
@@ -24,8 +24,8 @@ import { logWarning } from "./workflow-logger.js";
24
24
  * - Idempotent (per-row): each migrated memory carries
25
25
  * `structured_fields.sourceKnowledgeId = "<P|L>NNN"`. Rows whose ID is
26
26
  * already present in the memory store are skipped.
27
- * - Best-effort: never throws. Logs and returns 0 on failure so a broken
28
- * backfill cannot block agent startup.
27
+ * - Best-effort: never throws. Failed memory inserts are logged and skipped;
28
+ * setup/read failures log and return 0 so backfill cannot block startup.
29
29
  * - Rules (K###) are intentionally skipped — they remain manually maintained
30
30
  * in `KNOWLEDGE.md` per ADR-013.
31
31
  *
@@ -56,15 +56,22 @@ export function backfillKnowledgeToMemories(basePath) {
56
56
  const matchPattern = `%"sourceKnowledgeId":"${synth.id}"%`;
57
57
  if (checkExisting.get({ ":pattern": matchPattern }))
58
58
  continue;
59
- const id = createMemory({
60
- category: synth.category,
61
- content: synth.content,
62
- scope: synth.scope,
63
- confidence: 0.85,
64
- structuredFields: synth.structuredFields,
65
- });
66
- if (id)
67
- written += 1;
59
+ try {
60
+ const id = createMemory({
61
+ category: synth.category,
62
+ content: synth.content,
63
+ scope: synth.scope,
64
+ confidence: 0.85,
65
+ structuredFields: synth.structuredFields,
66
+ });
67
+ if (id)
68
+ written += 1;
69
+ }
70
+ catch (rowErr) {
71
+ const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
72
+ logWarning("knowledge-backfill", `KNOWLEDGE.md -> memories backfill skipped ${synth.id}: ${message}`);
73
+ continue;
74
+ }
68
75
  }
69
76
  return written;
70
77
  }
@@ -40,8 +40,10 @@ export function dbPath(basePath) {
40
40
  * Used by the renderer to derive the phase number from the DB's milestone_id.
41
41
  */
42
42
  export function milestoneIdToPhaseNum(milestoneId) {
43
- // No $ anchor: accepts bare (M012) and team-suffixed (M012-abc123) IDs.
43
+ // No $ anchor: accepts bare (M012), team-suffixed (M012-abc123), and legacy numeric IDs.
44
44
  const m = milestoneId.match(/^M0*(\d+)/i);
45
+ if (!m && /^\d+$/.test(milestoneId))
46
+ return Number.parseInt(milestoneId, 10);
45
47
  return m ? Number.parseInt(m[1], 10) : 1;
46
48
  }
47
49
  /** Team-mode suffix from milestone ids like M001-abc123. */
@@ -12,7 +12,7 @@ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:
12
12
  import { logWarning } from "./workflow-logger.js";
13
13
  import { isClosedStatus } from "./status-guards.js";
14
14
  import { dirname, join, relative } from "node:path";
15
- import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, } from "./gsd-db.js";
15
+ import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
16
16
  import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
17
17
  import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
18
18
  import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
@@ -518,13 +518,8 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
518
518
  * @returns true if the roadmap was written, false on skip/error
519
519
  */
520
520
  export async function renderRoadmapCheckboxes(basePath, milestoneId) {
521
- const slices = getMilestoneSlices(milestoneId);
522
- if (slices.length === 0) {
523
- process.stderr.write(`markdown-renderer: no slices found for milestone ${milestoneId}\n`);
524
- return false;
525
- }
526
- await renderRoadmapFromDb(basePath, milestoneId);
527
- return true;
521
+ const rendered = await renderRoadmapFromDb(basePath, milestoneId);
522
+ return !("skipped" in rendered);
528
523
  }
529
524
  /**
530
525
  * Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
@@ -604,11 +599,15 @@ function isAutoRecoveryPlaceholderPlan(content) {
604
599
  * projection (the 4S/0T-vs-5S/13T drift class). The artifacts table is an
605
600
  * output sink, never a render input.
606
601
  *
607
- * @returns true if the plan was written, false on skip/error
602
+ * @returns true if the plan was written, false when the DB slice has no tasks
603
+ * @throws when the DB connection is unavailable or the render write fails
608
604
  */
609
605
  export async function renderPlanCheckboxes(basePath, milestoneId, sliceId, outputPath) {
610
606
  const tasks = getSliceTasks(milestoneId, sliceId);
611
607
  if (tasks.length === 0) {
608
+ if (!isDbAvailable()) {
609
+ throw new Error(`database unavailable while rendering plan checkboxes for ${milestoneId}/${sliceId}`);
610
+ }
612
611
  process.stderr.write(`markdown-renderer: no tasks found for ${milestoneId}/${sliceId}\n`);
613
612
  return false;
614
613
  }
@@ -33,8 +33,8 @@ import { logWarning } from "./workflow-logger.js";
33
33
  * decision is checked individually; only decisions whose id is already
34
34
  * present in the memory store are skipped. A user-authored memory with
35
35
  * their own `sourceDecisionId` does NOT abort the backfill.
36
- * - Best-effort: never throws. Logs and returns 0 on failure so a broken
37
- * backfill cannot block agent startup.
36
+ * - Best-effort: never throws. Failed memory inserts are logged and skipped;
37
+ * setup/read failures log and return 0 so backfill cannot block startup.
38
38
  * - Full migration (ADR-013 Stage 2a): both active and superseded rows are
39
39
  * migrated. `structured_fields.superseded_by` preserves the supersedes
40
40
  * chain so the DECISIONS.md projection regen can source from memories
@@ -117,25 +117,32 @@ export function backfillDecisionsToMemories() {
117
117
  continue;
118
118
  }
119
119
  const content = synthesizeDecisionMemoryContent(row);
120
- const id = createMemory({
121
- category: "architecture",
122
- content,
123
- scope: row.scope || "project",
124
- confidence: 0.85,
125
- structuredFields: {
126
- sourceDecisionId: row.id,
127
- when_context: row.when_context,
128
- scope: row.scope,
129
- decision: row.decision,
130
- choice: row.choice,
131
- rationale: row.rationale,
132
- made_by: row.made_by,
133
- revisable: row.revisable,
134
- superseded_by: row.superseded_by,
135
- },
136
- });
137
- if (id)
138
- written += 1;
120
+ try {
121
+ const id = createMemory({
122
+ category: "architecture",
123
+ content,
124
+ scope: row.scope || "project",
125
+ confidence: 0.85,
126
+ structuredFields: {
127
+ sourceDecisionId: row.id,
128
+ when_context: row.when_context,
129
+ scope: row.scope,
130
+ decision: row.decision,
131
+ choice: row.choice,
132
+ rationale: row.rationale,
133
+ made_by: row.made_by,
134
+ revisable: row.revisable,
135
+ superseded_by: row.superseded_by,
136
+ },
137
+ });
138
+ if (id)
139
+ written += 1;
140
+ }
141
+ catch (rowErr) {
142
+ const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
143
+ logWarning("memory-backfill", `decisions->memories backfill skipped ${row.id}: ${message}`);
144
+ continue;
145
+ }
139
146
  }
140
147
  if (healed > 0) {
141
148
  logWarning("memory-backfill", `decisions->memories drift healed: ${healed} row${healed === 1 ? "" : "s"} updated superseded_by`);
@@ -94,27 +94,48 @@ function getActiveDecisions() {
94
94
  return [];
95
95
  }
96
96
  }
97
- /**
98
- * True when a memory row has a `structured_fields` JSON payload containing
99
- * the given `markerKey: "value"` pair. Matches the LIKE pattern used by
100
- * `backfillDecisionsToMemories` so the scanner is consistent with the
101
- * backfill's idempotency check.
102
- */
103
- function memoryHasSourceMarker(markerKey, value) {
97
+ function emptyMemorySourceMarkers() {
98
+ return { decisionIds: new Set(), knowledgeIds: new Set() };
99
+ }
100
+ function getMemorySourceMarkers() {
101
+ const markers = emptyMemorySourceMarkers();
104
102
  if (!isDbAvailable())
105
- return false;
103
+ return markers;
106
104
  const adapter = _getAdapter();
107
105
  if (!adapter)
108
- return false;
106
+ return markers;
109
107
  try {
110
- const pattern = `%"${markerKey}":"${value}"%`;
111
- const row = adapter
112
- .prepare("SELECT 1 FROM memories WHERE structured_fields LIKE :pattern LIMIT 1")
113
- .get({ ":pattern": pattern });
114
- return row !== undefined;
108
+ const rows = adapter
109
+ .prepare("SELECT structured_fields FROM memories WHERE structured_fields IS NOT NULL")
110
+ .all();
111
+ for (const row of rows) {
112
+ collectMemorySourceMarker(markers, row["structured_fields"]);
113
+ }
115
114
  }
116
115
  catch {
117
- return false;
116
+ return markers;
117
+ }
118
+ return markers;
119
+ }
120
+ function collectMemorySourceMarker(markers, raw) {
121
+ if (typeof raw !== "string" || raw.length === 0)
122
+ return;
123
+ try {
124
+ const parsed = JSON.parse(raw);
125
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
126
+ return;
127
+ const fields = parsed;
128
+ const decisionId = fields["sourceDecisionId"];
129
+ if (typeof decisionId === "string" && decisionId.length > 0) {
130
+ markers.decisionIds.add(decisionId);
131
+ }
132
+ const knowledgeId = fields["sourceKnowledgeId"];
133
+ if (typeof knowledgeId === "string" && knowledgeId.length > 0) {
134
+ markers.knowledgeIds.add(knowledgeId);
135
+ }
136
+ }
137
+ catch {
138
+ return;
118
139
  }
119
140
  }
120
141
  // ─── Public API ──────────────────────────────────────────────────────────────
@@ -127,10 +148,14 @@ const SAMPLE_LIMIT = 5;
127
148
  export function scanConsolidationGaps(basePath) {
128
149
  // ── Decisions ────────────────────────────────────────────────────────
129
150
  const decisions = getActiveDecisions();
151
+ const knowledgeRows = parseKnowledgeRows(knowledgeMdContent(basePath));
152
+ const memorySourceMarkers = decisions.length > 0 || knowledgeRows.length > 0
153
+ ? getMemorySourceMarkers()
154
+ : emptyMemorySourceMarkers();
130
155
  const decisionSamples = [];
131
156
  let decisionMigrated = 0;
132
157
  for (const decision of decisions) {
133
- if (memoryHasSourceMarker("sourceDecisionId", decision.id)) {
158
+ if (memorySourceMarkers.decisionIds.has(decision.id)) {
134
159
  decisionMigrated += 1;
135
160
  continue;
136
161
  }
@@ -142,16 +167,14 @@ export function scanConsolidationGaps(basePath) {
142
167
  }
143
168
  }
144
169
  // ── KNOWLEDGE.md ─────────────────────────────────────────────────────
145
- const knowledgeRows = parseKnowledgeRows(knowledgeMdContent(basePath));
146
170
  const knowledgeByTable = { rules: 0, patterns: 0, lessons: 0 };
147
171
  const knowledgeSamples = [];
148
172
  let knowledgeMigrated = 0;
149
173
  for (const row of knowledgeRows) {
150
174
  knowledgeByTable[row.table] += 1;
151
- // Phase 6 will introduce a `sourceKnowledgeId` marker as part of the
152
- // KNOWLEDGE.md backfill. Until that path ships, this check returns
153
- // false for every row, which is the honest state of the consolidation.
154
- if (memoryHasSourceMarker("sourceKnowledgeId", row.id)) {
175
+ // KNOWLEDGE.md backfill writes `sourceKnowledgeId`; rows without that
176
+ // marker are still reported as consolidation gaps.
177
+ if (memorySourceMarkers.knowledgeIds.has(row.id)) {
155
178
  knowledgeMigrated += 1;
156
179
  continue;
157
180
  }
@@ -17,7 +17,7 @@ import { join } from "node:path";
17
17
  import { openSync, closeSync, unlinkSync, statSync, writeFileSync } from "node:fs";
18
18
  import { gsdRoot } from "./paths.js";
19
19
  import { getAndClearSkills } from "./skill-telemetry.js";
20
- import { loadJsonFile, loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
20
+ import { loadJsonFile, loadJsonFileOrNull, saveJsonFileCompact } from "./json-persistence.js";
21
21
  import { parseUnitId } from "./unit-id.js";
22
22
  import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
23
23
  import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
@@ -636,7 +636,7 @@ export function pruneMetricsLedger(base, keepCount) {
636
636
  return 0;
637
637
  const removed = disk.units.length - keepCount;
638
638
  disk.units = keepNewestUnits(disk.units, keepCount);
639
- saveJsonFile(metricsPath(base), disk);
639
+ saveJsonFileCompact(metricsPath(base), disk);
640
640
  // Keep the in-memory ledger in sync if it is loaded for this session.
641
641
  if (ledger) {
642
642
  ledger.units = keepNewestUnits(ledger.units, keepCount);
@@ -799,7 +799,7 @@ function saveLedger(base, data) {
799
799
  : dataUnits;
800
800
  merged.sort(compareUnitsByTime);
801
801
  data.units = keepNewestUnits(merged);
802
- saveJsonFile(path, data);
802
+ saveJsonFileCompact(path, data);
803
803
  }
804
804
  finally {
805
805
  releaseLock(lockPath);
@@ -813,6 +813,6 @@ function saveLedger(base, data) {
813
813
  // read-merge-write sequence without mutual exclusion.
814
814
  logWarning("fs", "saveLedger: lock not acquired — falling back to direct write (no merge)");
815
815
  data.units = keepNewestUnits(data.units);
816
- saveJsonFile(path, data);
816
+ saveJsonFileCompact(path, data);
817
817
  }
818
818
  }
@@ -110,6 +110,7 @@ export function migrateToExternalState(basePath) {
110
110
  }
111
111
  // Copy contents to external dir, skipping worktrees/
112
112
  const entries = readdirSync(migratingPath, { withFileTypes: true });
113
+ const copyFailures = [];
113
114
  for (const entry of entries) {
114
115
  if (entry.name === "worktrees")
115
116
  continue; // worktrees stay local
@@ -123,10 +124,18 @@ export function migrateToExternalState(basePath) {
123
124
  cpSync(src, dst, { force: true });
124
125
  }
125
126
  }
126
- catch {
127
- // Non-fatal: continue with other files
127
+ catch (copyErr) {
128
+ copyFailures.push(`${entry.name}: ${getErrorMessage(copyErr)}`);
128
129
  }
129
130
  }
131
+ if (copyFailures.length > 0) {
132
+ try {
133
+ rmSync(localGsd, { force: true });
134
+ }
135
+ catch { /* may not exist */ }
136
+ renameSync(migratingPath, localGsd);
137
+ return { migrated: false, error: `Migration copy failed: ${copyFailures.join("; ")}` };
138
+ }
130
139
  // Create symlink .gsd -> external path
131
140
  symlinkSync(externalPath, localGsd, "junction");
132
141
  // Verify the symlink resolves correctly before removing the backup (#1377).
@@ -45,6 +45,27 @@ function scanHasExtraIdentities(a, b) {
45
45
  hasExtra(a.slices, b.slices) ||
46
46
  hasExtra(a.tasks, b.tasks));
47
47
  }
48
+ function paddedMilestoneId(id) {
49
+ return /^\d+$/.test(id) ? `M${id.padStart(3, "0")}` : null;
50
+ }
51
+ function replaceSetPrefix(values, from, to) {
52
+ for (const value of [...values]) {
53
+ if (value !== from && !value.startsWith(`${from}/`))
54
+ continue;
55
+ values.delete(value);
56
+ values.add(`${to}${value.slice(from.length)}`);
57
+ }
58
+ }
59
+ function alignNumericMarkdownIdsWithDb(markdownScan, dbScan) {
60
+ for (const dbId of dbScan.milestones) {
61
+ const paddedId = paddedMilestoneId(dbId);
62
+ if (!paddedId || dbScan.milestones.has(paddedId) || !markdownScan.milestones.has(paddedId))
63
+ continue;
64
+ replaceSetPrefix(markdownScan.milestones, paddedId, dbId);
65
+ replaceSetPrefix(markdownScan.slices, paddedId, dbId);
66
+ replaceSetPrefix(markdownScan.tasks, paddedId, dbId);
67
+ }
68
+ }
48
69
  /**
49
70
  * True when the DB holds any milestone/slice/task identity the markdown lacks —
50
71
  * i.e. a `/gsd recover --confirm` (markdown → DB) would DELETE authoritative DB
@@ -126,6 +147,7 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
126
147
  refreshWorkflowDatabaseFromDisk();
127
148
  const dbScan = scanDbHierarchy();
128
149
  const beforeDb = dbScan.counts;
150
+ alignNumericMarkdownIdsWithDb(markdownScan, dbScan);
129
151
  // Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
130
152
  // a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
131
153
  // queued DB row is inserted only at discussion handoff). Treating it as
@@ -123,7 +123,8 @@ export function clearReservedMilestoneIds() {
123
123
  reservedMilestoneIds.clear();
124
124
  }
125
125
  // ─── Discovery ──────────────────────────────────────────────────────────────
126
- function scanMilestoneIdsFromDir(dir) {
126
+ function scanMilestoneIdsFromDir(basePath, dir) {
127
+ const legacyNumericIds = idsWithLegacyNumericDirs(basePath);
127
128
  return readdirSync(dir, { withFileTypes: true })
128
129
  .filter((d) => d.isDirectory())
129
130
  .map((d) => {
@@ -131,6 +132,12 @@ function scanMilestoneIdsFromDir(dir) {
131
132
  if (MILESTONE_ID_RE.test(d.name)) {
132
133
  return d.name;
133
134
  }
135
+ // Legacy recovery/imports may contain bare numeric milestone directories
136
+ // (for example `milestones/15/15-ROADMAP.md`). The DB can preserve that
137
+ // id, and rebuild renders it, so drift scans must see it too.
138
+ if (/^\d+$/.test(d.name)) {
139
+ return d.name;
140
+ }
134
141
  // Legacy layout: M001-abcdef-slug descriptor directories
135
142
  const legacyMatch = d.name.match(/^(M\d{3}(?:-[a-z0-9]{6})?)-/);
136
143
  if (legacyMatch) {
@@ -144,12 +151,35 @@ function scanMilestoneIdsFromDir(dir) {
144
151
  if (MILESTONE_ID_RE.test(fromSlug)) {
145
152
  return fromSlug;
146
153
  }
154
+ const numericId = String(phaseNum);
155
+ if (legacyNumericIds.has(numericId)) {
156
+ return numericId;
157
+ }
147
158
  return `M${String(phaseNum).padStart(3, "0")}`;
148
159
  }
149
160
  return null;
150
161
  })
151
162
  .filter((id) => id !== null);
152
163
  }
164
+ function idsWithLegacyNumericDirs(basePath) {
165
+ const legacyDir = join(gsdProjectionRoot(basePath), "milestones");
166
+ const ids = new Set();
167
+ try {
168
+ for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
169
+ if (entry.isDirectory() && /^\d+$/.test(entry.name))
170
+ ids.add(entry.name);
171
+ }
172
+ }
173
+ catch (err) {
174
+ // A missing legacy directory is the common, benign case (nothing to
175
+ // consult). Only surface a real failure when the directory exists but
176
+ // could not be read.
177
+ if (existsSync(legacyDir)) {
178
+ logWarning("engine", `idsWithLegacyNumericDirs: ${legacyDir} exists but readdirSync failed — ${getErrorMessage(err)}`);
179
+ }
180
+ }
181
+ return ids;
182
+ }
153
183
  /** Scan the milestones directory and return IDs sorted by queue order (or numeric fallback). */
154
184
  export function findMilestoneIds(basePath) {
155
185
  const root = gsdProjectionRoot(basePath);
@@ -163,7 +193,7 @@ export function findMilestoneIds(basePath) {
163
193
  const ids = new Set();
164
194
  for (const dir of dirs) {
165
195
  try {
166
- for (const id of scanMilestoneIdsFromDir(dir))
196
+ for (const id of scanMilestoneIdsFromDir(basePath, dir))
167
197
  ids.add(id);
168
198
  }
169
199
  catch (err) {
@@ -10,6 +10,8 @@ import { logWarning } from "./workflow-logger.js";
10
10
  import { resolveTasksDir } from "./paths.js";
11
11
  /** Large enough for unbounded milestone-history git log scans in big repos. */
12
12
  const GIT_LOG_MAX_BUFFER = 16 * 1024 * 1024;
13
+ const LOG_FIELD_SEPARATOR = "\x1f";
14
+ const LOG_RECORD_SEPARATOR = "\x1e";
13
15
  /**
14
16
  * Check whether a milestone produced implementation artifacts (non-`.gsd/`
15
17
  * files) in git history. The primary signal is the branch diff against the
@@ -179,7 +181,7 @@ function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
179
181
  // Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
180
182
  // by depth when .gsd/ is tracked in git.
181
183
  const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
182
- "log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
184
+ "log", "--full-diff", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
183
185
  ]);
184
186
  if (!scoped.ok)
185
187
  return scoped;
@@ -195,7 +197,7 @@ function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
195
197
  // reintroducing the rolling-depth failure class removed in #4699 where
196
198
  // milestone evidence aged out behind unrelated activity.
197
199
  const unscoped = scanGsdTaggedCommits(basePath, milestoneId, [
198
- "log", "--format=%H%x1f%B%x1e", "HEAD",
200
+ "log", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD",
199
201
  ]);
200
202
  if (!unscoped.ok)
201
203
  return scoped.matched ? scoped : unscoped;
@@ -280,8 +282,7 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId)
280
282
  continue;
281
283
  if (commitMessageHasGsdTrailer(record.message))
282
284
  continue;
283
- const commitFiles = getChangedFilesForCommit(basePath, record.hash);
284
- const implementationFiles = commitFiles.map(normalizeRepoPath).filter(isImplementationPath);
285
+ const implementationFiles = record.files.map(normalizeRepoPath).filter(isImplementationPath);
285
286
  if (implementationFiles.length === 0)
286
287
  continue;
287
288
  if (!implementationFiles.some((file) => hintSet.has(file)))
@@ -306,24 +307,28 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId)
306
307
  }
307
308
  }
308
309
  function getCommitRecords(basePath) {
309
- const logOutput = execFileSync("git", ["log", "--format=%H%x1f%P%x1f%cI%x1f%B%x1e", "HEAD"], {
310
+ const logOutput = execFileSync("git", ["log", "--name-only", "--format=%x1e%H%x1f%P%x1f%cI%x1f%B%x1f", "HEAD"], {
310
311
  cwd: basePath,
311
312
  stdio: ["ignore", "pipe", "pipe"],
312
313
  encoding: "utf-8",
313
314
  maxBuffer: GIT_LOG_MAX_BUFFER,
314
315
  });
315
316
  return logOutput
316
- .split("\x1e")
317
- .map((record) => record.trim())
317
+ .split(LOG_RECORD_SEPARATOR)
318
318
  .filter(Boolean)
319
319
  .flatMap((record) => {
320
- const parts = record.split("\x1f");
321
- if (parts.length < 4)
320
+ const parts = record.split(LOG_FIELD_SEPARATOR);
321
+ if (parts.length < 5)
322
322
  return [];
323
- const [hash, parents, committedAt, ...messageParts] = parts;
324
- return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message: messageParts.join("\x1f") }];
323
+ const [hash, parents, committedAt] = parts;
324
+ const files = parseNameOnlyFiles(parts.at(-1) ?? "");
325
+ const message = parts.slice(3, -1).join(LOG_FIELD_SEPARATOR);
326
+ return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message, files }];
325
327
  });
326
328
  }
329
+ function parseNameOnlyFiles(rawFiles) {
330
+ return rawFiles.split(/\r?\n/).map((file) => file.trim()).filter(Boolean);
331
+ }
327
332
  function isFullCommitSha(value) {
328
333
  return /^[0-9a-f]{40}$/i.test(value);
329
334
  }
@@ -336,23 +341,24 @@ function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
336
341
  maxBuffer: GIT_LOG_MAX_BUFFER,
337
342
  });
338
343
  const records = logOutput
339
- .split("\x1e")
340
- .map((record) => record.trim())
344
+ .split(LOG_RECORD_SEPARATOR)
341
345
  .filter(Boolean)
342
346
  .flatMap((record) => {
343
- const sep = record.indexOf("\x1f");
344
- if (sep === -1)
347
+ const parts = record.split(LOG_FIELD_SEPARATOR);
348
+ if (parts.length < 3)
349
+ return [];
350
+ const hash = parts[0].trim();
351
+ if (!hash)
345
352
  return [];
346
- const hash = record.slice(0, sep).trim();
347
- const message = record.slice(sep + 1);
348
- return [{ hash, message }];
353
+ const files = parseNameOnlyFiles(parts.at(-1) ?? "");
354
+ const message = parts.slice(1, -1).join(LOG_FIELD_SEPARATOR);
355
+ return [{ message, files }];
349
356
  });
350
357
  const files = new Set();
351
358
  let matched = false;
352
- for (const { hash, message } of records) {
359
+ for (const { message, files: commitFiles } of records) {
353
360
  if (!commitMessageHasGsdTrailer(message))
354
361
  continue;
355
- const commitFiles = getChangedFilesForCommit(basePath, hash);
356
362
  if (!commitMatchesMilestone(basePath, message, milestoneId, commitFiles))
357
363
  continue;
358
364
  matched = true;