@agents-inc/cli 0.88.0 → 0.91.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 (237) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/{chunk-RWVF6DQE.js → chunk-2RFE7LTV.js} +3 -3
  3. package/dist/{chunk-ZFQTKY2S.js → chunk-2RXDM5HN.js} +5 -5
  4. package/dist/chunk-2RXDM5HN.js.map +1 -0
  5. package/dist/{chunk-CKZ65VFJ.js → chunk-35WALWDD.js} +5 -5
  6. package/dist/chunk-35WALWDD.js.map +1 -0
  7. package/dist/{chunk-BEZ6ZPDS.js → chunk-3O57Z6Q3.js} +3 -3
  8. package/dist/{chunk-2DRPZXXK.js → chunk-3STOCHK4.js} +4 -4
  9. package/dist/{chunk-ANXHMG32.js → chunk-47HMJ4BY.js} +28 -1
  10. package/dist/chunk-47HMJ4BY.js.map +1 -0
  11. package/dist/{chunk-LHUK5L6P.js → chunk-4DZNTUK7.js} +23 -10
  12. package/dist/chunk-4DZNTUK7.js.map +1 -0
  13. package/dist/{chunk-REZZSDXG.js → chunk-5IR4QU7G.js} +37 -24
  14. package/dist/chunk-5IR4QU7G.js.map +1 -0
  15. package/dist/{chunk-TAPEVEET.js → chunk-7K7SA4TZ.js} +2 -2
  16. package/dist/chunk-7QWCPF6F.js +135 -0
  17. package/dist/chunk-7QWCPF6F.js.map +1 -0
  18. package/dist/{chunk-WTPPVXJP.js → chunk-AWB6DO24.js} +17 -10
  19. package/dist/chunk-AWB6DO24.js.map +1 -0
  20. package/dist/{chunk-SB2R5KHJ.js → chunk-BGICSUQK.js} +2 -2
  21. package/dist/{chunk-HK53FRMU.js → chunk-DVBA6PGR.js} +3 -7
  22. package/dist/{chunk-HK53FRMU.js.map → chunk-DVBA6PGR.js.map} +1 -1
  23. package/dist/{chunk-YM3V4Q3W.js → chunk-DZ2IQERZ.js} +5 -5
  24. package/dist/{chunk-I5AZKNNL.js → chunk-FEKVKYCN.js} +2 -2
  25. package/dist/{chunk-EADZIYQW.js → chunk-FVBSRBU3.js} +30 -21
  26. package/dist/chunk-FVBSRBU3.js.map +1 -0
  27. package/dist/{chunk-6YR2NEW3.js → chunk-G3VPBEBC.js} +2 -2
  28. package/dist/{chunk-JNUFQBXX.js → chunk-HCSIS35Y.js} +2 -2
  29. package/dist/{chunk-NPMMU4GY.js → chunk-IR7ADPAZ.js} +56 -1
  30. package/dist/chunk-IR7ADPAZ.js.map +1 -0
  31. package/dist/{chunk-AP4DLJDP.js → chunk-JBS4CCJG.js} +2 -2
  32. package/dist/chunk-M6J5YQ3P.js +100 -0
  33. package/dist/chunk-M6J5YQ3P.js.map +1 -0
  34. package/dist/{chunk-23M3SPXX.js → chunk-MBEXASMU.js} +8 -8
  35. package/dist/{chunk-TEA5KBIA.js → chunk-NESVWSI7.js} +2 -2
  36. package/dist/{chunk-ZTRQO5CX.js → chunk-OOHPUT5M.js} +2 -2
  37. package/dist/{chunk-V36FRPAU.js → chunk-ORTNQZLF.js} +4 -2
  38. package/dist/{chunk-V36FRPAU.js.map → chunk-ORTNQZLF.js.map} +1 -1
  39. package/dist/{chunk-ANZV33N5.js → chunk-OVY7IV3C.js} +2 -2
  40. package/dist/{chunk-ITBSJNIC.js → chunk-Q3NIGPRZ.js} +3 -3
  41. package/dist/{chunk-5IYZGJDW.js → chunk-RDQBXB3Y.js} +6 -6
  42. package/dist/{chunk-MY4TVLRB.js → chunk-TJHCK4OS.js} +4 -4
  43. package/dist/{chunk-PZBLGD7O.js → chunk-UCORQ7YO.js} +2 -2
  44. package/dist/{chunk-NL5EB57E.js → chunk-UHARXISZ.js} +4 -4
  45. package/dist/chunk-UHARXISZ.js.map +1 -0
  46. package/dist/{chunk-57KI55GJ.js → chunk-UK572773.js} +3 -3
  47. package/dist/{chunk-DDCW4SKN.js → chunk-V75HVZTB.js} +7 -6
  48. package/dist/chunk-V75HVZTB.js.map +1 -0
  49. package/dist/{chunk-6XWHJHNZ.js → chunk-WEYWZ7UE.js} +4 -1
  50. package/dist/chunk-WEYWZ7UE.js.map +1 -0
  51. package/dist/{chunk-STMRDPGZ.js → chunk-XM2Y5AFQ.js} +2 -2
  52. package/dist/commands/build/marketplace.js +62 -44
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +46 -37
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/build/stack.js +43 -35
  57. package/dist/commands/build/stack.js.map +1 -1
  58. package/dist/commands/compile.js +44 -41
  59. package/dist/commands/compile.js.map +1 -1
  60. package/dist/commands/config/index.js +8 -8
  61. package/dist/commands/config/path.js +7 -7
  62. package/dist/commands/config/show.js +8 -8
  63. package/dist/commands/diff.js +13 -12
  64. package/dist/commands/diff.js.map +1 -1
  65. package/dist/commands/doctor.js +17 -40
  66. package/dist/commands/doctor.js.map +1 -1
  67. package/dist/commands/edit.js +63 -70
  68. package/dist/commands/edit.js.map +1 -1
  69. package/dist/commands/eject.js +9 -9
  70. package/dist/commands/import/skill.js +60 -50
  71. package/dist/commands/import/skill.js.map +1 -1
  72. package/dist/commands/info.js +9 -9
  73. package/dist/commands/init.js +28 -29
  74. package/dist/commands/list.js +7 -7
  75. package/dist/commands/new/agent.js +8 -8
  76. package/dist/commands/new/marketplace.js +98 -83
  77. package/dist/commands/new/marketplace.js.map +1 -1
  78. package/dist/commands/new/skill.js +7 -7
  79. package/dist/commands/outdated.js +91 -100
  80. package/dist/commands/outdated.js.map +1 -1
  81. package/dist/commands/search.js +11 -11
  82. package/dist/commands/uninstall.js +40 -31
  83. package/dist/commands/uninstall.js.map +1 -1
  84. package/dist/commands/update.js +9 -9
  85. package/dist/commands/validate.js +7 -7
  86. package/dist/components/skill-search/skill-search.js +2 -2
  87. package/dist/components/wizard/category-grid.js +3 -3
  88. package/dist/components/wizard/category-grid.test.js +12 -12
  89. package/dist/components/wizard/domain-selection.js +9 -9
  90. package/dist/components/wizard/info-panel.js +18 -0
  91. package/dist/components/wizard/search-modal.js +2 -2
  92. package/dist/components/wizard/search-modal.test.js +2 -2
  93. package/dist/components/wizard/source-grid.js +4 -4
  94. package/dist/components/wizard/source-grid.test.js +13 -13
  95. package/dist/components/wizard/stack-selection.js +8 -8
  96. package/dist/components/wizard/stats-panel.js +106 -5
  97. package/dist/components/wizard/stats-panel.js.map +1 -1
  98. package/dist/components/wizard/step-agents.js +9 -9
  99. package/dist/components/wizard/step-agents.test.js +12 -12
  100. package/dist/components/wizard/step-build.js +10 -11
  101. package/dist/components/wizard/step-build.test.js +13 -14
  102. package/dist/components/wizard/step-build.test.js.map +1 -1
  103. package/dist/components/wizard/step-confirm.js +4 -4
  104. package/dist/components/wizard/step-confirm.test.js +10 -10
  105. package/dist/components/wizard/step-refine.js +2 -2
  106. package/dist/components/wizard/step-refine.test.js +2 -2
  107. package/dist/components/wizard/step-settings.js +8 -8
  108. package/dist/components/wizard/step-settings.test.js +11 -11
  109. package/dist/components/wizard/step-sources.js +12 -12
  110. package/dist/components/wizard/step-sources.test.js +15 -15
  111. package/dist/components/wizard/step-stack.js +9 -9
  112. package/dist/components/wizard/step-stack.test.js +10 -10
  113. package/dist/components/wizard/wizard-layout.js +12 -12
  114. package/dist/components/wizard/wizard.js +24 -25
  115. package/dist/config-exports.js +1 -1
  116. package/dist/hooks/init.js +28 -29
  117. package/dist/hooks/init.js.map +1 -1
  118. package/dist/{loader-SQOK2BF7.js → loader-D5VE56SI.js} +4 -4
  119. package/dist/{source-loader-CCECAU5L.js → source-loader-INCCYL5P.js} +7 -7
  120. package/dist/source-manager-TEOUO734.js +19 -0
  121. package/dist/src/agents/developer/ai-developer/critical-reminders.md +31 -0
  122. package/dist/src/agents/developer/ai-developer/critical-requirements.md +17 -0
  123. package/dist/src/agents/developer/ai-developer/examples.md +137 -0
  124. package/dist/src/agents/developer/ai-developer/intro.md +23 -0
  125. package/dist/src/agents/developer/ai-developer/metadata.yaml +12 -0
  126. package/dist/src/agents/developer/ai-developer/output-format.md +228 -0
  127. package/dist/src/agents/developer/ai-developer/workflow.md +464 -0
  128. package/dist/src/agents/planning/api-pm/critical-reminders.md +32 -0
  129. package/dist/src/agents/planning/api-pm/critical-requirements.md +21 -0
  130. package/dist/src/agents/planning/api-pm/examples.md +157 -0
  131. package/dist/src/agents/planning/api-pm/intro.md +14 -0
  132. package/dist/src/agents/planning/api-pm/metadata.yaml +12 -0
  133. package/dist/src/agents/planning/api-pm/output-format.md +317 -0
  134. package/dist/src/agents/planning/api-pm/workflow.md +214 -0
  135. package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
  136. package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
  137. package/dist/src/agents/reviewer/ai-reviewer/examples.md +131 -0
  138. package/dist/src/agents/reviewer/ai-reviewer/intro.md +23 -0
  139. package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
  140. package/dist/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
  141. package/dist/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
  142. package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
  143. package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
  144. package/dist/src/agents/reviewer/infra-reviewer/examples.md +123 -0
  145. package/dist/src/agents/reviewer/infra-reviewer/intro.md +25 -0
  146. package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
  147. package/dist/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
  148. package/dist/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
  149. package/dist/src/agents/tester/api-tester/critical-reminders.md +23 -0
  150. package/dist/src/agents/tester/api-tester/critical-requirements.md +19 -0
  151. package/dist/src/agents/tester/api-tester/examples.md +74 -0
  152. package/dist/src/agents/tester/api-tester/intro.md +21 -0
  153. package/dist/src/agents/tester/api-tester/metadata.yaml +12 -0
  154. package/dist/src/agents/tester/api-tester/output-format.md +209 -0
  155. package/dist/src/agents/tester/api-tester/workflow.md +364 -0
  156. package/dist/stores/wizard-store.js +7 -7
  157. package/dist/stores/wizard-store.test.js +26 -26
  158. package/dist/stores/wizard-store.test.js.map +1 -1
  159. package/package.json +1 -1
  160. package/src/agents/developer/ai-developer/critical-reminders.md +31 -0
  161. package/src/agents/developer/ai-developer/critical-requirements.md +17 -0
  162. package/src/agents/developer/ai-developer/examples.md +137 -0
  163. package/src/agents/developer/ai-developer/intro.md +23 -0
  164. package/src/agents/developer/ai-developer/metadata.yaml +12 -0
  165. package/src/agents/developer/ai-developer/output-format.md +228 -0
  166. package/src/agents/developer/ai-developer/workflow.md +464 -0
  167. package/src/agents/planning/api-pm/critical-reminders.md +32 -0
  168. package/src/agents/planning/api-pm/critical-requirements.md +21 -0
  169. package/src/agents/planning/api-pm/examples.md +157 -0
  170. package/src/agents/planning/api-pm/intro.md +14 -0
  171. package/src/agents/planning/api-pm/metadata.yaml +12 -0
  172. package/src/agents/planning/api-pm/output-format.md +317 -0
  173. package/src/agents/planning/api-pm/workflow.md +214 -0
  174. package/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
  175. package/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
  176. package/src/agents/reviewer/ai-reviewer/examples.md +131 -0
  177. package/src/agents/reviewer/ai-reviewer/intro.md +23 -0
  178. package/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
  179. package/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
  180. package/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
  181. package/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
  182. package/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
  183. package/src/agents/reviewer/infra-reviewer/examples.md +123 -0
  184. package/src/agents/reviewer/infra-reviewer/intro.md +25 -0
  185. package/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
  186. package/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
  187. package/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
  188. package/src/agents/tester/api-tester/critical-reminders.md +23 -0
  189. package/src/agents/tester/api-tester/critical-requirements.md +19 -0
  190. package/src/agents/tester/api-tester/examples.md +74 -0
  191. package/src/agents/tester/api-tester/intro.md +21 -0
  192. package/src/agents/tester/api-tester/metadata.yaml +12 -0
  193. package/src/agents/tester/api-tester/output-format.md +209 -0
  194. package/src/agents/tester/api-tester/workflow.md +364 -0
  195. package/dist/chunk-6XWHJHNZ.js.map +0 -1
  196. package/dist/chunk-ANXHMG32.js.map +0 -1
  197. package/dist/chunk-ATPHV3MD.js +0 -143
  198. package/dist/chunk-ATPHV3MD.js.map +0 -1
  199. package/dist/chunk-CKZ65VFJ.js.map +0 -1
  200. package/dist/chunk-DDCW4SKN.js.map +0 -1
  201. package/dist/chunk-EADZIYQW.js.map +0 -1
  202. package/dist/chunk-FQTYF3OU.js +0 -114
  203. package/dist/chunk-FQTYF3OU.js.map +0 -1
  204. package/dist/chunk-LHUK5L6P.js.map +0 -1
  205. package/dist/chunk-NL5EB57E.js.map +0 -1
  206. package/dist/chunk-NPMMU4GY.js.map +0 -1
  207. package/dist/chunk-REZZSDXG.js.map +0 -1
  208. package/dist/chunk-VWTZOBBQ.js +0 -111
  209. package/dist/chunk-VWTZOBBQ.js.map +0 -1
  210. package/dist/chunk-WTPPVXJP.js.map +0 -1
  211. package/dist/chunk-ZFQTKY2S.js.map +0 -1
  212. package/dist/components/wizard/help-modal.js +0 -18
  213. package/dist/source-manager-4P7MTZRR.js +0 -19
  214. /package/dist/{chunk-RWVF6DQE.js.map → chunk-2RFE7LTV.js.map} +0 -0
  215. /package/dist/{chunk-BEZ6ZPDS.js.map → chunk-3O57Z6Q3.js.map} +0 -0
  216. /package/dist/{chunk-2DRPZXXK.js.map → chunk-3STOCHK4.js.map} +0 -0
  217. /package/dist/{chunk-TAPEVEET.js.map → chunk-7K7SA4TZ.js.map} +0 -0
  218. /package/dist/{chunk-SB2R5KHJ.js.map → chunk-BGICSUQK.js.map} +0 -0
  219. /package/dist/{chunk-YM3V4Q3W.js.map → chunk-DZ2IQERZ.js.map} +0 -0
  220. /package/dist/{chunk-I5AZKNNL.js.map → chunk-FEKVKYCN.js.map} +0 -0
  221. /package/dist/{chunk-6YR2NEW3.js.map → chunk-G3VPBEBC.js.map} +0 -0
  222. /package/dist/{chunk-JNUFQBXX.js.map → chunk-HCSIS35Y.js.map} +0 -0
  223. /package/dist/{chunk-AP4DLJDP.js.map → chunk-JBS4CCJG.js.map} +0 -0
  224. /package/dist/{chunk-23M3SPXX.js.map → chunk-MBEXASMU.js.map} +0 -0
  225. /package/dist/{chunk-TEA5KBIA.js.map → chunk-NESVWSI7.js.map} +0 -0
  226. /package/dist/{chunk-ZTRQO5CX.js.map → chunk-OOHPUT5M.js.map} +0 -0
  227. /package/dist/{chunk-ANZV33N5.js.map → chunk-OVY7IV3C.js.map} +0 -0
  228. /package/dist/{chunk-ITBSJNIC.js.map → chunk-Q3NIGPRZ.js.map} +0 -0
  229. /package/dist/{chunk-5IYZGJDW.js.map → chunk-RDQBXB3Y.js.map} +0 -0
  230. /package/dist/{chunk-MY4TVLRB.js.map → chunk-TJHCK4OS.js.map} +0 -0
  231. /package/dist/{chunk-PZBLGD7O.js.map → chunk-UCORQ7YO.js.map} +0 -0
  232. /package/dist/{chunk-57KI55GJ.js.map → chunk-UK572773.js.map} +0 -0
  233. /package/dist/{chunk-STMRDPGZ.js.map → chunk-XM2Y5AFQ.js.map} +0 -0
  234. /package/dist/components/wizard/{help-modal.js.map → info-panel.js.map} +0 -0
  235. /package/dist/{loader-SQOK2BF7.js.map → loader-D5VE56SI.js.map} +0 -0
  236. /package/dist/{source-loader-CCECAU5L.js.map → source-loader-INCCYL5P.js.map} +0 -0
  237. /package/dist/{source-manager-4P7MTZRR.js.map → source-manager-TEOUO734.js.map} +0 -0
