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
@@ -15,9 +15,9 @@ import {
15
15
  parseOldState,
16
16
  parseOldConfig,
17
17
  } from '../migrate/parsers.ts';
18
- import { describe, test, beforeEach, afterEach } from 'node:test';
19
- import assert from 'node:assert/strict';
18
+ import { createTestContext } from './test-helpers.ts';
20
19
 
20
+ const { assertEq, assertTrue, report } = createTestContext();
21
21
  function createFixtureBase(): string {
22
22
  return mkdtempSync(join(tmpdir(), 'gsd-migrate-t02-'));
23
23
  }
@@ -173,49 +173,55 @@ const SAMPLE_STATE = `# State
173
173
  **Status:** in-progress
174
174
  `;
175
175
 
176
+ async function main(): Promise<void> {
177
+
176
178
  // ═══════════════════════════════════════════════════════════════════════
177
179
  // Validator Tests
178
180
  // ═══════════════════════════════════════════════════════════════════════
179
181
 
180
- test('Validator: missing directory → fatal', async () => {
182
+ console.log('\n=== Validator: missing directory → fatal ===');
183
+ {
181
184
  const base = createFixtureBase();
182
185
  try {
183
186
  const result = await validatePlanningDirectory(join(base, 'nonexistent'));
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');
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');
187
190
  } finally {
188
191
  cleanup(base);
189
192
  }
190
- });
193
+ }
191
194
 
192
- test('Validator: missing ROADMAP.md → warning (not fatal)', async () => {
195
+ console.log('\n=== Validator: missing ROADMAP.md → warning (not fatal) ===');
196
+ {
193
197
  const base = createFixtureBase();
194
198
  try {
195
199
  const planning = createPlanningDir(base);
196
200
  writeFileSync(join(planning, 'PROJECT.md'), SAMPLE_PROJECT);
197
201
  const result = await validatePlanningDirectory(planning);
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');
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');
200
204
  } finally {
201
205
  cleanup(base);
202
206
  }
203
- });
207
+ }
204
208
 
205
- test('Validator: missing PROJECT.md → warning', async () => {
209
+ console.log('\n=== Validator: missing PROJECT.md → warning ===');
210
+ {
206
211
  const base = createFixtureBase();
207
212
  try {
208
213
  const planning = createPlanningDir(base);
209
214
  writeFileSync(join(planning, 'ROADMAP.md'), SAMPLE_ROADMAP);
210
215
  const result = await validatePlanningDirectory(planning);
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');
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');
213
218
  } finally {
214
219
  cleanup(base);
215
220
  }
216
- });
221
+ }
217
222
 
218
- test('Validator: complete directory → valid with no issues', async () => {
223
+ console.log('\n=== Validator: complete directory → valid with no issues ===');
224
+ {
219
225
  const base = createFixtureBase();
220
226
  try {
221
227
  const planning = createPlanningDir(base);
@@ -225,74 +231,78 @@ test('Validator: complete directory → valid with no issues', async () => {
225
231
  writeFileSync(join(planning, 'STATE.md'), SAMPLE_STATE);
226
232
  mkdirSync(join(planning, 'phases'), { recursive: true });
227
233
  const result = await validatePlanningDirectory(planning);
228
- assert.deepStrictEqual(result.valid, true, 'complete dir: validation passes');
229
- assert.deepStrictEqual(result.issues.length, 0, 'complete dir: no issues');
234
+ assertEq(result.valid, true, 'complete dir: validation passes');
235
+ assertEq(result.issues.length, 0, 'complete dir: no issues');
230
236
  } finally {
231
237
  cleanup(base);
232
238
  }
233
- });
239
+ }
234
240
 
235
241
  // ═══════════════════════════════════════════════════════════════════════
236
242
  // Roadmap Parser Tests
237
243
  // ═══════════════════════════════════════════════════════════════════════
238
244
 
239
- test('parseOldRoadmap: flat format', () => {
245
+ console.log('\n=== parseOldRoadmap: flat format ===');
246
+ {
240
247
  const roadmap = parseOldRoadmap(SAMPLE_ROADMAP);
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>', () => {
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
+ {
250
258
  const roadmap = parseOldRoadmap(SAMPLE_MILESTONE_SECTIONED_ROADMAP);
251
- assert.ok(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
259
+ assertTrue(roadmap.milestones.length >= 2, 'ms roadmap: has milestone sections');
252
260
 
253
261
  const v20 = roadmap.milestones.find(m => m.id.includes('2.0'));
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');
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');
258
266
 
259
267
  const v25 = roadmap.milestones.find(m => m.id.includes('2.5'));
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');
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');
263
271
 
264
272
  const p29 = v25?.phases.find(p => p.number === 29);
265
- assert.deepStrictEqual(p29?.done, true, 'ms roadmap: phase 29 done');
273
+ assertEq(p29?.done, true, 'ms roadmap: phase 29 done');
266
274
  const p30 = v25?.phases.find(p => p.number === 30);
267
- assert.deepStrictEqual(p30?.done, false, 'ms roadmap: phase 30 not done');
268
- });
275
+ assertEq(p30?.done, false, 'ms roadmap: phase 30 not done');
276
+ }
269
277
 
270
278
  // ═══════════════════════════════════════════════════════════════════════
271
279
  // Plan Parser Tests
272
280
  // ═══════════════════════════════════════════════════════════════════════
273
281
 
274
- test('parseOldPlan: XML-in-markdown', () => {
282
+ console.log('\n=== parseOldPlan: XML-in-markdown ===');
283
+ {
275
284
  const plan = parseOldPlan(SAMPLE_PLAN_XML, '29-01-PLAN.md', '01');
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');
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');
282
291
 
283
292
  // Frontmatter
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)', () => {
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
+ {
296
306
  const plainPlan = `# 001: Fix Login Bug
297
307
 
298
308
  ## Description
@@ -305,86 +315,100 @@ Fix the login button not responding on mobile.
305
315
  2. Fix event propagation
306
316
  `;
307
317
  const plan = parseOldPlan(plainPlan, '001-PLAN.md', '001');
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
- });
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
+ }
312
322
 
313
323
  // ═══════════════════════════════════════════════════════════════════════
314
324
  // Summary Parser Tests
315
325
  // ═══════════════════════════════════════════════════════════════════════
316
326
 
317
- test('parseOldSummary: YAML frontmatter', () => {
327
+ console.log('\n=== parseOldSummary: YAML frontmatter ===');
328
+ {
318
329
  const summary = parseOldSummary(SAMPLE_SUMMARY, '29-01-SUMMARY.md', '01');
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
- });
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
+ }
333
344
 
334
345
  // ═══════════════════════════════════════════════════════════════════════
335
346
  // Requirements Parser Tests
336
347
  // ═══════════════════════════════════════════════════════════════════════
337
348
 
338
- test('parseOldRequirements', () => {
349
+ console.log('\n=== parseOldRequirements ===');
350
+ {
339
351
  const reqs = parseOldRequirements(SAMPLE_REQUIREMENTS);
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
- });
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
+ }
350
362
 
351
363
  // ═══════════════════════════════════════════════════════════════════════
352
364
  // State Parser Tests
353
365
  // ═══════════════════════════════════════════════════════════════════════
354
366
 
355
- test('parseOldState', () => {
367
+ console.log('\n=== parseOldState ===');
368
+ {
356
369
  const state = parseOldState(SAMPLE_STATE);
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
- });
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
+ }
361
374
 
362
375
  // ═══════════════════════════════════════════════════════════════════════
363
376
  // Config Parser Tests
364
377
  // ═══════════════════════════════════════════════════════════════════════
365
378
 
366
- test('parseOldConfig: valid JSON', () => {
379
+ console.log('\n=== parseOldConfig: valid JSON ===');
380
+ {
367
381
  const config = parseOldConfig('{"projectName":"test","version":"1.0"}');
368
- assert.ok(config !== null, 'config: parsed');
369
- assert.deepStrictEqual(config?.projectName, 'test', 'config: projectName');
370
- });
382
+ assertTrue(config !== null, 'config: parsed');
383
+ assertEq(config?.projectName, 'test', 'config: projectName');
384
+ }
371
385
 
372
- test('parseOldConfig: invalid JSON → null', () => {
386
+ console.log('\n=== parseOldConfig: invalid JSON → null ===');
387
+ {
373
388
  const config = parseOldConfig('not json at all {{{');
374
- assert.deepStrictEqual(config, null, 'config: invalid JSON returns null');
375
- });
389
+ assertEq(config, null, 'config: invalid JSON returns null');
390
+ }
376
391
 
377
- test('parseOldConfig: non-object JSON → null', () => {
392
+ console.log('\n=== parseOldConfig: non-object JSON → null ===');
393
+ {
378
394
  const config = parseOldConfig('"just a string"');
379
- assert.deepStrictEqual(config, null, 'config: non-object returns null');
380
- });
395
+ assertEq(config, null, 'config: non-object returns null');
396
+ }
381
397
 
382
398
  // ═══════════════════════════════════════════════════════════════════════
383
399
  // Project Parser Tests
384
400
  // ═══════════════════════════════════════════════════════════════════════
385
401
 
386
- test('parseOldProject', () => {
402
+ console.log('\n=== parseOldProject ===');
403
+ {
387
404
  const project = parseOldProject(SAMPLE_PROJECT);
388
- assert.deepStrictEqual(project, SAMPLE_PROJECT, 'project: returns raw content');
389
- });
405
+ assertEq(project, SAMPLE_PROJECT, 'project: returns raw content');
406
+ }
390
407
 
408
+ report();
409
+ }
410
+
411
+ main().catch((error) => {
412
+ console.error(error);
413
+ process.exit(1);
414
+ });