agents-inc 0.152.1 → 0.154.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 (442) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +31 -35
  3. package/dist/{chunk-FVDKAVOL.js → chunk-2IMYK4WN.js} +18 -51
  4. package/dist/chunk-2IMYK4WN.js.map +1 -0
  5. package/dist/{chunk-PMM2MYMA.js → chunk-4VCWL2IG.js} +649 -357
  6. package/dist/chunk-4VCWL2IG.js.map +1 -0
  7. package/dist/{chunk-PZIZNMHK.js → chunk-5MFJ24VM.js} +237 -150
  8. package/dist/chunk-5MFJ24VM.js.map +1 -0
  9. package/dist/{chunk-KXYVJGJP.js → chunk-6CNRMCFM.js} +3 -2
  10. package/dist/{chunk-KXYVJGJP.js.map → chunk-6CNRMCFM.js.map} +1 -1
  11. package/dist/chunk-7VZV4O6B.js +40 -0
  12. package/dist/chunk-7VZV4O6B.js.map +1 -0
  13. package/dist/{chunk-SX5H6TSC.js → chunk-AKQ5QISO.js} +11 -8
  14. package/dist/chunk-AKQ5QISO.js.map +1 -0
  15. package/dist/{chunk-BNSRA6HL.js → chunk-AURY6RT6.js} +39 -176
  16. package/dist/chunk-AURY6RT6.js.map +1 -0
  17. package/dist/{chunk-LZ52XEPR.js → chunk-B66SC72V.js} +7 -6
  18. package/dist/chunk-B66SC72V.js.map +1 -0
  19. package/dist/{chunk-LASI35KT.js → chunk-BZ4CZBOM.js} +14 -28
  20. package/dist/chunk-BZ4CZBOM.js.map +1 -0
  21. package/dist/chunk-CBF4ZYV3.js +18540 -0
  22. package/dist/chunk-CBF4ZYV3.js.map +1 -0
  23. package/dist/{chunk-5GUOIJSG.js → chunk-CHNA5RVS.js} +3 -15
  24. package/dist/chunk-CHNA5RVS.js.map +1 -0
  25. package/dist/{chunk-LDP5ASDM.js → chunk-DRKSYJZ2.js} +2 -19
  26. package/dist/chunk-DRKSYJZ2.js.map +1 -0
  27. package/dist/chunk-FMYHWKGG.js +325 -0
  28. package/dist/chunk-FMYHWKGG.js.map +1 -0
  29. package/dist/{chunk-SKQWRUPX.js → chunk-GUDGCFSF.js} +59 -33
  30. package/dist/chunk-GUDGCFSF.js.map +1 -0
  31. package/dist/{chunk-WKTHWQKM.js → chunk-IPJOMAWC.js} +5070 -6305
  32. package/dist/chunk-IPJOMAWC.js.map +1 -0
  33. package/dist/chunk-IXEDSKMH.js +48 -0
  34. package/dist/chunk-IXEDSKMH.js.map +1 -0
  35. package/dist/{chunk-TUPYW2IQ.js → chunk-JC7DBPRD.js} +9 -12
  36. package/dist/chunk-JC7DBPRD.js.map +1 -0
  37. package/dist/{chunk-ZL7PFNHN.js → chunk-K3O3YQYG.js} +2 -2
  38. package/dist/{chunk-QRDTLVXG.js → chunk-LA3JPESW.js} +9 -22
  39. package/dist/chunk-LA3JPESW.js.map +1 -0
  40. package/dist/{chunk-MWG4VU64.js → chunk-MJFIO5SX.js} +50 -74
  41. package/dist/chunk-MJFIO5SX.js.map +1 -0
  42. package/dist/{chunk-L7SZXUBJ.js → chunk-NFH6SA62.js} +7 -6
  43. package/dist/{chunk-L7SZXUBJ.js.map → chunk-NFH6SA62.js.map} +1 -1
  44. package/dist/{chunk-GRVKW3CC.js → chunk-NKCY2ULI.js} +3 -2
  45. package/dist/{chunk-GRVKW3CC.js.map → chunk-NKCY2ULI.js.map} +1 -1
  46. package/dist/{chunk-TJJPWUMA.js → chunk-NSJ2S7R5.js} +3 -2
  47. package/dist/{chunk-TJJPWUMA.js.map → chunk-NSJ2S7R5.js.map} +1 -1
  48. package/dist/{chunk-Q2KG7UV3.js → chunk-OJJLYHM3.js} +2 -1
  49. package/dist/{chunk-Q2KG7UV3.js.map → chunk-OJJLYHM3.js.map} +1 -1
  50. package/dist/{chunk-MJ2KHG24.js → chunk-ONWEOS77.js} +6 -6
  51. package/dist/{chunk-MJ2KHG24.js.map → chunk-ONWEOS77.js.map} +1 -1
  52. package/dist/{chunk-NR3OZGL4.js → chunk-OZXAJNLA.js} +2 -1
  53. package/dist/{chunk-NR3OZGL4.js.map → chunk-OZXAJNLA.js.map} +1 -1
  54. package/dist/{chunk-QZZJFYUQ.js → chunk-PRJD5MMQ.js} +3 -3
  55. package/dist/chunk-PRJD5MMQ.js.map +1 -0
  56. package/dist/{chunk-MM7CTTAV.js → chunk-Q5FLW4JG.js} +2 -2
  57. package/dist/{chunk-MM7CTTAV.js.map → chunk-Q5FLW4JG.js.map} +1 -1
  58. package/dist/{chunk-5UWKOOIS.js → chunk-QQTYMW7N.js} +131 -209
  59. package/dist/chunk-QQTYMW7N.js.map +1 -0
  60. package/dist/{chunk-MVR3SYMN.js → chunk-QUDQTO3O.js} +4 -3
  61. package/dist/{chunk-MVR3SYMN.js.map → chunk-QUDQTO3O.js.map} +1 -1
  62. package/dist/{chunk-76ADG7LQ.js → chunk-R54KIGN2.js} +8 -22
  63. package/dist/chunk-R54KIGN2.js.map +1 -0
  64. package/dist/{chunk-XHUODHZ4.js → chunk-R7JV22QK.js} +22 -49
  65. package/dist/chunk-R7JV22QK.js.map +1 -0
  66. package/dist/{chunk-E5X6RJ4E.js → chunk-TUQF577Z.js} +56 -53
  67. package/dist/chunk-TUQF577Z.js.map +1 -0
  68. package/dist/{chunk-IHUY4M22.js → chunk-UW44KSYL.js} +4 -4
  69. package/dist/{chunk-DTSG5XZB.js → chunk-V3ENMW7G.js} +3 -3
  70. package/dist/chunk-VZRO7RYT.js +3694 -0
  71. package/dist/chunk-VZRO7RYT.js.map +1 -0
  72. package/dist/{chunk-MQ7FLIYS.js → chunk-WRRP47PY.js} +3 -2
  73. package/dist/{chunk-MQ7FLIYS.js.map → chunk-WRRP47PY.js.map} +1 -1
  74. package/dist/{chunk-RNJWAKMO.js → chunk-XGMOXMS4.js} +9 -8
  75. package/dist/chunk-XGMOXMS4.js.map +1 -0
  76. package/dist/{chunk-STMHDOZD.js → chunk-XMEIVWAS.js} +12 -9
  77. package/dist/chunk-XMEIVWAS.js.map +1 -0
  78. package/dist/{chunk-IUQBOCSU.js → chunk-ZBPEFQ4G.js} +2 -1
  79. package/dist/{chunk-IUQBOCSU.js.map → chunk-ZBPEFQ4G.js.map} +1 -1
  80. package/dist/chunk-ZU6DAR4S.js +223 -0
  81. package/dist/chunk-ZU6DAR4S.js.map +1 -0
  82. package/dist/commands/build/marketplace.js +115 -35
  83. package/dist/commands/build/marketplace.js.map +1 -1
  84. package/dist/commands/build/plugins.js +9 -10
  85. package/dist/commands/build/plugins.js.map +1 -1
  86. package/dist/commands/compile.js +135 -70
  87. package/dist/commands/compile.js.map +1 -1
  88. package/dist/commands/doctor.js +793 -64
  89. package/dist/commands/doctor.js.map +1 -1
  90. package/dist/commands/edit.js +231 -236
  91. package/dist/commands/edit.js.map +1 -1
  92. package/dist/commands/eject.js +24 -39
  93. package/dist/commands/eject.js.map +1 -1
  94. package/dist/commands/init.js +41 -46
  95. package/dist/commands/list.js +10 -12
  96. package/dist/commands/list.js.map +1 -1
  97. package/dist/commands/search.js +35 -88
  98. package/dist/commands/search.js.map +1 -1
  99. package/dist/commands/uninstall.js +212 -167
  100. package/dist/commands/uninstall.js.map +1 -1
  101. package/dist/commands/update.js +82 -332
  102. package/dist/commands/update.js.map +1 -1
  103. package/dist/components/common/confirm.js +1 -1
  104. package/dist/components/common/prompt-confirm.js +1 -1
  105. package/dist/components/common/select-list.js +2 -2
  106. package/dist/components/common/spinner.js +1 -1
  107. package/dist/components/wizard/category-grid.js +5 -6
  108. package/dist/components/wizard/checkbox-grid.js +5 -6
  109. package/dist/components/wizard/domain-selection.js +12 -13
  110. package/dist/components/wizard/run-wizard-session.js +30 -36
  111. package/dist/components/wizard/scroll-affordance.js +2 -2
  112. package/dist/components/wizard/skill-agent-summary.js +7 -7
  113. package/dist/components/wizard/source-grid.js +6 -11
  114. package/dist/components/wizard/stack-selection.js +9 -9
  115. package/dist/components/wizard/step-agents.js +12 -12
  116. package/dist/components/wizard/step-build.js +10 -11
  117. package/dist/components/wizard/step-confirm.js +11 -11
  118. package/dist/components/wizard/step-sources.js +11 -17
  119. package/dist/components/wizard/step-stack.js +10 -10
  120. package/dist/components/wizard/summary-panel.js +10 -10
  121. package/dist/components/wizard/toast.js +2 -2
  122. package/dist/components/wizard/wizard-layout.js +15 -16
  123. package/dist/components/wizard/wizard-tabs.js +6 -12
  124. package/dist/components/wizard/wizard.js +29 -35
  125. package/dist/config-exports.js +1 -1
  126. package/dist/copy-local-skills-WVHJFRPK.js +14 -0
  127. package/dist/hooks/init.js +49 -48
  128. package/dist/hooks/init.js.map +1 -1
  129. package/dist/index.js +3 -1
  130. package/dist/index.js.map +1 -1
  131. package/dist/load-agent-defs-5OT54J5M.js +15 -0
  132. package/dist/{loader-5JP4S7CJ.js → loader-JIZDTR4G.js} +7 -5
  133. package/dist/recompile-project-agents-VREEPBDV.js +20 -0
  134. package/dist/{source-loader-MZYCPL2S.js → source-loader-OE6EJFPU.js} +6 -6
  135. package/dist/src/agents/developer/ai-developer/identity.md +4 -4
  136. package/dist/src/agents/developer/ai-developer/playbook.md +1 -1
  137. package/dist/src/agents/developer/api-developer/identity.md +4 -4
  138. package/dist/src/agents/developer/api-developer/metadata.yaml +1 -1
  139. package/dist/src/agents/developer/cli-developer/identity.md +4 -4
  140. package/dist/src/agents/developer/web-developer/identity.md +2 -2
  141. package/dist/src/agents/developer/web-developer/metadata.yaml +1 -1
  142. package/dist/src/agents/meta/agent-summoner/identity.md +4 -5
  143. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  144. package/dist/src/agents/meta/agent-summoner/playbook.md +15 -16
  145. package/dist/src/agents/meta/codex-keeper/identity.md +4 -4
  146. package/dist/src/agents/meta/codex-keeper/playbook.md +1 -1
  147. package/dist/src/agents/meta/convention-keeper/identity.md +1 -1
  148. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +0 -34
  149. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +27 -3
  150. package/dist/src/agents/meta/skill-summoner/identity.md +2 -2
  151. package/{src/agents/planning/web-pm → dist/src/agents/planning/pm}/critical-reminders.md +10 -7
  152. package/dist/src/agents/planning/{web-pm → pm}/critical-requirements.md +8 -4
  153. package/dist/src/agents/planning/pm/identity.md +47 -0
  154. package/dist/src/agents/planning/pm/metadata.yaml +12 -0
  155. package/dist/src/agents/planning/{web-pm → pm}/output.md +7 -90
  156. package/dist/src/agents/planning/pm/playbook.md +185 -0
  157. package/dist/src/agents/researcher/ai-researcher/critical-reminders.md +58 -0
  158. package/dist/src/agents/researcher/ai-researcher/critical-requirements.md +40 -0
  159. package/dist/src/agents/researcher/ai-researcher/identity.md +86 -0
  160. package/dist/src/agents/researcher/ai-researcher/metadata.yaml +10 -0
  161. package/dist/src/agents/researcher/ai-researcher/output.md +363 -0
  162. package/dist/src/agents/researcher/ai-researcher/playbook.md +545 -0
  163. package/dist/src/agents/researcher/api-researcher/critical-reminders.md +16 -0
  164. package/dist/src/agents/researcher/api-researcher/identity.md +7 -7
  165. package/dist/src/agents/researcher/cli-researcher/critical-reminders.md +50 -0
  166. package/dist/src/agents/researcher/cli-researcher/critical-requirements.md +36 -0
  167. package/dist/src/agents/researcher/cli-researcher/identity.md +87 -0
  168. package/dist/src/agents/researcher/cli-researcher/metadata.yaml +10 -0
  169. package/dist/src/agents/researcher/cli-researcher/output.md +343 -0
  170. package/dist/src/agents/researcher/cli-researcher/playbook.md +370 -0
  171. package/dist/src/agents/researcher/web-researcher/identity.md +5 -6
  172. package/dist/src/agents/reviewer/reviewer/critical-reminders.md +29 -0
  173. package/dist/src/agents/reviewer/reviewer/critical-requirements.md +31 -0
  174. package/dist/src/agents/reviewer/reviewer/identity.md +41 -0
  175. package/dist/src/agents/reviewer/reviewer/metadata.yaml +12 -0
  176. package/dist/src/agents/reviewer/reviewer/output.md +202 -0
  177. package/dist/src/agents/reviewer/reviewer/playbook.md +141 -0
  178. package/dist/src/agents/tester/ai-tester/critical-reminders.md +48 -0
  179. package/dist/src/agents/tester/ai-tester/critical-requirements.md +49 -0
  180. package/dist/src/agents/tester/ai-tester/identity.md +62 -0
  181. package/dist/src/agents/tester/ai-tester/metadata.yaml +12 -0
  182. package/dist/src/agents/tester/ai-tester/output.md +375 -0
  183. package/dist/src/agents/tester/ai-tester/playbook.md +789 -0
  184. package/dist/src/agents/tester/api-tester/identity.md +3 -3
  185. package/dist/src/agents/tester/cli-tester/critical-reminders.md +3 -3
  186. package/dist/src/agents/tester/cli-tester/critical-requirements.md +2 -2
  187. package/dist/src/agents/tester/cli-tester/identity.md +3 -3
  188. package/dist/src/agents/tester/cli-tester/output.md +4 -4
  189. package/dist/src/agents/tester/cli-tester/playbook.md +3 -3
  190. package/dist/src/agents/tester/web-tester/identity.md +3 -3
  191. package/dist/stores/wizard-store.js +8 -6
  192. package/package.json +13 -2
  193. package/src/agents/developer/ai-developer/identity.md +4 -4
  194. package/src/agents/developer/ai-developer/playbook.md +1 -1
  195. package/src/agents/developer/api-developer/identity.md +4 -4
  196. package/src/agents/developer/api-developer/metadata.yaml +1 -1
  197. package/src/agents/developer/cli-developer/identity.md +4 -4
  198. package/src/agents/developer/web-developer/identity.md +2 -2
  199. package/src/agents/developer/web-developer/metadata.yaml +1 -1
  200. package/src/agents/meta/agent-summoner/identity.md +4 -5
  201. package/src/agents/meta/agent-summoner/output.md +2 -2
  202. package/src/agents/meta/agent-summoner/playbook.md +15 -16
  203. package/src/agents/meta/codex-keeper/identity.md +4 -4
  204. package/src/agents/meta/codex-keeper/playbook.md +1 -1
  205. package/src/agents/meta/convention-keeper/identity.md +1 -1
  206. package/src/agents/meta/skill-summoner/critical-reminders.md +0 -34
  207. package/src/agents/meta/skill-summoner/critical-requirements.md +27 -3
  208. package/src/agents/meta/skill-summoner/identity.md +2 -2
  209. package/{dist/src/agents/planning/web-pm → src/agents/planning/pm}/critical-reminders.md +10 -7
  210. package/src/agents/planning/{web-pm → pm}/critical-requirements.md +8 -4
  211. package/src/agents/planning/pm/identity.md +47 -0
  212. package/src/agents/planning/pm/metadata.yaml +12 -0
  213. package/src/agents/planning/{web-pm → pm}/output.md +7 -90
  214. package/src/agents/planning/pm/playbook.md +185 -0
  215. package/src/agents/researcher/ai-researcher/critical-reminders.md +58 -0
  216. package/src/agents/researcher/ai-researcher/critical-requirements.md +40 -0
  217. package/src/agents/researcher/ai-researcher/identity.md +86 -0
  218. package/src/agents/researcher/ai-researcher/metadata.yaml +10 -0
  219. package/src/agents/researcher/ai-researcher/output.md +363 -0
  220. package/src/agents/researcher/ai-researcher/playbook.md +545 -0
  221. package/src/agents/researcher/api-researcher/critical-reminders.md +16 -0
  222. package/src/agents/researcher/api-researcher/identity.md +7 -7
  223. package/src/agents/researcher/cli-researcher/critical-reminders.md +50 -0
  224. package/src/agents/researcher/cli-researcher/critical-requirements.md +36 -0
  225. package/src/agents/researcher/cli-researcher/identity.md +87 -0
  226. package/src/agents/researcher/cli-researcher/metadata.yaml +10 -0
  227. package/src/agents/researcher/cli-researcher/output.md +343 -0
  228. package/src/agents/researcher/cli-researcher/playbook.md +370 -0
  229. package/src/agents/researcher/web-researcher/identity.md +5 -6
  230. package/src/agents/reviewer/reviewer/critical-reminders.md +29 -0
  231. package/src/agents/reviewer/reviewer/critical-requirements.md +31 -0
  232. package/src/agents/reviewer/reviewer/identity.md +41 -0
  233. package/src/agents/reviewer/reviewer/metadata.yaml +12 -0
  234. package/src/agents/reviewer/reviewer/output.md +202 -0
  235. package/src/agents/reviewer/reviewer/playbook.md +141 -0
  236. package/src/agents/tester/ai-tester/critical-reminders.md +48 -0
  237. package/src/agents/tester/ai-tester/critical-requirements.md +49 -0
  238. package/src/agents/tester/ai-tester/identity.md +62 -0
  239. package/src/agents/tester/ai-tester/metadata.yaml +12 -0
  240. package/src/agents/tester/ai-tester/output.md +375 -0
  241. package/src/agents/tester/ai-tester/playbook.md +789 -0
  242. package/src/agents/tester/api-tester/identity.md +3 -3
  243. package/src/agents/tester/cli-tester/critical-reminders.md +3 -3
  244. package/src/agents/tester/cli-tester/critical-requirements.md +2 -2
  245. package/src/agents/tester/cli-tester/identity.md +3 -3
  246. package/src/agents/tester/cli-tester/output.md +4 -4
  247. package/src/agents/tester/cli-tester/playbook.md +3 -3
  248. package/src/agents/tester/web-tester/identity.md +3 -3
  249. package/src/schemas/metadata.schema.json +31 -2
  250. package/src/schemas/plugin.schema.json +3 -0
  251. package/src/schemas/project-config.schema.json +61 -15
  252. package/src/schemas/project-source-config.schema.json +0 -47
  253. package/dist/chunk-5GUOIJSG.js.map +0 -1
  254. package/dist/chunk-5UWKOOIS.js.map +0 -1
  255. package/dist/chunk-76ADG7LQ.js.map +0 -1
  256. package/dist/chunk-BNSRA6HL.js.map +0 -1
  257. package/dist/chunk-E5X6RJ4E.js.map +0 -1
  258. package/dist/chunk-EEPELKOM.js +0 -5938
  259. package/dist/chunk-EEPELKOM.js.map +0 -1
  260. package/dist/chunk-F7T5AFFN.js +0 -20
  261. package/dist/chunk-F7T5AFFN.js.map +0 -1
  262. package/dist/chunk-FVDKAVOL.js.map +0 -1
  263. package/dist/chunk-KFB5CRXZ.js +0 -377
  264. package/dist/chunk-KFB5CRXZ.js.map +0 -1
  265. package/dist/chunk-KR65TPKC.js +0 -664
  266. package/dist/chunk-KR65TPKC.js.map +0 -1
  267. package/dist/chunk-LASI35KT.js.map +0 -1
  268. package/dist/chunk-LDP5ASDM.js.map +0 -1
  269. package/dist/chunk-LZ52XEPR.js.map +0 -1
  270. package/dist/chunk-M7HO7NBK.js +0 -88
  271. package/dist/chunk-M7HO7NBK.js.map +0 -1
  272. package/dist/chunk-MWG4VU64.js.map +0 -1
  273. package/dist/chunk-ODNDXQH2.js +0 -77
  274. package/dist/chunk-ODNDXQH2.js.map +0 -1
  275. package/dist/chunk-P44SXVH3.js +0 -80
  276. package/dist/chunk-P44SXVH3.js.map +0 -1
  277. package/dist/chunk-PMM2MYMA.js.map +0 -1
  278. package/dist/chunk-PZIZNMHK.js.map +0 -1
  279. package/dist/chunk-Q45ZU6HD.js +0 -37
  280. package/dist/chunk-Q45ZU6HD.js.map +0 -1
  281. package/dist/chunk-QRDTLVXG.js.map +0 -1
  282. package/dist/chunk-QZZJFYUQ.js.map +0 -1
  283. package/dist/chunk-R5NOI2LP.js +0 -170
  284. package/dist/chunk-R5NOI2LP.js.map +0 -1
  285. package/dist/chunk-RNJWAKMO.js.map +0 -1
  286. package/dist/chunk-SBHBBZKF.js +0 -284
  287. package/dist/chunk-SBHBBZKF.js.map +0 -1
  288. package/dist/chunk-SKQWRUPX.js.map +0 -1
  289. package/dist/chunk-STMHDOZD.js.map +0 -1
  290. package/dist/chunk-SX5H6TSC.js.map +0 -1
  291. package/dist/chunk-TUPYW2IQ.js.map +0 -1
  292. package/dist/chunk-UBEDZ4FD.js +0 -4198
  293. package/dist/chunk-UBEDZ4FD.js.map +0 -1
  294. package/dist/chunk-VY6MNOXL.js +0 -20
  295. package/dist/chunk-VY6MNOXL.js.map +0 -1
  296. package/dist/chunk-WBCPLH66.js +0 -42
  297. package/dist/chunk-WBCPLH66.js.map +0 -1
  298. package/dist/chunk-WKTHWQKM.js.map +0 -1
  299. package/dist/chunk-XHUODHZ4.js.map +0 -1
  300. package/dist/chunk-ZPPHXXAP.js +0 -252
  301. package/dist/chunk-ZPPHXXAP.js.map +0 -1
  302. package/dist/commands/import/skill.js +0 -344
  303. package/dist/commands/import/skill.js.map +0 -1
  304. package/dist/commands/new/agent.js +0 -300
  305. package/dist/commands/new/agent.js.map +0 -1
  306. package/dist/commands/new/marketplace.js +0 -310
  307. package/dist/commands/new/marketplace.js.map +0 -1
  308. package/dist/commands/new/skill.js +0 -26
  309. package/dist/commands/validate.js +0 -575
  310. package/dist/commands/validate.js.map +0 -1
  311. package/dist/components/wizard/search-modal.js +0 -13
  312. package/dist/components/wizard/selection-card.js +0 -9
  313. package/dist/components/wizard/step-settings.js +0 -18
  314. package/dist/copy-local-skills-6EMVN7RB.js +0 -14
  315. package/dist/load-agent-defs-BWOUVEAR.js +0 -15
  316. package/dist/load-agent-defs-BWOUVEAR.js.map +0 -1
  317. package/dist/loader-5JP4S7CJ.js.map +0 -1
  318. package/dist/recompile-project-agents-6DL45TDI.js +0 -19
  319. package/dist/recompile-project-agents-6DL45TDI.js.map +0 -1
  320. package/dist/source-loader-MZYCPL2S.js.map +0 -1
  321. package/dist/src/agents/developer/web-architecture/critical-reminders.md +0 -48
  322. package/dist/src/agents/developer/web-architecture/critical-requirements.md +0 -65
  323. package/dist/src/agents/developer/web-architecture/identity.md +0 -64
  324. package/dist/src/agents/developer/web-architecture/metadata.yaml +0 -12
  325. package/dist/src/agents/developer/web-architecture/output.md +0 -449
  326. package/dist/src/agents/developer/web-architecture/playbook.md +0 -481
  327. package/dist/src/agents/pattern/pattern-scout/critical-reminders.md +0 -71
  328. package/dist/src/agents/pattern/pattern-scout/critical-requirements.md +0 -31
  329. package/dist/src/agents/pattern/pattern-scout/identity.md +0 -25
  330. package/dist/src/agents/pattern/pattern-scout/metadata.yaml +0 -10
  331. package/dist/src/agents/pattern/pattern-scout/output.md +0 -290
  332. package/dist/src/agents/pattern/pattern-scout/playbook.md +0 -1806
  333. package/dist/src/agents/pattern/web-pattern-critique/critical-reminders.md +0 -30
  334. package/dist/src/agents/pattern/web-pattern-critique/critical-requirements.md +0 -28
  335. package/dist/src/agents/pattern/web-pattern-critique/identity.md +0 -41
  336. package/dist/src/agents/pattern/web-pattern-critique/metadata.yaml +0 -12
  337. package/dist/src/agents/pattern/web-pattern-critique/output.md +0 -314
  338. package/dist/src/agents/pattern/web-pattern-critique/playbook.md +0 -572
  339. package/dist/src/agents/planning/api-pm/critical-reminders.md +0 -48
  340. package/dist/src/agents/planning/api-pm/critical-requirements.md +0 -41
  341. package/dist/src/agents/planning/api-pm/identity.md +0 -39
  342. package/dist/src/agents/planning/api-pm/metadata.yaml +0 -12
  343. package/dist/src/agents/planning/api-pm/output.md +0 -475
  344. package/dist/src/agents/planning/api-pm/playbook.md +0 -129
  345. package/dist/src/agents/planning/web-pm/identity.md +0 -26
  346. package/dist/src/agents/planning/web-pm/metadata.yaml +0 -12
  347. package/dist/src/agents/planning/web-pm/playbook.md +0 -318
  348. package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +0 -40
  349. package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +0 -37
  350. package/dist/src/agents/reviewer/ai-reviewer/identity.md +0 -51
  351. package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +0 -10
  352. package/dist/src/agents/reviewer/ai-reviewer/output.md +0 -395
  353. package/dist/src/agents/reviewer/ai-reviewer/playbook.md +0 -90
  354. package/dist/src/agents/reviewer/api-reviewer/critical-reminders.md +0 -31
  355. package/dist/src/agents/reviewer/api-reviewer/critical-requirements.md +0 -27
  356. package/dist/src/agents/reviewer/api-reviewer/identity.md +0 -51
  357. package/dist/src/agents/reviewer/api-reviewer/metadata.yaml +0 -12
  358. package/dist/src/agents/reviewer/api-reviewer/output.md +0 -343
  359. package/dist/src/agents/reviewer/api-reviewer/playbook.md +0 -288
  360. package/dist/src/agents/reviewer/cli-reviewer/critical-reminders.md +0 -33
  361. package/dist/src/agents/reviewer/cli-reviewer/critical-requirements.md +0 -30
  362. package/dist/src/agents/reviewer/cli-reviewer/identity.md +0 -44
  363. package/dist/src/agents/reviewer/cli-reviewer/metadata.yaml +0 -12
  364. package/dist/src/agents/reviewer/cli-reviewer/output.md +0 -414
  365. package/dist/src/agents/reviewer/cli-reviewer/playbook.md +0 -218
  366. package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +0 -38
  367. package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +0 -38
  368. package/dist/src/agents/reviewer/infra-reviewer/identity.md +0 -53
  369. package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +0 -10
  370. package/dist/src/agents/reviewer/infra-reviewer/output.md +0 -364
  371. package/dist/src/agents/reviewer/infra-reviewer/playbook.md +0 -161
  372. package/dist/src/agents/reviewer/web-reviewer/critical-reminders.md +0 -31
  373. package/dist/src/agents/reviewer/web-reviewer/critical-requirements.md +0 -26
  374. package/dist/src/agents/reviewer/web-reviewer/identity.md +0 -40
  375. package/dist/src/agents/reviewer/web-reviewer/metadata.yaml +0 -12
  376. package/dist/src/agents/reviewer/web-reviewer/output.md +0 -333
  377. package/dist/src/agents/reviewer/web-reviewer/playbook.md +0 -156
  378. package/src/agents/developer/web-architecture/critical-reminders.md +0 -48
  379. package/src/agents/developer/web-architecture/critical-requirements.md +0 -65
  380. package/src/agents/developer/web-architecture/identity.md +0 -64
  381. package/src/agents/developer/web-architecture/metadata.yaml +0 -12
  382. package/src/agents/developer/web-architecture/output.md +0 -449
  383. package/src/agents/developer/web-architecture/playbook.md +0 -481
  384. package/src/agents/pattern/pattern-scout/critical-reminders.md +0 -71
  385. package/src/agents/pattern/pattern-scout/critical-requirements.md +0 -31
  386. package/src/agents/pattern/pattern-scout/identity.md +0 -25
  387. package/src/agents/pattern/pattern-scout/metadata.yaml +0 -10
  388. package/src/agents/pattern/pattern-scout/output.md +0 -290
  389. package/src/agents/pattern/pattern-scout/playbook.md +0 -1806
  390. package/src/agents/pattern/web-pattern-critique/critical-reminders.md +0 -30
  391. package/src/agents/pattern/web-pattern-critique/critical-requirements.md +0 -28
  392. package/src/agents/pattern/web-pattern-critique/identity.md +0 -41
  393. package/src/agents/pattern/web-pattern-critique/metadata.yaml +0 -12
  394. package/src/agents/pattern/web-pattern-critique/output.md +0 -314
  395. package/src/agents/pattern/web-pattern-critique/playbook.md +0 -572
  396. package/src/agents/planning/api-pm/critical-reminders.md +0 -48
  397. package/src/agents/planning/api-pm/critical-requirements.md +0 -41
  398. package/src/agents/planning/api-pm/identity.md +0 -39
  399. package/src/agents/planning/api-pm/metadata.yaml +0 -12
  400. package/src/agents/planning/api-pm/output.md +0 -475
  401. package/src/agents/planning/api-pm/playbook.md +0 -129
  402. package/src/agents/planning/web-pm/identity.md +0 -26
  403. package/src/agents/planning/web-pm/metadata.yaml +0 -12
  404. package/src/agents/planning/web-pm/playbook.md +0 -318
  405. package/src/agents/reviewer/ai-reviewer/critical-reminders.md +0 -40
  406. package/src/agents/reviewer/ai-reviewer/critical-requirements.md +0 -37
  407. package/src/agents/reviewer/ai-reviewer/identity.md +0 -51
  408. package/src/agents/reviewer/ai-reviewer/metadata.yaml +0 -10
  409. package/src/agents/reviewer/ai-reviewer/output.md +0 -395
  410. package/src/agents/reviewer/ai-reviewer/playbook.md +0 -90
  411. package/src/agents/reviewer/api-reviewer/critical-reminders.md +0 -31
  412. package/src/agents/reviewer/api-reviewer/critical-requirements.md +0 -27
  413. package/src/agents/reviewer/api-reviewer/identity.md +0 -51
  414. package/src/agents/reviewer/api-reviewer/metadata.yaml +0 -12
  415. package/src/agents/reviewer/api-reviewer/output.md +0 -343
  416. package/src/agents/reviewer/api-reviewer/playbook.md +0 -288
  417. package/src/agents/reviewer/cli-reviewer/critical-reminders.md +0 -33
  418. package/src/agents/reviewer/cli-reviewer/critical-requirements.md +0 -30
  419. package/src/agents/reviewer/cli-reviewer/identity.md +0 -44
  420. package/src/agents/reviewer/cli-reviewer/metadata.yaml +0 -12
  421. package/src/agents/reviewer/cli-reviewer/output.md +0 -414
  422. package/src/agents/reviewer/cli-reviewer/playbook.md +0 -218
  423. package/src/agents/reviewer/infra-reviewer/critical-reminders.md +0 -38
  424. package/src/agents/reviewer/infra-reviewer/critical-requirements.md +0 -38
  425. package/src/agents/reviewer/infra-reviewer/identity.md +0 -53
  426. package/src/agents/reviewer/infra-reviewer/metadata.yaml +0 -10
  427. package/src/agents/reviewer/infra-reviewer/output.md +0 -364
  428. package/src/agents/reviewer/infra-reviewer/playbook.md +0 -161
  429. package/src/agents/reviewer/web-reviewer/critical-reminders.md +0 -31
  430. package/src/agents/reviewer/web-reviewer/critical-requirements.md +0 -26
  431. package/src/agents/reviewer/web-reviewer/identity.md +0 -40
  432. package/src/agents/reviewer/web-reviewer/metadata.yaml +0 -12
  433. package/src/agents/reviewer/web-reviewer/output.md +0 -333
  434. package/src/agents/reviewer/web-reviewer/playbook.md +0 -156
  435. /package/dist/{chunk-ZL7PFNHN.js.map → chunk-K3O3YQYG.js.map} +0 -0
  436. /package/dist/{chunk-IHUY4M22.js.map → chunk-UW44KSYL.js.map} +0 -0
  437. /package/dist/{chunk-DTSG5XZB.js.map → chunk-V3ENMW7G.js.map} +0 -0
  438. /package/dist/{commands/new/skill.js.map → copy-local-skills-WVHJFRPK.js.map} +0 -0
  439. /package/dist/{components/wizard/search-modal.js.map → load-agent-defs-5OT54J5M.js.map} +0 -0
  440. /package/dist/{components/wizard/selection-card.js.map → loader-JIZDTR4G.js.map} +0 -0
  441. /package/dist/{components/wizard/step-settings.js.map → recompile-project-agents-VREEPBDV.js.map} +0 -0
  442. /package/dist/{copy-local-skills-6EMVN7RB.js.map → source-loader-OE6EJFPU.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\nimport { partition } from \"remeda\";\nimport path from \"path\";\nimport { readdir } from \"fs/promises\";\n\nimport { Flags } from \"@oclif/core\";\nimport { Box, Text, useApp } from \"ink\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { promptConfirm } from \"../components/common/prompt-confirm.js\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { directoryExists, fileExists, listDirectories, remove } from \"../utils/fs\";\nimport { listAgentMdFiles } from \"../lib/agents\";\nimport { claudePluginUninstallBestEffort, isClaudeCLIAvailable } from \"../utils/exec\";\nimport {\n listPluginNames,\n getProjectPluginsDir,\n buildMarketplacePluginRef,\n parseMarketplacePluginRef,\n toClaudePluginScope,\n} from \"../lib/plugins/index\";\nimport { readForkedFromMetadata } from \"../lib/skills/index\";\nimport { isHomeDirectory, resolveInstallPaths } from \"../lib/installation/index\";\nimport { lazyGateDeps, mutateGlobal, propagateGlobalRemoval } from \"../lib/config-gate/index.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { loadAgentDefs } from \"../lib/operations\";\nimport { ConfigLoadError, loadProjectConfigFromDir } from \"../lib/configuration/project-config\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_COLORS,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n STANDARD_FILES,\n} from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n SUCCESS_MESSAGES,\n INFO_MESSAGES,\n registeredProjectsUpdated,\n registeredProjectUpdateSkipped,\n registeredProjectsUpdateFailed,\n} from \"../utils/messages\";\nimport type { AgentDefinition, AgentName, MergedSkillsMatrix, ProjectConfig } from \"../types/index\";\n\n/** A grouped section of the uninstall removal plan (header label + item lines). */\ntype RemovalPlanSection = {\n label: string;\n items: string[];\n};\n\n/**\n * Pure builder for the uninstall removal plan. The single source of the section\n * labels and item strings shared by printRemovalPlan (plain text) and the\n * UninstallConfirm Ink component — each renderer only adds its own\n * indentation/styling, so the emitted strings stay byte-identical.\n */\nfunction buildRemovalPlan(target: UninstallTarget): RemovalPlanSection[] {\n const sections: RemovalPlanSection[] = [];\n\n if (target.hasPlugins) {\n sections.push({ label: \"Plugins:\", items: [...target.cliPluginNames] });\n }\n\n if (target.hasLocalSkills || target.hasLocalAgents) {\n const items: string[] = [];\n if (target.hasLocalSkills) items.push(`${target.skillsDir}/ (matching sources)`);\n if (target.hasLocalAgents) items.push(`${target.agentsDir}/ (CLI-compiled)`);\n sections.push({ label: \"CLI-managed files:\", items });\n }\n\n // The CLI config manifest (config.ts + config-types.ts) is always removed.\n if (target.hasClaudeSrcConfig || target.hasClaudeSrcConfigTypes) {\n const items: string[] = [];\n if (target.hasClaudeSrcConfig) {\n items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TS}`);\n }\n if (target.hasClaudeSrcConfigTypes) {\n items.push(`${target.claudeSrcDir}/${STANDARD_FILES.CONFIG_TYPES_TS}`);\n }\n sections.push({ label: \"Config:\", items });\n }\n\n return sections;\n}\n\ntype UninstallConfirmProps = {\n target: UninstallTarget;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({ target, onConfirm, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>The following will be removed:</Text>\n <Text> </Text>\n\n {buildRemovalPlan(target).map((section) => (\n <Box key={section.label} flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> {section.label}</Text>\n {section.items.map((item) => (\n <Text key={item} dimColor>\n {\" \"}\n {item}\n </Text>\n ))}\n </Box>\n ))}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, plugins, and the .claude-src/ config manifest (config.ts + config-types.ts). User-created content is preserved.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.printHeader();\n\n const target = await detectUninstallTarget(projectDir, (reason) =>\n this.warn(\n `Could not read the project config — plugins and compiled agents it lists may be left behind: ${reason}`,\n ),\n );\n if (!hasAnythingToRemove(target)) {\n this.reportNothingToUninstall();\n return;\n }\n\n const confirmed = flags.yes ? this.printRemovalPlan(target) : await this.confirmRemoval(target);\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n await this.executeUninstall(target, projectDir);\n this.reportSuccess();\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n }\n\n private reportNothingToUninstall(): void {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n }\n\n private printRemovalPlan(target: UninstallTarget): true {\n this.log(\"The following will be removed:\");\n this.log(\"\");\n\n for (const section of buildRemovalPlan(target)) {\n this.log(` ${section.label}`);\n for (const item of section.items) {\n this.log(` ${item}`);\n }\n }\n\n this.log(\"\");\n return true;\n }\n\n private async confirmRemoval(target: UninstallTarget): Promise<boolean> {\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <UninstallConfirm target={target} onConfirm={onConfirm} onCancel={onCancel} />\n ));\n return outcome === \"confirmed\";\n }\n\n private async executeUninstall(target: UninstallTarget, projectDir: string): Promise<void> {\n const isGlobalUninstall = isHomeDirectory(projectDir);\n // Prepared BEFORE any removal: the projects[] registry and the source used\n // to regenerate each project's config-types.ts both live in the global\n // config this uninstall is about to delete.\n const propagation = isGlobalUninstall\n ? await this.prepareGlobalPropagation(target, projectDir)\n : null;\n\n if (target.hasPlugins) {\n this.log(\"Uninstalling plugins...\");\n\n try {\n const pluginResult = await uninstallPlugins(target, projectDir, (name) =>\n this.log(` Uninstalled plugin '${name}'`),\n );\n\n this.logSuccess(\n `Uninstalled ${pluginResult.totalUninstalled} ${pluginResult.totalUninstalled === 1 ? \"plugin\" : \"plugins\"}`,\n );\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n try {\n await this.removeLocalFiles(target);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n if (isGlobalUninstall) {\n // The global manifest is gone — prune the inlined global-scoped entries the\n // registered projects still carry so they stop referencing removed content.\n if (propagation) {\n await this.updateRegisteredProjects(propagation);\n }\n return;\n }\n\n // Deregister this project from the global config's tracked projects so future\n // global edits stop propagating back into it. Best-effort by nature: a missing,\n // project-less, or corrupt global config (ConfigLoadError) must never fail the\n // uninstall — warn and move on.\n try {\n // Registration bookkeeping only: nothing inlines the `projects[]` list into a\n // project config, so this loads neither the matrix nor the agent definitions\n // and the uninstall stays offline.\n await mutateGlobal({ kind: \"deregister-project\", projectDir }, lazyGateDeps(projectDir));\n } catch (error) {\n this.warn(`Could not update the global project registry: ${getErrorMessage(error)}`);\n }\n }\n\n /**\n * Loads what updating registered projects needs (global config with its\n * projects[] registry, skills matrix, agent definitions) BEFORE the global\n * .claude-src manifest is deleted — source resolution reads that config.\n * Returns null when nothing is registered or loading fails; a load failure\n * warns and never aborts the uninstall.\n *\n * `skipExtraSources: true` is NOT a divergence from the wizard's full\n * multi-source load: extra-source loading only annotates each skill's\n * `availableSources`/`activeSource` for wizard UI tagging — it never adds\n * skills or categories to the matrix, and the config-types writer never reads\n * those annotations, so the regenerated project types are byte-identical\n * either way (pinned by the skipExtraSources parity test in\n * local-installer.test.ts). Skipping avoids fetching every registered extra\n * source (network on a cold cache, plus unreachable-remote warnings) during\n * an uninstall that must never hang or noise-fail on remote state.\n */\n private async prepareGlobalPropagation(\n target: UninstallTarget,\n projectDir: string,\n ): Promise<GlobalPropagationData | null> {\n const globalConfig = target.config;\n if (!globalConfig?.projects?.length) return null;\n\n try {\n const [sourceResult, agentDefs] = await Promise.all([\n loadSkillsMatrixFromSource({\n projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n }),\n loadAgentDefs({ projectDir }),\n ]);\n return { globalConfig, matrix: sourceResult.matrix, agents: agentDefs.agents };\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n return null;\n }\n }\n\n /**\n * Prunes the inlined global-scoped config entries from every registered\n * project and regenerates its config-types.ts. Runs AFTER the global manifest\n * removal so the regenerated project types fall back to the standalone form\n * instead of importing from the deleted global config-types.ts. Best-effort:\n * unreachable projects are warned and skipped, and no failure here may abort\n * the uninstall.\n */\n private async updateRegisteredProjects(propagation: GlobalPropagationData): Promise<void> {\n try {\n const report = await propagateGlobalRemoval(propagation.globalConfig, {\n matrix: propagation.matrix,\n agents: propagation.agents,\n });\n for (const skippedPath of report.propagated.skipped) {\n this.warn(registeredProjectUpdateSkipped(skippedPath));\n }\n if (report.propagated.updated.length === 0) return;\n\n this.logSuccess(registeredProjectsUpdated(report.propagated.updated.length));\n\n // The pruned projects' compiled agents were built from the global rows this\n // uninstall just removed, so the prune owes them a recompile too.\n const { recompiledCount, failedCount, warnings } = report.recompile;\n for (const warning of warnings) {\n this.warn(warning);\n }\n const failureSuffix = failedCount > 0 ? ` (${failedCount} failed)` : \"\";\n this.log(`Recompiled agents in ${recompiledCount} registered projects${failureSuffix}`);\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n }\n }\n\n private reportSuccess(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n private async removeLocalFiles(target: UninstallTarget): Promise<void> {\n const skillResult = await removeMatchingSkills(\n target,\n (dirName) => this.log(` Uninstalled skill '${dirName}'`),\n (dirName) => this.warn(`Skipping '${dirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`),\n );\n\n if (skillResult.removedCount > 0) {\n this.logSuccess(\n `Removed ${skillResult.removedCount} CLI-installed ${skillResult.removedCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n const agentResult = await removeMatchingAgents(target, (agentName) =>\n this.log(` Uninstalled agent '${agentName}'`),\n );\n\n if (agentResult.removedCount > 0) {\n this.logSuccess(\n `Removed ${agentResult.removedCount} compiled ${agentResult.removedCount === 1 ? \"agent\" : \"agents\"}`,\n );\n }\n\n const cleanup = await cleanupEmptyDirs(target);\n\n if (cleanup.claudeSrcDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n } else if (cleanup.claudeSrcManifestRemoved) {\n this.logSuccess(`Removed CLI config from ${CLAUDE_SRC_DIR}/`);\n }\n\n if (cleanup.claudeDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else if (cleanup.claudeDirKept) {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n}\n\n/** @internal Exported for testing */\nexport type UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n /** Plugin names filtered to only those installed by this CLI (matched against config skills) */\n cliPluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasClaudeDir: boolean;\n /** Whether .claude-src/config.ts exists (the CLI config manifest). */\n hasClaudeSrcConfig: boolean;\n /** Whether .claude-src/config-types.ts exists (companion to config.ts). */\n hasClaudeSrcConfigTypes: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n claudeDir: string;\n claudeSrcDir: string;\n /** Resolved project source config from .claude-src/config.ts */\n config: ProjectConfig | null;\n /** Agent names from the generated config (e.g., [\"web-developer\"]) */\n configuredAgents: AgentName[];\n};\n\n/**\n * Everything a global uninstall needs to update the registered projects after\n * the global manifest is removed — captured before removal because it is\n * sourced from the config being deleted.\n */\ntype GlobalPropagationData = {\n globalConfig: ProjectConfig;\n matrix: MergedSkillsMatrix;\n agents: Record<AgentName, AgentDefinition>;\n};\n\ntype SkillRemovalResult = {\n removedCount: number;\n skippedCount: number;\n removedNames: string[];\n skippedNames: string[];\n /** Whether the skills directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype AgentRemovalResult = {\n removedCount: number;\n removedNames: string[];\n /** Whether the agents directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype UninstallPluginsResult = {\n uninstalledNames: string[];\n totalUninstalled: number;\n};\n\ntype CleanupResult = {\n claudeDirRemoved: boolean;\n /** Whether config.ts/config-types.ts were removed from .claude-src/ */\n claudeSrcManifestRemoved: boolean;\n /** Whether the emptied .claude-src/ directory itself was removed */\n claudeSrcDirRemoved: boolean;\n /** Whether .claude/ still exists with user content after cleanup */\n claudeDirKept: boolean;\n};\n\nfunction hasAnythingToRemove(target: UninstallTarget): boolean {\n return (\n target.hasPlugins ||\n target.hasLocalSkills ||\n target.hasLocalAgents ||\n target.hasClaudeSrcConfig ||\n target.hasClaudeSrcConfigTypes\n );\n}\n\nfunction collectConfiguredAgents(config: Partial<ProjectConfig> | null): AgentName[] {\n if (!config?.agents) return [];\n return config.agents.map((a) => a.name);\n}\n\n/** @internal Exported for testing */\nexport function getCliInstalledPluginKeys(config: Partial<ProjectConfig> | null): Set<string> {\n if (!config?.skills) return new Set();\n const { marketplace } = config;\n return new Set(\n config.skills.flatMap((skill) => [\n // Primary key: skill.id@skill.source\n buildMarketplacePluginRef(skill.id, skill.source),\n // Marketplace variant for plugins installed via marketplace where\n // skill.source may differ (e.g., \"eject\" vs the marketplace name)\n ...(marketplace && skill.source !== marketplace && skill.source !== EJECT_SOURCE\n ? [buildMarketplacePluginRef(skill.id, marketplace)]\n : []),\n ]),\n );\n}\n\n/**\n * Loads the config that drives the removal plan. A config file that exists but\n * cannot be parsed (`ConfigLoadError`) is reported through `onLoadFailed` and\n * then treated exactly like a missing one — an unreadable config is precisely\n * when a user needs to uninstall, so it must never fail the run. Same posture as\n * the `deregisterProjectPath` call site. Only the plan degrades: the plugins and\n * compiled agents the config named can no longer be identified, while file\n * removal proceeds. Any other failure is a real fault and still propagates.\n */\nasync function loadUninstallConfig(\n projectDir: string,\n onLoadFailed: (reason: string) => void,\n): Promise<ProjectConfig | null> {\n try {\n const result = await loadProjectConfigFromDir(projectDir);\n return result?.config ?? null;\n } catch (error) {\n if (!(error instanceof ConfigLoadError)) throw error;\n onLoadFailed(getErrorMessage(error));\n return null;\n }\n}\n\n/**\n * Detects what's installed in a project directory for uninstallation.\n *\n * Checks for plugins, local skills, agents, config directories, and\n * resolves which plugins were installed by this CLI.\n */\nasync function detectUninstallTarget(\n projectDir: string,\n onConfigLoadFailed: (reason: string) => void,\n): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const { skillsDir, agentsDir } = resolveInstallPaths(projectDir);\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const claudeSrcConfigPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TS);\n const claudeSrcConfigTypesPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS);\n\n const [\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n config,\n ] = await Promise.all([\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n directoryExists(claudeDir),\n fileExists(claudeSrcConfigPath),\n fileExists(claudeSrcConfigTypesPath),\n loadUninstallConfig(projectDir, onConfigLoadFailed),\n ]);\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n const activeConfig = config\n ? {\n ...config,\n skills: config.skills?.filter((s) => !s.excluded),\n agents: config.agents?.filter((a) => !a.excluded),\n }\n : null;\n const configuredAgents = collectConfiguredAgents(activeConfig);\n const cliInstalledKeys = getCliInstalledPluginKeys(activeConfig);\n const cliPluginNames = pluginNames.filter((name) => cliInstalledKeys.has(name));\n\n return {\n hasPlugins: cliPluginNames.length > 0,\n pluginNames,\n cliPluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n pluginsDir,\n skillsDir,\n agentsDir,\n claudeDir,\n claudeSrcDir,\n config,\n configuredAgents,\n };\n}\n\nfunction shouldRemoveSkill(forkedFrom: { source?: string } | null): boolean {\n return forkedFrom !== null;\n}\n\nasync function removeMatchingSkills(\n target: Pick<UninstallTarget, \"hasLocalSkills\" | \"skillsDir\">,\n onRemoved?: (dirName: string) => void,\n onSkipped?: (dirName: string) => void,\n): Promise<SkillRemovalResult> {\n if (!target.hasLocalSkills) {\n return {\n removedCount: 0,\n skippedCount: 0,\n removedNames: [],\n skippedNames: [],\n dirCleaned: false,\n };\n }\n\n const classified = await classifySkillDirs(target.skillsDir);\n const removedNames = await removeClassifiedSkills(\n classified.toRemove,\n target.skillsDir,\n onRemoved,\n );\n classified.toSkip.forEach((name) => onSkipped?.(name));\n const dirCleaned = await cleanupSkillsDir(target.skillsDir, classified.toSkip.length === 0);\n\n return {\n removedCount: removedNames.length,\n skippedCount: classified.toSkip.length,\n removedNames,\n skippedNames: classified.toSkip,\n dirCleaned,\n };\n}\n\nasync function classifySkillDirs(\n skillsDir: string,\n): Promise<{ toRemove: string[]; toSkip: string[] }> {\n const dirNames = await listDirectories(skillsDir);\n const entries = await Promise.all(\n dirNames.map(async (name) => ({\n name,\n forkedFrom: await readForkedFromMetadata(path.join(skillsDir, name)),\n })),\n );\n const [removable, skippable] = partition(entries, (entry) => shouldRemoveSkill(entry.forkedFrom));\n return { toRemove: removable.map((e) => e.name), toSkip: skippable.map((e) => e.name) };\n}\n\nasync function removeClassifiedSkills(\n names: string[],\n skillsDir: string,\n onRemoved?: (name: string) => void,\n): Promise<string[]> {\n for (const name of names) {\n await remove(path.join(skillsDir, name));\n onRemoved?.(name);\n }\n return names;\n}\n\nasync function cleanupSkillsDir(dir: string, allRemoved: boolean): Promise<boolean> {\n if (!allRemoved) return false;\n return removeDirIfEmpty(dir);\n}\n\n/** Removes `dir` when it exists and is empty; true when removed. */\nasync function removeDirIfEmpty(dir: string): Promise<boolean> {\n if (!(await directoryExists(dir))) return false;\n if (!(await isDirectoryEmpty(dir))) return false;\n await remove(dir);\n return true;\n}\n\n/**\n * Removes compiled agent .md files that are listed in the project config.\n *\n * A file is removed only when its basename matches a configured agent\n * (config.agents); agents absent from config are preserved. Cleans up the\n * agents directory if empty after removal.\n *\n * @param onRemoved - Called for each removed agent name (for logging)\n */\nasync function removeMatchingAgents(\n target: Pick<UninstallTarget, \"hasLocalAgents\" | \"agentsDir\" | \"configuredAgents\">,\n onRemoved?: (agentName: string) => void,\n): Promise<AgentRemovalResult> {\n if (!target.hasLocalAgents) {\n return { removedCount: 0, removedNames: [], dirCleaned: false };\n }\n\n if (target.configuredAgents.length === 0) {\n return { removedCount: 0, removedNames: [], dirCleaned: false };\n }\n\n const agentFiles = await listAgentFiles(target.agentsDir);\n const removedNames = agentFiles\n .map((agentFile) => agentFile.replace(/\\.md$/, \"\"))\n // Array<AgentName>.includes rejects a plain string; widen the configured\n // list to readonly string[] so the on-disk basename can be tested for\n // membership in config.agents.\n .filter((agentName) => (target.configuredAgents as readonly string[]).includes(agentName));\n\n for (const agentName of removedNames) {\n await remove(path.join(target.agentsDir, `${agentName}.md`));\n onRemoved?.(agentName);\n }\n\n const dirCleaned = await removeDirIfEmpty(target.agentsDir);\n\n return {\n removedCount: removedNames.length,\n removedNames,\n dirCleaned,\n };\n}\n\n/**\n * Uninstalls CLI-managed plugins by removing them from the Claude CLI\n * and deleting their local directories.\n *\n * Derives scope from per-skill config when available; falls back to project-level.\n *\n * @param onUninstalled - Called for each successfully uninstalled plugin name (for logging)\n * @internal Exported for testing\n */\nexport async function uninstallPlugins(\n target: Pick<UninstallTarget, \"hasPlugins\" | \"cliPluginNames\" | \"pluginsDir\" | \"config\">,\n projectDir: string,\n onUninstalled?: (pluginName: string) => void,\n): Promise<UninstallPluginsResult> {\n if (!target.hasPlugins) {\n return { uninstalledNames: [], totalUninstalled: 0 };\n }\n\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of target.cliPluginNames) {\n if (cliAvailable) {\n // Derive primary scope from per-skill config; shared helper tries both scopes\n // to handle re-scoped plugins where the registry entry may be under the\n // original scope rather than the currently-configured one.\n const skillId = parseMarketplacePluginRef(pluginName);\n const skillConfig = target.config?.skills?.find((s) => s.id === skillId);\n const primaryScope = toClaudePluginScope(skillConfig?.scope);\n await claudePluginUninstallBestEffort(pluginName, primaryScope, projectDir);\n }\n\n const pluginPath = path.join(target.pluginsDir, pluginName);\n await remove(pluginPath);\n onUninstalled?.(pluginName);\n }\n\n // Every iteration either completes or throws (aborting the whole uninstall),\n // so reaching this return means every CLI-managed plugin was removed.\n return {\n uninstalledNames: target.cliPluginNames,\n totalUninstalled: target.cliPluginNames.length,\n };\n}\n\n/**\n * Removes the CLI config manifest (config.ts + config-types.ts) from .claude-src/,\n * then the .claude-src/ directory itself when it has nothing else left. User-owned\n * content in .claude-src/ (e.g. ejected templates) keeps the directory alive.\n */\nasync function removeConfigManifest(\n target: Pick<UninstallTarget, \"claudeSrcDir\" | \"hasClaudeSrcConfig\" | \"hasClaudeSrcConfigTypes\">,\n): Promise<{ manifestRemoved: boolean; dirRemoved: boolean }> {\n let manifestRemoved = false;\n\n if (target.hasClaudeSrcConfig) {\n await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TS));\n manifestRemoved = true;\n }\n if (target.hasClaudeSrcConfigTypes) {\n await remove(path.join(target.claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS));\n manifestRemoved = true;\n }\n\n const dirRemoved = manifestRemoved && (await removeDirIfEmpty(target.claudeSrcDir));\n return { manifestRemoved, dirRemoved };\n}\n\n/**\n * Removes the CLI config manifest and cleans up empty .claude/ and .claude-src/\n * directories after uninstall.\n *\n * The config manifest is always removed. The .claude-src/ and .claude/ directories\n * are removed only when they are empty after their CLI-managed contents are gone.\n */\nasync function cleanupEmptyDirs(\n target: Pick<\n UninstallTarget,\n \"hasClaudeDir\" | \"claudeDir\" | \"claudeSrcDir\" | \"hasClaudeSrcConfig\" | \"hasClaudeSrcConfigTypes\"\n >,\n): Promise<CleanupResult> {\n const manifest = await removeConfigManifest(target);\n\n const claudeDirRemoved = target.hasClaudeDir && (await removeDirIfEmpty(target.claudeDir));\n // Nothing else removes .claude itself, so \"kept\" is exactly \"present but not removed\".\n const claudeDirKept =\n !claudeDirRemoved && target.hasClaudeDir && (await directoryExists(target.claudeDir));\n\n return {\n claudeDirRemoved,\n claudeSrcManifestRemoved: manifest.manifestRemoved,\n claudeSrcDirRemoved: manifest.dirRemoved,\n claudeDirKept,\n };\n}\n\nasync function isDirectoryEmpty(dirPath: string): Promise<boolean> {\n try {\n const allEntries = await readdir(dirPath);\n return allEntries.length === 0;\n } catch {\n return true;\n }\n}\n\nasync function listAgentFiles(agentsDir: string): Promise<string[]> {\n try {\n return await listAgentMdFiles(agentsDir);\n } catch {\n return [];\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/uninstall.tsx"],"sourcesContent":["import React from \"react\";\nimport { partition } from \"remeda\";\nimport path from \"path\";\n\nimport { Flags } from \"@oclif/core\";\nimport { Box, Text, useApp } from \"ink\";\n\nimport { BaseCommand } from \"../base-command\";\nimport { Confirm } from \"../components/common/confirm\";\nimport { promptConfirm } from \"../components/common/prompt-confirm.js\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport {\n directoryExists,\n fileExists,\n listDirectories,\n remove,\n removeDirIfEmpty,\n} from \"../utils/fs\";\nimport { listAgentMdFiles } from \"../lib/agents\";\nimport { claudePluginUninstallBestEffort, isClaudeCLIAvailable } from \"../utils/exec\";\nimport {\n listPluginNames,\n getProjectPluginsDir,\n buildMarketplacePluginRef,\n parseMarketplacePluginRef,\n toClaudePluginScope,\n} from \"../lib/plugins/index\";\nimport { readForkedFromMetadata } from \"../lib/skills/index\";\nimport { isHomeDirectory, resolveInstallPaths } from \"../lib/installation/index\";\nimport { lazyGateDeps, mutateGlobal, propagateGlobalRemoval } from \"../lib/config-gate/index.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading\";\nimport { loadAgentDefs } from \"../lib/operations\";\nimport { ConfigLoadError, loadProjectConfigFromDir } from \"../lib/configuration/project-config\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_COLORS,\n DEFAULT_BRANDING,\n EJECT_SOURCE,\n STANDARD_FILES,\n} from \"../consts\";\nimport { EXIT_CODES } from \"../lib/exit-codes\";\nimport {\n SUCCESS_MESSAGES,\n INFO_MESSAGES,\n UNINSTALL_PLAN,\n compiledAgentsKept,\n compiledAgentsRemoval,\n localSkillsRemoval,\n registeredProjectsUpdated,\n registeredProjectUpdateSkipped,\n registeredProjectsUpdateFailed,\n} from \"../utils/messages\";\nimport type { AgentDefinition, AgentName, MergedSkillsMatrix, ProjectConfig } from \"../types/index\";\n\n/** A grouped section of the uninstall removal plan (header label + item lines). */\ntype RemovalPlanSection = {\n label: string;\n items: string[];\n};\n\n/**\n * One removal this run promises AND makes. Each entry carries what its remover needs\n * — paths and names, never display strings — so the preview and the removal are two\n * readings of one value rather than two derivations of the same target.\n */\ntype RemovalEntry =\n | { kind: \"plugins\"; pluginsDir: string; names: string[] }\n | { kind: \"skills\"; skillsDir: string }\n | { kind: \"agents\"; agentsDir: string; agentNames: AgentName[] }\n | { kind: \"config\"; claudeSrcDir: string; fileNames: string[] };\n\n/** The single entry of a kind, for the remover that consumes it. */\ntype PluginRemoval = Extract<RemovalEntry, { kind: \"plugins\" }>;\ntype SkillsRemoval = Extract<RemovalEntry, { kind: \"skills\" }>;\ntype AgentsRemoval = Extract<RemovalEntry, { kind: \"agents\" }>;\ntype ConfigManifestRemoval = Extract<RemovalEntry, { kind: \"config\" }>;\n\n/**\n * The uninstall removal plan: what this run removes, and what it deliberately leaves\n * behind. Built once per run — the confirm UI renders it, the executor consumes the\n * same value, so the plan cannot name a removal the run declines to make.\n */\ntype RemovalPlan = {\n entries: RemovalEntry[];\n /** Statements naming content that stays, and why — see {@link keptStatements}. */\n kept: string[];\n};\n\n/**\n * Pure builder for the uninstall removal plan — the one place that decides what this\n * run removes. Every removal downstream is driven by an entry from here, and nothing\n * downstream re-reads the target to decide whether to act.\n */\nfunction buildRemovalPlan(target: UninstallTarget): RemovalPlan {\n const agents = compiledAgentsEntry(target);\n\n return {\n entries: [\n ...pluginsEntry(target),\n ...localSkillsEntry(target),\n ...agents,\n ...configManifestEntry(target),\n ],\n kept: keptStatements(target, agents),\n };\n}\n\n/** The plan carries at least one removal — the only thing that makes this run an uninstall. */\nfunction hasAnythingToRemove(plan: RemovalPlan): boolean {\n return plan.entries.length > 0;\n}\n\nfunction pluginsEntry(target: UninstallTarget): PluginRemoval[] {\n if (!target.hasPlugins) return [];\n return [{ kind: \"plugins\", pluginsDir: target.pluginsDir, names: [...target.cliPluginNames] }];\n}\n\nfunction localSkillsEntry(target: UninstallTarget): SkillsRemoval[] {\n if (!target.hasLocalSkills) return [];\n return [{ kind: \"skills\", skillsDir: target.skillsDir }];\n}\n\n/**\n * Removal matches on-disk agent basenames against the configured agent names, so with\n * no configuration to name them there is nothing it could match and the plan carries no\n * entry — one decision, made here, rather than a predicate mirrored into the renderer.\n */\nfunction compiledAgentsEntry(target: UninstallTarget): AgentsRemoval[] {\n if (!target.hasLocalAgents) return [];\n if (target.configuredAgents.length === 0) return [];\n return [{ kind: \"agents\", agentsDir: target.agentsDir, agentNames: target.configuredAgents }];\n}\n\n/** The CLI config manifest (config.ts + config-types.ts) is always removed. */\nfunction configManifestEntry(target: UninstallTarget): ConfigManifestRemoval[] {\n const fileNames = [\n ...(target.hasClaudeSrcConfig ? [STANDARD_FILES.CONFIG_TS] : []),\n ...(target.hasClaudeSrcConfigTypes ? [STANDARD_FILES.CONFIG_TYPES_TS] : []),\n ];\n if (fileNames.length === 0) return [];\n return [{ kind: \"config\", claudeSrcDir: target.claudeSrcDir, fileNames }];\n}\n\n/**\n * The plan's kept half. Compiled agents are the one thing a run cannot promise without\n * the configuration, so when they are on disk and the plan carries no removal for them,\n * it says they stay — and why — in place of the removal it would otherwise name.\n */\nfunction keptStatements(target: UninstallTarget, agentRemovals: AgentsRemoval[]): string[] {\n if (!target.hasLocalAgents) return [];\n if (agentRemovals.length > 0) return [];\n return [compiledAgentsKept(target.agentsDir)];\n}\n\n/** The plan's entry of a kind, for the remover that consumes it. At most one exists. */\nfunction planEntry<K extends RemovalEntry[\"kind\"]>(\n plan: RemovalPlan,\n kind: K,\n): Extract<RemovalEntry, { kind: K }> | undefined {\n return plan.entries.find(\n (entry): entry is Extract<RemovalEntry, { kind: K }> => entry.kind === kind,\n );\n}\n\n/** The heading an entry prints under, and the lines it contributes beneath it. */\nfunction describeEntry(entry: RemovalEntry): RemovalPlanSection {\n switch (entry.kind) {\n case \"plugins\":\n return { label: UNINSTALL_PLAN.PLUGINS_HEADING, items: entry.names };\n case \"skills\":\n return {\n label: UNINSTALL_PLAN.CLI_MANAGED_FILES_HEADING,\n items: [localSkillsRemoval(entry.skillsDir)],\n };\n case \"agents\":\n return {\n label: UNINSTALL_PLAN.CLI_MANAGED_FILES_HEADING,\n items: [compiledAgentsRemoval(entry.agentsDir)],\n };\n case \"config\":\n return {\n label: UNINSTALL_PLAN.CONFIG_HEADING,\n items: entry.fileNames.map((fileName) => `${entry.claudeSrcDir}/${fileName}`),\n };\n default: {\n const _exhaustive: never = entry;\n return _exhaustive;\n }\n }\n}\n\nconst PLAN_SECTION_ORDER = [\n UNINSTALL_PLAN.PLUGINS_HEADING,\n UNINSTALL_PLAN.CLI_MANAGED_FILES_HEADING,\n UNINSTALL_PLAN.CONFIG_HEADING,\n] as const;\n\n/**\n * The plan's display half: entries grouped under their heading, in printing order —\n * skills and compiled agents share one. A heading is a promise about the lines beneath\n * it, so a heading no entry contributed to is not printed at all. The single source of\n * the strings shared by printRemovalPlan (plain text) and the UninstallConfirm Ink\n * component; each renderer only adds its own indentation and styling.\n */\nfunction planSections(entries: readonly RemovalEntry[]): RemovalPlanSection[] {\n const described = entries.map(describeEntry);\n\n return PLAN_SECTION_ORDER.flatMap((label) =>\n sectionWithItems(label, itemsUnder(described, label)),\n );\n}\n\n/** Every line the described entries contributed under one heading, in plan order. */\nfunction itemsUnder(described: readonly RemovalPlanSection[], label: string): string[] {\n return described.filter((section) => section.label === label).flatMap((section) => section.items);\n}\n\nfunction sectionWithItems(label: string, items: string[]): RemovalPlanSection[] {\n if (items.length === 0) return [];\n return [{ label, items }];\n}\n\ntype UninstallConfirmProps = {\n plan: RemovalPlan;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nconst UninstallConfirm: React.FC<UninstallConfirmProps> = ({ plan, onConfirm, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{UNINSTALL_PLAN.PREVIEW_HEADING}</Text>\n <Text> </Text>\n\n {planSections(plan.entries).map((section) => (\n <Box key={section.label} flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> {section.label}</Text>\n {section.items.map((item) => (\n <Text key={item} dimColor>\n {\" \"}\n {item}\n </Text>\n ))}\n </Box>\n ))}\n\n {plan.kept.map((statement) => (\n <Box key={statement} flexDirection=\"column\">\n <Text> </Text>\n <Text dimColor>{statement}</Text>\n </Box>\n ))}\n\n <Text> </Text>\n <Confirm\n message=\"Are you sure you want to uninstall?\"\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nexport default class Uninstall extends BaseCommand {\n static summary = `Remove ${DEFAULT_BRANDING.NAME} from this project`;\n\n static description = `Uninstall ${DEFAULT_BRANDING.NAME} from this project. Removes CLI-managed skills (matched by source), compiled agents, plugins, and the .claude-src/ config manifest (config.ts + config-types.ts). User-created content is preserved.`;\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --yes\",\n ];\n\n static flags = {\n yes: Flags.boolean({\n char: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Uninstall);\n const projectDir = process.cwd();\n\n this.printHeader();\n\n const target = await detectUninstallTarget(projectDir, (reason) =>\n this.warn(\n `Could not read the project config — plugins and compiled agents it lists may be left behind: ${reason}`,\n ),\n );\n const plan = buildRemovalPlan(target);\n if (!hasAnythingToRemove(plan)) {\n this.reportNothingToUninstall();\n return;\n }\n\n const confirmed = flags.yes ? this.printRemovalPlan(plan) : await this.confirmRemoval(plan);\n if (!confirmed) {\n this.log(\"\");\n this.log(\"Uninstall cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n await this.executeUninstall(plan, target, projectDir);\n this.reportSuccess();\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Uninstall`);\n this.log(\"\");\n }\n\n private reportNothingToUninstall(): void {\n this.warn(\"Nothing to uninstall.\");\n this.log(\"\");\n this.log(INFO_MESSAGES.NOT_INSTALLED);\n this.log(\"\");\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n }\n\n private printRemovalPlan(plan: RemovalPlan): true {\n this.log(UNINSTALL_PLAN.PREVIEW_HEADING);\n this.log(\"\");\n\n for (const section of planSections(plan.entries)) {\n this.log(` ${section.label}`);\n for (const item of section.items) {\n this.log(` ${item}`);\n }\n }\n\n for (const statement of plan.kept) {\n this.log(\"\");\n this.log(statement);\n }\n\n this.log(\"\");\n return true;\n }\n\n private async confirmRemoval(plan: RemovalPlan): Promise<boolean> {\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <UninstallConfirm plan={plan} onConfirm={onConfirm} onCancel={onCancel} />\n ));\n return outcome === \"confirmed\";\n }\n\n private async executeUninstall(\n plan: RemovalPlan,\n target: UninstallTarget,\n projectDir: string,\n ): Promise<void> {\n const isGlobalUninstall = isHomeDirectory(projectDir);\n // Prepared BEFORE any removal: the projects[] registry and the source used\n // to regenerate each project's config-types.ts both live in the global\n // config this uninstall is about to delete.\n const propagation = isGlobalUninstall\n ? await this.prepareGlobalPropagation(target, projectDir)\n : null;\n\n await this.removePlannedPlugins(planEntry(plan, \"plugins\"), target.config, projectDir);\n\n try {\n await this.removeLocalFiles(plan, target);\n } catch (error) {\n this.log(\"Failed to remove local files\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n if (isGlobalUninstall) {\n // The global manifest is gone — prune the inlined global-scoped entries the\n // registered projects still carry so they stop referencing removed content.\n if (propagation) {\n await this.updateRegisteredProjects(propagation);\n }\n return;\n }\n\n // Deregister this project from the global config's tracked projects so future\n // global edits stop propagating back into it. Best-effort by nature: a missing,\n // project-less, or corrupt global config (ConfigLoadError) must never fail the\n // uninstall — warn and move on.\n try {\n // Registration bookkeeping only: nothing inlines the `projects[]` list into a\n // project config, so this loads neither the matrix nor the agent definitions\n // and the uninstall stays offline.\n await mutateGlobal({ kind: \"deregister-project\", projectDir }, lazyGateDeps(projectDir));\n } catch (error) {\n this.warn(`Could not update the global project registry: ${getErrorMessage(error)}`);\n }\n }\n\n /**\n * Loads what updating registered projects needs (global config with its\n * projects[] registry, skills matrix, agent definitions) BEFORE the global\n * .claude-src manifest is deleted — source resolution reads that config.\n * Returns null when nothing is registered or loading fails; a load failure\n * warns and never aborts the uninstall.\n *\n * `skipExtraSources: true` is NOT a divergence from the wizard's full\n * multi-source load: extra-source loading only annotates each skill's\n * `availableSources`/`activeSource` for wizard UI tagging — it never adds\n * skills or categories to the matrix, and the config-types writer never reads\n * those annotations, so the regenerated project types are byte-identical\n * either way (pinned by the skipExtraSources parity test in\n * local-installer.test.ts). Skipping avoids fetching every registered extra\n * source (network on a cold cache, plus unreachable-remote warnings) during\n * an uninstall that must never hang or noise-fail on remote state.\n */\n private async prepareGlobalPropagation(\n target: UninstallTarget,\n projectDir: string,\n ): Promise<GlobalPropagationData | null> {\n const globalConfig = target.config;\n if (!globalConfig?.projects?.length) return null;\n\n try {\n const [sourceResult, agentDefs] = await Promise.all([\n loadSkillsMatrixFromSource({\n projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n }),\n loadAgentDefs({ projectDir }),\n ]);\n return { globalConfig, matrix: sourceResult.matrix, agents: agentDefs.agents };\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n return null;\n }\n }\n\n /**\n * Prunes the inlined global-scoped config entries from every registered\n * project and regenerates its config-types.ts. Runs AFTER the global manifest\n * removal so the regenerated project types fall back to the standalone form\n * instead of importing from the deleted global config-types.ts. Best-effort:\n * unreachable projects are warned and skipped, and no failure here may abort\n * the uninstall.\n */\n private async updateRegisteredProjects(propagation: GlobalPropagationData): Promise<void> {\n try {\n const report = await propagateGlobalRemoval(propagation.globalConfig, {\n matrix: propagation.matrix,\n agents: propagation.agents,\n });\n for (const skippedPath of report.propagated.skipped) {\n this.warn(registeredProjectUpdateSkipped(skippedPath));\n }\n if (report.propagated.updated.length === 0) return;\n\n this.logSuccess(registeredProjectsUpdated(report.propagated.updated.length));\n\n // The pruned projects' compiled agents were built from the global rows this\n // uninstall just removed, so the prune owes them a recompile too.\n this.reportPropagatedRecompile(report);\n } catch (error) {\n this.warn(registeredProjectsUpdateFailed(getErrorMessage(error)));\n }\n }\n\n private reportSuccess(): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} has been uninstalled.`);\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.UNINSTALL_COMPLETE);\n this.log(\"\");\n }\n\n /**\n * Each step acts only when the plan carries its entry, so what the user was shown and\n * what this run removes are the same list read twice.\n */\n private async removeLocalFiles(plan: RemovalPlan, target: UninstallTarget): Promise<void> {\n await this.removePlannedSkills(planEntry(plan, \"skills\"));\n await this.removePlannedAgents(planEntry(plan, \"agents\"));\n\n const cleanup = await cleanupEmptyDirs(target, planEntry(plan, \"config\"));\n\n if (cleanup.claudeSrcDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_SRC_DIR}/`);\n } else if (cleanup.claudeSrcManifestRemoved) {\n this.logSuccess(`Removed CLI config from ${CLAUDE_SRC_DIR}/`);\n }\n\n if (cleanup.claudeDirRemoved) {\n this.logSuccess(`Removed ${CLAUDE_DIR}/`);\n } else if (cleanup.claudeDirKept) {\n this.log(`Kept ${CLAUDE_DIR}/ (contains user content)`);\n }\n }\n\n private async removePlannedPlugins(\n entry: PluginRemoval | undefined,\n config: ProjectConfig | null,\n projectDir: string,\n ): Promise<void> {\n if (!entry) return;\n\n this.log(\"Uninstalling plugins...\");\n\n try {\n const pluginResult = await uninstallPlugins(entry, config, projectDir, (name) =>\n this.log(` Uninstalled plugin '${name}'`),\n );\n\n this.logSuccess(\n `Uninstalled ${pluginResult.totalUninstalled} ${pluginResult.totalUninstalled === 1 ? \"plugin\" : \"plugins\"}`,\n );\n } catch (error) {\n this.log(\"Plugin uninstall failed\");\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private async removePlannedSkills(entry: SkillsRemoval | undefined): Promise<void> {\n if (!entry) return;\n\n const result = await removeMatchingSkills(\n entry,\n (dirName) => this.log(` Uninstalled skill '${dirName}'`),\n (dirName) => this.warn(`Skipping '${dirName}': not created by ${DEFAULT_BRANDING.NAME} CLI`),\n );\n if (result.removedCount === 0) return;\n\n this.logSuccess(\n `Removed ${result.removedCount} CLI-installed ${result.removedCount === 1 ? \"skill\" : \"skills\"}`,\n );\n }\n\n private async removePlannedAgents(entry: AgentsRemoval | undefined): Promise<void> {\n if (!entry) return;\n\n const result = await removeMatchingAgents(entry, (agentName) =>\n this.log(` Uninstalled agent '${agentName}'`),\n );\n if (result.removedCount === 0) return;\n\n this.logSuccess(\n `Removed ${result.removedCount} compiled ${result.removedCount === 1 ? \"agent\" : \"agents\"}`,\n );\n }\n}\n\n/** @internal Exported for testing */\nexport type UninstallTarget = {\n hasPlugins: boolean;\n pluginNames: string[];\n /** Plugin names filtered to only those installed by this CLI (matched against config skills) */\n cliPluginNames: string[];\n hasLocalSkills: boolean;\n hasLocalAgents: boolean;\n hasClaudeDir: boolean;\n /** Whether .claude-src/config.ts exists (the CLI config manifest). */\n hasClaudeSrcConfig: boolean;\n /** Whether .claude-src/config-types.ts exists (companion to config.ts). */\n hasClaudeSrcConfigTypes: boolean;\n pluginsDir: string;\n skillsDir: string;\n agentsDir: string;\n claudeDir: string;\n claudeSrcDir: string;\n /** Resolved project source config from .claude-src/config.ts */\n config: ProjectConfig | null;\n /** Agent names from the generated config (e.g., [\"web-developer\"]) */\n configuredAgents: AgentName[];\n};\n\n/**\n * Everything a global uninstall needs to update the registered projects after\n * the global manifest is removed — captured before removal because it is\n * sourced from the config being deleted.\n */\ntype GlobalPropagationData = {\n globalConfig: ProjectConfig;\n matrix: MergedSkillsMatrix;\n agents: Partial<Record<AgentName, AgentDefinition>>;\n};\n\ntype SkillRemovalResult = {\n removedCount: number;\n skippedCount: number;\n removedNames: string[];\n skippedNames: string[];\n /** Whether the skills directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype AgentRemovalResult = {\n removedCount: number;\n removedNames: string[];\n /** Whether the agents directory was cleaned up (empty after removal) */\n dirCleaned: boolean;\n};\n\ntype UninstallPluginsResult = {\n uninstalledNames: string[];\n totalUninstalled: number;\n};\n\ntype CleanupResult = {\n claudeDirRemoved: boolean;\n /** Whether config.ts/config-types.ts were removed from .claude-src/ */\n claudeSrcManifestRemoved: boolean;\n /** Whether the emptied .claude-src/ directory itself was removed */\n claudeSrcDirRemoved: boolean;\n /** Whether .claude/ still exists with user content after cleanup */\n claudeDirKept: boolean;\n};\n\nfunction collectConfiguredAgents(config: Partial<ProjectConfig> | null): AgentName[] {\n if (!config?.agents) return [];\n return config.agents.map((a) => a.name);\n}\n\n/** @internal Exported for testing */\nexport function getCliInstalledPluginKeys(config: Partial<ProjectConfig> | null): Set<string> {\n if (!config?.skills) return new Set();\n const { marketplace } = config;\n return new Set(\n config.skills.flatMap((skill) => [\n // Primary key: skill.id@skill.source\n buildMarketplacePluginRef(skill.id, skill.source),\n // Marketplace variant for plugins installed via marketplace where\n // skill.source may differ (e.g., \"eject\" vs the marketplace name)\n ...(marketplace && skill.source !== marketplace && skill.source !== EJECT_SOURCE\n ? [buildMarketplacePluginRef(skill.id, marketplace)]\n : []),\n ]),\n );\n}\n\n/**\n * Loads the config that drives the removal plan. A config file that exists but\n * cannot be parsed (`ConfigLoadError`) is reported through `onLoadFailed` and\n * then treated exactly like a missing one — an unreadable config is precisely\n * when a user needs to uninstall, so it must never fail the run. Same posture as\n * the `deregisterProjectPath` call site. Only the plan degrades: the plugins and\n * compiled agents the config named can no longer be identified, while file\n * removal proceeds. Any other failure is a real fault and still propagates.\n */\nasync function loadUninstallConfig(\n projectDir: string,\n onLoadFailed: (reason: string) => void,\n): Promise<ProjectConfig | null> {\n try {\n const result = await loadProjectConfigFromDir(projectDir);\n return result?.config ?? null;\n } catch (error) {\n if (!(error instanceof ConfigLoadError)) throw error;\n onLoadFailed(getErrorMessage(error));\n return null;\n }\n}\n\n/**\n * Detects what's installed in a project directory for uninstallation.\n *\n * Checks for plugins, local skills, agents, config directories, and\n * resolves which plugins were installed by this CLI.\n */\nasync function detectUninstallTarget(\n projectDir: string,\n onConfigLoadFailed: (reason: string) => void,\n): Promise<UninstallTarget> {\n const pluginsDir = getProjectPluginsDir(projectDir);\n const { skillsDir, agentsDir } = resolveInstallPaths(projectDir);\n const claudeDir = path.join(projectDir, CLAUDE_DIR);\n const claudeSrcDir = path.join(projectDir, CLAUDE_SRC_DIR);\n\n const claudeSrcConfigPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TS);\n const claudeSrcConfigTypesPath = path.join(claudeSrcDir, STANDARD_FILES.CONFIG_TYPES_TS);\n\n const [\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n config,\n ] = await Promise.all([\n directoryExists(skillsDir),\n directoryExists(agentsDir),\n directoryExists(claudeDir),\n fileExists(claudeSrcConfigPath),\n fileExists(claudeSrcConfigTypesPath),\n loadUninstallConfig(projectDir, onConfigLoadFailed),\n ]);\n\n let pluginNames: string[] = [];\n try {\n pluginNames = await listPluginNames(projectDir);\n } catch {\n // Best-effort: plugin detection may fail\n }\n\n const activeConfig = config\n ? {\n ...config,\n skills: config.skills.filter((s) => !s.excluded),\n agents: config.agents.filter((a) => !a.excluded),\n }\n : null;\n const configuredAgents = collectConfiguredAgents(activeConfig);\n const cliInstalledKeys = getCliInstalledPluginKeys(activeConfig);\n const cliPluginNames = pluginNames.filter((name) => cliInstalledKeys.has(name));\n\n return {\n hasPlugins: cliPluginNames.length > 0,\n pluginNames,\n cliPluginNames,\n hasLocalSkills,\n hasLocalAgents,\n hasClaudeDir,\n hasClaudeSrcConfig,\n hasClaudeSrcConfigTypes,\n pluginsDir,\n skillsDir,\n agentsDir,\n claudeDir,\n claudeSrcDir,\n config,\n configuredAgents,\n };\n}\n\nfunction shouldRemoveSkill(forkedFrom: { source?: string } | null): boolean {\n return forkedFrom !== null;\n}\n\nasync function removeMatchingSkills(\n entry: SkillsRemoval,\n onRemoved?: (dirName: string) => void,\n onSkipped?: (dirName: string) => void,\n): Promise<SkillRemovalResult> {\n const classified = await classifySkillDirs(entry.skillsDir);\n const removedNames = await removeClassifiedSkills(\n classified.toRemove,\n entry.skillsDir,\n onRemoved,\n );\n classified.toSkip.forEach((name) => onSkipped?.(name));\n const dirCleaned = await cleanupSkillsDir(entry.skillsDir, classified.toSkip.length === 0);\n\n return {\n removedCount: removedNames.length,\n skippedCount: classified.toSkip.length,\n removedNames,\n skippedNames: classified.toSkip,\n dirCleaned,\n };\n}\n\nasync function classifySkillDirs(\n skillsDir: string,\n): Promise<{ toRemove: string[]; toSkip: string[] }> {\n const dirNames = await listDirectories(skillsDir);\n const entries = await Promise.all(\n dirNames.map(async (name) => ({\n name,\n forkedFrom: await readForkedFromMetadata(path.join(skillsDir, name)),\n })),\n );\n const [removable, skippable] = partition(entries, (entry) => shouldRemoveSkill(entry.forkedFrom));\n return { toRemove: removable.map((e) => e.name), toSkip: skippable.map((e) => e.name) };\n}\n\nasync function removeClassifiedSkills(\n names: string[],\n skillsDir: string,\n onRemoved?: (name: string) => void,\n): Promise<string[]> {\n for (const name of names) {\n await remove(path.join(skillsDir, name));\n onRemoved?.(name);\n }\n return names;\n}\n\nasync function cleanupSkillsDir(dir: string, allRemoved: boolean): Promise<boolean> {\n if (!allRemoved) return false;\n return removeDirIfEmpty(dir);\n}\n\n/**\n * Removes the compiled agent .md files the plan's agents entry names.\n *\n * A file is removed only when its basename matches one of the entry's agent names\n * (taken from config.agents); agents absent from config are preserved. Cleans up the\n * agents directory if empty after removal. Whether to act at all is the plan's\n * decision, not this function's — no entry, no call.\n *\n * @param onRemoved - Called for each removed agent name (for logging)\n */\nasync function removeMatchingAgents(\n entry: AgentsRemoval,\n onRemoved?: (agentName: string) => void,\n): Promise<AgentRemovalResult> {\n const agentFiles = await listAgentFiles(entry.agentsDir);\n const removedNames = agentFiles\n .map((agentFile) => agentFile.replace(/\\.md$/, \"\"))\n // Array<AgentName>.includes rejects a plain string; widen the configured\n // list to readonly string[] so the on-disk basename can be tested for\n // membership in config.agents.\n .filter((agentName) => (entry.agentNames as readonly string[]).includes(agentName));\n\n for (const agentName of removedNames) {\n await remove(path.join(entry.agentsDir, `${agentName}.md`));\n onRemoved?.(agentName);\n }\n\n const dirCleaned = await removeDirIfEmpty(entry.agentsDir);\n\n return {\n removedCount: removedNames.length,\n removedNames,\n dirCleaned,\n };\n}\n\n/**\n * Uninstalls the plugins the plan's plugins entry names, by removing them from the\n * Claude CLI and deleting their local directories. The entry decides WHICH plugins go;\n * `config` only answers HOW to ask the Claude CLI — the scope its registry filed each\n * one under, per-skill where the config says, project-level otherwise.\n *\n * @param onUninstalled - Called for each successfully uninstalled plugin name (for logging)\n * @internal Exported for testing\n */\nexport async function uninstallPlugins(\n entry: PluginRemoval,\n config: ProjectConfig | null,\n projectDir: string,\n onUninstalled?: (pluginName: string) => void,\n): Promise<UninstallPluginsResult> {\n const cliAvailable = await isClaudeCLIAvailable();\n\n for (const pluginName of entry.names) {\n if (cliAvailable) {\n // Derive primary scope from per-skill config; shared helper tries both scopes\n // to handle re-scoped plugins where the registry entry may be under the\n // original scope rather than the currently-configured one.\n const skillId = parseMarketplacePluginRef(pluginName);\n const skillConfig = config?.skills.find((s) => s.id === skillId);\n const primaryScope = toClaudePluginScope(skillConfig?.scope);\n await claudePluginUninstallBestEffort(pluginName, primaryScope, projectDir);\n }\n\n const pluginPath = path.join(entry.pluginsDir, pluginName);\n await remove(pluginPath);\n onUninstalled?.(pluginName);\n }\n\n // Every iteration either completes or throws (aborting the whole uninstall),\n // so reaching this return means every plugin the plan named was removed.\n return {\n uninstalledNames: entry.names,\n totalUninstalled: entry.names.length,\n };\n}\n\n/**\n * Removes exactly the manifest files the plan's config entry names from .claude-src/,\n * then the .claude-src/ directory itself when it has nothing else left. User-owned\n * content in .claude-src/ (e.g. ejected templates) keeps the directory alive. No entry\n * means the plan promised no manifest removal, so none is made.\n */\nasync function removeConfigManifest(\n entry: ConfigManifestRemoval | undefined,\n): Promise<{ manifestRemoved: boolean; dirRemoved: boolean }> {\n if (!entry) return { manifestRemoved: false, dirRemoved: false };\n\n await Promise.all(\n entry.fileNames.map((fileName) => remove(path.join(entry.claudeSrcDir, fileName))),\n );\n\n return { manifestRemoved: true, dirRemoved: await removeDirIfEmpty(entry.claudeSrcDir) };\n}\n\n/**\n * Removes the CLI config manifest the plan named, then cleans up the emptied .claude/\n * and .claude-src/ directories.\n *\n * The directories themselves are not plan entries — they are the user's, and are removed\n * only when nothing of theirs is left in them once the CLI-managed contents are gone.\n */\nasync function cleanupEmptyDirs(\n target: Pick<UninstallTarget, \"hasClaudeDir\" | \"claudeDir\">,\n manifestEntry: ConfigManifestRemoval | undefined,\n): Promise<CleanupResult> {\n const manifest = await removeConfigManifest(manifestEntry);\n\n const claudeDirRemoved = target.hasClaudeDir && (await removeDirIfEmpty(target.claudeDir));\n // Nothing else removes .claude itself, so \"kept\" is exactly \"present but not removed\".\n const claudeDirKept =\n !claudeDirRemoved && target.hasClaudeDir && (await directoryExists(target.claudeDir));\n\n return {\n claudeDirRemoved,\n claudeSrcManifestRemoved: manifest.manifestRemoved,\n claudeSrcDirRemoved: manifest.dirRemoved,\n claudeDirKept,\n };\n}\n\nasync function listAgentFiles(agentsDir: string): Promise<string[]> {\n try {\n return await listAgentMdFiles(agentsDir);\n } catch {\n return [];\n }\n}\n"],"mappings":"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","names":[]}