@@ -8,13 +8,13 @@ import {
8
8
  computeFileHash,
9
9
  fetchFromSource,
10
10
  getCurrentDate
11
- } from "../../chunk-EADZIYQW.js";
12
- import "../../chunk-STMRDPGZ.js";
13
- import "../../chunk-ANXHMG32.js";
11
+ } from "../../chunk-FVBSRBU3.js";
12
+ import "../../chunk-XM2Y5AFQ.js";
13
+ import "../../chunk-47HMJ4BY.js";
14
14
  import {
15
15
  BaseCommand,
16
16
  EXIT_CODES
17
- } from "../../chunk-TAPEVEET.js";
17
+ } from "../../chunk-7K7SA4TZ.js";
18
18
  import {
19
19
  copy,
20
20
  directoryExists,
@@ -26,8 +26,8 @@ import {
26
26
  readFile,
27
27
  warn,
28
28
  writeFile
29
- } from "../../chunk-ZTRQO5CX.js";
30
- import "../../chunk-6XWHJHNZ.js";
29
+ } from "../../chunk-OOHPUT5M.js";
30
+ import "../../chunk-WEYWZ7UE.js";
31
31
  import {
32
32
  DEFAULT_SKILLS_SUBDIR,
33
33
  GITHUB_SOURCE,
@@ -35,7 +35,7 @@ import {
35
35
  STANDARD_FILES,
36
36
  YAML_FORMATTING
37
37
  } from "../../chunk-6PGL2XMY.js";
38
- import "../../chunk-NPMMU4GY.js";
38
+ import "../../chunk-IR7ADPAZ.js";
39
39
  import {
40
40
  init_esm_shims
41
41
  } from "../../chunk-DHET7RCE.js";
@@ -310,64 +310,71 @@ Create one with:
310
310
  await injectImportedForkedFromMetadata(destPath, skillName, displaySource, contentHash);
311
311
  }
