agents-inc 0.150.0 → 0.152.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 (255) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/{chunk-FWT3CBLL.js → chunk-5GUOIJSG.js} +3 -7
  3. package/dist/{chunk-FWT3CBLL.js.map → chunk-5GUOIJSG.js.map} +1 -1
  4. package/dist/{chunk-MC5DUZ3V.js → chunk-5UWKOOIS.js} +6 -26
  5. package/dist/chunk-5UWKOOIS.js.map +1 -0
  6. package/dist/{chunk-O5ASLZ2K.js → chunk-76ADG7LQ.js} +1 -5
  7. package/dist/{chunk-O5ASLZ2K.js.map → chunk-76ADG7LQ.js.map} +1 -1
  8. package/dist/{chunk-7URSGJLE.js → chunk-BNSRA6HL.js} +13 -18
  9. package/dist/{chunk-7URSGJLE.js.map → chunk-BNSRA6HL.js.map} +1 -1
  10. package/dist/{chunk-FYPUUYSG.js → chunk-DTSG5XZB.js} +3 -7
  11. package/dist/{chunk-FYPUUYSG.js.map → chunk-DTSG5XZB.js.map} +1 -1
  12. package/dist/{chunk-YKKIJHZB.js → chunk-E5X6RJ4E.js} +5 -15
  13. package/dist/chunk-E5X6RJ4E.js.map +1 -0
  14. package/dist/{chunk-KH7MOIM5.js → chunk-EEPELKOM.js} +3665 -3737
  15. package/dist/chunk-EEPELKOM.js.map +1 -0
  16. package/dist/{chunk-NIKUMXE7.js → chunk-F7T5AFFN.js} +1 -5
  17. package/dist/{chunk-NIKUMXE7.js.map → chunk-F7T5AFFN.js.map} +1 -1
  18. package/dist/{chunk-4GL2F5AB.js → chunk-FVDKAVOL.js} +57 -48
  19. package/dist/chunk-FVDKAVOL.js.map +1 -0
  20. package/dist/{chunk-UZRISDBZ.js → chunk-GRVKW3CC.js} +2 -6
  21. package/dist/{chunk-UZRISDBZ.js.map → chunk-GRVKW3CC.js.map} +1 -1
  22. package/dist/{chunk-CDMHSHBN.js → chunk-IHUY4M22.js} +4 -8
  23. package/dist/{chunk-CDMHSHBN.js.map → chunk-IHUY4M22.js.map} +1 -1
  24. package/dist/{chunk-OZZGXBCN.js → chunk-IUQBOCSU.js} +1 -5
  25. package/dist/{chunk-OZZGXBCN.js.map → chunk-IUQBOCSU.js.map} +1 -1
  26. package/dist/{chunk-LYYXX2W5.js → chunk-J27W6TXS.js} +4 -6
  27. package/dist/{chunk-LYYXX2W5.js.map → chunk-J27W6TXS.js.map} +1 -1
  28. package/dist/chunk-JFLVEFFP.js +16 -0
  29. package/dist/chunk-JFLVEFFP.js.map +1 -0
  30. package/dist/{chunk-4LPJZNT7.js → chunk-KFB5CRXZ.js} +7 -12
  31. package/dist/{chunk-4LPJZNT7.js.map → chunk-KFB5CRXZ.js.map} +1 -1
  32. package/dist/{chunk-SYUOXSPU.js → chunk-KR65TPKC.js} +168 -14
  33. package/dist/chunk-KR65TPKC.js.map +1 -0
  34. package/dist/{chunk-KOPEM3Q7.js → chunk-KXYVJGJP.js} +2 -6
  35. package/dist/{chunk-KOPEM3Q7.js.map → chunk-KXYVJGJP.js.map} +1 -1
  36. package/dist/{chunk-ZHTXPFDK.js → chunk-L7SZXUBJ.js} +9 -14
  37. package/dist/{chunk-ZHTXPFDK.js.map → chunk-L7SZXUBJ.js.map} +1 -1
  38. package/dist/{chunk-LRYNF3J7.js → chunk-LASI35KT.js} +4 -9
  39. package/dist/{chunk-LRYNF3J7.js.map → chunk-LASI35KT.js.map} +1 -1
  40. package/dist/{chunk-VG2TVBFN.js → chunk-LDP5ASDM.js} +2 -6
  41. package/dist/{chunk-VG2TVBFN.js.map → chunk-LDP5ASDM.js.map} +1 -1
  42. package/dist/{chunk-GRPSDKIS.js → chunk-LZ52XEPR.js} +4 -8
  43. package/dist/{chunk-GRPSDKIS.js.map → chunk-LZ52XEPR.js.map} +1 -1
  44. package/dist/{chunk-CFQT72MJ.js → chunk-M7HO7NBK.js} +4 -8
  45. package/dist/{chunk-CFQT72MJ.js.map → chunk-M7HO7NBK.js.map} +1 -1
  46. package/dist/{chunk-XA57SX4T.js → chunk-MJ2KHG24.js} +4 -8
  47. package/dist/{chunk-XA57SX4T.js.map → chunk-MJ2KHG24.js.map} +1 -1
  48. package/dist/{chunk-DAG2ULNF.js → chunk-MM7CTTAV.js} +2 -6
  49. package/dist/chunk-MM7CTTAV.js.map +1 -0
  50. package/dist/{chunk-F3756A5B.js → chunk-MQ7FLIYS.js} +2 -6
  51. package/dist/{chunk-F3756A5B.js.map → chunk-MQ7FLIYS.js.map} +1 -1
  52. package/dist/{chunk-NUIZ6ZUO.js → chunk-MVR3SYMN.js} +6 -8
  53. package/dist/chunk-MVR3SYMN.js.map +1 -0
  54. package/dist/{chunk-ZKJAJWK6.js → chunk-MWG4VU64.js} +12 -17
  55. package/dist/{chunk-ZKJAJWK6.js.map → chunk-MWG4VU64.js.map} +1 -1
  56. package/dist/{chunk-ES3NJZON.js → chunk-NR3OZGL4.js} +1 -5
  57. package/dist/{chunk-ES3NJZON.js.map → chunk-NR3OZGL4.js.map} +1 -1
  58. package/dist/{chunk-GYG5SE2D.js → chunk-ODNDXQH2.js} +2 -6
  59. package/dist/{chunk-GYG5SE2D.js.map → chunk-ODNDXQH2.js.map} +1 -1
  60. package/dist/{chunk-2RSNKBXC.js → chunk-P44SXVH3.js} +6 -10
  61. package/dist/{chunk-2RSNKBXC.js.map → chunk-P44SXVH3.js.map} +1 -1
  62. package/dist/{chunk-3LIU2ZEF.js → chunk-PMM2MYMA.js} +3 -16
  63. package/dist/{chunk-3LIU2ZEF.js.map → chunk-PMM2MYMA.js.map} +1 -1
  64. package/dist/{chunk-6I6RZHYP.js → chunk-PZIZNMHK.js} +24 -36
  65. package/dist/chunk-PZIZNMHK.js.map +1 -0
  66. package/dist/{chunk-C55DN7GE.js → chunk-Q2KG7UV3.js} +3 -5
  67. package/dist/chunk-Q2KG7UV3.js.map +1 -0
  68. package/dist/{chunk-QQLRX4KI.js → chunk-Q45ZU6HD.js} +2 -6
  69. package/dist/{chunk-QQLRX4KI.js.map → chunk-Q45ZU6HD.js.map} +1 -1
  70. package/dist/{chunk-HIPGKIT3.js → chunk-QRDTLVXG.js} +9 -14
  71. package/dist/{chunk-HIPGKIT3.js.map → chunk-QRDTLVXG.js.map} +1 -1
  72. package/dist/{chunk-VIFZ6NFH.js → chunk-QZZJFYUQ.js} +3 -7
  73. package/dist/{chunk-VIFZ6NFH.js.map → chunk-QZZJFYUQ.js.map} +1 -1
  74. package/dist/{chunk-E4FT2KFV.js → chunk-R5NOI2LP.js} +13 -17
  75. package/dist/{chunk-E4FT2KFV.js.map → chunk-R5NOI2LP.js.map} +1 -1
  76. package/dist/{chunk-DUVWGO6E.js → chunk-RNJWAKMO.js} +3 -7
  77. package/dist/{chunk-DUVWGO6E.js.map → chunk-RNJWAKMO.js.map} +1 -1
  78. package/dist/{chunk-N4IZ6GBO.js → chunk-SBHBBZKF.js} +7 -23
  79. package/dist/chunk-SBHBBZKF.js.map +1 -0
  80. package/dist/{chunk-EN2GCPW7.js → chunk-SKQWRUPX.js} +10 -14
  81. package/dist/{chunk-EN2GCPW7.js.map → chunk-SKQWRUPX.js.map} +1 -1
  82. package/dist/{chunk-DDG4F3FE.js → chunk-STMHDOZD.js} +4 -21
  83. package/dist/chunk-STMHDOZD.js.map +1 -0
  84. package/dist/{chunk-5K5RBRTD.js → chunk-SX5H6TSC.js} +7 -11
  85. package/dist/chunk-SX5H6TSC.js.map +1 -0
  86. package/dist/{chunk-RBHYLCUB.js → chunk-TJJPWUMA.js} +2 -6
  87. package/dist/{chunk-RBHYLCUB.js.map → chunk-TJJPWUMA.js.map} +1 -1
  88. package/dist/{chunk-IOJR5TOY.js → chunk-TSIU7DME.js} +1 -5
  89. package/dist/{chunk-IOJR5TOY.js.map → chunk-TSIU7DME.js.map} +1 -1
  90. package/dist/{chunk-RP7R73JO.js → chunk-TUPYW2IQ.js} +3 -7
  91. package/dist/{chunk-RP7R73JO.js.map → chunk-TUPYW2IQ.js.map} +1 -1
  92. package/dist/{chunk-YU2VGX5R.js → chunk-UBEDZ4FD.js} +1 -8
  93. package/dist/{chunk-YU2VGX5R.js.map → chunk-UBEDZ4FD.js.map} +1 -1
  94. package/dist/{chunk-VEP23B5W.js → chunk-VASLW636.js} +1 -5
  95. package/dist/{chunk-VEP23B5W.js.map → chunk-VASLW636.js.map} +1 -1
  96. package/dist/{chunk-PG4G4IIK.js → chunk-VY6MNOXL.js} +2 -6
  97. package/dist/{chunk-PG4G4IIK.js.map → chunk-VY6MNOXL.js.map} +1 -1
  98. package/dist/{chunk-IHO75PMZ.js → chunk-WBCPLH66.js} +15 -13
  99. package/dist/chunk-WBCPLH66.js.map +1 -0
  100. package/dist/{chunk-DJAZE4PD.js → chunk-WKTHWQKM.js} +297 -302
  101. package/dist/chunk-WKTHWQKM.js.map +1 -0
  102. package/dist/{chunk-RJN7W2C7.js → chunk-XHUODHZ4.js} +19 -25
  103. package/dist/{chunk-RJN7W2C7.js.map → chunk-XHUODHZ4.js.map} +1 -1
  104. package/dist/{chunk-KIR7VYQD.js → chunk-XVAQG2CV.js} +1 -5
  105. package/dist/{chunk-KIR7VYQD.js.map → chunk-XVAQG2CV.js.map} +1 -1
  106. package/dist/{chunk-P3PN5SVI.js → chunk-ZL7PFNHN.js} +2 -6
  107. package/dist/{chunk-P3PN5SVI.js.map → chunk-ZL7PFNHN.js.map} +1 -1
  108. package/dist/{chunk-ZDLTLNU2.js → chunk-ZPPHXXAP.js} +9 -15
  109. package/dist/{chunk-ZDLTLNU2.js.map → chunk-ZPPHXXAP.js.map} +1 -1
  110. package/dist/commands/build/marketplace.js +10 -15
  111. package/dist/commands/build/marketplace.js.map +1 -1
  112. package/dist/commands/build/plugins.js +9 -14
  113. package/dist/commands/build/plugins.js.map +1 -1
  114. package/dist/commands/compile.js +14 -19
  115. package/dist/commands/compile.js.map +1 -1
  116. package/dist/commands/doctor.js +13 -18
  117. package/dist/commands/doctor.js.map +1 -1
  118. package/dist/commands/edit.js +51 -55
  119. package/dist/commands/edit.js.map +1 -1
  120. package/dist/commands/eject.js +13 -18
  121. package/dist/commands/eject.js.map +1 -1
  122. package/dist/commands/import/skill.js +9 -14
  123. package/dist/commands/import/skill.js.map +1 -1
  124. package/dist/commands/init.js +50 -51
  125. package/dist/commands/list.js +14 -16
  126. package/dist/commands/list.js.map +1 -1
  127. package/dist/commands/new/agent.js +12 -16
  128. package/dist/commands/new/agent.js.map +1 -1
  129. package/dist/commands/new/marketplace.js +15 -20
  130. package/dist/commands/new/marketplace.js.map +1 -1
  131. package/dist/commands/new/skill.js +11 -13
  132. package/dist/commands/search.js +14 -19
  133. package/dist/commands/search.js.map +1 -1
  134. package/dist/commands/uninstall.js +17 -21
  135. package/dist/commands/uninstall.js.map +1 -1
  136. package/dist/commands/update.js +17 -21
  137. package/dist/commands/update.js.map +1 -1
  138. package/dist/commands/validate.js +10 -16
  139. package/dist/commands/validate.js.map +1 -1
  140. package/dist/components/common/confirm.js +1 -2
  141. package/dist/components/common/prompt-confirm.js +2 -2
  142. package/dist/components/common/select-list.js +3 -4
  143. package/dist/components/common/spinner.js +1 -2
  144. package/dist/components/wizard/category-grid.js +8 -9
  145. package/dist/components/wizard/checkbox-grid.js +6 -7
  146. package/dist/components/wizard/domain-selection.js +14 -15
  147. package/dist/components/wizard/run-wizard-session.js +40 -40
  148. package/dist/components/wizard/scroll-affordance.js +2 -3
  149. package/dist/components/wizard/search-modal.js +6 -7
  150. package/dist/components/wizard/selection-card.js +2 -3
  151. package/dist/components/wizard/skill-agent-summary.js +8 -9
  152. package/dist/components/wizard/source-grid.js +13 -14
  153. package/dist/components/wizard/stack-selection.js +12 -13
  154. package/dist/components/wizard/step-agents.js +14 -15
  155. package/dist/components/wizard/step-build.js +14 -15
  156. package/dist/components/wizard/step-confirm.js +13 -14
  157. package/dist/components/wizard/step-settings.js +11 -12
  158. package/dist/components/wizard/step-sources.js +20 -21
  159. package/dist/components/wizard/step-stack.js +13 -14
  160. package/dist/components/wizard/summary-panel.js +12 -13
  161. package/dist/components/wizard/toast.js +2 -3
  162. package/dist/components/wizard/wizard-layout.js +18 -19
  163. package/dist/components/wizard/wizard-tabs.js +8 -9
  164. package/dist/components/wizard/wizard.js +38 -39
  165. package/dist/config-exports.js +1 -7
  166. package/dist/config-exports.js.map +1 -1
  167. package/dist/copy-local-skills-6EMVN7RB.js +14 -0
  168. package/dist/hooks/init.js +50 -54
  169. package/dist/hooks/init.js.map +1 -1
  170. package/dist/index.js +0 -4
  171. package/dist/index.js.map +1 -1
  172. package/dist/load-agent-defs-BWOUVEAR.js +15 -0
  173. package/dist/{loader-E2ERJYVA.js → loader-5JP4S7CJ.js} +4 -5
  174. package/dist/recompile-project-agents-6DL45TDI.js +19 -0
  175. package/dist/{source-loader-VVHMQEX5.js → source-loader-MZYCPL2S.js} +7 -8
  176. package/dist/stores/wizard-store.js +7 -8
  177. package/package.json +22 -21
  178. package/dist/chunk-4GL2F5AB.js.map +0 -1
  179. package/dist/chunk-5K5RBRTD.js.map +0 -1
  180. package/dist/chunk-6I6RZHYP.js.map +0 -1
  181. package/dist/chunk-C55DN7GE.js.map +0 -1
  182. package/dist/chunk-DAG2ULNF.js.map +0 -1
  183. package/dist/chunk-DDG4F3FE.js.map +0 -1
  184. package/dist/chunk-DIBCRIMR.js +0 -36
  185. package/dist/chunk-DIBCRIMR.js.map +0 -1
  186. package/dist/chunk-DJAZE4PD.js.map +0 -1
  187. package/dist/chunk-EKWAUOQB.js +0 -96
  188. package/dist/chunk-EKWAUOQB.js.map +0 -1
  189. package/dist/chunk-I3XKEGHM.js +0 -16383
  190. package/dist/chunk-I3XKEGHM.js.map +0 -1
  191. package/dist/chunk-IHO75PMZ.js.map +0 -1
  192. package/dist/chunk-K3OU6TGX.js +0 -77
  193. package/dist/chunk-K3OU6TGX.js.map +0 -1
  194. package/dist/chunk-KH7MOIM5.js.map +0 -1
  195. package/dist/chunk-KSZ6PCY4.js +0 -43
  196. package/dist/chunk-KSZ6PCY4.js.map +0 -1
  197. package/dist/chunk-MC5DUZ3V.js.map +0 -1
  198. package/dist/chunk-N4IZ6GBO.js.map +0 -1
  199. package/dist/chunk-NUIZ6ZUO.js.map +0 -1
  200. package/dist/chunk-OA5SUEQD.js +0 -181
  201. package/dist/chunk-OA5SUEQD.js.map +0 -1
  202. package/dist/chunk-P56WJ5FA.js +0 -50
  203. package/dist/chunk-P56WJ5FA.js.map +0 -1
  204. package/dist/chunk-SYUOXSPU.js.map +0 -1
  205. package/dist/chunk-THKIOI32.js +0 -939
  206. package/dist/chunk-THKIOI32.js.map +0 -1
  207. package/dist/chunk-V7QOSGQA.js +0 -298
  208. package/dist/chunk-V7QOSGQA.js.map +0 -1
  209. package/dist/chunk-YKKIJHZB.js.map +0 -1
  210. package/dist/components/common/confirm.test.js +0 -203
  211. package/dist/components/common/confirm.test.js.map +0 -1
  212. package/dist/components/wizard/category-grid.test.js +0 -1253
  213. package/dist/components/wizard/category-grid.test.js.map +0 -1
  214. package/dist/components/wizard/checkbox-grid.test.js +0 -264
  215. package/dist/components/wizard/checkbox-grid.test.js.map +0 -1
  216. package/dist/components/wizard/search-modal.test.js +0 -212
  217. package/dist/components/wizard/search-modal.test.js.map +0 -1
  218. package/dist/components/wizard/source-grid.test.js +0 -1094
  219. package/dist/components/wizard/source-grid.test.js.map +0 -1
  220. package/dist/components/wizard/step-agents.test.js +0 -204
  221. package/dist/components/wizard/step-agents.test.js.map +0 -1
  222. package/dist/components/wizard/step-build.test.js +0 -552
  223. package/dist/components/wizard/step-build.test.js.map +0 -1
  224. package/dist/components/wizard/step-confirm.test.js +0 -744
  225. package/dist/components/wizard/step-confirm.test.js.map +0 -1
  226. package/dist/components/wizard/step-settings.test.js +0 -244
  227. package/dist/components/wizard/step-settings.test.js.map +0 -1
  228. package/dist/components/wizard/step-sources.test.js +0 -155
  229. package/dist/components/wizard/step-sources.test.js.map +0 -1
  230. package/dist/components/wizard/step-stack.test.js +0 -262
  231. package/dist/components/wizard/step-stack.test.js.map +0 -1
  232. package/dist/components/wizard/summary-panel.test.js +0 -317
  233. package/dist/components/wizard/summary-panel.test.js.map +0 -1
  234. package/dist/components/wizard/wizard-layout.test.js +0 -200
  235. package/dist/components/wizard/wizard-layout.test.js.map +0 -1
  236. package/dist/components/wizard/wizard-tabs.test.js +0 -290
  237. package/dist/components/wizard/wizard-tabs.test.js.map +0 -1
  238. package/dist/copy-local-skills-CA7P73RZ.js +0 -15
  239. package/dist/dist-VNJNNJK7.js +0 -550
  240. package/dist/dist-VNJNNJK7.js.map +0 -1
  241. package/dist/load-agent-defs-6MAY5ABI.js +0 -16
  242. package/dist/magic-string.es-5TV73NJD.js +0 -1316
  243. package/dist/magic-string.es-5TV73NJD.js.map +0 -1
  244. package/dist/recompile-project-agents-VYQJ6UZB.js +0 -20
  245. package/dist/source-manager-TPDXV5FO.js +0 -18
  246. package/dist/source-manager-TPDXV5FO.js.map +0 -1
  247. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js +0 -118
  248. package/dist/stores/d227-same-scope-tombstone-duplicate.test.js.map +0 -1
  249. package/dist/stores/wizard-store.test.js +0 -3053
  250. package/dist/stores/wizard-store.test.js.map +0 -1
  251. /package/dist/{copy-local-skills-CA7P73RZ.js.map → copy-local-skills-6EMVN7RB.js.map} +0 -0
  252. /package/dist/{load-agent-defs-6MAY5ABI.js.map → load-agent-defs-BWOUVEAR.js.map} +0 -0
  253. /package/dist/{loader-E2ERJYVA.js.map → loader-5JP4S7CJ.js.map} +0 -0
  254. /package/dist/{recompile-project-agents-VYQJ6UZB.js.map → recompile-project-agents-6DL45TDI.js.map} +0 -0
  255. /package/dist/{source-loader-VVHMQEX5.js.map → source-loader-MZYCPL2S.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/import/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { fetchFromSource } from \"../../lib/loading/index.js\";\nimport { importedSkillMetadataSchema } from \"../../lib/schemas.js\";\nimport { writeMetadataYaml } from \"../../lib/skills/skill-metadata.js\";\nimport { toTitleCase } from \"../../utils/string.js\";\nimport { getCurrentDate, computeFileHash } from \"../../lib/versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n listDirectories,\n readFile,\n ensureDir,\n} from \"../../utils/fs.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport {\n DEFAULT_SKILLS_SUBDIR,\n GITHUB_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { stripYamlSchemaComment } from \"../../utils/yaml-schema.js\";\nimport { IMPORT_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { STATUS_MESSAGES, INFO_MESSAGES } from \"../../utils/messages.js\";\n\nexport default class ImportSkill extends BaseCommand {\n static summary = \"Import a skill from a third-party GitHub repository\";\n static description =\n \"Download and import skills from external GitHub repositories into your local \" +\n \".claude/skills/ directory. Supports importing specific skills or listing available skills.\";\n\n static examples = [\n {\n description: \"List available skills from a repository\",\n command: \"<%= config.bin %> import skill github:vercel-labs/agent-skills --list\",\n },\n {\n description: \"Import a specific skill\",\n command:\n \"<%= config.bin %> import skill github:vercel-labs/agent-skills --skill react-best-practices\",\n },\n {\n description: \"Import all skills from a repository\",\n command: \"<%= config.bin %> import skill github:vercel-labs/agent-skills --all\",\n },\n ];\n\n static args = {\n source: Args.string({\n description:\n \"GitHub repository source (github:owner/repo, https://github.com/owner/repo, or owner/repo)\",\n required: true,\n }),\n };\n\n // Override parent baseFlags to drop --source (positional source arg IS the source)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\n skill: Flags.string({\n char: \"n\",\n description: \"Name of the specific skill to import\",\n required: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Import all skills from the repository\",\n default: false,\n }),\n list: Flags.boolean({\n char: \"l\",\n description: \"List available skills without importing\",\n default: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skills\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(ImportSkill);\n const projectDir = process.cwd();\n\n this.printHeader();\n this.validateFlags(flags);\n\n const { gigetSource, displaySource } = parseGitHubSource(args.source);\n this.log(`Source: ${displaySource}`);\n\n const repoPath = await this.fetchRepository(gigetSource, args.source);\n const skillsDir = this.resolveSkillsDir(repoPath);\n const availableSkills = await this.discoverAndValidate(skillsDir);\n\n if (flags.list) {\n this.listAvailableSkills(availableSkills);\n return;\n }\n\n const skillsToImport = this.resolveSkillsToImport(flags, availableSkills);\n await this.importSkills(skillsToImport, skillsDir, projectDir, displaySource, flags.force);\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Import Third-Party Skill\");\n this.log(\"\");\n }\n\n private validateFlags(flags: { list: boolean; skill?: string; all: boolean }): void {\n if (!flags.list && !flags.skill && !flags.all) {\n this.error(\"Please specify --skill <name>, --all, or --list to list available skills\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (flags.skill && flags.all) {\n this.error(\"Cannot use --skill and --all together\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n }\n\n private async fetchRepository(gigetSource: string, sourceArg: string): Promise<string> {\n this.log(STATUS_MESSAGES.FETCHING_REPOSITORY);\n\n try {\n const result = await fetchSkillSource({ gigetSource });\n this.log(result.fromCache ? \"Using cached source\" : \"Downloaded fresh copy\");\n return result.path;\n } catch (error) {\n this.error(`Failed to fetch ${sourceArg}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.NETWORK_ERROR,\n });\n }\n }\n\n private resolveSkillsDir(repoPath: string): string {\n return path.resolve(path.join(repoPath, DEFAULT_SKILLS_SUBDIR));\n }\n\n private async discoverAndValidate(skillsDir: string): Promise<string[]> {\n if (!(await directoryExists(skillsDir))) {\n this.error(\n `Skills directory not found: ${DEFAULT_SKILLS_SUBDIR}\\n` +\n `The repository doesn't have a '${DEFAULT_SKILLS_SUBDIR}' directory.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const availableSkills = await discoverValidSkills(skillsDir);\n\n if (availableSkills.length === 0) {\n this.error(\n `No valid skills found in ${DEFAULT_SKILLS_SUBDIR}/\\nSkills must have a SKILL.md file.`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n return availableSkills;\n }\n\n private listAvailableSkills(skills: string[]): void {\n this.log(\"\");\n this.log(`Available skills (${skills.length}):`);\n this.log(\"\");\n for (const skill of skills) {\n this.log(` - ${skill}`);\n }\n this.log(\"\");\n this.log(\"Use --skill <name> to import a specific skill, or --all to import all.\");\n }\n\n private resolveSkillsToImport(\n flags: { all: boolean; skill?: string },\n availableSkills: string[],\n ): string[] {\n if (flags.all) {\n return availableSkills;\n }\n\n if (flags.skill) {\n if (!availableSkills.includes(flags.skill)) {\n this.error(\n `Skill '${flags.skill}' not found in repository.\\n` +\n `Available skills: ${availableSkills.join(\", \")}\\n` +\n `Use --list to see all available skills.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n return [flags.skill];\n }\n\n return [];\n }\n\n private async importSkills(\n skillsToImport: string[],\n skillsDir: string,\n projectDir: string,\n displaySource: string,\n force: boolean,\n ): Promise<void> {\n const destDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n\n this.log(\"\");\n this.log(`Importing ${skillsToImport.length} skill(s)...`);\n\n let imported = 0;\n let skipped = 0;\n\n for (const skillName of skillsToImport) {\n const sourcePath = path.join(skillsDir, skillName);\n const destPath = path.join(destDir, skillName);\n\n if (await directoryExists(destPath)) {\n if (!force) {\n this.warn(`Skipping '${skillName}': already exists. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n\n try {\n await importSkillFromSource({ sourcePath, destPath, skillName, displaySource });\n this.logSuccess(`Imported: ${skillName}`);\n imported++;\n } catch (error) {\n this.warn(`Failed to import '${skillName}': ${getErrorMessage(error)}`);\n skipped++;\n }\n }\n\n this.log(\"\");\n this.logSuccess(`Import complete: ${imported} imported, ${skipped} skipped`);\n this.log(`Skills location: ${destDir}`);\n this.log(\"\");\n this.log(INFO_MESSAGES.RUN_COMPILE);\n this.log(\"\");\n }\n}\n\ntype ImportedForkedFromMetadata = {\n source: string;\n skillName: string;\n contentHash: string;\n date: string;\n};\n\ntype SkillMetadata = {\n forkedFrom?: ImportedForkedFromMetadata;\n [key: string]: unknown;\n};\n\ntype ParsedGitHubSource = {\n gigetSource: string;\n displaySource: string;\n};\n\ntype FetchSourceOptions = {\n gigetSource: string;\n};\n\ntype FetchedSource = {\n path: string;\n fromCache: boolean;\n};\n\ntype ImportSkillOptions = {\n sourcePath: string;\n destPath: string;\n skillName: string;\n displaySource: string;\n};\n\n/**\n * Parses various GitHub URL formats into a normalized giget source string\n * and a human-readable display URL.\n *\n * Supports: `https://github.com/owner/repo`, `github:owner/repo`,\n * `gh:owner/repo`, and bare `owner/repo` formats.\n */\nfunction parseGitHubSource(source: string): ParsedGitHubSource {\n if (source.startsWith(GITHUB_SOURCE.HTTPS_PREFIX)) {\n const path = source.replace(GITHUB_SOURCE.HTTPS_PREFIX, \"\");\n return {\n gigetSource: `${GITHUB_SOURCE.GITHUB_PREFIX}${path}`,\n displaySource: source,\n };\n }\n\n if (\n source.startsWith(GITHUB_SOURCE.GITHUB_PREFIX) ||\n source.startsWith(GITHUB_SOURCE.GH_PREFIX)\n ) {\n const normalized = source.startsWith(GITHUB_SOURCE.GH_PREFIX)\n ? GITHUB_SOURCE.GITHUB_PREFIX + source.slice(GITHUB_SOURCE.GH_PREFIX.length)\n : source;\n return {\n gigetSource: normalized,\n displaySource: `${GITHUB_SOURCE.HTTPS_PREFIX}${normalized.replace(GITHUB_SOURCE.GITHUB_PREFIX, \"\")}`,\n };\n }\n\n if (source.includes(\"/\") && !source.includes(\":\")) {\n return {\n gigetSource: `${GITHUB_SOURCE.GITHUB_PREFIX}${source}`,\n displaySource: `${GITHUB_SOURCE.HTTPS_PREFIX}${source}`,\n };\n }\n\n return {\n gigetSource: source,\n displaySource: source,\n };\n}\n\n/**\n * Fetches a source repository using giget. Wraps `fetchFromSource` from the\n * loading layer.\n */\nasync function fetchSkillSource(options: FetchSourceOptions): Promise<FetchedSource> {\n const result = await fetchFromSource(options.gigetSource);\n return { path: result.path, fromCache: result.fromCache };\n}\n\n/**\n * Discovers valid skill directories within a source path by checking\n * for the presence of SKILL.md files.\n *\n * @returns Sorted list of directory names that contain a SKILL.md file.\n */\nasync function discoverValidSkills(skillsDir: string): Promise<string[]> {\n const skillDirs = await listDirectories(skillsDir);\n const checks = await Promise.all(\n skillDirs.map(async (skillDir) => ({\n skillDir,\n hasSkillMd: await fileExists(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD)),\n })),\n );\n return checks\n .filter((c) => c.hasSkillMd)\n .map((c) => c.skillDir)\n .sort();\n}\n\n/**\n * Imports a single skill from a source directory into the destination.\n *\n * Validates that the source skill has a SKILL.md file, copies the directory,\n * and injects `forkedFrom` metadata into the destination's metadata.yaml.\n *\n * @throws {Error} If the source skill is missing a SKILL.md file.\n */\nasync function importSkillFromSource(options: ImportSkillOptions): Promise<void> {\n const { sourcePath, destPath, skillName, displaySource } = options;\n const skillMdPath = path.join(sourcePath, STANDARD_FILES.SKILL_MD);\n\n if (!(await fileExists(skillMdPath))) {\n throw new Error(\n `Missing required SKILL.md file at ${skillMdPath}\\n` +\n `Every skill must have a SKILL.md file containing the skill's prompt content.\\n` +\n `Create one with:\\n` +\n ` echo \"# ${skillName}\" > ${path.join(sourcePath, STANDARD_FILES.SKILL_MD)}`,\n );\n }\n\n const contentHash = await computeFileHash(skillMdPath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectImportedForkedFromMetadata(destPath, skillName, displaySource, contentHash);\n}\n\n/**\n * Injects `forkedFrom` metadata into a third-party imported skill's metadata.yaml.\n *\n * Handles three cases:\n * 1. Existing metadata.yaml -- preserves fields, adds/overwrites forkedFrom\n * 2. Existing metadata.json -- converts to YAML, adds forkedFrom\n * 3. No metadata file -- creates minimal metadata.yaml with forkedFrom\n *\n * Different from `injectForkedFromMetadata` in `skill-metadata.ts` which tracks\n * internal marketplace fork lineage using `skillId`. This function tracks\n * third-party imports using `source` + `skillName`.\n */\nasync function injectImportedForkedFromMetadata(\n destPath: string,\n skillName: string,\n source: string,\n contentHash: string,\n): Promise<void> {\n const forkedFrom: ImportedForkedFromMetadata = {\n source,\n skillName,\n contentHash,\n date: getCurrentDate(),\n };\n\n const yamlPath = path.join(destPath, STANDARD_FILES.METADATA_YAML);\n const jsonPath = path.join(destPath, STANDARD_FILES.METADATA_JSON);\n\n if (await fileExists(yamlPath)) {\n return mergeForkedFromIntoYaml(yamlPath, forkedFrom);\n }\n if (await fileExists(jsonPath)) {\n return convertJsonToYamlWithForkedFrom(jsonPath, yamlPath, forkedFrom);\n }\n return createMinimalMetadata(yamlPath, skillName, forkedFrom);\n}\n\nasync function mergeForkedFromIntoYaml(\n yamlPath: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const rawContent = await readFile(yamlPath);\n const { schemaComment, yamlContent } = stripYamlSchemaComment(rawContent);\n\n const raw = parseYaml(yamlContent);\n const parseResult = importedSkillMetadataSchema.safeParse(raw);\n if (!parseResult.success) {\n warn(\n `Malformed metadata.yaml at ${yamlPath} — existing fields may be lost\\n` +\n ` Validation errors: ${parseResult.error.issues.map((i) => i.message).join(\", \")}\\n` +\n ` Expected fields: displayName (string), cliDescription (string), category (string)\\n` +\n ` Validate your YAML syntax at https://yamllint.com`,\n );\n }\n const metadata: SkillMetadata = {\n ...(parseResult.success ? parseResult.data : {}),\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, metadata, schemaComment);\n}\n\nasync function convertJsonToYamlWithForkedFrom(\n jsonPath: string,\n yamlPath: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const rawContent = await readFile(jsonPath);\n let jsonParsed: unknown;\n try {\n jsonParsed = JSON.parse(rawContent);\n } catch {\n warn(\n `Malformed JSON in ${jsonPath} — skipping metadata injection\\n` +\n ` Common issues: trailing commas, unquoted keys, single quotes instead of double quotes\\n` +\n ` Validate your JSON at https://jsonlint.com`,\n );\n return;\n }\n const jsonResult = importedSkillMetadataSchema.safeParse(jsonParsed);\n const metadata: SkillMetadata = {\n ...(jsonResult.success ? jsonResult.data : {}),\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, metadata);\n}\n\nasync function createMinimalMetadata(\n yamlPath: string,\n skillName: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const minimalMetadata: SkillMetadata = {\n displayName: toTitleCase(skillName),\n cliDescription: \"Imported from third-party repository\",\n category: IMPORT_DEFAULTS.CATEGORY,\n author: IMPORT_DEFAULTS.AUTHOR,\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, minimalMetadata);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAO,UAAU;AACjB,SAAS,SAAS,iBAAiB;AA4BnC,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAGF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAAA,IACZ,QAAQ,KAAK,OAAO;AAAA,MAClB,aACE;AAAA,MACF,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,YAAY,CAAC;AAAA,EAEpB,OAAO,QAAQ;AAAA,IACb,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,KAAK,MAAM,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,OAAO,MAAM,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,YAAW;AACpD,UAAM,aAAa,QAAQ,IAAI;AAE/B,SAAK,YAAY;AACjB,SAAK,cAAc,KAAK;AAExB,UAAM,EAAE,aAAa,cAAc,IAAI,kBAAkB,KAAK,MAAM;AACpE,SAAK,IAAI,WAAW,aAAa,EAAE;AAEnC,UAAM,WAAW,MAAM,KAAK,gBAAgB,aAAa,KAAK,MAAM;AACpE,UAAM,YAAY,KAAK,iBAAiB,QAAQ;AAChD,UAAM,kBAAkB,MAAM,KAAK,oBAAoB,SAAS;AAEhE,QAAI,MAAM,MAAM;AACd,WAAK,oBAAoB,eAAe;AACxC;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,sBAAsB,OAAO,eAAe;AACxE,UAAM,KAAK,aAAa,gBAAgB,WAAW,YAAY,eAAe,MAAM,KAAK;AAAA,EAC3F;AAAA,EAEQ,cAAoB;AAC1B,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,0BAA0B;AACnC,SAAK,IAAI,EAAE;AAAA,EACb;AAAA,EAEQ,cAAc,OAA8D;AAClF,QAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,SAAS,CAAC,MAAM,KAAK;AAC7C,WAAK,MAAM,4EAA4E;AAAA,QACrF,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,SAAS,MAAM,KAAK;AAC5B,WAAK,MAAM,yCAAyC;AAAA,QAClD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,aAAqB,WAAoC;AACrF,SAAK,IAAI,gBAAgB,mBAAmB;AAE5C,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,EAAE,YAAY,CAAC;AACrD,WAAK,IAAI,OAAO,YAAY,wBAAwB,uBAAuB;AAC3E,aAAO,OAAO;AAAA,IAChB,SAAS,OAAO;AACd,WAAK,MAAM,mBAAmB,SAAS,KAAK,gBAAgB,KAAK,CAAC,IAAI;AAAA,QACpE,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB,UAA0B;AACjD,WAAO,KAAK,QAAQ,KAAK,KAAK,UAAU,qBAAqB,CAAC;AAAA,EAChE;AAAA,EAEA,MAAc,oBAAoB,WAAsC;AACtE,QAAI,CAAE,MAAM,gBAAgB,SAAS,GAAI;AACvC,WAAK;AAAA,QACH,+BAA+B,qBAAqB;AAAA,iCAChB,qBAAqB;AAAA,QACzD,EAAE,MAAM,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM,oBAAoB,SAAS;AAE3D,QAAI,gBAAgB,WAAW,GAAG;AAChC,WAAK;AAAA,QACH,4BAA4B,qBAAqB;AAAA;AAAA,QACjD,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAwB;AAClD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,qBAAqB,OAAO,MAAM,IAAI;AAC/C,SAAK,IAAI,EAAE;AACX,eAAW,SAAS,QAAQ;AAC1B,WAAK,IAAI,OAAO,KAAK,EAAE;AAAA,IACzB;AACA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,wEAAwE;AAAA,EACnF;AAAA,EAEQ,sBACN,OACA,iBACU;AACV,QAAI,MAAM,KAAK;AACb,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,OAAO;AACf,UAAI,CAAC,gBAAgB,SAAS,MAAM,KAAK,GAAG;AAC1C,aAAK;AAAA,UACH,UAAU,MAAM,KAAK;AAAA,oBACE,gBAAgB,KAAK,IAAI,CAAC;AAAA;AAAA,UAEjD,EAAE,MAAM,WAAW,aAAa;AAAA,QAClC;AAAA,MACF;AACA,aAAO,CAAC,MAAM,KAAK;AAAA,IACrB;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAc,aACZ,gBACA,WACA,YACA,eACA,OACe;AACf,UAAM,UAAU,KAAK,KAAK,YAAY,iBAAiB;AAEvD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,aAAa,eAAe,MAAM,cAAc;AAEzD,QAAI,WAAW;AACf,QAAI,UAAU;AAEd,eAAW,aAAa,gBAAgB;AACtC,YAAM,aAAa,KAAK,KAAK,WAAW,SAAS;AACjD,YAAM,WAAW,KAAK,KAAK,SAAS,SAAS;AAE7C,UAAI,MAAM,gBAAgB,QAAQ,GAAG;AACnC,YAAI,CAAC,OAAO;AACV,eAAK,KAAK,aAAa,SAAS,8CAA8C;AAC9E;AACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,sBAAsB,EAAE,YAAY,UAAU,WAAW,cAAc,CAAC;AAC9E,aAAK,WAAW,aAAa,SAAS,EAAE;AACxC;AAAA,MACF,SAAS,OAAO;AACd,aAAK,KAAK,qBAAqB,SAAS,MAAM,gBAAgB,KAAK,CAAC,EAAE;AACtE;AAAA,MACF;AAAA,IACF;AAEA,SAAK,IAAI,EAAE;AACX,SAAK,WAAW,oBAAoB,QAAQ,cAAc,OAAO,UAAU;AAC3E,SAAK,IAAI,oBAAoB,OAAO,EAAE;AACtC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,cAAc,WAAW;AAClC,SAAK,IAAI,EAAE;AAAA,EACb;AACF;AA0CA,SAAS,kBAAkB,QAAoC;AAC7D,MAAI,OAAO,WAAW,cAAc,YAAY,GAAG;AACjD,UAAMA,QAAO,OAAO,QAAQ,cAAc,cAAc,EAAE;AAC1D,WAAO;AAAA,MACL,aAAa,GAAG,cAAc,aAAa,GAAGA,KAAI;AAAA,MAClD,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,MACE,OAAO,WAAW,cAAc,aAAa,KAC7C,OAAO,WAAW,cAAc,SAAS,GACzC;AACA,UAAM,aAAa,OAAO,WAAW,cAAc,SAAS,IACxD,cAAc,gBAAgB,OAAO,MAAM,cAAc,UAAU,MAAM,IACzE;AACJ,WAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe,GAAG,cAAc,YAAY,GAAG,WAAW,QAAQ,cAAc,eAAe,EAAE,CAAC;AAAA,IACpG;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AACjD,WAAO;AAAA,MACL,aAAa,GAAG,cAAc,aAAa,GAAG,MAAM;AAAA,MACpD,eAAe,GAAG,cAAc,YAAY,GAAG,MAAM;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAMA,eAAe,iBAAiB,SAAqD;AACnF,QAAM,SAAS,MAAM,gBAAgB,QAAQ,WAAW;AACxD,SAAO,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU;AAC1D;AAQA,eAAe,oBAAoB,WAAsC;AACvE,QAAM,YAAY,MAAM,gBAAgB,SAAS;AACjD,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,UAAU,IAAI,OAAO,cAAc;AAAA,MACjC;AAAA,MACA,YAAY,MAAM,WAAW,KAAK,KAAK,WAAW,UAAU,eAAe,QAAQ,CAAC;AAAA,IACtF,EAAE;AAAA,EACJ;AACA,SAAO,OACJ,OAAO,CAAC,MAAM,EAAE,UAAU,EAC1B,IAAI,CAAC,MAAM,EAAE,QAAQ,EACrB,KAAK;AACV;AAUA,eAAe,sBAAsB,SAA4C;AAC/E,QAAM,EAAE,YAAY,UAAU,WAAW,cAAc,IAAI;AAC3D,QAAM,cAAc,KAAK,KAAK,YAAY,eAAe,QAAQ;AAEjE,MAAI,CAAE,MAAM,WAAW,WAAW,GAAI;AACpC,UAAM,IAAI;AAAA,MACR,qCAAqC,WAAW;AAAA;AAAA;AAAA,YAGjC,SAAS,OAAO,KAAK,KAAK,YAAY,eAAe,QAAQ,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,gBAAgB,WAAW;AAErD,QAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC;AACtC,QAAM,KAAK,YAAY,QAAQ;AAE/B,QAAM,iCAAiC,UAAU,WAAW,eAAe,WAAW;AACxF;AAcA,eAAe,iCACb,UACA,WACA,QACA,aACe;AACf,QAAM,aAAyC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,eAAe;AAAA,EACvB;AAEA,QAAM,WAAW,KAAK,KAAK,UAAU,eAAe,aAAa;AACjE,QAAM,WAAW,KAAK,KAAK,UAAU,eAAe,aAAa;AAEjE,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,WAAO,wBAAwB,UAAU,UAAU;AAAA,EACrD;AACA,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,WAAO,gCAAgC,UAAU,UAAU,UAAU;AAAA,EACvE;AACA,SAAO,sBAAsB,UAAU,WAAW,UAAU;AAC9D;AAEA,eAAe,wBACb,UACA,YACe;AACf,QAAM,aAAa,MAAM,SAAS,QAAQ;AAC1C,QAAM,EAAE,eAAe,YAAY,IAAI,uBAAuB,UAAU;AAExE,QAAM,MAAM,UAAU,WAAW;AACjC,QAAM,cAAc,4BAA4B,UAAU,GAAG;AAC7D,MAAI,CAAC,YAAY,SAAS;AACxB;AAAA,MACE,8BAA8B,QAAQ;AAAA,uBACZ,YAAY,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAGrF;AAAA,EACF;AACA,QAAM,WAA0B;AAAA,IAC9B,GAAI,YAAY,UAAU,YAAY,OAAO,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,kBAAkB,UAAU,UAAU,aAAa;AAC3D;AAEA,eAAe,gCACb,UACA,UACA,YACe;AACf,QAAM,aAAa,MAAM,SAAS,QAAQ;AAC1C,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,UAAU;AAAA,EACpC,QAAQ;AACN;AAAA,MACE,qBAAqB,QAAQ;AAAA;AAAA;AAAA,IAG/B;AACA;AAAA,EACF;AACA,QAAM,aAAa,4BAA4B,UAAU,UAAU;AACnE,QAAM,WAA0B;AAAA,IAC9B,GAAI,WAAW,UAAU,WAAW,OAAO,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,QAAM,kBAAkB,UAAU,QAAQ;AAC5C;AAEA,eAAe,sBACb,UACA,WACA,YACe;AACf,QAAM,kBAAiC;AAAA,IACrC,aAAa,YAAY,SAAS;AAAA,IAClC,gBAAgB;AAAA,IAChB,UAAU,gBAAgB;AAAA,IAC1B,QAAQ,gBAAgB;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,kBAAkB,UAAU,eAAe;AACnD;","names":["path"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/import/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { fetchFromSource } from \"../../lib/loading/index.js\";\nimport { importedSkillMetadataSchema } from \"../../lib/schemas.js\";\nimport { writeMetadataYaml } from \"../../lib/skills/skill-metadata.js\";\nimport { toTitleCase } from \"../../utils/string.js\";\nimport { getCurrentDate, computeFileHash } from \"../../lib/versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n listDirectories,\n readFile,\n ensureDir,\n} from \"../../utils/fs.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport {\n DEFAULT_SKILLS_SUBDIR,\n GITHUB_SOURCE,\n LOCAL_SKILLS_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { stripYamlSchemaComment } from \"../../utils/yaml-schema.js\";\nimport { IMPORT_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { STATUS_MESSAGES, INFO_MESSAGES } from \"../../utils/messages.js\";\n\nexport default class ImportSkill extends BaseCommand {\n static summary = \"Import a skill from a third-party GitHub repository\";\n static description =\n \"Download and import skills from external GitHub repositories into your local \" +\n \".claude/skills/ directory. Supports importing specific skills or listing available skills.\";\n\n static examples = [\n {\n description: \"List available skills from a repository\",\n command: \"<%= config.bin %> import skill github:vercel-labs/agent-skills --list\",\n },\n {\n description: \"Import a specific skill\",\n command:\n \"<%= config.bin %> import skill github:vercel-labs/agent-skills --skill react-best-practices\",\n },\n {\n description: \"Import all skills from a repository\",\n command: \"<%= config.bin %> import skill github:vercel-labs/agent-skills --all\",\n },\n ];\n\n static args = {\n source: Args.string({\n description:\n \"GitHub repository source (github:owner/repo, https://github.com/owner/repo, or owner/repo)\",\n required: true,\n }),\n };\n\n // Override parent baseFlags to drop --source (positional source arg IS the source)\n static baseFlags = {} as (typeof BaseCommand)[\"baseFlags\"];\n\n static flags = {\n skill: Flags.string({\n char: \"n\",\n description: \"Name of the specific skill to import\",\n required: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Import all skills from the repository\",\n default: false,\n }),\n list: Flags.boolean({\n char: \"l\",\n description: \"List available skills without importing\",\n default: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skills\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(ImportSkill);\n const projectDir = process.cwd();\n\n this.printHeader();\n this.validateFlags(flags);\n\n const { gigetSource, displaySource } = parseGitHubSource(args.source);\n this.log(`Source: ${displaySource}`);\n\n const repoPath = await this.fetchRepository(gigetSource, args.source);\n const skillsDir = this.resolveSkillsDir(repoPath);\n const availableSkills = await this.discoverAndValidate(skillsDir);\n\n if (flags.list) {\n this.listAvailableSkills(availableSkills);\n return;\n }\n\n const skillsToImport = this.resolveSkillsToImport(flags, availableSkills);\n await this.importSkills(skillsToImport, skillsDir, projectDir, displaySource, flags.force);\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Import Third-Party Skill\");\n this.log(\"\");\n }\n\n private validateFlags(flags: { list: boolean; skill?: string; all: boolean }): void {\n if (!flags.list && !flags.skill && !flags.all) {\n this.error(\"Please specify --skill <name>, --all, or --list to list available skills\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (flags.skill && flags.all) {\n this.error(\"Cannot use --skill and --all together\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n }\n\n private async fetchRepository(gigetSource: string, sourceArg: string): Promise<string> {\n this.log(STATUS_MESSAGES.FETCHING_REPOSITORY);\n\n try {\n const result = await fetchSkillSource({ gigetSource });\n this.log(result.fromCache ? \"Using cached source\" : \"Downloaded fresh copy\");\n return result.path;\n } catch (error) {\n this.error(`Failed to fetch ${sourceArg}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.NETWORK_ERROR,\n });\n }\n }\n\n private resolveSkillsDir(repoPath: string): string {\n return path.resolve(path.join(repoPath, DEFAULT_SKILLS_SUBDIR));\n }\n\n private async discoverAndValidate(skillsDir: string): Promise<string[]> {\n if (!(await directoryExists(skillsDir))) {\n this.error(\n `Skills directory not found: ${DEFAULT_SKILLS_SUBDIR}\\n` +\n `The repository doesn't have a '${DEFAULT_SKILLS_SUBDIR}' directory.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const availableSkills = await discoverValidSkills(skillsDir);\n\n if (availableSkills.length === 0) {\n this.error(\n `No valid skills found in ${DEFAULT_SKILLS_SUBDIR}/\\nSkills must have a SKILL.md file.`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n return availableSkills;\n }\n\n private listAvailableSkills(skills: string[]): void {\n this.log(\"\");\n this.log(`Available skills (${skills.length}):`);\n this.log(\"\");\n for (const skill of skills) {\n this.log(` - ${skill}`);\n }\n this.log(\"\");\n this.log(\"Use --skill <name> to import a specific skill, or --all to import all.\");\n }\n\n private resolveSkillsToImport(\n flags: { all: boolean; skill?: string },\n availableSkills: string[],\n ): string[] {\n if (flags.all) {\n return availableSkills;\n }\n\n if (flags.skill) {\n if (!availableSkills.includes(flags.skill)) {\n this.error(\n `Skill '${flags.skill}' not found in repository.\\n` +\n `Available skills: ${availableSkills.join(\", \")}\\n` +\n `Use --list to see all available skills.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n return [flags.skill];\n }\n\n return [];\n }\n\n private async importSkills(\n skillsToImport: string[],\n skillsDir: string,\n projectDir: string,\n displaySource: string,\n force: boolean,\n ): Promise<void> {\n const destDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n\n this.log(\"\");\n this.log(`Importing ${skillsToImport.length} skill(s)...`);\n\n let imported = 0;\n let skipped = 0;\n\n for (const skillName of skillsToImport) {\n const sourcePath = path.join(skillsDir, skillName);\n const destPath = path.join(destDir, skillName);\n\n if (await directoryExists(destPath)) {\n if (!force) {\n this.warn(`Skipping '${skillName}': already exists. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n\n try {\n await importSkillFromSource({ sourcePath, destPath, skillName, displaySource });\n this.logSuccess(`Imported: ${skillName}`);\n imported++;\n } catch (error) {\n this.warn(`Failed to import '${skillName}': ${getErrorMessage(error)}`);\n skipped++;\n }\n }\n\n this.log(\"\");\n this.logSuccess(`Import complete: ${imported} imported, ${skipped} skipped`);\n this.log(`Skills location: ${destDir}`);\n this.log(\"\");\n this.log(INFO_MESSAGES.RUN_COMPILE);\n this.log(\"\");\n }\n}\n\ntype ImportedForkedFromMetadata = {\n source: string;\n skillName: string;\n contentHash: string;\n date: string;\n};\n\ntype SkillMetadata = {\n forkedFrom?: ImportedForkedFromMetadata;\n [key: string]: unknown;\n};\n\ntype ParsedGitHubSource = {\n gigetSource: string;\n displaySource: string;\n};\n\ntype FetchSourceOptions = {\n gigetSource: string;\n};\n\ntype FetchedSource = {\n path: string;\n fromCache: boolean;\n};\n\ntype ImportSkillOptions = {\n sourcePath: string;\n destPath: string;\n skillName: string;\n displaySource: string;\n};\n\n/**\n * Parses various GitHub URL formats into a normalized giget source string\n * and a human-readable display URL.\n *\n * Supports: `https://github.com/owner/repo`, `github:owner/repo`,\n * `gh:owner/repo`, and bare `owner/repo` formats.\n */\nfunction parseGitHubSource(source: string): ParsedGitHubSource {\n if (source.startsWith(GITHUB_SOURCE.HTTPS_PREFIX)) {\n const path = source.replace(GITHUB_SOURCE.HTTPS_PREFIX, \"\");\n return {\n gigetSource: `${GITHUB_SOURCE.GITHUB_PREFIX}${path}`,\n displaySource: source,\n };\n }\n\n if (\n source.startsWith(GITHUB_SOURCE.GITHUB_PREFIX) ||\n source.startsWith(GITHUB_SOURCE.GH_PREFIX)\n ) {\n const normalized = source.startsWith(GITHUB_SOURCE.GH_PREFIX)\n ? GITHUB_SOURCE.GITHUB_PREFIX + source.slice(GITHUB_SOURCE.GH_PREFIX.length)\n : source;\n return {\n gigetSource: normalized,\n displaySource: `${GITHUB_SOURCE.HTTPS_PREFIX}${normalized.replace(GITHUB_SOURCE.GITHUB_PREFIX, \"\")}`,\n };\n }\n\n if (source.includes(\"/\") && !source.includes(\":\")) {\n return {\n gigetSource: `${GITHUB_SOURCE.GITHUB_PREFIX}${source}`,\n displaySource: `${GITHUB_SOURCE.HTTPS_PREFIX}${source}`,\n };\n }\n\n return {\n gigetSource: source,\n displaySource: source,\n };\n}\n\n/**\n * Fetches a source repository using giget. Wraps `fetchFromSource` from the\n * loading layer.\n */\nasync function fetchSkillSource(options: FetchSourceOptions): Promise<FetchedSource> {\n const result = await fetchFromSource(options.gigetSource);\n return { path: result.path, fromCache: result.fromCache };\n}\n\n/**\n * Discovers valid skill directories within a source path by checking\n * for the presence of SKILL.md files.\n *\n * @returns Sorted list of directory names that contain a SKILL.md file.\n */\nasync function discoverValidSkills(skillsDir: string): Promise<string[]> {\n const skillDirs = await listDirectories(skillsDir);\n const checks = await Promise.all(\n skillDirs.map(async (skillDir) => ({\n skillDir,\n hasSkillMd: await fileExists(path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD)),\n })),\n );\n return checks\n .filter((c) => c.hasSkillMd)\n .map((c) => c.skillDir)\n .sort();\n}\n\n/**\n * Imports a single skill from a source directory into the destination.\n *\n * Validates that the source skill has a SKILL.md file, copies the directory,\n * and injects `forkedFrom` metadata into the destination's metadata.yaml.\n *\n * @throws {Error} If the source skill is missing a SKILL.md file.\n */\nasync function importSkillFromSource(options: ImportSkillOptions): Promise<void> {\n const { sourcePath, destPath, skillName, displaySource } = options;\n const skillMdPath = path.join(sourcePath, STANDARD_FILES.SKILL_MD);\n\n if (!(await fileExists(skillMdPath))) {\n throw new Error(\n `Missing required SKILL.md file at ${skillMdPath}\\n` +\n `Every skill must have a SKILL.md file containing the skill's prompt content.\\n` +\n `Create one with:\\n` +\n ` echo \"# ${skillName}\" > ${path.join(sourcePath, STANDARD_FILES.SKILL_MD)}`,\n );\n }\n\n const contentHash = await computeFileHash(skillMdPath);\n\n await ensureDir(path.dirname(destPath));\n await copy(sourcePath, destPath);\n\n await injectImportedForkedFromMetadata(destPath, skillName, displaySource, contentHash);\n}\n\n/**\n * Injects `forkedFrom` metadata into a third-party imported skill's metadata.yaml.\n *\n * Handles three cases:\n * 1. Existing metadata.yaml -- preserves fields, adds/overwrites forkedFrom\n * 2. Existing metadata.json -- converts to YAML, adds forkedFrom\n * 3. No metadata file -- creates minimal metadata.yaml with forkedFrom\n *\n * Different from `injectForkedFromMetadata` in `skill-metadata.ts` which tracks\n * internal marketplace fork lineage using `skillId`. This function tracks\n * third-party imports using `source` + `skillName`.\n */\nasync function injectImportedForkedFromMetadata(\n destPath: string,\n skillName: string,\n source: string,\n contentHash: string,\n): Promise<void> {\n const forkedFrom: ImportedForkedFromMetadata = {\n source,\n skillName,\n contentHash,\n date: getCurrentDate(),\n };\n\n const yamlPath = path.join(destPath, STANDARD_FILES.METADATA_YAML);\n const jsonPath = path.join(destPath, STANDARD_FILES.METADATA_JSON);\n\n if (await fileExists(yamlPath)) {\n return mergeForkedFromIntoYaml(yamlPath, forkedFrom);\n }\n if (await fileExists(jsonPath)) {\n return convertJsonToYamlWithForkedFrom(jsonPath, yamlPath, forkedFrom);\n }\n return createMinimalMetadata(yamlPath, skillName, forkedFrom);\n}\n\nasync function mergeForkedFromIntoYaml(\n yamlPath: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const rawContent = await readFile(yamlPath);\n const { schemaComment, yamlContent } = stripYamlSchemaComment(rawContent);\n\n const raw = parseYaml(yamlContent);\n const parseResult = importedSkillMetadataSchema.safeParse(raw);\n if (!parseResult.success) {\n warn(\n `Malformed metadata.yaml at ${yamlPath} — existing fields may be lost\\n` +\n ` Validation errors: ${parseResult.error.issues.map((i) => i.message).join(\", \")}\\n` +\n ` Expected fields: displayName (string), cliDescription (string), category (string)\\n` +\n ` Validate your YAML syntax at https://yamllint.com`,\n );\n }\n const metadata: SkillMetadata = {\n ...(parseResult.success ? parseResult.data : {}),\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, metadata, schemaComment);\n}\n\nasync function convertJsonToYamlWithForkedFrom(\n jsonPath: string,\n yamlPath: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const rawContent = await readFile(jsonPath);\n let jsonParsed: unknown;\n try {\n jsonParsed = JSON.parse(rawContent);\n } catch {\n warn(\n `Malformed JSON in ${jsonPath} — skipping metadata injection\\n` +\n ` Common issues: trailing commas, unquoted keys, single quotes instead of double quotes\\n` +\n ` Validate your JSON at https://jsonlint.com`,\n );\n return;\n }\n const jsonResult = importedSkillMetadataSchema.safeParse(jsonParsed);\n const metadata: SkillMetadata = {\n ...(jsonResult.success ? jsonResult.data : {}),\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, metadata);\n}\n\nasync function createMinimalMetadata(\n yamlPath: string,\n skillName: string,\n forkedFrom: ImportedForkedFromMetadata,\n): Promise<void> {\n const minimalMetadata: SkillMetadata = {\n displayName: toTitleCase(skillName),\n cliDescription: \"Imported from third-party repository\",\n category: IMPORT_DEFAULTS.CATEGORY,\n author: IMPORT_DEFAULTS.AUTHOR,\n forkedFrom,\n };\n\n await writeMetadataYaml(yamlPath, minimalMetadata);\n}\n"],"mappings":"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","names":["path"]}
