@agents-inc/cli 0.47.0 → 0.50.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 (261) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +113 -118
  3. package/config/skill-categories.yaml +344 -0
  4. package/config/skill-rules.yaml +740 -0
  5. package/config/stacks.yaml +0 -1
  6. package/dist/{chunk-CJFWO46A.js → chunk-26MXZUHU.js} +2 -2
  7. package/dist/{chunk-KQ27IDYL.js → chunk-2BWCR762.js} +2 -3
  8. package/dist/chunk-2BWCR762.js.map +1 -0
  9. package/dist/chunk-3VOL4WEG.js +31 -0
  10. package/dist/chunk-3VOL4WEG.js.map +1 -0
  11. package/dist/chunk-4QWDB2MD.js +571 -0
  12. package/dist/chunk-4QWDB2MD.js.map +1 -0
  13. package/dist/{chunk-LJ5E4GXC.js → chunk-4R52TQ3K.js} +2 -2
  14. package/dist/{chunk-SPSGZWTZ.js → chunk-5FCHJLM7.js} +34 -16
  15. package/dist/chunk-5FCHJLM7.js.map +1 -0
  16. package/dist/chunk-5FPIKTSA.js +40 -0
  17. package/dist/chunk-5FPIKTSA.js.map +1 -0
  18. package/dist/{chunk-HLTJK3XB.js → chunk-5L724R4C.js} +5 -6
  19. package/dist/{chunk-HLTJK3XB.js.map → chunk-5L724R4C.js.map} +1 -1
  20. package/dist/{chunk-JTTTXGHX.js → chunk-7LV4V6A4.js} +4 -4
  21. package/dist/{chunk-FTD5Z6QD.js → chunk-AWP5A6IM.js} +15 -7
  22. package/dist/chunk-AWP5A6IM.js.map +1 -0
  23. package/dist/chunk-C3Q43WLC.js +118 -0
  24. package/dist/chunk-C3Q43WLC.js.map +1 -0
  25. package/dist/{chunk-B4QYXVPZ.js → chunk-CMNKHDOX.js} +2 -2
  26. package/dist/{chunk-TBB3THSL.js → chunk-D72AFYQR.js} +8 -13
  27. package/dist/chunk-D72AFYQR.js.map +1 -0
  28. package/dist/{chunk-QR2TM4OY.js → chunk-DCE423KO.js} +46 -30
  29. package/dist/chunk-DCE423KO.js.map +1 -0
  30. package/dist/chunk-GBOW6FUW.js +74 -0
  31. package/dist/chunk-GBOW6FUW.js.map +1 -0
  32. package/dist/{chunk-GFDGYQ6M.js → chunk-HMSHB5EQ.js} +569 -269
  33. package/dist/chunk-HMSHB5EQ.js.map +1 -0
  34. package/dist/{chunk-NRCKIHND.js → chunk-HYEUETIC.js} +2 -2
  35. package/dist/{chunk-OEJDFGAF.js → chunk-I6IOGZSZ.js} +61 -52
  36. package/dist/chunk-I6IOGZSZ.js.map +1 -0
  37. package/dist/{chunk-3APMMQUA.js → chunk-JFF7P4LC.js} +30 -93
  38. package/dist/chunk-JFF7P4LC.js.map +1 -0
  39. package/dist/{chunk-N5OCAAXY.js → chunk-JWYRXE6C.js} +2 -2
  40. package/dist/{chunk-TWDVLTU6.js → chunk-KAO3LKB5.js} +3 -3
  41. package/dist/{chunk-XTRPYUWK.js → chunk-KQOU4POU.js} +26 -28
  42. package/dist/chunk-KQOU4POU.js.map +1 -0
  43. package/dist/{chunk-YTRFL3MR.js → chunk-M3GQ2R3E.js} +29 -28
  44. package/dist/chunk-M3GQ2R3E.js.map +1 -0
  45. package/dist/{chunk-LNA6M2IE.js → chunk-PGY5XROM.js} +2 -2
  46. package/dist/chunk-PGY5XROM.js.map +1 -0
  47. package/dist/{chunk-VAQJLHUW.js → chunk-QB5HHTAA.js} +8 -19
  48. package/dist/chunk-QB5HHTAA.js.map +1 -0
  49. package/dist/{chunk-VSZ5GDET.js → chunk-QYLCINGC.js} +2 -2
  50. package/dist/{chunk-IRJADQM7.js → chunk-RA2IPRO2.js} +2 -2
  51. package/dist/{chunk-DC333ZDC.js → chunk-RDWGYKDY.js} +4 -4
  52. package/dist/{chunk-FXQYEXLS.js → chunk-RFKDGJAJ.js} +26 -57
  53. package/dist/chunk-RFKDGJAJ.js.map +1 -0
  54. package/dist/{chunk-HPJP3HFD.js → chunk-SPFHPHYL.js} +7 -7
  55. package/dist/{chunk-EZ46ZTAQ.js → chunk-U2W5SENM.js} +3 -3
  56. package/dist/{chunk-MVEYK55V.js → chunk-U7X4V4HE.js} +2 -2
  57. package/dist/{chunk-INKJBMPJ.js → chunk-UAD3SC27.js} +4 -12
  58. package/dist/chunk-UAD3SC27.js.map +1 -0
  59. package/dist/{chunk-C4QI54PN.js → chunk-WBHPCBVN.js} +57 -34
  60. package/dist/chunk-WBHPCBVN.js.map +1 -0
  61. package/dist/chunk-WFFV254H.js +314 -0
  62. package/dist/chunk-WFFV254H.js.map +1 -0
  63. package/dist/{chunk-ZWAL2ZY7.js → chunk-WJHFV6RI.js} +3 -2
  64. package/dist/chunk-WJHFV6RI.js.map +1 -0
  65. package/dist/{chunk-2RQYJFKA.js → chunk-WLZHCM7O.js} +2 -2
  66. package/dist/{chunk-DVW6ASTO.js → chunk-XDSVV5GZ.js} +4 -4
  67. package/dist/{chunk-JZHIF3K7.js → chunk-YDYRAXSY.js} +57 -27
  68. package/dist/chunk-YDYRAXSY.js.map +1 -0
  69. package/dist/commands/build/marketplace.js +4 -4
  70. package/dist/commands/build/plugins.js +5 -5
  71. package/dist/commands/build/stack.js +5 -5
  72. package/dist/commands/compile.js +11 -9
  73. package/dist/commands/compile.js.map +1 -1
  74. package/dist/commands/config/get.js +4 -4
  75. package/dist/commands/config/index.js +5 -5
  76. package/dist/commands/config/path.js +4 -4
  77. package/dist/commands/config/set-project.js +4 -4
  78. package/dist/commands/config/show.js +5 -5
  79. package/dist/commands/config/unset-project.js +4 -4
  80. package/dist/commands/diff.js +4 -4
  81. package/dist/commands/doctor.js +4 -4
  82. package/dist/commands/edit.js +58 -52
  83. package/dist/commands/edit.js.map +1 -1
  84. package/dist/commands/eject.js +4 -4
  85. package/dist/commands/import/skill.js +7 -8
  86. package/dist/commands/import/skill.js.map +1 -1
  87. package/dist/commands/info.js +5 -5
  88. package/dist/commands/init.js +40 -435
  89. package/dist/commands/init.js.map +1 -1
  90. package/dist/commands/list.js +4 -4
  91. package/dist/commands/new/agent.js +11 -10
  92. package/dist/commands/new/agent.js.map +1 -1
  93. package/dist/commands/new/marketplace.js +24 -5
  94. package/dist/commands/new/marketplace.js.map +1 -1
  95. package/dist/commands/new/skill.js +15 -209
  96. package/dist/commands/new/skill.js.map +1 -1
  97. package/dist/commands/outdated.js +11 -7
  98. package/dist/commands/outdated.js.map +1 -1
  99. package/dist/commands/search.js +7 -8
  100. package/dist/commands/search.js.map +1 -1
  101. package/dist/commands/uninstall.js +6 -6
  102. package/dist/commands/update.js +6 -6
  103. package/dist/commands/validate.js +62 -250
  104. package/dist/commands/validate.js.map +1 -1
  105. package/dist/components/skill-search/skill-search.js +3 -3
  106. package/dist/components/wizard/category-grid.js +3 -2
  107. package/dist/components/wizard/category-grid.test.js +112 -58
  108. package/dist/components/wizard/category-grid.test.js.map +1 -1
  109. package/dist/components/wizard/checkbox-grid.js +5 -3
  110. package/dist/components/wizard/checkbox-grid.test.js +5 -4
  111. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  112. package/dist/components/wizard/domain-selection.js +11 -9
  113. package/dist/components/wizard/help-modal.js +2 -2
  114. package/dist/components/wizard/menu-item.js +1 -1
  115. package/dist/components/wizard/search-modal.js +2 -2
  116. package/dist/components/wizard/search-modal.test.js +2 -2
  117. package/dist/components/wizard/section-progress.js +2 -2
  118. package/dist/components/wizard/section-progress.test.js +2 -2
  119. package/dist/components/wizard/selection-card.js +2 -2
  120. package/dist/components/wizard/source-grid.js +4 -3
  121. package/dist/components/wizard/source-grid.test.js +4 -3
  122. package/dist/components/wizard/source-grid.test.js.map +1 -1
  123. package/dist/components/wizard/stack-selection.js +8 -8
  124. package/dist/components/wizard/step-agents.js +10 -8
  125. package/dist/components/wizard/step-agents.test.js +18 -17
  126. package/dist/components/wizard/step-agents.test.js.map +1 -1
  127. package/dist/components/wizard/step-build.js +9 -8
  128. package/dist/components/wizard/step-build.test.js +17 -35
  129. package/dist/components/wizard/step-build.test.js.map +1 -1
  130. package/dist/components/wizard/step-confirm.js +4 -4
  131. package/dist/components/wizard/step-confirm.test.js +8 -8
  132. package/dist/components/wizard/step-refine.js +2 -2
  133. package/dist/components/wizard/step-refine.test.js +2 -2
  134. package/dist/components/wizard/step-settings.js +7 -5
  135. package/dist/components/wizard/step-settings.test.js +10 -8
  136. package/dist/components/wizard/step-settings.test.js.map +1 -1
  137. package/dist/components/wizard/step-sources.js +11 -10
  138. package/dist/components/wizard/step-sources.test.js +12 -11
  139. package/dist/components/wizard/step-sources.test.js.map +1 -1
  140. package/dist/components/wizard/step-stack.js +15 -12
  141. package/dist/components/wizard/step-stack.test.js +16 -13
  142. package/dist/components/wizard/step-stack.test.js.map +1 -1
  143. package/dist/components/wizard/view-title.js +2 -2
  144. package/dist/components/wizard/wizard-layout.js +8 -8
  145. package/dist/components/wizard/wizard-tabs.js +2 -2
  146. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  147. package/dist/components/wizard/wizard.js +27 -25
  148. package/dist/config/skill-categories.yaml +344 -0
  149. package/dist/config/skill-rules.yaml +740 -0
  150. package/dist/config/stacks.yaml +0 -1
  151. package/dist/hooks/init.js +55 -3
  152. package/dist/hooks/init.js.map +1 -1
  153. package/dist/{source-manager-Q34LTUVM.js → source-manager-BVB2SG73.js} +4 -4
  154. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  155. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  156. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  157. package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
  158. package/dist/src/agents/meta/agent-summoner/workflow.md +5 -7
  159. package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
  160. package/dist/stores/wizard-store.js +5 -5
  161. package/dist/stores/wizard-store.test.js +79 -27
  162. package/dist/stores/wizard-store.test.js.map +1 -1
  163. package/package.json +5 -1
  164. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  165. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  166. package/src/agents/meta/agent-summoner/examples.md +2 -2
  167. package/src/agents/meta/agent-summoner/output-format.md +1 -1
  168. package/src/agents/meta/agent-summoner/workflow.md +5 -7
  169. package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
  170. package/src/schemas/agent.schema.json +1 -1
  171. package/src/schemas/metadata.schema.json +2 -5
  172. package/src/schemas/project-config.schema.json +0 -3
  173. package/src/schemas/project-source-config.schema.json +4 -1
  174. package/config/skills-matrix.yaml +0 -918
  175. package/dist/chunk-3APMMQUA.js.map +0 -1
  176. package/dist/chunk-C4QI54PN.js.map +0 -1
  177. package/dist/chunk-FMQ3A7W4.js +0 -29
  178. package/dist/chunk-FMQ3A7W4.js.map +0 -1
  179. package/dist/chunk-FTD5Z6QD.js.map +0 -1
  180. package/dist/chunk-FXQYEXLS.js.map +0 -1
  181. package/dist/chunk-GFDGYQ6M.js.map +0 -1
  182. package/dist/chunk-INKJBMPJ.js.map +0 -1
  183. package/dist/chunk-JZHIF3K7.js.map +0 -1
  184. package/dist/chunk-KQ27IDYL.js.map +0 -1
  185. package/dist/chunk-LNA6M2IE.js.map +0 -1
  186. package/dist/chunk-M4P5YJ45.js +0 -99
  187. package/dist/chunk-M4P5YJ45.js.map +0 -1
  188. package/dist/chunk-OEJDFGAF.js.map +0 -1
  189. package/dist/chunk-QR2TM4OY.js.map +0 -1
  190. package/dist/chunk-SPSGZWTZ.js.map +0 -1
  191. package/dist/chunk-TBB3THSL.js.map +0 -1
  192. package/dist/chunk-VAQJLHUW.js.map +0 -1
  193. package/dist/chunk-XTRPYUWK.js.map +0 -1
  194. package/dist/chunk-YTRFL3MR.js.map +0 -1
  195. package/dist/chunk-ZWAL2ZY7.js.map +0 -1
  196. package/dist/config/skills-matrix.yaml +0 -918
  197. package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
  198. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  199. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  200. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  201. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  202. package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
  203. package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
  204. package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
  205. package/src/agents/migration/cli-migrator/agent.yaml +0 -12
  206. package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  207. package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  208. package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  209. package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  210. package/src/agents/migration/cli-migrator/intro.md +0 -15
  211. package/src/agents/migration/cli-migrator/output-format.md +0 -164
  212. package/src/agents/migration/cli-migrator/workflow.md +0 -230
  213. package/src/schemas/skills-matrix.schema.json +0 -179
  214. /package/dist/{chunk-CJFWO46A.js.map → chunk-26MXZUHU.js.map} +0 -0
  215. /package/dist/{chunk-LJ5E4GXC.js.map → chunk-4R52TQ3K.js.map} +0 -0
  216. /package/dist/{chunk-JTTTXGHX.js.map → chunk-7LV4V6A4.js.map} +0 -0
  217. /package/dist/{chunk-B4QYXVPZ.js.map → chunk-CMNKHDOX.js.map} +0 -0
  218. /package/dist/{chunk-NRCKIHND.js.map → chunk-HYEUETIC.js.map} +0 -0
  219. /package/dist/{chunk-N5OCAAXY.js.map → chunk-JWYRXE6C.js.map} +0 -0
  220. /package/dist/{chunk-TWDVLTU6.js.map → chunk-KAO3LKB5.js.map} +0 -0
  221. /package/dist/{chunk-VSZ5GDET.js.map → chunk-QYLCINGC.js.map} +0 -0
  222. /package/dist/{chunk-IRJADQM7.js.map → chunk-RA2IPRO2.js.map} +0 -0
  223. /package/dist/{chunk-DC333ZDC.js.map → chunk-RDWGYKDY.js.map} +0 -0
  224. /package/dist/{chunk-HPJP3HFD.js.map → chunk-SPFHPHYL.js.map} +0 -0
  225. /package/dist/{chunk-EZ46ZTAQ.js.map → chunk-U2W5SENM.js.map} +0 -0
  226. /package/dist/{chunk-MVEYK55V.js.map → chunk-U7X4V4HE.js.map} +0 -0
  227. /package/dist/{chunk-2RQYJFKA.js.map → chunk-WLZHCM7O.js.map} +0 -0
  228. /package/dist/{chunk-DVW6ASTO.js.map → chunk-XDSVV5GZ.js.map} +0 -0
  229. /package/dist/{source-manager-Q34LTUVM.js.map → source-manager-BVB2SG73.js.map} +0 -0
  230. /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  231. /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  232. /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  233. /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  234. /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  235. /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  236. /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  237. /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  238. /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  239. /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  240. /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  241. /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  242. /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  243. /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  244. /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  245. /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
  246. /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  247. /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  248. /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  249. /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  250. /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  251. /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  252. /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  253. /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  254. /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  255. /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  256. /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  257. /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  258. /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  259. /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  260. /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  261. /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