312
312
  async function injectImportedForkedFromMetadata(destPath, skillName, source, contentHash) {
313
- const metadataYamlPath = path.join(destPath, STANDARD_FILES.METADATA_YAML);
314
- const metadataJsonPath = path.join(destPath, STANDARD_FILES.METADATA_JSON);
315
313
  const forkedFrom = {
316
314
  source,
317
315
  skillName,
318
316
  contentHash,
319
317
  date: getCurrentDate()
320
318
  };
321
- if (await fileExists(metadataYamlPath)) {
322
- const rawContent = await readFile(metadataYamlPath);
323
- const lines = rawContent.split("\n");
324
- let yamlContent2 = rawContent;
325
- let schemaComment = "";
326
- if (lines[0]?.startsWith("# yaml-language-server:")) {
327
- schemaComment = `${lines[0]}
319
+ const yamlPath = path.join(destPath, STANDARD_FILES.METADATA_YAML);
320
+ const jsonPath = path.join(destPath, STANDARD_FILES.METADATA_JSON);
321
+ if (await fileExists(yamlPath)) {
322
+ return mergeForkedFromIntoYaml(yamlPath, forkedFrom);
323
+ }
324
+ if (await fileExists(jsonPath)) {
325
+ return convertJsonToYamlWithForkedFrom(jsonPath, yamlPath, forkedFrom);
326
+ }
327
+ return createMinimalMetadata(yamlPath, skillName, forkedFrom);
328
+ }
329
+ async function mergeForkedFromIntoYaml(yamlPath, forkedFrom) {
330
+ const rawContent = await readFile(yamlPath);
331
+ const lines = rawContent.split("\n");
332
+ let yamlContent = rawContent;
333
+ let schemaComment = "";
334
+ if (lines[0]?.startsWith("# yaml-language-server:")) {
335
+ schemaComment = `${lines[0]}
328
336
  `;
329
- yamlContent2 = lines.slice(1).join("\n");
330
- }
331
- const raw = parseYaml(yamlContent2);
332
- const parseResult = importedSkillMetadataSchema.safeParse(raw);
333
- if (!parseResult.success) {
334
- warn(
335
- `Malformed metadata.yaml at ${metadataYamlPath} \u2014 existing fields may be lost
337
+ yamlContent = lines.slice(1).join("\n");
338
+ }
339
+ const raw = parseYaml(yamlContent);
340
+ const parseResult = importedSkillMetadataSchema.safeParse(raw);
341
+ if (!parseResult.success) {
342
+ warn(
343
+ `Malformed metadata.yaml at ${yamlPath} \u2014 existing fields may be lost
336
344
  Validation errors: ${parseResult.error.issues.map((i) => i.message).join(", ")}
337
345
  Expected fields: displayName (string), cliDescription (string), category (string)
338
346
  Validate your YAML syntax at https://yamllint.com`
339
- );
340
- }
341
- const metadata = parseResult.success ? parseResult.data : { forkedFrom: void 0 };
342
- metadata.forkedFrom = forkedFrom;
343
- const newYamlContent = stringifyYaml(metadata, {
344
- lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE
345
- });
346
- await writeFile(metadataYamlPath, schemaComment + newYamlContent);
347
- return;
347
+ );
348
348
  }
