gsd-pi 2.43.0-next.8 → 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 (399) 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/gsd/auto-direct-dispatch.js +21 -8
  5. package/dist/resources/extensions/gsd/auto-prompts.js +130 -51
  6. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  7. package/dist/resources/extensions/gsd/auto-worktree.js +16 -2
  8. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  9. package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
  10. package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
  11. package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
  12. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  13. package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -11
  14. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -10
  15. package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
  16. package/dist/resources/extensions/gsd/workspace-index.js +46 -15
  17. package/dist/web/standalone/.next/BUILD_ID +1 -1
  18. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  19. package/dist/web/standalone/.next/build-manifest.json +3 -3
  20. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  21. package/dist/web/standalone/.next/required-server-files.json +4 -4
  22. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  23. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  25. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  33. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  36. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  49. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  87. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  93. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  109. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  111. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  113. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/index.html +1 -1
  123. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  124. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  126. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  128. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/page.js +2 -2
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  132. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  133. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  134. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/middleware.js +2 -2
  136. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  138. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  139. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  140. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  141. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  142. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  143. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  144. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  146. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  147. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  148. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  149. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  150. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  151. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  152. package/dist/web/standalone/server.js +1 -1
  153. package/package.json +4 -4
  154. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -3
  155. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -34
  157. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  159. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  161. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  164. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  167. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  169. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
  173. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  175. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  177. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  181. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  183. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  185. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  187. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  188. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  189. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  190. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  191. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  192. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  193. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  194. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  195. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  197. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  199. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  201. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  202. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  203. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  204. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  205. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  206. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  207. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  210. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  212. package/packages/pi-coding-agent/dist/core/session-manager.test.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/index.d.ts +3 -1
  216. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/index.js +1 -0
  218. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  220. package/packages/pi-coding-agent/dist/main.js +11 -199
  221. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  223. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  224. package/packages/pi-coding-agent/package.json +1 -1
  225. package/packages/pi-coding-agent/src/core/agent-session.ts +13 -37
  226. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  227. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  228. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  229. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  230. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  231. package/packages/pi-coding-agent/src/core/extensions/loader.ts +23 -0
  232. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  233. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  234. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  235. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  236. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  237. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  238. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  239. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  240. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  241. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  242. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  243. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  244. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  245. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  246. package/packages/pi-coding-agent/src/index.ts +7 -0
  247. package/packages/pi-coding-agent/src/main.ts +11 -232
  248. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  249. package/pkg/package.json +1 -1
  250. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +22 -7
  251. package/src/resources/extensions/gsd/auto-prompts.ts +109 -42
  252. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  253. package/src/resources/extensions/gsd/auto-worktree.ts +16 -3
  254. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  255. package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
  256. package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
  257. package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
  258. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  259. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  260. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  261. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  262. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  263. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  264. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  265. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  266. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +3 -3
  267. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  268. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  269. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  270. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  271. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  272. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  273. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  274. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  275. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  276. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  277. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  278. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  279. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  280. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  281. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  282. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  283. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  284. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  285. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  286. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +152 -183
  287. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  288. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  289. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  290. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  291. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  292. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  293. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  294. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  295. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  296. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  297. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  298. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  299. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  300. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  301. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  302. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  303. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  304. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  305. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  306. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  307. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  308. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  309. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  310. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  311. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  312. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  313. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  314. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  315. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  316. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  317. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  318. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  319. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  320. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  321. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  322. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  323. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  324. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  325. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  326. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  327. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  328. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  329. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  330. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  331. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  332. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  333. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  334. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  335. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  336. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  337. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  338. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  339. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  340. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  341. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  342. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  343. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  344. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  345. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  346. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  347. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  348. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  349. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  350. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  351. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  352. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  353. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  354. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  355. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  356. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  357. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  358. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  359. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  360. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  361. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  362. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  363. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  364. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  365. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  366. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  367. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  368. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  369. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  370. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  371. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +9 -11
  372. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  373. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  374. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  375. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  376. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  377. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  378. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  379. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  380. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  381. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  382. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  383. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  384. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  385. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  386. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  387. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  388. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  389. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  390. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -18
  391. package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -15
  392. package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
  393. package/src/resources/extensions/gsd/workspace-index.ts +49 -18
  394. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  395. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  396. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  397. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  398. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_buildManifest.js +0 -0
  399. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -18,9 +18,8 @@ import {
18
18
  getActiveTaskFromDb,
19
19
  } from '../gsd-db.ts';
