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
@@ -1,12 +1,13 @@
1
1
  import { parseTaskPlanMustHaves } from '../files.ts';
2
- import { describe, test, beforeEach, afterEach } from 'node:test';
3
- import assert from 'node:assert/strict';
2
+ import { createTestContext } from './test-helpers.ts';
4
3
 
4
+ const { assertEq, assertTrue, report } = createTestContext();
5
5
  // ═══════════════════════════════════════════════════════════════════════════
6
6
  // (a) Standard unchecked format: - [ ] text
7
7
  // ═══════════════════════════════════════════════════════════════════════════
8
8
 
9
- test('parseTaskPlanMustHaves: standard unchecked', () => {
9
+ console.log('\n=== parseTaskPlanMustHaves: standard unchecked ===');
10
+ {
10
11
  const content = `# T01: Test Task
11
12
 
12
13
  ## Must-Haves
@@ -15,53 +16,56 @@ test('parseTaskPlanMustHaves: standard unchecked', () => {
15
16
  - [ ] Second must-have item
16
17
  `;
17
18
  const result = parseTaskPlanMustHaves(content);
18
- assert.deepStrictEqual(result.length, 2, 'should return 2 items');
19
- assert.deepStrictEqual(result[0].text, 'First must-have item', 'first item text');
20
- assert.deepStrictEqual(result[0].checked, false, 'first item unchecked');
21
- assert.deepStrictEqual(result[1].text, 'Second must-have item', 'second item text');
22
- assert.deepStrictEqual(result[1].checked, false, 'second item unchecked');
23
- });
19
+ assertEq(result.length, 2, 'should return 2 items');
20
+ assertEq(result[0].text, 'First must-have item', 'first item text');
21
+ assertEq(result[0].checked, false, 'first item unchecked');
22
+ assertEq(result[1].text, 'Second must-have item', 'second item text');
23
+ assertEq(result[1].checked, false, 'second item unchecked');
24
+ }
24
25
 
25
26
  // ═══════════════════════════════════════════════════════════════════════════
26
27
  // (b) Checked variants: - [x] and - [X]
27
28
  // ═══════════════════════════════════════════════════════════════════════════
28
29
 
29
- test('parseTaskPlanMustHaves: checked [x] and [X]', () => {
30
+ console.log('\n=== parseTaskPlanMustHaves: checked [x] and [X] ===');
31
+ {
30
32
  const content = `## Must-Haves
31
33
 
32
34
  - [x] Lowercase checked item
33
35
  - [X] Uppercase checked item
34
36
  `;
35
37
  const result = parseTaskPlanMustHaves(content);
36
- assert.deepStrictEqual(result.length, 2, 'should return 2 items');
37
- assert.deepStrictEqual(result[0].checked, true, 'lowercase x is checked');
38
- assert.deepStrictEqual(result[0].text, 'Lowercase checked item', 'lowercase x text');
39
- assert.deepStrictEqual(result[1].checked, true, 'uppercase X is checked');
40
- assert.deepStrictEqual(result[1].text, 'Uppercase checked item', 'uppercase X text');
41
- });
38
+ assertEq(result.length, 2, 'should return 2 items');
39
+ assertEq(result[0].checked, true, 'lowercase x is checked');
40
+ assertEq(result[0].text, 'Lowercase checked item', 'lowercase x text');
41
+ assertEq(result[1].checked, true, 'uppercase X is checked');
42
+ assertEq(result[1].text, 'Uppercase checked item', 'uppercase X text');
43
+ }
42
44
 
43
45
  // ═══════════════════════════════════════════════════════════════════════════
44
46
  // (c) No-checkbox bullets: - text
45
47
  // ═══════════════════════════════════════════════════════════════════════════
46
48
 
