gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd

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 (693) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  5. package/dist/resources/extensions/github-sync/sync.js +2 -1
  6. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  7. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  8. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  9. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  12. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  13. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  14. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  15. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  16. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  17. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  18. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  19. package/dist/resources/extensions/gsd/auto.js +1 -4
  20. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  21. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  23. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  27. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  29. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  30. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  31. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  32. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  33. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  34. package/dist/resources/extensions/gsd/doctor.js +46 -282
  35. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  36. package/dist/resources/extensions/gsd/files.js +14 -198
  37. package/dist/resources/extensions/gsd/git-service.js +4 -0
  38. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  39. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  40. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  41. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  42. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  43. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  44. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  45. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  46. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  47. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  49. package/dist/resources/extensions/gsd/preferences.js +1 -0
  50. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  51. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  52. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  53. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  58. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  59. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  60. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  61. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  62. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  63. package/dist/resources/extensions/gsd/state.js +484 -30
  64. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  65. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  66. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  67. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  68. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  69. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  70. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  71. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  72. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  73. package/dist/resources/extensions/gsd/undo.js +197 -3
  74. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  75. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
  78. package/dist/web/standalone/.next/build-manifest.json +4 -4
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  81. package/dist/web/standalone/.next/required-server-files.json +4 -4
  82. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  83. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  84. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  86. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  94. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  103. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  166. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  168. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/index.html +1 -1
  185. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  186. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  188. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  190. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/page.js +2 -2
  192. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
  194. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  195. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  196. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  197. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/middleware.js +2 -2
  200. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  202. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  203. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  204. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  205. package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
  206. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  207. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  258. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  259. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  260. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  262. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  263. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  265. package/dist/web/standalone/server.js +1 -1
  266. package/package.json +4 -4
  267. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  268. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models.custom.js +170 -0
  270. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  271. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models.js +16 -1
  273. package/packages/pi-ai/dist/models.js.map +1 -1
  274. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  275. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  276. package/packages/pi-ai/dist/models.test.js +67 -0
  277. package/packages/pi-ai/dist/models.test.js.map +1 -0
  278. package/packages/pi-ai/src/models.custom.ts +172 -0
  279. package/packages/pi-ai/src/models.test.ts +85 -0
  280. package/packages/pi-ai/src/models.ts +17 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  282. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  284. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  286. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  288. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  294. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  296. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  299. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  301. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  303. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  307. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  311. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  313. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  315. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  317. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  319. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  321. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  323. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  325. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  327. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  329. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  331. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  333. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  335. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  337. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  339. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  341. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  344. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  346. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  348. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/index.js +1 -0
  352. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/main.js +11 -199
  355. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  363. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  366. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  370. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  373. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  375. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  376. package/packages/pi-coding-agent/package.json +1 -1
  377. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  378. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  379. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  380. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  381. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  382. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  383. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  384. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  387. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  389. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  390. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  391. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  393. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  394. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  395. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  396. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  397. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  398. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  399. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  400. package/packages/pi-coding-agent/src/index.ts +7 -0
  401. package/packages/pi-coding-agent/src/main.ts +11 -232
  402. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  403. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  404. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  405. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  406. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  407. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/package.json +1 -1
  413. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  414. package/src/resources/extensions/github-sync/sync.ts +2 -1
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  416. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  417. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  418. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  419. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  420. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  421. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  422. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  423. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  424. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  425. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  426. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  427. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  428. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  429. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  430. package/src/resources/extensions/gsd/auto.ts +0 -9
  431. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  433. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  434. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  436. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  437. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  438. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  439. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  440. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  441. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  442. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  443. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  444. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  445. package/src/resources/extensions/gsd/doctor.ts +45 -295
  446. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  447. package/src/resources/extensions/gsd/files.ts +16 -220
  448. package/src/resources/extensions/gsd/git-service.ts +4 -0
  449. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  450. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  451. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  452. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  453. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  455. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  458. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  459. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  460. package/src/resources/extensions/gsd/preferences.ts +1 -0
  461. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  462. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  464. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  468. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  469. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  470. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  471. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  472. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  473. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  474. package/src/resources/extensions/gsd/state.ts +547 -29
  475. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  476. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  477. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  479. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  480. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
  482. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  483. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  484. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  485. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
  486. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  487. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  488. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  489. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  490. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  491. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  492. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  493. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
  494. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
  495. package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
  496. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  497. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  498. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  499. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  500. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  501. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  502. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  503. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  504. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
  505. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
  506. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  507. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  508. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  509. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  510. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
  511. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  512. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  513. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
  514. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  515. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
  516. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
  517. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  518. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
  519. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  520. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  521. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
  522. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  523. package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  525. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  526. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  527. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  528. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  529. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
  530. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  531. package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
  532. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  533. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  534. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  535. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  536. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  537. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  538. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  539. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  540. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
  541. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  542. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  543. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  544. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  545. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  547. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
  548. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  549. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  550. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  551. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  552. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  553. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  554. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  555. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  556. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
  557. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
  558. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  559. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  560. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  561. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  562. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  563. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  564. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  565. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  566. package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
  567. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  568. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  571. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  572. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  573. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  574. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  575. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  576. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  577. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  578. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  579. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  580. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  581. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  582. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  583. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  584. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  585. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  586. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  587. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  588. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  589. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  591. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  592. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  593. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  594. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  595. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  596. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
  597. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  598. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  599. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  600. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  601. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  602. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  603. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
  604. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  605. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  606. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  607. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  609. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  610. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  611. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  612. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  613. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  614. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  615. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  616. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  617. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  618. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  619. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  620. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  621. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  622. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  623. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  624. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  625. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  626. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  627. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  628. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  629. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  630. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  631. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  632. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  633. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  634. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  635. package/src/resources/extensions/gsd/types.ts +50 -0
  636. package/src/resources/extensions/gsd/undo.ts +247 -3
  637. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  638. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  639. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  640. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  641. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  642. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  644. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  645. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  646. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  647. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  648. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  649. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  650. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  653. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  656. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  657. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  658. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  659. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  660. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  661. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  662. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  663. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  664. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  665. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  666. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  667. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  668. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  669. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  670. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  671. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  672. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  673. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  674. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  675. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  676. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  677. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  678. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  679. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  680. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  681. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  682. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  683. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  684. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  685. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  686. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  687. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  688. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  689. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  690. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  691. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  692. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  693. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -1,4 +1,3 @@