@@ -0,0 +1,314 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ BaseCommand,
4
+ EXIT_CODES
5
+ } from "./chunk-PGY5XROM.js";
6
+ import {
7
+ LOCAL_DEFAULTS,
8
+ computeSkillFolderHash,
9
+ resolveAuthor
10
+ } from "./chunk-HMSHB5EQ.js";
11
+ import {
12
+ directoryExists,
13
+ ensureDir,
14
+ fileExists,
15
+ getErrorMessage,
16
+ readFile,
17
+ verbose,
18
+ writeFile
19
+ } from "./chunk-WBHPCBVN.js";
20
+ import {
21
+ CLI_BIN_NAME,
22
+ KEBAB_CASE_PATTERN,
23
+ LOCAL_SKILLS_PATH,
24
+ PLUGIN_MANIFEST_DIR,
25
+ SKILLS_DIR_PATH,
26
+ SKILL_CATEGORIES_YAML_PATH,
27
+ SKILL_RULES_YAML_PATH,
28
+ STANDARD_FILES
29
+ } from "./chunk-AWP5A6IM.js";
30
+ import {
31
+ init_esm_shims
32
+ } from "./chunk-DHET7RCE.js";
33
+
34
+ // src/cli/commands/new/skill.ts
35
+ init_esm_shims();
36
+ import { Args, Flags } from "@oclif/core";
37
+ import path from "path";
38
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
39
+ function validateSkillName(name) {
40
+ if (!name || name.trim() === "") {
41
+ return "Skill name is required";
42
+ }
43
+ if (!KEBAB_CASE_PATTERN.test(name)) {
44
+ return "Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)";
45
+ }
46
+ return null;
47
+ }
48
+ function toTitleCase(kebabCase) {
49
+ return kebabCase.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
50
+ }
51
+ function generateSkillMd(name) {
52
+ const titleName = toTitleCase(name);
53
+ return `---
54
+ name: ${name}
55
+ description: Brief description of this skill
56
+ ---
57
+
58
+ # ${titleName}
59
+
60
+ > **Quick Guide:** Add a brief summary of what this skill teaches.
61
+
62
+ ---
63
+
64
+ <critical_requirements>
65
+
66
+ ## CRITICAL: Before Using This Skill
67
+
68
+ **(Add critical requirements here)**
69
+
70
+ </critical_requirements>
71
+
72
+ ---
73
+
74
+ **When to use:**
75
+
76
+ - Add use cases here
77
+
78
+ **Key patterns covered:**
79
+
80
+ - Add patterns here
81
+
82
+ ---
83
+
84
+ <patterns>
85
+
86
+ ## Core Patterns
87
+
88
+ ### Pattern 1: Example Pattern
89
+
90
+ Add your patterns here.
91
+
92
+ </patterns>
93
+
94
+ ---
95
+
96
+ <critical_reminders>
97
+
98
+ ## CRITICAL REMINDERS
99
+
100
+ **(Repeat critical requirements here)**
101
+
102
+ </critical_reminders>
103
+ `;
104
+ }
105
+ function generateMetadataYaml(name, author, category, contentHash) {
106
+ const titleName = toTitleCase(name);
107
+ return `custom: true
108
+ category: ${category}
109
+ author: "${author}"
110
+ displayName: ${titleName}
111
+ cliDescription: Brief description
112
+ usageGuidance: Use when <guidance>.
113
+ contentHash: ${contentHash}
114
+ tags:
115
+ - local
116
+ - custom
117
+ `;
118
+ }
119
+ var KNOWN_DOMAINS = /* @__PURE__ */ new Set(["web", "api", "mobile", "cli", "shared"]);
120
+ var DEFAULT_CATEGORY_ORDER = 99;
121
+ function generateSkillCategoriesYaml(category) {
122
+ const prefix = category.split("-")[0];
123
+ const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
124
+ const displayName = toTitleCase(subcategoryPart);
125
+ const domainLine = KNOWN_DOMAINS.has(prefix) ? `
126
+ domain: ${prefix}` : "";
127
+ return `version: "1.0.0"
128
+
129
+ categories:
130
+ ${category}:
131
+ id: ${category}
132
+ displayName: ${displayName}
133
+ description: Skills for ${displayName}${domainLine}
134
+ exclusive: true
135
+ required: false
136
+ order: ${DEFAULT_CATEGORY_ORDER}
137
+ custom: true
138
+ `;
139
+ }
140
+ function generateSkillRulesYaml(skillName) {
141
+ return `version: "1.0.0"
142
+
143
+ # Short aliases mapping to canonical skill IDs
144
+ # Example: react: "web-framework-react"
145
+ aliases:
146
+ ${skillName}: "${skillName}"
147
+ `;
148
+ }
149
+ var NewSkill = class _NewSkill extends BaseCommand {
150
+ static summary = "Create a new local skill with proper structure";
151
+ static description = "Create a new local skill scaffold with SKILL.md and metadata.yaml files";
152
+ static args = {
153
+ name: Args.string({
154
+ description: "Name of the skill to create (kebab-case)",
155
+ required: true
156
+ })
157
+ };
158
+ static flags = {
159
+ ...BaseCommand.baseFlags,
160
+ author: Flags.string({
161
+ char: "a",
162
+ description: "Author identifier (e.g., @myhandle)",
163
+ required: false
164
+ }),
165
+ category: Flags.string({
166
+ char: "c",
167
+ description: "Skill category",
168
+ default: LOCAL_DEFAULTS.CATEGORY
169
+ }),
170
+ force: Flags.boolean({
171
+ char: "f",
172
+ description: "Overwrite existing skill directory",
173
+ default: false
174
+ }),
175
+ output: Flags.string({
176
+ char: "o",
177
+ description: "Output directory for the skill (overrides marketplace detection)"
178
+ })
179
+ };
180
+ async run() {
181
+ const { args, flags } = await this.parse(_NewSkill);
182
+ const projectDir = process.cwd();
183
+ this.log("");
184
+ this.log("Create New Skill");
185
+ this.log("");
186
+ const validationError = validateSkillName(args.name);
187
+ if (validationError) {
188
+ this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });
189
+ }
190
+ let author = flags.author;
191
+ if (!author) {
192
+ author = await resolveAuthor(projectDir) || LOCAL_DEFAULTS.AUTHOR;
193
+ }
194
+ const category = flags.category;
195
+ let skillsBasePath;
196
+ if (flags.output) {
197
+ skillsBasePath = path.resolve(flags.output);
198
+ } else {
199
+ const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
200
+ if (await fileExists(marketplacePath)) {
201
+ this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);
202
+ skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);
203
+ } else {
204
+ skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);
205
+ }
206
+ }
207
+ const skillDir = path.join(skillsBasePath, args.name);
208
+ if (await directoryExists(skillDir)) {
209
+ if (!flags.force) {
210
+ this.error(`Skill directory already exists: ${skillDir}
211
+ Use --force to overwrite.`, {
212
+ exit: EXIT_CODES.ERROR
213
+ });
214
+ }
215
+ this.warn(`Overwriting existing skill at ${skillDir}`);
216
+ }
217
+ this.log(`Skill name: ${args.name}`);
218
+ this.log(`Author: ${author}`);
219
+ this.log(`Category: ${category}`);
220
+ this.log(`Directory: ${skillDir}`);
221
+ this.log("");
222
+ if (flags["dry-run"]) {
223
+ this.log("[DRY RUN] Would create skill files");
224
+ return;
225
+ }
226
+ this.log("Creating skill files...");
227
+ try {
228
+ const skillMdContent = generateSkillMd(args.name);
229
+ const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);
230
+ const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);
231
+ await writeFile(skillMdPath, skillMdContent);
232
+ const contentHash = await computeSkillFolderHash(skillDir);
233
+ const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);
234
+ await writeFile(metadataPath, metadataContent);
235
+ this.log("");
236
+ this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);
237
+ this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);
238
+ if (!flags.output) {
239
+ const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
240
+ if (await fileExists(marketplacePath)) {
241
+ try {
242
+ await this.updateConfigFiles(projectDir, args.name, category);
243
+ } catch (error) {
244
+ this.warn(`Could not update config files: ${getErrorMessage(error)}`);
245
+ }
246
+ }
247
+ }
248
+ this.log("");
249
+ this.log(
250
+ `Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`
251
+ );
252
+ this.log("");
253
+ } catch (error) {
254
+ this.handleError(error);
255
+ }
256
+ }
257
+ async updateConfigFiles(projectRoot, skillName, category) {
258
+ const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);
259
+ const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);
260
+ if (await fileExists(categoriesPath)) {
261
+ const content = await readFile(categoriesPath);
262
+ const parsed = parseYaml(content);
263
+ const categories = parsed.categories ?? {};
264
+ if (!categories[category]) {
265
+ const prefix = category.split("-")[0];
266
+ const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
267
+ const entry = {
268
+ id: category,
269
+ displayName: toTitleCase(subcategoryPart),
270
+ description: `Skills for ${toTitleCase(subcategoryPart)}`,
271
+ exclusive: true,
272
+ required: false,
273
+ order: DEFAULT_CATEGORY_ORDER,
274
+ custom: true
275
+ };
276
+ if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;
277
+ categories[category] = entry;
278
+ parsed.categories = categories;
279
+ await writeFile(categoriesPath, stringifyYaml(parsed));
280
+ verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);
281
+ }
282
+ } else {
283
+ await ensureDir(path.dirname(categoriesPath));
284
+ await writeFile(categoriesPath, generateSkillCategoriesYaml(category));
285
+ verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);
286
+ }
287
+ if (await fileExists(rulesPath)) {
288
+ const content = await readFile(rulesPath);
289
+ const parsed = parseYaml(content);
290
+ const aliases = parsed.aliases ?? {};
291
+ if (!aliases[skillName]) {
292
+ aliases[skillName] = skillName;
293
+ parsed.aliases = aliases;
294
+ await writeFile(rulesPath, stringifyYaml(parsed));
295
+ verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);
296
+ }
297
+ } else {
298
+ await ensureDir(path.dirname(rulesPath));
299
+ await writeFile(rulesPath, generateSkillRulesYaml(skillName));
300
+ verbose(`Created ${SKILL_RULES_YAML_PATH}`);
301
+ }
302
+ }
303
+ };
304
+
305
+ export {
306
+ validateSkillName,
307
+ toTitleCase,
308
+ generateSkillMd,
309
+ generateMetadataYaml,
310
+ generateSkillCategoriesYaml,
311
+ generateSkillRulesYaml,
312
+ NewSkill
313
+ };
314
+ //# sourceMappingURL=chunk-WFFV254H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/new/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 { resolveAuthor } from \"../../lib/configuration/index.js\";\nimport { writeFile, readFile, directoryExists, fileExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport {\n CLI_BIN_NAME,\n KEBAB_CASE_PATTERN,\n LOCAL_SKILLS_PATH,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_YAML_PATH,\n SKILL_RULES_YAML_PATH,\n SKILLS_DIR_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function generateSkillMd(name: string): string {\n const titleName = toTitleCase(name);\n\n return `---\nname: ${name}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\nexport function generateMetadataYaml(\n name: string,\n author: string,\n category: CategoryPath,\n contentHash: string,\n): string {\n const titleName = toTitleCase(name);\n\n return `custom: true\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\ntags:\n - local\n - custom\n`;\n}\n\nconst KNOWN_DOMAINS = new Set([\"web\", \"api\", \"mobile\", \"cli\", \"shared\"]);\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nexport function generateSkillCategoriesYaml(category: CategoryPath): string {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const displayName = toTitleCase(subcategoryPart);\n const domainLine = KNOWN_DOMAINS.has(prefix) ? `\\n domain: ${prefix}` : \"\";\n\n return `version: \"1.0.0\"\n\ncategories:\n ${category}:\n id: ${category}\n displayName: ${displayName}\n description: Skills for ${displayName}${domainLine}\n exclusive: true\n required: false\n order: ${DEFAULT_CATEGORY_ORDER}\n custom: true\n`;\n}\n\nexport function generateSkillRulesYaml(skillName: string): string {\n return `version: \"1.0.0\"\n\n# Short aliases mapping to canonical skill IDs\n# Example: react: \"web-framework-react\"\naliases:\n ${skillName}: \"${skillName}\"\n`;\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: LOCAL_DEFAULTS.CATEGORY,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory for the skill (overrides marketplace detection)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\n }\n\n // CLI flag is an untyped string — cast at data boundary\n const category = flags.category as CategoryPath;\n\n // Determine skill output path: --output flag > marketplace detection > local default\n let skillsBasePath: string;\n if (flags.output) {\n skillsBasePath = path.resolve(flags.output);\n } else {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);\n } else {\n skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n }\n\n const skillDir = path.join(skillsBasePath, args.name);\n\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[DRY RUN] Would create skill files\");\n return;\n }\n\n this.log(\"Creating skill files...\");\n\n try {\n const skillMdContent = generateSkillMd(args.name);\n\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n\n await writeFile(skillMdPath, skillMdContent);\n\n const contentHash = await computeSkillFolderHash(skillDir);\n const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);\n\n // Update config files when in marketplace context\n if (!flags.output) {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n try {\n await this.updateConfigFiles(projectDir, args.name, category);\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigFiles(\n projectRoot: string,\n skillName: string,\n category: CategoryPath,\n ): Promise<void> {\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);\n\n // Update skill-categories.yaml\n if (await fileExists(categoriesPath)) {\n const content = await readFile(categoriesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const categories = (parsed.categories ?? {}) as Record<string, unknown>;\n if (!categories[category]) {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const entry: Record<string, unknown> = {\n id: category,\n displayName: toTitleCase(subcategoryPart),\n description: `Skills for ${toTitleCase(subcategoryPart)}`,\n exclusive: true,\n required: false,\n order: DEFAULT_CATEGORY_ORDER,\n custom: true,\n };\n if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;\n categories[category] = entry;\n parsed.categories = categories;\n await writeFile(categoriesPath, stringifyYaml(parsed));\n verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(categoriesPath));\n await writeFile(categoriesPath, generateSkillCategoriesYaml(category));\n verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n\n // Update skill-rules.yaml\n if (await fileExists(rulesPath)) {\n const content = await readFile(rulesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const aliases = (parsed.aliases ?? {}) as Record<string, unknown>;\n if (!aliases[skillName]) {\n aliases[skillName] = skillName;\n parsed.aliases = aliases;\n await writeFile(rulesPath, stringifyYaml(parsed));\n verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesYaml(skillName));\n verbose(`Created ${SKILL_RULES_YAML_PATH}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  CLI_COLORS,
4
4
  UI_SYMBOLS