47
- test('parseTaskPlanMustHaves: no-checkbox bullets', () => {
49
+ console.log('\n=== parseTaskPlanMustHaves: no-checkbox bullets ===');
50
+ {
48
51
  const content = `## Must-Haves
49
52
 
50
53
  - Plain bullet item
51
54
  - Another plain item
52
55
  `;
53
56
  const result = parseTaskPlanMustHaves(content);
54
- assert.deepStrictEqual(result.length, 2, 'should return 2 items');
55
- assert.deepStrictEqual(result[0].text, 'Plain bullet item', 'plain bullet text');
56
- assert.deepStrictEqual(result[0].checked, false, 'plain bullet defaults to unchecked');
57
- assert.deepStrictEqual(result[1].text, 'Another plain item', 'second plain bullet text');
58
- });
57
+ assertEq(result.length, 2, 'should return 2 items');
58
+ assertEq(result[0].text, 'Plain bullet item', 'plain bullet text');
59
+ assertEq(result[0].checked, false, 'plain bullet defaults to unchecked');
60
+ assertEq(result[1].text, 'Another plain item', 'second plain bullet text');
61
+ }
59
62
 
60
63
  // ═══════════════════════════════════════════════════════════════════════════
61
64
  // (d) Indented variants
62
65
  // ═══════════════════════════════════════════════════════════════════════════
63
66
 
64
- test('parseTaskPlanMustHaves: indented variants', () => {
67
+ console.log('\n=== parseTaskPlanMustHaves: indented variants ===');
68
+ {
65
69
  const content = `## Must-Haves
66
70
 
67
71
  - [ ] Indented unchecked item
@@ -69,20 +73,21 @@ test('parseTaskPlanMustHaves: indented variants', () => {
69
73
  - Plain indented item
70
74
  `;
71
75
  const result = parseTaskPlanMustHaves(content);
72
- assert.deepStrictEqual(result.length, 3, 'should return 3 items');
73
- assert.deepStrictEqual(result[0].text, 'Indented unchecked item', 'indented unchecked text');
74
- assert.deepStrictEqual(result[0].checked, false, 'indented unchecked state');
75
- assert.deepStrictEqual(result[1].text, 'Indented checked item', 'indented checked text');
76
- assert.deepStrictEqual(result[1].checked, true, 'indented checked state');
77
- assert.deepStrictEqual(result[2].text, 'Plain indented item', 'indented plain text');
78
- assert.deepStrictEqual(result[2].checked, false, 'indented plain state');
79
- });
76
+ assertEq(result.length, 3, 'should return 3 items');
77
+ assertEq(result[0].text, 'Indented unchecked item', 'indented unchecked text');
78
+ assertEq(result[0].checked, false, 'indented unchecked state');
79
+ assertEq(result[1].text, 'Indented checked item', 'indented checked text');
80
+ assertEq(result[1].checked, true, 'indented checked state');
81
+ assertEq(result[2].text, 'Plain indented item', 'indented plain text');
82
+ assertEq(result[2].checked, false, 'indented plain state');
83
+ }
80
84
 
81
85
  // ═══════════════════════════════════════════════════════════════════════════
82
86
  // (e) Mixed checkbox states in one section
83
87
  // ═══════════════════════════════════════════════════════════════════════════
84
88
 
85
- test('parseTaskPlanMustHaves: mixed states', () => {
89
+ console.log('\n=== parseTaskPlanMustHaves: mixed states ===');
90
+ {
86
91
  const content = `## Must-Haves
87
92
 
88
93
  - [ ] Unchecked one
@@ -92,19 +97,20 @@ test('parseTaskPlanMustHaves: mixed states', () => {
92
97
  - [ ] Another unchecked
93
98
  `;
94
99
  const result = parseTaskPlanMustHaves(content);
95
- assert.deepStrictEqual(result.length, 5, 'should return 5 items');
96
- assert.deepStrictEqual(result[0].checked, false, 'first is unchecked');
97
- assert.deepStrictEqual(result[1].checked, true, 'second is checked');
98
- assert.deepStrictEqual(result[2].checked, true, 'third is checked (uppercase)');
99
- assert.deepStrictEqual(result[3].checked, false, 'fourth (plain) is unchecked');
100
- assert.deepStrictEqual(result[4].checked, false, 'fifth is unchecked');
101
- });
100
+ assertEq(result.length, 5, 'should return 5 items');
101
+ assertEq(result[0].checked, false, 'first is unchecked');
102
+ assertEq(result[1].checked, true, 'second is checked');
103
+ assertEq(result[2].checked, true, 'third is checked (uppercase)');
104
+ assertEq(result[3].checked, false, 'fourth (plain) is unchecked');
105
+ assertEq(result[4].checked, false, 'fifth is unchecked');
106
+ }
102
107
 