20
20
  import { migrateHierarchyToDb } from '../md-importer.ts';
21
- import { createTestContext } from './test-helpers.ts';
22
-
23
- const { assertEq, assertTrue, report } = createTestContext();
21
+ import { describe, test, beforeEach, afterEach } from 'node:test';
22
+ import assert from 'node:assert/strict';
24
23
 
25
24
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
26
25
 
@@ -98,11 +97,9 @@ const PLAN_S02_1_TASK = `# S02: Second Slice
98
97
  // Test Cases
99
98
  // ═══════════════════════════════════════════════════════════════════════════
100
99
 
101
- async function main(): Promise<void> {
102
-
103
100
  // ─── Test (a): Single milestone with 2 slices, 3 tasks ────────────────
104
- console.log('\n=== migrate-hier: single milestone with 2 slices, 3 tasks ===');
105
- {
101
+
102
+ test('migrate-hier: single milestone with 2 slices, 3 tasks', () => {
106
103
  const base = createFixtureBase();
107
104
  try {
108
105
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -112,48 +109,48 @@ async function main(): Promise<void> {
112
109
  openDatabase(':memory:');
113
110
  const counts = migrateHierarchyToDb(base);
114
111
 
115
- assertEq(counts.milestones, 1, 'single-ms: 1 milestone inserted');
116
- assertEq(counts.slices, 2, 'single-ms: 2 slices inserted');
117
- assertEq(counts.tasks, 4, 'single-ms: 4 tasks inserted (3 + 1)');
112
+ assert.deepStrictEqual(counts.milestones, 1, 'single-ms: 1 milestone inserted');
113
+ assert.deepStrictEqual(counts.slices, 2, 'single-ms: 2 slices inserted');
114
+ assert.deepStrictEqual(counts.tasks, 4, 'single-ms: 4 tasks inserted (3 + 1)');
118
115
 
119
116
  const milestones = getAllMilestones();
120
- assertEq(milestones.length, 1, 'single-ms: 1 milestone in DB');
121
- assertEq(milestones[0]!.id, 'M001', 'single-ms: milestone ID is M001');
122
- assertEq(milestones[0]!.title, 'M001: Test Milestone', 'single-ms: milestone title correct');
123
- assertEq(milestones[0]!.status, 'active', 'single-ms: milestone status is active');
117
+ assert.deepStrictEqual(milestones.length, 1, 'single-ms: 1 milestone in DB');
118
+ assert.deepStrictEqual(milestones[0]!.id, 'M001', 'single-ms: milestone ID is M001');
119
+ assert.deepStrictEqual(milestones[0]!.title, 'M001: Test Milestone', 'single-ms: milestone title correct');
120
+ assert.deepStrictEqual(milestones[0]!.status, 'active', 'single-ms: milestone status is active');
124
121
 
125
122
  const slices = getMilestoneSlices('M001');
126
- assertEq(slices.length, 2, 'single-ms: 2 slices in DB');
127
- assertEq(slices[0]!.id, 'S01', 'single-ms: first slice is S01');
128
- assertEq(slices[0]!.title, 'First Slice', 'single-ms: S01 title correct');
129
- assertEq(slices[0]!.risk, 'low', 'single-ms: S01 risk is low');
130
- assertEq(slices[0]!.status, 'pending', 'single-ms: S01 status is pending');
131
- assertEq(slices[1]!.id, 'S02', 'single-ms: second slice is S02');
132
- assertEq(slices[1]!.risk, 'high', 'single-ms: S02 risk is high');
123
+ assert.deepStrictEqual(slices.length, 2, 'single-ms: 2 slices in DB');
124
+ assert.deepStrictEqual(slices[0]!.id, 'S01', 'single-ms: first slice is S01');
125
+ assert.deepStrictEqual(slices[0]!.title, 'First Slice', 'single-ms: S01 title correct');
126
+ assert.deepStrictEqual(slices[0]!.risk, 'low', 'single-ms: S01 risk is low');
127
+ assert.deepStrictEqual(slices[0]!.status, 'pending', 'single-ms: S01 status is pending');
128
+ assert.deepStrictEqual(slices[1]!.id, 'S02', 'single-ms: second slice is S02');
129
+ assert.deepStrictEqual(slices[1]!.risk, 'high', 'single-ms: S02 risk is high');
133
130
 
134
131
  const s01Tasks = getSliceTasks('M001', 'S01');
135
- assertEq(s01Tasks.length, 3, 'single-ms: 3 tasks for S01');
136
- assertEq(s01Tasks[0]!.id, 'T01', 'single-ms: first task is T01');
137
- assertEq(s01Tasks[0]!.title, 'First Task', 'single-ms: T01 title correct');
138
- assertEq(s01Tasks[0]!.status, 'pending', 'single-ms: T01 status is pending');
139
- assertEq(s01Tasks[1]!.id, 'T02', 'single-ms: second task is T02');
140
- assertEq(s01Tasks[1]!.status, 'complete', 'single-ms: T02 status is complete (was [x])');
141
- assertEq(s01Tasks[2]!.id, 'T03', 'single-ms: third task is T03');
132
+ assert.deepStrictEqual(s01Tasks.length, 3, 'single-ms: 3 tasks for S01');
133
+ assert.deepStrictEqual(s01Tasks[0]!.id, 'T01', 'single-ms: first task is T01');
134
+ assert.deepStrictEqual(s01Tasks[0]!.title, 'First Task', 'single-ms: T01 title correct');
135
+ assert.deepStrictEqual(s01Tasks[0]!.status, 'pending', 'single-ms: T01 status is pending');
136
+ assert.deepStrictEqual(s01Tasks[1]!.id, 'T02', 'single-ms: second task is T02');
137
+ assert.deepStrictEqual(s01Tasks[1]!.status, 'complete', 'single-ms: T02 status is complete (was [x])');
138
+ assert.deepStrictEqual(s01Tasks[2]!.id, 'T03', 'single-ms: third task is T03');
142
139
 
143
140
  const s02Tasks = getSliceTasks('M001', 'S02');
144
- assertEq(s02Tasks.length, 1, 'single-ms: 1 task for S02');
145
- assertEq(s02Tasks[0]!.id, 'T01', 'single-ms: S02 T01 correct');
141
+ assert.deepStrictEqual(s02Tasks.length, 1, 'single-ms: 1 task for S02');
142
+ assert.deepStrictEqual(s02Tasks[0]!.id, 'T01', 'single-ms: S02 T01 correct');
146
143
 
147
144
  closeDatabase();
148
145
  } finally {
149
146
  closeDatabase();
150
147
  cleanup(base);
151
148
  }
152
- }
149
+ });
153
150
 
154
151
  // ─── Test (b): Multi-milestone — M001 complete, M002 active with deps ─
155
- console.log('\n=== migrate-hier: multi-milestone with deps ===');
156
- {
152
+
153
+ test('migrate-hier: multi-milestone with deps', () => {
157
154
  const base = createFixtureBase();
158
155
  try {
159
156
  // M001: complete (has SUMMARY)
@@ -197,35 +194,35 @@ Depends on M001 completion.
197
194
  openDatabase(':memory:');
198
195
  const counts = migrateHierarchyToDb(base);
199
196
 
200
- assertEq(counts.milestones, 2, 'multi-ms: 2 milestones inserted');
197
+ assert.deepStrictEqual(counts.milestones, 2, 'multi-ms: 2 milestones inserted');
201
198
 
202
199
  const m001 = getMilestone('M001');
203
- assertTrue(m001 !== null, 'multi-ms: M001 exists');
204
- assertEq(m001!.status, 'complete', 'multi-ms: M001 is complete');
200
+ assert.ok(m001 !== null, 'multi-ms: M001 exists');
201
+ assert.deepStrictEqual(m001!.status, 'complete', 'multi-ms: M001 is complete');
205
202
 
206
203
  const m002 = getMilestone('M002');
207
- assertTrue(m002 !== null, 'multi-ms: M002 exists');
208
- assertEq(m002!.status, 'active', 'multi-ms: M002 is active');
209
- assertEq(m002!.depends_on, ['M001'], 'multi-ms: M002 depends on M001');
204
+ assert.ok(m002 !== null, 'multi-ms: M002 exists');
205
+ assert.deepStrictEqual(m002!.status, 'active', 'multi-ms: M002 is active');
206
+ assert.deepStrictEqual(m002!.depends_on, ['M001'], 'multi-ms: M002 depends on M001');
210
207
 
211
208
  // Active milestone should be M002
212
209
  const active = getActiveMilestoneFromDb();
213
- assertEq(active?.id, 'M002', 'multi-ms: active milestone is M002');
210
+ assert.deepStrictEqual(active?.id, 'M002', 'multi-ms: active milestone is M002');
214
211
 
215
212
  // Active slice in M002 should be S01 (S02 depends on S01)
216
213
  const activeSlice = getActiveSliceFromDb('M002');
217
- assertEq(activeSlice?.id, 'S01', 'multi-ms: active slice is S01');
214
+ assert.deepStrictEqual(activeSlice?.id, 'S01', 'multi-ms: active slice is S01');
218
215
 
219
216
  closeDatabase();
220
217
  } finally {
221
218
  closeDatabase();
222
219
  cleanup(base);
223
220
  }
224
- }
221
+ });
225
222
 
226
223
  // ─── Test (c): Partially-completed slice — some tasks [x], some [ ] ───
227
- console.log('\n=== migrate-hier: partially-completed slice ===');
228
- {
224
+
225
+ test('migrate-hier: partially-completed slice', () => {
229
226
  const base = createFixtureBase();
230
227
  try {
231
228
  const roadmap = `# M001: Partial