5
- } from "./chunk-FTD5Z6QD.js";
5
+ } from "./chunk-AWP5A6IM.js";
6
6
  import {
7
7
  init_esm_shims
8
8
  } from "./chunk-DHET7RCE.js";
@@ -26,6 +26,7 @@ var SelectionCard = ({
26
26
  paddingX: 2,
27
27
  paddingY: 1,
28
28
  marginBottom,
29
+ width: "100%",
29
30
  children: /* @__PURE__ */ jsxs(Box, { flexDirection: "column", gap: 1, children: [
30
31
  /* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: isFocused ? `${UI_SYMBOLS.CHEVRON} ${label}` : label }),
31
32
  descriptionLines.map((line, index) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: line }, index))
@@ -37,4 +38,4 @@ var SelectionCard = ({
37
38
  export {
38
39
  SelectionCard
39
40
  };
40
- //# sourceMappingURL=chunk-ZWAL2ZY7.js.map
41
+ //# sourceMappingURL=chunk-WJHFV6RI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/selection-card.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS, UI_SYMBOLS } from \"../../consts.js\";\n\ntype SelectionCardProps = {\n label: string;\n description: string | string[];\n isFocused: boolean;\n marginBottom?: number;\n};\n\nexport const SelectionCard: React.FC<SelectionCardProps> = ({\n label,\n description,\n isFocused,\n marginBottom,\n}) => {\n const descriptionLines = Array.isArray(description) ? description : [description];\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={isFocused ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL}\n paddingX={2}\n paddingY={1}\n marginBottom={marginBottom}\n width=\"100%\"\n >\n <Box flexDirection=\"column\" gap={1}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {isFocused ? `${UI_SYMBOLS.CHEVRON} ${label}` : label}\n </Text>\n {descriptionLines.map((line, index) => (\n <Text key={index} dimColor>\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AA4BpB,SACE,KADF;AAjBC,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBAAmB,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;AAEhF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,aAAa,YAAY,WAAW,UAAU,WAAW;AAAA,MACzD,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA,OAAM;AAAA,MAEN,+BAAC,OAAI,eAAc,UAAS,KAAK,GAC/B;AAAA,4BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAAW,MAAM,WAC5D,sBAAY,GAAG,WAAW,OAAO,IAAI,KAAK,KAAK,OAClD;AAAA,QACC,iBAAiB,IAAI,CAAC,MAAM,UAC3B,oBAAC,QAAiB,UAAQ,MACvB,kBADQ,KAEX,CACD;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  CLI_BIN_NAME,
4
4
  DEFAULT_BRANDING
5
- } from "./chunk-FTD5Z6QD.js";
5
+ } from "./chunk-AWP5A6IM.js";
6
6
  import {
7
7
  init_esm_shims
8
8
  } from "./chunk-DHET7RCE.js";
@@ -67,4 +67,4 @@ export {
67
67
  INFO_MESSAGES,
68
68
  DRY_RUN_MESSAGES
69
69
  };
70
- //# sourceMappingURL=chunk-2RQYJFKA.js.map
70
+ //# sourceMappingURL=chunk-WLZHCM7O.js.map
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-NRCKIHND.js";
4
+ } from "./chunk-HYEUETIC.js";
5
5
  import {
6
6
  ViewTitle
7
- } from "./chunk-B4QYXVPZ.js";
7
+ } from "./chunk-CMNKHDOX.js";
8
8
  import {
9
9
  CLI_COLORS
10
- } from "./chunk-FTD5Z6QD.js";
10
+ } from "./chunk-AWP5A6IM.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -84,4 +84,4 @@ var StepConfirm = ({
84
84
  export {
85
85
  StepConfirm
86
86
  };
87
- //# sourceMappingURL=chunk-DVW6ASTO.js.map
87
+ //# sourceMappingURL=chunk-XDSVV5GZ.js.map
@@ -5,9 +5,12 @@ import {
5
5
  import {
6
6
  useKeyboardNavigation
7
7
  } from "./chunk-KUV24B5M.js";
8
+ import {
9
+ useRowScroll
10
+ } from "./chunk-3VOL4WEG.js";
8
11
  import {
9
12
  ViewTitle
10
- } from "./chunk-B4QYXVPZ.js";
13
+ } from "./chunk-CMNKHDOX.js";
11
14
  import {
12
15
  useTextInput
13
16
  } from "./chunk-U3IGFMCY.js";
@@ -16,14 +19,14 @@ import {
16
19
  addSource,
17
20
  getSourceSummary,
18
21
  removeSource
19
- } from "./chunk-GFDGYQ6M.js";
22
+ } from "./chunk-HMSHB5EQ.js";
20
23
  import {
21
24
  getErrorMessage,
22
25
  verbose
23
- } from "./chunk-C4QI54PN.js";
26
+ } from "./chunk-WBHPCBVN.js";
24
27
  import {
25
28
  CLI_COLORS
26
- } from "./chunk-FTD5Z6QD.js";
29
+ } from "./chunk-AWP5A6IM.js";
27
30
  import {
28
31
  init_esm_shims
29
32
  } from "./chunk-DHET7RCE.js";
@@ -78,7 +81,12 @@ function useSourceOperations(projectDir, onReload) {
78
81
  // src/cli/components/wizard/step-settings.tsx
79
82
  import { jsx, jsxs } from "react/jsx-runtime";
80
83
  var DEFAULT_SOURCE_NAME = "public";
81
- var StepSettings = ({ projectDir, onClose }) => {
84
+ var SOURCE_LIST_BORDER_LINES = 2;
85
+ var StepSettings = ({
86
+ projectDir,
87
+ availableHeight = 0,
88
+ onClose
89
+ }) => {
82
90
  const [summary, setSummary] = useState2(null);
83
91
  const addModal = useModalState();
84
92
  const {
@@ -114,6 +122,12 @@ var StepSettings = ({ projectDir, onClose }) => {
114
122
  { onEscape: onClose },
115
123
  { wrap: false, vimKeys: false, active: !addModal.isOpen }
116
124
  );
125
+ const sourceViewportHeight = availableHeight > SOURCE_LIST_BORDER_LINES ? availableHeight - SOURCE_LIST_BORDER_LINES : 0;
126
+ const { scrollEnabled, scrollTop } = useRowScroll({
127
+ focusedIndex,
128
+ itemCount: sourceCount,
129
+ availableHeight: sourceViewportHeight
130
+ });
117
131
  useInput((input, key) => {
118
132
  if (statusMessage) {
119
133
  clearStatus();
@@ -162,6 +176,27 @@ var StepSettings = ({ projectDir, onClose }) => {
162
176
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Loading sources..." })
163
177
  ] });
164
178
  }
179
+ const sourceElements = summary?.sources.map((source, index) => {
180
+ const isFocused = index === focusedIndex && !addModal.isOpen;
181
+ const isDefault = source.name === DEFAULT_SOURCE_NAME;
182
+ const checkmark = source.enabled ? "\u2713" : " ";
183
+ const displayName = isDefault ? "Public" : source.name;
184
+ const suffix = isDefault ? " (default)" : "";
185
+ return /* @__PURE__ */ jsxs(Box, { flexShrink: 0, children: [
186
+ /* @__PURE__ */ jsxs(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
187
+ isFocused ? ">" : " ",
188
+ " ",
189
+ checkmark,
190
+ " ",
191
+ displayName
192
+ ] }),
193
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
194
+ " ",
195
+ source.url,
196
+ suffix
197
+ ] })
198
+ ] }, source.name);
199
+ });
165
200
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
166
201
  /* @__PURE__ */ jsx(ViewTitle, { children: "Skill Sources" }),