349
- if (await fileExists(metadataJsonPath)) {
350
- const rawContent = await readFile(metadataJsonPath);
351
- let jsonParsed;
352
- try {
353
- jsonParsed = JSON.parse(rawContent);
354
- } catch {
355
- warn(
356
- `Malformed JSON in ${metadataJsonPath} \u2014 skipping metadata injection
349
+ const metadata = parseResult.success ? parseResult.data : { forkedFrom: void 0 };
350
+ metadata.forkedFrom = forkedFrom;
351
+ const newYamlContent = stringifyYaml(metadata, {
352
+ lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE
353
+ });
354
+ await writeFile(yamlPath, schemaComment + newYamlContent);
355
+ }
356
+ async function convertJsonToYamlWithForkedFrom(jsonPath, yamlPath, forkedFrom) {
357
+ const rawContent = await readFile(jsonPath);
358
+ let jsonParsed;
359
+ try {
360
+ jsonParsed = JSON.parse(rawContent);
361
+ } catch {
362
+ warn(
363
+ `Malformed JSON in ${jsonPath} \u2014 skipping metadata injection
357
364
  Common issues: trailing commas, unquoted keys, single quotes instead of double quotes
358
365
  Validate your JSON at https://jsonlint.com`
359
- );
360
- return;
361
- }
362
- const jsonResult = importedSkillMetadataSchema.safeParse(jsonParsed);
363
- const metadata = jsonResult.success ? jsonResult.data : { forkedFrom: void 0 };
364
- metadata.forkedFrom = forkedFrom;
365
- const yamlContent2 = stringifyYaml(metadata, { lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE });
366
- await writeFile(metadataYamlPath, yamlContent2);
366
+ );
367
367
  return;