@@ -260,25 +257,25 @@ Depends on M001 completion.
260
257
  migrateHierarchyToDb(base);
261
258
 
262
259
  const tasks = getSliceTasks('M001', 'S01');
263
- assertEq(tasks.length, 3, 'partial: 3 tasks');
264
- assertEq(tasks[0]!.status, 'complete', 'partial: T01 is complete');
265
- assertEq(tasks[1]!.status, 'complete', 'partial: T02 is complete');
266
- assertEq(tasks[2]!.status, 'pending', 'partial: T03 is pending');
260
+ assert.deepStrictEqual(tasks.length, 3, 'partial: 3 tasks');
261
+ assert.deepStrictEqual(tasks[0]!.status, 'complete', 'partial: T01 is complete');
262
+ assert.deepStrictEqual(tasks[1]!.status, 'complete', 'partial: T02 is complete');
263
+ assert.deepStrictEqual(tasks[2]!.status, 'pending', 'partial: T03 is pending');
267
264
 
268
265
  // Active task should be T03
269
266
  const activeTask = getActiveTaskFromDb('M001', 'S01');
270
- assertEq(activeTask?.id, 'T03', 'partial: active task is T03');
267
+ assert.deepStrictEqual(activeTask?.id, 'T03', 'partial: active task is T03');
271
268
 