103
108
  // ═══════════════════════════════════════════════════════════════════════════
104
109
  // (f) Missing Must-Haves section → empty array
105
110
  // ═══════════════════════════════════════════════════════════════════════════
106
111
 
107
- test('parseTaskPlanMustHaves: missing section', () => {
112
+ console.log('\n=== parseTaskPlanMustHaves: missing section ===');
113
+ {
108
114
  const content = `# T01: Some Task
109
115
 
110
116
  ## Description
@@ -116,15 +122,16 @@ Some description here.
116
122
  - Run tests
117
123
  `;
118
124
  const result = parseTaskPlanMustHaves(content);
119
- assert.deepStrictEqual(result.length, 0, 'returns empty array when section missing');
120
- assert.ok(Array.isArray(result), 'result is an array');
121
- });
125
+ assertEq(result.length, 0, 'returns empty array when section missing');
126
+ assertTrue(Array.isArray(result), 'result is an array');
127
+ }
122
128
 
123
129
  // ═══════════════════════════════════════════════════════════════════════════
124
130
  // (g) Empty Must-Haves section → empty array
125
131
  // ═══════════════════════════════════════════════════════════════════════════
126
132
 
127
- test('parseTaskPlanMustHaves: empty section', () => {
133
+ console.log('\n=== parseTaskPlanMustHaves: empty section ===');
134
+ {
128
135
  const content = `## Must-Haves
129
136
 
130
137
  ## Verification
@@ -132,14 +139,15 @@ test('parseTaskPlanMustHaves: empty section', () => {
132
139
  - Run tests
133
140
  `;
134
141
  const result = parseTaskPlanMustHaves(content);
135
- assert.deepStrictEqual(result.length, 0, 'returns empty array when section is empty');
136
- });
142
+ assertEq(result.length, 0, 'returns empty array when section is empty');
143
+ }
137
144
 
138
145
  // ═══════════════════════════════════════════════════════════════════════════
139
146
  // (h) Content with YAML frontmatter
140
147
  // ═══════════════════════════════════════════════════════════════════════════
141
148
 
142
- test('parseTaskPlanMustHaves: YAML frontmatter', () => {
149
+ console.log('\n=== parseTaskPlanMustHaves: YAML frontmatter ===');
150
+ {
143
151
  const content = `---
144
152
  estimated_steps: 5
145
153
  estimated_files: 3
@@ -153,16 +161,16 @@ estimated_files: 3
153
161
  - [x] Checked must-have after frontmatter
154
162
  `;
155
163
  const result = parseTaskPlanMustHaves(content);
156
- assert.deepStrictEqual(result.length, 2, 'frontmatter does not pollute results');
157
- assert.deepStrictEqual(result[0].text, 'Real must-have after frontmatter', 'first item text correct');
158
- assert.deepStrictEqual(result[0].checked, false, 'first item unchecked');
159
- assert.deepStrictEqual(result[1].text, 'Checked must-have after frontmatter', 'second item text correct');
160
- assert.deepStrictEqual(result[1].checked, true, 'second item checked');
161
- });
164
+ assertEq(result.length, 2, 'frontmatter does not pollute results');
165
+ assertEq(result[0].text, 'Real must-have after frontmatter', 'first item text correct');
166
+ assertEq(result[0].checked, false, 'first item unchecked');
167
+ assertEq(result[1].text, 'Checked must-have after frontmatter', 'second item text correct');
168
+ assertEq(result[1].checked, true, 'second item checked');
169
+ }
162
170
 