@@ -5,57 +5,56 @@ import {
5
5
  getDashboardData,
6
6
  runDashboardFlow,
7
7
  showDashboard
8
- } from "../chunk-6I6RZHYP.js";
9
- import "../chunk-C55DN7GE.js";
10
- import "../chunk-NUIZ6ZUO.js";
11
- import "../chunk-OZZGXBCN.js";
12
- import "../chunk-RJN7W2C7.js";
13
- import "../chunk-ZKJAJWK6.js";
14
- import "../chunk-RP7R73JO.js";
15
- import "../chunk-E4FT2KFV.js";
16
- import "../chunk-F3756A5B.js";
17
- import "../chunk-RBHYLCUB.js";
18
- import "../chunk-4GL2F5AB.js";
19
- import "../chunk-EN2GCPW7.js";
20
- import "../chunk-LRYNF3J7.js";
21
- import "../chunk-UZRISDBZ.js";
22
- import "../chunk-ZHTXPFDK.js";
23
- import "../chunk-IOJR5TOY.js";
24
- import "../chunk-ZDLTLNU2.js";
25
- import "../chunk-QQLRX4KI.js";
26
- import "../chunk-7URSGJLE.js";
27
- import "../chunk-NIKUMXE7.js";
28
- import "../chunk-KOPEM3Q7.js";
29
- import "../chunk-2RSNKBXC.js";
30
- import "../chunk-DUVWGO6E.js";
31
- import "../chunk-KIR7VYQD.js";
32
- import "../chunk-HIPGKIT3.js";
33
- import "../chunk-LYYXX2W5.js";
34
- import "../chunk-5K5RBRTD.js";
35
- import "../chunk-FWT3CBLL.js";
36
- import "../chunk-XA57SX4T.js";
37
- import "../chunk-FYPUUYSG.js";
38
- import "../chunk-DAG2ULNF.js";
39
- import "../chunk-VG2TVBFN.js";
40
- import "../chunk-IHO75PMZ.js";
41
- import "../chunk-GYG5SE2D.js";
42
- import "../chunk-DDG4F3FE.js";
43
- import "../chunk-N4IZ6GBO.js";
44
- import "../chunk-CDMHSHBN.js";
45
- import "../chunk-VIFZ6NFH.js";
46
- import "../chunk-YKKIJHZB.js";
47
- import "../chunk-GRPSDKIS.js";
48
- import "../chunk-MC5DUZ3V.js";
49
- import "../chunk-OA5SUEQD.js";
50
- import "../chunk-SYUOXSPU.js";
51
- import "../chunk-P3PN5SVI.js";
52
- import "../chunk-KH7MOIM5.js";
53
- import "../chunk-3LIU2ZEF.js";
54
- import "../chunk-DJAZE4PD.js";
55
- import "../chunk-VEP23B5W.js";
56
- import "../chunk-O5ASLZ2K.js";
57
- import "../chunk-YU2VGX5R.js";
58
- import "../chunk-P56WJ5FA.js";
8
+ } from "../chunk-PZIZNMHK.js";
9
+ import "../chunk-Q2KG7UV3.js";
10
+ import "../chunk-MVR3SYMN.js";
11
+ import "../chunk-XHUODHZ4.js";
12
+ import "../chunk-MWG4VU64.js";
13
+ import "../chunk-TJJPWUMA.js";
14
+ import "../chunk-TUPYW2IQ.js";
15
+ import "../chunk-SKQWRUPX.js";
16
+ import "../chunk-LASI35KT.js";
17
+ import "../chunk-GRVKW3CC.js";
18
+ import "../chunk-L7SZXUBJ.js";
19
+ import "../chunk-ZPPHXXAP.js";
20
+ import "../chunk-R5NOI2LP.js";
21
+ import "../chunk-BNSRA6HL.js";
22
+ import "../chunk-F7T5AFFN.js";
23
+ import "../chunk-MQ7FLIYS.js";
24
+ import "../chunk-FVDKAVOL.js";
25
+ import "../chunk-TSIU7DME.js";
26
+ import "../chunk-QRDTLVXG.js";
27
+ import "../chunk-J27W6TXS.js";
28
+ import "../chunk-SX5H6TSC.js";
29
+ import "../chunk-5GUOIJSG.js";
30
+ import "../chunk-MJ2KHG24.js";
31
+ import "../chunk-DTSG5XZB.js";
32
+ import "../chunk-MM7CTTAV.js";
33
+ import "../chunk-KXYVJGJP.js";
34
+ import "../chunk-P44SXVH3.js";
35
+ import "../chunk-LDP5ASDM.js";
36
+ import "../chunk-Q45ZU6HD.js";
37
+ import "../chunk-WBCPLH66.js";
38
+ import "../chunk-RNJWAKMO.js";
39
+ import "../chunk-XVAQG2CV.js";
40
+ import "../chunk-IUQBOCSU.js";
41
+ import "../chunk-ODNDXQH2.js";
42
+ import "../chunk-STMHDOZD.js";
43
+ import "../chunk-SBHBBZKF.js";
44
+ import "../chunk-IHUY4M22.js";
45
+ import "../chunk-QZZJFYUQ.js";
46
+ import "../chunk-E5X6RJ4E.js";
47
+ import "../chunk-LZ52XEPR.js";
48
+ import "../chunk-JFLVEFFP.js";
49
+ import "../chunk-5UWKOOIS.js";
50
+ import "../chunk-KR65TPKC.js";
51
+ import "../chunk-ZL7PFNHN.js";
52
+ import "../chunk-EEPELKOM.js";
53
+ import "../chunk-PMM2MYMA.js";
54
+ import "../chunk-WKTHWQKM.js";
55
+ import "../chunk-VASLW636.js";
56
+ import "../chunk-76ADG7LQ.js";
57
+ import "../chunk-UBEDZ4FD.js";
59
58
  export {
60
59
  Init as default,
61
60
  formatDashboardText,
@@ -1,39 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillAgentSummary
4
- } from "../chunk-GRPSDKIS.js";
4
+ } from "../chunk-LZ52XEPR.js";
5
+ import {
6
+ render
7
+ } from "../chunk-JFLVEFFP.js";
5
8
  import {
6
9
  hydrateWizardStore
7
- } from "../chunk-MC5DUZ3V.js";
10
+ } from "../chunk-5UWKOOIS.js";
8
11
  import {
9
12
  BaseCommand
10
- } from "../chunk-OA5SUEQD.js";
11
- import "../chunk-SYUOXSPU.js";
12
- import "../chunk-P3PN5SVI.js";
13
+ } from "../chunk-KR65TPKC.js";
14
+ import "../chunk-ZL7PFNHN.js";
13
15
  import {
14
16
  INSTALL_MODE_LABELS,
15
17
  detectInstallation,
16
18
  formatInstallationDisplay,
17
19
  getInstallationInfo,
18
20
  loadProjectConfig
19
- } from "../chunk-KH7MOIM5.js";
20
- import "../chunk-3LIU2ZEF.js";
21
- import "../chunk-DJAZE4PD.js";
22
- import "../chunk-VEP23B5W.js";
21
+ } from "../chunk-EEPELKOM.js";
22
+ import "../chunk-PMM2MYMA.js";
23
+ import "../chunk-WKTHWQKM.js";
24
+ import "../chunk-VASLW636.js";
23
25
  import {
24
26
  CLI_COLORS,
25
27
  CLI_INVOKE_COMMAND,
26
28
  DEFAULT_BRANDING
27
- } from "../chunk-O5ASLZ2K.js";
28
- import "../chunk-YU2VGX5R.js";
29
- import {
30
- init_esm_shims
31
- } from "../chunk-P56WJ5FA.js";
29
+ } from "../chunk-76ADG7LQ.js";
30
+ import "../chunk-UBEDZ4FD.js";
32
31
 
