gsd-pi 2.44.0-dev.848dd4c → 2.44.0

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 (298) hide show
  1. package/README.md +12 -30
  2. package/dist/resources/extensions/gsd/auto-start.js +0 -10
  3. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -5
  4. package/dist/web/standalone/.next/BUILD_ID +1 -1
  5. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  6. package/dist/web/standalone/.next/build-manifest.json +3 -3
  7. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  8. package/dist/web/standalone/.next/required-server-files.json +3 -3
  9. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  10. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  20. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  31. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  32. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  33. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  34. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  36. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  40. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  42. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  74. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  80. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  94. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  96. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  98. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  100. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  119. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  120. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  121. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware.js +2 -2
  123. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  129. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  130. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +1 -0
  131. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  132. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  133. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  134. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  135. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  136. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  137. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  138. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  139. package/dist/web/standalone/server.js +1 -1
  140. package/package.json +1 -1
  141. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +8 -6
  142. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +26 -24
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +48 -29
  146. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +44 -34
  148. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/session-manager.test.js +34 -30
  150. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +12 -10
  152. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  153. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +47 -43
  154. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  155. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  156. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  157. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +43 -31
  158. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +45 -40
  159. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  160. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  161. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  162. package/src/resources/extensions/gsd/auto-start.ts +0 -14
  163. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -8
  164. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  165. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +16 -14
  166. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +57 -43
  167. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +13 -11
  168. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +523 -465
  169. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +75 -73
  170. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +56 -34
  171. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +656 -533
  172. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +143 -165
  173. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +52 -29
  174. package/src/resources/extensions/gsd/tests/captures.test.ts +176 -148
  175. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +33 -32
  176. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +143 -141
  177. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  178. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  179. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +59 -38
  180. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +263 -228
  181. package/src/resources/extensions/gsd/tests/complete-task.test.ts +302 -250
  182. package/src/resources/extensions/gsd/tests/context-store.test.ts +367 -354
  183. package/src/resources/extensions/gsd/tests/continue-here.test.ts +72 -68
  184. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +106 -92
  185. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +35 -27
  186. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +237 -220
  187. package/src/resources/extensions/gsd/tests/db-writer.test.ts +420 -390
  188. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +92 -76
  189. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +83 -68
  190. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -152
  191. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +101 -78
  192. package/src/resources/extensions/gsd/tests/derive-state.test.ts +227 -192
  193. package/src/resources/extensions/gsd/tests/detection.test.ts +278 -232
  194. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +34 -30
  195. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +180 -164
  196. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +49 -43
  197. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +32 -28
  198. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +29 -27
  199. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +38 -34
  200. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +75 -54
  201. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +32 -21
  202. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +97 -72
  203. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +44 -38
  204. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +145 -104
  205. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +106 -84
  206. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +60 -54
  207. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +93 -72
  208. package/src/resources/extensions/gsd/tests/doctor.test.ts +134 -104
  209. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +131 -123
  210. package/src/resources/extensions/gsd/tests/exit-command.test.ts +24 -20
  211. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +57 -48
  212. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +7 -5
  213. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +42 -30
  214. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +206 -198
  215. package/src/resources/extensions/gsd/tests/git-locale.test.ts +27 -13
  216. package/src/resources/extensions/gsd/tests/git-service.test.ts +388 -285
  217. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +39 -31
  218. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +69 -63
  219. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +264 -255
  220. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +119 -108
  221. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +103 -81
  222. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +262 -229
  223. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  224. package/src/resources/extensions/gsd/tests/health-widget.test.ts +37 -29
  225. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +102 -81
  226. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +18 -16
  227. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +46 -41
  228. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +53 -42
  229. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +91 -75
  230. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  231. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +194 -150
  232. package/src/resources/extensions/gsd/tests/md-importer.test.ts +125 -101
  233. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +54 -45
  234. package/src/resources/extensions/gsd/tests/memory-store.test.ts +93 -80
  235. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +66 -57
  236. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +93 -83
  237. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +170 -161
  238. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +141 -125
  239. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +131 -107
  240. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +96 -87
  241. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +164 -125
  242. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +94 -81
  243. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +36 -35
  244. package/src/resources/extensions/gsd/tests/overrides.test.ts +106 -99
  245. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +47 -40
  246. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +28 -25
  247. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +83 -66
  248. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +77 -54
  249. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +115 -68
  250. package/src/resources/extensions/gsd/tests/parsers.test.ts +611 -546
  251. package/src/resources/extensions/gsd/tests/paths.test.ts +87 -72
  252. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +117 -77
  253. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  254. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +119 -93
  255. package/src/resources/extensions/gsd/tests/queue-order.test.ts +82 -70
  256. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +55 -42
  257. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +73 -45
  258. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +38 -28
  259. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +80 -73
  260. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +74 -71
  261. package/src/resources/extensions/gsd/tests/requirements.test.ts +75 -70
  262. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +66 -44
  263. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +181 -114
  264. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +65 -63
  265. package/src/resources/extensions/gsd/tests/run-uat.test.ts +128 -66
  266. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +25 -18
  267. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +44 -37
  268. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +26 -19
  269. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +8 -6
  270. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +28 -22
  271. package/src/resources/extensions/gsd/tests/token-savings.test.ts +56 -54
  272. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +25 -23
  273. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -9
  274. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +82 -66
  275. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +47 -46
  276. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +22 -20
  277. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +86 -84
  278. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +43 -41
  279. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +96 -94
  280. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +13 -11
  281. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +29 -27
  282. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +52 -50
  283. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +13 -10
  284. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +18 -14
  285. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +39 -38
  286. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +21 -17
  287. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +30 -25
  288. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +37 -30
  289. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +22 -15
  290. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +66 -59
  291. package/src/resources/extensions/gsd/tests/worktree.test.ts +50 -44
  292. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  295. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
  296. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -63
  297. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_buildManifest.js +0 -0
  298. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_ssgManifest.js +0 -0
