gsd-pi 2.44.0 → 2.45.0-dev.e0ee972

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 (505) hide show
  1. package/README.md +30 -12
  2. package/dist/help-text.js +1 -1
  3. package/dist/loader.js +34 -0
  4. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  5. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  6. package/dist/resources/extensions/gsd/auto/phases.js +52 -45
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
  8. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  9. package/dist/resources/extensions/gsd/auto-start.js +31 -2
  10. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  11. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  12. package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
  13. package/dist/resources/extensions/gsd/auto.js +34 -8
  14. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +168 -11
  15. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  16. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  17. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  18. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  19. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  20. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  21. package/dist/resources/extensions/gsd/db-writer.js +40 -22
  22. package/dist/resources/extensions/gsd/doctor-checks.js +1 -1
  23. package/dist/resources/extensions/gsd/doctor.js +10 -2
  24. package/dist/resources/extensions/gsd/git-service.js +8 -3
  25. package/dist/resources/extensions/gsd/gsd-db.js +17 -2
  26. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  27. package/dist/resources/extensions/gsd/preferences-types.js +2 -2
  28. package/dist/resources/extensions/gsd/preferences.js +17 -5
  29. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  30. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  31. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  32. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  33. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  34. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  35. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  36. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  37. package/dist/resources/extensions/gsd/rethink.js +115 -0
  38. package/dist/resources/extensions/gsd/state.js +41 -3
  39. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  40. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  41. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  42. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  43. package/dist/resources/extensions/gsd/workflow-logger.js +138 -0
  44. package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
  45. package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
  46. package/dist/resources/extensions/mcp-client/index.js +14 -0
  47. package/dist/resources/extensions/voice/index.js +11 -16
  48. package/dist/resources/extensions/voice/linux-ready.js +67 -0
  49. package/dist/web/standalone/.next/BUILD_ID +1 -1
  50. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  51. package/dist/web/standalone/.next/build-manifest.json +4 -4
  52. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  53. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  54. package/dist/web/standalone/.next/required-server-files.json +3 -3
  55. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  56. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  58. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  66. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  68. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  69. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  70. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  72. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  75. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  82. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  120. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  142. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  144. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  146. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/index.html +1 -1
  156. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  157. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  158. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  159. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  161. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  162. package/dist/web/standalone/.next/server/app/page.js +2 -2
  163. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  165. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  166. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  167. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/middleware.js +2 -2
  170. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  172. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  173. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  174. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  175. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  176. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  177. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  178. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  179. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  180. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  181. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  182. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  183. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  184. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  185. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  186. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  187. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  188. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  189. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  190. package/dist/web/standalone/server.js +1 -1
  191. package/package.json +1 -1
  192. package/packages/native/dist/stream-process/index.js +2 -2
  193. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  194. package/packages/native/src/stream-process/index.ts +2 -2
  195. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  196. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  198. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  200. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  202. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
  203. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  204. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  205. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  206. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
  207. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  210. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
  212. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
  214. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
  216. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
  218. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  220. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  222. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
  224. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
  226. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  228. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
  230. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  232. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  234. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  236. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  238. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  240. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/main.js +17 -0
  243. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  274. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  275. package/packages/pi-coding-agent/package.json +1 -1
  276. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  277. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  278. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
  279. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  280. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
  281. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  282. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  283. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
  284. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  285. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
  286. package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
  287. package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
  288. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  289. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  290. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  291. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  292. package/packages/pi-coding-agent/src/main.ts +19 -0
  293. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  294. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  295. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  296. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  297. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  298. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  299. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  300. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  301. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  302. package/pkg/package.json +1 -1
  303. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  304. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  305. package/src/resources/extensions/gsd/auto/phases.ts +61 -59
  306. package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
  307. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  308. package/src/resources/extensions/gsd/auto-start.ts +39 -2
  309. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  310. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  311. package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
  312. package/src/resources/extensions/gsd/auto.ts +40 -6
  313. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -11
  314. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  315. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  316. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  317. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  318. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  319. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  320. package/src/resources/extensions/gsd/db-writer.ts +41 -27
  321. package/src/resources/extensions/gsd/doctor-checks.ts +1 -1
  322. package/src/resources/extensions/gsd/doctor.ts +9 -3
  323. package/src/resources/extensions/gsd/git-service.ts +6 -2
  324. package/src/resources/extensions/gsd/gsd-db.ts +21 -2
  325. package/src/resources/extensions/gsd/journal.ts +6 -1
  326. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  327. package/src/resources/extensions/gsd/preferences-types.ts +2 -2
  328. package/src/resources/extensions/gsd/preferences.ts +18 -4
  329. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  330. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  331. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  332. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  333. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  334. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  335. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  336. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  337. package/src/resources/extensions/gsd/rethink.ts +154 -0
  338. package/src/resources/extensions/gsd/state.ts +41 -1
  339. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  340. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  341. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  342. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  343. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  344. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  345. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  346. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  347. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  348. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  349. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  350. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  351. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  352. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  353. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  354. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  355. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  356. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  357. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  358. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  359. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  360. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  361. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  362. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  363. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  364. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  365. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  366. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  367. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  368. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  369. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  370. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  371. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  372. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  373. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  374. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  375. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  376. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  377. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  378. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  379. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  380. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  381. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  382. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  383. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  384. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  385. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  386. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  387. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  388. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  389. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  390. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  391. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  392. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  393. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  394. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  395. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  396. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  397. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  398. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  399. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  400. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  401. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  402. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  403. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  404. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  405. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  406. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  407. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  408. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  409. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  410. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  411. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  412. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  413. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  414. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  415. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  416. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  417. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  418. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  419. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  420. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  421. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  422. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  423. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  424. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  425. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  426. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  427. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
  428. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  429. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  430. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  431. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  432. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  433. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  434. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  435. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  436. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  437. package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
  438. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  439. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  440. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  441. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  442. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  443. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  444. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  445. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  446. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  447. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  448. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  449. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  450. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  451. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  452. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  453. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  454. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  455. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  456. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  457. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  458. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  459. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  460. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  461. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  462. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  463. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  464. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  465. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  466. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  467. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  468. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  469. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  470. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  471. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  472. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  473. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  474. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
  475. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  476. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  477. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  478. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  479. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  480. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  481. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  482. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
  483. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  484. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  485. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  486. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  487. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  488. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  489. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  490. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  491. package/src/resources/extensions/gsd/workflow-logger.ts +193 -0
  492. package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
  493. package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
  494. package/src/resources/extensions/mcp-client/index.ts +20 -0
  495. package/src/resources/extensions/voice/index.ts +11 -21
  496. package/src/resources/extensions/voice/linux-ready.ts +87 -0
  497. package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
  498. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  499. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  501. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  502. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  503. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  504. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_buildManifest.js +0 -0
  505. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_ssgManifest.js +0 -0