1
- import { createTestContext } from './test-helpers.ts';
2
1
  import * as fs from 'node:fs';
3
2
  import * as path from 'node:path';
4
3
  import * as os from 'node:os';
@@ -17,8 +16,8 @@ import {
17
16
  parseRequirementsSections,
18
17
  migrateFromMarkdown,
19
18
  } from '../md-importer.ts';
20
-
21
- const { assertEq, assertTrue, report } = createTestContext();
19
+ import { describe, test, beforeEach, afterEach } from 'node:test';
20
+ import assert from 'node:assert/strict';
22
21
 
23
22
  // ═══════════════════════════════════════════════════════════════════════════
24
23
  // Fixtures
@@ -135,43 +134,37 @@ function cleanupDir(dir: string): void {
135
134
  // md-importer: parseDecisionsTable
136
135
  // ═══════════════════════════════════════════════════════════════════════════
137
136
 
138
- console.log('\n=== md-importer: parseDecisionsTable ===');
139
-
140
- {
137
+ test('md-importer: parseDecisionsTable', () => {
141
138
  const decisions = parseDecisionsTable(DECISIONS_MD);
142
- assertEq(decisions.length, 4, 'should parse 4 decisions');
143
- assertEq(decisions[0].id, 'D001', 'first decision should be D001');
144
- assertEq(decisions[0].decision, 'SQLite library', 'D001 decision text');
145
- assertEq(decisions[0].choice, 'better-sqlite3', 'D001 choice');
146
- assertEq(decisions[0].scope, 'library', 'D001 scope');
147
- assertEq(decisions[0].revisable, 'No', 'D001 revisable');
148
- }
149
-
150
- console.log('=== md-importer: supersession detection ===');
151
-
152
- {
139
+ assert.deepStrictEqual(decisions.length, 4, 'should parse 4 decisions');
140
+ assert.deepStrictEqual(decisions[0].id, 'D001', 'first decision should be D001');
141
+ assert.deepStrictEqual(decisions[0].decision, 'SQLite library', 'D001 decision text');
142
+ assert.deepStrictEqual(decisions[0].choice, 'better-sqlite3', 'D001 choice');
143
+ assert.deepStrictEqual(decisions[0].scope, 'library', 'D001 scope');
144
+ assert.deepStrictEqual(decisions[0].revisable, 'No', 'D001 revisable');
145
+ });
146
+
147
+ test('md-importer: supersession detection', () => {
153
148
  const decisions = parseDecisionsTable(DECISIONS_MD);
154
149
 
155
150
  // D010 amends D001 → D001.superseded_by = D010
156
151
  const d001 = decisions.find(d => d.id === 'D001');
157
- assertEq(d001?.superseded_by, 'D010', 'D001 should be superseded by D010');
152
+ assert.deepStrictEqual(d001?.superseded_by, 'D010', 'D001 should be superseded by D010');
158
153
 
159
154
  // D020 amends D010 → D010.superseded_by = D020
160
155
  const d010 = decisions.find(d => d.id === 'D010');
161
- assertEq(d010?.superseded_by, 'D020', 'D010 should be superseded by D020');
156
+ assert.deepStrictEqual(d010?.superseded_by, 'D020', 'D010 should be superseded by D020');
162
157
 
163
158
  // D002 is not amended
164
159
  const d002 = decisions.find(d => d.id === 'D002');
165
- assertEq(d002?.superseded_by, null, 'D002 should not be superseded');
160
+ assert.deepStrictEqual(d002?.superseded_by, null, 'D002 should not be superseded');
166
161
 
167
162
  // D020 is the latest in chain, not superseded
168
163
  const d020 = decisions.find(d => d.id === 'D020');
169
- assertEq(d020?.superseded_by, null, 'D020 should not be superseded');
170
- }
164
+ assert.deepStrictEqual(d020?.superseded_by, null, 'D020 should not be superseded');
165
+ });
171
166
 
172
- console.log('=== md-importer: malformed/empty rows skipped ===');
173
-
174
- {
167
+ test('md-importer: malformed/empty rows skipped', () => {
175
168
  const malformedInput = `# Decisions
176
169
 
177
170
  | # | When | Scope | Decision | Choice | Rationale | Revisable? |
@@ -182,24 +175,20 @@ console.log('=== md-importer: malformed/empty rows skipped ===');
182
175
  | D003 | M001 | arch | Config | JSON | Simple | Yes |
183
176
  `;
184
177
  const decisions = parseDecisionsTable(malformedInput);
185
- assertEq(decisions.length, 2, 'should skip rows without D-prefix IDs');
186
- assertEq(decisions[0].id, 'D001', 'first valid row');
187
- assertEq(decisions[1].id, 'D003', 'second valid row (skipping malformed)');
188
- }
189
-
190
- console.log('=== md-importer: made_by backward compatibility (old 7-column format) ===');
178
+ assert.deepStrictEqual(decisions.length, 2, 'should skip rows without D-prefix IDs');
179
+ assert.deepStrictEqual(decisions[0].id, 'D001', 'first valid row');
180
+ assert.deepStrictEqual(decisions[1].id, 'D003', 'second valid row (skipping malformed)');
181
+ });
191
182
 
192
- {
183
+ test('md-importer: made_by backward compatibility (old 7-column format)', () => {
193
184
  const decisions = parseDecisionsTable(DECISIONS_MD);
194
185
  // Old format has no Made By column — should default to 'agent'
195
186
  for (const d of decisions) {
196
- assertEq(d.made_by, 'agent', `${d.id} made_by defaults to agent for legacy format`);
187
+ assert.deepStrictEqual(d.made_by, 'agent', `${d.id} made_by defaults to agent for legacy format`);
197
188
  }
198
- }
199
-
200
- console.log('=== md-importer: made_by column parsing (new 8-column format) ===');
189
+ });
201
190
 
202
- {
191
+ test('md-importer: made_by column parsing (new 8-column format)', () => {
203
192
  const newFormatMd = `# Decisions Register
204
193
 
205
194
  | # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |
@@ -210,62 +199,58 @@ console.log('=== md-importer: made_by column parsing (new 8-column format) ===')
210
199
  | D004 | M002 | impl | Cache strategy | LRU | Predictable | No | bogus |
211
200
  `;
212
201
  const decisions = parseDecisionsTable(newFormatMd);
213
- assertEq(decisions.length, 4, 'should parse 4 decisions with new format');
214
- assertEq(decisions[0].made_by, 'human', 'D001 made_by = human');
215
- assertEq(decisions[1].made_by, 'agent', 'D002 made_by = agent');
216
- assertEq(decisions[2].made_by, 'collaborative', 'D003 made_by = collaborative');
217
- assertEq(decisions[3].made_by, 'agent', 'D004 invalid made_by defaults to agent');
218
- }
202
+ assert.deepStrictEqual(decisions.length, 4, 'should parse 4 decisions with new format');
203
+ assert.deepStrictEqual(decisions[0].made_by, 'human', 'D001 made_by = human');
204
+ assert.deepStrictEqual(decisions[1].made_by, 'agent', 'D002 made_by = agent');
205
+ assert.deepStrictEqual(decisions[2].made_by, 'collaborative', 'D003 made_by = collaborative');
206
+ assert.deepStrictEqual(decisions[3].made_by, 'agent', 'D004 invalid made_by defaults to agent');
207
+ });
219
208
 
220
209
  // ═══════════════════════════════════════════════════════════════════════════
221
210
  // md-importer: parseRequirementsSections
222
211
  // ═══════════════════════════════════════════════════════════════════════════
223
212
 
224
- console.log('=== md-importer: parseRequirementsSections ===');
225
-
226
- {
213
+ test('md-importer: parseRequirementsSections', () => {
227
214
  const reqs = parseRequirementsSections(REQUIREMENTS_MD);
228
- assertEq(reqs.length, 5, 'should parse 5 unique requirements');
215
+ assert.deepStrictEqual(reqs.length, 5, 'should parse 5 unique requirements');
229
216
 
230
217
  const r001 = reqs.find(r => r.id === 'R001');
231
- assertTrue(!!r001, 'R001 should exist');
232
- assertEq(r001?.class, 'core-capability', 'R001 class');
233
- assertEq(r001?.status, 'active', 'R001 status');
234
- assertEq(r001?.description, 'A SQLite database with typed wrappers', 'R001 description');
235
- assertEq(r001?.why, 'Foundation for storage', 'R001 why');
236
- assertEq(r001?.source, 'user', 'R001 source');
237
- assertEq(r001?.primary_owner, 'M001/S01', 'R001 primary_owner');
238
- assertEq(r001?.supporting_slices, 'none', 'R001 supporting_slices');
239
- assertEq(r001?.validation, 'unmapped', 'R001 validation');
240
- assertEq(r001?.notes, 'WAL mode enabled', 'R001 notes');
241
- assertTrue(r001?.full_content?.includes('### R001') ?? false, 'R001 full_content should have heading');
218
+ assert.ok(!!r001, 'R001 should exist');
219
+ assert.deepStrictEqual(r001?.class, 'core-capability', 'R001 class');
220
+ assert.deepStrictEqual(r001?.status, 'active', 'R001 status');
221
+ assert.deepStrictEqual(r001?.description, 'A SQLite database with typed wrappers', 'R001 description');
222
+ assert.deepStrictEqual(r001?.why, 'Foundation for storage', 'R001 why');
223
+ assert.deepStrictEqual(r001?.source, 'user', 'R001 source');
224
+ assert.deepStrictEqual(r001?.primary_owner, 'M001/S01', 'R001 primary_owner');
225
+ assert.deepStrictEqual(r001?.supporting_slices, 'none', 'R001 supporting_slices');
226
+ assert.deepStrictEqual(r001?.validation, 'unmapped', 'R001 validation');
227
+ assert.deepStrictEqual(r001?.notes, 'WAL mode enabled', 'R001 notes');
228
+ assert.ok(r001?.full_content?.includes('### R001') ?? false, 'R001 full_content should have heading');
242
229
 
243
230
  // Validated section — R017 (abbreviated format with "Validated by" / "Proof" bullets)
244
231
  const r017 = reqs.find(r => r.id === 'R017');
245
- assertTrue(!!r017, 'R017 should exist');
246
- assertEq(r017?.status, 'validated', 'R017 status from validated section');
247
- assertEq(r017?.validation, 'M001/S01', 'R017 validation (from "Validated by" bullet)');
248
- assertEq(r017?.notes, '50 decisions queried in 0.62ms', 'R017 notes (from "Proof" bullet)');
232
+ assert.ok(!!r017, 'R017 should exist');
233
+ assert.deepStrictEqual(r017?.status, 'validated', 'R017 status from validated section');
234
+ assert.deepStrictEqual(r017?.validation, 'M001/S01', 'R017 validation (from "Validated by" bullet)');
235
+ assert.deepStrictEqual(r017?.notes, '50 decisions queried in 0.62ms', 'R017 notes (from "Proof" bullet)');
249
236
 
250
237
  // Deferred requirement
251
238
  const r030 = reqs.find(r => r.id === 'R030');
252
- assertEq(r030?.status, 'deferred', 'R030 status should be deferred');
253
- assertEq(r030?.class, 'differentiator', 'R030 class');
254
- assertEq(r030?.description, 'Rust crate for embeddings', 'R030 description');
239
+ assert.deepStrictEqual(r030?.status, 'deferred', 'R030 status should be deferred');
240
+ assert.deepStrictEqual(r030?.class, 'differentiator', 'R030 class');
241
+ assert.deepStrictEqual(r030?.description, 'Rust crate for embeddings', 'R030 description');
255
242
 
256
243
  // Out of scope
257
244
  const r040 = reqs.find(r => r.id === 'R040');
258
- assertEq(r040?.status, 'out-of-scope', 'R040 status should be out-of-scope');
259
- assertEq(r040?.class, 'anti-feature', 'R040 class');
260
- }
245
+ assert.deepStrictEqual(r040?.status, 'out-of-scope', 'R040 status should be out-of-scope');
246
+ assert.deepStrictEqual(r040?.class, 'anti-feature', 'R040 class');
247
+ });
261
248
 
262
249
  // ═══════════════════════════════════════════════════════════════════════════
263
250
  // md-importer: migrateFromMarkdown orchestrator
264
251
  // ═══════════════════════════════════════════════════════════════════════════
265
252
 
266
- console.log('=== md-importer: migrateFromMarkdown orchestrator ===');
267
-
268
- {
253
+ test('md-importer: migrateFromMarkdown orchestrator', () => {
269
254
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-import-test-'));
270
255
  createFixtureTree(tmpDir);
271
256
 
@@ -273,53 +258,51 @@ console.log('=== md-importer: migrateFromMarkdown orchestrator ===');
273
258
  openDatabase(':memory:');
274
259
  const result = migrateFromMarkdown(tmpDir);
275
260
 
276
- assertEq(result.decisions, 4, 'should import 4 decisions');
277
- assertEq(result.requirements, 5, 'should import 5 requirements');
278
- assertTrue(result.artifacts > 0, 'should import some artifacts');
261
+ assert.deepStrictEqual(result.decisions, 4, 'should import 4 decisions');
262
+ assert.deepStrictEqual(result.requirements, 5, 'should import 5 requirements');
263
+ assert.ok(result.artifacts > 0, 'should import some artifacts');
279
264
 
280
265
  // Verify decisions queryable
281
266
  const d001 = getDecisionById('D001');
282
- assertTrue(!!d001, 'D001 should be queryable');
283
- assertEq(d001?.superseded_by, 'D010', 'D001 superseded_by should be D010');
267
+ assert.ok(!!d001, 'D001 should be queryable');
268
+ assert.deepStrictEqual(d001?.superseded_by, 'D010', 'D001 superseded_by should be D010');
284
269
 
285
270
  // Verify requirements queryable
286
271
  const r001 = getRequirementById('R001');
287
- assertTrue(!!r001, 'R001 should be queryable');
288
- assertEq(r001?.status, 'active', 'R001 status from DB');
272
+ assert.ok(!!r001, 'R001 should be queryable');
273
+ assert.deepStrictEqual(r001?.status, 'active', 'R001 status from DB');
289
274
 
290
275
  // Verify active views
291
276
  const activeD = getActiveDecisions();
292
- assertEq(activeD.length, 2, 'should have 2 active decisions (D002, D020)');
277
+ assert.deepStrictEqual(activeD.length, 2, 'should have 2 active decisions (D002, D020)');
293
278
 
294
279
  // Verify artifacts table
295
280
  const adapter = _getAdapter();
296
281
  const artifacts = adapter?.prepare('SELECT count(*) as c FROM artifacts').get();
297
- assertTrue((artifacts?.c as number) > 0, 'artifacts table should have rows');
282
+ assert.ok((artifacts?.c as number) > 0, 'artifacts table should have rows');
298
283
 
299
284
  // Verify hierarchy correctness
300
285
  const roadmap = adapter?.prepare('SELECT * FROM artifacts WHERE artifact_type = :type').get({ ':type': 'ROADMAP' });
301
- assertTrue(!!roadmap, 'ROADMAP artifact should exist');
302
- assertEq(roadmap?.milestone_id, 'M001', 'ROADMAP should be in M001');
286
+ assert.ok(!!roadmap, 'ROADMAP artifact should exist');
287
+ assert.deepStrictEqual(roadmap?.milestone_id, 'M001', 'ROADMAP should be in M001');
303
288
 
304
289
  const taskPlan = adapter?.prepare('SELECT * FROM artifacts WHERE task_id = :taskId AND artifact_type = :type').get({
305
290
  ':taskId': 'T01',
306
291
  ':type': 'PLAN',
307
292
  });
308
- assertTrue(!!taskPlan, 'T01-PLAN artifact should exist');
293
+ assert.ok(!!taskPlan, 'T01-PLAN artifact should exist');
309
294
 
310
295
  closeDatabase();
311
296
  } finally {
312
297
  cleanupDir(tmpDir);
313
298
  }
314
- }
299
+ });
315
300
 