163
171
  // Verify frontmatter content is not misinterpreted as must-haves
164
-
165
- test('parseTaskPlanMustHaves: frontmatter-only content', () => {
172
+ console.log('\n=== parseTaskPlanMustHaves: frontmatter-only content ===');
173
+ {
166
174
  const content = `---
167
175
  estimated_steps: 5
168
176
  estimated_files: 3
@@ -175,14 +183,15 @@ estimated_files: 3
175
183
  No must-haves section here.
176
184
  `;
177
185
  const result = parseTaskPlanMustHaves(content);
178
- assert.deepStrictEqual(result.length, 0, 'frontmatter-only content returns empty array');
179
- });
186
+ assertEq(result.length, 0, 'frontmatter-only content returns empty array');
187
+ }
180
188
 
181
189
  // ═══════════════════════════════════════════════════════════════════════════
182
190
  // (i) Real task plan format (based on S01/T01-PLAN.md structure)
183
191
  // ═══════════════════════════════════════════════════════════════════════════
184
192
 
185
- test('parseTaskPlanMustHaves: real task plan format', () => {
193
+ console.log('\n=== parseTaskPlanMustHaves: real task plan format ===');
194
+ {
186
195
  const content = `---
187
196
  estimated_steps: 5
188
197
  estimated_files: 3
@@ -230,37 +239,40 @@ Add the \`completing-milestone\` phase to the GSD state machine.
230
239
  - \`agent/extensions/gsd/types.ts\` — Phase union includes \`'completing-milestone'\`
231
240
  `;
232
241
  const result = parseTaskPlanMustHaves(content);
233
- assert.deepStrictEqual(result.length, 5, 'real plan has 5 must-haves');
234
- assert.ok(result[0].text.includes('`Phase` type includes'), 'first must-have text matches');
235
- assert.ok(result[1].text.includes('`deriveState` returns'), 'second must-have text matches');
236
- assert.deepStrictEqual(result[0].checked, false, 'all real must-haves are unchecked');
237
- assert.deepStrictEqual(result[4].checked, false, 'last real must-have is unchecked');
238
- assert.ok(result[4].text.includes('multi-milestone'), 'last must-have references multi-milestone');
239
- });
242
+ assertEq(result.length, 5, 'real plan has 5 must-haves');
243
+ assertTrue(result[0].text.includes('`Phase` type includes'), 'first must-have text matches');
244
+ assertTrue(result[1].text.includes('`deriveState` returns'), 'second must-have text matches');
245
+ assertEq(result[0].checked, false, 'all real must-haves are unchecked');
246
+ assertEq(result[4].checked, false, 'last real must-have is unchecked');
247
+ assertTrue(result[4].text.includes('multi-milestone'), 'last must-have references multi-milestone');
248
+ }
240
249
 
241
250
  // ═══════════════════════════════════════════════════════════════════════════
242
251
  // Edge cases
243
252
  // ═══════════════════════════════════════════════════════════════════════════
244
253
 
245
- test('parseTaskPlanMustHaves: empty string', () => {
254
+ console.log('\n=== parseTaskPlanMustHaves: empty string ===');
255
+ {
246
256
  const result = parseTaskPlanMustHaves('');
247
- assert.deepStrictEqual(result.length, 0, 'empty string returns empty array');
248
- });
257
+ assertEq(result.length, 0, 'empty string returns empty array');
258
+ }
249
259
 