@@ -1,4 +1,5 @@
1
- import { createTestContext } from './test-helpers.ts';
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
2
3
  import * as fs from 'node:fs';
3
4
  import * as path from 'node:path';
4
5
  import * as os from 'node:os';
@@ -18,8 +19,6 @@ import {
18
19
  _resetProvider,
19
20
  } from '../gsd-db.ts';
20
21
 
21
- const { assertEq, assertTrue, report } = createTestContext();
22
-
23
22
  // ═══════════════════════════════════════════════════════════════════════════
24
23
  // Helper: create a temp file path for file-backed DB tests
25
24
  // ═══════════════════════════════════════════════════════════════════════════
@@ -47,314 +46,306 @@ function cleanup(dbPath: string): void {
47
46
  // gsd-db tests
48
47
  // ═══════════════════════════════════════════════════════════════════════════
49
48
 
50
- console.log('\n=== gsd-db: provider detection ===');
51
- {
52
- const provider = getDbProvider();
53
- assertTrue(provider !== null, 'provider should be non-null');
54
- assertTrue(
55
- provider === 'node:sqlite' || provider === 'better-sqlite3',
56
- `provider should be a known name, got: ${provider}`,
57
- );
58
- }
59
-
60
- console.log('\n=== gsd-db: fresh DB schema init (memory) ===');
61
- {
62
- const ok = openDatabase(':memory:');
63
- assertTrue(ok, 'openDatabase should return true');
64
- assertTrue(isDbAvailable(), 'isDbAvailable should be true after open');
49
+ describe('gsd-db', () => {
50
+ test('gsd-db: provider detection', () => {
51
+ const provider = getDbProvider();
52
+ assert.ok(provider !== null, 'provider should be non-null');
53
+ assert.ok(
54
+ provider === 'node:sqlite' || provider === 'better-sqlite3',
55
+ `provider should be a known name, got: ${provider}`,
56
+ );
57
+ });
65
58
 
66
- // Check schema_version table
67
- const adapter = _getAdapter()!;
68
- const version = adapter.prepare('SELECT MAX(version) as version FROM schema_version').get();
69
- assertEq(version?.['version'], 10, 'schema version should be 10');
59
+ test('gsd-db: fresh DB schema init (memory)', () => {
60
+ const ok = openDatabase(':memory:');
61
+ assert.ok(ok, 'openDatabase should return true');
62
+ assert.ok(isDbAvailable(), 'isDbAvailable should be true after open');
70
63
 
71
- // Check tables exist by querying them
72
- const dRows = adapter.prepare('SELECT count(*) as cnt FROM decisions').get();
73
- assertEq(dRows?.['cnt'], 0, 'decisions table should exist and be empty');
64
+ // Check schema_version table
65
+ const adapter = _getAdapter()!;
66
+ const version = adapter.prepare('SELECT MAX(version) as version FROM schema_version').get();
67
+ assert.deepStrictEqual(version?.['version'], 10, 'schema version should be 10');
74
68
 
75
- const rRows = adapter.prepare('SELECT count(*) as cnt FROM requirements').get();
76
- assertEq(rRows?.['cnt'], 0, 'requirements table should exist and be empty');
69
+ // Check tables exist by querying them
70
+ const dRows = adapter.prepare('SELECT count(*) as cnt FROM decisions').get();
71
+ assert.deepStrictEqual(dRows?.['cnt'], 0, 'decisions table should exist and be empty');
77
72
 
78
- closeDatabase();
79
- assertTrue(!isDbAvailable(), 'isDbAvailable should be false after close');
80
- }
73
+ const rRows = adapter.prepare('SELECT count(*) as cnt FROM requirements').get();
74
+ assert.deepStrictEqual(rRows?.['cnt'], 0, 'requirements table should exist and be empty');
81
75
 
82
- console.log('\n=== gsd-db: double-init idempotency ===');
83
- {
84
- const dbPath = tempDbPath();
85
- openDatabase(dbPath);
86
-
87
- // Insert a decision so we can verify it survives re-init
88
- insertDecision({
89
- id: 'D001',
90
- when_context: 'test',
91
- scope: 'global',
92
- decision: 'test decision',
93
- choice: 'option A',
94
- rationale: 'because',
95
- revisable: 'yes',
96
- made_by: 'agent',
97
- superseded_by: null,
76
+ closeDatabase();
77
+ assert.ok(!isDbAvailable(), 'isDbAvailable should be false after close');
98
78
  });
99
79
 
100
- closeDatabase();
80
+ test('gsd-db: double-init idempotency', () => {
81
+ const dbPath = tempDbPath();
82
+ openDatabase(dbPath);
83
+
84
+ // Insert a decision so we can verify it survives re-init
85
+ insertDecision({
86
+ id: 'D001',
87
+ when_context: 'test',
88
+ scope: 'global',
89
+ decision: 'test decision',
90
+ choice: 'option A',
91
+ rationale: 'because',
92
+ revisable: 'yes',
93
+ made_by: 'agent',
94
+ superseded_by: null,
95
+ });
101
96
 
102
- // Re-open same DB — schema init should be idempotent
103
- openDatabase(dbPath);
104
- const d = getDecisionById('D001');
105
- assertTrue(d !== null, 'decision should survive re-init');
106
- assertEq(d?.id, 'D001', 'decision ID preserved after re-init');
97
+ closeDatabase();
107
98
 
108
- // Schema version should still be 1 (not duplicated)
109
- const adapter = _getAdapter()!;
110
- const versions = adapter.prepare('SELECT count(*) as cnt FROM schema_version').get();
111
- assertEq(versions?.['cnt'], 1, 'schema_version should have exactly 1 row after double-init');
99
+ // Re-open same DB schema init should be idempotent
100
+ openDatabase(dbPath);
101
+ const d = getDecisionById('D001');
102
+ assert.ok(d !== null, 'decision should survive re-init');
103
+ assert.deepStrictEqual(d?.id, 'D001', 'decision ID preserved after re-init');
112
104
 
113
- cleanup(dbPath);
114
- }
105
+ // Schema version should still be 1 (not duplicated)
106
+ const adapter = _getAdapter()!;
107
+ const versions = adapter.prepare('SELECT count(*) as cnt FROM schema_version').get();
108
+ assert.deepStrictEqual(versions?.['cnt'], 1, 'schema_version should have exactly 1 row after double-init');
115
109
 
116
- console.log('\n=== gsd-db: insert + get decision ===');
117
- {
118
- openDatabase(':memory:');
119
- insertDecision({
120
- id: 'D042',
121
- when_context: 'during sprint 3',
122
- scope: 'M001/S02',
123
- decision: 'use SQLite for storage',
124
- choice: 'node:sqlite',
125
- rationale: 'built-in, zero deps',
126
- revisable: 'yes, if perf insufficient',
127
- made_by: 'agent',
128
- superseded_by: null,
110
+ cleanup(dbPath);
129
111
  });
130
112
 
131
- const d = getDecisionById('D042');
132
- assertTrue(d !== null, 'should find inserted decision');
133
- assertEq(d?.id, 'D042', 'decision id');
134
- assertEq(d?.scope, 'M001/S02', 'decision scope');
135
- assertEq(d?.choice, 'node:sqlite', 'decision choice');
136
- assertTrue(typeof d?.seq === 'number' && d.seq > 0, 'seq should be auto-assigned positive number');
137
- assertEq(d?.superseded_by, null, 'superseded_by should be null');
113
+ test('gsd-db: insert + get decision', () => {
114
+ openDatabase(':memory:');
115
+ insertDecision({
116
+ id: 'D042',
117
+ when_context: 'during sprint 3',
118
+ scope: 'M001/S02',
119
+ decision: 'use SQLite for storage',
120
+ choice: 'node:sqlite',
121
+ rationale: 'built-in, zero deps',
122
+ revisable: 'yes, if perf insufficient',
123
+ made_by: 'agent',
124
+ superseded_by: null,
125
+ });
138
126
 
139
- // Non-existent
140
- const missing = getDecisionById('D999');
141
- assertEq(missing, null, 'non-existent decision returns null');
127
+ const d = getDecisionById('D042');
128
+ assert.ok(d !== null, 'should find inserted decision');
129
+ assert.deepStrictEqual(d?.id, 'D042', 'decision id');
130
+ assert.deepStrictEqual(d?.scope, 'M001/S02', 'decision scope');
131
+ assert.deepStrictEqual(d?.choice, 'node:sqlite', 'decision choice');
132
+ assert.ok(typeof d?.seq === 'number' && d.seq > 0, 'seq should be auto-assigned positive number');
133
+ assert.deepStrictEqual(d?.superseded_by, null, 'superseded_by should be null');
142
134
 
143
- closeDatabase();
144
- }
135
+ // Non-existent
136
+ const missing = getDecisionById('D999');
137
+ assert.deepStrictEqual(missing, null, 'non-existent decision returns null');
145
138
 
146
- console.log('\n=== gsd-db: insert + get requirement ===');
147
- {
148
- openDatabase(':memory:');
149
- insertRequirement({
150
- id: 'R007',
151
- class: 'functional',
152
- status: 'active',
153
- description: 'System must persist decisions',
154
- why: 'decisions inform future agents',
155
- source: 'M001-CONTEXT',
156
- primary_owner: 'S01',
157
- supporting_slices: 'S02, S03',
158
- validation: 'insert and query roundtrip',
159
- notes: 'high priority',
160
- full_content: 'Full text of requirement...',
161
- superseded_by: null,
139
+ closeDatabase();
162
140
  });
163
141
 
164
- const r = getRequirementById('R007');
165
- assertTrue(r !== null, 'should find inserted requirement');
166
- assertEq(r?.id, 'R007', 'requirement id');
167
- assertEq(r?.class, 'functional', 'requirement class');
168
- assertEq(r?.status, 'active', 'requirement status');
169
- assertEq(r?.primary_owner, 'S01', 'requirement primary_owner');
170
- assertEq(r?.superseded_by, null, 'superseded_by should be null');
142
+ test('gsd-db: insert + get requirement', () => {
143
+ openDatabase(':memory:');
144
+ insertRequirement({
145
+ id: 'R007',
146
+ class: 'functional',
147
+ status: 'active',
148
+ description: 'System must persist decisions',
149
+ why: 'decisions inform future agents',
150
+ source: 'M001-CONTEXT',
151
+ primary_owner: 'S01',
152
+ supporting_slices: 'S02, S03',
153
+ validation: 'insert and query roundtrip',
154
+ notes: 'high priority',
155
+ full_content: 'Full text of requirement...',
156
+ superseded_by: null,
157
+ });
171
158
 
172
- // Non-existent
173
- const missing = getRequirementById('R999');
174
- assertEq(missing, null, 'non-existent requirement returns null');
159
+ const r = getRequirementById('R007');
160
+ assert.ok(r !== null, 'should find inserted requirement');
161
+ assert.deepStrictEqual(r?.id, 'R007', 'requirement id');
162
+ assert.deepStrictEqual(r?.class, 'functional', 'requirement class');
163
+ assert.deepStrictEqual(r?.status, 'active', 'requirement status');
164
+ assert.deepStrictEqual(r?.primary_owner, 'S01', 'requirement primary_owner');
165
+ assert.deepStrictEqual(r?.superseded_by, null, 'superseded_by should be null');
175
166
 
176
- closeDatabase();
177
- }
167
+ // Non-existent
168
+ const missing = getRequirementById('R999');
169
+ assert.deepStrictEqual(missing, null, 'non-existent requirement returns null');
178
170
 
179
- console.log('\n=== gsd-db: active_decisions view excludes superseded ===');
180
- {
181
- openDatabase(':memory:');
182
-
183
- insertDecision({
184
- id: 'D001',
185
- when_context: 'early',
186
- scope: 'global',
187
- decision: 'use JSON files',
188
- choice: 'JSON',
189
- rationale: 'simple',
190
- revisable: 'yes',
191
- made_by: 'agent',
192
- superseded_by: 'D002', // superseded!
171
+ closeDatabase();
193
172
  });
194
173
 
195
- insertDecision({
196
- id: 'D002',
197
- when_context: 'later',
198
- scope: 'global',
199
- decision: 'use SQLite',
200
- choice: 'SQLite',
201
- rationale: 'better querying',
202
- revisable: 'yes',
203
- made_by: 'agent',
204
- superseded_by: null, // active
205
- });
174
+ test('gsd-db: active_decisions view excludes superseded', () => {
175
+ openDatabase(':memory:');
176
+
177
+ insertDecision({
178
+ id: 'D001',
179
+ when_context: 'early',
180
+ scope: 'global',
181
+ decision: 'use JSON files',
182
+ choice: 'JSON',
183
+ rationale: 'simple',
184
+ revisable: 'yes',
185
+ made_by: 'agent',
186
+ superseded_by: 'D002', // superseded!
187
+ });
206
188
 
207
- insertDecision({
208
- id: 'D003',
209
- when_context: 'same time',
210
- scope: 'local',
211
- decision: 'use WAL mode',
212
- choice: 'WAL',
213
- rationale: 'concurrent reads',
214
- revisable: 'no',
215
- made_by: 'agent',
216
- superseded_by: null, // active
217
- });
189
+ insertDecision({
190
+ id: 'D002',
191
+ when_context: 'later',
192
+ scope: 'global',
193
+ decision: 'use SQLite',
194
+ choice: 'SQLite',
195
+ rationale: 'better querying',
196
+ revisable: 'yes',
197
+ made_by: 'agent',
198
+ superseded_by: null, // active
199
+ });
218
200
 
219
- const active = getActiveDecisions();
220
- assertEq(active.length, 2, 'active_decisions should return 2 (not the superseded one)');
221
- const ids = active.map(d => d.id).sort();
222
- assertEq(ids, ['D002', 'D003'], 'active decisions should be D002 and D003');
201
+ insertDecision({
202
+ id: 'D003',
203
+ when_context: 'same time',
204
+ scope: 'local',
205
+ decision: 'use WAL mode',
206
+ choice: 'WAL',
207
+ rationale: 'concurrent reads',
208
+ revisable: 'no',
209
+ made_by: 'agent',
210
+ superseded_by: null, // active
211
+ });
223
212
 
224
- // Verify D001 is still in the raw table
225
- const d1 = getDecisionById('D001');
226
- assertTrue(d1 !== null, 'superseded decision still exists in raw table');
227
- assertEq(d1?.superseded_by, 'D002', 'superseded_by is set');
213
+ const active = getActiveDecisions();
214
+ assert.deepStrictEqual(active.length, 2, 'active_decisions should return 2 (not the superseded one)');
215
+ const ids = active.map(d => d.id).sort();
216
+ assert.deepStrictEqual(ids, ['D002', 'D003'], 'active decisions should be D002 and D003');
228
217
 
229
- closeDatabase();
230
- }
218
+ // Verify D001 is still in the raw table
219
+ const d1 = getDecisionById('D001');
220
+ assert.ok(d1 !== null, 'superseded decision still exists in raw table');
221
+ assert.deepStrictEqual(d1?.superseded_by, 'D002', 'superseded_by is set');
231
222
 
232
- console.log('\n=== gsd-db: active_requirements view excludes superseded ===');
233
- {
234
- openDatabase(':memory:');
235
-
236
- insertRequirement({
237
- id: 'R001',
238
- class: 'functional',
239
- status: 'active',
240
- description: 'old requirement',
241
- why: 'was needed',
242
- source: 'M001',
243
- primary_owner: 'S01',
244
- supporting_slices: '',
245
- validation: 'test',
246
- notes: '',
247
- full_content: '',
248
- superseded_by: 'R002', // superseded!
223
+ closeDatabase();
249
224
  });
250
225
 
251
- insertRequirement({
252
- id: 'R002',
253
- class: 'functional',
254
- status: 'active',
255
- description: 'new requirement',
256
- why: 'replaces R001',
257
- source: 'M001',
258
- primary_owner: 'S01',
259
- supporting_slices: '',
260
- validation: 'test',
261
- notes: '',
262
- full_content: '',
263
- superseded_by: null, // active
264
- });
226
+ test('gsd-db: active_requirements view excludes superseded', () => {
227
+ openDatabase(':memory:');
228
+
229
+ insertRequirement({
230
+ id: 'R001',
231
+ class: 'functional',
232
+ status: 'active',
233
+ description: 'old requirement',
234
+ why: 'was needed',
235
+ source: 'M001',
236
+ primary_owner: 'S01',
237
+ supporting_slices: '',
238
+ validation: 'test',
239
+ notes: '',
240
+ full_content: '',
241
+ superseded_by: 'R002', // superseded!
242
+ });
265
243
 
266
- const active = getActiveRequirements();
267
- assertEq(active.length, 1, 'active_requirements should return 1');
268
- assertEq(active[0]?.id, 'R002', 'only R002 should be active');
244
+ insertRequirement({
245
+ id: 'R002',
246
+ class: 'functional',
247
+ status: 'active',
248
+ description: 'new requirement',
249
+ why: 'replaces R001',
250
+ source: 'M001',
251
+ primary_owner: 'S01',
252
+ supporting_slices: '',
253
+ validation: 'test',
254
+ notes: '',
255
+ full_content: '',
256
+ superseded_by: null, // active
257
+ });
269
258
 
270
- // R001 still in raw table
271
- const r1 = getRequirementById('R001');
272
- assertTrue(r1 !== null, 'superseded requirement still in raw table');
259
+ const active = getActiveRequirements();
260
+ assert.deepStrictEqual(active.length, 1, 'active_requirements should return 1');
261
+ assert.deepStrictEqual(active[0]?.id, 'R002', 'only R002 should be active');
273
262
 
274
- closeDatabase();
275
- }
263
+ // R001 still in raw table
264
+ const r1 = getRequirementById('R001');
265
+ assert.ok(r1 !== null, 'superseded requirement still in raw table');
276
266
 
277
- console.log('\n=== gsd-db: WAL mode on file-backed DB ===');
278
- {
279
- const dbPath = tempDbPath();
280
- openDatabase(dbPath);
267
+ closeDatabase();
268
+ });
281
269
 
282
- const adapter = _getAdapter()!;
283
- const mode = adapter.prepare('PRAGMA journal_mode').get();
284
- assertEq(mode?.['journal_mode'], 'wal', 'journal_mode should be wal for file-backed DB');
270
+ test('gsd-db: WAL mode on file-backed DB', () => {
271
+ const dbPath = tempDbPath();
272
+ openDatabase(dbPath);
285
273
 
286
- cleanup(dbPath);
287
- }
274
+ const adapter = _getAdapter()!;
275
+ const mode = adapter.prepare('PRAGMA journal_mode').get();
276
+ assert.deepStrictEqual(mode?.['journal_mode'], 'wal', 'journal_mode should be wal for file-backed DB');
288
277
 
289
- console.log('\n=== gsd-db: transaction rollback on error ===');
290
- {
291
- openDatabase(':memory:');
292
-
293
- // Insert a decision normally
294
- insertDecision({
295
- id: 'D010',
296
- when_context: 'test',
297
- scope: 'test',
298
- decision: 'test',
299
- choice: 'test',
300
- rationale: 'test',
301
- revisable: 'test',
302
- made_by: 'agent',
303
- superseded_by: null,
278
+ cleanup(dbPath);
304
279
  });
305
280
 
306
- // Try a transaction that fails the insert inside should be rolled back
307
- let threw = false;
308
- try {
309
- transaction(() => {
310
- insertDecision({
311
- id: 'D011',
312
- when_context: 'should be rolled back',
313
- scope: 'test',
314
- decision: 'test',
315
- choice: 'test',
316
- rationale: 'test',
317
- revisable: 'test',
318
- made_by: 'agent',
319
- superseded_by: null,
320
- });
321
- throw new Error('intentional failure');
281
+ test('gsd-db: transaction rollback on error', () => {
282
+ openDatabase(':memory:');
283
+
284
+ // Insert a decision normally
285
+ insertDecision({
286
+ id: 'D010',
287
+ when_context: 'test',
288
+ scope: 'test',
289
+ decision: 'test',
290
+ choice: 'test',
291
+ rationale: 'test',
292
+ revisable: 'test',
293
+ made_by: 'agent',
294
+ superseded_by: null,
322
295
  });
323
- } catch (err) {
324
- if ((err as Error).message === 'intentional failure') {
325
- threw = true;
296
+
297
+ // Try a transaction that fails the insert inside should be rolled back
298
+ let threw = false;
299
+ try {
300
+ transaction(() => {
301
+ insertDecision({
302
+ id: 'D011',
303
+ when_context: 'should be rolled back',
304
+ scope: 'test',
305
+ decision: 'test',
306
+ choice: 'test',
307
+ rationale: 'test',
308
+ revisable: 'test',
309
+ made_by: 'agent',
310
+ superseded_by: null,
311
+ });
312
+ throw new Error('intentional failure');
313
+ });
314
+ } catch (err) {
315
+ if ((err as Error).message === 'intentional failure') {
316
+ threw = true;
317
+ }
326
318
  }
327
- }
328
319
 
329
- assertTrue(threw, 'transaction should re-throw the error');
330
- const d11 = getDecisionById('D011');
331
- assertEq(d11, null, 'D011 should be rolled back (not found)');
320
+ assert.ok(threw, 'transaction should re-throw the error');
321
+ const d11 = getDecisionById('D011');
322
+ assert.deepStrictEqual(d11, null, 'D011 should be rolled back (not found)');
332
323
 
333
- // D010 should still be there
334
- const d10 = getDecisionById('D010');
335
- assertTrue(d10 !== null, 'D010 should survive the failed transaction');
324
+ // D010 should still be there
325
+ const d10 = getDecisionById('D010');
326
+ assert.ok(d10 !== null, 'D010 should survive the failed transaction');
336
327
 
337
- closeDatabase();
338
- }
328
+ closeDatabase();
329
+ });
339
330
 
340
- console.log('\n=== gsd-db: query wrappers return null/empty when DB unavailable ===');
341
- {
342
- // Ensure DB is closed
343
- closeDatabase();
344
- assertTrue(!isDbAvailable(), 'DB should not be available');
331
+ test('gsd-db: query wrappers return null/empty when DB unavailable', () => {
332
+ // Ensure DB is closed
333
+ closeDatabase();
334
+ assert.ok(!isDbAvailable(), 'DB should not be available');
345
335
 
346
- const d = getDecisionById('D001');
347
- assertEq(d, null, 'getDecisionById returns null when DB closed');
336
+ const d = getDecisionById('D001');
337
+ assert.deepStrictEqual(d, null, 'getDecisionById returns null when DB closed');
348
338
 
349
- const r = getRequirementById('R001');
350
- assertEq(r, null, 'getRequirementById returns null when DB closed');
339
+ const r = getRequirementById('R001');
340
+ assert.deepStrictEqual(r, null, 'getRequirementById returns null when DB closed');
351
341
 
352
- const ad = getActiveDecisions();
353
- assertEq(ad, [], 'getActiveDecisions returns [] when DB closed');
342
+ const ad = getActiveDecisions();
343
+ assert.deepStrictEqual(ad, [], 'getActiveDecisions returns [] when DB closed');
354
344
 
355
- const ar = getActiveRequirements();
356
- assertEq(ar, [], 'getActiveRequirements returns [] when DB closed');
357
- }
345
+ const ar = getActiveRequirements();
346
+ assert.deepStrictEqual(ar, [], 'getActiveRequirements returns [] when DB closed');
347
+ });
348
+
349
+ // ─── Final Report ──────────────────────────────────────────────────────────
358
350
 
359
- // ─── Final Report ──────────────────────────────────────────────────────────
360
- report();
351
+ });