368
368
  }
369
+ const jsonResult = importedSkillMetadataSchema.safeParse(jsonParsed);
370
+ const metadata = jsonResult.success ? jsonResult.data : { forkedFrom: void 0 };
371
+ metadata.forkedFrom = forkedFrom;
372
+ const yamlContent = stringifyYaml(metadata, { lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE });
373
+ await writeFile(yamlPath, yamlContent);
374
+ }
375
+ async function createMinimalMetadata(yamlPath, skillName, forkedFrom) {
369
376
  const minimalMetadata = {
370
- displayName: skillName.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" "),
377
+ displayName: toTitleCase(skillName),
371
378
  cliDescription: "Imported from third-party repository",
372
379
  category: IMPORT_DEFAULTS.CATEGORY,
373
380
  author: IMPORT_DEFAULTS.AUTHOR,
@@ -376,7 +383,10 @@ async function injectImportedForkedFromMetadata(destPath, skillName, source, con
376
383
  const yamlContent = stringifyYaml(minimalMetadata, {
377
384
  lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE
378
385
  });
379
- await writeFile(metadataYamlPath, yamlContent);
386
+ await writeFile(yamlPath, yamlContent);
387
+ }
388
+ function toTitleCase(kebab) {
389
+ return kebab.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
380
390
  }
381
391
  export {
382
392
  ImportSkill as default
@@ -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, stringify as stringifyYaml } 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 { getCurrentDate, computeFileHash } from \"../../lib/versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n listDirectories,\n readFile,\n writeFile,\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 YAML_FORMATTING,\n} from \"../../consts.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 description: \"Import with custom skills directory\",\n command:\n \"<%= config.bin %> import skill github:owner/repo --skill my-skill --subdir custom-skills\",\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 static flags = {\n ...BaseCommand.baseFlags,\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 subdir: Flags.string({\n description: \"Subdirectory containing skills (default: skills)\",\n default: DEFAULT_SKILLS_SUBDIR,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skills\",\n default: false,\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote (ignore cache)\",\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, flags.refresh);\n const skillsDir = this.resolveSkillsDir(repoPath, flags.subdir);\n const availableSkills = await this.discoverAndValidate(skillsDir, flags.subdir);\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(\n gigetSource: string,\n sourceArg: string,\n refresh: boolean,\n ): Promise<string> {\n this.log(STATUS_MESSAGES.FETCHING_REPOSITORY);\n\n try {\n const result = await fetchSkillSource({\n gigetSource,\n forceRefresh: refresh,\n });\n this.log(result.fromCache ? \"Using cached source\" : \"Downloaded fresh copy\");\n return result.path;\n } catch (error) {\n this.error(error instanceof Error ? error.message : `Failed to fetch: ${sourceArg}`, {\n exit: EXIT_CODES.NETWORK_ERROR,\n });\n }\n }\n\n private resolveSkillsDir(repoPath: string, subdir: string): string {\n if (/\\0/.test(subdir)) {\n this.error(\"--subdir contains null bytes\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n if (path.isAbsolute(subdir)) {\n this.error(`--subdir must be a relative path, got: ${subdir}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n const skillsDir = path.resolve(path.join(repoPath, subdir));\n const resolvedRepoPath = path.resolve(repoPath);\n if (!skillsDir.startsWith(resolvedRepoPath + path.sep) && skillsDir !== resolvedRepoPath) {\n this.error(`--subdir path escapes repository boundary: ${subdir}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n return skillsDir;\n }\n\n private async discoverAndValidate(skillsDir: string, subdir: string): Promise<string[]> {\n if (!(await directoryExists(skillsDir))) {\n this.error(\n `Skills directory not found: ${subdir}\\n` +\n `The repository doesn't have a '${subdir}' directory.\\n` +\n `Use --subdir to specify a different location.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const availableSkills = await discoverValidSkills(skillsDir);\n\n if (availableSkills.length === 0) {\n this.error(`No valid skills found in ${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 forceRefresh?: boolean;\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 forceRefresh: options.forceRefresh,\n });\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 validSkills: string[] = [];\n\n for (const skillDir of skillDirs) {\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n if (await fileExists(skillMdPath)) {\n validSkills.push(skillDir);\n }\n }\n\n return validSkills.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 metadataYamlPath = path.join(destPath, STANDARD_FILES.METADATA_YAML);\n const metadataJsonPath = path.join(destPath, STANDARD_FILES.METADATA_JSON);\n\n const forkedFrom: ImportedForkedFromMetadata = {\n source,\n skillName,\n contentHash,\n date: getCurrentDate(),\n };\n\n if (await fileExists(metadataYamlPath)) {\n const rawContent = await readFile(metadataYamlPath);\n const lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n let schemaComment = \"\";\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n schemaComment = `${lines[0]}\\n`;\n yamlContent = lines.slice(1).join(\"\\n\");\n }\n\n const raw = parseYaml(yamlContent);\n const parseResult = importedSkillMetadataSchema.safeParse(raw);\n if (!parseResult.success) {\n warn(\n `Malformed metadata.yaml at ${metadataYamlPath} — 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 = parseResult.success\n ? (parseResult.data as SkillMetadata)\n : { forkedFrom: undefined };\n metadata.forkedFrom = forkedFrom;\n\n const newYamlContent = stringifyYaml(metadata, {\n lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE,\n });\n await writeFile(metadataYamlPath, schemaComment + newYamlContent);\n return;\n }\n\n if (await fileExists(metadataJsonPath)) {\n const rawContent = await readFile(metadataJsonPath);\n let jsonParsed: unknown;\n try {\n jsonParsed = JSON.parse(rawContent);\n } catch {\n warn(\n `Malformed JSON in ${metadataJsonPath} — 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 = jsonResult.success\n ? (jsonResult.data as SkillMetadata)\n : { forkedFrom: undefined };\n metadata.forkedFrom = forkedFrom;\n\n const yamlContent = stringifyYaml(metadata, { lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE });\n await writeFile(metadataYamlPath, yamlContent);\n return;\n }\n\n const minimalMetadata: SkillMetadata = {\n displayName: skillName\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \"),\n cliDescription: \"Imported from third-party repository\",\n category: IMPORT_DEFAULTS.CATEGORY,\n author: IMPORT_DEFAULTS.AUTHOR,\n forkedFrom,\n };\n\n const yamlContent = stringifyYaml(minimalMetadata, {\n lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE,\n });\n await writeFile(metadataYamlPath, yamlContent);\n}\n"],"mappings":"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","names":["path","yamlContent"]}
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, stringify as stringifyYaml } 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 { getCurrentDate, computeFileHash } from \"../../lib/versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n listDirectories,\n readFile,\n writeFile,\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 YAML_FORMATTING,\n} from \"../../consts.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 description: \"Import with custom skills directory\",\n command:\n \"<%= config.bin %> import skill github:owner/repo --skill my-skill --subdir custom-skills\",\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 static flags = {\n ...BaseCommand.baseFlags,\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 subdir: Flags.string({\n description: \"Subdirectory containing skills (default: skills)\",\n default: DEFAULT_SKILLS_SUBDIR,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skills\",\n default: false,\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote (ignore cache)\",\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, flags.refresh);\n const skillsDir = this.resolveSkillsDir(repoPath, flags.subdir);\n const availableSkills = await this.discoverAndValidate(skillsDir, flags.subdir);\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(\n gigetSource: string,\n sourceArg: string,\n refresh: boolean,\n ): Promise<string> {\n this.log(STATUS_MESSAGES.FETCHING_REPOSITORY);\n\n try {\n const result = await fetchSkillSource({\n gigetSource,\n forceRefresh: refresh,\n });\n this.log(result.fromCache ? \"Using cached source\" : \"Downloaded fresh copy\");\n return result.path;\n } catch (error) {\n this.error(error instanceof Error ? error.message : `Failed to fetch: ${sourceArg}`, {\n exit: EXIT_CODES.NETWORK_ERROR,\n });\n }\n }\n\n private resolveSkillsDir(repoPath: string, subdir: string): string {\n if (/\\0/.test(subdir)) {\n this.error(\"--subdir contains null bytes\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n if (path.isAbsolute(subdir)) {\n this.error(`--subdir must be a relative path, got: ${subdir}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n const skillsDir = path.resolve(path.join(repoPath, subdir));\n const resolvedRepoPath = path.resolve(repoPath);\n if (!skillsDir.startsWith(resolvedRepoPath + path.sep) && skillsDir !== resolvedRepoPath) {\n this.error(`--subdir path escapes repository boundary: ${subdir}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n return skillsDir;\n }\n\n private async discoverAndValidate(skillsDir: string, subdir: string): Promise<string[]> {\n if (!(await directoryExists(skillsDir))) {\n this.error(\n `Skills directory not found: ${subdir}\\n` +\n `The repository doesn't have a '${subdir}' directory.\\n` +\n `Use --subdir to specify a different location.`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const availableSkills = await discoverValidSkills(skillsDir);\n\n if (availableSkills.length === 0) {\n this.error(`No valid skills found in ${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 forceRefresh?: boolean;\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 forceRefresh: options.forceRefresh,\n });\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 validSkills: string[] = [];\n\n for (const skillDir of skillDirs) {\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n if (await fileExists(skillMdPath)) {\n validSkills.push(skillDir);\n }\n }\n\n return validSkills.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 lines = rawContent.split(\"\\n\");\n let yamlContent = rawContent;\n let schemaComment = \"\";\n\n if (lines[0]?.startsWith(\"# yaml-language-server:\")) {\n schemaComment = `${lines[0]}\\n`;\n yamlContent = lines.slice(1).join(\"\\n\");\n }\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 = parseResult.success\n ? (parseResult.data as SkillMetadata)\n : { forkedFrom: undefined };\n metadata.forkedFrom = forkedFrom;\n\n const newYamlContent = stringifyYaml(metadata, {\n lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE,\n });\n await writeFile(yamlPath, schemaComment + newYamlContent);\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 = jsonResult.success\n ? (jsonResult.data as SkillMetadata)\n : { forkedFrom: undefined };\n metadata.forkedFrom = forkedFrom;\n\n const yamlContent = stringifyYaml(metadata, { lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE });\n await writeFile(yamlPath, yamlContent);\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 const yamlContent = stringifyYaml(minimalMetadata, {\n lineWidth: YAML_FORMATTING.LINE_WIDTH_NONE,\n });\n await writeFile(yamlPath, yamlContent);\n}\n\nfunction toTitleCase(kebab: string): string {\n return kebab\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n"],"mappings":"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","names":["path"]}
@@ -5,24 +5,24 @@ import {
5
5
  import {
6
6
  loadSource,
7
7
  resolveSkillInfo
8
- } from "../chunk-LHUK5L6P.js";
8
+ } from "../chunk-4DZNTUK7.js";
9
9
  import "../chunk-N6A7A4RA.js";