250
- test('parseTaskPlanMustHaves: must-haves with inline code and backticks', () => {
260
+ console.log('\n=== parseTaskPlanMustHaves: must-haves with inline code and backticks ===');
261
+ {
251
262
  const content = `## Must-Haves
252
263
 
253
264
  - [ ] \`functionName\` is exported from \`module.ts\`
254
265
  - [x] Returns \`Array<{ text: string }>\` with correct extraction
255
266
  `;
256
267
  const result = parseTaskPlanMustHaves(content);
257
- assert.deepStrictEqual(result.length, 2, 'handles backtick content');
258
- assert.ok(result[0].text.includes('`functionName`'), 'preserves backticks in text');
259
- assert.deepStrictEqual(result[0].checked, false, 'backtick item unchecked');
260
- assert.deepStrictEqual(result[1].checked, true, 'backtick item checked');
261
- });
262
-
263
- test('parseTaskPlanMustHaves: asterisk bullets', () => {
268
+ assertEq(result.length, 2, 'handles backtick content');
269
+ assertTrue(result[0].text.includes('`functionName`'), 'preserves backticks in text');
270
+ assertEq(result[0].checked, false, 'backtick item unchecked');
271
+ assertEq(result[1].checked, true, 'backtick item checked');
272
+ }
273
+
274
+ console.log('\n=== parseTaskPlanMustHaves: asterisk bullets ===');
275
+ {
264
276
  const content = `## Must-Haves
265
277
 
266
278
  * [ ] Asterisk unchecked
@@ -268,11 +280,12 @@ test('parseTaskPlanMustHaves: asterisk bullets', () => {
268
280
  * Plain asterisk
269
281
  `;
270
282
  const result = parseTaskPlanMustHaves(content);
271
- assert.deepStrictEqual(result.length, 3, 'handles asterisk bullets');
272
- assert.deepStrictEqual(result[0].checked, false, 'asterisk unchecked');
273
- assert.deepStrictEqual(result[1].checked, true, 'asterisk checked');
274
- assert.deepStrictEqual(result[2].checked, false, 'plain asterisk unchecked');
275
- });
283
+ assertEq(result.length, 3, 'handles asterisk bullets');
284
+ assertEq(result[0].checked, false, 'asterisk unchecked');
285
+ assertEq(result[1].checked, true, 'asterisk checked');
286
+ assertEq(result[2].checked, false, 'plain asterisk unchecked');
287
+ }
276
288
 
277
289
  // ═══════════════════════════════════════════════════════════════════════════
278
290
 
291
+ report();
@@ -19,8 +19,9 @@ import { shouldUseWorktreeIsolation } from "../auto.ts";
19
19
  import { getIsolationMode } from "../preferences.ts";
20
20
  import { getActiveAutoWorktreeContext } from "../auto-worktree.ts";
21
21
  import { invalidateAllCaches } from "../cache.ts";
22
- import { describe, test, beforeEach, afterEach } from 'node:test';
23
- import assert from 'node:assert/strict';
22
+ import { createTestContext } from "./test-helpers.ts";
23
+
24
+ const { assertEq, assertTrue, report } = createTestContext();
24
25
 
25
26
  // --- Preferences helpers (same pattern as doctor-git.test.ts K001) ---
26
27
 