167
202
  /* @__PURE__ */ jsx(Box, { marginTop: 1 }),
@@ -174,27 +209,22 @@ var StepSettings = ({ projectDir, onClose }) => {
174
209
  borderColor: CLI_COLORS.NEUTRAL,
175
210
  paddingX: 1,
176
211
  marginTop: 1,
177
- children: summary?.sources.map((source, index) => {
178
- const isFocused = index === focusedIndex && !addModal.isOpen;
179
- const isDefault = source.name === DEFAULT_SOURCE_NAME;
180
- const checkmark = source.enabled ? "\u2713" : " ";
181
- const displayName = isDefault ? "Public" : source.name;
182
- const suffix = isDefault ? " (default)" : "";
183
- return /* @__PURE__ */ jsxs(Box, { children: [
184
- /* @__PURE__ */ jsxs(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, bold: isFocused, children: [
185
- isFocused ? ">" : " ",
186
- " ",
187
- checkmark,
188
- " ",
189
- displayName
190
- ] }),
191
- /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
192
- " ",
193
- source.url,
194
- suffix
195
- ] })
196
- ] }, source.name);
197
- })
212
+ children: /* @__PURE__ */ jsx(
213
+ Box,
214
+ {
215
+ flexDirection: "column",
216
+ ...scrollEnabled && { height: sourceViewportHeight, overflow: "hidden" },
217
+ children: /* @__PURE__ */ jsx(
218
+ Box,
219
+ {
220
+ flexDirection: "column",
221
+ marginTop: scrollTop > 0 ? -scrollTop : 0,
222
+ ...scrollEnabled && { flexShrink: 0 },
223
+ children: sourceElements
224
+ }
225
+ )
226
+ }
227
+ )
198
228
  }