33
32
  // src/cli/commands/list.tsx
34
- init_esm_shims();
35
33
  import { useEffect } from "react";
36
- import { render, Box, Text, useApp } from "ink";
34
+ import { Box, Text, useApp } from "ink";
37
35
  import { jsx, jsxs } from "react/jsx-runtime";
38
36
  var ListView = ({ mode, source, skillConfigs, agentConfigs }) => {
39
37
  const { exit } = useApp();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/list.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\n\nimport { render, Box, Text, useApp } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { CLI_INVOKE_COMMAND, CLI_COLORS, DEFAULT_BRANDING } from \"../consts.js\";\nimport { getInstallationInfo, formatInstallationDisplay } from \"../lib/plugins/index.js\";\nimport { detectInstallation, INSTALL_MODE_LABELS } from \"../lib/installation/installation.js\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport { SkillAgentSummary } from \"../components/wizard/skill-agent-summary.js\";\nimport { hydrateWizardStore } from \"../stores/wizard-store.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../types/config.js\";\n\ntype ListViewProps = {\n mode: string;\n source?: string;\n skillConfigs: SkillConfig[];\n agentConfigs: AgentScopeConfig[];\n};\n\nconst ListView: React.FC<ListViewProps> = ({ mode, source, skillConfigs, agentConfigs }) => {\n const { exit } = useApp();\n\n useEffect(() => {\n const timer = setTimeout(() => exit(), 0);\n return () => clearTimeout(timer);\n }, [exit]);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} paddingY={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Mode\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{mode}</Text>\n </Box>\n {source && (\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Source\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{source}</Text>\n </Box>\n )}\n </Box>\n\n <SkillAgentSummary skillConfigs={skillConfigs} agentConfigs={agentConfigs} />\n </Box>\n );\n};\n\nexport default class List extends BaseCommand {\n static summary = \"Show installation information\";\n static description = `Display details about the ${DEFAULT_BRANDING.NAME} installation (local or plugin mode)`;\n static aliases = [\"ls\"];\n\n static examples = [\n {\n description: \"Show current installation details\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n await this.parse(List);\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.log(\"No installation found.\");\n this.log(`Run '${CLI_INVOKE_COMMAND} init' to create one.`);\n return;\n }\n\n const loaded = await loadProjectConfig(installation.projectDir);\n\n if (!loaded?.config || !process.stdin.isTTY) {\n const info = await getInstallationInfo();\n if (info) {\n this.log(\"\");\n this.log(formatInstallationDisplay(info));\n this.log(\"\");\n }\n return;\n }\n\n const { config } = loaded;\n const modeLabel = INSTALL_MODE_LABELS[installation.mode];\n const activeSkills = config.skills.filter((s) => !s.excluded);\n const activeAgents = config.agents.filter((a) => !a.excluded);\n\n hydrateWizardStore({\n installedSkillConfigs: activeSkills,\n installedAgentConfigs: activeAgents,\n });\n\n const { waitUntilExit, clear } = render(\n <ListView\n mode={modeLabel}\n source={config.source}\n skillConfigs={activeSkills}\n agentConfigs={activeAgents}\n />,\n );\n\n await waitUntilExit();\n clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,iBAAiB;AAEjC,SAAS,QAAQ,KAAK,MAAM,cAAc;AA6BlC,SACE,KADF;AAXR,IAAM,WAAoC,CAAC,EAAE,MAAM,QAAQ,cAAc,aAAa,MAAM;AAC1F,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,KAAK,GAAG,CAAC;AACxC,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,IAAI,CAAC;AAET,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GACjD;AAAA,yBAAC,OAAI,eAAc,UAAS,cAAc,GACxC;AAAA,2BAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,kBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,gBAAK;AAAA,SACzC;AAAA,MACC,UACC,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,oBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,kBAAO;AAAA,SAC3C;AAAA,OAEJ;AAAA,IAEA,oBAAC,qBAAkB,cAA4B,cAA4B;AAAA,KAC7E;AAEJ;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc,6BAA6B,iBAAiB,IAAI;AAAA,EACvE,OAAO,UAAU,CAAC,IAAI;AAAA,EAEtB,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,KAAI;AAErB,UAAM,eAAe,MAAM,mBAAmB;AAE9C,QAAI,CAAC,cAAc;AACjB,WAAK,IAAI,wBAAwB;AACjC,WAAK,IAAI,QAAQ,kBAAkB,uBAAuB;AAC1D;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,kBAAkB,aAAa,UAAU;AAE9D,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,MAAM,OAAO;AAC3C,YAAM,OAAO,MAAM,oBAAoB;AACvC,UAAI,MAAM;AACR,aAAK,IAAI,EAAE;AACX,aAAK,IAAI,0BAA0B,IAAI,CAAC;AACxC,aAAK,IAAI,EAAE;AAAA,MACb;AACA;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,YAAY,oBAAoB,aAAa,IAAI;AACvD,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAC5D,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAE5D,uBAAmB;AAAA,MACjB,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC;AAED,UAAM,EAAE,eAAe,MAAM,IAAI;AAAA,MAC/B;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,UACf,cAAc;AAAA,UACd,cAAc;AAAA;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc;AACpB,UAAM;AAAA,EACR;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/list.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\n\nimport { Box, Text, useApp } from \"ink\";\nimport { render } from \"../components/render.js\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { CLI_INVOKE_COMMAND, CLI_COLORS, DEFAULT_BRANDING } from \"../consts.js\";\nimport { getInstallationInfo, formatInstallationDisplay } from \"../lib/plugins/index.js\";\nimport { detectInstallation, INSTALL_MODE_LABELS } from \"../lib/installation/installation.js\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport { SkillAgentSummary } from \"../components/wizard/skill-agent-summary.js\";\nimport { hydrateWizardStore } from \"../stores/wizard-store.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../types/config.js\";\n\ntype ListViewProps = {\n mode: string;\n source?: string;\n skillConfigs: SkillConfig[];\n agentConfigs: AgentScopeConfig[];\n};\n\nconst ListView: React.FC<ListViewProps> = ({ mode, source, skillConfigs, agentConfigs }) => {\n const { exit } = useApp();\n\n useEffect(() => {\n const timer = setTimeout(() => exit(), 0);\n return () => clearTimeout(timer);\n }, [exit]);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} paddingY={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Mode\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{mode}</Text>\n </Box>\n {source && (\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Source\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{source}</Text>\n </Box>\n )}\n </Box>\n\n <SkillAgentSummary skillConfigs={skillConfigs} agentConfigs={agentConfigs} />\n </Box>\n );\n};\n\nexport default class List extends BaseCommand {\n static summary = \"Show installation information\";\n static description = `Display details about the ${DEFAULT_BRANDING.NAME} installation (local or plugin mode)`;\n static aliases = [\"ls\"];\n\n static examples = [\n {\n description: \"Show current installation details\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n await this.parse(List);\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.log(\"No installation found.\");\n this.log(`Run '${CLI_INVOKE_COMMAND} init' to create one.`);\n return;\n }\n\n const loaded = await loadProjectConfig(installation.projectDir);\n\n if (!loaded?.config || !process.stdin.isTTY) {\n const info = await getInstallationInfo();\n if (info) {\n this.log(\"\");\n this.log(formatInstallationDisplay(info));\n this.log(\"\");\n }\n return;\n }\n\n const { config } = loaded;\n const modeLabel = INSTALL_MODE_LABELS[installation.mode];\n const activeSkills = config.skills.filter((s) => !s.excluded);\n const activeAgents = config.agents.filter((a) => !a.excluded);\n\n hydrateWizardStore({\n installedSkillConfigs: activeSkills,\n installedAgentConfigs: activeAgents,\n });\n\n const { waitUntilExit, clear } = render(\n <ListView\n mode={modeLabel}\n source={config.source}\n skillConfigs={activeSkills}\n agentConfigs={activeAgents}\n />,\n );\n\n await waitUntilExit();\n clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,iBAAiB;AAEjC,SAAS,KAAK,MAAM,cAAc;AA8B1B,SACE,KADF;AAXR,IAAM,WAAoC,CAAC,EAAE,MAAM,QAAQ,cAAc,aAAa,MAAM;AAC1F,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,KAAK,GAAG,CAAC;AACxC,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,IAAI,CAAC;AAET,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GACjD;AAAA,yBAAC,OAAI,eAAc,UAAS,cAAc,GACxC;AAAA,2BAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,kBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,gBAAK;AAAA,SACzC;AAAA,MACC,UACC,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,oBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,kBAAO;AAAA,SAC3C;AAAA,OAEJ;AAAA,IAEA,oBAAC,qBAAkB,cAA4B,cAA4B;AAAA,KAC7E;AAEJ;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc,6BAA6B,iBAAiB,IAAI;AAAA,EACvE,OAAO,UAAU,CAAC,IAAI;AAAA,EAEtB,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,KAAI;AAErB,UAAM,eAAe,MAAM,mBAAmB;AAE9C,QAAI,CAAC,cAAc;AACjB,WAAK,IAAI,wBAAwB;AACjC,WAAK,IAAI,QAAQ,kBAAkB,uBAAuB;AAC1D;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,kBAAkB,aAAa,UAAU;AAE9D,QAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,MAAM,OAAO;AAC3C,YAAM,OAAO,MAAM,oBAAoB;AACvC,UAAI,MAAM;AACR,aAAK,IAAI,EAAE;AACX,aAAK,IAAI,0BAA0B,IAAI,CAAC;AACxC,aAAK,IAAI,EAAE;AAAA,MACb;AACA;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,YAAY,oBAAoB,aAAa,IAAI;AACvD,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAC5D,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAE5D,uBAAmB;AAAA,MACjB,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC;AAED,UAAM,EAAE,eAAe,MAAM,IAAI;AAAA,MAC/B;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,UACf,cAAc;AAAA,UACd,cAAc;AAAA;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc;AACpB,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -1,48 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  promptValue
4
- } from "../../chunk-C55DN7GE.js";
4
+ } from "../../chunk-Q2KG7UV3.js";
5
5
  import {
6
6
  FEATURE_FLAGS,
7
7
  featureDisabledError
8
- } from "../../chunk-IHO75PMZ.js";
8
+ } from "../../chunk-WBCPLH66.js";
9
9
  import {
10
10
  getAgentDefinitions
11
- } from "../../chunk-YKKIJHZB.js";
11
+ } from "../../chunk-E5X6RJ4E.js";
12
+ import "../../chunk-JFLVEFFP.js";
12
13
  import {
13
14
  BaseCommand,
14
15
  EXIT_CODES
15
- } from "../../chunk-OA5SUEQD.js";
16
- import "../../chunk-SYUOXSPU.js";
17
- import "../../chunk-P3PN5SVI.js";
16
+ } from "../../chunk-KR65TPKC.js";
17
+ import "../../chunk-ZL7PFNHN.js";
18
18
  import {
19
19
  isClaudeCLIAvailable,
20
20
  loadConfigTypesDataInBackground,
21
21
  resolveInstallPaths,
22
22
  resolveSource,
23
23
  writeScaffoldedEntityTypes
24
- } from "../../chunk-KH7MOIM5.js";
24
+ } from "../../chunk-EEPELKOM.js";
25
25
  import {
26
26
  fileExists,
27
27
  getErrorMessage,
28
28
  modelNameSchema,
29
29
  readFile
30
- } from "../../chunk-3LIU2ZEF.js";
31
- import "../../chunk-DJAZE4PD.js";
32
- import "../../chunk-VEP23B5W.js";
30
+ } from "../../chunk-PMM2MYMA.js";
31
+ import "../../chunk-WKTHWQKM.js";
32
+ import "../../chunk-VASLW636.js";
33
33
  import {
34
34
  CLAUDE_DIR,
35
35
  CLI_COLORS,
36
36
  STANDARD_DIRS,
37
37
  STANDARD_FILES
38
- } from "../../chunk-O5ASLZ2K.js";
39
- import "../../chunk-YU2VGX5R.js";
40
- import {
41
- init_esm_shims
42
- } from "../../chunk-P56WJ5FA.js";
38
+ } from "../../chunk-76ADG7LQ.js";
39
+ import "../../chunk-UBEDZ4FD.js";
43
40
 