10
- import "../chunk-YM3V4Q3W.js";
11
- import "../chunk-EADZIYQW.js";
12
- import "../chunk-STMRDPGZ.js";
10
+ import "../chunk-DZ2IQERZ.js";
11
+ import "../chunk-FVBSRBU3.js";
12
+ import "../chunk-XM2Y5AFQ.js";
13
13
  import {
14
14
  matrix
15
- } from "../chunk-ANXHMG32.js";
15
+ } from "../chunk-47HMJ4BY.js";
16
16
  import {
17
17
  BaseCommand,
18
18
  EXIT_CODES
19
- } from "../chunk-TAPEVEET.js";
20
- import "../chunk-ZTRQO5CX.js";
21
- import "../chunk-6XWHJHNZ.js";
19
+ } from "../chunk-7K7SA4TZ.js";
20
+ import "../chunk-OOHPUT5M.js";
21
+ import "../chunk-WEYWZ7UE.js";
22
22
  import {
23
23
  CLI_BIN_NAME
24
24
  } from "../chunk-6PGL2XMY.js";
25
- import "../chunk-NPMMU4GY.js";
25
+ import "../chunk-IR7ADPAZ.js";
26
26
  import {
27
27
  init_esm_shims
28
28
  } from "../chunk-DHET7RCE.js";