272
269
  closeDatabase();
273
270
  } finally {
274
271
  closeDatabase();
275
272
  cleanup(base);
276
273
  }
277
- }
274
+ });
278
275
 
279
276
  // ─── Test (d): Ghost milestone skipped ────────────────────────────────
280
- console.log('\n=== migrate-hier: ghost milestone skipped ===');
281
- {
277
+
278
+ test('migrate-hier: ghost milestone skipped', () => {
282
279
  const base = createFixtureBase();
283
280
  try {
284
281
  // M001: real milestone
@@ -289,21 +286,21 @@ Depends on M001 completion.
289
286
  openDatabase(':memory:');
290
287
  const counts = migrateHierarchyToDb(base);
291
288
 
292
- assertEq(counts.milestones, 1, 'ghost: only 1 milestone inserted');
289
+ assert.deepStrictEqual(counts.milestones, 1, 'ghost: only 1 milestone inserted');
293
290
  const milestones = getAllMilestones();
294
- assertEq(milestones.length, 1, 'ghost: 1 milestone in DB');
295
- assertEq(milestones[0]!.id, 'M001', 'ghost: only M001 in DB');
291
+ assert.deepStrictEqual(milestones.length, 1, 'ghost: 1 milestone in DB');
292
+ assert.deepStrictEqual(milestones[0]!.id, 'M001', 'ghost: only M001 in DB');
296
293
 
297
294
  closeDatabase();
298
295
  } finally {
299
296
  closeDatabase();
300
297
  cleanup(base);
301
298
  }
302
- }
299
+ });
303
300
 