@@ -37,77 +38,77 @@ function removeRunnerPreferences(): void {
37
38
 
38
39
  // --- Tests ---
39
40
 
40
- test('shouldUseWorktreeIsolation returns false for none', () => {
41
+ // Test 1: shouldUseWorktreeIsolation returns false for none
42
+ console.log("Test 1: shouldUseWorktreeIsolation returns false for none");
41
43
  try {
42
44
  writeRunnerPreferences("none");
43
45
  invalidateAllCaches();
44
- assert.deepStrictEqual(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with none prefs");
46
+ assertEq(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with none prefs");
45
47
  } finally {
46
48
  removeRunnerPreferences();
47
49
  invalidateAllCaches();
48
50
  }
49
- });
50
51
 
51
- test('shouldUseWorktreeIsolation returns false for branch', () => {
52
+ // Test 2: shouldUseWorktreeIsolation returns false for branch
53
+ console.log("Test 2: shouldUseWorktreeIsolation returns false for branch");
52
54
  try {
53
55
  writeRunnerPreferences("branch");
54
56
  invalidateAllCaches();
55
- assert.deepStrictEqual(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with branch prefs");
57
+ assertEq(shouldUseWorktreeIsolation(), false, "shouldUseWorktreeIsolation() with branch prefs");
56
58
  } finally {
57
59
  removeRunnerPreferences();
58
60
  invalidateAllCaches();
59
61
  }
60
- });
61
62
 
62
- test('shouldUseWorktreeIsolation returns true for worktree', () => {
63
+ // Test 3: shouldUseWorktreeIsolation returns true for worktree
64
+ console.log("Test 3: shouldUseWorktreeIsolation returns true for worktree");
63
65
  try {
64
66
  writeRunnerPreferences("worktree");
65
67
  invalidateAllCaches();
66
- assert.deepStrictEqual(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with worktree prefs");
68
+ assertEq(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with worktree prefs");
67
69
  } finally {
68
70
  removeRunnerPreferences();
69
71
  invalidateAllCaches();
70
72
  }
71
- });
72
73
 
73
74
  // Test 4: shouldUseWorktreeIsolation returns true for no prefs (default)
74
75
  // Skip if global prefs exist — they override the default and this test
75
76
  // cannot control ~/.gsd/preferences.md.
76
-
77
- test('shouldUseWorktreeIsolation returns true for no prefs (default)', () => {
78
- const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
79
- || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
80
- if (!globalPrefsExist) {
81
- try {
82
- removeRunnerPreferences(); // ensure no prefs file
83
- invalidateAllCaches();
84
- assert.deepStrictEqual(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with no prefs (default worktree)");
85
- } finally {
86
- invalidateAllCaches();
87
- }
88
- } else {
77
+ const globalPrefsExist = existsSync(join(homedir(), ".gsd", "preferences.md"))
78
+ || existsSync(join(homedir(), ".gsd", "PREFERENCES.md"));
79
+ if (!globalPrefsExist) {
80
+ console.log("Test 4: shouldUseWorktreeIsolation returns true for no prefs (default)");
81
+ try {
82
+ removeRunnerPreferences(); // ensure no prefs file
83
+ invalidateAllCaches();
84
+ assertEq(shouldUseWorktreeIsolation(), true, "shouldUseWorktreeIsolation() with no prefs (default worktree)");
85
+ } finally {
86
+ invalidateAllCaches();
89
87
  }
90
- });
88
+ } else {
89
+ console.log("Test 4: SKIPPED — global prefs file exists, cannot test bare default");
90
+ }
91
91
 
92
- test('getIsolationMode returns "none" with none prefs', () => {
92
+ // Test 5: getIsolationMode returns "none" with none prefs
93
+ console.log("Test 5: getIsolationMode returns 'none' with none prefs");
93
94
  try {
94
95
  writeRunnerPreferences("none");
95
96
  invalidateAllCaches();
96
- assert.deepStrictEqual(getIsolationMode(), "none", "getIsolationMode() with none prefs");
97
+ assertEq(getIsolationMode(), "none", "getIsolationMode() with none prefs");
97
98
  } finally {
98
99
  removeRunnerPreferences();
99
100
  invalidateAllCaches();
100
101
  }
101
- });
102
102
 
103
- test('getActiveAutoWorktreeContext returns null at baseline', () => {
104
- assert.deepStrictEqual(getActiveAutoWorktreeContext(), null, "getActiveAutoWorktreeContext() returns null without enterAutoWorktree()");
105
- });
103
+ // Test 6: getActiveAutoWorktreeContext returns null at baseline
104
+ console.log("Test 6: getActiveAutoWorktreeContext returns null at baseline");
105
+ assertEq(getActiveAutoWorktreeContext(), null, "getActiveAutoWorktreeContext() returns null without enterAutoWorktree()");
106
106
 
107
107
  // Test 7: System prompt worktree block absent without active worktree
108
-
109
- test('Test 7: System prompt worktree block absent without active worktree', () => {
108
+ console.log("Test 7: System prompt worktree block absent without active worktree");
109
+ {
110
110
  const ctx = getActiveAutoWorktreeContext();
111
- assert.ok(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
112
- });
111
+ assertTrue(ctx === null, "getActiveAutoWorktreeContext() null confirms system prompt worktree block will not be injected");
112
+ }
113
113
 
114
+ report();