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
@@ -7,16 +7,17 @@
7
7
  * Relates to #1269, #1293.
8
8
  */
9
9
 
10
- import { describe, test } from 'node:test';
11
- import assert from 'node:assert/strict';
12
10
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from "node:fs";
13
11
  import { join } from "node:path";
14
12
  import { tmpdir } from "node:os";
15
13
  import { execSync } from "node:child_process";
16
14
 
15
+ import { createTestContext } from './test-helpers.ts';
17
16
  import { captureIntegrationBranch, getCurrentBranch } from "../worktree.ts";
18
17
  import { readIntegrationBranch, QUICK_BRANCH_RE } from "../git-service.ts";
19
18
 
19
+ const { assertEq, assertTrue, report } = createTestContext();
20
+
20
21
  function run(command: string, cwd: string): string {
21
22
  return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
22
23
  }
@@ -34,59 +35,68 @@ function createTestRepo(): string {
34
35
  return repo;
35
36
  }
36
37
 
38
+ async function main(): Promise<void> {
39
+
37
40
  // ═══════════════════════════════════════════════════════════════════════
38
41
  // QUICK_BRANCH_RE
39
42
  // ═══════════════════════════════════════════════════════════════════════
40
43
 
44
+ console.log("\n=== QUICK_BRANCH_RE: matches quick-task branches ===");
41
45
 
42
- describe('quick-branch-lifecycle', () => {
43
- test('QUICK_BRANCH_RE: matches quick-task branches', () => {
44
- assert.ok(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
45
- });
46
+ assertTrue(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
47
+ assertTrue(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
48
+ assertTrue(!QUICK_BRANCH_RE.test("main"), "rejects main");
49
+ assertTrue(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
50
+ assertTrue(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
51
+ assertTrue(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
46
52
 
47
- assert.ok(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
48
- assert.ok(!QUICK_BRANCH_RE.test("main"), "rejects main");
49
- assert.ok(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
50
- assert.ok(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
51
- assert.ok(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
52
53
  // ═══════════════════════════════════════════════════════════════════════
53
54
  // captureIntegrationBranch: guard against quick-task branches
54
55
  // ═══════════════════════════════════════════════════════════════════════
55
- test('captureIntegrationBranch: skips quick-task branches', () => {
56
+
57
+ console.log("\n=== captureIntegrationBranch: skips quick-task branches ===");
58
+
59
+ {
56
60
  const repo = createTestRepo();
57
61
 
58
62
  // Create and checkout a quick-task branch
59
63
  run("git checkout -b gsd/quick/1-fix-typo", repo);
60
- assert.deepStrictEqual(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
64
+ assertEq(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
61
65
 
62
66
  captureIntegrationBranch(repo, "M001");
63
67
 
64
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null,
68
+ assertEq(readIntegrationBranch(repo, "M001"), null,
65
69
  "captureIntegrationBranch is a no-op on quick-task branches");
66
70
 
67
71
  rmSync(repo, { recursive: true, force: true });
68
- });
72
+ }
69
73
 
70
74
  // ─── Verify main is still recorded correctly ─────────────────────────
71
- test('captureIntegrationBranch: records main correctly', () => {
75
+
76
+ console.log("\n=== captureIntegrationBranch: records main correctly ===");
77
+
78
+ {
72
79
  const repo = createTestRepo();
73
80
 
74
81
  // Capture from main — should work normally
75
82
  captureIntegrationBranch(repo, "M001");
76
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
83
+ assertEq(readIntegrationBranch(repo, "M001"), "main",
77
84
  "main is recorded as integration branch");
78
85
 
79
86
  // Switch to quick branch — capture should be no-op (doesn't overwrite main)
80
87
  run("git checkout -b gsd/quick/1-fix-typo", repo);
81
88
  captureIntegrationBranch(repo, "M001");
82
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
89
+ assertEq(readIntegrationBranch(repo, "M001"), "main",
83
90
  "quick branch does not overwrite existing integration branch");
84
91
 
85
92
  rmSync(repo, { recursive: true, force: true });
86
- });
93
+ }
87
94
 
88
95
  // ─── Sequence: main → quick → back to main → capture ────────────────
89
- test('captureIntegrationBranch: correct after quick branch round-trip', () => {
96
+
97
+ console.log("\n=== captureIntegrationBranch: correct after quick branch round-trip ===");
98
+
99
+ {
90
100
  const repo = createTestRepo();
91
101
 
92
102
  // Simulate quick-task lifecycle: branch off, do work, return to main
@@ -101,16 +111,19 @@ test('captureIntegrationBranch: correct after quick branch round-trip', () => {
101
111
 
102
112
  // Now capture — should get main, not the deleted quick branch
103
113
  captureIntegrationBranch(repo, "M002");
104
- assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
114
+ assertEq(readIntegrationBranch(repo, "M002"), "main",
105
115
  "after quick round-trip, main is captured correctly");
106
116
 
107
117
  rmSync(repo, { recursive: true, force: true });
108
- });
118
+ }
109
119
 
110
120
  // ═══════════════════════════════════════════════════════════════════════
111
121
  // cleanupQuickBranch: in-memory path (same session)
112
122
  // ═══════════════════════════════════════════════════════════════════════
113
- test('cleanupQuickBranch: merges back and cleans up (same session)', async () => {
123
+
124
+ console.log("\n=== cleanupQuickBranch: merges back and cleans up (same session) ===");
125
+
126
+ {
114
127
  const repo = createTestRepo();
115
128
  const origCwd = process.cwd();
116
129
 
@@ -142,27 +155,30 @@ test('cleanupQuickBranch: merges back and cleans up (same session)', async () =>
142
155
  const { cleanupQuickBranch } = await import("../quick.ts");
143
156
  const result = cleanupQuickBranch();
144
157
 
145
- assert.ok(result, "cleanupQuickBranch returns true");
146
- assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cleanup");
158
+ assertTrue(result, "cleanupQuickBranch returns true");
159
+ assertEq(getCurrentBranch(repo), "main", "back on main after cleanup");
147
160
 
148
161
  // Verify merge happened — fix.txt should exist on main
149
- assert.ok(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
162
+ assertTrue(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
150
163
 
151
164
  // Verify quick branch deleted
152
165
  const branches = run("git branch", repo);
153
- assert.ok(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
166
+ assertTrue(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
154
167
 
155
168
  // Verify disk state cleaned up
156
- assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
169
+ assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
157
170
 
158
171
  process.chdir(origCwd);
159
172
  rmSync(repo, { recursive: true, force: true });
160
- });
173
+ }
161
174
 
162
175
  // ═══════════════════════════════════════════════════════════════════════
163
176
  // cleanupQuickBranch: cross-session recovery from disk
164
177
  // ═══════════════════════════════════════════════════════════════════════
165
- test('cleanupQuickBranch: recovers from disk state (cross-session)', async () => {
178
+
179
+ console.log("\n=== cleanupQuickBranch: recovers from disk state (cross-session) ===");
180
+
181
+ {
166
182
  const repo = createTestRepo();
167
183
  const origCwd = process.cwd();
168
184
 
@@ -190,19 +206,22 @@ test('cleanupQuickBranch: recovers from disk state (cross-session)', async () =>
190
206
  const { cleanupQuickBranch } = await import("../quick.ts");
191
207
  const result = cleanupQuickBranch();
192
208
 
193
- assert.ok(result, "cross-session recovery returns true");
194
- assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
195
- assert.ok(existsSync(join(repo, "docs.md")), "docs.md merged to main");
196
- assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
209
+ assertTrue(result, "cross-session recovery returns true");
210
+ assertEq(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
211
+ assertTrue(existsSync(join(repo, "docs.md")), "docs.md merged to main");
212
+ assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
197
213
 
198
214
  process.chdir(origCwd);
199
215
  rmSync(repo, { recursive: true, force: true });
200
- });
216
+ }
201
217
 
202
218
  // ═══════════════════════════════════════════════════════════════════════
203
219
  // cleanupQuickBranch: no-op when no pending state
204
220
  // ═══════════════════════════════════════════════════════════════════════
205
- test('cleanupQuickBranch: no-op without pending state', async () => {
221
+
222
+ console.log("\n=== cleanupQuickBranch: no-op without pending state ===");
223
+
224
+ {
206
225
  const repo = createTestRepo();
207
226
  const origCwd = process.cwd();
208
227
  process.chdir(repo);
@@ -210,29 +229,32 @@ test('cleanupQuickBranch: no-op without pending state', async () => {
210
229
  const { cleanupQuickBranch } = await import("../quick.ts");
211
230
  const result = cleanupQuickBranch();
212
231
 
213
- assert.ok(!result, "returns false when no pending state");
214
- assert.deepStrictEqual(getCurrentBranch(repo), "main", "stays on main");
232
+ assertTrue(!result, "returns false when no pending state");
233
+ assertEq(getCurrentBranch(repo), "main", "stays on main");
215
234
 
216
235
  process.chdir(origCwd);
217
236
  rmSync(repo, { recursive: true, force: true });
218
- });
237
+ }
219
238
 
220
239
  // ═══════════════════════════════════════════════════════════════════════
221
240
  // End-to-end: quick branch does NOT contaminate integration branch
222
241
  // ═══════════════════════════════════════════════════════════════════════
223
- test('E2E: quick branch does not contaminate integration branch', () => {
242
+
243
+ console.log("\n=== E2E: quick branch does not contaminate integration branch ===");
244
+
245
+ {
224
246
  const repo = createTestRepo();
225
247
 
226
248
  // 1. Record main as integration branch for M001
227
249
  captureIntegrationBranch(repo, "M001");
228
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
250
+ assertEq(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
229
251
 
230
252
  // 2. Start a quick task (branch off)
231
253
  run("git checkout -b gsd/quick/1-fix-typo", repo);
232
254
 
233
255
  // 3. Try to capture integration branch for M002 while on quick branch
234
256
  captureIntegrationBranch(repo, "M002");
235
- assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), null,
257
+ assertEq(readIntegrationBranch(repo, "M002"), null,
236
258
  "M002 integration NOT recorded from quick branch");
237
259
 
238
260
  // 4. Return to main (simulate cleanupQuickBranch)
@@ -240,14 +262,20 @@ test('E2E: quick branch does not contaminate integration branch', () => {
240
262
 
241
263
  // 5. Now capture M002 from main — should work
242
264
  captureIntegrationBranch(repo, "M002");
243
- assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
265
+ assertEq(readIntegrationBranch(repo, "M002"), "main",
244
266
  "M002 integration = main after returning from quick branch");
245
267
 
246
268
  // 6. Verify M001 still intact
247
- assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
269
+ assertEq(readIntegrationBranch(repo, "M001"), "main",
248
270
  "M001 integration unchanged");
249
271
 
250
272
  rmSync(repo, { recursive: true, force: true });
251
- });
273
+ }
274
+
275
+ report();
276
+ }
252
277
 
278
+ main().catch((error) => {
279
+ console.error(error);
280
+ process.exit(1);
253
281
  });
@@ -1,14 +1,15 @@
1
- import { describe, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
1
  import { readFileSync } from "node:fs";
4
2
  import { join, dirname } from "node:path";
5
3
  import { fileURLToPath } from "node:url";
4
+ import { createTestContext } from './test-helpers.ts';
5
+
6
6
  // loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
7
7
  // In a worktree the file may not exist there yet, so we resolve prompts
8
8
  // relative to this test file's location (the worktree copy).
9
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
10
10
  const worktreePromptsDir = join(__dirname, "..", "prompts");
11
11
 
12
+ const { assertTrue, report } = createTestContext();
12
13
  /**
13
14
  * Load a prompt template from the worktree prompts directory
14
15
  * and apply variable substitution (mirrors loadPrompt logic).
@@ -26,10 +27,11 @@ function loadPromptFromWorktree(name: string, vars: Record<string, string> = {})
26
27
  // Tests
27
28
  // ═══════════════════════════════════════════════════════════════════════════
28
29
 
29
- // ─── reassess-roadmap prompt loads and substitutes ─────────────────────
30
+ async function main(): Promise<void> {
30
31
 
31
- describe('reassess-prompt', () => {
32
- test('reassess-roadmap prompt loads and substitutes', () => {
32
+ // ─── reassess-roadmap prompt loads and substitutes ─────────────────────
33
+ console.log("\n=== reassess-roadmap prompt loads and substitutes ===");
34
+ {
33
35
  const testVars = {
34
36
  workingDirectory: "/tmp/test-project",
35
37
  milestoneId: "M099",
@@ -49,26 +51,27 @@ test('reassess-roadmap prompt loads and substitutes', () => {
49
51
  console.error(` ERROR: loadPrompt threw: ${err}`);
50
52
  }
51
53
 
52
- assert.ok(!threw, "loadPrompt does not throw for reassess-roadmap");
53
- assert.ok(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
54
+ assertTrue(!threw, "loadPrompt does not throw for reassess-roadmap");
55
+ assertTrue(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
54
56
 
55
57
  // Verify all test variables were substituted into the output
56
- assert.ok(result.includes("M099"), "prompt contains milestoneId 'M099'");
57
- assert.ok(result.includes("S03"), "prompt contains completedSliceId 'S03'");
58
- assert.ok(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
59
- assert.ok(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
60
- assert.ok(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
58
+ assertTrue(result.includes("M099"), "prompt contains milestoneId 'M099'");
59
+ assertTrue(result.includes("S03"), "prompt contains completedSliceId 'S03'");
60
+ assertTrue(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
61
+ assertTrue(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
62
+ assertTrue(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
61
63
 
62
64
  // Verify no un-substituted variables remain
63
- assert.ok(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
64
- assert.ok(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
65
- assert.ok(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
66
- assert.ok(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
67
- assert.ok(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
68
- });
65
+ assertTrue(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
66
+ assertTrue(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
67
+ assertTrue(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
68
+ assertTrue(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
69
+ assertTrue(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
70
+ }
69
71
 
70
72
  // ─── reassess-roadmap contains coverage-check instruction ─────────────
71
- test('reassess-roadmap contains coverage-check instruction', () => {
73
+ console.log("\n=== reassess-roadmap contains coverage-check instruction ===");
74
+ {
72
75
  const prompt = loadPromptFromWorktree("reassess-roadmap", {
73
76
  workingDirectory: "/tmp/test-project",
74
77
  milestoneId: "M001",
@@ -82,32 +85,33 @@ test('reassess-roadmap contains coverage-check instruction', () => {
82
85
  const lower = prompt.toLowerCase();
83
86
 
84
87
  // The prompt must mention "each success criterion" or "every success criterion"
85
- assert.ok(
88
+ assertTrue(
86
89
  lower.includes("each success criterion") || lower.includes("every success criterion"),
87
90
  "prompt contains 'each success criterion' or 'every success criterion'"
88
91
  );
89
92
 
90
93
  // The prompt must mention "owning slice" or "remaining slice"
91
- assert.ok(
94
+ assertTrue(
92
95
  lower.includes("owning slice") || lower.includes("remaining slice"),
93
96
  "prompt contains 'owning slice' or 'remaining slice'"
94
97
  );
95
98
 
96
99
  // The prompt must mention "no remaining owner" or "no owner" or "no slice"
97
- assert.ok(
100
+ assertTrue(
98
101
  lower.includes("no remaining owner") || lower.includes("no owner") || lower.includes("no slice"),
99
102
  "prompt contains 'no remaining owner', 'no owner', or 'no slice'"
100
103
  );
101
104
 
102
105
  // The prompt must mention "blocking issue" or "blocking"
103
- assert.ok(
106
+ assertTrue(
104
107
  lower.includes("blocking issue") || lower.includes("blocking"),
105
108
  "prompt contains 'blocking issue' or 'blocking'"
106
109
  );
107
- });
110
+ }
108
111
 
109
112
  // ─── coverage-check requires at-least-one semantics ───────────────────
110
- test('coverage-check requires at-least-one semantics', () => {
113
+ console.log("\n=== coverage-check requires at-least-one semantics ===");
114
+ {
111
115
  const prompt = loadPromptFromWorktree("reassess-roadmap", {
112
116
  workingDirectory: "/tmp/test-project",
113
117
  milestoneId: "M001",
@@ -120,16 +124,22 @@ test('coverage-check requires at-least-one semantics', () => {
120
124
  const lower = prompt.toLowerCase();
121
125
 
122
126
  // The instruction must use "at least one" or equivalent inclusive language
123
- assert.ok(
127
+ assertTrue(
124
128
  lower.includes("at least one") || lower.includes("at-least-one") || lower.includes("one or more"),
125
129
  "prompt uses 'at least one' or equivalent inclusive language for slice ownership"
126
130
  );
127
131
 
128
132
  // The instruction must NOT require "exactly one" — that would be too rigid
129
- assert.ok(
133
+ assertTrue(
130
134
  !lower.includes("exactly one owner") && !lower.includes("exactly one slice"),
131
135
  "prompt does NOT use 'exactly one' for slice ownership (would be too rigid)"
132
136
  );
133
- });
137
+ }
138
+
139
+ report();
140
+ }
134
141
 
142
+ main().catch((error) => {
143
+ console.error(error);
144
+ process.exit(1);
135
145
  });