44
41
  // src/cli/commands/new/agent.tsx
45
- init_esm_shims();
46
42
  import { useState } from "react";
47
43
  import { Args, Flags } from "@oclif/core";
48
44
  import { TextInput } from "@inkjs/ui";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { z } from \"zod\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { promptValue } from \"../../components/common/prompt-confirm.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_DIRS, STANDARD_FILES } from \"../../consts.js\";\nimport { resolveInstallPaths } from \"../../lib/installation/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n type ConfigTypesBackgroundData,\n loadConfigTypesDataInBackground,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { writeScaffoldedEntityTypes } from \"../../lib/config-gate/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { modelNameSchema } from \"../../lib/schemas.js\";\nimport { getAgentDefinitions } from \"../../lib/agents/index.js\";\nimport type { ModelName } from \"../../types/index.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\n\nconst SEPARATOR_WIDTH = 60;\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\ntype PurposeOutcome = { status: \"submitted\"; purpose: string } | { status: \"cancelled\" };\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static examples = [\n {\n description: \"Scaffold an agent (interactive prompt)\",\n command: \"<%= config.bin %> <%= command.id %> my-agent\",\n },\n {\n description: \"Scaffold with purpose provided up front\",\n command: '<%= config.bin %> <%= command.id %> my-agent --purpose \"Manage DB migrations\"',\n },\n {\n description: \"Overwrite an existing agent\",\n command: \"<%= config.bin %> <%= command.id %> my-agent --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing agent\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_AGENT_COMMAND) {\n this.error(featureDisabledError(\"new agent\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n await this.ensureClaudeCliAvailable();\n\n const purpose = flags.purpose ?? (await this.promptForPurpose());\n const outputDir = path.join(resolveInstallPaths(projectDir, \"project\").agentsDir, \"_custom\");\n\n await this.checkExistingDir(path.join(outputDir, args.name), flags.force);\n this.logAgentPlan(args.name, purpose, outputDir);\n await this.generateAgent(args.name, purpose, outputDir, flags, projectDir);\n await this.updateConfigTypes(projectDir, configTypesReady, args.name);\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n }\n\n private async checkExistingDir(agentDir: string, force: boolean): Promise<void> {\n await this.ensureDirOverwritable(agentDir, force, {\n exists: `Agent directory already exists: ${agentDir}`,\n overwriting: `Overwriting existing agent at ${agentDir}`,\n });\n }\n\n private async ensureClaudeCliAvailable(): Promise<void> {\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n private async promptForPurpose(): Promise<string> {\n const outcome = await promptValue<PurposeOutcome>(\n (resolve) => (\n <PurposeInput\n onSubmit={(value) => resolve({ status: \"submitted\", purpose: value })}\n onCancel={() => resolve({ status: \"cancelled\" })}\n />\n ),\n { onExit: { status: \"cancelled\" } },\n );\n\n if (outcome.status === \"cancelled\") {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n throw new Error(\"unreachable\");\n }\n\n return outcome.purpose;\n }\n\n private logAgentPlan(name: string, purpose: string, outputDir: string): void {\n this.log(\"\");\n this.log(`Agent name: ${name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n }\n\n private async generateAgent(\n name: string,\n purpose: string,\n outputDir: string,\n flags: { source: string | undefined },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent({\n projectDir,\n source: sourceConfig.source,\n });\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent({\n agentDef,\n prompt: agentPrompt,\n });\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigTypes(\n projectDir: string,\n configTypesReady: Promise<ConfigTypesBackgroundData>,\n agentName: string,\n ): Promise<void> {\n try {\n await writeScaffoldedEntityTypes(projectDir, configTypesReady, {\n extraAgentNames: [agentName],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n }\n}\n\nconst META_AGENT_NAME = \"agent-summoner\";\n\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: ModelName;\n tools?: string[];\n};\n\n/** Frontmatter shape of the compiled agent-summoner.md read at the matter() parse boundary. */\nconst metaAgentFrontmatterSchema = z.object({\n description: z.string().optional(),\n tools: z.union([z.string(), z.array(z.string())]).optional(),\n model: modelNameSchema.optional(),\n});\n\ntype LoadMetaAgentOptions = {\n projectDir: string;\n source: string;\n};\n\ntype InvokeMetaAgentOptions = {\n agentDef: NewAgentInput;\n prompt: string;\n};\n\nfunction parseCompiledAgent(content: string): NewAgentInput {\n const { data, content: body } = matter(content);\n const frontmatter = metaAgentFrontmatterSchema.parse(data);\n const tools =\n typeof frontmatter.tools === \"string\"\n ? frontmatter.tools.split(\",\").map((t) => t.trim())\n : frontmatter.tools;\n\n return {\n description: frontmatter.description || \"Creates new agents\",\n prompt: body.trim(),\n model: frontmatter.model,\n tools,\n };\n}\n\nasync function loadMetaAgent(options: LoadMetaAgentOptions): Promise<NewAgentInput> {\n const { projectDir, source } = options;\n const compiledFileName = `${META_AGENT_NAME}.md`;\n\n const localAgentPath = path.join(\n resolveInstallPaths(projectDir, \"project\").agentsDir,\n compiledFileName,\n );\n if (await fileExists(localAgentPath)) {\n return parseCompiledAgent(await readFile(localAgentPath));\n }\n\n try {\n const agentPaths = await getAgentDefinitions(source, { projectDir });\n const remoteAgentPath = path.join(\n agentPaths.sourcePath,\n CLAUDE_DIR,\n STANDARD_DIRS.AGENTS,\n compiledFileName,\n );\n if (await fileExists(remoteAgentPath)) {\n return parseCompiledAgent(await readFile(remoteAgentPath));\n }\n } catch {\n // Source does not contain agents — fall through to error\n }\n\n throw new Error(\n `Agent '${META_AGENT_NAME}' not found.\\n\\n` + `Run 'compile' first to generate agents.`,\n );\n}\n\nexport function buildAgentPrompt(agentName: string, purpose: string, outputDir: string): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create metadata.yaml with appropriate configuration\n3. Create identity.md with the agent's role and context\n4. Create playbook.md with the agent's operational process\n5. Optionally create output.md if output format guidance would help\n6. Optionally create critical-requirements.md for important rules\n7. Include \\`custom: true\\` in the metadata.yaml configuration\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(options: InvokeMetaAgentOptions): Promise<void> {\n const { agentDef, prompt } = options;\n\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME, \"--prompt\", prompt];\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/new/agent.tsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nimport { Args, Flags } from \"@oclif/core\";\nimport { TextInput } from \"@inkjs/ui\";\nimport { spawn } from \"child_process\";\nimport matter from \"gray-matter\";\nimport { z } from \"zod\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { promptValue } from \"../../components/common/prompt-confirm.js\";\nimport { CLAUDE_DIR, CLI_COLORS, STANDARD_DIRS, STANDARD_FILES } from \"../../consts.js\";\nimport { resolveInstallPaths } from \"../../lib/installation/index.js\";\nimport { resolveSource } from \"../../lib/configuration/index.js\";\nimport {\n type ConfigTypesBackgroundData,\n loadConfigTypesDataInBackground,\n} from \"../../lib/configuration/config-types-writer.js\";\nimport { writeScaffoldedEntityTypes } from \"../../lib/config-gate/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { modelNameSchema } from \"../../lib/schemas.js\";\nimport { getAgentDefinitions } from \"../../lib/agents/index.js\";\nimport type { ModelName } from \"../../types/index.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { isClaudeCLIAvailable } from \"../../utils/exec.js\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\n\nconst SEPARATOR_WIDTH = 60;\n\ntype PurposeInputProps = {\n onSubmit: (purpose: string) => void;\n onCancel: () => void;\n};\n\ntype PurposeOutcome = { status: \"submitted\"; purpose: string } | { status: \"cancelled\" };\n\nconst PurposeInput: React.FC<PurposeInputProps> = ({ onSubmit, onCancel }) => {\n const { exit } = useApp();\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n exit();\n }\n });\n\n const handleSubmit = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n setError(\"Purpose is required\");\n return;\n }\n onSubmit(trimmed);\n exit();\n };\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Create New Agent</Text>\n <Text>What should this agent do?</Text>\n <Text dimColor>e.g., Manages database migrations with rollback support</Text>\n <Text> </Text>\n <TextInput placeholder=\"Enter agent purpose...\" onSubmit={handleSubmit} />\n {error && (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.ERROR}>{error}</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport default class NewAgent extends BaseCommand {\n static summary = \"Create a new custom agent using AI generation\";\n static description =\n \"Uses the agent-summoner meta-agent to scaffold a new agent with proper structure and documentation.\";\n\n static examples = [\n {\n description: \"Scaffold an agent (interactive prompt)\",\n command: \"<%= config.bin %> <%= command.id %> my-agent\",\n },\n {\n description: \"Scaffold with purpose provided up front\",\n command: '<%= config.bin %> <%= command.id %> my-agent --purpose \"Manage DB migrations\"',\n },\n {\n description: \"Overwrite an existing agent\",\n command: \"<%= config.bin %> <%= command.id %> my-agent --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description: \"Name of the agent to create\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n purpose: Flags.string({\n char: \"p\",\n description: \"Purpose/description of the agent\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing agent\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_AGENT_COMMAND) {\n this.error(featureDisabledError(\"new agent\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewAgent);\n const projectDir = process.cwd();\n\n const configTypesReady = loadConfigTypesDataInBackground(flags.source, projectDir);\n await this.ensureClaudeCliAvailable();\n\n const purpose = flags.purpose ?? (await this.promptForPurpose());\n const outputDir = path.join(resolveInstallPaths(projectDir, \"project\").agentsDir, \"_custom\");\n\n await this.checkExistingDir(path.join(outputDir, args.name), flags.force);\n this.logAgentPlan(args.name, purpose, outputDir);\n await this.generateAgent(args.name, purpose, outputDir, flags, projectDir);\n await this.updateConfigTypes(projectDir, configTypesReady, args.name);\n\n this.log(\"\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.logSuccess(\"Agent creation complete!\");\n }\n\n private async checkExistingDir(agentDir: string, force: boolean): Promise<void> {\n await this.ensureDirOverwritable(agentDir, force, {\n exists: `Agent directory already exists: ${agentDir}`,\n overwriting: `Overwriting existing agent at ${agentDir}`,\n });\n }\n\n private async ensureClaudeCliAvailable(): Promise<void> {\n const cliAvailable = await isClaudeCLIAvailable();\n if (!cliAvailable) {\n this.error(\n \"Claude CLI not found. Please install it first:\\n\" +\n \" npm install -g @anthropic-ai/claude-code\",\n { exit: EXIT_CODES.ERROR },\n );\n }\n }\n\n private async promptForPurpose(): Promise<string> {\n const outcome = await promptValue<PurposeOutcome>(\n (resolve) => (\n <PurposeInput\n onSubmit={(value) => resolve({ status: \"submitted\", purpose: value })}\n onCancel={() => resolve({ status: \"cancelled\" })}\n />\n ),\n { onExit: { status: \"cancelled\" } },\n );\n\n if (outcome.status === \"cancelled\") {\n this.log(\"Cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n throw new Error(\"unreachable\");\n }\n\n return outcome.purpose;\n }\n\n private logAgentPlan(name: string, purpose: string, outputDir: string): void {\n this.log(\"\");\n this.log(`Agent name: ${name}`);\n this.log(`Purpose: ${purpose}`);\n this.log(`Output: ${outputDir}`);\n this.log(\"\");\n }\n\n private async generateAgent(\n name: string,\n purpose: string,\n outputDir: string,\n flags: { source: string | undefined },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Fetching agent-summoner from source...\");\n\n try {\n const sourceConfig = await resolveSource(flags.source, projectDir);\n const agentDef = await loadMetaAgent({\n projectDir,\n source: sourceConfig.source,\n });\n this.log(\"Meta-agent loaded\");\n this.log(\"\");\n\n const agentPrompt = buildAgentPrompt(name, purpose, outputDir);\n\n this.log(\"Invoking agent-summoner to create your agent...\");\n this.log(\"─\".repeat(SEPARATOR_WIDTH));\n this.log(\"\");\n\n await invokeMetaAgent({\n agentDef,\n prompt: agentPrompt,\n });\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigTypes(\n projectDir: string,\n configTypesReady: Promise<ConfigTypesBackgroundData>,\n agentName: string,\n ): Promise<void> {\n try {\n await writeScaffoldedEntityTypes(projectDir, configTypesReady, {\n extraAgentNames: [agentName],\n });\n } catch (error) {\n this.warn(`Could not update ${STANDARD_FILES.CONFIG_TYPES_TS}: ${getErrorMessage(error)}`);\n }\n }\n}\n\nconst META_AGENT_NAME = \"agent-summoner\";\n\ntype NewAgentInput = {\n description: string;\n prompt: string;\n model?: ModelName;\n tools?: string[];\n};\n\n/** Frontmatter shape of the compiled agent-summoner.md read at the matter() parse boundary. */\nconst metaAgentFrontmatterSchema = z.object({\n description: z.string().optional(),\n tools: z.union([z.string(), z.array(z.string())]).optional(),\n model: modelNameSchema.optional(),\n});\n\ntype LoadMetaAgentOptions = {\n projectDir: string;\n source: string;\n};\n\ntype InvokeMetaAgentOptions = {\n agentDef: NewAgentInput;\n prompt: string;\n};\n\nfunction parseCompiledAgent(content: string): NewAgentInput {\n const { data, content: body } = matter(content);\n const frontmatter = metaAgentFrontmatterSchema.parse(data);\n const tools =\n typeof frontmatter.tools === \"string\"\n ? frontmatter.tools.split(\",\").map((t) => t.trim())\n : frontmatter.tools;\n\n return {\n description: frontmatter.description || \"Creates new agents\",\n prompt: body.trim(),\n model: frontmatter.model,\n tools,\n };\n}\n\nasync function loadMetaAgent(options: LoadMetaAgentOptions): Promise<NewAgentInput> {\n const { projectDir, source } = options;\n const compiledFileName = `${META_AGENT_NAME}.md`;\n\n const localAgentPath = path.join(\n resolveInstallPaths(projectDir, \"project\").agentsDir,\n compiledFileName,\n );\n if (await fileExists(localAgentPath)) {\n return parseCompiledAgent(await readFile(localAgentPath));\n }\n\n try {\n const agentPaths = await getAgentDefinitions(source, { projectDir });\n const remoteAgentPath = path.join(\n agentPaths.sourcePath,\n CLAUDE_DIR,\n STANDARD_DIRS.AGENTS,\n compiledFileName,\n );\n if (await fileExists(remoteAgentPath)) {\n return parseCompiledAgent(await readFile(remoteAgentPath));\n }\n } catch {\n // Source does not contain agents — fall through to error\n }\n\n throw new Error(\n `Agent '${META_AGENT_NAME}' not found.\\n\\n` + `Run 'compile' first to generate agents.`,\n );\n}\n\nexport function buildAgentPrompt(agentName: string, purpose: string, outputDir: string): string {\n return `Create a new Claude Code agent named \"${agentName}\" in the directory \"${outputDir}\".\n\nAgent Purpose: ${purpose}\n\nRequirements:\n1. Create the agent directory structure at ${outputDir}/${agentName}/\n2. Create metadata.yaml with appropriate configuration\n3. Create identity.md with the agent's role and context\n4. Create playbook.md with the agent's operational process\n5. Optionally create output.md if output format guidance would help\n6. Optionally create critical-requirements.md for important rules\n7. Include \\`custom: true\\` in the metadata.yaml configuration\n\nFollow the existing agent patterns in the codebase. Keep the agent focused and practical.`;\n}\n\nasync function invokeMetaAgent(options: InvokeMetaAgentOptions): Promise<void> {\n const { agentDef, prompt } = options;\n\n const agentsJson = JSON.stringify({\n [META_AGENT_NAME]: {\n description: agentDef.description,\n prompt: agentDef.prompt,\n model: agentDef.model,\n tools: agentDef.tools,\n },\n });\n\n const args = [\"--agents\", agentsJson, \"--agent\", META_AGENT_NAME, \"--prompt\", prompt];\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"claude\", args, {\n stdio: \"inherit\",\n });\n\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to spawn claude CLI: ${error.message}`));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Claude CLI exited with code ${code}`));\n }\n });\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,41 +1,40 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- generateMarketplace,