316
301
  // ═══════════════════════════════════════════════════════════════════════════
317
302
  // md-importer: idempotent re-import
318
303
  // ═══════════════════════════════════════════════════════════════════════════
319
304
 
320
- console.log('=== md-importer: idempotent re-import ===');
321
-
322
- {
305
+ test('md-importer: idempotent re-import', () => {
323
306
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-idemp-test-'));
324
307
  createFixtureTree(tmpDir);
325
308
 
@@ -328,9 +311,9 @@ console.log('=== md-importer: idempotent re-import ===');
328
311
  const r1 = migrateFromMarkdown(tmpDir);
329
312
  const r2 = migrateFromMarkdown(tmpDir);
330
313
 
331
- assertEq(r1.decisions, r2.decisions, 'double import should produce same decision count');
332
- assertEq(r1.requirements, r2.requirements, 'double import should produce same requirement count');
333
- assertEq(r1.artifacts, r2.artifacts, 'double import should produce same artifact count');
314
+ assert.deepStrictEqual(r1.decisions, r2.decisions, 'double import should produce same decision count');
315
+ assert.deepStrictEqual(r1.requirements, r2.requirements, 'double import should produce same requirement count');
316
+ assert.deepStrictEqual(r1.artifacts, r2.artifacts, 'double import should produce same artifact count');
334
317
 
335
318
  // Verify no duplicates
336
319
  const adapter = _getAdapter();
@@ -338,23 +321,21 @@ console.log('=== md-importer: idempotent re-import ===');
338
321
  const rc = adapter?.prepare('SELECT count(*) as c FROM requirements').get()?.c as number;
339
322
  const ac = adapter?.prepare('SELECT count(*) as c FROM artifacts').get()?.c as number;
340
323
 
341
- assertEq(dc, r1.decisions, 'DB decision count matches import count');
342
- assertEq(rc, r1.requirements, 'DB requirement count matches import count');
343
- assertEq(ac, r1.artifacts, 'DB artifact count matches import count');
324
+ assert.deepStrictEqual(dc, r1.decisions, 'DB decision count matches import count');
325
+ assert.deepStrictEqual(rc, r1.requirements, 'DB requirement count matches import count');
326
+ assert.deepStrictEqual(ac, r1.artifacts, 'DB artifact count matches import count');
344
327
 
345
328
  closeDatabase();
346
329
  } finally {
347
330
  cleanupDir(tmpDir);
348
331
  }
349
- }
332
+ });
350
333
 
