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
@@ -15,9 +15,9 @@ import {
15
15
  parseOldState,
16
16
  parseOldConfig,
17
17
  } from '../migrate/parsers.ts';
18
- import { createTestContext } from './test-helpers.ts';
18
+ import { describe, test, beforeEach, afterEach } from 'node:test';
19
+ import assert from 'node:assert/strict';
19
20
 
20
- const { assertEq, assertTrue, report } = createTestContext();
21
21
  function createFixtureBase(): string {
22
22
  return mkdtempSync(join(tmpdir(), 'gsd-migrate-t02-'));
23
23
  }
@@ -173,55 +173,49 @@ const SAMPLE_STATE = `# State
173
173
  **Status:** in-progress
174
174
  `;
175
175
 
176
- async function main(): Promise<void> {
177
-
178
176
  // ═══════════════════════════════════════════════════════════════════════
179
177
  // Validator Tests
180
178
  // ═══════════════════════════════════════════════════════════════════════
181
179
 
182
- console.log('\n=== Validator: missing directory → fatal ===');
183
- {
180
+ test('Validator: missing directory → fatal', async () => {
184
181
  const base = createFixtureBase();
185
182
  try {
186
183
  const result = await validatePlanningDirectory(join(base, 'nonexistent'));
187
- assertEq(result.valid, false, 'missing dir: validation fails');
188
- assertTrue(result.issues.length > 0, 'missing dir: has issues');
189
- assertTrue(result.issues.some(i => i.severity === 'fatal'), 'missing dir: has fatal issue');
184
+ assert.deepStrictEqual(result.valid, false, 'missing dir: validation fails');
185
+ assert.ok(result.issues.length > 0, 'missing dir: has issues');
186
+ assert.ok(result.issues.some(i => i.severity === 'fatal'), 'missing dir: has fatal issue');
190
187
  } finally {
191
188
  cleanup(base);
192
189
  }
193
- }
190
+ });
194
191
 
195
- console.log('\n=== Validator: missing ROADMAP.md → warning (not fatal) ===');
196
- {
192
+ test('Validator: missing ROADMAP.md → warning (not fatal)', async () => {
197
193
  const base = createFixtureBase();
198
194
  try {
199
195
  const planning = createPlanningDir(base);
200
196
  writeFileSync(join(planning, 'PROJECT.md'), SAMPLE_PROJECT);
201
197
  const result = await validatePlanningDirectory(planning);
202
- assertEq(result.valid, true, 'no roadmap: validation still passes');
203
- assertTrue(result.issues.some(i => i.severity === 'warning' && i.file.includes('ROADMAP')), 'no roadmap: warning issue mentions ROADMAP');
198
+ assert.deepStrictEqual(result.valid, true, 'no roadmap: validation still passes');
199
+ assert.ok(result.issues.some(i => i.severity === 'warning' && i.file.includes('ROADMAP')), 'no roadmap: warning issue mentions ROADMAP');
204
200
  } finally {
205
201
  cleanup(base);
206
202
  }
207
- }
203
+ });
208
204
 
209
- console.log('\n=== Validator: missing PROJECT.md → warning ===');
210
- {
205
+ test('Validator: missing PROJECT.md → warning', async () => {
211
206
  const base = createFixtureBase();
212
207
  try {
213
208
  const planning = createPlanningDir(base);
214
209
  writeFileSync(join(planning, 'ROADMAP.md'), SAMPLE_ROADMAP);
215
210
  const result = await validatePlanningDirectory(planning);
216
- assertEq(result.valid, true, 'no project: validation passes (warning only)');
217
- assertTrue(result.issues.some(i => i.severity === 'warning' && i.file.includes('PROJECT')), 'no project: warning issue mentions PROJECT');
211
+ assert.deepStrictEqual(result.valid, true, 'no project: validation passes (warning only)');
212
+ assert.ok(result.issues.some(i => i.severity === 'warning' && i.file.includes('PROJECT')), 'no project: warning issue mentions PROJECT');
218
213
  } finally {
219
214
  cleanup(base);
220
215
  }
221
- }
216
+ });
222
217
 
223
- console.log('\n=== Validator: complete directory → valid with no issues ===');
224
- {
218
+ test('Validator: complete directory → valid with no issues', async () => {
225
219
  const base = createFixtureBase();
226
220
  try {
227
221
  const planning = createPlanningDir(base);
@@ -231,78 +225,74 @@ async function main(): Promise<void> {
231
225
  writeFileSync(join(planning, 'STATE.md'), SAMPLE_STATE);
232
226
  mkdirSync(join(planning, 'phases'), { recursive: true });
233
227
  const result = await validatePlanningDirectory(planning);
234
- assertEq(result.valid, true, 'complete dir: validation passes');
235
- assertEq(result.issues.length, 0, 'complete dir: no issues');
228
+ assert.deepStrictEqual(result.valid, true, 'complete dir: validation passes');
229
+ assert.deepStrictEqual(result.issues.length, 0, 'complete dir: no issues');
236
230
  } finally {
237
231
  cleanup(base);
238
232
  }
239
- }
233
+ });
240
234
 
241
235
  // ═══════════════════════════════════════════════════════════════════════
242
236
  // Roadmap Parser Tests
243
237
  // ═══════════════════════════════════════════════════════════════════════
244
238
 
245
- console.log('\n=== parseOldRoadmap: flat format ===');
246
- {
239
+ test('parseOldRoadmap: flat format', () => {
247
240
  const roadmap = parseOldRoadmap(SAMPLE_ROADMAP);
248
- assertEq(roadmap.milestones.length, 0, 'flat roadmap: no milestone sections');
249
- assertEq(roadmap.phases.length, 3, 'flat roadmap: 3 phases');
250
- assertEq(roadmap.phases[0].number, 29, 'flat roadmap: first phase number');
251
- assertEq(roadmap.phases[0].title, 'Auth System', 'flat roadmap: first phase title');
252
- assertEq(roadmap.phases[0].done, true, 'flat roadmap: first phase done');
253
- assertEq(roadmap.phases[1].done, false, 'flat roadmap: second phase not done');
254
- }
255
-
256
- console.log('\n=== parseOldRoadmap: milestone-sectioned with <details> ===');
257
- {
241
+ assert.deepStrictEqual(roadmap.milestones.length, 0, 'flat roadmap: no milestone sections');
242
+ assert.deepStrictEqual(roadmap.phases.length, 3, 'flat roadmap: 3 phases');
243
+ assert.deepStrictEqual(roadmap.phases[0].number, 29, 'flat roadmap: first phase number');
244
+ assert.deepStrictEqual(roadmap.phases[0].title, 'Auth System', 'flat roadmap: first phase title');
245
+ assert.deepStrictEqual(roadmap.phases[0].done, true, 'flat roadmap: first phase done');
246
+ assert.deepStrictEqual(roadmap.phases[1].done, false, 'flat roadmap: second phase not done');
247
+ });
248
+
249
+ test('parseOldRoadmap: milestone-sectioned with <details>', () => {
258
250
  const roadmap = parseOldRoadmap(SAMPLE_MILESTONE_SECTIONED_ROADMAP);
259
- assertTrue(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
251
+ assert.ok(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
260
252
 
261
253
  const v20 = roadmap.milestones.find(m => m.id.includes('2.0'));
262
- assertTrue(v20 !== undefined, 'ms roadmap: v2.0 found');
263
- assertEq(v20?.collapsed, true, 'ms roadmap: v2.0 collapsed');
264
- assertTrue((v20?.phases.length ?? 0) >= 2, 'ms roadmap: v2.0 has phases');
265
- assertTrue(v20?.phases.every(p => p.done) ?? false, 'ms roadmap: v2.0 all done');
254
+ assert.ok(v20 !== undefined, 'ms roadmap: v2.0 found');
255
+ assert.deepStrictEqual(v20?.collapsed, true, 'ms roadmap: v2.0 collapsed');
256
+ assert.ok((v20?.phases.length ?? 0) >= 2, 'ms roadmap: v2.0 has phases');
257
+ assert.ok(v20?.phases.every(p => p.done) ?? false, 'ms roadmap: v2.0 all done');
266
258
 
267
259
  const v25 = roadmap.milestones.find(m => m.id.includes('2.5'));
268
- assertTrue(v25 !== undefined, 'ms roadmap: v2.5 found');
269
- assertEq(v25?.collapsed, false, 'ms roadmap: v2.5 not collapsed');
270
- assertTrue((v25?.phases.length ?? 0) >= 3, 'ms roadmap: v2.5 has 3 phases');
260
+ assert.ok(v25 !== undefined, 'ms roadmap: v2.5 found');
261
+ assert.deepStrictEqual(v25?.collapsed, false, 'ms roadmap: v2.5 not collapsed');
262
+ assert.ok((v25?.phases.length ?? 0) >= 3, 'ms roadmap: v2.5 has 3 phases');
271
263
 
272
264
  const p29 = v25?.phases.find(p => p.number === 29);
273
- assertEq(p29?.done, true, 'ms roadmap: phase 29 done');
265
+ assert.deepStrictEqual(p29?.done, true, 'ms roadmap: phase 29 done');
274
266
  const p30 = v25?.phases.find(p => p.number === 30);
275
- assertEq(p30?.done, false, 'ms roadmap: phase 30 not done');
276
- }
267
+ assert.deepStrictEqual(p30?.done, false, 'ms roadmap: phase 30 not done');
268
+ });
277
269
 
278
270
  // ═══════════════════════════════════════════════════════════════════════
279
271
  // Plan Parser Tests
280
272
  // ═══════════════════════════════════════════════════════════════════════
281
273
 
282
- console.log('\n=== parseOldPlan: XML-in-markdown ===');
283
- {
274
+ test('parseOldPlan: XML-in-markdown', () => {
284
275
  const plan = parseOldPlan(SAMPLE_PLAN_XML, '29-01-PLAN.md', '01');
285
- assertTrue(plan.objective.includes('authentication'), 'plan: objective extracted');
286
- assertEq(plan.tasks.length, 3, 'plan: 3 tasks');
287
- assertTrue(plan.tasks[0].includes('auth middleware'), 'plan: first task content');
288
- assertTrue(plan.context.includes('JWT'), 'plan: context extracted');
289
- assertTrue(plan.verification.includes('Login returns'), 'plan: verification extracted');
290
- assertTrue(plan.successCriteria.includes('endpoints respond'), 'plan: success criteria extracted');
276
+ assert.ok(plan.objective.includes('authentication'), 'plan: objective extracted');
277
+ assert.deepStrictEqual(plan.tasks.length, 3, 'plan: 3 tasks');
278
+ assert.ok(plan.tasks[0].includes('auth middleware'), 'plan: first task content');
279
+ assert.ok(plan.context.includes('JWT'), 'plan: context extracted');
280
+ assert.ok(plan.verification.includes('Login returns'), 'plan: verification extracted');
281
+ assert.ok(plan.successCriteria.includes('endpoints respond'), 'plan: success criteria extracted');
291
282
 
292
283
  // Frontmatter
293
- assertEq(plan.frontmatter.phase, '29-auth-system', 'plan fm: phase');
294
- assertEq(plan.frontmatter.plan, '01', 'plan fm: plan');
295
- assertEq(plan.frontmatter.type, 'implementation', 'plan fm: type');
296
- assertEq(plan.frontmatter.wave, 1, 'plan fm: wave');
297
- assertEq(plan.frontmatter.autonomous, true, 'plan fm: autonomous');
298
- assertTrue(plan.frontmatter.files_modified.length >= 2, 'plan fm: files_modified');
299
- assertTrue(plan.frontmatter.must_haves !== null, 'plan fm: must_haves parsed');
300
- assertTrue((plan.frontmatter.must_haves?.truths.length ?? 0) >= 1, 'plan fm: must_haves truths');
301
- assertTrue((plan.frontmatter.must_haves?.artifacts.length ?? 0) >= 1, 'plan fm: must_haves artifacts');
302
- }
303
-
304
- console.log('\n=== parseOldPlan: plain markdown (no XML tags) ===');
305
- {
284
+ assert.deepStrictEqual(plan.frontmatter.phase, '29-auth-system', 'plan fm: phase');
285
+ assert.deepStrictEqual(plan.frontmatter.plan, '01', 'plan fm: plan');
286
+ assert.deepStrictEqual(plan.frontmatter.type, 'implementation', 'plan fm: type');
287
+ assert.deepStrictEqual(plan.frontmatter.wave, 1, 'plan fm: wave');
288
+ assert.deepStrictEqual(plan.frontmatter.autonomous, true, 'plan fm: autonomous');
289
+ assert.ok(plan.frontmatter.files_modified.length >= 2, 'plan fm: files_modified');
290
+ assert.ok(plan.frontmatter.must_haves !== null, 'plan fm: must_haves parsed');
291
+ assert.ok((plan.frontmatter.must_haves?.truths.length ?? 0) >= 1, 'plan fm: must_haves truths');
292
+ assert.ok((plan.frontmatter.must_haves?.artifacts.length ?? 0) >= 1, 'plan fm: must_haves artifacts');
293
+ });
294
+
295
+ test('parseOldPlan: plain markdown (no XML tags)', () => {
306
296
  const plainPlan = `# 001: Fix Login Bug
307
297
 
308
298
  ## Description
@@ -315,100 +305,86 @@ Fix the login button not responding on mobile.
315
305
  2. Fix event propagation
316
306
  `;
317
307
  const plan = parseOldPlan(plainPlan, '001-PLAN.md', '001');
318
- assertEq(plan.objective, '', 'plain plan: no objective (no XML)');
319
- assertEq(plan.tasks.length, 0, 'plain plan: no tasks (no XML)');
320
- assertEq(plan.frontmatter.phase, '', 'plain plan: no frontmatter phase');
321
- }
308
+ assert.deepStrictEqual(plan.objective, '', 'plain plan: no objective (no XML)');
309
+ assert.deepStrictEqual(plan.tasks.length, 0, 'plain plan: no tasks (no XML)');
310
+ assert.deepStrictEqual(plan.frontmatter.phase, '', 'plain plan: no frontmatter phase');
311
+ });
322
312
 
323
313
  // ═══════════════════════════════════════════════════════════════════════
324
314
  // Summary Parser Tests
325
315
  // ═══════════════════════════════════════════════════════════════════════
326
316
 
327
- console.log('\n=== parseOldSummary: YAML frontmatter ===');
328
- {
317
+ test('parseOldSummary: YAML frontmatter', () => {
329
318
  const summary = parseOldSummary(SAMPLE_SUMMARY, '29-01-SUMMARY.md', '01');
330
- assertEq(summary.frontmatter.phase, '29-auth-system', 'summary fm: phase');
331
- assertEq(summary.frontmatter.plan, '01', 'summary fm: plan');
332
- assertEq(summary.frontmatter.subsystem, 'auth', 'summary fm: subsystem');
333
- assertEq(summary.frontmatter.tags, ['authentication', 'security'], 'summary fm: tags');
334
- assertEq(summary.frontmatter.provides, ['auth-middleware', 'jwt-validation'], 'summary fm: provides');
335
- assertEq(summary.frontmatter.affects, ['api-routes'], 'summary fm: affects');
336
- assertEq(summary.frontmatter['tech-stack'], ['jsonwebtoken', 'express'], 'summary fm: tech-stack');
337
- assertEq(summary.frontmatter['key-files'], ['src/auth.ts', 'src/middleware/auth.ts'], 'summary fm: key-files');
338
- assertEq(summary.frontmatter['key-decisions'], ['Use RS256 for JWT signing', 'Store refresh tokens in DB'], 'summary fm: key-decisions');
339
- assertEq(summary.frontmatter['patterns-established'], ['Middleware-based auth'], 'summary fm: patterns-established');
340
- assertEq(summary.frontmatter.duration, '2h', 'summary fm: duration');
341
- assertEq(summary.frontmatter.completed, '2026-01-15', 'summary fm: completed');
342
- assertTrue(summary.body.includes('Auth Implementation Summary'), 'summary: body content present');
343
- }
319
+ assert.deepStrictEqual(summary.frontmatter.phase, '29-auth-system', 'summary fm: phase');
320
+ assert.deepStrictEqual(summary.frontmatter.plan, '01', 'summary fm: plan');
321
+ assert.deepStrictEqual(summary.frontmatter.subsystem, 'auth', 'summary fm: subsystem');
322
+ assert.deepStrictEqual(summary.frontmatter.tags, ['authentication', 'security'], 'summary fm: tags');
323
+ assert.deepStrictEqual(summary.frontmatter.provides, ['auth-middleware', 'jwt-validation'], 'summary fm: provides');
324
+ assert.deepStrictEqual(summary.frontmatter.affects, ['api-routes'], 'summary fm: affects');
325
+ assert.deepStrictEqual(summary.frontmatter['tech-stack'], ['jsonwebtoken', 'express'], 'summary fm: tech-stack');
326
+ assert.deepStrictEqual(summary.frontmatter['key-files'], ['src/auth.ts', 'src/middleware/auth.ts'], 'summary fm: key-files');
327
+ assert.deepStrictEqual(summary.frontmatter['key-decisions'], ['Use RS256 for JWT signing', 'Store refresh tokens in DB'], 'summary fm: key-decisions');
328
+ assert.deepStrictEqual(summary.frontmatter['patterns-established'], ['Middleware-based auth'], 'summary fm: patterns-established');
329
+ assert.deepStrictEqual(summary.frontmatter.duration, '2h', 'summary fm: duration');
330
+ assert.deepStrictEqual(summary.frontmatter.completed, '2026-01-15', 'summary fm: completed');
331
+ assert.ok(summary.body.includes('Auth Implementation Summary'), 'summary: body content present');
332
+ });
344
333
 
345
334
  // ═══════════════════════════════════════════════════════════════════════
346
335
  // Requirements Parser Tests
347
336
  // ═══════════════════════════════════════════════════════════════════════
348
337
 
349
- console.log('\n=== parseOldRequirements ===');
350
- {
338
+ test('parseOldRequirements', () => {
351
339
  const reqs = parseOldRequirements(SAMPLE_REQUIREMENTS);
352
- assertEq(reqs.length, 4, 'requirements: 4 entries');
353
- assertEq(reqs[0].id, 'R001', 'req 0: id');
354
- assertEq(reqs[0].title, 'User Authentication', 'req 0: title');
355
- assertEq(reqs[0].status, 'active', 'req 0: status');
356
- assertTrue(reqs[0].description.includes('log in'), 'req 0: description');
357
- assertEq(reqs[2].id, 'R003', 'req 2: id');
358
- assertEq(reqs[2].status, 'validated', 'req 2: status');
359
- assertEq(reqs[3].id, 'R004', 'req 3: id');
360
- assertEq(reqs[3].status, 'deferred', 'req 3: status');
361
- }
340
+ assert.deepStrictEqual(reqs.length, 4, 'requirements: 4 entries');
341
+ assert.deepStrictEqual(reqs[0].id, 'R001', 'req 0: id');
342
+ assert.deepStrictEqual(reqs[0].title, 'User Authentication', 'req 0: title');
343
+ assert.deepStrictEqual(reqs[0].status, 'active', 'req 0: status');
344
+ assert.ok(reqs[0].description.includes('log in'), 'req 0: description');
345
+ assert.deepStrictEqual(reqs[2].id, 'R003', 'req 2: id');
346
+ assert.deepStrictEqual(reqs[2].status, 'validated', 'req 2: status');
347
+ assert.deepStrictEqual(reqs[3].id, 'R004', 'req 3: id');
348
+ assert.deepStrictEqual(reqs[3].status, 'deferred', 'req 3: status');
349
+ });
362
350
 
363
351
  // ═══════════════════════════════════════════════════════════════════════
364
352
  // State Parser Tests
365
353
  // ═══════════════════════════════════════════════════════════════════════
366
354
 
367
- console.log('\n=== parseOldState ===');
368
- {
355
+ test('parseOldState', () => {
369
356
  const state = parseOldState(SAMPLE_STATE);
370
- assertTrue(state.currentPhase?.includes('30') ?? false, 'state: current phase includes 30');
371
- assertEq(state.status, 'in-progress', 'state: status');
372
- assertTrue(state.raw === SAMPLE_STATE, 'state: raw preserved');
373
- }
357
+ assert.ok(state.currentPhase?.includes('30') ?? false, 'state: current phase includes 30');
358
+ assert.deepStrictEqual(state.status, 'in-progress', 'state: status');
359
+ assert.ok(state.raw === SAMPLE_STATE, 'state: raw preserved');
360
+ });
374
361
 
375
362
  // ═══════════════════════════════════════════════════════════════════════
376
363
  // Config Parser Tests
377
364
  // ═══════════════════════════════════════════════════════════════════════
378
365
 
379
- console.log('\n=== parseOldConfig: valid JSON ===');
380
- {
366
+ test('parseOldConfig: valid JSON', () => {
381
367
  const config = parseOldConfig('{"projectName":"test","version":"1.0"}');
382
- assertTrue(config !== null, 'config: parsed');
383
- assertEq(config?.projectName, 'test', 'config: projectName');
384
- }
368
+ assert.ok(config !== null, 'config: parsed');
369
+ assert.deepStrictEqual(config?.projectName, 'test', 'config: projectName');
370
+ });
385
371
 
386
- console.log('\n=== parseOldConfig: invalid JSON → null ===');
387
- {
372
+ test('parseOldConfig: invalid JSON → null', () => {
388
373
  const config = parseOldConfig('not json at all {{{');
389
- assertEq(config, null, 'config: invalid JSON returns null');
390
- }
374
+ assert.deepStrictEqual(config, null, 'config: invalid JSON returns null');
375
+ });
391
376
 
392
- console.log('\n=== parseOldConfig: non-object JSON → null ===');
393
- {
377
+ test('parseOldConfig: non-object JSON → null', () => {
394
378
  const config = parseOldConfig('"just a string"');
395
- assertEq(config, null, 'config: non-object returns null');
396
- }
379
+ assert.deepStrictEqual(config, null, 'config: non-object returns null');
380
+ });
397
381
 
398
382
  // ═══════════════════════════════════════════════════════════════════════
399
383
  // Project Parser Tests
400
384
  // ═══════════════════════════════════════════════════════════════════════
401
385
 
402
- console.log('\n=== parseOldProject ===');
403
- {
386
+ test('parseOldProject', () => {
404
387
  const project = parseOldProject(SAMPLE_PROJECT);
405
- assertEq(project, SAMPLE_PROJECT, 'project: returns raw content');
406
- }
407
-
408
- report();
409
- }
410
-
411
- main().catch((error) => {
412
- console.error(error);
413
- process.exit(1);
388
+ assert.deepStrictEqual(project, SAMPLE_PROJECT, 'project: returns raw content');
414
389
  });
390
+