gsd-pi 2.44.0-dev.848dd4c → 2.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +12 -30
  2. package/dist/resources/extensions/gsd/auto-start.js +0 -10
  3. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -5
  4. package/dist/web/standalone/.next/BUILD_ID +1 -1
  5. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  6. package/dist/web/standalone/.next/build-manifest.json +3 -3
  7. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  8. package/dist/web/standalone/.next/required-server-files.json +3 -3
  9. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  10. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  20. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  31. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  32. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  33. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  34. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  36. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  40. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  42. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  74. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  80. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  94. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  96. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  98. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  100. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/index.html +1 -1
  110. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  111. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  112. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  115. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  119. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  120. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  121. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware.js +2 -2
  123. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  129. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  130. package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +1 -0
  131. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  132. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  133. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  134. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  135. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  136. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  137. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  138. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  139. package/dist/web/standalone/server.js +1 -1
  140. package/package.json +1 -1
  141. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +8 -6
  142. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +26 -24
  144. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +48 -29
  146. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +44 -34
  148. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/session-manager.test.js +34 -30
  150. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +12 -10
  152. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  153. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +47 -43
  154. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  155. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  156. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  157. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +43 -31
  158. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +45 -40
  159. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  160. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  161. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  162. package/src/resources/extensions/gsd/auto-start.ts +0 -14
  163. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -8
  164. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  165. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +16 -14
  166. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +57 -43
  167. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +13 -11
  168. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +523 -465
  169. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +75 -73
  170. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +56 -34
  171. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +656 -533
  172. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +143 -165
  173. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +52 -29
  174. package/src/resources/extensions/gsd/tests/captures.test.ts +176 -148
  175. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +33 -32
  176. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +143 -141
  177. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  178. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  179. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +59 -38
  180. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +263 -228
  181. package/src/resources/extensions/gsd/tests/complete-task.test.ts +302 -250
  182. package/src/resources/extensions/gsd/tests/context-store.test.ts +367 -354
  183. package/src/resources/extensions/gsd/tests/continue-here.test.ts +72 -68
  184. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +106 -92
  185. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +35 -27
  186. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +237 -220
  187. package/src/resources/extensions/gsd/tests/db-writer.test.ts +420 -390
  188. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +92 -76
  189. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +83 -68
  190. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -152
  191. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +101 -78
  192. package/src/resources/extensions/gsd/tests/derive-state.test.ts +227 -192
  193. package/src/resources/extensions/gsd/tests/detection.test.ts +278 -232
  194. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +34 -30
  195. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +180 -164
  196. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +49 -43
  197. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +32 -28
  198. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +29 -27
  199. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +38 -34
  200. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +75 -54
  201. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +32 -21
  202. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +97 -72
  203. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +44 -38
  204. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +145 -104
  205. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +106 -84
  206. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +60 -54
  207. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +93 -72
  208. package/src/resources/extensions/gsd/tests/doctor.test.ts +134 -104
  209. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +131 -123
  210. package/src/resources/extensions/gsd/tests/exit-command.test.ts +24 -20
  211. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +57 -48
  212. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +7 -5
  213. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +42 -30
  214. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +206 -198
  215. package/src/resources/extensions/gsd/tests/git-locale.test.ts +27 -13
  216. package/src/resources/extensions/gsd/tests/git-service.test.ts +388 -285
  217. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +39 -31
  218. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +69 -63
  219. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +264 -255
  220. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +119 -108
  221. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +103 -81
  222. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +262 -229
  223. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  224. package/src/resources/extensions/gsd/tests/health-widget.test.ts +37 -29
  225. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +102 -81
  226. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +18 -16
  227. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +46 -41
  228. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +53 -42
  229. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +91 -75
  230. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  231. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +194 -150
  232. package/src/resources/extensions/gsd/tests/md-importer.test.ts +125 -101
  233. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +54 -45
  234. package/src/resources/extensions/gsd/tests/memory-store.test.ts +93 -80
  235. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +66 -57
  236. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +93 -83
  237. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +170 -161
  238. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +141 -125
  239. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +131 -107
  240. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +96 -87
  241. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +164 -125
  242. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +94 -81
  243. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +36 -35
  244. package/src/resources/extensions/gsd/tests/overrides.test.ts +106 -99
  245. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +47 -40
  246. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +28 -25
  247. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +83 -66
  248. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +77 -54
  249. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +115 -68
  250. package/src/resources/extensions/gsd/tests/parsers.test.ts +611 -546
  251. package/src/resources/extensions/gsd/tests/paths.test.ts +87 -72
  252. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +117 -77
  253. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  254. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +119 -93
  255. package/src/resources/extensions/gsd/tests/queue-order.test.ts +82 -70
  256. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +55 -42
  257. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +73 -45
  258. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +38 -28
  259. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +80 -73
  260. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +74 -71
  261. package/src/resources/extensions/gsd/tests/requirements.test.ts +75 -70
  262. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +66 -44
  263. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +181 -114
  264. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +65 -63
  265. package/src/resources/extensions/gsd/tests/run-uat.test.ts +128 -66
  266. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +25 -18
  267. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +44 -37
  268. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +26 -19
  269. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +8 -6
  270. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +28 -22
  271. package/src/resources/extensions/gsd/tests/token-savings.test.ts +56 -54
  272. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +25 -23
  273. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -9
  274. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +82 -66
  275. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +47 -46
  276. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +22 -20
  277. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +86 -84
  278. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +43 -41
  279. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +96 -94
  280. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +13 -11
  281. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +29 -27
  282. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +52 -50
  283. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +13 -10
  284. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +18 -14
  285. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +39 -38
  286. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +21 -17
  287. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +30 -25
  288. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +37 -30
  289. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +22 -15
  290. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +66 -59
  291. package/src/resources/extensions/gsd/tests/worktree.test.ts +50 -44
  292. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
  293. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  294. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  295. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
  296. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -63
  297. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_buildManifest.js +0 -0
  298. /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_ssgManifest.js +0 -0