351
334
  // ═══════════════════════════════════════════════════════════════════════════
352
335
  // md-importer: missing file graceful handling
353
336
  // ═══════════════════════════════════════════════════════════════════════════
354
337
 
355
- console.log('=== md-importer: missing file handling ===');
356
-
357
- {
338
+ test('md-importer: missing file handling', () => {
358
339
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-empty-test-'));
359
340
  // Create empty .gsd/ with no files
360
341
  fs.mkdirSync(path.join(tmpDir, '.gsd'), { recursive: true });
@@ -363,43 +344,39 @@ console.log('=== md-importer: missing file handling ===');
363
344
  openDatabase(':memory:');
364
345
  const result = migrateFromMarkdown(tmpDir);
365
346
 
366
- assertEq(result.decisions, 0, 'missing DECISIONS.md → 0 decisions');
367
- assertEq(result.requirements, 0, 'missing REQUIREMENTS.md → 0 requirements');
368
- assertEq(result.artifacts, 0, 'empty tree → 0 artifacts');
347
+ assert.deepStrictEqual(result.decisions, 0, 'missing DECISIONS.md → 0 decisions');
348
+ assert.deepStrictEqual(result.requirements, 0, 'missing REQUIREMENTS.md → 0 requirements');
349
+ assert.deepStrictEqual(result.artifacts, 0, 'empty tree → 0 artifacts');
369
350
 
370
351
  closeDatabase();
371
352
  } finally {
372
353
  cleanupDir(tmpDir);
373
354
  }
374
- }
355
+ });
375
356
 