4
- writeMarketplace
5
- } from "../../chunk-CFQT72MJ.js";
6
2
  import {
7
3
  generateSkillCategoriesTs,
8
4
  generateSkillRulesTs,
9
5
  resolveAuthorOrDefault,
10
6
  scaffoldSkillFiles
11
- } from "../../chunk-4LPJZNT7.js";
7
+ } from "../../chunk-KFB5CRXZ.js";
8
+ import {
9
+ generateMarketplace,
10
+ writeMarketplace
11
+ } from "../../chunk-M7HO7NBK.js";
12
12
  import {
13
13
  validateKebabCaseName
14
- } from "../../chunk-PG4G4IIK.js";
14
+ } from "../../chunk-VY6MNOXL.js";
15
15
  import {
16
16
  FEATURE_FLAGS,
17
17
  featureDisabledError
18
- } from "../../chunk-IHO75PMZ.js";
18
+ } from "../../chunk-WBCPLH66.js";
19
19
  import {
20
20
  BaseCommand,
21
21
  EXIT_CODES
22
- } from "../../chunk-OA5SUEQD.js";
23
- import "../../chunk-SYUOXSPU.js";
24
- import "../../chunk-P3PN5SVI.js";
22
+ } from "../../chunk-KR65TPKC.js";
23
+ import "../../chunk-ZL7PFNHN.js";
25
24
  import {
26
25
  LOCAL_DEFAULTS,
27
26
  compileAllSkillPlugins,
28
27
  loadConfigTypesDataInBackground,
29
28
  writeMarketplaceScaffoldConfig,
30
29
  writeScaffoldedEntityTypes
31
- } from "../../chunk-KH7MOIM5.js";
30
+ } from "../../chunk-EEPELKOM.js";
32
31
  import {
33
32
  ensureDir,
34
33
  getErrorMessage,
35
34
  writeFile
36
- } from "../../chunk-3LIU2ZEF.js";
37
- import "../../chunk-DJAZE4PD.js";
38
- import "../../chunk-VEP23B5W.js";
35
+ } from "../../chunk-PMM2MYMA.js";
36
+ import "../../chunk-WKTHWQKM.js";
37
+ import "../../chunk-VASLW636.js";
39
38
  import {
40
39
  CLAUDE_SRC_DIR,
41
40
  CLI_INVOKE_COMMAND,
@@ -49,14 +48,10 @@ import {
49
48
  STACKS_FILE_PATH,
50
49
  STANDARD_FILES,
51
50
  marketplaceManifestPath
52
- } from "../../chunk-O5ASLZ2K.js";
53
- import "../../chunk-YU2VGX5R.js";
54
- import {
55
- init_esm_shims
56
- } from "../../chunk-P56WJ5FA.js";
51
+ } from "../../chunk-76ADG7LQ.js";
52
+ import "../../chunk-UBEDZ4FD.js";
57
53
 
