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
@@ -38,315 +38,361 @@ function cleanup(dir: string): void {
38
38
 
39
39
  // ─── detectProjectState ─────────────────────────────────────────────────────────
40
40
 
41
- test("detectProjectState: empty directory returns state=none", (t) => {
41
+ test("detectProjectState: empty directory returns state=none", () => {
42
42
  const dir = makeTempDir("empty");
43
- t.after(() => cleanup(dir));
44
-
45
- const result = detectProjectState(dir);
46
- assert.equal(result.state, "none");
47
- assert.equal(result.v1, undefined);
48
- assert.equal(result.v2, undefined);
43
+ try {
44
+ const result = detectProjectState(dir);
45
+ assert.equal(result.state, "none");
46
+ assert.equal(result.v1, undefined);
47
+ assert.equal(result.v2, undefined);
48
+ } finally {
49
+ cleanup(dir);
50
+ }
49
51
  });
50
52
 
51
- test("detectProjectState: directory with .gsd/milestones/M001 returns v2-gsd", (t) => {
53
+ test("detectProjectState: directory with .gsd/milestones/M001 returns v2-gsd", () => {
52
54
  const dir = makeTempDir("v2-gsd");
53
- t.after(() => cleanup(dir));
54
-
55
- mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
56
- const result = detectProjectState(dir);
57
- assert.equal(result.state, "v2-gsd");
58
- assert.ok(result.v2);
59
- assert.equal(result.v2!.milestoneCount, 1);
55
+ try {
56
+ mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
57
+ const result = detectProjectState(dir);
58
+ assert.equal(result.state, "v2-gsd");
59
+ assert.ok(result.v2);
60
+ assert.equal(result.v2!.milestoneCount, 1);
61
+ } finally {
62
+ cleanup(dir);
63
+ }
60
64
  });
61
65
 
62
- test("detectProjectState: directory with empty .gsd/milestones returns v2-gsd-empty", (t) => {
66
+ test("detectProjectState: directory with empty .gsd/milestones returns v2-gsd-empty", () => {
63
67
  const dir = makeTempDir("v2-empty");
64
- t.after(() => cleanup(dir));
65
-
66
- mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
67
- const result = detectProjectState(dir);
68
- assert.equal(result.state, "v2-gsd-empty");
69
- assert.ok(result.v2);
70
- assert.equal(result.v2!.milestoneCount, 0);
68
+ try {
69
+ mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
70
+ const result = detectProjectState(dir);
71
+ assert.equal(result.state, "v2-gsd-empty");
72
+ assert.ok(result.v2);
73
+ assert.equal(result.v2!.milestoneCount, 0);
74
+ } finally {
75
+ cleanup(dir);
76
+ }
71
77
  });
72
78
 
73
- test("detectProjectState: directory with .planning/ returns v1-planning", (t) => {
79
+ test("detectProjectState: directory with .planning/ returns v1-planning", () => {
74
80
  const dir = makeTempDir("v1-planning");
75
- t.after(() => cleanup(dir));
76
-
77
- mkdirSync(join(dir, ".planning", "phases", "01-setup"), { recursive: true });
78
- writeFileSync(join(dir, ".planning", "ROADMAP.md"), "# Roadmap\n", "utf-8");
79
- const result = detectProjectState(dir);
80
- assert.equal(result.state, "v1-planning");
81
- assert.ok(result.v1);
82
- assert.equal(result.v1!.hasRoadmap, true);
83
- assert.equal(result.v1!.hasPhasesDir, true);
84
- assert.equal(result.v1!.phaseCount, 1);
81
+ try {
82
+ mkdirSync(join(dir, ".planning", "phases", "01-setup"), { recursive: true });
83
+ writeFileSync(join(dir, ".planning", "ROADMAP.md"), "# Roadmap\n", "utf-8");
84
+ const result = detectProjectState(dir);
85
+ assert.equal(result.state, "v1-planning");
86
+ assert.ok(result.v1);
87
+ assert.equal(result.v1!.hasRoadmap, true);
88
+ assert.equal(result.v1!.hasPhasesDir, true);
89
+ assert.equal(result.v1!.phaseCount, 1);
90
+ } finally {
91
+ cleanup(dir);
92
+ }
85
93
  });
86
94
 
87
- test("detectProjectState: v2 takes priority over v1 when both exist", (t) => {
95
+ test("detectProjectState: v2 takes priority over v1 when both exist", () => {
88
96
  const dir = makeTempDir("both");
89
- t.after(() => cleanup(dir));
90
-
91
- mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
92
- mkdirSync(join(dir, ".planning"), { recursive: true });
93
- const result = detectProjectState(dir);
94
- assert.equal(result.state, "v2-gsd");
97
+ try {
98
+ mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
99
+ mkdirSync(join(dir, ".planning"), { recursive: true });
100
+ const result = detectProjectState(dir);
101
+ assert.equal(result.state, "v2-gsd");
102
+ } finally {
103
+ cleanup(dir);
104
+ }
95
105
  });
96
106
 
97
- test("detectProjectState: detects preferences in .gsd/", (t) => {
107
+ test("detectProjectState: detects preferences in .gsd/", () => {
98
108
  const dir = makeTempDir("prefs");
99
- t.after(() => cleanup(dir));
100
-
101
- mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
102
- writeFileSync(join(dir, ".gsd", "preferences.md"), "---\nversion: 1\n---\n", "utf-8");
103
- const result = detectProjectState(dir);
104
- assert.ok(result.v2);
105
- assert.equal(result.v2!.hasPreferences, true);
109
+ try {
110
+ mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
111
+ writeFileSync(join(dir, ".gsd", "preferences.md"), "---\nversion: 1\n---\n", "utf-8");
112
+ const result = detectProjectState(dir);
113
+ assert.ok(result.v2);
114
+ assert.equal(result.v2!.hasPreferences, true);
115
+ } finally {
116
+ cleanup(dir);
117
+ }
106
118
  });
107
119
 
108
120
  // ─── detectV1Planning ───────────────────────────────────────────────────────────
109
121
 
110
- test("detectV1Planning: returns null for missing .planning/", (t) => {
122
+ test("detectV1Planning: returns null for missing .planning/", () => {
111
123
  const dir = makeTempDir("no-v1");
112
- t.after(() => cleanup(dir));
113
-
114
- assert.equal(detectV1Planning(dir), null);
124
+ try {
125
+ assert.equal(detectV1Planning(dir), null);
126
+ } finally {
127
+ cleanup(dir);
128
+ }
115
129
  });
116
130
 
117
- test("detectV1Planning: returns null when .planning is a file", (t) => {
131
+ test("detectV1Planning: returns null when .planning is a file", () => {
118
132
  const dir = makeTempDir("v1-file");
119
- t.after(() => cleanup(dir));
120
-
121
- writeFileSync(join(dir, ".planning"), "not a directory", "utf-8");
122
- assert.equal(detectV1Planning(dir), null);
133
+ try {
134
+ writeFileSync(join(dir, ".planning"), "not a directory", "utf-8");
135
+ assert.equal(detectV1Planning(dir), null);
136
+ } finally {
137
+ cleanup(dir);
138
+ }
123
139
  });
124
140
 
125
- test("detectV1Planning: detects phases directory with multiple phases", (t) => {
141
+ test("detectV1Planning: detects phases directory with multiple phases", () => {
126
142
  const dir = makeTempDir("v1-phases");
127
- t.after(() => cleanup(dir));
128
-
129
- mkdirSync(join(dir, ".planning", "phases", "01-setup"), { recursive: true });
130
- mkdirSync(join(dir, ".planning", "phases", "02-core"), { recursive: true });
131
- mkdirSync(join(dir, ".planning", "phases", "03-deploy"), { recursive: true });
132
- const result = detectV1Planning(dir);
133
- assert.ok(result);
134
- assert.equal(result!.phaseCount, 3);
135
- assert.equal(result!.hasPhasesDir, true);
143
+ try {
144
+ mkdirSync(join(dir, ".planning", "phases", "01-setup"), { recursive: true });
145
+ mkdirSync(join(dir, ".planning", "phases", "02-core"), { recursive: true });
146
+ mkdirSync(join(dir, ".planning", "phases", "03-deploy"), { recursive: true });
147
+ const result = detectV1Planning(dir);
148
+ assert.ok(result);
149
+ assert.equal(result!.phaseCount, 3);
150
+ assert.equal(result!.hasPhasesDir, true);
151
+ } finally {
152
+ cleanup(dir);
153
+ }
136
154
  });
137
155
 
138
- test("detectV1Planning: detects ROADMAP.md", (t) => {
156
+ test("detectV1Planning: detects ROADMAP.md", () => {
139
157
  const dir = makeTempDir("v1-roadmap");
140
- t.after(() => cleanup(dir));
141
-
142
- mkdirSync(join(dir, ".planning"), { recursive: true });
143
- writeFileSync(join(dir, ".planning", "ROADMAP.md"), "# Roadmap", "utf-8");
144
- const result = detectV1Planning(dir);
145
- assert.ok(result);
146
- assert.equal(result!.hasRoadmap, true);
147
- assert.equal(result!.hasPhasesDir, false);
148
- assert.equal(result!.phaseCount, 0);
158
+ try {
159
+ mkdirSync(join(dir, ".planning"), { recursive: true });
160
+ writeFileSync(join(dir, ".planning", "ROADMAP.md"), "# Roadmap", "utf-8");
161
+ const result = detectV1Planning(dir);
162
+ assert.ok(result);
163
+ assert.equal(result!.hasRoadmap, true);
164
+ assert.equal(result!.hasPhasesDir, false);
165
+ assert.equal(result!.phaseCount, 0);
166
+ } finally {
167
+ cleanup(dir);
168
+ }
149
169
  });
150
170
 
151
171
  // ─── detectProjectSignals ───────────────────────────────────────────────────────
152
172
 
153
- test("detectProjectSignals: empty directory", (t) => {
173
+ test("detectProjectSignals: empty directory", () => {
154
174
  const dir = makeTempDir("signals-empty");
155
- t.after(() => cleanup(dir));
156
-
157
- const signals = detectProjectSignals(dir);
158
- assert.deepEqual(signals.detectedFiles, []);
159
- assert.equal(signals.isGitRepo, false);
160
- assert.equal(signals.isMonorepo, false);
161
- assert.equal(signals.primaryLanguage, undefined);
162
- assert.equal(signals.hasCI, false);
163
- assert.equal(signals.hasTests, false);
164
- assert.deepEqual(signals.verificationCommands, []);
175
+ try {
176
+ const signals = detectProjectSignals(dir);
177
+ assert.deepEqual(signals.detectedFiles, []);
178
+ assert.equal(signals.isGitRepo, false);
179
+ assert.equal(signals.isMonorepo, false);
180
+ assert.equal(signals.primaryLanguage, undefined);
181
+ assert.equal(signals.hasCI, false);
182
+ assert.equal(signals.hasTests, false);
183
+ assert.deepEqual(signals.verificationCommands, []);
184
+ } finally {
185
+ cleanup(dir);
186
+ }
165
187
  });
166
188
 
167
- test("detectProjectSignals: Node.js project", (t) => {
189
+ test("detectProjectSignals: Node.js project", () => {
168
190
  const dir = makeTempDir("signals-node");
169
- t.after(() => cleanup(dir));
170
-
171
- writeFileSync(
172
- join(dir, "package.json"),
173
- JSON.stringify({
174
- name: "test-project",
175
- scripts: {
176
- test: "jest",
177
- build: "tsc",
178
- lint: "eslint .",
179
- },
180
- }),
181
- "utf-8",
182
- );
183
- writeFileSync(join(dir, "package-lock.json"), "{}", "utf-8");
184
- mkdirSync(join(dir, ".git"), { recursive: true });
185
-
186
- const signals = detectProjectSignals(dir);
187
- assert.ok(signals.detectedFiles.includes("package.json"));
188
- assert.equal(signals.primaryLanguage, "javascript/typescript");
189
- assert.equal(signals.isGitRepo, true);
190
- assert.equal(signals.packageManager, "npm");
191
- assert.ok(signals.verificationCommands.includes("npm test"));
192
- assert.ok(signals.verificationCommands.some(c => c.includes("build")));
193
- assert.ok(signals.verificationCommands.some(c => c.includes("lint")));
191
+ try {
192
+ writeFileSync(
193
+ join(dir, "package.json"),
194
+ JSON.stringify({
195
+ name: "test-project",
196
+ scripts: {
197
+ test: "jest",
198
+ build: "tsc",
199
+ lint: "eslint .",
200
+ },
201
+ }),
202
+ "utf-8",
203
+ );
204
+ writeFileSync(join(dir, "package-lock.json"), "{}", "utf-8");
205
+ mkdirSync(join(dir, ".git"), { recursive: true });
206
+
207
+ const signals = detectProjectSignals(dir);
208
+ assert.ok(signals.detectedFiles.includes("package.json"));
209
+ assert.equal(signals.primaryLanguage, "javascript/typescript");
210
+ assert.equal(signals.isGitRepo, true);
211
+ assert.equal(signals.packageManager, "npm");
212
+ assert.ok(signals.verificationCommands.includes("npm test"));
213
+ assert.ok(signals.verificationCommands.some(c => c.includes("build")));
214
+ assert.ok(signals.verificationCommands.some(c => c.includes("lint")));
215
+ } finally {
216
+ cleanup(dir);
217
+ }
194
218
  });
195
219
 
196
- test("detectProjectSignals: Rust project", (t) => {
220
+ test("detectProjectSignals: Rust project", () => {
197
221
  const dir = makeTempDir("signals-rust");
198
- t.after(() => cleanup(dir));
199
-
200
- writeFileSync(join(dir, "Cargo.toml"), '[package]\nname = "test"\n', "utf-8");
201
- const signals = detectProjectSignals(dir);
202
- assert.ok(signals.detectedFiles.includes("Cargo.toml"));
203
- assert.equal(signals.primaryLanguage, "rust");
204
- assert.ok(signals.verificationCommands.includes("cargo test"));
205
- assert.ok(signals.verificationCommands.includes("cargo clippy"));
222
+ try {
223
+ writeFileSync(join(dir, "Cargo.toml"), '[package]\nname = "test"\n', "utf-8");
224
+ const signals = detectProjectSignals(dir);
225
+ assert.ok(signals.detectedFiles.includes("Cargo.toml"));
226
+ assert.equal(signals.primaryLanguage, "rust");
227
+ assert.ok(signals.verificationCommands.includes("cargo test"));
228
+ assert.ok(signals.verificationCommands.includes("cargo clippy"));
229
+ } finally {
230
+ cleanup(dir);
231
+ }
206
232
  });
207
233
 
208
- test("detectProjectSignals: Go project", (t) => {
234
+ test("detectProjectSignals: Go project", () => {
209
235
  const dir = makeTempDir("signals-go");
210
- t.after(() => cleanup(dir));
211
-
212
- writeFileSync(join(dir, "go.mod"), "module example.com/test\n", "utf-8");
213
- const signals = detectProjectSignals(dir);
214
- assert.ok(signals.detectedFiles.includes("go.mod"));
215
- assert.equal(signals.primaryLanguage, "go");
216
- assert.ok(signals.verificationCommands.includes("go test ./..."));
236
+ try {
237
+ writeFileSync(join(dir, "go.mod"), "module example.com/test\n", "utf-8");
238
+ const signals = detectProjectSignals(dir);
239
+ assert.ok(signals.detectedFiles.includes("go.mod"));
240
+ assert.equal(signals.primaryLanguage, "go");
241
+ assert.ok(signals.verificationCommands.includes("go test ./..."));
242
+ } finally {
243
+ cleanup(dir);
244
+ }
217
245
  });
218
246
 
219
- test("detectProjectSignals: Python project", (t) => {
247
+ test("detectProjectSignals: Python project", () => {
220
248
  const dir = makeTempDir("signals-python");
221
- t.after(() => cleanup(dir));
222
-
223
- writeFileSync(join(dir, "pyproject.toml"), "[tool.poetry]\n", "utf-8");
224
- const signals = detectProjectSignals(dir);
225
- assert.ok(signals.detectedFiles.includes("pyproject.toml"));
226
- assert.equal(signals.primaryLanguage, "python");
227
- assert.ok(signals.verificationCommands.includes("pytest"));
249
+ try {
250
+ writeFileSync(join(dir, "pyproject.toml"), "[tool.poetry]\n", "utf-8");
251
+ const signals = detectProjectSignals(dir);
252
+ assert.ok(signals.detectedFiles.includes("pyproject.toml"));
253
+ assert.equal(signals.primaryLanguage, "python");
254
+ assert.ok(signals.verificationCommands.includes("pytest"));
255
+ } finally {
256
+ cleanup(dir);
257
+ }
228
258
  });
229
259
 
230
- test("detectProjectSignals: monorepo detection via workspaces", (t) => {
260
+ test("detectProjectSignals: monorepo detection via workspaces", () => {
231
261
  const dir = makeTempDir("signals-monorepo");
232
- t.after(() => cleanup(dir));
233
-
234
- writeFileSync(
235
- join(dir, "package.json"),
236
- JSON.stringify({ name: "mono", workspaces: ["packages/*"] }),
237
- "utf-8",
238
- );
239
- const signals = detectProjectSignals(dir);
240
- assert.equal(signals.isMonorepo, true);
262
+ try {
263
+ writeFileSync(
264
+ join(dir, "package.json"),
265
+ JSON.stringify({ name: "mono", workspaces: ["packages/*"] }),
266
+ "utf-8",
267
+ );
268
+ const signals = detectProjectSignals(dir);
269
+ assert.equal(signals.isMonorepo, true);
270
+ } finally {
271
+ cleanup(dir);
272
+ }
241
273
  });
242
274
 
243
- test("detectProjectSignals: monorepo detection via turbo.json", (t) => {
275
+ test("detectProjectSignals: monorepo detection via turbo.json", () => {
244
276
  const dir = makeTempDir("signals-turbo");
245
- t.after(() => cleanup(dir));
246
-
247
- writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "test" }), "utf-8");
248
- writeFileSync(join(dir, "turbo.json"), "{}", "utf-8");
249
- const signals = detectProjectSignals(dir);
250
- assert.equal(signals.isMonorepo, true);
277
+ try {
278
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "test" }), "utf-8");
279
+ writeFileSync(join(dir, "turbo.json"), "{}", "utf-8");
280
+ const signals = detectProjectSignals(dir);
281
+ assert.equal(signals.isMonorepo, true);
282
+ } finally {
283
+ cleanup(dir);
284
+ }
251
285
  });
252
286
 
253
- test("detectProjectSignals: CI detection", (t) => {
287
+ test("detectProjectSignals: CI detection", () => {
254
288
  const dir = makeTempDir("signals-ci");
255
- t.after(() => cleanup(dir));
256
-
257
- mkdirSync(join(dir, ".github", "workflows"), { recursive: true });
258
- const signals = detectProjectSignals(dir);
259
- assert.equal(signals.hasCI, true);
289
+ try {
290
+ mkdirSync(join(dir, ".github", "workflows"), { recursive: true });
291
+ const signals = detectProjectSignals(dir);
292
+ assert.equal(signals.hasCI, true);
293
+ } finally {
294
+ cleanup(dir);
295
+ }
260
296
  });
261
297
 
262
- test("detectProjectSignals: test detection via jest config", (t) => {
298
+ test("detectProjectSignals: test detection via jest config", () => {
263
299
  const dir = makeTempDir("signals-tests");
264
- t.after(() => cleanup(dir));
265
-
266
- writeFileSync(join(dir, "jest.config.ts"), "export default {}", "utf-8");
267
- const signals = detectProjectSignals(dir);
268
- assert.equal(signals.hasTests, true);
300
+ try {
301
+ writeFileSync(join(dir, "jest.config.ts"), "export default {}", "utf-8");
302
+ const signals = detectProjectSignals(dir);
303
+ assert.equal(signals.hasTests, true);
304
+ } finally {
305
+ cleanup(dir);
306
+ }
269
307
  });
270
308
 
271
- test("detectProjectSignals: package manager detection", (t) => {
309
+ test("detectProjectSignals: package manager detection", () => {
272
310
  const dir1 = makeTempDir("pm-pnpm");
273
311
  const dir2 = makeTempDir("pm-yarn");
274
312
  const dir3 = makeTempDir("pm-bun");
275
- t.after(() => {
313
+ try {
314
+ writeFileSync(join(dir1, "pnpm-lock.yaml"), "", "utf-8");
315
+ writeFileSync(join(dir1, "package.json"), "{}", "utf-8");
316
+ assert.equal(detectProjectSignals(dir1).packageManager, "pnpm");
317
+
318
+ writeFileSync(join(dir2, "yarn.lock"), "", "utf-8");
319
+ writeFileSync(join(dir2, "package.json"), "{}", "utf-8");
320
+ assert.equal(detectProjectSignals(dir2).packageManager, "yarn");
321
+
322
+ writeFileSync(join(dir3, "bun.lockb"), "", "utf-8");
323
+ writeFileSync(join(dir3, "package.json"), "{}", "utf-8");
324
+ assert.equal(detectProjectSignals(dir3).packageManager, "bun");
325
+ } finally {
276
326
  cleanup(dir1);
277
327
  cleanup(dir2);
278
328
  cleanup(dir3);
279
- });
280
-
281
- writeFileSync(join(dir1, "pnpm-lock.yaml"), "", "utf-8");
282
- writeFileSync(join(dir1, "package.json"), "{}", "utf-8");
283
- assert.equal(detectProjectSignals(dir1).packageManager, "pnpm");
284
-
285
- writeFileSync(join(dir2, "yarn.lock"), "", "utf-8");
286
- writeFileSync(join(dir2, "package.json"), "{}", "utf-8");
287
- assert.equal(detectProjectSignals(dir2).packageManager, "yarn");
288
-
289
- writeFileSync(join(dir3, "bun.lockb"), "", "utf-8");
290
- writeFileSync(join(dir3, "package.json"), "{}", "utf-8");
291
- assert.equal(detectProjectSignals(dir3).packageManager, "bun");
329
+ }
292
330
  });
293
331
 
294
- test("detectProjectSignals: skips default npm test script", (t) => {
332
+ test("detectProjectSignals: skips default npm test script", () => {
295
333
  const dir = makeTempDir("signals-default-test");
296
- t.after(() => cleanup(dir));
297
-
298
- writeFileSync(
299
- join(dir, "package.json"),
300
- JSON.stringify({
301
- name: "test",
302
- scripts: { test: 'echo "Error: no test specified" && exit 1' },
303
- }),
304
- "utf-8",
305
- );
306
- const signals = detectProjectSignals(dir);
307
- // Should NOT include the default npm test script
308
- assert.equal(
309
- signals.verificationCommands.some(c => c.includes("test")),
310
- false,
311
- );
334
+ try {
335
+ writeFileSync(
336
+ join(dir, "package.json"),
337
+ JSON.stringify({
338
+ name: "test",
339
+ scripts: { test: 'echo "Error: no test specified" && exit 1' },
340
+ }),
341
+ "utf-8",
342
+ );
343
+ const signals = detectProjectSignals(dir);
344
+ // Should NOT include the default npm test script
345
+ assert.equal(
346
+ signals.verificationCommands.some(c => c.includes("test")),
347
+ false,
348
+ );
349
+ } finally {
350
+ cleanup(dir);
351
+ }
312
352
  });
313
353
 
314
- test("detectProjectSignals: pnpm uses pnpm commands", (t) => {
354
+ test("detectProjectSignals: pnpm uses pnpm commands", () => {
315
355
  const dir = makeTempDir("signals-pnpm-cmds");
316
- t.after(() => cleanup(dir));
317
-
318
- writeFileSync(
319
- join(dir, "package.json"),
320
- JSON.stringify({
321
- name: "test",
322
- scripts: { test: "vitest", build: "tsc" },
323
- }),
324
- "utf-8",
325
- );
326
- writeFileSync(join(dir, "pnpm-lock.yaml"), "", "utf-8");
327
- const signals = detectProjectSignals(dir);
328
- assert.ok(signals.verificationCommands.includes("pnpm test"));
329
- assert.ok(signals.verificationCommands.includes("pnpm run build"));
356
+ try {
357
+ writeFileSync(
358
+ join(dir, "package.json"),
359
+ JSON.stringify({
360
+ name: "test",
361
+ scripts: { test: "vitest", build: "tsc" },
362
+ }),
363
+ "utf-8",
364
+ );
365
+ writeFileSync(join(dir, "pnpm-lock.yaml"), "", "utf-8");
366
+ const signals = detectProjectSignals(dir);
367
+ assert.ok(signals.verificationCommands.includes("pnpm test"));
368
+ assert.ok(signals.verificationCommands.includes("pnpm run build"));
369
+ } finally {
370
+ cleanup(dir);
371
+ }
330
372
  });
331
373
 
332
- test("detectProjectSignals: Ruby project with rspec", (t) => {
374
+ test("detectProjectSignals: Ruby project with rspec", () => {
333
375
  const dir = makeTempDir("signals-ruby");
334
- t.after(() => cleanup(dir));
335
-
336
- writeFileSync(join(dir, "Gemfile"), 'source "https://rubygems.org"\n', "utf-8");
337
- mkdirSync(join(dir, "spec"), { recursive: true });
338
- const signals = detectProjectSignals(dir);
339
- assert.ok(signals.detectedFiles.includes("Gemfile"));
340
- assert.equal(signals.primaryLanguage, "ruby");
341
- assert.ok(signals.verificationCommands.includes("bundle exec rspec"));
376
+ try {
377
+ writeFileSync(join(dir, "Gemfile"), 'source "https://rubygems.org"\n', "utf-8");
378
+ mkdirSync(join(dir, "spec"), { recursive: true });
379
+ const signals = detectProjectSignals(dir);
380
+ assert.ok(signals.detectedFiles.includes("Gemfile"));
381
+ assert.equal(signals.primaryLanguage, "ruby");
382
+ assert.ok(signals.verificationCommands.includes("bundle exec rspec"));
383
+ } finally {
384
+ cleanup(dir);
385
+ }
342
386
  });
343
387
 
344
- test("detectProjectSignals: Makefile with test target", (t) => {
388
+ test("detectProjectSignals: Makefile with test target", () => {
345
389
  const dir = makeTempDir("signals-make");
346
- t.after(() => cleanup(dir));
347
-
348
- writeFileSync(join(dir, "Makefile"), "test:\n\tgo test ./...\n\nbuild:\n\tgo build\n", "utf-8");
349
- const signals = detectProjectSignals(dir);
350
- assert.ok(signals.detectedFiles.includes("Makefile"));
351
- assert.ok(signals.verificationCommands.includes("make test"));
390
+ try {
391
+ writeFileSync(join(dir, "Makefile"), "test:\n\tgo test ./...\n\nbuild:\n\tgo build\n", "utf-8");
392
+ const signals = detectProjectSignals(dir);
393
+ assert.ok(signals.detectedFiles.includes("Makefile"));
394
+ assert.ok(signals.verificationCommands.includes("make test"));
395
+ } finally {
396
+ cleanup(dir);
397
+ }
352
398
  });