376
357
  // ═══════════════════════════════════════════════════════════════════════════
377
358
  // md-importer: schema v1→v2 migration on existing DBs
378
359
  // ═══════════════════════════════════════════════════════════════════════════
379
360
 
380
- console.log('=== md-importer: schema v1→v2 migration ===');
381
-
382
- {
361
+ test('md-importer: schema v1→v2 migration', () => {
383
362
  // This test verifies that opening a fresh DB auto-migrates to current schema version
384
363
  openDatabase(':memory:');
385
364
  const adapter = _getAdapter();
386
365
  const version = adapter?.prepare('SELECT MAX(version) as v FROM schema_version').get();
387
- assertEq(version?.v, 4, 'new DB should be at schema version 4');
366
+ assert.deepStrictEqual(version?.v, 10, 'new DB should be at schema version 10');
388
367
 
389
368
  // Artifacts table should exist
390
369
  const tableCheck = adapter?.prepare("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name='artifacts'").get();
391
- assertEq(tableCheck?.c, 1, 'artifacts table should exist');
370
+ assert.deepStrictEqual(tableCheck?.c, 1, 'artifacts table should exist');
392
371
 
393
372
  closeDatabase();
394
- }
373
+ });
395
374
 
396
375
  // ═══════════════════════════════════════════════════════════════════════════
