gsd-pi 2.43.0-next.8 → 2.44.0-dev.0b97ffd

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 (399) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +21 -8
  5. package/dist/resources/extensions/gsd/auto-prompts.js +130 -51
  6. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  7. package/dist/resources/extensions/gsd/auto-worktree.js +16 -2
  8. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  9. package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
  10. package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
  11. package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
  12. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  13. package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -11
  14. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -10
  15. package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
  16. package/dist/resources/extensions/gsd/workspace-index.js +46 -15
  17. package/dist/web/standalone/.next/BUILD_ID +1 -1
  18. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  19. package/dist/web/standalone/.next/build-manifest.json +3 -3
  20. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  21. package/dist/web/standalone/.next/required-server-files.json +4 -4
  22. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  23. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  25. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  33. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  36. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  49. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  87. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  93. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  109. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  111. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  113. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/index.html +1 -1
  123. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  124. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  126. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  128. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/page.js +2 -2
  130. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  132. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  133. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  134. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/middleware.js +2 -2
  136. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  138. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  139. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  140. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  141. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  142. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  143. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  144. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  146. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  147. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  148. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  149. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  150. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  151. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  152. package/dist/web/standalone/server.js +1 -1
  153. package/package.json +4 -4
  154. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -3
  155. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/core/agent-session.js +11 -34
  157. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  159. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  161. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  164. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  167. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  169. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  171. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
  173. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  175. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  177. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  181. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  183. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  185. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  187. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  188. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  189. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  190. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  191. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  192. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  193. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  194. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  195. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  196. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  197. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  198. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  199. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  200. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  201. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  202. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  203. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  204. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  205. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  206. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  207. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  208. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  210. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  212. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  214. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  216. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/index.js +1 -0
  218. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  220. package/packages/pi-coding-agent/dist/main.js +11 -199
  221. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  222. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  223. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  224. package/packages/pi-coding-agent/package.json +1 -1
  225. package/packages/pi-coding-agent/src/core/agent-session.ts +13 -37
  226. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  227. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  228. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  229. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  230. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  231. package/packages/pi-coding-agent/src/core/extensions/loader.ts +23 -0
  232. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  233. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  234. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  235. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  236. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  237. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  238. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  239. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  240. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  241. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  242. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  243. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  244. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  245. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  246. package/packages/pi-coding-agent/src/index.ts +7 -0
  247. package/packages/pi-coding-agent/src/main.ts +11 -232
  248. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  249. package/pkg/package.json +1 -1
  250. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +22 -7
  251. package/src/resources/extensions/gsd/auto-prompts.ts +109 -42
  252. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  253. package/src/resources/extensions/gsd/auto-worktree.ts +16 -3
  254. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  255. package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
  256. package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
  257. package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
  258. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  259. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  260. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  261. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  262. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  263. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  264. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  265. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  266. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +3 -3
  267. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  268. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  269. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  270. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  271. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  272. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  273. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  274. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  275. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  276. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  277. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  278. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  279. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  280. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  281. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  282. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  283. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  284. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  285. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  286. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +152 -183
  287. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  288. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  289. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  290. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  291. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  292. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  293. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  294. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  295. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  296. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  297. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  298. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  299. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  300. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  301. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  302. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  303. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  304. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  305. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  306. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  307. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  308. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  309. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  310. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  311. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  312. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  313. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  314. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  315. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  316. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  317. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  318. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  319. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  320. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  321. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  322. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  323. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  324. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  325. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  326. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  327. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  328. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  329. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  330. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  331. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  332. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  333. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  334. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  335. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  336. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  337. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  338. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  339. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  340. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  341. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  342. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  343. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  344. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  345. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  346. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  347. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  348. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  349. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  350. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  351. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  352. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  353. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  354. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  355. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  356. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  357. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  358. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  359. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  360. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  361. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  362. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  363. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  364. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  365. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  366. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  367. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  368. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  369. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  370. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  371. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +9 -11
  372. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  373. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  374. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  375. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  376. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  377. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  378. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  379. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  380. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  381. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  382. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  383. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  384. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  385. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  386. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  387. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  388. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  389. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  390. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -18
  391. package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -15
  392. package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
  393. package/src/resources/extensions/gsd/workspace-index.ts +49 -18
  394. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  395. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  396. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  397. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  398. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_buildManifest.js +0 -0
  399. /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  /**
2
4
  * doctor-environment-worktree.test.ts — Worktree-aware dependency checks (#2303).
3
5
  *
@@ -19,10 +21,6 @@ import {
19
21
  environmentResultsToDoctorIssues,
20
22
  checkEnvironmentHealth,
21
23
  } from "../doctor-environment.ts";
22
- import { createTestContext } from "./test-helpers.ts";
23
-
24
- const { assertEq, assertTrue, report } = createTestContext();
25
-
26
24
  /** Create a directory tree with files. */