@@ -4,50 +4,49 @@ import {
4
4
  formatDashboardText,
5
5
  getDashboardData,
6
6
  showDashboard
7
- } from "../chunk-23M3SPXX.js";
8
- import "../chunk-REZZSDXG.js";
9
- import "../chunk-WTPPVXJP.js";
7
+ } from "../chunk-MBEXASMU.js";
8
+ import "../chunk-5IR4QU7G.js";
9
+ import "../chunk-AWB6DO24.js";
10
10
  import "../chunk-YVFGISUO.js";
11
- import "../chunk-2DRPZXXK.js";
12
- import "../chunk-5IYZGJDW.js";
13
- import "../chunk-V36FRPAU.js";
14
- import "../chunk-6YR2NEW3.js";
15
- import "../chunk-57KI55GJ.js";
16
- import "../chunk-MY4TVLRB.js";
17
- import "../chunk-ATPHV3MD.js";
18
- import "../chunk-FQTYF3OU.js";
11
+ import "../chunk-3STOCHK4.js";
12
+ import "../chunk-RDQBXB3Y.js";
13
+ import "../chunk-ORTNQZLF.js";
14
+ import "../chunk-G3VPBEBC.js";
15
+ import "../chunk-UK572773.js";
16
+ import "../chunk-TJHCK4OS.js";
17
+ import "../chunk-M6J5YQ3P.js";
19
18
  import "../chunk-K77I4XGL.js";
20
- import "../chunk-ANZV33N5.js";
19
+ import "../chunk-OVY7IV3C.js";
21
20
  import "../chunk-6XEZLWG5.js";
