gsd-pi 2.44.0 → 2.45.0-dev.6b9da3e

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 (463) hide show
  1. package/README.md +30 -12
  2. package/dist/resources/extensions/gsd/activity-log.js +7 -0
  3. package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
  4. package/dist/resources/extensions/gsd/auto/phases.js +37 -36
  5. package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
  6. package/dist/resources/extensions/gsd/auto-start.js +31 -2
  7. package/dist/resources/extensions/gsd/auto-timers.js +57 -3
  8. package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
  9. package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
  10. package/dist/resources/extensions/gsd/auto.js +30 -3
  11. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
  12. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  13. package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
  14. package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
  15. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  16. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  17. package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
  18. package/dist/resources/extensions/gsd/db-writer.js +34 -16
  19. package/dist/resources/extensions/gsd/doctor.js +8 -0
  20. package/dist/resources/extensions/gsd/git-service.js +8 -3
  21. package/dist/resources/extensions/gsd/gsd-db.js +12 -1
  22. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  23. package/dist/resources/extensions/gsd/preferences.js +9 -1
  24. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  25. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  26. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  27. package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  28. package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
  29. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  30. package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
  31. package/dist/resources/extensions/gsd/repo-identity.js +45 -7
  32. package/dist/resources/extensions/gsd/rethink.js +115 -0
  33. package/dist/resources/extensions/gsd/state.js +41 -3
  34. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
  35. package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
  36. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
  37. package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
  38. package/dist/resources/extensions/gsd/worktree-manager.js +32 -2
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
  40. package/dist/resources/extensions/mcp-client/index.js +14 -0
  41. package/dist/web/standalone/.next/BUILD_ID +1 -1
  42. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  43. package/dist/web/standalone/.next/build-manifest.json +4 -4
  44. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  45. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  46. package/dist/web/standalone/.next/required-server-files.json +3 -3
  47. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  48. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  50. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  58. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  60. package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
  61. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  62. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  64. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  67. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  74. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  112. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  118. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  132. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  134. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  136. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  138. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/index.html +1 -1
  148. package/dist/web/standalone/.next/server/app/index.rsc +6 -6
  149. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  150. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
  151. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  153. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  154. package/dist/web/standalone/.next/server/app/page.js +2 -2
  155. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  157. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  158. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  159. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/middleware.js +2 -2
  162. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  164. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  165. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  166. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  167. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
  168. package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
  169. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  170. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  171. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
  172. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  173. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  174. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
  175. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
  176. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  177. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  178. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  179. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  180. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  181. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  182. package/dist/web/standalone/server.js +1 -1
  183. package/package.json +1 -1
  184. package/packages/native/dist/stream-process/index.js +2 -2
  185. package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
  186. package/packages/native/src/stream-process/index.ts +2 -2
  187. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
  188. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
  190. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  192. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  194. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  196. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
  198. package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
  199. package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
  200. package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
  201. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
  202. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
  204. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  206. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  208. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  210. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
  212. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  214. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/main.js +17 -0
  217. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
  219. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
  220. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
  221. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
  222. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  226. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  227. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
  229. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  230. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
  234. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  235. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
  236. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
  238. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  239. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
  243. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
  246. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  248. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  249. package/packages/pi-coding-agent/package.json +1 -1
  250. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  251. package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
  252. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  253. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  254. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  255. package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
  256. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  257. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  258. package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
  259. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  260. package/packages/pi-coding-agent/src/main.ts +19 -0
  261. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
  262. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
  263. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  264. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
  265. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
  266. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
  267. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
  268. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
  269. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  270. package/pkg/package.json +1 -1
  271. package/src/resources/extensions/gsd/activity-log.ts +1 -0
  272. package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
  273. package/src/resources/extensions/gsd/auto/phases.ts +46 -48
  274. package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
  275. package/src/resources/extensions/gsd/auto-start.ts +39 -2
  276. package/src/resources/extensions/gsd/auto-timers.ts +64 -3
  277. package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
  278. package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
  279. package/src/resources/extensions/gsd/auto.ts +37 -3
  280. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
  281. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  282. package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
  283. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
  284. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  285. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  286. package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
  287. package/src/resources/extensions/gsd/db-writer.ts +39 -17
  288. package/src/resources/extensions/gsd/doctor.ts +7 -1
  289. package/src/resources/extensions/gsd/git-service.ts +6 -2
  290. package/src/resources/extensions/gsd/gsd-db.ts +16 -1
  291. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  292. package/src/resources/extensions/gsd/preferences.ts +11 -1
  293. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
  294. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  295. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
  296. package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
  297. package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
  298. package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
  299. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  300. package/src/resources/extensions/gsd/repo-identity.ts +46 -7
  301. package/src/resources/extensions/gsd/rethink.ts +154 -0
  302. package/src/resources/extensions/gsd/state.ts +41 -1
  303. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  304. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  305. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  306. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
  307. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  308. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  309. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  310. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  311. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  312. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  313. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  314. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  315. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  316. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  317. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  318. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  319. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  320. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  321. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  322. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
  323. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  324. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  325. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  326. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  327. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  328. package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
  329. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  330. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  331. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
  332. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
  333. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  334. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  335. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  336. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  337. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  338. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  339. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  340. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  341. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  342. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  343. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  344. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  345. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  346. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  347. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  348. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  349. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  350. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  351. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  352. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
  353. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  354. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  355. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  356. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  357. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  358. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  359. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  360. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  361. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  362. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  363. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  364. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  365. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  366. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  367. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  368. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  369. package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
  370. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
  371. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  372. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  373. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  374. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  375. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  376. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  377. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  378. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
  379. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  380. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  381. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  382. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
  383. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  384. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  385. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  386. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  387. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  388. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  389. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  390. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  391. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  392. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  393. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  394. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  395. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  396. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  397. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  398. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  399. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  400. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  401. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  402. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
  403. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  404. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  405. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  406. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  407. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  408. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  409. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  410. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
  411. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  412. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  413. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  414. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  415. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  416. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  417. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  418. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  419. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  420. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  421. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  422. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  423. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
  424. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
  425. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  426. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
  427. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  428. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  429. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
  430. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  431. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  432. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  433. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  434. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  435. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  436. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  437. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  438. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  439. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  440. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  441. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  442. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  443. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  444. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  445. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
  446. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  447. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  448. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  449. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
  450. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
  451. package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
  452. package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
  453. package/src/resources/extensions/gsd/worktree-manager.ts +43 -2
  454. package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
  455. package/src/resources/extensions/mcp-client/index.ts +20 -0
  456. package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
  457. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
  458. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  459. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  460. package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
  461. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
  462. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_buildManifest.js +0 -0
  463. /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_ssgManifest.js +0 -0