199
229
  ),
200
230
  /* @__PURE__ */ jsx(
@@ -232,4 +262,4 @@ var StepSettings = ({ projectDir, onClose }) => {
232
262
  export {
233
263
  StepSettings
234
264
  };
235
- //# sourceMappingURL=chunk-JZHIF3K7.js.map
265
+ //# sourceMappingURL=chunk-YDYRAXSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-settings.tsx","../src/cli/components/hooks/use-source-operations.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { ViewTitle } from \"./view-title.js\";\nimport { getSourceSummary, type SourceSummary } from \"../../lib/configuration/source-manager.js\";\nimport { DEFAULT_SOURCE } from \"../../lib/configuration/config.js\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\nimport { useModalState } from \"../hooks/use-modal-state.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.js\";\nimport { useSourceOperations } from \"../hooks/use-source-operations.js\";\nimport { useTextInput } from \"../hooks/use-text-input.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\n\nconst DEFAULT_SOURCE_NAME = \"public\";\n\n/** Fixed lines around the source list: border top/bottom (2) */\nconst SOURCE_LIST_BORDER_LINES = 2;\n\nexport type StepSettingsProps = {\n projectDir: string;\n /** Available height in terminal lines for the scrollable source list. 0 = no constraint. */\n availableHeight?: number;\n onClose: () => void;\n};\n\nexport const StepSettings: React.FC<StepSettingsProps> = ({\n projectDir,\n availableHeight = 0,\n onClose,\n}) => {\n const [summary, setSummary] = useState<SourceSummary | null>(null);\n const addModal = useModalState();\n const {\n value: addSourceInput,\n setValue: setAddSourceInput,\n handleInput: handleTextInput,\n } = useTextInput(\"\");\n const [isLoading, setIsLoading] = useState(true);\n\n const loadSummary = useCallback(async () => {\n try {\n const result = await getSourceSummary(projectDir);\n setSummary(result);\n } catch (error) {\n verbose(`Failed to load source summary: ${getErrorMessage(error)}`);\n setSummary({\n sources: [{ name: DEFAULT_SOURCE_NAME, url: DEFAULT_SOURCE, enabled: true }],\n localSkillCount: 0,\n pluginSkillCount: 0,\n });\n }\n setIsLoading(false);\n }, [projectDir]);\n\n useEffect(() => {\n void loadSummary();\n }, [loadSummary]);\n\n const { handleAdd, handleRemove, statusMessage, clearStatus } = useSourceOperations(\n projectDir,\n loadSummary,\n );\n\n const sourceCount = summary?.sources.length ?? 0;\n\n const { focusedIndex, setFocusedIndex } = useKeyboardNavigation(\n sourceCount,\n { onEscape: onClose },\n { wrap: false, vimKeys: false, active: !addModal.isOpen },\n );\n\n // Compute scroll offset for source list\n const sourceViewportHeight =\n availableHeight > SOURCE_LIST_BORDER_LINES ? availableHeight - SOURCE_LIST_BORDER_LINES : 0;\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex,\n itemCount: sourceCount,\n availableHeight: sourceViewportHeight,\n });\n\n useInput((input, key) => {\n if (statusMessage) {\n clearStatus();\n }\n\n if (addModal.isOpen) {\n if (key.escape) {\n addModal.close();\n setAddSourceInput(\"\");\n return;\n }\n\n if (key.return) {\n if (addSourceInput.trim()) {\n addModal.close();\n setAddSourceInput(\"\");\n void handleAdd(addSourceInput.trim());\n }\n return;\n }\n\n handleTextInput(input, key);\n return;\n }\n\n if (key.return) {\n // Toggle enabled/disabled is a placeholder for future enabledSources store integration\n return;\n }\n\n if (key.backspace || key.delete) {\n if (summary?.sources[focusedIndex]) {\n const source = summary.sources[focusedIndex];\n if (source.name !== DEFAULT_SOURCE_NAME) {\n void handleRemove(source.name).then((success) => {\n if (success) {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n }\n });\n }\n }\n return;\n }\n\n if (input === \"a\" || input === \"A\") {\n addModal.open(true);\n setAddSourceInput(\"\");\n }\n });\n\n if (isLoading) {\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Text dimColor>Loading sources...</Text>\n </Box>\n );\n }\n\n const sourceElements = summary?.sources.map((source, index) => {\n const isFocused = index === focusedIndex && !addModal.isOpen;\n const isDefault = source.name === DEFAULT_SOURCE_NAME;\n const checkmark = source.enabled ? \"\\u2713\" : \" \";\n const displayName = isDefault ? \"Public\" : source.name;\n const suffix = isDefault ? \" (default)\" : \"\";\n\n return (\n <Box key={source.name} flexShrink={0}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined} bold={isFocused}>\n {isFocused ? \">\" : \" \"} {checkmark} {displayName}\n </Text>\n <Text dimColor>\n {\" \"}\n {source.url}\n {suffix}\n </Text>\n </Box>\n );\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>Skill Sources</ViewTitle>\n <Box marginTop={1} />\n\n <Text bold>Configured marketplaces:</Text>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={1}\n marginTop={1}\n >\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled && { height: sourceViewportHeight, overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {sourceElements}\n </Box>\n </Box>\n </Box>\n\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={addModal.isOpen ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL}\n paddingX={1}\n marginTop={1}\n >\n <Text color={addModal.isOpen ? CLI_COLORS.PRIMARY : undefined}>\n + Add source: {addModal.isOpen ? addSourceInput : \"\"}\n {addModal.isOpen ? \"\\u2588\" : \"\"}\n </Text>\n </Box>\n\n {statusMessage && (\n <Box marginTop={1}>\n <Text color={statusMessage.color}>{statusMessage.text}</Text>\n </Box>\n )}\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Local skills: {summary?.localSkillCount ?? 0} in .claude/skills/</Text>\n <Text dimColor>Plugins: {summary?.pluginSkillCount ?? 0} from installed plugins</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n {addModal.isOpen ? \"ENTER submit ESC cancel\" : \"A add DEL remove ESC or G to close\"}\n </Text>\n </Box>\n </Box>\n );\n};\n","import { useState, useCallback } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { addSource, removeSource } from \"../../lib/configuration/source-manager.js\";\n\ntype StatusMessage = { text: string; color: \"red\" | \"green\" } | null;\n\ntype UseSourceOperationsResult = {\n handleAdd: (url: string) => Promise<void>;\n handleRemove: (name: string) => Promise<boolean>;\n statusMessage: StatusMessage;\n clearStatus: () => void;\n};\n\nexport function useSourceOperations(\n projectDir: string,\n onReload: () => Promise<void>,\n): UseSourceOperationsResult {\n const [statusMessage, setStatusMessage] = useState<StatusMessage>(null);\n\n const handleAdd = useCallback(\n async (url: string) => {\n try {\n const result = await addSource(projectDir, url);\n setStatusMessage({\n text: `Added \"${result.name}\" (${result.skillCount} skills)`,\n color: CLI_COLORS.SUCCESS,\n });\n await onReload();\n } catch (error) {\n const message = getErrorMessage(error);\n setStatusMessage({ text: `Failed to add source: ${message}`, color: CLI_COLORS.ERROR });\n }\n },\n [projectDir, onReload],\n );\n\n const handleRemove = useCallback(\n async (name: string): Promise<boolean> => {\n try {\n await removeSource(projectDir, name);\n setStatusMessage({ text: `Removed \"${name}\"`, color: CLI_COLORS.SUCCESS });\n await onReload();\n return true;\n } catch (error) {\n const message = getErrorMessage(error);\n setStatusMessage({ text: `Failed to remove: ${message}`, color: CLI_COLORS.ERROR });\n return false;\n }\n },\n [projectDir, onReload],\n );\n\n const clearStatus = useCallback(() => {\n setStatusMessage(null);\n }, []);\n\n return { handleAdd, handleRemove, statusMessage, clearStatus };\n}\n"],"mappings":"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","names":["useState","useCallback","useState","useCallback"]}
@@ -3,19 +3,19 @@ import {
3
3
  generateMarketplace,
4
4
  getMarketplaceStats,
5
5
  writeMarketplace
6
- } from "../../chunk-TWDVLTU6.js";
6
+ } from "../../chunk-KAO3LKB5.js";
7
7
  import {
8
8
  BaseCommand
9
- } from "../../chunk-LNA6M2IE.js";
9
+ } from "../../chunk-PGY5XROM.js";
10
10
  import {
11
11
  setVerbose
12
- } from "../../chunk-C4QI54PN.js";
12
+ } from "../../chunk-WBHPCBVN.js";
13
13
  import {
14
14
  DEFAULT_BRANDING,
15
15
  DEFAULT_PLUGIN_NAME,
16
16
  DEFAULT_VERSION,
17
17
  PLUGIN_MANIFEST_DIR
18
- } from "../../chunk-FTD5Z6QD.js";
18
+ } from "../../chunk-AWP5A6IM.js";
19
19
  import {
20
20
  init_esm_shims
21
21
  } from "../../chunk-DHET7RCE.js";