@@ -12,16 +12,20 @@
12
12
  * Also covers dependency expansion (range syntax) and edge cases.
13
13
  */
14
14
 
15
- import { describe, test } from 'node:test';
16
- import assert from 'node:assert/strict';
17
15
  import { parseRoadmapSlices, expandDependencies } from '../roadmap-slices.ts';
16
+ import { createTestContext } from './test-helpers.ts';
17
+
18
+ const { assertEq, assertTrue, report } = createTestContext();
19
+
20
+ async function main(): Promise<void> {
21
+
18
22
  // ═══════════════════════════════════════════════════════════════════════
19
23
  // A. Standard machine-readable format (should always work)
20
24
  // ═══════════════════════════════════════════════════════════════════════
21
25
 
26
+ console.log('\n=== A. Standard checkbox format ===');
22
27
 
23
- describe('roadmap-parse-regression', () => {
24
- test('A. Standard checkbox format', () => {
28
+ {
25
29
  const content = [
26
30
  '# M001: Test Project',
27
31
  '',
@@ -36,27 +40,30 @@ test('A. Standard checkbox format', () => {
36
40
  ].join('\n');
37
41
 
38
42
  const slices = parseRoadmapSlices(content);
39
- assert.deepStrictEqual(slices.length, 3, 'standard format: 3 slices');
40
- assert.deepStrictEqual(slices[0].id, 'S01', 'S01 id');
41
- assert.deepStrictEqual(slices[0].title, 'First Slice', 'S01 title');
42
- assert.deepStrictEqual(slices[0].done, false, 'S01 not done');
43
- assert.deepStrictEqual(slices[0].risk, 'low', 'S01 risk');
44
- assert.deepStrictEqual(slices[0].depends.length, 0, 'S01 no deps');
45
-
46
- assert.deepStrictEqual(slices[1].id, 'S02', 'S02 id');
47
- assert.deepStrictEqual(slices[1].depends.length, 1, 'S02 has 1 dep');
48
- assert.deepStrictEqual(slices[1].depends[0], 'S01', 'S02 depends on S01');
49
-
50
- assert.deepStrictEqual(slices[2].id, 'S03', 'S03 id');
51
- assert.deepStrictEqual(slices[2].done, true, 'S03 is done');
52
- assert.deepStrictEqual(slices[2].risk, 'high', 'S03 risk');
53
- assert.deepStrictEqual(slices[2].depends.length, 2, 'S03 has 2 deps');
54
- });
43
+ assertEq(slices.length, 3, 'standard format: 3 slices');
44
+ assertEq(slices[0].id, 'S01', 'S01 id');
45
+ assertEq(slices[0].title, 'First Slice', 'S01 title');
46
+ assertEq(slices[0].done, false, 'S01 not done');
47
+ assertEq(slices[0].risk, 'low', 'S01 risk');
48
+ assertEq(slices[0].depends.length, 0, 'S01 no deps');
49
+
50
+ assertEq(slices[1].id, 'S02', 'S02 id');
51
+ assertEq(slices[1].depends.length, 1, 'S02 has 1 dep');
52
+ assertEq(slices[1].depends[0], 'S01', 'S02 depends on S01');
53
+
54
+ assertEq(slices[2].id, 'S03', 'S03 id');
55
+ assertEq(slices[2].done, true, 'S03 is done');
56
+ assertEq(slices[2].risk, 'high', 'S03 risk');
57
+ assertEq(slices[2].depends.length, 2, 'S03 has 2 deps');
58
+ }
55
59
 
56
60
  // ═══════════════════════════════════════════════════════════════════════
57
61
  // B. Prose fallback: H2 with colon (the only format the old regex matched)
58
62
  // ═══════════════════════════════════════════════════════════════════════
59
- test('B. Prose fallback: H2 with colon', () => {
63
+
64
+ console.log('\n=== B. Prose fallback: H2 with colon ===');
65
+
66
+ {
60
67
  const content = [
61
68
  '# M001: Test',
62
69
  '',
@@ -71,17 +78,20 @@ test('B. Prose fallback: H2 with colon', () => {
71
78
  ].join('\n');
72
79
 
73
80
  const slices = parseRoadmapSlices(content);
74
- assert.deepStrictEqual(slices.length, 2, 'prose H2 colon: 2 slices');
75
- assert.deepStrictEqual(slices[0].id, 'S01', 'S01 id');
76
- assert.deepStrictEqual(slices[0].title, 'Setup Foundation', 'S01 title');
77
- assert.deepStrictEqual(slices[1].id, 'S02', 'S02 id');
78
- assert.deepStrictEqual(slices[1].title, 'Core Features', 'S02 title');
79
- });
81
+ assertEq(slices.length, 2, 'prose H2 colon: 2 slices');
82
+ assertEq(slices[0].id, 'S01', 'S01 id');
83
+ assertEq(slices[0].title, 'Setup Foundation', 'S01 title');
84
+ assertEq(slices[1].id, 'S02', 'S02 id');
85
+ assertEq(slices[1].title, 'Core Features', 'S02 title');
86
+ }
80
87
 
81
88
  // ═══════════════════════════════════════════════════════════════════════
82
89
  // C. Regression #1248: H3 headers (the old regex only matched ##)
83
90
  // ═══════════════════════════════════════════════════════════════════════
84
- test('C. #1248: H3 headers', () => {
91
+
92
+ console.log('\n=== C. #1248: H3 headers ===');
93
+
94
+ {
85
95
  const content = [
86
96
  '# M001: Test',
87
97
  '',
@@ -96,15 +106,18 @@ test('C. #1248: H3 headers', () => {
96
106
  ].join('\n');
97
107
 
98
108
  const slices = parseRoadmapSlices(content);
99
- assert.deepStrictEqual(slices.length, 2, '#1248 H3: 2 slices parsed');
100
- assert.deepStrictEqual(slices[0].id, 'S01', 'S01 from H3');
101
- assert.deepStrictEqual(slices[1].id, 'S02', 'S02 from H3');
102
- });
109
+ assertEq(slices.length, 2, '#1248 H3: 2 slices parsed');
110
+ assertEq(slices[0].id, 'S01', 'S01 from H3');
111
+ assertEq(slices[1].id, 'S02', 'S02 from H3');
112
+ }
103
113
 
104
114
  // ═══════════════════════════════════════════════════════════════════════
105
115
  // D. Regression #1248: H4 headers
106
116
  // ═══════════════════════════════════════════════════════════════════════
107
- test('D. #1248: H4 headers', () => {
117
+
118
+ console.log('\n=== D. #1248: H4 headers ===');
119
+
120
+ {
108
121
  const content = [
109
122
  '# M001: Test',
110
123
  '',
@@ -115,13 +128,16 @@ test('D. #1248: H4 headers', () => {
115
128
  ].join('\n');
116
129
 
117
130
  const slices = parseRoadmapSlices(content);
118
- assert.deepStrictEqual(slices.length, 2, '#1248 H4: 2 slices parsed');
119
- });
131
+ assertEq(slices.length, 2, '#1248 H4: 2 slices parsed');
132
+ }
120
133
 
121
134
  // ═══════════════════════════════════════════════════════════════════════
122
135
  // E. Regression #1248: H1 header (unusual but LLMs produce it)
123
136
  // ═══════════════════════════════════════════════════════════════════════
124
- test('E. #1248: H1 headers', () => {
137
+
138
+ console.log('\n=== E. #1248: H1 headers ===');
139
+
140
+ {
125
141
  const content = [
126
142
  '# S01: Setup Foundation',
127
143
  '',
@@ -134,76 +150,97 @@ test('E. #1248: H1 headers', () => {
134
150
  ].join('\n');
135
151
 
136
152
  const slices = parseRoadmapSlices(content);
137
- assert.deepStrictEqual(slices.length, 2, '#1248 H1: 2 slices parsed');
138
- });
153
+ assertEq(slices.length, 2, '#1248 H1: 2 slices parsed');
154
+ }
139
155
 
140
156
  // ═══════════════════════════════════════════════════════════════════════
141
157
  // F. Regression #1248: Bold-wrapped IDs
142
158
  // ═══════════════════════════════════════════════════════════════════════
143
- test('F. #1248: Bold-wrapped', () => {
159
+
160
+ console.log('\n=== F. #1248: Bold-wrapped ===');
161
+
162
+ {
144
163
  const content1 = '## **S01: Setup Foundation**\n\nDo stuff.\n\n## **S02: Features**\n\nMore stuff.\n';
145
164
  const slices1 = parseRoadmapSlices(content1);
146
- assert.deepStrictEqual(slices1.length, 2, 'bold-wrapped: 2 slices');
147
- assert.deepStrictEqual(slices1[0].title, 'Setup Foundation', 'bold-wrapped: title extracted without bold');
165
+ assertEq(slices1.length, 2, 'bold-wrapped: 2 slices');
166
+ assertEq(slices1[0].title, 'Setup Foundation', 'bold-wrapped: title extracted without bold');
148
167
 
149
168
  const content2 = '## **S01**: Setup Foundation\n\n## **S02**: Features\n';
150
169
  const slices2 = parseRoadmapSlices(content2);
151
- assert.deepStrictEqual(slices2.length, 2, 'bold ID only: 2 slices');
152
- });
170
+ assertEq(slices2.length, 2, 'bold ID only: 2 slices');
171
+ }
153
172
 
154
173
  // ═══════════════════════════════════════════════════════════════════════
155
174
  // G. Regression #1248: Dot separator
156
175
  // ═══════════════════════════════════════════════════════════════════════
157
- test('G. #1248: Dot separator', () => {
176
+
177
+ console.log('\n=== G. #1248: Dot separator ===');
178
+
179
+ {
158
180
  const content = '## S01. Setup Foundation\n\n## S02. Core Features\n';
159
181
  const slices = parseRoadmapSlices(content);
160
- assert.deepStrictEqual(slices.length, 2, 'dot separator: 2 slices');
161
- assert.deepStrictEqual(slices[0].title, 'Setup Foundation', 'dot separator: title');
162
- });
182
+ assertEq(slices.length, 2, 'dot separator: 2 slices');
183
+ assertEq(slices[0].title, 'Setup Foundation', 'dot separator: title');
184
+ }
163
185
 
164
186
  // ═══════════════════════════════════════════════════════════════════════
165
187
  // H. Regression #1248: Em dash separator
166
188
  // ═══════════════════════════════════════════════════════════════════════
167
- test('H. #1248: Em/en dash separators', () => {
189
+
190
+ console.log('\n=== H. #1248: Em/en dash separators ===');
191
+
192
+ {
168
193
  const content = '## S01 — Setup Foundation\n\n## S02 – Core Features\n';
169
194
  const slices = parseRoadmapSlices(content);
170
- assert.deepStrictEqual(slices.length, 2, 'em/en dash: 2 slices');
171
- });
195
+ assertEq(slices.length, 2, 'em/en dash: 2 slices');
196
+ }
172
197
 
173
198
  // ═══════════════════════════════════════════════════════════════════════
174
199
  // I. Regression #1248: Space-only separator (no punctuation)
175
200
  // ═══════════════════════════════════════════════════════════════════════
176
- test('I. #1248: Space-only separator', () => {
201
+
202
+ console.log('\n=== I. #1248: Space-only separator ===');
203
+
204
+ {
177
205
  const content = '## S01 Setup Foundation\n\n## S02 Core Features\n';
178
206
  const slices = parseRoadmapSlices(content);
179
- assert.deepStrictEqual(slices.length, 2, 'space-only: 2 slices');
180
- assert.deepStrictEqual(slices[0].title, 'Setup Foundation', 'space-only: title');
181
- });
207
+ assertEq(slices.length, 2, 'space-only: 2 slices');
208
+ assertEq(slices[0].title, 'Setup Foundation', 'space-only: title');
209
+ }
182
210
 
183
211
  // ═══════════════════════════════════════════════════════════════════════
184
212
  // J. Regression #1248: Non-zero-padded IDs
185
213
  // ═══════════════════════════════════════════════════════════════════════
186
- test('J. #1248: Non-zero-padded IDs', () => {
214
+
215
+ console.log('\n=== J. #1248: Non-zero-padded IDs ===');
216
+
217
+ {
187
218
  const content = '## S1: Setup\n\n## S2: Features\n';
188
219
  const slices = parseRoadmapSlices(content);
189
- assert.deepStrictEqual(slices.length, 2, 'non-padded: 2 slices');
190
- assert.deepStrictEqual(slices[0].id, 'S1', 'non-padded: S1');
191
- });
220
+ assertEq(slices.length, 2, 'non-padded: 2 slices');
221
+ assertEq(slices[0].id, 'S1', 'non-padded: S1');
222
+ }
192
223
 
193
224
  // ═══════════════════════════════════════════════════════════════════════
194
225
  // K. Regression #1248: "Slice" prefix
195
226
  // ═══════════════════════════════════════════════════════════════════════
196
- test('K. #1248: "Slice" prefix', () => {
227
+
228
+ console.log('\n=== K. #1248: "Slice" prefix ===');
229
+
230
+ {
197
231
  const content = '## Slice S01: Setup Foundation\n\n## Slice S02: Core Features\n';
198
232
  const slices = parseRoadmapSlices(content);
199
- assert.deepStrictEqual(slices.length, 2, 'Slice prefix: 2 slices');
200
- assert.deepStrictEqual(slices[0].id, 'S01', 'Slice prefix: S01');
201
- });
233
+ assertEq(slices.length, 2, 'Slice prefix: 2 slices');
234
+ assertEq(slices[0].id, 'S01', 'Slice prefix: S01');
235
+ }
202
236
 
203
237
  // ═══════════════════════════════════════════════════════════════════════
204
238
  // L. Prose with "Depends on:" line
205
239
  // ═══════════════════════════════════════════════════════════════════════
206
- test('L. Prose with Depends on:', () => {
240
+
241
+ console.log('\n=== L. Prose with Depends on: ===');
242
+
243
+ {
207
244
  const content = [
208
245
  '## S01: Foundation',
209
246
  '',
@@ -217,17 +254,20 @@ test('L. Prose with Depends on:', () => {
217
254
  ].join('\n');
218
255
 
219
256
  const slices = parseRoadmapSlices(content);
220
- assert.deepStrictEqual(slices.length, 2, 'prose deps: 2 slices');
221
- assert.deepStrictEqual(slices[1].depends.length, 1, 'S02 has 1 dep');
222
- assert.deepStrictEqual(slices[1].depends[0], 'S01', 'S02 depends on S01');
223
- });
257
+ assertEq(slices.length, 2, 'prose deps: 2 slices');
258
+ assertEq(slices[1].depends.length, 1, 'S02 has 1 dep');
259
+ assertEq(slices[1].depends[0], 'S01', 'S02 depends on S01');
260
+ }
224
261
 
225
262
  // ═══════════════════════════════════════════════════════════════════════
226
263
  // M. Empty / edge cases
227
264
  // ═══════════════════════════════════════════════════════════════════════
228
- test('M. Edge cases', () => {
229
- assert.deepStrictEqual(parseRoadmapSlices('').length, 0, 'empty content → 0 slices');
230
- assert.deepStrictEqual(parseRoadmapSlices('# Just a title\n\nSome text.').length, 0, 'no slices at all → 0');
265
+
266
+ console.log('\n=== M. Edge cases ===');
267
+
268
+ {
269
+ assertEq(parseRoadmapSlices('').length, 0, 'empty content → 0 slices');
270
+ assertEq(parseRoadmapSlices('# Just a title\n\nSome text.').length, 0, 'no slices at all → 0');
231
271
 
232
272
  // Mixed format: ## Slices section with one checkbox + prose below
233
273
  const mixed = [
@@ -241,69 +281,81 @@ test('M. Edge cases', () => {
241
281
  ].join('\n');
242
282
  const mixedSlices = parseRoadmapSlices(mixed);
243
283
  // The ## Slices section takes priority — prose headers outside it aren't picked up
244
- assert.deepStrictEqual(mixedSlices.length, 1, 'mixed: only 1 slice from ## Slices section');
245
- assert.deepStrictEqual(mixedSlices[0].id, 'S01', 'mixed: S01 from checkbox');
246
- });
284
+ assertEq(mixedSlices.length, 1, 'mixed: only 1 slice from ## Slices section');
285
+ assertEq(mixedSlices[0].id, 'S01', 'mixed: S01 from checkbox');
286
+ }
247
287
 
248
288
  // ═══════════════════════════════════════════════════════════════════════
249
289
  // N. Dependency range expansion
250
290
  // ═══════════════════════════════════════════════════════════════════════
251
- test('N. Dependency range expansion', () => {
252
- assert.deepStrictEqual(
291
+
292
+ console.log('\n=== N. Dependency range expansion ===');
293
+
294
+ {
295
+ assertEq(
253
296
  expandDependencies(['S01-S04']),
254
297
  ['S01', 'S02', 'S03', 'S04'],
255
298
  'S01-S04 → 4 individual deps',
256
299
  );
257
300
 
258
- assert.deepStrictEqual(
301
+ assertEq(
259
302
  expandDependencies(['S01..S03']),
260
303
  ['S01', 'S02', 'S03'],
261
304
  'S01..S03 → 3 individual deps',
262
305
  );
263
306
 
264
- assert.deepStrictEqual(
307
+ assertEq(
265
308
  expandDependencies(['S01']),
266
309
  ['S01'],
267
310
  'single dep passes through',
268
311
  );
269
312
 
270
- assert.deepStrictEqual(
313
+ assertEq(
271
314
  expandDependencies(['S01', 'S03-S05']),
272
315
  ['S01', 'S03', 'S04', 'S05'],
273
316
  'mixed single + range',
274
317
  );
275
318
 
276
- assert.deepStrictEqual(
319
+ assertEq(
277
320
  expandDependencies(['']),
278
321
  [],
279
322
  'empty string filtered out',
280
323
  );
281
- });
324
+ }
282
325
 
283
326
  // ═══════════════════════════════════════════════════════════════════════
284
327
  // O. No-separator colon-less: "S01:Title" (no space after colon)
285
328
  // ═══════════════════════════════════════════════════════════════════════
286
- test('O. No space after colon', () => {
329
+
330
+ console.log('\n=== O. No space after colon ===');
331
+
332
+ {
287
333
  const content = '## S01:Foundation\n\n## S02:Features\n';
288
334
  const slices = parseRoadmapSlices(content);
289
335
  // The regex uses [:\s.—–-]* which allows colon with no space
290
- assert.deepStrictEqual(slices.length, 2, 'no-space-colon: 2 slices');
291
- });
336
+ assertEq(slices.length, 2, 'no-space-colon: 2 slices');
337
+ }
292
338
 
293
339
  // ═══════════════════════════════════════════════════════════════════════
294
340
  // P. Three-digit padded IDs
295
341
  // ═══════════════════════════════════════════════════════════════════════
296
- test('P. Three-digit padded IDs', () => {
342
+
343
+ console.log('\n=== P. Three-digit padded IDs ===');
344
+
345
+ {
297
346
  const content = '## S001: Foundation\n\n## S002: Features\n';
298
347
  const slices = parseRoadmapSlices(content);
299
- assert.deepStrictEqual(slices.length, 2, 'three-digit: 2 slices');
300
- assert.deepStrictEqual(slices[0].id, 'S001', 'three-digit: S001');
301
- });
348
+ assertEq(slices.length, 2, 'three-digit: 2 slices');
349
+ assertEq(slices[0].id, 'S001', 'three-digit: S001');
350
+ }
302
351
 
303
352
  // ═══════════════════════════════════════════════════════════════════════
304
353
  // Q. Regression #1736: Table format under ## Slices
305
354
  // ═══════════════════════════════════════════════════════════════════════
306
- test('Q. #1736: Table format under ## Slices', () => {
355
+
356
+ console.log('\n=== Q. #1736: Table format under ## Slices ===');
357
+
358
+ {
307
359
  const content = [
308
360
  '# M001: Test',
309
361
  '',
@@ -319,19 +371,22 @@ test('Q. #1736: Table format under ## Slices', () => {
319
371
  ].join('\n');
320
372
 
321
373
  const slices = parseRoadmapSlices(content);
322
- assert.deepStrictEqual(slices.length, 3, '#1736 table: 3 slices');
323
- assert.deepStrictEqual(slices[0].id, 'S01', '#1736 table: S01 id');
324
- assert.deepStrictEqual(slices[0].title, 'Setup Foundation', '#1736 table: S01 title');
325
- assert.deepStrictEqual(slices[0].done, true, '#1736 table: S01 done');
326
- assert.deepStrictEqual(slices[0].risk, 'low', '#1736 table: S01 risk');
327
- assert.deepStrictEqual(slices[1].done, false, '#1736 table: S02 not done');
328
- assert.deepStrictEqual(slices[2].done, true, '#1736 table: S03 done');
329
- });
374
+ assertEq(slices.length, 3, '#1736 table: 3 slices');
375
+ assertEq(slices[0].id, 'S01', '#1736 table: S01 id');
376
+ assertEq(slices[0].title, 'Setup Foundation', '#1736 table: S01 title');
377
+ assertEq(slices[0].done, true, '#1736 table: S01 done');
378
+ assertEq(slices[0].risk, 'low', '#1736 table: S01 risk');
379
+ assertEq(slices[1].done, false, '#1736 table: S02 not done');
380
+ assertEq(slices[2].done, true, '#1736 table: S03 done');
381
+ }
330
382
 
331
383
  // ═══════════════════════════════════════════════════════════════════════
332
384
  // R. Regression #1736: Table format under ## Slice Overview
333
385
  // ═══════════════════════════════════════════════════════════════════════
334
- test('R. #1736: Table format under ## Slice Overview', () => {
386
+
387
+ console.log('\n=== R. #1736: Table format under ## Slice Overview ===');
388
+
389
+ {
335
390
  const content = [
336
391
  '# M002: Overview Heading',
337
392
  '',
@@ -345,15 +400,18 @@ test('R. #1736: Table format under ## Slice Overview', () => {
345
400
  ].join('\n');
346
401
 
347
402
  const slices = parseRoadmapSlices(content);
348
- assert.deepStrictEqual(slices.length, 2, '#1736 overview: 2 slices');
349
- assert.deepStrictEqual(slices[0].done, true, '#1736 overview: S01 done');
350
- assert.deepStrictEqual(slices[1].done, false, '#1736 overview: S02 not done');
351
- });
403
+ assertEq(slices.length, 2, '#1736 overview: 2 slices');
404
+ assertEq(slices[0].done, true, '#1736 overview: S01 done');
405
+ assertEq(slices[1].done, false, '#1736 overview: S02 not done');
406
+ }
352
407
 
353
408
  // ═══════════════════════════════════════════════════════════════════════
354
409
  // S. Regression #1736: Table with Done/Complete text status
355
410
  // ═══════════════════════════════════════════════════════════════════════
356
- test('S. #1736: Table with text status', () => {
411
+
412
+ console.log('\n=== S. #1736: Table with text status ===');
413
+
414
+ {
357
415
  const content = [
358
416
  '# M003: Status Text',
359
417
  '',
@@ -368,16 +426,19 @@ test('S. #1736: Table with text status', () => {
368
426
  ].join('\n');
369
427
 
370
428
  const slices = parseRoadmapSlices(content);
371
- assert.deepStrictEqual(slices.length, 3, '#1736 text status: 3 slices');
372
- assert.ok(slices[0].done, '#1736 text status: Done = true');
373
- assert.ok(!slices[1].done, '#1736 text status: Pending = false');
374
- assert.ok(slices[2].done, '#1736 text status: Completed = true');
375
- });
429
+ assertEq(slices.length, 3, '#1736 text status: 3 slices');
430
+ assertTrue(slices[0].done, '#1736 text status: Done = true');
431
+ assertTrue(!slices[1].done, '#1736 text status: Pending = false');
432
+ assertTrue(slices[2].done, '#1736 text status: Completed = true');
433
+ }
376
434
 
377
435
  // ═══════════════════════════════════════════════════════════════════════
378
436
  // T. Regression #1736: Checkbox format still works after table support
379
437
  // ═══════════════════════════════════════════════════════════════════════
380
- test('T. #1736: Checkbox format unchanged', () => {
438
+
439
+ console.log('\n=== T. #1736: Checkbox format unchanged ===');
440
+
441
+ {
381
442
  const content = [
382
443
  '# M005: Unchanged',
383
444
  '',
@@ -390,10 +451,16 @@ test('T. #1736: Checkbox format unchanged', () => {
390
451
  ].join('\n');
391
452
 
392
453
  const slices = parseRoadmapSlices(content);
393
- assert.deepStrictEqual(slices.length, 2, '#1736 checkbox compat: 2 slices');
394
- assert.deepStrictEqual(slices[0].done, true, '#1736 checkbox compat: S01 done');
395
- assert.deepStrictEqual(slices[0].demo, 'demo works.', '#1736 checkbox compat: demo');
396
- assert.deepStrictEqual(slices[1].done, false, '#1736 checkbox compat: S02 not done');
397
- });
398
-
454
+ assertEq(slices.length, 2, '#1736 checkbox compat: 2 slices');
455
+ assertEq(slices[0].done, true, '#1736 checkbox compat: S01 done');
456
+ assertEq(slices[0].demo, 'demo works.', '#1736 checkbox compat: demo');
457
+ assertEq(slices[1].done, false, '#1736 checkbox compat: S02 not done');
458
+ }
459
+
460
+ report();
461
+ }
462
+
463
+ main().catch((error) => {
464
+ console.error(error);
465
+ process.exit(1);
399
466
  });