304
301
  // ─── Test (e): Idempotent re-run — calling twice doesn't duplicate ────
305
- console.log('\n=== migrate-hier: idempotent re-run ===');
306
- {
302
+
303
+ test('migrate-hier: idempotent re-run', () => {
307
304
  const base = createFixtureBase();
308
305
  try {
309
306
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -313,31 +310,31 @@ Depends on M001 completion.
313
310
 
314
311
  // First run
315
312
  const counts1 = migrateHierarchyToDb(base);
316
- assertEq(counts1.milestones, 1, 'idempotent-1: 1 milestone first run');
317
- assertEq(counts1.slices, 2, 'idempotent-1: 2 slices first run');
318
- assertEq(counts1.tasks, 3, 'idempotent-1: 3 tasks first run');
313
+ assert.deepStrictEqual(counts1.milestones, 1, 'idempotent-1: 1 milestone first run');
314
+ assert.deepStrictEqual(counts1.slices, 2, 'idempotent-1: 2 slices first run');
315
+ assert.deepStrictEqual(counts1.tasks, 3, 'idempotent-1: 3 tasks first run');
319
316
 
320
317
  // Second run — INSERT OR IGNORE means no duplicates
321
318
  const counts2 = migrateHierarchyToDb(base);
322
319
  // Counts reflect attempts, not actual inserts (INSERT OR IGNORE silently skips)
323
320
  // The important thing: DB doesn't have duplicates
324
321
  const milestones = getAllMilestones();
325
- assertEq(milestones.length, 1, 'idempotent-2: still 1 milestone after second run');
322
+ assert.deepStrictEqual(milestones.length, 1, 'idempotent-2: still 1 milestone after second run');
326
323
  const slices = getMilestoneSlices('M001');
327
- assertEq(slices.length, 2, 'idempotent-2: still 2 slices after second run');
324
+ assert.deepStrictEqual(slices.length, 2, 'idempotent-2: still 2 slices after second run');
328
325
  const tasks = getSliceTasks('M001', 'S01');
329
- assertEq(tasks.length, 3, 'idempotent-2: still 3 tasks for S01 after second run');
326
+ assert.deepStrictEqual(tasks.length, 3, 'idempotent-2: still 3 tasks for S01 after second run');
330
327
 
331
328
  closeDatabase();
332
329
  } finally {
333
330
  closeDatabase();
334
331
  cleanup(base);
335
332
  }
336
- }
333
+ });
337
334
 
338
335
  // ─── Test (f): Empty roadmap — milestone inserted but no slices ───────