27
25
  function createDir(files: Record<string, string> = {}): string {
28
26
  const dir = mkdtempSync(join(tmpdir(), "gsd-wt-env-"));
@@ -34,13 +32,12 @@ function createDir(files: Record<string, string> = {}): string {
34
32
  return dir;
35
33
  }
36
34
 
37
- async function main(): Promise<void> {
35
+ describe('doctor-environment-worktree', async () => {
38
36
  const cleanups: string[] = [];
39
37
 
40
38
  try {
41
39
  // ── Reproduction: worktree path without node_modules ───────────────
42
- console.log("\n=== worktree: missing node_modules should NOT error when project root has them ===");
43
- {
40
+ test('worktree: missing node_modules should NOT error when project root has them', () => {
44
41
  // Simulate project root with node_modules
45
42
  const projectRoot = createDir({
46
43
  "package.json": JSON.stringify({ name: "test-project" }),
@@ -62,15 +59,14 @@ async function main(): Promise<void> {
62
59
 
63
60
  // Before fix: this would return status "error" with "node_modules missing"
64
61
  // After fix: should return "ok" because project root has node_modules
65
- assertTrue(
62
+ assert.ok(
66
63
  depsCheck === undefined || depsCheck.status !== "error",
67
64
  "worktree should not report env_dependencies error when project root has node_modules",
68
65
  );
69
- }
66
+ });
70
67
 
71
68
  // ── Worktree with NO node_modules anywhere should still error ──────
72
- console.log("\n=== worktree: missing node_modules everywhere should still error ===");
73
- {
69
+ test('worktree: missing node_modules everywhere should still error', () => {
74
70
  const projectRoot = createDir({
75
71
  "package.json": JSON.stringify({ name: "test-project" }),
76
72
  });
@@ -86,13 +82,12 @@ async function main(): Promise<void> {
86
82
 
87
83
  const results = runEnvironmentChecks(worktreeDir);
88
84
  const depsCheck = results.find(r => r.name === "dependencies");
89
- assertTrue(depsCheck !== undefined, "dependencies check still runs in worktree");
90
- assertEq(depsCheck!.status, "error", "reports error when node_modules missing everywhere");
91
- }
85
+ assert.ok(depsCheck !== undefined, "dependencies check still runs in worktree");
86
+ assert.deepStrictEqual(depsCheck!.status, "error", "reports error when node_modules missing everywhere");
87
+ });
92
88
 
93
89
  // ── Worktree env_dependencies not in doctor issues ──────────────────
94
- console.log("\n=== worktree: checkEnvironmentHealth should not add env_dependencies for valid worktree ===");
95
- {
90
+ test('worktree: checkEnvironmentHealth should not add env_dependencies for valid worktree', async () => {
96
91
  const projectRoot = createDir({
97
92
  "package.json": JSON.stringify({ name: "test-project" }),
98
93
  });
@@ -109,29 +104,27 @@ async function main(): Promise<void> {
109
104
  const issues: any[] = [];
110
105
  await checkEnvironmentHealth(worktreeDir, issues);
111
106
  const depIssue = issues.find(i => i.code === "env_dependencies");
112
- assertEq(
107
+ assert.deepStrictEqual(
113
108
  depIssue,
114
109
  undefined,
115
110
  "no env_dependencies issue for worktree with project root node_modules",
116
111
  );
117
- }
112
+ });
118
113
 
119
114
  // ── Non-worktree path still catches missing node_modules ───────────
120
- console.log("\n=== non-worktree: missing node_modules still detected ===");
121
- {
115
+ test('non-worktree: missing node_modules still detected', () => {
122
116
  const dir = createDir({
123
117
  "package.json": JSON.stringify({ name: "test" }),
124
118
  });
125
119
  cleanups.push(dir);
126
120
  const results = runEnvironmentChecks(dir);
127
121
  const depsCheck = results.find(r => r.name === "dependencies");
128
- assertTrue(depsCheck !== undefined, "dependencies check runs");
129
- assertEq(depsCheck!.status, "error", "missing node_modules is an error for non-worktree");
130
- }
122
+ assert.ok(depsCheck !== undefined, "dependencies check runs");
123
+ assert.deepStrictEqual(depsCheck!.status, "error", "missing node_modules is an error for non-worktree");
124
+ });
131
125
 
132
126
  // ── GSD_WORKTREE env var detection ─────────────────────────────────
133
- console.log("\n=== GSD_WORKTREE env: should resolve project root node_modules ===");
134
- {
127
+ test('GSD_WORKTREE env: should resolve project root node_modules', () => {
135
128
  const projectRoot = createDir({
136
129
  "package.json": JSON.stringify({ name: "test-project" }),
137
130
  });
@@ -150,7 +143,7 @@ async function main(): Promise<void> {
150
143
  process.env.GSD_WORKTREE = projectRoot;
151
144
  const results = runEnvironmentChecks(someDir);
152
145
  const depsCheck = results.find(r => r.name === "dependencies");
153
- assertTrue(
146
+ assert.ok(
154
147
  depsCheck === undefined || depsCheck.status !== "error",
155
148
  "GSD_WORKTREE env allows fallback to project root node_modules",
156
149
  );
@@ -161,15 +154,11 @@ async function main(): Promise<void> {
161
154
  process.env.GSD_WORKTREE = origEnv;
162
155
  }
163
156
  }
164
- }
157
+ });
165
158
 
166
159
  } finally {
167
160
  for (const dir of cleanups) {
168
161
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
169
162
  }
170
163
  }
171
-
172
- report();
173
- }
174
-
175
- main();
164
+ });
@@ -1,3 +1,5 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  /**
2
4
  * doctor-environment.test.ts — Tests for environment health checks (#1221).
3
5
  *
@@ -25,10 +27,6 @@ import {
25
27
  checkEnvironmentHealth,
26
28
  type EnvironmentCheckResult,
27
29
  } from "../doctor-environment.ts";
28
- import { createTestContext } from "./test-helpers.ts";
29
-
30
- const { assertEq, assertTrue, assertMatch, report } = createTestContext();
31
-
32
30
  function createProjectDir(files: Record<string, string> = {}): string {
33
31
  const dir = mkdtempSync(join(tmpdir(), "gsd-env-test-"));
34
32
  for (const [name, content] of Object.entries(files)) {
@@ -39,34 +37,31 @@ function createProjectDir(files: Record<string, string> = {}): string {
39
37
  return dir;
40
38
  }
41
39
 
42
- async function main(): Promise<void> {
40
+ describe('doctor-environment', async () => {
43
41
  const cleanups: string[] = [];
44
42
 
45
43
  try {
46
44
  // ── Node Version Check ─────────────────────────────────────────────
47
- console.log("\n=== env: no package.json returns empty ===");
48
- {
45
+ test('env: no package.json returns empty', () => {
49
46
  const dir = createProjectDir();
50
47
  cleanups.push(dir);
51
48
  const results = runEnvironmentChecks(dir);
52
49
  // No package.json → no node checks
53
50
  const nodeCheck = results.find(r => r.name === "node_version");
54
- assertEq(nodeCheck, undefined, "no node version check without package.json");
55
- }
51
+ assert.deepStrictEqual(nodeCheck, undefined, "no node version check without package.json");
52
+ });
56
53
 
57
- console.log("\n=== env: package.json without engines returns no node check ===");
58
- {
54
+ test('env: package.json without engines returns no node check', () => {
59
55
  const dir = createProjectDir({
60
56
  "package.json": JSON.stringify({ name: "test", version: "1.0.0" }),
61
57
  });
62
58
  cleanups.push(dir);
63
59
  const results = runEnvironmentChecks(dir);
64
60
  const nodeCheck = results.find(r => r.name === "node_version");
65
- assertEq(nodeCheck, undefined, "no node version check without engines field");
66
- }
61
+ assert.deepStrictEqual(nodeCheck, undefined, "no node version check without engines field");
62
+ });
67
63
 
68
- console.log("\n=== env: package.json with engines returns node check ===");
69
- {
64
+ test('env: package.json with engines returns node check', () => {
70
65
  const dir = createProjectDir({
71
66
  "package.json": JSON.stringify({
72
67
  name: "test",
@@ -77,27 +72,25 @@ async function main(): Promise<void> {
77
72
  cleanups.push(dir);
78
73
  const results = runEnvironmentChecks(dir);
79
74
  const nodeCheck = results.find(r => r.name === "node_version");
80
- assertTrue(nodeCheck !== undefined, "node version check runs with engines field");
75
+ assert.ok(nodeCheck !== undefined, "node version check runs with engines field");
81
76
  // Current node should be >= 18 in CI
82
- assertEq(nodeCheck!.status, "ok", "node version meets requirement");
83
- }
77
+ assert.deepStrictEqual(nodeCheck!.status, "ok", "node version meets requirement");
78
+ });
84
79
 
85
80
  // ── Dependencies Check ─────────────────────────────────────────────
86
- console.log("\n=== env: missing node_modules detected ===");
87
- {
81
+ test('env: missing node_modules detected', () => {
88
82
  const dir = createProjectDir({
89
83
  "package.json": JSON.stringify({ name: "test" }),
90
84
  });
91
85
  cleanups.push(dir);
92
86
  const results = runEnvironmentChecks(dir);
93
87
  const depsCheck = results.find(r => r.name === "dependencies");
94
- assertTrue(depsCheck !== undefined, "dependencies check runs");
95
- assertEq(depsCheck!.status, "error", "missing node_modules is an error");
96
- assertTrue(depsCheck!.message.includes("node_modules missing"), "reports missing node_modules");
97
- }
88
+ assert.ok(depsCheck !== undefined, "dependencies check runs");
89
+ assert.deepStrictEqual(depsCheck!.status, "error", "missing node_modules is an error");
90
+ assert.ok(depsCheck!.message.includes("node_modules missing"), "reports missing node_modules");
91
+ });
98
92
 
99
- console.log("\n=== env: existing node_modules detected ===");
100
- {
93
+ test('env: existing node_modules detected', () => {
101
94
  const dir = createProjectDir({
102
95
  "package.json": JSON.stringify({ name: "test" }),
103
96
  });
@@ -105,25 +98,23 @@ async function main(): Promise<void> {
105
98
  cleanups.push(dir);
106
99
  const results = runEnvironmentChecks(dir);
107
100
  const depsCheck = results.find(r => r.name === "dependencies");
108
- assertTrue(depsCheck !== undefined, "dependencies check runs");
109
- assertEq(depsCheck!.status, "ok", "existing node_modules is ok");
110
- }
101
+ assert.ok(depsCheck !== undefined, "dependencies check runs");
102
+ assert.deepStrictEqual(depsCheck!.status, "ok", "existing node_modules is ok");
103
+ });
111
104
 
112
105
  // ── Env File Check ─────────────────────────────────────────────────
113
- console.log("\n=== env: .env.example without .env detected ===");
114
- {
106
+ test('env: .env.example without .env detected', () => {
115
107
  const dir = createProjectDir({
116
108
  ".env.example": "DB_URL=xxx\nAPI_KEY=xxx\n",
117
109
  });
118
110
  cleanups.push(dir);
119
111
  const results = runEnvironmentChecks(dir);
120
112
  const envCheck = results.find(r => r.name === "env_file");
121
- assertTrue(envCheck !== undefined, "env file check runs");
122
- assertEq(envCheck!.status, "warning", "missing .env is a warning");
123
- }
113
+ assert.ok(envCheck !== undefined, "env file check runs");
114
+ assert.deepStrictEqual(envCheck!.status, "warning", "missing .env is a warning");
115
+ });
124
116
 
125
- console.log("\n=== env: .env.example with .env is ok ===");
126
- {
117
+ test('env: .env.example with .env is ok', () => {
127
118
  const dir = createProjectDir({
128
119
  ".env.example": "DB_URL=xxx\n",
129
120
  ".env": "DB_URL=postgres://localhost/test\n",
@@ -131,12 +122,11 @@ async function main(): Promise<void> {
131
122
  cleanups.push(dir);
132
123
  const results = runEnvironmentChecks(dir);
133
124
  const envCheck = results.find(r => r.name === "env_file");
134
- assertTrue(envCheck !== undefined, "env file check runs");
135
- assertEq(envCheck!.status, "ok", "present .env is ok");
136
- }
125
+ assert.ok(envCheck !== undefined, "env file check runs");
126
+ assert.deepStrictEqual(envCheck!.status, "ok", "present .env is ok");
127
+ });
137
128
 
138
- console.log("\n=== env: .env.example with .env.local is ok ===");
139
- {
129
+ test('env: .env.example with .env.local is ok', () => {
140
130
  const dir = createProjectDir({
141
131
  ".env.example": "DB_URL=xxx\n",
142
132
  ".env.local": "DB_URL=postgres://localhost/test\n",
@@ -144,25 +134,23 @@ async function main(): Promise<void> {
144
134
  cleanups.push(dir);
145
135
  const results = runEnvironmentChecks(dir);
146
136
  const envCheck = results.find(r => r.name === "env_file");
147
- assertTrue(envCheck !== undefined, "env file check runs");
148
- assertEq(envCheck!.status, "ok", ".env.local counts as present");
149
- }
137
+ assert.ok(envCheck !== undefined, "env file check runs");
138
+ assert.deepStrictEqual(envCheck!.status, "ok", ".env.local counts as present");
139
+ });
150
140
 
151
141
  // ── Disk Space Check ───────────────────────────────────────────────
152
- console.log("\n=== env: disk space check returns result ===");
153
142
  if (process.platform !== "win32") {
154
143
  const dir = createProjectDir();
155
144
  cleanups.push(dir);
156
145
  const results = runEnvironmentChecks(dir);
157
146
  const diskCheck = results.find(r => r.name === "disk_space");
158
- assertTrue(diskCheck !== undefined, "disk space check runs on unix");
147
+ assert.ok(diskCheck !== undefined, "disk space check runs on unix");
159
148
  // Should be ok on dev machines with reasonable disk
160
- assertTrue(diskCheck!.status === "ok" || diskCheck!.status === "warning", "disk check returns valid status");
149
+ assert.ok(diskCheck!.status === "ok" || diskCheck!.status === "warning", "disk check returns valid status");
161
150
  }
162
151
 
163
152
  // ── Project Tools Check ────────────────────────────────────────────
164
- console.log("\n=== env: detects missing python when pyproject.toml exists ===");
165
- {
153
+ test('env: detects missing python when pyproject.toml exists', () => {
166
154
  const dir = createProjectDir({
167
155
  "package.json": JSON.stringify({ name: "test" }),
168
156
  "pyproject.toml": "[build-system]\nrequires = ['setuptools']\n",
@@ -173,11 +161,10 @@ async function main(): Promise<void> {
173
161
  const pythonCheck = results.find(r => r.name === "python");
174
162
  // Python is likely installed on CI/dev machines, so just verify the check runs
175
163
  // without error — the result depends on the system
176
- assertTrue(true, "python check runs without error");
177
- }
164
+ assert.ok(true, "python check runs without error");
165
+ });
178
166
 
179
- console.log("\n=== env: detects Cargo.toml ===");
180
- {
167
+ test('env: detects Cargo.toml', () => {
181
168
  const dir = createProjectDir({
182
169
  "package.json": JSON.stringify({ name: "test" }),
183
170
  "Cargo.toml": "[package]\nname = 'test'\n",
@@ -186,12 +173,11 @@ async function main(): Promise<void> {
186
173
  cleanups.push(dir);
187
174
  const results = runEnvironmentChecks(dir);
188
175
  // Just verify it runs without error
189
- assertTrue(true, "cargo check runs without error");
190
- }
176
+ assert.ok(true, "cargo check runs without error");
177
+ });
191
178
 
192
179
  // ── Docker Check ───────────────────────────────────────────────────
193
- console.log("\n=== env: no docker check without Dockerfile ===");
194
- {
180
+ test('env: no docker check without Dockerfile', () => {
195
181
  const dir = createProjectDir({
196
182
  "package.json": JSON.stringify({ name: "test" }),
197
183
  });
@@ -199,11 +185,10 @@ async function main(): Promise<void> {
199
185
  cleanups.push(dir);
200
186
  const results = runEnvironmentChecks(dir);
201
187
  const dockerCheck = results.find(r => r.name === "docker");
202
- assertEq(dockerCheck, undefined, "no docker check without Dockerfile");
203
- }
188
+ assert.deepStrictEqual(dockerCheck, undefined, "no docker check without Dockerfile");
189
+ });
204
190
 
205
- console.log("\n=== env: docker check with Dockerfile ===");
206
- {
191
+ test('env: docker check with Dockerfile', () => {
207
192
  const dir = createProjectDir({
208
193
  "package.json": JSON.stringify({ name: "test" }),
209
194
  "Dockerfile": "FROM node:22\n",
@@ -213,12 +198,11 @@ async function main(): Promise<void> {
213
198
  const results = runEnvironmentChecks(dir);
214
199
  const dockerCheck = results.find(r => r.name === "docker");
215
200
  // Docker may or may not be installed on the test machine
216
- assertTrue(dockerCheck !== undefined, "docker check runs when Dockerfile present");
217
- }
201
+ assert.ok(dockerCheck !== undefined, "docker check runs when Dockerfile present");
202
+ });
218
203
 
219
204
  // ── Doctor Issue Conversion ────────────────────────────────────────
220
- console.log("\n=== env: converts results to doctor issues ===");
221
- {
205
+ test('env: converts results to doctor issues', () => {
222
206
  const results: EnvironmentCheckResult[] = [
223
207
  { name: "node_version", status: "ok", message: "Node.js v22.0.0" },
224
208
  { name: "dependencies", status: "error", message: "node_modules missing" },
@@ -226,16 +210,15 @@ async function main(): Promise<void> {
226
210
  ];
227
211
 
228
212
  const issues = environmentResultsToDoctorIssues(results);
229
- assertEq(issues.length, 2, "only non-ok results converted");
230
- assertEq(issues[0]!.severity, "error", "error severity preserved");
231
- assertEq(issues[0]!.code, "env_dependencies", "code prefixed with env_");
232
- assertEq(issues[1]!.severity, "warning", "warning severity preserved");
233
- assertTrue(issues[1]!.message.includes("Copy .env.example"), "detail included in message");
234
- }
213
+ assert.deepStrictEqual(issues.length, 2, "only non-ok results converted");
214
+ assert.deepStrictEqual(issues[0]!.severity, "error", "error severity preserved");
215
+ assert.deepStrictEqual(issues[0]!.code, "env_dependencies", "code prefixed with env_");
216
+ assert.deepStrictEqual(issues[1]!.severity, "warning", "warning severity preserved");
217
+ assert.ok(issues[1]!.message.includes("Copy .env.example"), "detail included in message");
218
+ });
235
219
 
236
220
  // ── checkEnvironmentHealth integration ──────────────────────────────
237
- console.log("\n=== env: checkEnvironmentHealth adds issues to array ===");
238
- {
221
+ test('env: checkEnvironmentHealth adds issues to array', async () => {
239
222
  const dir = createProjectDir({
240
223
  "package.json": JSON.stringify({ name: "test" }),
241
224
  });
@@ -244,12 +227,11 @@ async function main(): Promise<void> {
244
227
  const issues: any[] = [];
245
228
  await checkEnvironmentHealth(dir, issues);
246
229
  // Should have at least the missing node_modules issue
247
- assertTrue(issues.some(i => i.code === "env_dependencies"), "environment issues added to array");
248
- }
230
+ assert.ok(issues.some(i => i.code === "env_dependencies"), "environment issues added to array");
231
+ });
249
232
 
250
233
  // ── Report Formatting ──────────────────────────────────────────────
251
- console.log("\n=== env: formatEnvironmentReport ===");
252
- {
234
+ test('env: formatEnvironmentReport', () => {
253
235
  const results: EnvironmentCheckResult[] = [
254
236
  { name: "node_version", status: "ok", message: "Node.js v22.0.0" },
255
237
  { name: "dependencies", status: "error", message: "node_modules missing", detail: "Run npm install" },
@@ -257,32 +239,29 @@ async function main(): Promise<void> {
257
239
  ];
258
240
 
259
241
  const report = formatEnvironmentReport(results);
260
- assertTrue(report.includes("Environment Health:"), "has header");
261
- assertTrue(report.includes("Node.js v22.0.0"), "includes ok result");
262
- assertTrue(report.includes("node_modules missing"), "includes error result");
263
- assertTrue(report.includes("Run npm install"), "includes detail for errors");
264
- }
242
+ assert.ok(report.includes("Environment Health:"), "has header");
243
+ assert.ok(report.includes("Node.js v22.0.0"), "includes ok result");
244
+ assert.ok(report.includes("node_modules missing"), "includes error result");
245
+ assert.ok(report.includes("Run npm install"), "includes detail for errors");
246
+ });
265
247
 
266
- console.log("\n=== env: formatEnvironmentReport empty ===");
267
- {
248
+ test('env: formatEnvironmentReport empty', () => {
268
249
  const report = formatEnvironmentReport([]);
269
- assertEq(report, "No environment checks applicable.", "empty report message");
270
- }
250
+ assert.deepStrictEqual(report, "No environment checks applicable.", "empty report message");
251
+ });
271
252
 
272
253
  // ── Full environment checks include git remote ─────────────────────
273
- console.log("\n=== env: runFullEnvironmentChecks includes git remote ===");
274
- {
254
+ test('env: runFullEnvironmentChecks includes git remote', () => {
275
255
  // runFullEnvironmentChecks adds git remote check
276
256
  // We can't easily test this without a real git repo, but verify it doesn't throw
277
257
  const dir = createProjectDir();
278
258
  cleanups.push(dir);
279
259
  const results = runFullEnvironmentChecks(dir);
280
260
  // No git repo → no remote check, but should not throw
281
- assertTrue(true, "runFullEnvironmentChecks does not throw on non-git dir");
282
- }
261
+ assert.ok(true, "runFullEnvironmentChecks does not throw on non-git dir");
262
+ });
283
263
 
284
264
  // ── Port Detection from package.json ───────────────────────────────
285
- console.log("\n=== env: port detection from scripts ===");
286
265
  if (process.platform !== "win32") {
287
266
  const dir = createProjectDir({
288
267
  "package.json": JSON.stringify({
@@ -299,7 +278,7 @@ async function main(): Promise<void> {
299
278
  // Port 3456 is unlikely to be in use, so no conflicts expected
300
279
  const portConflicts = results.filter(r => r.name === "port_conflict");
301
280
  // Just verify it ran without error
302
- assertTrue(true, "port check with script-detected ports runs without error");
281
+ assert.ok(true, "port check with script-detected ports runs without error");
303
282
  }
304
283
 
305
284
  } finally {
@@ -307,8 +286,4 @@ async function main(): Promise<void> {
307
286
  try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
308
287
  }
309
288
  }
310
-
311
- report();
312
- }
313
-
314
- main();
289
+ });
@@ -76,56 +76,53 @@ const REMOVED_CODES = [
76
76
  "slice_checked_missing_uat",
77
77
  ];
78
78
 
79
- test("fixLevel:task — no reconciliation issue codes are reported", async () => {
79
+ test("fixLevel:task — no reconciliation issue codes are reported", async (t) => {
80
80
  const tmp = makeTmp("task-level");
81
- try {
82
- buildScaffold(tmp);
81
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
83
82
 
84
- const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
83
+ buildScaffold(tmp);
85
84
 
86
- const codes = report.issues.map(i => i.code);
87
- for (const removed of REMOVED_CODES) {
88
- assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
89
- }
90
- } finally {
91
- rmSync(tmp, { recursive: true, force: true });
85
+ const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
86
+
87
+ const codes = report.issues.map(i => i.code);
88
+ for (const removed of REMOVED_CODES) {
89
+ assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
92
90
  }
93
91
  });
94
92
 
95
- test("fixLevel:all — no reconciliation issue codes are reported", async () => {
93
+ test("fixLevel:all — no reconciliation issue codes are reported", async (t) => {
96
94
  const tmp = makeTmp("all-level");
97
- try {
98
- buildScaffold(tmp);
99
-
100
- const report = await runGSDDoctor(tmp, { fix: true });
95
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
101
96
 
102
- const codes = report.issues.map(i => i.code);
103
- for (const removed of REMOVED_CODES) {
104
- assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
105
- }
97
+ buildScaffold(tmp);
106
98
 
107
- // Summary and UAT stubs should NOT be created (no reconciliation)
108
- const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
109
- assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub");
99
+ const report = await runGSDDoctor(tmp, { fix: true });
110
100
 
111
- // Roadmap should remain unchecked (no reconciliation)
112
- const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
113
- assert.ok(roadmapContent.includes("- [ ] **S01"), "roadmap should remain unchecked");
114
- } finally {
115
- rmSync(tmp, { recursive: true, force: true });
101
+ const codes = report.issues.map(i => i.code);
102
+ for (const removed of REMOVED_CODES) {
103
+ assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
116
104
  }
105
+
106
+ // Summary and UAT stubs should NOT be created (no reconciliation)
107
+ const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
108
+ assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub");
109
+
110
+ // Roadmap should remain unchecked (no reconciliation)
111
+ const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
112
+ assert.ok(roadmapContent.includes("- [ ] **S01"), "roadmap should remain unchecked");
117
113
  });
118
114
 
119
- test("fixLevel:all — delimiter_in_title still fixable", async () => {
115
+ test("fixLevel:all — delimiter_in_title still fixable", async (t) => {
120
116
  const tmp = makeTmp("delimiter-fix");
121
- try {
122
- const gsd = join(tmp, ".gsd");
123
- const m = join(gsd, "milestones", "M001");
124
- const s = join(m, "slices", "S01", "tasks");
125
- mkdirSync(s, { recursive: true });
117
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
118
+
119
+ const gsd = join(tmp, ".gsd");
120
+ const m = join(gsd, "milestones", "M001");
121
+ const s = join(m, "slices", "S01", "tasks");
122
+ mkdirSync(s, { recursive: true });
126
123
 
127
- // Roadmap with em dash in milestone title (should still be fixable)
128
- writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Foundation \u2014 Build Core
124
+ // Roadmap with em dash in milestone title (should still be fixable)
125
+ writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Foundation \u2014 Build Core
129
126
 
130
127
  ## Slices
131
128
 
@@ -133,7 +130,7 @@ test("fixLevel:all — delimiter_in_title still fixable", async () => {
133
130
  > Demo
134
131
  `);
135
132
 
136
- writeFileSync(join(m, "slices", "S01", "S01-PLAN.md"), `# S01: Test Slice
133
+ writeFileSync(join(m, "slices", "S01", "S01-PLAN.md"), `# S01: Test Slice
137
134
 
138
135
  **Goal:** test
139
136
 
@@ -142,13 +139,10 @@ test("fixLevel:all — delimiter_in_title still fixable", async () => {
142
139
  - [ ] **T01: Do stuff** \`est:5m\`
143
140
  `);
144
141
 
145
- const report = await runGSDDoctor(tmp, { fix: true });
142
+ const report = await runGSDDoctor(tmp, { fix: true });
146
143
 
147
- const delimiterIssues = report.issues.filter(i => i.code === "delimiter_in_title");
148
- // The milestone-level delimiter is auto-fixed, but the report may or may not include it
149
- // depending on whether it was fixed successfully. Just verify it ran without crashing.
150
- assert.ok(report.issues !== undefined, "doctor produces a report");
151
- } finally {
152
- rmSync(tmp, { recursive: true, force: true });
153
- }
144
+ const delimiterIssues = report.issues.filter(i => i.code === "delimiter_in_title");
145
+ // The milestone-level delimiter is auto-fixed, but the report may or may not include it
146
+ // depending on whether it was fixed successfully. Just verify it ran without crashing.
147
+ assert.ok(report.issues !== undefined, "doctor produces a report");
154
148
  });