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
@@ -36,176 +36,156 @@ function makeTempDir(prefix: string): string {
36
36
 
37
37
  // ─── appendCapture ────────────────────────────────────────────────────────────
38
38
 
39
- test("captures: appendCapture creates CAPTURES.md on first call", () => {
39
+ test("captures: appendCapture creates CAPTURES.md on first call", (t) => {
40
40
  const tmp = makeTempDir("cap-create");
41
- try {
42
- const id = appendCapture(tmp, "first thought");
43
- assert.ok(id.startsWith("CAP-"), "ID should start with CAP-");
44
- assert.ok(
45
- existsSync(join(tmp, ".gsd", "CAPTURES.md")),
46
- "CAPTURES.md should exist",
47
- );
48
- const content = readFileSync(join(tmp, ".gsd", "CAPTURES.md"), "utf-8");
49
- assert.ok(content.includes("# Captures"), "should have header");
50
- assert.ok(content.includes(`### ${id}`), "should have entry heading");
51
- assert.ok(
52
- content.includes("**Text:** first thought"),
53
- "should have text field",
54
- );
55
- assert.ok(
56
- content.includes("**Status:** pending"),
57
- "should have pending status",
58
- );
59
- } finally {
60
- rmSync(tmp, { recursive: true, force: true });
61
- }
41
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
42
+
43
+ const id = appendCapture(tmp, "first thought");
44
+ assert.ok(id.startsWith("CAP-"), "ID should start with CAP-");
45
+ assert.ok(
46
+ existsSync(join(tmp, ".gsd", "CAPTURES.md")),
47
+ "CAPTURES.md should exist",
48
+ );
49
+ const content = readFileSync(join(tmp, ".gsd", "CAPTURES.md"), "utf-8");
50
+ assert.ok(content.includes("# Captures"), "should have header");
51
+ assert.ok(content.includes(`### ${id}`), "should have entry heading");
52
+ assert.ok(
53
+ content.includes("**Text:** first thought"),
54
+ "should have text field",
55
+ );
56
+ assert.ok(
57
+ content.includes("**Status:** pending"),
58
+ "should have pending status",
59
+ );
62
60
  });
63
61
 
64
- test("captures: appendCapture appends to existing file", () => {
62
+ test("captures: appendCapture appends to existing file", (t) => {
65
63
  const tmp = makeTempDir("cap-append");
66
- try {
67
- const id1 = appendCapture(tmp, "thought one");
68
- const id2 = appendCapture(tmp, "thought two");
69
- assert.notStrictEqual(id1, id2, "IDs should be unique");
70
-
71
- const content = readFileSync(join(tmp, ".gsd", "CAPTURES.md"), "utf-8");
72
- assert.ok(content.includes(`### ${id1}`), "should have first entry");
73
- assert.ok(content.includes(`### ${id2}`), "should have second entry");
74
- assert.ok(
75
- content.includes("**Text:** thought one"),
76
- "should have first text",
77
- );
78
- assert.ok(
79
- content.includes("**Text:** thought two"),
80
- "should have second text",
81
- );
82
- } finally {
83
- rmSync(tmp, { recursive: true, force: true });
84
- }
64
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
65
+
66
+ const id1 = appendCapture(tmp, "thought one");
67
+ const id2 = appendCapture(tmp, "thought two");
68
+ assert.notStrictEqual(id1, id2, "IDs should be unique");
69
+
70
+ const content = readFileSync(join(tmp, ".gsd", "CAPTURES.md"), "utf-8");
71
+ assert.ok(content.includes(`### ${id1}`), "should have first entry");
72
+ assert.ok(content.includes(`### ${id2}`), "should have second entry");
73
+ assert.ok(
74
+ content.includes("**Text:** thought one"),
75
+ "should have first text",
76
+ );
77
+ assert.ok(
78
+ content.includes("**Text:** thought two"),
79
+ "should have second text",
80
+ );
85
81
  });
86
82
 
87
83
  // ─── loadAllCaptures / loadPendingCaptures ────────────────────────────────────
88
84
 
89
- test("captures: loadAllCaptures parses entries correctly", () => {
85
+ test("captures: loadAllCaptures parses entries correctly", (t) => {
90
86
  const tmp = makeTempDir("cap-load");
91
- try {
92
- appendCapture(tmp, "alpha");
93
- appendCapture(tmp, "beta");
94
-
95
- const all = loadAllCaptures(tmp);
96
- assert.strictEqual(all.length, 2, "should have 2 entries");
97
- assert.strictEqual(all[0].text, "alpha");
98
- assert.strictEqual(all[1].text, "beta");
99
- assert.strictEqual(all[0].status, "pending");
100
- assert.strictEqual(all[1].status, "pending");
101
- } finally {
102
- rmSync(tmp, { recursive: true, force: true });
103
- }
87
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
88
+
89
+ appendCapture(tmp, "alpha");
90
+ appendCapture(tmp, "beta");
91
+
92
+ const all = loadAllCaptures(tmp);
93
+ assert.strictEqual(all.length, 2, "should have 2 entries");
94
+ assert.strictEqual(all[0].text, "alpha");
95
+ assert.strictEqual(all[1].text, "beta");
96
+ assert.strictEqual(all[0].status, "pending");
97
+ assert.strictEqual(all[1].status, "pending");
104
98
  });
105
99
 
106
- test("captures: loadAllCaptures returns empty array when no file", () => {
100
+ test("captures: loadAllCaptures returns empty array when no file", (t) => {
107
101
  const tmp = makeTempDir("cap-nofile");
108
- try {
109
- const all = loadAllCaptures(tmp);
110
- assert.strictEqual(all.length, 0);
111
- } finally {
112
- rmSync(tmp, { recursive: true, force: true });
113
- }
102
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
103
+
104
+ const all = loadAllCaptures(tmp);
105
+ assert.strictEqual(all.length, 0);
114
106
  });
115
107
 
116
- test("captures: loadPendingCaptures filters resolved entries", () => {
108
+ test("captures: loadPendingCaptures filters resolved entries", (t) => {
117
109
  const tmp = makeTempDir("cap-pending");
118
- try {
119
- const id1 = appendCapture(tmp, "pending one");
120
- appendCapture(tmp, "pending two");
110
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
121
111
 
122
- markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
112
+ const id1 = appendCapture(tmp, "pending one");
113
+ appendCapture(tmp, "pending two");
123
114
 
124
- const pending = loadPendingCaptures(tmp);
125
- assert.strictEqual(pending.length, 1, "should have 1 pending");
126
- assert.strictEqual(pending[0].text, "pending two");
127
- } finally {
128
- rmSync(tmp, { recursive: true, force: true });
129
- }
115
+ markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
116
+
117
+ const pending = loadPendingCaptures(tmp);
118
+ assert.strictEqual(pending.length, 1, "should have 1 pending");
119
+ assert.strictEqual(pending[0].text, "pending two");
130
120
  });
131
121
 
132
- test("captures: loadAllCaptures preserves resolved entries", () => {
122
+ test("captures: loadAllCaptures preserves resolved entries", (t) => {
133
123
  const tmp = makeTempDir("cap-all-resolved");
134
- try {
135
- const id1 = appendCapture(tmp, "pending one");
136
- appendCapture(tmp, "pending two");
137
-
138
- markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
139
-
140
- const all = loadAllCaptures(tmp);
141
- assert.strictEqual(all.length, 2, "all should still have 2");
142
- assert.strictEqual(all[0].status, "resolved");
143
- assert.strictEqual(all[1].status, "pending");
144
- } finally {
145
- rmSync(tmp, { recursive: true, force: true });
146
- }
124
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
125
+
126
+ const id1 = appendCapture(tmp, "pending one");
127
+ appendCapture(tmp, "pending two");
128
+
129
+ markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
130
+
131
+ const all = loadAllCaptures(tmp);
132
+ assert.strictEqual(all.length, 2, "all should still have 2");
133
+ assert.strictEqual(all[0].status, "resolved");
134
+ assert.strictEqual(all[1].status, "pending");
147
135
  });
148
136
 
149
137
  // ─── hasPendingCaptures ───────────────────────────────────────────────────────
150
138
 
151
- test("captures: hasPendingCaptures returns false when no file", () => {
139
+ test("captures: hasPendingCaptures returns false when no file", (t) => {
152
140
  const tmp = makeTempDir("cap-has-nofile");
153
- try {
154
- assert.strictEqual(hasPendingCaptures(tmp), false);
155
- } finally {
156
- rmSync(tmp, { recursive: true, force: true });
157
- }
141
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
142
+
143
+ assert.strictEqual(hasPendingCaptures(tmp), false);
158
144
  });
159
145
 
160
- test("captures: hasPendingCaptures returns true with pending entries", () => {
146
+ test("captures: hasPendingCaptures returns true with pending entries", (t) => {
161
147
  const tmp = makeTempDir("cap-has-true");
162
- try {
163
- appendCapture(tmp, "something");
164
- assert.strictEqual(hasPendingCaptures(tmp), true);
165
- } finally {
166
- rmSync(tmp, { recursive: true, force: true });
167
- }
148
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
149
+
150
+ appendCapture(tmp, "something");
151
+ assert.strictEqual(hasPendingCaptures(tmp), true);
168
152
  });
169
153
 
170
- test("captures: hasPendingCaptures returns false when all resolved", () => {
154
+ test("captures: hasPendingCaptures returns false when all resolved", (t) => {
171
155
  const tmp = makeTempDir("cap-has-false");
172
- try {
173
- const id = appendCapture(tmp, "will resolve");
174
- markCaptureResolved(tmp, id, "note", "done", "resolved it");
175
- assert.strictEqual(hasPendingCaptures(tmp), false);
176
- } finally {
177
- rmSync(tmp, { recursive: true, force: true });
178
- }
156
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
157
+
158
+ const id = appendCapture(tmp, "will resolve");
159
+ markCaptureResolved(tmp, id, "note", "done", "resolved it");
160
+ assert.strictEqual(hasPendingCaptures(tmp), false);
179
161
  });
180
162
 
181
163
  // ─── markCaptureResolved ──────────────────────────────────────────────────────
182
164
 
183
- test("captures: markCaptureResolved updates entry in place", () => {
165
+ test("captures: markCaptureResolved updates entry in place", (t) => {
184
166
  const tmp = makeTempDir("cap-resolve");
185
- try {
186
- const id1 = appendCapture(tmp, "keep pending");
187
- const id2 = appendCapture(tmp, "will resolve");
188
- appendCapture(tmp, "also pending");
189
-
190
- markCaptureResolved(tmp, id2, "quick-task", "executed inline", "small fix");
191
-
192
- const all = loadAllCaptures(tmp);
193
- assert.strictEqual(all.length, 3, "should still have 3 entries");
194
-
195
- const resolved = all.find((c) => c.id === id2)!;
196
- assert.strictEqual(resolved.status, "resolved");
197
- assert.strictEqual(resolved.classification, "quick-task");
198
- assert.strictEqual(resolved.resolution, "executed inline");
199
- assert.strictEqual(resolved.rationale, "small fix");
200
- assert.ok(resolved.resolvedAt, "should have resolved timestamp");
201
-
202
- // Others should be unaffected
203
- const kept = all.find((c) => c.id === id1)!;
204
- assert.strictEqual(kept.status, "pending");
205
- assert.strictEqual(kept.classification, undefined);
206
- } finally {
207
- rmSync(tmp, { recursive: true, force: true });
208
- }
167
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
168
+
169
+ const id1 = appendCapture(tmp, "keep pending");
170
+ const id2 = appendCapture(tmp, "will resolve");
171
+ appendCapture(tmp, "also pending");
172
+
173
+ markCaptureResolved(tmp, id2, "quick-task", "executed inline", "small fix");
174
+
175
+ const all = loadAllCaptures(tmp);
176
+ assert.strictEqual(all.length, 3, "should still have 3 entries");
177
+
178
+ const resolved = all.find((c) => c.id === id2)!;
179
+ assert.strictEqual(resolved.status, "resolved");
180
+ assert.strictEqual(resolved.classification, "quick-task");
181
+ assert.strictEqual(resolved.resolution, "executed inline");
182
+ assert.strictEqual(resolved.rationale, "small fix");
183
+ assert.ok(resolved.resolvedAt, "should have resolved timestamp");
184
+
185
+ // Others should be unaffected
186
+ const kept = all.find((c) => c.id === id1)!;
187
+ assert.strictEqual(kept.status, "pending");
188
+ assert.strictEqual(kept.classification, undefined);
209
189
  });
210
190
 
211
191
  // ─── resolveCapturesPath ──────────────────────────────────────────────────────
@@ -371,58 +351,50 @@ test("triage: parseTriageOutput handles all five classification types", () => {
371
351
 
372
352
  // ─── Edge Cases ───────────────────────────────────────────────────────────────
373
353
 
374
- test("captures: appendCapture handles special characters in text", () => {
354
+ test("captures: appendCapture handles special characters in text", (t) => {
375
355
  const tmp = makeTempDir("cap-special");
376
- try {
377
- const id = appendCapture(tmp, 'text with "quotes" and **bold** and `code`');
378
- const all = loadAllCaptures(tmp);
379
- assert.strictEqual(all.length, 1);
380
- assert.ok(all[0].text.includes('"quotes"'), "should preserve quotes");
381
- assert.ok(all[0].text.includes("**bold**"), "should preserve bold");
382
- } finally {
383
- rmSync(tmp, { recursive: true, force: true });
384
- }
356
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
357
+
358
+ const id = appendCapture(tmp, 'text with "quotes" and **bold** and `code`');
359
+ const all = loadAllCaptures(tmp);
360
+ assert.strictEqual(all.length, 1);
361
+ assert.ok(all[0].text.includes('"quotes"'), "should preserve quotes");
362
+ assert.ok(all[0].text.includes("**bold**"), "should preserve bold");
385
363
  });
386
364
 
387
- test("captures: markCaptureResolved is no-op for non-existent ID", () => {
365
+ test("captures: markCaptureResolved is no-op for non-existent ID", (t) => {
388
366
  const tmp = makeTempDir("cap-noop");
389
- try {
390
- appendCapture(tmp, "real capture");
391
- // Should not throw
392
- markCaptureResolved(tmp, "CAP-nonexistent", "note", "test", "test");
393
- const all = loadAllCaptures(tmp);
394
- assert.strictEqual(all.length, 1);
395
- assert.strictEqual(all[0].status, "pending", "original should be unchanged");
396
- } finally {
397
- rmSync(tmp, { recursive: true, force: true });
398
- }
367
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
368
+
369
+ appendCapture(tmp, "real capture");
370
+ // Should not throw
371
+ markCaptureResolved(tmp, "CAP-nonexistent", "note", "test", "test");
372
+ const all = loadAllCaptures(tmp);
373
+ assert.strictEqual(all.length, 1);
374
+ assert.strictEqual(all[0].status, "pending", "original should be unchanged");
399
375
  });
400
376
 
401
- test("captures: markCaptureResolved is no-op when no file exists", () => {
377
+ test("captures: markCaptureResolved is no-op when no file exists", (t) => {
402
378
  const tmp = makeTempDir("cap-nofile-resolve");
403
- try {
404
- // Should not throw
405
- markCaptureResolved(tmp, "CAP-abc", "note", "test", "test");
406
- } finally {
407
- rmSync(tmp, { recursive: true, force: true });
408
- }
379
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
380
+
381
+ // Should not throw
382
+ markCaptureResolved(tmp, "CAP-abc", "note", "test", "test");
409
383
  });
410
384
 
411
- test("captures: re-resolving a capture overwrites previous resolution", () => {
385
+ test("captures: re-resolving a capture overwrites previous resolution", (t) => {
412
386
  const tmp = makeTempDir("cap-reresolve");
413
- try {
414
- const id = appendCapture(tmp, "will re-resolve");
415
- markCaptureResolved(tmp, id, "note", "first resolution", "first rationale");
416
- markCaptureResolved(tmp, id, "inject", "second resolution", "second rationale");
417
-
418
- const all = loadAllCaptures(tmp);
419
- assert.strictEqual(all.length, 1);
420
- assert.strictEqual(all[0].classification, "inject", "should have updated classification");
421
- assert.strictEqual(all[0].resolution, "second resolution");
422
- assert.strictEqual(all[0].rationale, "second rationale");
423
- } finally {
424
- rmSync(tmp, { recursive: true, force: true });
425
- }
387
+ t.after(() => rmSync(tmp, { recursive: true, force: true }));
388
+
389
+ const id = appendCapture(tmp, "will re-resolve");
390
+ markCaptureResolved(tmp, id, "note", "first resolution", "first rationale");
391
+ markCaptureResolved(tmp, id, "inject", "second resolution", "second rationale");
392
+
393
+ const all = loadAllCaptures(tmp);
394
+ assert.strictEqual(all.length, 1);
395
+ assert.strictEqual(all[0].classification, "inject", "should have updated classification");
396
+ assert.strictEqual(all[0].resolution, "second resolution");
397
+ assert.strictEqual(all[0].rationale, "second rationale");
426
398
  });
427
399
 
428
400
  test("triage: parseTriageOutput preserves affectedFiles and targetSlice", () => {
@@ -8,7 +8,6 @@
8
8
  * `/plugin marketplace add ...` source model.
9
9
  */
10
10
 
11
-
12
11
  import { describe, it, before, after, mock } from 'node:test';
13
12
  import assert from 'node:assert';
14
13
  import { existsSync, mkdtempSync, rmSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';
@@ -306,45 +305,45 @@ describe(
306
305
  });
307
306
  });
308
307
 
309
- it('should not persist marketplace agent directories into package sources', async () => {
308
+ it('should not persist marketplace agent directories into package sources', async (t) => {
310
309
  const isolatedAgentDir = join(tempDir, '.gsd', 'agent');
311
310
  const settingsPath = join(isolatedAgentDir, 'settings.json');
312
311
  rmSync(isolatedAgentDir, { recursive: true, force: true });
313
312
  process.env.GSD_CODING_AGENT_DIR = isolatedAgentDir;
314
313
 
315
- try {
316
- mkdirSync(isolatedAgentDir, { recursive: true });
317
- const tempSettings: Record<string, unknown> = { packages: [] };
318
- writeFileSync(settingsPath, JSON.stringify(tempSettings, null, 2));
319
-
320
- const { ctx } = createMockContext([
321
- 'Plugins only',
322
- 'Yes - discover plugins and select components',
323
- 'Import all components',
324
- 'Yes, continue',
325
- ]);
326
-
327
- const readPrefs = () => ({ ...prefs });
328
- const writePrefs = async (p: Record<string, unknown>) => {
329
- Object.assign(prefs, p);
330
- };
331
-
332
- await runClaudeImportFlow(ctx, 'global', readPrefs, writePrefs);
333
-
334
- const settings = JSON.parse(readFileSync(settingsPath, 'utf8')) as { packages?: unknown[] };
335
- const packageEntries = Array.isArray(settings.packages) ? settings.packages : [];
336
- const hasAgentsDirPackage = packageEntries.some((entry) => {
337
- const source = typeof entry === 'string'
338
- ? entry
339
- : (entry && typeof entry === 'object' ? (entry as { source?: unknown }).source : undefined);
340
- return typeof source === 'string' && source.endsWith('/agents');
341
- });
342
-
343
- assert.strictEqual(hasAgentsDirPackage, false, 'Marketplace agent directories should not be persisted as package sources');
344
- } finally {
314
+ t.after(() => {
345
315
  delete process.env.GSD_CODING_AGENT_DIR;
346
316
  rmSync(isolatedAgentDir, { recursive: true, force: true });
347
- }
317
+ });
318
+
319
+ mkdirSync(isolatedAgentDir, { recursive: true });
320
+ const tempSettings: Record<string, unknown> = { packages: [] };
321
+ writeFileSync(settingsPath, JSON.stringify(tempSettings, null, 2));
322
+
323
+ const { ctx } = createMockContext([
324
+ 'Plugins only',
325
+ 'Yes - discover plugins and select components',
326
+ 'Import all components',
327
+ 'Yes, continue',
328
+ ]);
329
+
330
+ const readPrefs = () => ({ ...prefs });
331
+ const writePrefs = async (p: Record<string, unknown>) => {
332
+ Object.assign(prefs, p);
333
+ };
334
+
335
+ await runClaudeImportFlow(ctx, 'global', readPrefs, writePrefs);
336
+
337
+ const settings = JSON.parse(readFileSync(settingsPath, 'utf8')) as { packages?: unknown[] };
338
+ const packageEntries = Array.isArray(settings.packages) ? settings.packages : [];
339
+ const hasAgentsDirPackage = packageEntries.some((entry) => {
340
+ const source = typeof entry === 'string'
341
+ ? entry
342
+ : (entry && typeof entry === 'object' ? (entry as { source?: unknown }).source : undefined);
343
+ return typeof source === 'string' && source.endsWith('/agents');
344
+ });
345
+
346
+ assert.strictEqual(hasAgentsDirPackage, false, 'Marketplace agent directories should not be persisted as package sources');
348
347
  });
349
348
  });
350
349
  }