22
- import "../chunk-CKZ65VFJ.js";
21
+ import "../chunk-35WALWDD.js";
23
22
  import "../chunk-7SOPVGDV.js";
24
- import "../chunk-SB2R5KHJ.js";
25
- import "../chunk-BEZ6ZPDS.js";
23
+ import "../chunk-BGICSUQK.js";
24
+ import "../chunk-3O57Z6Q3.js";
26
25
  import "../chunk-P2FHS5IS.js";
27
- import "../chunk-ZFQTKY2S.js";
28
- import "../chunk-NL5EB57E.js";
26
+ import "../chunk-2RXDM5HN.js";
27
+ import "../chunk-UHARXISZ.js";
29
28
  import "../chunk-HSKKGAOW.js";
30
29
  import "../chunk-4QA5TIBU.js";
31
30
  import "../chunk-WJXWYSBT.js";
32
- import "../chunk-VWTZOBBQ.js";
31
+ import "../chunk-7QWCPF6F.js";
33
32
  import "../chunk-XO6X5QE5.js";
34
33
  import "../chunk-KUV24B5M.js";
35
- import "../chunk-DDCW4SKN.js";
34
+ import "../chunk-V75HVZTB.js";
36
35
  import "../chunk-HEQVUIHQ.js";
37
36
  import "../chunk-U3IGFMCY.js";
38
- import "../chunk-HK53FRMU.js";
37
+ import "../chunk-DVBA6PGR.js";
39
38
  import "../chunk-B7KZLXHV.js";
40
- import "../chunk-LHUK5L6P.js";
39
+ import "../chunk-4DZNTUK7.js";
41
40
  import "../chunk-N6A7A4RA.js";
42
- import "../chunk-YM3V4Q3W.js";
43
- import "../chunk-EADZIYQW.js";
44
- import "../chunk-STMRDPGZ.js";
45
- import "../chunk-ANXHMG32.js";
46
- import "../chunk-TAPEVEET.js";
47
- import "../chunk-ZTRQO5CX.js";
48
- import "../chunk-6XWHJHNZ.js";
41
+ import "../chunk-DZ2IQERZ.js";
42
+ import "../chunk-FVBSRBU3.js";
43
+ import "../chunk-XM2Y5AFQ.js";
44
+ import "../chunk-47HMJ4BY.js";
45
+ import "../chunk-7K7SA4TZ.js";
46
+ import "../chunk-OOHPUT5M.js";
47
+ import "../chunk-WEYWZ7UE.js";
49
48
  import "../chunk-6PGL2XMY.js";
50
- import "../chunk-NPMMU4GY.js";
49
+ import "../chunk-IR7ADPAZ.js";
51
50
  import "../chunk-DHET7RCE.js";
52
51
  export {
53
52
  Init as default,
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  formatInstallationDisplay,
4
4
  getInstallationInfo
5
- } from "../chunk-EADZIYQW.js";
6
- import "../chunk-STMRDPGZ.js";
7
- import "../chunk-ANXHMG32.js";
5
+ } from "../chunk-FVBSRBU3.js";
6
+ import "../chunk-XM2Y5AFQ.js";
7
+ import "../chunk-47HMJ4BY.js";
8
8
  import {
9
9
  BaseCommand
10
- } from "../chunk-TAPEVEET.js";
11
- import "../chunk-ZTRQO5CX.js";
12
- import "../chunk-6XWHJHNZ.js";
10
+ } from "../chunk-7K7SA4TZ.js";
11
+ import "../chunk-OOHPUT5M.js";
12
+ import "../chunk-WEYWZ7UE.js";
13
13
  import {
14
14
  CLI_BIN_NAME,
15
15
  DEFAULT_BRANDING
16
16
  } from "../chunk-6PGL2XMY.js";
17
- import "../chunk-NPMMU4GY.js";
17
+ import "../chunk-IR7ADPAZ.js";
18
18
  import {
19
19
  init_esm_shims
20
20
  } from "../chunk-DHET7RCE.js";
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAgentDefinitions
4
- } from "../../chunk-YM3V4Q3W.js";
4
+ } from "../../chunk-DZ2IQERZ.js";
5
5
  import {
6
6
  isClaudeCLIAvailable,
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveSource
10
- } from "../../chunk-EADZIYQW.js";
11
- import "../../chunk-STMRDPGZ.js";
12
- import "../../chunk-ANXHMG32.js";
10
+ } from "../../chunk-FVBSRBU3.js";
11
+ import "../../chunk-XM2Y5AFQ.js";
12
+ import "../../chunk-47HMJ4BY.js";
13
13
  import {
14
14
  BaseCommand,
15
15
  EXIT_CODES
16
- } from "../../chunk-TAPEVEET.js";
16
+ } from "../../chunk-7K7SA4TZ.js";
17
17
  import {
18
18
  fileExists,
19
19
  getErrorMessage,
20
20
  readFile
21
- } from "../../chunk-ZTRQO5CX.js";
22
- import "../../chunk-6XWHJHNZ.js";
21
+ } from "../../chunk-OOHPUT5M.js";
22
+ import "../../chunk-WEYWZ7UE.js";
23
23
  import {
24
24
  CLAUDE_DIR,
25
25
  CLI_COLORS,
26
26
  STANDARD_FILES
27
27
  } from "../../chunk-6PGL2XMY.js";
28
- import "../../chunk-NPMMU4GY.js";
28
+ import "../../chunk-IR7ADPAZ.js";
29
29
  import {
30
30
  init_esm_shims
31
31
  } from "../../chunk-DHET7RCE.js";