58
54
  // src/cli/commands/new/marketplace.ts
59
- init_esm_shims();
60
55
  import { Args, Flags } from "@oclif/core";
61
56
  import path from "path";
62
57
  function generateStacksTs(name) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/new/marketplace.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { writeFile, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n MARKETPLACE_JSON,\n PLUGIN_MANIFEST_DIR,\n marketplaceManifestPath,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n EJECT_SOURCE,\n PLUGINS_DIST_PATH,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { validateKebabCaseName } from \"../../lib/validate-kebab-name.js\";\nimport { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { compileAllSkillPlugins } from \"../../lib/skills/skill-plugin-compiler.js\";\nimport { loadConfigTypesDataInBackground } from \"../../lib/configuration/config-types-writer.js\";\nimport {\n writeMarketplaceScaffoldConfig,\n writeScaffoldedEntityTypes,\n} from \"../../lib/config-gate/index.js\";\nimport { generateMarketplace, writeMarketplace } from \"../../lib/marketplace-generator.js\";\nimport { generateSkillCategoriesTs, generateSkillRulesTs } from \"../../lib/skills/generators.js\";\nimport type { Category, SkillId } from \"../../types/index.js\";\nimport { resolveAuthorOrDefault, scaffoldSkillFiles } from \"./skill.js\";\n\nexport function generateStacksTs(name: string): string {\n const data = {\n stacks: [\n {\n id: \"dummy-stack\",\n name: \"Dummy Stack\",\n description: `Default stack for ${name}`,\n agents: {\n \"web-developer\": {\n \"dummy-category\": \"dummy-skill\",\n },\n },\n philosophy: \"Ship fast, iterate faster\",\n },\n ],\n };\n const body = JSON.stringify(data, null, 2);\n return `// Stack definitions for ${name}\\nexport default ${body};\\n`;\n}\n\nexport function generateReadme(name: string): string {\n return `# ${name}\n\nPrivate marketplace for custom skills and stacks.\n\n## Directory Structure\n\n\\`\\`\\`\n${STACKS_FILE_PATH} # Stack definitions (agent groupings with skill mappings)\n${SKILLS_DIR_PATH}/ # Custom skill definitions\n\\`\\`\\`\n\n## Creating Skills\n\n\\`\\`\\`bash\n${CLI_INVOKE_COMMAND} new skill <name> --category <category-name>\n\\`\\`\\`\n\nEach skill lives in \\`${SKILLS_DIR_PATH}/<skill-name>/\\` with:\n- \\`${STANDARD_FILES.SKILL_MD}\\` -- Skill content (what the skill teaches)\n- \\`${STANDARD_FILES.METADATA_YAML}\\` -- Skill metadata (category, author, description, custom: true)\n\n## Using This Marketplace\n\nPoint the CLI at this marketplace as a source:\n\n\\`\\`\\`bash\n# Local development\n${CLI_INVOKE_COMMAND} init --source /path/to/${name}\n\n# From a git repository\n${CLI_INVOKE_COMMAND} init --source github:your-org/${name}\n\\`\\`\\`\n\n## How It Works\n\nThe CLI auto-discovers skills from the \\`${SKILLS_DIR_PATH}/\\` directory\nand stacks from \\`${STACKS_FILE_PATH}\\`.\nCustom categories are discovered from skill \\`${STANDARD_FILES.METADATA_YAML}\\` files with \\`custom: true\\`.\nCustom skills appear alongside built-in ones in the wizard. No manual registration needed.\n`;\n}\n\nexport default class NewMarketplace extends BaseCommand {\n static summary = \"Scaffold a new private marketplace project\";\n static description =\n \"Create a new private marketplace directory with the required structure \" +\n \"for custom skills and stacks.\";\n\n static examples = [\n {\n description: \"Create a new marketplace\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills\",\n },\n {\n description: \"Initialize the current directory as a marketplace\",\n command: \"<%= config.bin %> <%= command.id %> .\",\n },\n {\n description: \"Overwrite an existing directory\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description:\n 'Name of the marketplace directory (kebab-case), or \".\" to use the current directory',\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing marketplace directory\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_MARKETPLACE_COMMAND) {\n this.error(featureDisabledError(\"new marketplace\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewMarketplace);\n const parentDir = process.cwd();\n const useCurrentDir = args.name === \".\";\n\n const marketplaceName = useCurrentDir ? path.basename(parentDir) : args.name;\n const marketplaceDir = useCurrentDir ? parentDir : path.join(parentDir, args.name);\n\n this.printHeader();\n this.validateName(marketplaceName, useCurrentDir);\n await this.checkExistingDir(marketplaceDir, useCurrentDir, flags.force);\n\n this.log(`Marketplace: ${marketplaceName}`);\n this.log(`Directory: ${marketplaceDir}`);\n this.log(\"\");\n\n try {\n const author = await resolveAuthorOrDefault(undefined, parentDir);\n await this.createMarketplaceFiles(marketplaceName, marketplaceDir, author);\n await this.buildMarketplace(marketplaceDir, marketplaceName);\n this.printNextSteps(marketplaceName, useCurrentDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Create New Marketplace\");\n this.log(\"\");\n }\n\n private validateName(name: string, useCurrentDir: boolean): void {\n const validationError = validateKebabCaseName(name, \"Marketplace\");\n if (validationError) {\n if (useCurrentDir) {\n this.error(\n `Current directory name '${name}' is not valid kebab-case. Rename it or pass an explicit name.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n }\n\n private async checkExistingDir(\n dir: string,\n useCurrentDir: boolean,\n force: boolean,\n ): Promise<void> {\n if (useCurrentDir) return;\n await this.ensureDirOverwritable(dir, force, {\n exists: `Directory already exists: ${dir}`,\n overwriting: `Overwriting existing directory at ${dir}`,\n });\n }\n\n private async createMarketplaceFiles(\n marketplaceName: string,\n marketplaceDir: string,\n author: string,\n ): Promise<void> {\n const skillName = \"dummy-skill\";\n\n this.log(\"Creating marketplace structure...\");\n\n const stacksContent = generateStacksTs(marketplaceName);\n const stacksPath = path.join(marketplaceDir, STACKS_FILE_PATH);\n await ensureDir(path.dirname(stacksPath));\n await writeFile(stacksPath, stacksContent);\n\n const categoriesContent = generateSkillCategoriesTs(\n LOCAL_DEFAULTS.CATEGORY,\n LOCAL_DEFAULTS.DOMAIN,\n );\n const categoriesPath = path.join(marketplaceDir, SKILL_CATEGORIES_PATH);\n await writeFile(categoriesPath, categoriesContent);\n\n const rulesContent = generateSkillRulesTs();\n const rulesPath = path.join(marketplaceDir, SKILL_RULES_PATH);\n await writeFile(rulesPath, rulesContent);\n\n const skillsDir = path.join(marketplaceDir, SKILLS_DIR_PATH);\n await scaffoldSkillFiles({\n name: skillName,\n author,\n category: LOCAL_DEFAULTS.CATEGORY,\n domain: LOCAL_DEFAULTS.DOMAIN,\n skillDir: path.join(skillsDir, skillName),\n });\n\n const readmeContent = generateReadme(marketplaceName);\n const readmePath = path.join(marketplaceDir, \"README.md\");\n await writeFile(readmePath, readmeContent);\n\n const configDir = path.join(marketplaceDir, CLAUDE_SRC_DIR);\n await ensureDir(configDir);\n const marketplaceComment =\n \"// Marketplaces house skills only — agents are defined by consumer projects.\\n\\n\";\n await writeMarketplaceScaffoldConfig(\n marketplaceDir,\n // Boundary cast: custom marketplace dummy skill/category not in standard unions\n {\n name: marketplaceName,\n skills: [{ id: skillName as SkillId, scope: \"project\", source: EJECT_SOURCE }],\n agents: [],\n source: \".\",\n marketplace: marketplaceName,\n stack: {\n \"web-developer\": {\n // Boundary cast: dummy-category is not in the generated Category union\n [LOCAL_DEFAULTS.CATEGORY as Category]: [{ id: skillName as SkillId }],\n },\n },\n },\n marketplaceComment,\n );\n\n this.log(\"\");\n this.logSuccess(`Created ${STACKS_FILE_PATH}`);\n this.logSuccess(`Created ${SKILL_CATEGORIES_PATH}`);\n this.logSuccess(`Created ${SKILL_RULES_PATH}`);\n this.logSuccess(\"Created README.md\");\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`);\n this.log(\"\");\n }\n\n private printNextSteps(marketplaceName: string, useCurrentDir: boolean): void {\n const steps = [\n ...(useCurrentDir ? [] : [`cd ${marketplaceName}`]),\n `${CLI_INVOKE_COMMAND} new skill <name> --category <category-name>`,\n \"Push to a git repository\",\n `${CLI_INVOKE_COMMAND} init --source github:your-org/${marketplaceName}`,\n ];\n\n this.log(\"Marketplace created successfully!\");\n this.log(\"\");\n this.log(\"Next steps:\");\n for (const [index, step] of steps.entries()) {\n this.log(` ${index + 1}. ${step}`);\n }\n this.log(\"\");\n }\n\n private async buildMarketplace(marketplaceDir: string, marketplaceName: string): Promise<void> {\n const skillsDir = path.resolve(marketplaceDir, SKILLS_DIR_PATH);\n const pluginsOutputDir = path.resolve(marketplaceDir, PLUGINS_DIST_PATH);\n const marketplaceOutputPath = marketplaceManifestPath(marketplaceDir);\n\n try {\n this.log(\"Building plugins...\");\n const { compiled, failed } = await compileAllSkillPlugins(skillsDir, pluginsOutputDir);\n this.logSuccess(`Built ${compiled.length} skill plugins.`);\n if (failed.length > 0) {\n this.warn(`${failed.length} skill(s) failed to compile: ${failed.join(\", \")}`);\n }\n\n this.log(\"Generating marketplace.json...\");\n const marketplace = await generateMarketplace(pluginsOutputDir, {\n name: marketplaceName,\n ownerName: marketplaceName,\n pluginRoot: `./${PLUGINS_DIST_PATH}`,\n });\n await writeMarketplace(marketplaceOutputPath, marketplace);\n this.logSuccess(\n `Generated ${PLUGIN_MANIFEST_DIR}/${MARKETPLACE_JSON} with ${marketplace.plugins.length} plugins.`,\n );\n\n this.log(\"Generating config-types.ts...\");\n const configTypesData = loadConfigTypesDataInBackground(marketplaceDir, marketplaceDir);\n await writeScaffoldedEntityTypes(marketplaceDir, configTypesData);\n this.logSuccess(`Generated ${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TYPES_TS}`);\n } catch (error) {\n this.warn(`Build step failed: ${getErrorMessage(error)}`);\n this.warn(\n \"The scaffold is still valid. Run 'build plugins' and 'build marketplace' manually.\",\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/commands/new/marketplace.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { writeFile, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport {\n CLAUDE_SRC_DIR,\n CLI_INVOKE_COMMAND,\n MARKETPLACE_JSON,\n PLUGIN_MANIFEST_DIR,\n marketplaceManifestPath,\n SKILL_CATEGORIES_PATH,\n SKILL_RULES_PATH,\n SKILLS_DIR_PATH,\n STACKS_FILE_PATH,\n STANDARD_FILES,\n EJECT_SOURCE,\n PLUGINS_DIST_PATH,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { validateKebabCaseName } from \"../../lib/validate-kebab-name.js\";\nimport { FEATURE_FLAGS, featureDisabledError } from \"../../lib/feature-flags.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { compileAllSkillPlugins } from \"../../lib/skills/skill-plugin-compiler.js\";\nimport { loadConfigTypesDataInBackground } from \"../../lib/configuration/config-types-writer.js\";\nimport {\n writeMarketplaceScaffoldConfig,\n writeScaffoldedEntityTypes,\n} from \"../../lib/config-gate/index.js\";\nimport { generateMarketplace, writeMarketplace } from \"../../lib/marketplace-generator.js\";\nimport { generateSkillCategoriesTs, generateSkillRulesTs } from \"../../lib/skills/generators.js\";\nimport type { Category, SkillId } from \"../../types/index.js\";\nimport { resolveAuthorOrDefault, scaffoldSkillFiles } from \"./skill.js\";\n\nexport function generateStacksTs(name: string): string {\n const data = {\n stacks: [\n {\n id: \"dummy-stack\",\n name: \"Dummy Stack\",\n description: `Default stack for ${name}`,\n agents: {\n \"web-developer\": {\n \"dummy-category\": \"dummy-skill\",\n },\n },\n philosophy: \"Ship fast, iterate faster\",\n },\n ],\n };\n const body = JSON.stringify(data, null, 2);\n return `// Stack definitions for ${name}\\nexport default ${body};\\n`;\n}\n\nexport function generateReadme(name: string): string {\n return `# ${name}\n\nPrivate marketplace for custom skills and stacks.\n\n## Directory Structure\n\n\\`\\`\\`\n${STACKS_FILE_PATH} # Stack definitions (agent groupings with skill mappings)\n${SKILLS_DIR_PATH}/ # Custom skill definitions\n\\`\\`\\`\n\n## Creating Skills\n\n\\`\\`\\`bash\n${CLI_INVOKE_COMMAND} new skill <name> --category <category-name>\n\\`\\`\\`\n\nEach skill lives in \\`${SKILLS_DIR_PATH}/<skill-name>/\\` with:\n- \\`${STANDARD_FILES.SKILL_MD}\\` -- Skill content (what the skill teaches)\n- \\`${STANDARD_FILES.METADATA_YAML}\\` -- Skill metadata (category, author, description, custom: true)\n\n## Using This Marketplace\n\nPoint the CLI at this marketplace as a source:\n\n\\`\\`\\`bash\n# Local development\n${CLI_INVOKE_COMMAND} init --source /path/to/${name}\n\n# From a git repository\n${CLI_INVOKE_COMMAND} init --source github:your-org/${name}\n\\`\\`\\`\n\n## How It Works\n\nThe CLI auto-discovers skills from the \\`${SKILLS_DIR_PATH}/\\` directory\nand stacks from \\`${STACKS_FILE_PATH}\\`.\nCustom categories are discovered from skill \\`${STANDARD_FILES.METADATA_YAML}\\` files with \\`custom: true\\`.\nCustom skills appear alongside built-in ones in the wizard. No manual registration needed.\n`;\n}\n\nexport default class NewMarketplace extends BaseCommand {\n static summary = \"Scaffold a new private marketplace project\";\n static description =\n \"Create a new private marketplace directory with the required structure \" +\n \"for custom skills and stacks.\";\n\n static examples = [\n {\n description: \"Create a new marketplace\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills\",\n },\n {\n description: \"Initialize the current directory as a marketplace\",\n command: \"<%= config.bin %> <%= command.id %> .\",\n },\n {\n description: \"Overwrite an existing directory\",\n command: \"<%= config.bin %> <%= command.id %> acme-skills --force\",\n },\n ];\n\n static args = {\n name: Args.string({\n description:\n 'Name of the marketplace directory (kebab-case), or \".\" to use the current directory',\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing marketplace directory\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n if (!FEATURE_FLAGS.NEW_MARKETPLACE_COMMAND) {\n this.error(featureDisabledError(\"new marketplace\"), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n const { args, flags } = await this.parse(NewMarketplace);\n const parentDir = process.cwd();\n const useCurrentDir = args.name === \".\";\n\n const marketplaceName = useCurrentDir ? path.basename(parentDir) : args.name;\n const marketplaceDir = useCurrentDir ? parentDir : path.join(parentDir, args.name);\n\n this.printHeader();\n this.validateName(marketplaceName, useCurrentDir);\n await this.checkExistingDir(marketplaceDir, useCurrentDir, flags.force);\n\n this.log(`Marketplace: ${marketplaceName}`);\n this.log(`Directory: ${marketplaceDir}`);\n this.log(\"\");\n\n try {\n const author = await resolveAuthorOrDefault(undefined, parentDir);\n await this.createMarketplaceFiles(marketplaceName, marketplaceDir, author);\n await this.buildMarketplace(marketplaceDir, marketplaceName);\n this.printNextSteps(marketplaceName, useCurrentDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private printHeader(): void {\n this.log(\"\");\n this.log(\"Create New Marketplace\");\n this.log(\"\");\n }\n\n private validateName(name: string, useCurrentDir: boolean): void {\n const validationError = validateKebabCaseName(name, \"Marketplace\");\n if (validationError) {\n if (useCurrentDir) {\n this.error(\n `Current directory name '${name}' is not valid kebab-case. Rename it or pass an explicit name.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n }\n\n private async checkExistingDir(\n dir: string,\n useCurrentDir: boolean,\n force: boolean,\n ): Promise<void> {\n if (useCurrentDir) return;\n await this.ensureDirOverwritable(dir, force, {\n exists: `Directory already exists: ${dir}`,\n overwriting: `Overwriting existing directory at ${dir}`,\n });\n }\n\n private async createMarketplaceFiles(\n marketplaceName: string,\n marketplaceDir: string,\n author: string,\n ): Promise<void> {\n const skillName = \"dummy-skill\";\n\n this.log(\"Creating marketplace structure...\");\n\n const stacksContent = generateStacksTs(marketplaceName);\n const stacksPath = path.join(marketplaceDir, STACKS_FILE_PATH);\n await ensureDir(path.dirname(stacksPath));\n await writeFile(stacksPath, stacksContent);\n\n const categoriesContent = generateSkillCategoriesTs(\n LOCAL_DEFAULTS.CATEGORY,\n LOCAL_DEFAULTS.DOMAIN,\n );\n const categoriesPath = path.join(marketplaceDir, SKILL_CATEGORIES_PATH);\n await writeFile(categoriesPath, categoriesContent);\n\n const rulesContent = generateSkillRulesTs();\n const rulesPath = path.join(marketplaceDir, SKILL_RULES_PATH);\n await writeFile(rulesPath, rulesContent);\n\n const skillsDir = path.join(marketplaceDir, SKILLS_DIR_PATH);\n await scaffoldSkillFiles({\n name: skillName,\n author,\n category: LOCAL_DEFAULTS.CATEGORY,\n domain: LOCAL_DEFAULTS.DOMAIN,\n skillDir: path.join(skillsDir, skillName),\n });\n\n const readmeContent = generateReadme(marketplaceName);\n const readmePath = path.join(marketplaceDir, \"README.md\");\n await writeFile(readmePath, readmeContent);\n\n const configDir = path.join(marketplaceDir, CLAUDE_SRC_DIR);\n await ensureDir(configDir);\n const marketplaceComment =\n \"// Marketplaces house skills only — agents are defined by consumer projects.\\n\\n\";\n await writeMarketplaceScaffoldConfig(\n marketplaceDir,\n // Boundary cast: custom marketplace dummy skill/category not in standard unions\n {\n name: marketplaceName,\n skills: [{ id: skillName as SkillId, scope: \"project\", source: EJECT_SOURCE }],\n agents: [],\n source: \".\",\n marketplace: marketplaceName,\n stack: {\n \"web-developer\": {\n // Boundary cast: dummy-category is not in the generated Category union\n [LOCAL_DEFAULTS.CATEGORY as Category]: [{ id: skillName as SkillId }],\n },\n },\n },\n marketplaceComment,\n );\n\n this.log(\"\");\n this.logSuccess(`Created ${STACKS_FILE_PATH}`);\n this.logSuccess(`Created ${SKILL_CATEGORIES_PATH}`);\n this.logSuccess(`Created ${SKILL_RULES_PATH}`);\n this.logSuccess(\"Created README.md\");\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TS}`);\n this.log(\"\");\n }\n\n private printNextSteps(marketplaceName: string, useCurrentDir: boolean): void {\n const steps = [\n ...(useCurrentDir ? [] : [`cd ${marketplaceName}`]),\n `${CLI_INVOKE_COMMAND} new skill <name> --category <category-name>`,\n \"Push to a git repository\",\n `${CLI_INVOKE_COMMAND} init --source github:your-org/${marketplaceName}`,\n ];\n\n this.log(\"Marketplace created successfully!\");\n this.log(\"\");\n this.log(\"Next steps:\");\n for (const [index, step] of steps.entries()) {\n this.log(` ${index + 1}. ${step}`);\n }\n this.log(\"\");\n }\n\n private async buildMarketplace(marketplaceDir: string, marketplaceName: string): Promise<void> {\n const skillsDir = path.resolve(marketplaceDir, SKILLS_DIR_PATH);\n const pluginsOutputDir = path.resolve(marketplaceDir, PLUGINS_DIST_PATH);\n const marketplaceOutputPath = marketplaceManifestPath(marketplaceDir);\n\n try {\n this.log(\"Building plugins...\");\n const { compiled, failed } = await compileAllSkillPlugins(skillsDir, pluginsOutputDir);\n this.logSuccess(`Built ${compiled.length} skill plugins.`);\n if (failed.length > 0) {\n this.warn(`${failed.length} skill(s) failed to compile: ${failed.join(\", \")}`);\n }\n\n this.log(\"Generating marketplace.json...\");\n const marketplace = await generateMarketplace(pluginsOutputDir, {\n name: marketplaceName,\n ownerName: marketplaceName,\n pluginRoot: `./${PLUGINS_DIST_PATH}`,\n });\n await writeMarketplace(marketplaceOutputPath, marketplace);\n this.logSuccess(\n `Generated ${PLUGIN_MANIFEST_DIR}/${MARKETPLACE_JSON} with ${marketplace.plugins.length} plugins.`,\n );\n\n this.log(\"Generating config-types.ts...\");\n const configTypesData = loadConfigTypesDataInBackground(marketplaceDir, marketplaceDir);\n await writeScaffoldedEntityTypes(marketplaceDir, configTypesData);\n this.logSuccess(`Generated ${CLAUDE_SRC_DIR}/${STANDARD_FILES.CONFIG_TYPES_TS}`);\n } catch (error) {\n this.warn(`Build step failed: ${getErrorMessage(error)}`);\n this.warn(\n \"The scaffold is still valid. Run 'build plugins' and 'build marketplace' manually.\",\n );\n }\n }\n}\n"],"mappings":"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","names":[]}