397
376
  // md-importer: round-trip fidelity
398
377
  // ═══════════════════════════════════════════════════════════════════════════
399
378
 
400
- console.log('=== md-importer: round-trip fidelity ===');
401
-
402
- {
379
+ test('md-importer: round-trip fidelity', () => {
403
380
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-roundtrip-test-'));
404
381
  createFixtureTree(tmpDir);
405
382
 
@@ -409,32 +386,31 @@ console.log('=== md-importer: round-trip fidelity ===');
409
386
 
410
387
  // Round-trip: verify imported field values match source
411
388
  const d002 = getDecisionById('D002');
412
- assertEq(d002?.when_context, 'M001', 'D002 when_context round-trip');
413
- assertEq(d002?.scope, 'arch', 'D002 scope round-trip');
414
- assertEq(d002?.decision, 'DB location', 'D002 decision round-trip');
415
- assertEq(d002?.choice, '.gsd/gsd.db', 'D002 choice round-trip');
416
- assertEq(d002?.rationale, 'Derived state', 'D002 rationale round-trip');
389
+ assert.deepStrictEqual(d002?.when_context, 'M001', 'D002 when_context round-trip');
390
+ assert.deepStrictEqual(d002?.scope, 'arch', 'D002 scope round-trip');
391
+ assert.deepStrictEqual(d002?.decision, 'DB location', 'D002 decision round-trip');
392
+ assert.deepStrictEqual(d002?.choice, '.gsd/gsd.db', 'D002 choice round-trip');
393
+ assert.deepStrictEqual(d002?.rationale, 'Derived state', 'D002 rationale round-trip');
417
394
 
418
395
  const r002 = getRequirementById('R002');
419
- assertEq(r002?.class, 'failure-visibility', 'R002 class round-trip');
420
- assertEq(r002?.description, 'Falls back to markdown if SQLite unavailable', 'R002 description round-trip');
421
- assertEq(r002?.why, 'Must not break on exotic platforms', 'R002 why round-trip');
422
- assertEq(r002?.primary_owner, 'M001/S01', 'R002 primary_owner round-trip');
423
- assertEq(r002?.supporting_slices, 'M001/S03', 'R002 supporting_slices round-trip');
424
- assertEq(r002?.notes, 'Transparent fallback', 'R002 notes round-trip');
425
- assertEq(r002?.validation, 'unmapped', 'R002 validation round-trip');
396
+ assert.deepStrictEqual(r002?.class, 'failure-visibility', 'R002 class round-trip');
397
+ assert.deepStrictEqual(r002?.description, 'Falls back to markdown if SQLite unavailable', 'R002 description round-trip');
398
+ assert.deepStrictEqual(r002?.why, 'Must not break on exotic platforms', 'R002 why round-trip');
399
+ assert.deepStrictEqual(r002?.primary_owner, 'M001/S01', 'R002 primary_owner round-trip');
400
+ assert.deepStrictEqual(r002?.supporting_slices, 'M001/S03', 'R002 supporting_slices round-trip');
401
+ assert.deepStrictEqual(r002?.notes, 'Transparent fallback', 'R002 notes round-trip');
402
+ assert.deepStrictEqual(r002?.validation, 'unmapped', 'R002 validation round-trip');
426
403
 
427
404
  // Verify artifact content is stored
428
405
  const adapter = _getAdapter();
429
406
  const project = adapter?.prepare("SELECT * FROM artifacts WHERE path = :path").get({ ':path': 'PROJECT.md' });
430
- assertTrue((project?.full_content as string)?.includes('Test Project'), 'PROJECT.md content round-trip');
407
+ assert.ok((project?.full_content as string)?.includes('Test Project'), 'PROJECT.md content round-trip');
431
408
 
432
409
  closeDatabase();
433
410
  } finally {
434
411
  cleanupDir(tmpDir);
435
412
  }
436
- }
413
+ });
437
414
 
438
415
  // ═══════════════════════════════════════════════════════════════════════════
439
416
 
440
- report();
@@ -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();