@@ -1,4 +1,3 @@
1
- import { createTestContext } from './test-helpers.ts';
2
1
  import { parseMemoryResponse, _resetExtractionState } from '../memory-extractor.ts';
3
2
  import {
4
3
  openDatabase,
@@ -10,15 +9,14 @@ import {
10
9
  getActiveMemoriesRanked,
11
10
  } from '../memory-store.ts';
12
11
  import type { MemoryAction } from '../memory-store.ts';
13
-
14
- const { assertEq, assertTrue, report } = createTestContext();
12
+ import { describe, test, beforeEach, afterEach } from 'node:test';
13
+ import assert from 'node:assert/strict';
15
14
 
16
15
  // ═══════════════════════════════════════════════════════════════════════════
17
16
  // memory-extractor: parse valid JSON response
18
17
  // ═══════════════════════════════════════════════════════════════════════════
19
18
 
20
- console.log('\n=== memory-extractor: parse valid JSON ===');
21
- {
19
+ test('memory-extractor: parse valid JSON', () => {
22
20
  const response = JSON.stringify([
23
21
  { action: 'CREATE', category: 'gotcha', content: 'esbuild drops binaries', confidence: 0.85 },
24
22
  { action: 'REINFORCE', id: 'MEM001' },
@@ -27,56 +25,52 @@ console.log('\n=== memory-extractor: parse valid JSON ===');
27
25
  ]);
28
26
 
29
27
  const actions = parseMemoryResponse(response);
30
- assertEq(actions.length, 4, 'should parse 4 actions');
31
- assertEq(actions[0].action, 'CREATE', 'first action should be CREATE');
32
- assertEq((actions[0] as any).category, 'gotcha', 'CREATE category');
33
- assertEq((actions[0] as any).confidence, 0.85, 'CREATE confidence');
34
- assertEq(actions[1].action, 'REINFORCE', 'second action should be REINFORCE');
35
- assertEq(actions[2].action, 'UPDATE', 'third action should be UPDATE');
36
- assertEq(actions[3].action, 'SUPERSEDE', 'fourth action should be SUPERSEDE');
37
- }
28
+ assert.deepStrictEqual(actions.length, 4, 'should parse 4 actions');
29
+ assert.deepStrictEqual(actions[0].action, 'CREATE', 'first action should be CREATE');
30
+ assert.deepStrictEqual((actions[0] as any).category, 'gotcha', 'CREATE category');
31
+ assert.deepStrictEqual((actions[0] as any).confidence, 0.85, 'CREATE confidence');
32
+ assert.deepStrictEqual(actions[1].action, 'REINFORCE', 'second action should be REINFORCE');
33
+ assert.deepStrictEqual(actions[2].action, 'UPDATE', 'third action should be UPDATE');
34
+ assert.deepStrictEqual(actions[3].action, 'SUPERSEDE', 'fourth action should be SUPERSEDE');
35
+ });
38
36
 
39
37
  // ═══════════════════════════════════════════════════════════════════════════
40
38
  // memory-extractor: parse fenced JSON response
41
39
  // ═══════════════════════════════════════════════════════════════════════════
42
40
 
43
- console.log('\n=== memory-extractor: parse fenced JSON ===');
44
- {
41
+ test('memory-extractor: parse fenced JSON', () => {
45
42
  const response = '```json\n[\n {"action": "CREATE", "category": "convention", "content": "test memory"}\n]\n```';
46
43
 
47
44
  const actions = parseMemoryResponse(response);
48
- assertEq(actions.length, 1, 'should parse 1 action from fenced JSON');
49
- assertEq(actions[0].action, 'CREATE', 'action should be CREATE');
50
- }
45
+ assert.deepStrictEqual(actions.length, 1, 'should parse 1 action from fenced JSON');
46
+ assert.deepStrictEqual(actions[0].action, 'CREATE', 'action should be CREATE');
47
+ });
51
48
 
52
49
  // ═══════════════════════════════════════════════════════════════════════════
53
50
  // memory-extractor: parse empty array response
54
51
  // ═══════════════════════════════════════════════════════════════════════════
55
52
 
56
- console.log('\n=== memory-extractor: parse empty array ===');
57
- {
53
+ test('memory-extractor: parse empty array', () => {
58
54
  const actions = parseMemoryResponse('[]');
59
- assertEq(actions.length, 0, 'empty array should parse to empty actions');
60
- }
55
+ assert.deepStrictEqual(actions.length, 0, 'empty array should parse to empty actions');
56
+ });
61
57
 
62
58
  // ═══════════════════════════════════════════════════════════════════════════
63
59
  // memory-extractor: parse malformed response
64
60
  // ═══════════════════════════════════════════════════════════════════════════
65
61
 
66
- console.log('\n=== memory-extractor: malformed responses ===');
67
- {
68
- assertEq(parseMemoryResponse('not json at all'), [], 'garbage text should return []');
69
- assertEq(parseMemoryResponse('{"action": "CREATE"}'), [], 'non-array should return []');
70
- assertEq(parseMemoryResponse(''), [], 'empty string should return []');
71
- assertEq(parseMemoryResponse('```\nbroken\n```'), [], 'fenced non-JSON should return []');
72
- }
62
+ test('memory-extractor: malformed responses', () => {
63
+ assert.deepStrictEqual(parseMemoryResponse('not json at all'), [], 'garbage text should return []');
64
+ assert.deepStrictEqual(parseMemoryResponse('{"action": "CREATE"}'), [], 'non-array should return []');
65
+ assert.deepStrictEqual(parseMemoryResponse(''), [], 'empty string should return []');
66
+ assert.deepStrictEqual(parseMemoryResponse('```\nbroken\n```'), [], 'fenced non-JSON should return []');
67
+ });
73
68
 
74
69
  // ═══════════════════════════════════════════════════════════════════════════
75
70
  // memory-extractor: validation of required fields
76
71
  // ═══════════════════════════════════════════════════════════════════════════
77
72
 
78
- console.log('\n=== memory-extractor: field validation ===');
79
- {
73
+ test('memory-extractor: field validation', () => {
80
74
  const response = JSON.stringify([
81
75
  // Valid CREATE
82
76
  { action: 'CREATE', category: 'gotcha', content: 'valid' },
@@ -103,19 +97,18 @@ console.log('\n=== memory-extractor: field validation ===');
103
97
  ]);
104
98
 
105
99
  const actions = parseMemoryResponse(response);
106
- assertEq(actions.length, 4, 'should only accept 4 valid actions');
107
- assertEq(actions[0].action, 'CREATE', 'first valid is CREATE');
108
- assertEq(actions[1].action, 'REINFORCE', 'second valid is REINFORCE');
109
- assertEq(actions[2].action, 'UPDATE', 'third valid is UPDATE');
110
- assertEq(actions[3].action, 'SUPERSEDE', 'fourth valid is SUPERSEDE');
111
- }
100
+ assert.deepStrictEqual(actions.length, 4, 'should only accept 4 valid actions');
101
+ assert.deepStrictEqual(actions[0].action, 'CREATE', 'first valid is CREATE');
102
+ assert.deepStrictEqual(actions[1].action, 'REINFORCE', 'second valid is REINFORCE');
103
+ assert.deepStrictEqual(actions[2].action, 'UPDATE', 'third valid is UPDATE');
104
+ assert.deepStrictEqual(actions[3].action, 'SUPERSEDE', 'fourth valid is SUPERSEDE');
105
+ });
112
106
 
113
107
  // ═══════════════════════════════════════════════════════════════════════════
114
108
  // Integration: applyMemoryActions with mixed actions
115
109
  // ═══════════════════════════════════════════════════════════════════════════
116
110
 
117
- console.log('\n=== integration: mixed action lifecycle ===');
118
- {
111
+ test('integration: mixed action lifecycle', () => {
119
112
  openDatabase(':memory:');
120
113
 
121
114
  // Phase 1: Create initial memories
@@ -126,7 +119,7 @@ console.log('\n=== integration: mixed action lifecycle ===');
126
119
  ], 'plan-slice', 'M001/S01');
127
120
 
128
121
  let active = getActiveMemoriesRanked(30);
129
- assertEq(active.length, 3, 'phase 1: 3 active memories');
122
+ assert.deepStrictEqual(active.length, 3, 'phase 1: 3 active memories');
130
123
 
131
124
  // Phase 2: Reinforce one, update another, create new
132
125
  applyMemoryActions([
@@ -136,13 +129,13 @@ console.log('\n=== integration: mixed action lifecycle ===');
136
129
  ], 'execute-task', 'M001/S01/T01');
137
130
 
138
131
  active = getActiveMemoriesRanked(30);
139
- assertEq(active.length, 4, 'phase 2: 4 active memories');
140
- assertEq(
132
+ assert.deepStrictEqual(active.length, 4, 'phase 2: 4 active memories');
133
+ assert.deepStrictEqual(
141
134
  active.find(m => m.id === 'MEM001')?.content,
142
135
  'npm run build requires tsc --noEmit first',
143
136
  'MEM001 content should be updated',
144
137
  );
145
- assertEq(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
138
+ assert.deepStrictEqual(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
146
139
 
147
140
  // Phase 3: Supersede MEM001 with MEM005
148
141
  applyMemoryActions([
@@ -151,30 +144,28 @@ console.log('\n=== integration: mixed action lifecycle ===');
151
144
  ], 'execute-task', 'M001/S01/T02');
152
145
 
153
146
  active = getActiveMemoriesRanked(30);
154
- assertEq(active.length, 4, 'phase 3: 4 active (1 superseded, 1 created)');
155
- assertTrue(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
156
- assertTrue(!!active.find(m => m.id === 'MEM005'), 'MEM005 should be active');
147
+ assert.deepStrictEqual(active.length, 4, 'phase 3: 4 active (1 superseded, 1 created)');
148
+ assert.ok(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
149
+ assert.ok(!!active.find(m => m.id === 'MEM005'), 'MEM005 should be active');
157
150
 
158
151
  // Verify ranking: MEM003 (0.85) > MEM005 (0.9) but MEM002 has 1 hit
159
152
  // MEM002: 0.8 * (1 + 1*0.1) = 0.88
160
153
  // MEM003: 0.85 * 1.0 = 0.85
161
154
  // MEM005: 0.9 * 1.0 = 0.9
162
155
  // MEM004: 0.75 * 1.0 = 0.75
163
- assertEq(active[0].id, 'MEM005', 'MEM005 should rank first (0.9)');
164
- assertEq(active[1].id, 'MEM002', 'MEM002 should rank second (0.88)');
156
+ assert.deepStrictEqual(active[0].id, 'MEM005', 'MEM005 should rank first (0.9)');
157
+ assert.deepStrictEqual(active[1].id, 'MEM002', 'MEM002 should rank second (0.88)');
165
158
 
166
159
  closeDatabase();
167
- }
160
+ });
168
161
 
169
162
  // ═══════════════════════════════════════════════════════════════════════════
170
163
  // memory-extractor: _resetExtractionState
171
164
  // ═══════════════════════════════════════════════════════════════════════════
172
165
 
173
- console.log('\n=== memory-extractor: reset extraction state ===');
174
- {
166
+ test('memory-extractor: reset extraction state', () => {
175
167
  // Just verify it doesn't throw
176
168
  _resetExtractionState();
177
- assertTrue(true, '_resetExtractionState should not throw');
178
- }
169
+ assert.ok(true, '_resetExtractionState should not throw');
170
+ });
179
171
 
180
- report();
@@ -1,4 +1,3 @@
1
- import { createTestContext } from './test-helpers.ts';
2
1
  import {
3
2
  openDatabase,
4
3
  closeDatabase,
@@ -21,94 +20,90 @@ import {
21
20
  formatMemoriesForPrompt,
22
21
  } from '../memory-store.ts';
23
22
  import type { MemoryAction } from '../memory-store.ts';
24
-
25
- const { assertEq, assertTrue, assertMatch, report } = createTestContext();
23
+ import { describe, test, beforeEach, afterEach } from 'node:test';
24
+ import assert from 'node:assert/strict';
26
25
 
27
26
  // ═══════════════════════════════════════════════════════════════════════════
28
27
  // memory-store: fallback when DB not open
29
28
  // ═══════════════════════════════════════════════════════════════════════════
30
29
 
31
- console.log('\n=== memory-store: fallback returns empty when DB not open ===');
32
- {
30
+ test('memory-store: fallback returns empty when DB not open', () => {
33
31
  closeDatabase();
34
- assertTrue(!isDbAvailable(), 'DB should not be available');
32
+ assert.ok(!isDbAvailable(), 'DB should not be available');
35
33
 
36
- assertEq(getActiveMemories(), [], 'getActiveMemories returns [] when DB closed');
37
- assertEq(getActiveMemoriesRanked(), [], 'getActiveMemoriesRanked returns [] when DB closed');
38
- assertEq(nextMemoryId(), 'MEM001', 'nextMemoryId returns MEM001 when DB closed');
39
- assertEq(createMemory({ category: 'test', content: 'test' }), null, 'createMemory returns null when DB closed');
40
- assertTrue(!reinforceMemory('MEM001'), 'reinforceMemory returns false when DB closed');
41
- assertTrue(!isUnitProcessed('test/key'), 'isUnitProcessed returns false when DB closed');
42
- }
34
+ assert.deepStrictEqual(getActiveMemories(), [], 'getActiveMemories returns [] when DB closed');
35
+ assert.deepStrictEqual(getActiveMemoriesRanked(), [], 'getActiveMemoriesRanked returns [] when DB closed');
36
+ assert.deepStrictEqual(nextMemoryId(), 'MEM001', 'nextMemoryId returns MEM001 when DB closed');
37
+ assert.deepStrictEqual(createMemory({ category: 'test', content: 'test' }), null, 'createMemory returns null when DB closed');
38
+ assert.ok(!reinforceMemory('MEM001'), 'reinforceMemory returns false when DB closed');
39
+ assert.ok(!isUnitProcessed('test/key'), 'isUnitProcessed returns false when DB closed');
40
+ });
43
41
 
44
42
  // ═══════════════════════════════════════════════════════════════════════════
45
43
  // memory-store: CRUD operations
46
44
  // ═══════════════════════════════════════════════════════════════════════════
47
45
 
48
- console.log('\n=== memory-store: create and query memories ===');
49
- {
46
+ test('memory-store: create and query memories', () => {
50
47
  openDatabase(':memory:');
51
48
 
52
49
  // Create memories
53
50
  const id1 = createMemory({ category: 'gotcha', content: 'esbuild drops .node binaries' });
54
- assertTrue(id1 !== null, 'createMemory should return an ID');
55
- assertEq(id1, 'MEM001', 'first memory ID should be MEM001');
51
+ assert.ok(id1 !== null, 'createMemory should return an ID');
52
+ assert.deepStrictEqual(id1, 'MEM001', 'first memory ID should be MEM001');
56
53
 
57
54
  const id2 = createMemory({ category: 'convention', content: 'use :memory: for tests', confidence: 0.9 });
58
- assertEq(id2, 'MEM002', 'second memory ID should be MEM002');
55
+ assert.deepStrictEqual(id2, 'MEM002', 'second memory ID should be MEM002');
59
56
 
60
57
  const id3 = createMemory({ category: 'architecture', content: 'extensions discovered from src/resources/' });
61
- assertEq(id3, 'MEM003', 'third memory ID should be MEM003');
58
+ assert.deepStrictEqual(id3, 'MEM003', 'third memory ID should be MEM003');
62
59
 
63
60
  // Query all active
64
61
  const active = getActiveMemories();
65
- assertEq(active.length, 3, 'should have 3 active memories');
66
- assertEq(active[0].category, 'gotcha', 'first memory category');
67
- assertEq(active[0].content, 'esbuild drops .node binaries', 'first memory content');
68
- assertEq(active[1].confidence, 0.9, 'second memory confidence');
62
+ assert.deepStrictEqual(active.length, 3, 'should have 3 active memories');
63
+ assert.deepStrictEqual(active[0].category, 'gotcha', 'first memory category');
64
+ assert.deepStrictEqual(active[0].content, 'esbuild drops .node binaries', 'first memory content');
65
+ assert.deepStrictEqual(active[1].confidence, 0.9, 'second memory confidence');
69
66
 
70
67
  closeDatabase();
71
- }
68
+ });
72
69
 
73
70
  // ═══════════════════════════════════════════════════════════════════════════
74
71
  // memory-store: update and reinforce
75
72
  // ═══════════════════════════════════════════════════════════════════════════
76
73
 
77
- console.log('\n=== memory-store: update and reinforce ===');
78
- {
74
+ test('memory-store: update and reinforce', () => {
79
75
  openDatabase(':memory:');
80
76
 
81
77
  createMemory({ category: 'gotcha', content: 'original content' });
82
78
 
83
79
  // Update content
84
80
  const updated = updateMemoryContent('MEM001', 'revised content', 0.95);
85
- assertTrue(updated, 'updateMemoryContent should return true');
81
+ assert.ok(updated, 'updateMemoryContent should return true');
86
82
 
87
83
  const active = getActiveMemories();
88
- assertEq(active[0].content, 'revised content', 'content should be updated');
89
- assertEq(active[0].confidence, 0.95, 'confidence should be updated');
84
+ assert.deepStrictEqual(active[0].content, 'revised content', 'content should be updated');
85
+ assert.deepStrictEqual(active[0].confidence, 0.95, 'confidence should be updated');
90
86
 
91
87
  // Reinforce
92
88
  const reinforced = reinforceMemory('MEM001');
93
- assertTrue(reinforced, 'reinforceMemory should return true');
89
+ assert.ok(reinforced, 'reinforceMemory should return true');
94
90
 
95
91
  const after = getActiveMemories();
96
- assertEq(after[0].hit_count, 1, 'hit_count should be 1 after reinforce');
92
+ assert.deepStrictEqual(after[0].hit_count, 1, 'hit_count should be 1 after reinforce');
97
93
 
98
94
  // Reinforce again
99
95
  reinforceMemory('MEM001');
100
96
  const after2 = getActiveMemories();
101
- assertEq(after2[0].hit_count, 2, 'hit_count should be 2 after second reinforce');
97
+ assert.deepStrictEqual(after2[0].hit_count, 2, 'hit_count should be 2 after second reinforce');
102
98
 
103
99
  closeDatabase();
104
- }
100
+ });
105
101
 
106
102
  // ═══════════════════════════════════════════════════════════════════════════
107
103
  // memory-store: supersede
108
104
  // ═══════════════════════════════════════════════════════════════════════════
109
105
 
110
- console.log('\n=== memory-store: supersede ===');
111
- {
106
+ test('memory-store: supersede', () => {
112
107
  openDatabase(':memory:');
113
108
 
114
109
  createMemory({ category: 'convention', content: 'old convention' });
@@ -117,18 +112,17 @@ console.log('\n=== memory-store: supersede ===');
117
112
  supersedeMemory('MEM001', 'MEM002');
118
113
 
119
114
  const active = getActiveMemories();
120
- assertEq(active.length, 1, 'should have 1 active memory after supersede');
121
- assertEq(active[0].id, 'MEM002', 'active memory should be MEM002');
115
+ assert.deepStrictEqual(active.length, 1, 'should have 1 active memory after supersede');
116
+ assert.deepStrictEqual(active[0].id, 'MEM002', 'active memory should be MEM002');
122
117
 
123
118
  closeDatabase();
124
- }
119
+ });
125
120
 
126
121
  // ═══════════════════════════════════════════════════════════════════════════
127
122
  // memory-store: ranked query ordering
128
123
  // ═══════════════════════════════════════════════════════════════════════════
129
124
 
130
- console.log('\n=== memory-store: ranked query ordering ===');
131
- {
125
+ test('memory-store: ranked query ordering', () => {
132
126
  openDatabase(':memory:');
133
127
 
134
128
  // Low confidence, no hits
@@ -142,45 +136,43 @@ console.log('\n=== memory-store: ranked query ordering ===');
142
136
  for (let i = 0; i < 10; i++) reinforceMemory('MEM003');
143
137
 
144
138
  const ranked = getActiveMemoriesRanked(10);
145
- assertEq(ranked.length, 3, 'should have 3 ranked memories');
139
+ assert.deepStrictEqual(ranked.length, 3, 'should have 3 ranked memories');
146
140
  // MEM003: 0.7 * (1 + 10*0.1) = 0.7 * 2.0 = 1.4
147
141
  // MEM002: 0.95 * (1 + 0*0.1) = 0.95
148
142
  // MEM001: 0.5 * (1 + 0*0.1) = 0.5
149
- assertEq(ranked[0].id, 'MEM003', 'highest ranked should be MEM003 (reinforced)');
150
- assertEq(ranked[1].id, 'MEM002', 'second ranked should be MEM002 (high confidence)');
151
- assertEq(ranked[2].id, 'MEM001', 'lowest ranked should be MEM001');
143
+ assert.deepStrictEqual(ranked[0].id, 'MEM003', 'highest ranked should be MEM003 (reinforced)');
144
+ assert.deepStrictEqual(ranked[1].id, 'MEM002', 'second ranked should be MEM002 (high confidence)');
145
+ assert.deepStrictEqual(ranked[2].id, 'MEM001', 'lowest ranked should be MEM001');
152
146
 
153
147
  // Test limit
154
148
  const limited = getActiveMemoriesRanked(2);
155
- assertEq(limited.length, 2, 'limit should cap results');
149
+ assert.deepStrictEqual(limited.length, 2, 'limit should cap results');
156
150
 
157
151
  closeDatabase();
158
- }
152
+ });
159
153
 
160
154
  // ═══════════════════════════════════════════════════════════════════════════
161
155
  // memory-store: processed unit tracking
162
156
  // ═══════════════════════════════════════════════════════════════════════════
163
157
 
164
- console.log('\n=== memory-store: processed unit tracking ===');
165
- {
158
+ test('memory-store: processed unit tracking', () => {
166
159
  openDatabase(':memory:');
167
160
 
168
- assertTrue(!isUnitProcessed('execute-task/M001/S01/T01'), 'should not be processed initially');
161
+ assert.ok(!isUnitProcessed('execute-task/M001/S01/T01'), 'should not be processed initially');
169
162
 
170
163
  markUnitProcessed('execute-task/M001/S01/T01', '/path/to/activity.jsonl');
171
164
 
172
- assertTrue(isUnitProcessed('execute-task/M001/S01/T01'), 'should be processed after marking');
173
- assertTrue(!isUnitProcessed('execute-task/M001/S01/T02'), 'different key should not be processed');
165
+ assert.ok(isUnitProcessed('execute-task/M001/S01/T01'), 'should be processed after marking');
166
+ assert.ok(!isUnitProcessed('execute-task/M001/S01/T02'), 'different key should not be processed');
174
167
 
175
168
  closeDatabase();
176
- }
169
+ });
177
170
 
178
171
  // ═══════════════════════════════════════════════════════════════════════════
179
172
  // memory-store: enforce memory cap
180
173
  // ═══════════════════════════════════════════════════════════════════════════
181
174
 
182
- console.log('\n=== memory-store: enforce memory cap ===');
183
- {
175
+ test('memory-store: enforce memory cap', () => {
184
176
  openDatabase(':memory:');
185
177
 
186
178
  // Create 5 memories with varying confidence
@@ -194,23 +186,22 @@ console.log('\n=== memory-store: enforce memory cap ===');
194
186
  enforceMemoryCap(3);
195
187
 
196
188
  const active = getActiveMemories();
197
- assertEq(active.length, 3, 'should have 3 active memories after cap enforcement');
189
+ assert.deepStrictEqual(active.length, 3, 'should have 3 active memories after cap enforcement');
198
190
 
199
191
  // The 2 lowest-ranked (MEM003=0.3 and MEM002=0.5) should be superseded
200
192
  const ids = active.map(m => m.id).sort();
201
- assertTrue(ids.includes('MEM001'), 'MEM001 (0.9) should survive');
202
- assertTrue(ids.includes('MEM004'), 'MEM004 (0.95) should survive');
203
- assertTrue(ids.includes('MEM005'), 'MEM005 (0.7) should survive');
193
+ assert.ok(ids.includes('MEM001'), 'MEM001 (0.9) should survive');
194
+ assert.ok(ids.includes('MEM004'), 'MEM004 (0.95) should survive');
195
+ assert.ok(ids.includes('MEM005'), 'MEM005 (0.7) should survive');
204
196
 
205
197
  closeDatabase();
206
- }
198
+ });
207
199
 
208
200
  // ═══════════════════════════════════════════════════════════════════════════
209
201
  // memory-store: applyMemoryActions transaction
210
202
  // ═══════════════════════════════════════════════════════════════════════════
211
203
 
212
- console.log('\n=== memory-store: applyMemoryActions ===');
213
- {
204
+ test('memory-store: applyMemoryActions', () => {
214
205
  openDatabase(':memory:');
215
206
 
216
207
  const actions: MemoryAction[] = [
@@ -221,7 +212,7 @@ console.log('\n=== memory-store: applyMemoryActions ===');
221
212
  applyMemoryActions(actions, 'execute-task', 'M001/S01/T01');
222
213
 
223
214
  let active = getActiveMemories();
224
- assertEq(active.length, 2, 'should have 2 memories after CREATE actions');
215
+ assert.deepStrictEqual(active.length, 2, 'should have 2 memories after CREATE actions');
225
216
 
226
217
  // Now apply UPDATE + REINFORCE
227
218
  const updateActions: MemoryAction[] = [
@@ -232,8 +223,8 @@ console.log('\n=== memory-store: applyMemoryActions ===');
232
223
  applyMemoryActions(updateActions, 'execute-task', 'M001/S01/T02');
233
224
 
234
225
  active = getActiveMemories();
235
- assertEq(active.find(m => m.id === 'MEM001')?.content, 'updated gotcha', 'MEM001 should be updated');
236
- assertEq(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
226
+ assert.deepStrictEqual(active.find(m => m.id === 'MEM001')?.content, 'updated gotcha', 'MEM001 should be updated');
227
+ assert.deepStrictEqual(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
237
228
 
238
229
  // SUPERSEDE
239
230
  const supersedeActions: MemoryAction[] = [
@@ -244,19 +235,18 @@ console.log('\n=== memory-store: applyMemoryActions ===');
244
235
  applyMemoryActions(supersedeActions, 'execute-task', 'M001/S01/T03');
245
236
 
246
237
  active = getActiveMemories();
247
- assertEq(active.length, 2, 'should have 2 active after supersede');
248
- assertTrue(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
249
- assertTrue(!!active.find(m => m.id === 'MEM003'), 'MEM003 should be active');
238
+ assert.deepStrictEqual(active.length, 2, 'should have 2 active after supersede');
239
+ assert.ok(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
240
+ assert.ok(!!active.find(m => m.id === 'MEM003'), 'MEM003 should be active');
250
241
 
251
242
  closeDatabase();
252
- }
243
+ });
253
244
 
254
245
  // ═══════════════════════════════════════════════════════════════════════════
255
246
  // memory-store: formatMemoriesForPrompt
256
247
  // ═══════════════════════════════════════════════════════════════════════════
257
248
 
258
- console.log('\n=== memory-store: formatMemoriesForPrompt ===');
259
- {
249
+ test('memory-store: formatMemoriesForPrompt', () => {
260
250
  openDatabase(':memory:');
261
251
 
262
252
  createMemory({ category: 'gotcha', content: 'esbuild drops .node binaries' });
@@ -267,18 +257,18 @@ console.log('\n=== memory-store: formatMemoriesForPrompt ===');
267
257
  const memories = getActiveMemoriesRanked(30);
268
258
  const formatted = formatMemoriesForPrompt(memories);
269
259
 
270
- assertTrue(formatted.includes('## Project Memory (auto-learned)'), 'should have header');
271
- assertTrue(formatted.includes('### Gotcha'), 'should have gotcha category');
272
- assertTrue(formatted.includes('### Convention'), 'should have convention category');
273
- assertTrue(formatted.includes('### Architecture'), 'should have architecture category');
274
- assertTrue(formatted.includes('- esbuild drops .node binaries'), 'should have gotcha content');
275
- assertTrue(formatted.includes('- use :memory: for tests'), 'should have convention content');
260
+ assert.ok(formatted.includes('## Project Memory (auto-learned)'), 'should have header');
261
+ assert.ok(formatted.includes('### Gotcha'), 'should have gotcha category');
262
+ assert.ok(formatted.includes('### Convention'), 'should have convention category');
263
+ assert.ok(formatted.includes('### Architecture'), 'should have architecture category');
264
+ assert.ok(formatted.includes('- esbuild drops .node binaries'), 'should have gotcha content');
265
+ assert.ok(formatted.includes('- use :memory: for tests'), 'should have convention content');
276
266
 
277
267
  // Test empty memories
278
268
  closeDatabase();
279
269
  openDatabase(':memory:');
280
270
  const emptyFormatted = formatMemoriesForPrompt([]);
281
- assertEq(emptyFormatted, '', 'empty memories should return empty string');
271
+ assert.deepStrictEqual(emptyFormatted, '', 'empty memories should return empty string');
282
272
 
283
273
  // Test token budget truncation
284
274
  closeDatabase();
@@ -288,58 +278,55 @@ console.log('\n=== memory-store: formatMemoriesForPrompt ===');
288
278
  }
289
279
  const budgetMemories = getActiveMemoriesRanked(30);
290
280
  const truncated = formatMemoriesForPrompt(budgetMemories, 500);
291
- assertTrue(truncated.length < 2500, `formatted length ${truncated.length} should be under budget`);
281
+ assert.ok(truncated.length < 2500, `formatted length ${truncated.length} should be under budget`);
292
282
 
293
283
  closeDatabase();
294
- }
284
+ });
295
285
 
296
286
  // ═══════════════════════════════════════════════════════════════════════════
297
287
  // memory-store: ID generation
298
288
  // ═══════════════════════════════════════════════════════════════════════════
299
289
 
300
- console.log('\n=== memory-store: ID generation ===');
301
- {
290
+ test('memory-store: ID generation', () => {
302
291
  openDatabase(':memory:');
303
292
 
304
- assertEq(nextMemoryId(), 'MEM001', 'first ID should be MEM001');
293
+ assert.deepStrictEqual(nextMemoryId(), 'MEM001', 'first ID should be MEM001');
305
294
 
306
295
  createMemory({ category: 'test', content: 'test' });
307
- assertEq(nextMemoryId(), 'MEM002', 'after first create, next should be MEM002');
296
+ assert.deepStrictEqual(nextMemoryId(), 'MEM002', 'after first create, next should be MEM002');
308
297
 
309
298
  // Create several more
310
299
  for (let i = 0; i < 98; i++) createMemory({ category: 'test', content: `test ${i}` });
311
- assertEq(nextMemoryId(), 'MEM100', 'after 99 creates, next should be MEM100');
300
+ assert.deepStrictEqual(nextMemoryId(), 'MEM100', 'after 99 creates, next should be MEM100');
312
301
 
313
302
  closeDatabase();
314
- }
303
+ });
315
304
 
316
305
  // ═══════════════════════════════════════════════════════════════════════════
317
306
  // memory-store: schema migration (v2 → v3)
318
307
  // ═══════════════════════════════════════════════════════════════════════════
319
308
 
320
- console.log('\n=== memory-store: schema includes memories table ===');
321
- {
309
+ test('memory-store: schema includes memories table', () => {
322
310
  openDatabase(':memory:');
323
311
 
324
312
  const adapter = _getAdapter()!;
325
313
 
326
314
  // Verify memories table exists
327
315
  const memCount = adapter.prepare('SELECT count(*) as cnt FROM memories').get();
328
- assertEq(memCount?.['cnt'], 0, 'memories table should exist and be empty');
316
+ assert.deepStrictEqual(memCount?.['cnt'], 0, 'memories table should exist and be empty');
329
317
 
330
318
  // Verify memory_processed_units table exists
331
319
  const procCount = adapter.prepare('SELECT count(*) as cnt FROM memory_processed_units').get();
332
- assertEq(procCount?.['cnt'], 0, 'memory_processed_units table should exist and be empty');
320
+ assert.deepStrictEqual(procCount?.['cnt'], 0, 'memory_processed_units table should exist and be empty');
333
321
 
334
322
  // Verify active_memories view exists
335
323
  const viewCount = adapter.prepare('SELECT count(*) as cnt FROM active_memories').get();
336
- assertEq(viewCount?.['cnt'], 0, 'active_memories view should exist');
324
+ assert.deepStrictEqual(viewCount?.['cnt'], 0, 'active_memories view should exist');
337
325
 
338
326
  // Verify schema version is 10 (after M001 planning migrations)
339
327
  const version = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
340
- assertEq(version?.['v'], 10, 'schema version should be 10');
328
+ assert.deepStrictEqual(version?.['v'], 10, 'schema version should be 10');
341
329
 
342
330
  closeDatabase();
343
- }
331
+ });
344
332
 
345
- report();