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
@@ -130,119 +130,119 @@ test("auto-loop 'all milestones complete' path merges before stopping (#962)", (
130
130
 
131
131
  // ─── Integration: single milestone completes → merged to main ────────────────
132
132
 
133
- test("single milestone worktree is merged to main when all complete (#962)", (t) => {
133
+ test("single milestone worktree is merged to main when all complete (#962)", () => {
134
134
  const savedCwd = process.cwd();
135
135
  let tempDir = "";
136
136
 
137
- t.after(() => {
137
+ try {
138
+ tempDir = createTempRepo();
139
+
140
+ // Set up a single milestone
141
+ createMilestoneArtifacts(tempDir, "M001");
142
+ run("git add .", tempDir);
143
+ run('git commit -m "add milestone"', tempDir);
144
+
145
+ // Create worktree and simulate work
146
+ const wt = createAutoWorktree(tempDir, "M001");
147
+ assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
148
+
149
+ writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
150
+ run("git add .", wt);
151
+ run('git commit -m "feat(M001): add feature"', wt);
152
+
153
+ // Simulate the fix: merge before stopping (what the "all complete" path now does)
154
+ const roadmapPath = join(
155
+ tempDir,
156
+ ".gsd",
157
+ "milestones",
158
+ "M001",
159
+ "M001-ROADMAP.md",
160
+ );
161
+ const roadmapContent = readFileSync(roadmapPath, "utf-8");
162
+ const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
163
+
164
+ // Verify work is on main
165
+ assert.ok(
166
+ existsSync(join(tempDir, "feature.ts")),
167
+ "feature.ts should be on main after merge",
168
+ );
169
+ assert.equal(process.cwd(), tempDir, "cwd restored to project root");
170
+ assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
171
+ assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
172
+
173
+ // Verify milestone branch was cleaned up
174
+ const branches = run("git branch", tempDir);
175
+ assert.ok(
176
+ !branches.includes("milestone/M001"),
177
+ "milestone branch should be deleted",
178
+ );
179
+
180
+ // Verify squash commit on main
181
+ const log = run("git log --oneline -3", tempDir);
182
+ assert.ok(
183
+ log.includes("M001"),
184
+ "squash commit on main should reference M001",
185
+ );
186
+
187
+ assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
188
+ } finally {
138
189
  process.chdir(savedCwd);
139
190
  if (tempDir && existsSync(tempDir)) {
140
- rmSync(tempDir, { recursive: true, force: true });
191
+ rmSync(tempDir, { recursive: true, force: true });
141
192
  }
142
- });
143
-
144
- tempDir = createTempRepo();
145
-
146
- // Set up a single milestone
147
- createMilestoneArtifacts(tempDir, "M001");
148
- run("git add .", tempDir);
149
- run('git commit -m "add milestone"', tempDir);
150
-
151
- // Create worktree and simulate work
152
- const wt = createAutoWorktree(tempDir, "M001");
153
- assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
154
-
155
- writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
156
- run("git add .", wt);
157
- run('git commit -m "feat(M001): add feature"', wt);
158
-
159
- // Simulate the fix: merge before stopping (what the "all complete" path now does)
160
- const roadmapPath = join(
161
- tempDir,
162
- ".gsd",
163
- "milestones",
164
- "M001",
165
- "M001-ROADMAP.md",
166
- );
167
- const roadmapContent = readFileSync(roadmapPath, "utf-8");
168
- const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
169
-
170
- // Verify work is on main
171
- assert.ok(
172
- existsSync(join(tempDir, "feature.ts")),
173
- "feature.ts should be on main after merge",
174
- );
175
- assert.equal(process.cwd(), tempDir, "cwd restored to project root");
176
- assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
177
- assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
178
-
179
- // Verify milestone branch was cleaned up
180
- const branches = run("git branch", tempDir);
181
- assert.ok(
182
- !branches.includes("milestone/M001"),
183
- "milestone branch should be deleted",
184
- );
185
-
186
- // Verify squash commit on main
187
- const log = run("git log --oneline -3", tempDir);
188
- assert.ok(
189
- log.includes("M001"),
190
- "squash commit on main should reference M001",
191
- );
192
-
193
- assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
193
+ }
194
194
  });
195
195
 
196
196
  // ─── Integration: last of multiple milestones completes → merged ─────────────
197
197
 
198
- test("last milestone worktree is merged when it's the final one (#962)", (t) => {
198
+ test("last milestone worktree is merged when it's the final one (#962)", () => {
199
199
  const savedCwd = process.cwd();
200
200
  let tempDir = "";
201
201
 
202
- t.after(() => {
202
+ try {
203
+ tempDir = createTempRepo();
204
+
205
+ // Set up two milestones
206
+ createMilestoneArtifacts(tempDir, "M001");
207
+ createMilestoneArtifacts(tempDir, "M002");
208
+ run("git add .", tempDir);
209
+ run('git commit -m "add milestones"', tempDir);
210
+
211
+ // Complete M001 first (merge it)
212
+ const wt1 = createAutoWorktree(tempDir, "M001");
213
+ writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
214
+ run("git add .", wt1);
215
+ run('git commit -m "feat(M001): m001 work"', wt1);
216
+ const roadmap1 = readFileSync(
217
+ join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
218
+ "utf-8",
219
+ );
220
+ mergeMilestoneToMain(tempDir, "M001", roadmap1);
221
+
222
+ // Now complete M002 (the LAST milestone — this is the #962 scenario)
223
+ const wt2 = createAutoWorktree(tempDir, "M002");
224
+ writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
225
+ run("git add .", wt2);
226
+ run('git commit -m "feat(M002): m002 work"', wt2);
227
+ const roadmap2 = readFileSync(
228
+ join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
229
+ "utf-8",
230
+ );
231
+ mergeMilestoneToMain(tempDir, "M002", roadmap2);
232
+
233
+ // Both features should now be on main
234
+ assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
235
+ assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
236
+ assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
237
+
238
+ // Both milestone branches should be cleaned up
239
+ const branches = run("git branch", tempDir);
240
+ assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
241
+ assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
242
+ } finally {
203
243
  process.chdir(savedCwd);
204
244
  if (tempDir && existsSync(tempDir)) {
205
- rmSync(tempDir, { recursive: true, force: true });
245
+ rmSync(tempDir, { recursive: true, force: true });
206
246
  }
207
- });
208
-
209
- tempDir = createTempRepo();
210
-
211
- // Set up two milestones
212
- createMilestoneArtifacts(tempDir, "M001");
213
- createMilestoneArtifacts(tempDir, "M002");
214
- run("git add .", tempDir);
215
- run('git commit -m "add milestones"', tempDir);
216
-
217
- // Complete M001 first (merge it)
218
- const wt1 = createAutoWorktree(tempDir, "M001");
219
- writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
220
- run("git add .", wt1);
221
- run('git commit -m "feat(M001): m001 work"', wt1);
222
- const roadmap1 = readFileSync(
223
- join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
224
- "utf-8",
225
- );
226
- mergeMilestoneToMain(tempDir, "M001", roadmap1);
227
-
228
- // Now complete M002 (the LAST milestone — this is the #962 scenario)
229
- const wt2 = createAutoWorktree(tempDir, "M002");
230
- writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
231
- run("git add .", wt2);
232
- run('git commit -m "feat(M002): m002 work"', wt2);
233
- const roadmap2 = readFileSync(
234
- join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
235
- "utf-8",
236
- );
237
- mergeMilestoneToMain(tempDir, "M002", roadmap2);
238
-
239
- // Both features should now be on main
240
- assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
241
- assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
242
- assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
243
-
244
- // Both milestone branches should be cleaned up
245
- const branches = run("git branch", tempDir);
246
- assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
247
- assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
247
+ }
248
248
  });
@@ -110,24 +110,26 @@ test("clearLock is safe when no lock file exists", () => {
110
110
  rmSync(dir, { recursive: true, force: true });
111
111
  });
112
112
 
113
- test("bootstrap cleanup releases session lock artifacts", (t) => {
113
+ test("bootstrap cleanup releases session lock artifacts", () => {
114
114
  const dir = mkdtempSync(join(tmpdir(), "gsd-lock-test-"));
115
115
  mkdirSync(join(dir, ".gsd"), { recursive: true });
116
116
 
117
- t.after(() => rmSync(dir, { recursive: true, force: true }));
118
-
119
- const result = acquireSessionLock(dir);
120
- assert.equal(result.acquired, true, "session lock should be acquired");
121
- assert.ok(existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should exist while lock is held");
122
- if (properLockfileAvailable) {
123
- assert.ok(existsSync(join(dir, ".gsd.lock")), ".gsd.lock should exist while lock is held");
117
+ try {
118
+ const result = acquireSessionLock(dir);
119
+ assert.equal(result.acquired, true, "session lock should be acquired");
120
+ assert.ok(existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should exist while lock is held");
121
+ if (properLockfileAvailable) {
122
+ assert.ok(existsSync(join(dir, ".gsd.lock")), ".gsd.lock should exist while lock is held");
123
+ }
124
+
125
+ releaseSessionLock(dir);
126
+ clearLock(dir);
127
+
128
+ assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
129
+ assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
130
+ } finally {
131
+ rmSync(dir, { recursive: true, force: true });
124
132
  }
125
-
126
- releaseSessionLock(dir);
127
- clearLock(dir);
128
-
129
- assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
130
- assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
131
133
  });
132
134
 
133
135
  // ─── isLockProcessAlive detects live vs dead PIDs ────────────────────────
@@ -51,79 +51,93 @@ function cleanup(base: string): void {
51
51
  try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
52
52
  }
53
53
 
54
- test("resolveMilestonePath returns null for missing milestone", (t) => {
54
+ test("resolveMilestonePath returns null for missing milestone", () => {
55
55
  const base = makeTmpBase();
56
56
  mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
57
- t.after(() => cleanup(base));
58
-
59
- const result = resolveMilestonePath(base, "M999");
60
- assert.equal(result, null, "should return null for non-existent milestone");
57
+ try {
58
+ const result = resolveMilestonePath(base, "M999");
59
+ assert.equal(result, null, "should return null for non-existent milestone");
60
+ } finally {
61
+ cleanup(base);
62
+ }
61
63
  });
62
64
 
63
- test("resolveMilestonePath returns path for existing milestone", (t) => {
65
+ test("resolveMilestonePath returns path for existing milestone", () => {
64
66
  const base = makeTmpBase();
65
67
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
66
- t.after(() => cleanup(base));
67
-
68
- const result = resolveMilestonePath(base, "M001");
69
- assert.ok(result, "should return a path for existing milestone");
70
- assert.ok(result.includes("M001"), "path should contain the milestone ID");
68
+ try {
69
+ const result = resolveMilestonePath(base, "M001");
70
+ assert.ok(result, "should return a path for existing milestone");
71
+ assert.ok(result.includes("M001"), "path should contain the milestone ID");
72
+ } finally {
73
+ cleanup(base);
74
+ }
71
75
  });
72
76
 
73
- test("resolveMilestoneFile returns null when no SUMMARY exists", (t) => {
77
+ test("resolveMilestoneFile returns null when no SUMMARY exists", () => {
74
78
  const base = makeTmpBase();
75
79
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
76
- t.after(() => cleanup(base));
77
-
78
- const result = resolveMilestoneFile(base, "M001", "SUMMARY");
79
- assert.equal(result, null, "should return null when no SUMMARY file");
80
+ try {
81
+ const result = resolveMilestoneFile(base, "M001", "SUMMARY");
82
+ assert.equal(result, null, "should return null when no SUMMARY file");
83
+ } finally {
84
+ cleanup(base);
85
+ }
80
86
  });
81
87
 
82
- test("resolveMilestoneFile returns path when SUMMARY exists (completed)", (t) => {
88
+ test("resolveMilestoneFile returns path when SUMMARY exists (completed)", () => {
83
89
  const base = makeTmpBase();
84
90
  const mDir = join(base, ".gsd", "milestones", "M001");
85
91
  mkdirSync(mDir, { recursive: true });
86
92
  writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
87
- t.after(() => cleanup(base));
88
-
89
- const result = resolveMilestoneFile(base, "M001", "SUMMARY");
90
- assert.ok(result, "should return a path when SUMMARY exists");
91
- assert.ok(result.includes("SUMMARY"), "path should reference SUMMARY");
93
+ try {
94
+ const result = resolveMilestoneFile(base, "M001", "SUMMARY");
95
+ assert.ok(result, "should return a path when SUMMARY exists");
96
+ assert.ok(result.includes("SUMMARY"), "path should reference SUMMARY");
97
+ } finally {
98
+ cleanup(base);
99
+ }
92
100
  });
93
101
 
94
102
  // ─── Combined validation logic (mirrors auto.ts resume guard) ───────────────
95
103
 
96
- test("stale milestone: missing dir means paused session should be discarded", (t) => {
104
+ test("stale milestone: missing dir means paused session should be discarded", () => {
97
105
  const base = makeTmpBase();
98
106
  mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
99
- t.after(() => cleanup(base));
100
-
101
- const mDir = resolveMilestonePath(base, "M999");
102
- const summaryFile = resolveMilestoneFile(base, "M999", "SUMMARY");
103
- const isStale = !mDir || !!summaryFile;
104
- assert.ok(isStale, "milestone that doesn't exist should be detected as stale");
107
+ try {
108
+ const mDir = resolveMilestonePath(base, "M999");
109
+ const summaryFile = resolveMilestoneFile(base, "M999", "SUMMARY");
110
+ const isStale = !mDir || !!summaryFile;
111
+ assert.ok(isStale, "milestone that doesn't exist should be detected as stale");
112
+ } finally {
113
+ cleanup(base);
114
+ }
105
115
  });
106
116
 
107
- test("stale milestone: completed (has SUMMARY) means paused session should be discarded", (t) => {
117
+ test("stale milestone: completed (has SUMMARY) means paused session should be discarded", () => {
108
118
  const base = makeTmpBase();
109
119
  const mDir = join(base, ".gsd", "milestones", "M001");
110
120
  mkdirSync(mDir, { recursive: true });
111
121
  writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
112
- t.after(() => cleanup(base));
113
-
114
- const dir = resolveMilestonePath(base, "M001");
115
- const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
116
- const isStale = !dir || !!summaryFile;
117
- assert.ok(isStale, "milestone with SUMMARY should be detected as stale");
122
+ try {
123
+ const dir = resolveMilestonePath(base, "M001");
124
+ const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
125
+ const isStale = !dir || !!summaryFile;
126
+ assert.ok(isStale, "milestone with SUMMARY should be detected as stale");
127
+ } finally {
128
+ cleanup(base);
129
+ }
118
130
  });
119
131
 
120
- test("valid milestone: exists and has no SUMMARY means paused session is valid", (t) => {
132
+ test("valid milestone: exists and has no SUMMARY means paused session is valid", () => {
121
133
  const base = makeTmpBase();
122
134
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
123
- t.after(() => cleanup(base));
124
-
125
- const dir = resolveMilestonePath(base, "M001");
126
- const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
127
- const isStale = !dir || !!summaryFile;
128
- assert.ok(!isStale, "active milestone should not be detected as stale");
135
+ try {
136
+ const dir = resolveMilestonePath(base, "M001");
137
+ const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
138
+ const isStale = !dir || !!summaryFile;
139
+ assert.ok(!isStale, "active milestone should not be detected as stale");
140
+ } finally {
141
+ cleanup(base);
142
+ }
129
143
  });
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
6
6
 
7
7
  import { runGSDDoctor, selectDoctorScope, filterDoctorIssues } from "../doctor.js";
8
8
 
9
- test("auto-preflight scopes to active milestone, ignoring historical", async (t) => {
9
+ test("auto-preflight scopes to active milestone, ignoring historical", async () => {
10
10
  const tmpBase = mkdtempSync(join(tmpdir(), "gsd-auto-preflight-test-"));
11
11
  const gsd = join(tmpBase, ".gsd");
12
12
 
@@ -23,16 +23,18 @@ test("auto-preflight scopes to active milestone, ignoring historical", async (t)
23
23
  writeFileSync(join(gsd, "milestones", "M009", "M009-ROADMAP.md"), `# M009: Active\n\n## Slices\n- [ ] **S01: Active Slice** \`risk:low\` \`depends:[]\`\n > After this: active works\n`);
24
24
  writeFileSync(join(gsd, "milestones", "M009", "slices", "S01", "S01-PLAN.md"), `# S01: Active Slice\n\n**Goal:** Active\n**Demo:** Active\n\n## Must-Haves\n- done\n\n## Tasks\n- [ ] **T01: Active Task** \`est:5m\`\n todo\n`);
25
25
 
26
- t.after(() => rmSync(tmpBase, { recursive: true, force: true }));
26
+ try {
27
+ const scope = await selectDoctorScope(tmpBase);
28
+ assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
27
29
 
28
- const scope = await selectDoctorScope(tmpBase);
29
- assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
30
+ const scopedReport = await runGSDDoctor(tmpBase, { fix: false, scope });
31
+ const scopedBlocking = filterDoctorIssues(scopedReport.issues, { scope, includeWarnings: false });
32
+ assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
30
33
 
31
- const scopedReport = await runGSDDoctor(tmpBase, { fix: false, scope });
32
- const scopedBlocking = filterDoctorIssues(scopedReport.issues, { scope, includeWarnings: false });
33
- assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
34
-
35
- const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
36
- const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
37
- assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
34
+ const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
35
+ const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
36
+ assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
37
+ } finally {
38
+ rmSync(tmpBase, { recursive: true, force: true });
39
+ }
38
40
  });