@@ -36,156 +36,176 @@ function makeTempDir(prefix: string): string {
36
36
 
37
37
  // ─── appendCapture ────────────────────────────────────────────────────────────
38
38
 
39
- test("captures: appendCapture creates CAPTURES.md on first call", (t) => {
39
+ test("captures: appendCapture creates CAPTURES.md on first call", () => {
40
40
  const tmp = makeTempDir("cap-create");
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
- );
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
+ }
60
62
  });
61
63
 
62
- test("captures: appendCapture appends to existing file", (t) => {
64
+ test("captures: appendCapture appends to existing file", () => {
63
65
  const tmp = makeTempDir("cap-append");
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
- );
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
+ }
81
85
  });
82
86
 
83
87
  // ─── loadAllCaptures / loadPendingCaptures ────────────────────────────────────
84
88
 
85
- test("captures: loadAllCaptures parses entries correctly", (t) => {
89
+ test("captures: loadAllCaptures parses entries correctly", () => {
86
90
  const tmp = makeTempDir("cap-load");
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");
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
+ }
98
104
  });
99
105
 
100
- test("captures: loadAllCaptures returns empty array when no file", (t) => {
106
+ test("captures: loadAllCaptures returns empty array when no file", () => {
101
107
  const tmp = makeTempDir("cap-nofile");
102
- t.after(() => rmSync(tmp, { recursive: true, force: true }));
103
-
104
- const all = loadAllCaptures(tmp);
105
- assert.strictEqual(all.length, 0);
108
+ try {
109
+ const all = loadAllCaptures(tmp);
110
+ assert.strictEqual(all.length, 0);
111
+ } finally {
112
+ rmSync(tmp, { recursive: true, force: true });
113
+ }
106
114
  });
107
115
 
108
- test("captures: loadPendingCaptures filters resolved entries", (t) => {
116
+ test("captures: loadPendingCaptures filters resolved entries", () => {
109
117
  const tmp = makeTempDir("cap-pending");
110
- t.after(() => rmSync(tmp, { recursive: true, force: true }));
111
-
112
- const id1 = appendCapture(tmp, "pending one");
113
- appendCapture(tmp, "pending two");
118
+ try {
119
+ const id1 = appendCapture(tmp, "pending one");
120
+ appendCapture(tmp, "pending two");
114
121
 
115
- markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
122
+ markCaptureResolved(tmp, id1, "note", "acknowledged", "just a note");
116
123
 
117
- const pending = loadPendingCaptures(tmp);
118
- assert.strictEqual(pending.length, 1, "should have 1 pending");
119
- assert.strictEqual(pending[0].text, "pending two");
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
+ }
120
130
  });
121
131
 
122
- test("captures: loadAllCaptures preserves resolved entries", (t) => {
132
+ test("captures: loadAllCaptures preserves resolved entries", () => {
123
133
  const tmp = makeTempDir("cap-all-resolved");
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");
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
+ }
135
147
  });
136
148
 
137
149
  // ─── hasPendingCaptures ───────────────────────────────────────────────────────
138
150
 
139
- test("captures: hasPendingCaptures returns false when no file", (t) => {
151
+ test("captures: hasPendingCaptures returns false when no file", () => {
140
152
  const tmp = makeTempDir("cap-has-nofile");
141
- t.after(() => rmSync(tmp, { recursive: true, force: true }));
142
-
143
- assert.strictEqual(hasPendingCaptures(tmp), false);
153
+ try {
154
+ assert.strictEqual(hasPendingCaptures(tmp), false);
155
+ } finally {
156
+ rmSync(tmp, { recursive: true, force: true });
157
+ }
144
158
  });
145
159
 
146
- test("captures: hasPendingCaptures returns true with pending entries", (t) => {
160
+ test("captures: hasPendingCaptures returns true with pending entries", () => {
147
161
  const tmp = makeTempDir("cap-has-true");
148
- t.after(() => rmSync(tmp, { recursive: true, force: true }));
149
-
150
- appendCapture(tmp, "something");
151
- assert.strictEqual(hasPendingCaptures(tmp), true);
162
+ try {
163
+ appendCapture(tmp, "something");
164
+ assert.strictEqual(hasPendingCaptures(tmp), true);
165
+ } finally {
166
+ rmSync(tmp, { recursive: true, force: true });
167
+ }
152
168
  });
153
169
 
154
- test("captures: hasPendingCaptures returns false when all resolved", (t) => {
170
+ test("captures: hasPendingCaptures returns false when all resolved", () => {
155
171
  const tmp = makeTempDir("cap-has-false");
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);
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
+ }
161
179
  });
162
180
 
163
181
  // ─── markCaptureResolved ──────────────────────────────────────────────────────
164
182
 
165
- test("captures: markCaptureResolved updates entry in place", (t) => {
183
+ test("captures: markCaptureResolved updates entry in place", () => {
166
184
  const tmp = makeTempDir("cap-resolve");
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);
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
+ }
189
209
  });
190
210
 
191
211
  // ─── resolveCapturesPath ──────────────────────────────────────────────────────
@@ -351,50 +371,58 @@ test("triage: parseTriageOutput handles all five classification types", () => {
351
371
 
352
372
  // ─── Edge Cases ───────────────────────────────────────────────────────────────
353
373
 
354
- test("captures: appendCapture handles special characters in text", (t) => {
374
+ test("captures: appendCapture handles special characters in text", () => {
355
375
  const tmp = makeTempDir("cap-special");
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");
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
+ }
363
385
  });
364
386
 
365
- test("captures: markCaptureResolved is no-op for non-existent ID", (t) => {
387
+ test("captures: markCaptureResolved is no-op for non-existent ID", () => {
366
388
  const tmp = makeTempDir("cap-noop");
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");
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
+ }
375
399
  });
376
400
 
377
- test("captures: markCaptureResolved is no-op when no file exists", (t) => {
401
+ test("captures: markCaptureResolved is no-op when no file exists", () => {
378
402
  const tmp = makeTempDir("cap-nofile-resolve");
379
- t.after(() => rmSync(tmp, { recursive: true, force: true }));
380
-
381
- // Should not throw
382
- markCaptureResolved(tmp, "CAP-abc", "note", "test", "test");
403
+ try {
404
+ // Should not throw
405
+ markCaptureResolved(tmp, "CAP-abc", "note", "test", "test");
406
+ } finally {
407
+ rmSync(tmp, { recursive: true, force: true });
408
+ }
383
409
  });
384
410
 
385
- test("captures: re-resolving a capture overwrites previous resolution", (t) => {
411
+ test("captures: re-resolving a capture overwrites previous resolution", () => {
386
412
  const tmp = makeTempDir("cap-reresolve");
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");
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
+ }
398
426
  });
399
427
 
400
428
  test("triage: parseTriageOutput preserves affectedFiles and targetSlice", () => {
@@ -8,6 +8,7 @@
8
8
  * `/plugin marketplace add ...` source model.
9
9
  */
10
10
 
11
+
11
12
  import { describe, it, before, after, mock } from 'node:test';
12
13
  import assert from 'node:assert';
13
14
  import { existsSync, mkdtempSync, rmSync, writeFileSync, readFileSync, mkdirSync } from 'node:fs';
@@ -305,45 +306,45 @@ describe(
305
306
  });
306
307
  });
307
308
 
308
- it('should not persist marketplace agent directories into package sources', async (t) => {
309
+ it('should not persist marketplace agent directories into package sources', async () => {
309
310
  const isolatedAgentDir = join(tempDir, '.gsd', 'agent');
310
311
  const settingsPath = join(isolatedAgentDir, 'settings.json');
311
312
  rmSync(isolatedAgentDir, { recursive: true, force: true });
312
313
  process.env.GSD_CODING_AGENT_DIR = isolatedAgentDir;
313
314
 
314
- t.after(() => {
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 {
315
345
  delete process.env.GSD_CODING_AGENT_DIR;
316
346
  rmSync(isolatedAgentDir, { recursive: true, force: true });
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');
347
+ }
347
348
  });
348
349
  });
349
350
  }