339
- console.log('\n=== migrate-hier: empty roadmap, no slices ===');
340
- {
336
+
337
+ test('migrate-hier: empty roadmap, no slices', () => {
341
338
  const base = createFixtureBase();
342
339
  try {
343
340
  const emptyRoadmap = `# M001: Empty Milestone
@@ -353,27 +350,27 @@ Depends on M001 completion.
353
350
  openDatabase(':memory:');
354
351
  const counts = migrateHierarchyToDb(base);
355
352
 
356
- assertEq(counts.milestones, 1, 'empty-roadmap: 1 milestone inserted');
357
- assertEq(counts.slices, 0, 'empty-roadmap: 0 slices inserted');
358
- assertEq(counts.tasks, 0, 'empty-roadmap: 0 tasks inserted');
353
+ assert.deepStrictEqual(counts.milestones, 1, 'empty-roadmap: 1 milestone inserted');
354
+ assert.deepStrictEqual(counts.slices, 0, 'empty-roadmap: 0 slices inserted');
355
+ assert.deepStrictEqual(counts.tasks, 0, 'empty-roadmap: 0 tasks inserted');
359
356
 
360
357
  const milestones = getAllMilestones();
361
- assertEq(milestones.length, 1, 'empty-roadmap: 1 milestone in DB');
362
- assertEq(milestones[0]!.title, 'M001: Empty Milestone', 'empty-roadmap: title correct');
358
+ assert.deepStrictEqual(milestones.length, 1, 'empty-roadmap: 1 milestone in DB');
359
+ assert.deepStrictEqual(milestones[0]!.title, 'M001: Empty Milestone', 'empty-roadmap: title correct');
363
360
 
364
361
  const slices = getMilestoneSlices('M001');
365
- assertEq(slices.length, 0, 'empty-roadmap: no slices in DB');
362
+ assert.deepStrictEqual(slices.length, 0, 'empty-roadmap: no slices in DB');
366
363
 
367
364
  closeDatabase();
368
365
  } finally {
369
366
  closeDatabase();
370
367
  cleanup(base);
371
368
  }
372
- }
369
+ });
373
370
 
374
371
  // ─── Test (g): Slice depends parsed correctly ─────────────────────────
375
- console.log('\n=== migrate-hier: slice depends parsed ===');
376
- {
372
+
373
+ test('migrate-hier: slice depends parsed', () => {
377
374
  const base = createFixtureBase();
378
375
  try {
379
376
  const roadmap = `# M001: Deps Test
@@ -397,21 +394,21 @@ Depends on M001 completion.
397
394
  migrateHierarchyToDb(base);
398
395
 
399
396
  const slices = getMilestoneSlices('M001');
400
- assertEq(slices.length, 3, 'depends: 3 slices');
401
- assertEq(slices[0]!.depends, [], 'depends: S01 has no deps');
402
- assertEq(slices[1]!.depends, ['S01'], 'depends: S02 depends on S01');
403
- assertEq(slices[2]!.depends, ['S01', 'S02'], 'depends: S03 depends on S01,S02');
397
+ assert.deepStrictEqual(slices.length, 3, 'depends: 3 slices');
398
+ assert.deepStrictEqual(slices[0]!.depends, [], 'depends: S01 has no deps');
399
+ assert.deepStrictEqual(slices[1]!.depends, ['S01'], 'depends: S02 depends on S01');
400
+ assert.deepStrictEqual(slices[2]!.depends, ['S01', 'S02'], 'depends: S03 depends on S01,S02');
404
401
 
405
402
  closeDatabase();
406
403
  } finally {
407
404
  closeDatabase();
408
405
  cleanup(base);
409
406
  }
410
- }
407
+ });
411
408
 
412
409
  // ─── Test (h): Demo text extracted from roadmap ───────────────────────
413
- console.log('\n=== migrate-hier: demo text extracted ===');
414
- {
410
+
411
+ test('migrate-hier: demo text extracted', () => {
415
412
  const base = createFixtureBase();
416
413
  try {
417
414
  writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_2_SLICES);
@@ -420,20 +417,13 @@ Depends on M001 completion.
420
417
  migrateHierarchyToDb(base);
421
418
 
422
419
  const slices = getMilestoneSlices('M001');
423
- assertEq(slices[0]!.demo, 'First slice done.', 'demo: S01 demo text correct');
424
- assertEq(slices[1]!.demo, 'All slices done.', 'demo: S02 demo text correct');
420
+ assert.deepStrictEqual(slices[0]!.demo, 'First slice done.', 'demo: S01 demo text correct');
421
+ assert.deepStrictEqual(slices[1]!.demo, 'All slices done.', 'demo: S02 demo text correct');
425
422
 
426
423
  closeDatabase();
427
424
  } finally {
428
425
  closeDatabase();
429
426
  cleanup(base);
430
427
  }
431
- }
432
-
433
- report();
434
- }
435
-
436
- main().catch((error) => {
437
- console.error(error);
438
- process.exit(1);
439
428
  });
429
+