@@ -2,22 +2,22 @@
2
2
  import {
3
3
  compileAllAgentPlugins,
4
4
  printAgentCompilationSummary
5
- } from "../../chunk-JTTTXGHX.js";
5
+ } from "../../chunk-7LV4V6A4.js";
6
6
  import {
7
7
  BaseCommand
8
- } from "../../chunk-LNA6M2IE.js";
8
+ } from "../../chunk-PGY5XROM.js";
9
9
  import {
10
10
  compileAllSkillPlugins,
11
11
  compileSkillPlugin,
12
12
  printCompilationSummary
13
- } from "../../chunk-GFDGYQ6M.js";
13
+ } from "../../chunk-HMSHB5EQ.js";
14
14
  import "../../chunk-T4EXUIBY.js";
15
15
  import {
16
16
  setVerbose
17
- } from "../../chunk-C4QI54PN.js";
17
+ } from "../../chunk-WBHPCBVN.js";
18
18
  import {
19
19
  DIRS
20
- } from "../../chunk-FTD5Z6QD.js";
20
+ } from "../../chunk-AWP5A6IM.js";
21
21
  import {
22
22
  init_esm_shims
23
23
  } from "../../chunk-DHET7RCE.js";
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAgentDefinitions
4
- } from "../../chunk-JTTTXGHX.js";
4
+ } from "../../chunk-7LV4V6A4.js";
5
5
  import {
6
6
  BaseCommand,
7
7
  EXIT_CODES
8
- } from "../../chunk-LNA6M2IE.js";
8
+ } from "../../chunk-PGY5XROM.js";
9
9
  import {
10
10
  compileStackPlugin,
11
11
  loadStacks,
12
12
  printStackCompilationSummary
13
- } from "../../chunk-GFDGYQ6M.js";
13
+ } from "../../chunk-HMSHB5EQ.js";
14
14
  import "../../chunk-T4EXUIBY.js";
15
15
  import {
16
16
  setVerbose
17
- } from "../../chunk-C4QI54PN.js";
17
+ } from "../../chunk-WBHPCBVN.js";
18
18
  import {
19
19
  PROJECT_ROOT
20
- } from "../../chunk-FTD5Z6QD.js";
20
+ } from "../../chunk-AWP5A6IM.js";
21
21
  import {
22
22
  init_esm_shims
23
23
  } from "../../chunk-DHET7RCE.js";