@claude-collective/cli 0.2.0 → 0.6.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 (166) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/README.md +1 -1
  3. package/dist/chunk-367K3JB3.js +84 -0
  4. package/dist/chunk-367K3JB3.js.map +1 -0
  5. package/dist/chunk-6ESUJMM7.js +54 -0
  6. package/dist/chunk-6ESUJMM7.js.map +1 -0
  7. package/dist/chunk-6OY6ZYQF.js +93 -0
  8. package/dist/chunk-6OY6ZYQF.js.map +1 -0
  9. package/dist/chunk-6WEQADPL.js +307 -0
  10. package/dist/chunk-6WEQADPL.js.map +1 -0
  11. package/dist/chunk-AU7XVCLO.js +91 -0
  12. package/dist/chunk-AU7XVCLO.js.map +1 -0
  13. package/dist/chunk-AZP2AA5M.js +425 -0
  14. package/dist/chunk-AZP2AA5M.js.map +1 -0
  15. package/dist/chunk-D4IQAT27.js +114 -0
  16. package/dist/chunk-D4IQAT27.js.map +1 -0
  17. package/dist/chunk-DHET7RCE.js +50 -0
  18. package/dist/chunk-DHET7RCE.js.map +1 -0
  19. package/dist/chunk-DHFFRMF6.js +31 -0
  20. package/dist/chunk-DHFFRMF6.js.map +1 -0
  21. package/dist/chunk-FKU7VSUD.js +453 -0
  22. package/dist/chunk-FKU7VSUD.js.map +1 -0
  23. package/dist/chunk-J2Y4A3LP.js +478 -0
  24. package/dist/chunk-J2Y4A3LP.js.map +1 -0
  25. package/dist/chunk-JMQGWQZU.js +607 -0
  26. package/dist/chunk-JMQGWQZU.js.map +1 -0
  27. package/dist/chunk-JY4RO76L.js +73 -0
  28. package/dist/chunk-JY4RO76L.js.map +1 -0
  29. package/dist/chunk-M7YCPFIX.js +108 -0
  30. package/dist/chunk-M7YCPFIX.js.map +1 -0
  31. package/dist/chunk-MJSFR562.js +57 -0
  32. package/dist/chunk-MJSFR562.js.map +1 -0
  33. package/dist/chunk-MMDXNZPF.js +69 -0
  34. package/dist/chunk-MMDXNZPF.js.map +1 -0
  35. package/dist/chunk-MYAVQ23U.js +356 -0
  36. package/dist/chunk-MYAVQ23U.js.map +1 -0
  37. package/dist/chunk-OSQDDJXX.js +146 -0
  38. package/dist/chunk-OSQDDJXX.js.map +1 -0
  39. package/dist/chunk-QESUUPOE.js +241 -0
  40. package/dist/chunk-QESUUPOE.js.map +1 -0
  41. package/dist/chunk-SJYG4EJZ.js +57 -0
  42. package/dist/chunk-SJYG4EJZ.js.map +1 -0
  43. package/dist/chunk-SYQ7R2JO.js +95 -0
  44. package/dist/chunk-SYQ7R2JO.js.map +1 -0
  45. package/dist/chunk-TD643KB3.js +245 -0
  46. package/dist/chunk-TD643KB3.js.map +1 -0
  47. package/dist/chunk-TFV6Z7F7.js +129 -0
  48. package/dist/chunk-TFV6Z7F7.js.map +1 -0
  49. package/dist/chunk-TGOHJCQ4.js +83 -0
  50. package/dist/chunk-TGOHJCQ4.js.map +1 -0
  51. package/dist/chunk-TOPAIL5W.js +22 -0
  52. package/dist/chunk-TOPAIL5W.js.map +1 -0
  53. package/dist/chunk-U4VYHKPM.js +110 -0
  54. package/dist/chunk-U4VYHKPM.js.map +1 -0
  55. package/dist/chunk-UFWNMW3G.js +392 -0
  56. package/dist/chunk-UFWNMW3G.js.map +1 -0
  57. package/dist/chunk-UNHCZRO4.js +64 -0
  58. package/dist/chunk-UNHCZRO4.js.map +1 -0
  59. package/dist/chunk-URDV4OCP.js +308 -0
  60. package/dist/chunk-URDV4OCP.js.map +1 -0
  61. package/dist/chunk-YI6JVSFO.js +43 -0
  62. package/dist/chunk-YI6JVSFO.js.map +1 -0
  63. package/dist/chunk-YNSNRR5D.js +184 -0
  64. package/dist/chunk-YNSNRR5D.js.map +1 -0
  65. package/dist/chunk-Z6DLWTBY.js +46 -0
  66. package/dist/chunk-Z6DLWTBY.js.map +1 -0
  67. package/dist/chunk-ZDQIUHAM.js +89 -0
  68. package/dist/chunk-ZDQIUHAM.js.map +1 -0
  69. package/dist/chunk-ZSKHDU5P.js +124 -0
  70. package/dist/chunk-ZSKHDU5P.js.map +1 -0
  71. package/dist/cli-v2/defaults/agent-mappings.yaml +185 -0
  72. package/dist/commands/build/marketplace.js +295 -0
  73. package/dist/commands/build/marketplace.js.map +1 -0
  74. package/dist/commands/build/plugins.js +362 -0
  75. package/dist/commands/build/plugins.js.map +1 -0
  76. package/dist/commands/build/stack.js +169 -0
  77. package/dist/commands/build/stack.js.map +1 -0
  78. package/dist/commands/compile.js +461 -0
  79. package/dist/commands/compile.js.map +1 -0
  80. package/dist/commands/config/get.js +60 -0
  81. package/dist/commands/config/get.js.map +1 -0
  82. package/dist/commands/config/index.js +22 -0
  83. package/dist/commands/config/index.js.map +1 -0
  84. package/dist/commands/config/path.js +35 -0
  85. package/dist/commands/config/path.js.map +1 -0
  86. package/dist/commands/config/set-project.js +61 -0
  87. package/dist/commands/config/set-project.js.map +1 -0
  88. package/dist/commands/config/set.js +60 -0
  89. package/dist/commands/config/set.js.map +1 -0
  90. package/dist/commands/config/show.js +13 -0
  91. package/dist/commands/config/show.js.map +1 -0
  92. package/dist/commands/config/unset-project.js +57 -0
  93. package/dist/commands/config/unset-project.js.map +1 -0
  94. package/dist/commands/config/unset.js +56 -0
  95. package/dist/commands/config/unset.js.map +1 -0
  96. package/dist/commands/diff.js +755 -0
  97. package/dist/commands/diff.js.map +1 -0
  98. package/dist/commands/doctor.js +413 -0
  99. package/dist/commands/doctor.js.map +1 -0
  100. package/dist/commands/edit.js +253 -0
  101. package/dist/commands/edit.js.map +1 -0
  102. package/dist/commands/eject.js +208 -0
  103. package/dist/commands/eject.js.map +1 -0
  104. package/dist/commands/info.js +205 -0
  105. package/dist/commands/info.js.map +1 -0
  106. package/dist/commands/init.js +914 -0
  107. package/dist/commands/init.js.map +1 -0
  108. package/dist/commands/list.js +44 -0
  109. package/dist/commands/list.js.map +1 -0
  110. package/dist/commands/new/agent.js +230 -0
  111. package/dist/commands/new/agent.js.map +1 -0
  112. package/dist/commands/new/skill.js +204 -0
  113. package/dist/commands/new/skill.js.map +1 -0
  114. package/dist/commands/outdated.js +242 -0
  115. package/dist/commands/outdated.js.map +1 -0
  116. package/dist/commands/search.js +115 -0
  117. package/dist/commands/search.js.map +1 -0
  118. package/dist/commands/test-imports.js +92 -0
  119. package/dist/commands/test-imports.js.map +1 -0
  120. package/dist/commands/uninstall.js +302 -0
  121. package/dist/commands/uninstall.js.map +1 -0
  122. package/dist/commands/update.js +428 -0
  123. package/dist/commands/update.js.map +1 -0
  124. package/dist/commands/validate.js +375 -0
  125. package/dist/commands/validate.js.map +1 -0
  126. package/dist/commands/version/bump.js +95 -0
  127. package/dist/commands/version/bump.js.map +1 -0
  128. package/dist/commands/version/index.js +70 -0
  129. package/dist/commands/version/index.js.map +1 -0
  130. package/dist/commands/version/set.js +101 -0
  131. package/dist/commands/version/set.js.map +1 -0
  132. package/dist/commands/version/show.js +70 -0
  133. package/dist/commands/version/show.js.map +1 -0
  134. package/dist/components/common/confirm.js +9 -0
  135. package/dist/components/common/confirm.js.map +1 -0
  136. package/dist/components/common/message.js +24 -0
  137. package/dist/components/common/message.js.map +1 -0
  138. package/dist/components/common/spinner.js +14 -0
  139. package/dist/components/common/spinner.js.map +1 -0
  140. package/dist/components/wizard/selection-header.js +11 -0
  141. package/dist/components/wizard/selection-header.js.map +1 -0
  142. package/dist/components/wizard/step-approach.js +11 -0
  143. package/dist/components/wizard/step-approach.js.map +1 -0
  144. package/dist/components/wizard/step-category.js +12 -0
  145. package/dist/components/wizard/step-category.js.map +1 -0
  146. package/dist/components/wizard/step-confirm.js +12 -0
  147. package/dist/components/wizard/step-confirm.js.map +1 -0
  148. package/dist/components/wizard/step-stack.js +11 -0
  149. package/dist/components/wizard/step-stack.js.map +1 -0
  150. package/dist/components/wizard/step-subcategory.js +13 -0
  151. package/dist/components/wizard/step-subcategory.js.map +1 -0
  152. package/dist/components/wizard/wizard.js +19 -0
  153. package/dist/components/wizard/wizard.js.map +1 -0
  154. package/dist/hooks/init.js +41 -0
  155. package/dist/hooks/init.js.map +1 -0
  156. package/dist/index.js +10 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/magic-string.es-RGXYGAW3.js +1316 -0
  159. package/dist/magic-string.es-RGXYGAW3.js.map +1 -0
  160. package/dist/stores/wizard-store.js +10 -0
  161. package/dist/stores/wizard-store.js.map +1 -0
  162. package/dist/stores/wizard-store.test.js +15991 -0
  163. package/dist/stores/wizard-store.test.js.map +1 -0
  164. package/package.json +44 -25
  165. package/dist/cli/index.js +0 -6314
  166. package/dist/cli/index.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-DHET7RCE.js";
5
+
6
+ // src/cli-v2/components/common/confirm.tsx
7
+ init_esm_shims();
8
+ import { Box, Text } from "ink";
9
+ import { ConfirmInput } from "@inkjs/ui";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ var Confirm = ({
12
+ message,
13
+ onConfirm,
14
+ onCancel,
15
+ defaultValue = false
16
+ }) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
17
+ /* @__PURE__ */ jsx(Text, { children: message }),
18
+ /* @__PURE__ */ jsx(
19
+ ConfirmInput,
20
+ {
21
+ onConfirm,
22
+ onCancel,
23
+ defaultChoice: defaultValue ? "confirm" : "cancel"
24
+ }
25
+ )
26
+ ] });
27
+
28
+ export {
29
+ Confirm
30
+ };
31
+ //# sourceMappingURL=chunk-DHFFRMF6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/components/common/confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { ConfirmInput } from \"@inkjs/ui\";\n\ninterface ConfirmProps {\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n defaultValue?: boolean;\n}\n\nexport const Confirm: React.FC<ConfirmProps> = ({\n message,\n onConfirm,\n onCancel,\n defaultValue = false,\n}) => (\n <Box flexDirection=\"column\">\n <Text>{message}</Text>\n <ConfirmInput\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultChoice={defaultValue ? \"confirm\" : \"cancel\"}\n />\n </Box>\n);\n"],"mappings":";;;;;;AAAA;AACA,SAAS,KAAK,YAAY;AAC1B,SAAS,oBAAoB;AAe3B,SACE,KADF;AANK,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MACE,qBAAC,OAAI,eAAc,UACjB;AAAA,sBAAC,QAAM,mBAAQ;AAAA,EACf;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAe,eAAe,YAAY;AAAA;AAAA,EAC5C;AAAA,GACF;","names":[]}
@@ -0,0 +1,453 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ PROJECT_ROOT
4
+ } from "./chunk-SJYG4EJZ.js";
5
+ import {
6
+ directoryExists,
7
+ fileExists,
8
+ listDirectories,
9
+ readFile
10
+ } from "./chunk-MMDXNZPF.js";
11
+ import {
12
+ init_esm_shims
13
+ } from "./chunk-DHET7RCE.js";
14
+
15
+ // src/cli-v2/lib/plugin-validator.ts
16
+ init_esm_shims();
17
+ import Ajv from "ajv";
18
+ import addFormats from "ajv-formats";
19
+ import path from "path";
20
+ import { parse as parseYaml } from "yaml";
21
+ import fg from "fast-glob";
22
+ var PLUGIN_DIR = ".claude-plugin";
23
+ var PLUGIN_MANIFEST = "plugin.json";
24
+ var KEBAB_CASE_REGEX = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
25
+ var SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
26
+ var schemaCache = /* @__PURE__ */ new Map();
27
+ var validatorCache = /* @__PURE__ */ new Map();
28
+ var REMOTE_SCHEMAS = {
29
+ "skill-frontmatter.schema.json": "https://raw.githubusercontent.com/claude-collective/skills/main/src/schemas/skill-frontmatter.schema.json"
30
+ };
31
+ async function loadSchema(schemaName) {
32
+ if (schemaCache.has(schemaName)) {
33
+ return schemaCache.get(schemaName);
34
+ }
35
+ const locations = [
36
+ path.join(PROJECT_ROOT, "src", "schemas", schemaName),
37
+ path.join(process.cwd(), "src", "schemas", schemaName)
38
+ ];
39
+ for (const schemaPath of locations) {
40
+ if (await fileExists(schemaPath)) {
41
+ const content = await readFile(schemaPath);
42
+ const schema = JSON.parse(content);
43
+ schemaCache.set(schemaName, schema);
44
+ return schema;
45
+ }
46
+ }
47
+ const remoteUrl = REMOTE_SCHEMAS[schemaName];
48
+ if (remoteUrl) {
49
+ try {
50
+ const response = await fetch(remoteUrl);
51
+ if (response.ok) {
52
+ const schema = await response.json();
53
+ schemaCache.set(schemaName, schema);
54
+ return schema;
55
+ }
56
+ } catch {
57
+ }
58
+ }
59
+ throw new Error(
60
+ `Schema not found: ${schemaName}. Searched: ${locations.join(", ")}${remoteUrl ? ` and ${remoteUrl}` : ""}`
61
+ );
62
+ }
63
+ async function getValidator(schemaName) {
64
+ if (validatorCache.has(schemaName)) {
65
+ return validatorCache.get(schemaName);
66
+ }
67
+ const ajv = new Ajv({ allErrors: true, strict: false });
68
+ addFormats(ajv);
69
+ const schema = await loadSchema(schemaName);
70
+ const validate = ajv.compile(schema);
71
+ validatorCache.set(schemaName, validate);
72
+ return validate;
73
+ }
74
+ function formatAjvErrors(errors) {
75
+ if (!errors) return [];
76
+ return errors.map((err) => {
77
+ const errorPath = err.instancePath ? err.instancePath.replace(/^\//, "").replace(/\//g, ".") : "";
78
+ const message = err.message || "Unknown error";
79
+ if (err.keyword === "additionalProperties") {
80
+ const prop = err.params.additionalProperty;
81
+ return `Unrecognized key: "${prop}"`;
82
+ }
83
+ if (err.keyword === "enum") {
84
+ const allowed = err.params.allowedValues;
85
+ return errorPath ? `${errorPath}: ${message}. Allowed: ${allowed?.join(", ")}` : `${message}. Allowed: ${allowed?.join(", ")}`;
86
+ }
87
+ if (err.keyword === "pattern") {
88
+ let hint = "";
89
+ if (errorPath === "name") {
90
+ hint = " (must be kebab-case)";
91
+ } else if (errorPath === "version") {
92
+ hint = " (must be semver: x.y.z)";
93
+ }
94
+ return errorPath ? `${errorPath}: ${message}${hint}` : `${message}${hint}`;
95
+ }
96
+ return errorPath ? `${errorPath}: ${message}` : message;
97
+ });
98
+ }
99
+ function extractFrontmatter(content) {
100
+ const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---/;
101
+ const match = content.match(frontmatterRegex);
102
+ if (!match || !match[1]) {
103
+ return null;
104
+ }
105
+ try {
106
+ return parseYaml(match[1]);
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
111
+ function isKebabCase(str) {
112
+ return KEBAB_CASE_REGEX.test(str);
113
+ }
114
+ function isValidSemver(str) {
115
+ return SEMVER_REGEX.test(str);
116
+ }
117
+ async function validatePluginStructure(pluginPath) {
118
+ const errors = [];
119
+ const warnings = [];
120
+ if (!await directoryExists(pluginPath)) {
121
+ return {
122
+ valid: false,
123
+ errors: [`Plugin directory does not exist: ${pluginPath}`],
124
+ warnings: []
125
+ };
126
+ }
127
+ const pluginDir = path.join(pluginPath, PLUGIN_DIR);
128
+ if (!await directoryExists(pluginDir)) {
129
+ errors.push(`Missing ${PLUGIN_DIR}/ directory`);
130
+ }
131
+ const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST);
132
+ if (!await fileExists(manifestPath)) {
133
+ errors.push(`Missing ${PLUGIN_DIR}/${PLUGIN_MANIFEST}`);
134
+ }
135
+ const readmePath = path.join(pluginPath, "README.md");
136
+ if (!await fileExists(readmePath)) {
137
+ warnings.push("Missing README.md (recommended for documentation)");
138
+ }
139
+ return {
140
+ valid: errors.length === 0,
141
+ errors,
142
+ warnings
143
+ };
144
+ }
145
+ async function validatePluginManifest(manifestPath) {
146
+ const errors = [];
147
+ const warnings = [];
148
+ if (!await fileExists(manifestPath)) {
149
+ return {
150
+ valid: false,
151
+ errors: [`Manifest file not found: ${manifestPath}`],
152
+ warnings: []
153
+ };
154
+ }
155
+ let manifest;
156
+ try {
157
+ const content = await readFile(manifestPath);
158
+ manifest = JSON.parse(content);
159
+ } catch (err) {
160
+ const message = err instanceof Error ? err.message : String(err);
161
+ return {
162
+ valid: false,
163
+ errors: [`Invalid JSON in ${PLUGIN_MANIFEST}: ${message}`],
164
+ warnings: []
165
+ };
166
+ }
167
+ const validate = await getValidator("plugin.schema.json");
168
+ const isValid = validate(manifest);
169
+ if (!isValid) {
170
+ errors.push(...formatAjvErrors(validate.errors));
171
+ }
172
+ if (manifest.name && typeof manifest.name === "string") {
173
+ if (!isKebabCase(manifest.name)) {
174
+ errors.push(`name must be kebab-case: "${manifest.name}"`);
175
+ }
176
+ }
177
+ if (manifest.version && typeof manifest.version === "string") {
178
+ if (!isValidSemver(manifest.version)) {
179
+ warnings.push(
180
+ `version "${manifest.version}" is not valid semver (expected: major.minor.patch)`
181
+ );
182
+ }
183
+ }
184
+ if (!manifest.description) {
185
+ warnings.push(
186
+ "Missing description field (recommended for discoverability)"
187
+ );
188
+ }
189
+ const pluginDir = path.dirname(path.dirname(manifestPath));
190
+ if (manifest.skills && typeof manifest.skills === "string") {
191
+ const skillsPath = path.join(pluginDir, manifest.skills);
192
+ if (!await directoryExists(skillsPath)) {
193
+ errors.push(`Skills path does not exist: ${manifest.skills}`);
194
+ }
195
+ }
196
+ if (manifest.agents && typeof manifest.agents === "string") {
197
+ const agentsPath = path.join(pluginDir, manifest.agents);
198
+ if (!await directoryExists(agentsPath)) {
199
+ errors.push(`Agents path does not exist: ${manifest.agents}`);
200
+ }
201
+ }
202
+ return {
203
+ valid: errors.length === 0,
204
+ errors,
205
+ warnings
206
+ };
207
+ }
208
+ async function validateSkillFrontmatter(skillPath) {
209
+ const errors = [];
210
+ const warnings = [];
211
+ if (!await fileExists(skillPath)) {
212
+ return {
213
+ valid: false,
214
+ errors: [`Skill file not found: ${skillPath}`],
215
+ warnings: []
216
+ };
217
+ }
218
+ const content = await readFile(skillPath);
219
+ const frontmatter = extractFrontmatter(content);
220
+ if (frontmatter === null) {
221
+ return {
222
+ valid: false,
223
+ errors: ["Missing or invalid YAML frontmatter"],
224
+ warnings: []
225
+ };
226
+ }
227
+ const validate = await getValidator("skill-frontmatter.schema.json");
228
+ const isValid = validate(frontmatter);
229
+ if (!isValid) {
230
+ errors.push(...formatAjvErrors(validate.errors));
231
+ }
232
+ const fm = frontmatter;
233
+ if (fm.category) {
234
+ warnings.push(
235
+ 'Deprecated field: "category" - use metadata.yaml for category information'
236
+ );
237
+ }
238
+ if (fm.author) {
239
+ warnings.push(
240
+ 'Deprecated field: "author" - use metadata.yaml for author information'
241
+ );
242
+ }
243
+ if (fm.version) {
244
+ warnings.push(
245
+ 'Deprecated field: "version" - use metadata.yaml for version information'
246
+ );
247
+ }
248
+ return {
249
+ valid: errors.length === 0,
250
+ errors,
251
+ warnings
252
+ };
253
+ }
254
+ async function validateAgentFrontmatter(agentPath) {
255
+ const errors = [];
256
+ const warnings = [];
257
+ if (!await fileExists(agentPath)) {
258
+ return {
259
+ valid: false,
260
+ errors: [`Agent file not found: ${agentPath}`],
261
+ warnings: []
262
+ };
263
+ }
264
+ const content = await readFile(agentPath);
265
+ const frontmatter = extractFrontmatter(content);
266
+ if (frontmatter === null) {
267
+ return {
268
+ valid: false,
269
+ errors: ["Missing or invalid YAML frontmatter"],
270
+ warnings: []
271
+ };
272
+ }
273
+ const validate = await getValidator("agent-frontmatter.schema.json");
274
+ const isValid = validate(frontmatter);
275
+ if (!isValid) {
276
+ errors.push(...formatAjvErrors(validate.errors));
277
+ }
278
+ const fm = frontmatter;
279
+ if (fm.name && typeof fm.name === "string") {
280
+ if (!isKebabCase(fm.name)) {
281
+ errors.push(`name must be kebab-case: "${fm.name}"`);
282
+ }
283
+ }
284
+ return {
285
+ valid: errors.length === 0,
286
+ errors,
287
+ warnings
288
+ };
289
+ }
290
+ async function validatePlugin(pluginPath) {
291
+ const errors = [];
292
+ const warnings = [];
293
+ const structureResult = await validatePluginStructure(pluginPath);
294
+ errors.push(...structureResult.errors);
295
+ warnings.push(...structureResult.warnings);
296
+ if (!structureResult.valid) {
297
+ return { valid: false, errors, warnings };
298
+ }
299
+ const manifestPath = path.join(pluginPath, PLUGIN_DIR, PLUGIN_MANIFEST);
300
+ const manifestResult = await validatePluginManifest(manifestPath);
301
+ errors.push(...manifestResult.errors);
302
+ warnings.push(...manifestResult.warnings);
303
+ let manifest = null;
304
+ try {
305
+ const content = await readFile(manifestPath);
306
+ manifest = JSON.parse(content);
307
+ } catch {
308
+ }
309
+ if (manifest) {
310
+ if (manifest.skills && typeof manifest.skills === "string") {
311
+ const skillsDir = path.join(pluginPath, manifest.skills);
312
+ if (await directoryExists(skillsDir)) {
313
+ const skillFiles = await fg("**/SKILL.md", {
314
+ cwd: skillsDir,
315
+ absolute: true
316
+ });
317
+ if (skillFiles.length === 0) {
318
+ warnings.push(
319
+ `Skills directory exists but contains no SKILL.md files: ${manifest.skills}`
320
+ );
321
+ }
322
+ for (const skillFile of skillFiles) {
323
+ const relativePath = path.relative(pluginPath, skillFile);
324
+ const skillResult = await validateSkillFrontmatter(skillFile);
325
+ if (!skillResult.valid) {
326
+ errors.push(
327
+ ...skillResult.errors.map((e) => `${relativePath}: ${e}`)
328
+ );
329
+ }
330
+ warnings.push(
331
+ ...skillResult.warnings.map((w) => `${relativePath}: ${w}`)
332
+ );
333
+ }
334
+ }
335
+ }
336
+ if (manifest.agents && typeof manifest.agents === "string") {
337
+ const agentsDir = path.join(pluginPath, manifest.agents);
338
+ if (await directoryExists(agentsDir)) {
339
+ const agentFiles = await fg("*.md", {
340
+ cwd: agentsDir,
341
+ absolute: true
342
+ });
343
+ if (agentFiles.length === 0) {
344
+ warnings.push(
345
+ `Agents directory exists but contains no .md files: ${manifest.agents}`
346
+ );
347
+ }
348
+ for (const agentFile of agentFiles) {
349
+ const relativePath = path.relative(pluginPath, agentFile);
350
+ const agentResult = await validateAgentFrontmatter(agentFile);
351
+ if (!agentResult.valid) {
352
+ errors.push(
353
+ ...agentResult.errors.map((e) => `${relativePath}: ${e}`)
354
+ );
355
+ }
356
+ warnings.push(
357
+ ...agentResult.warnings.map((w) => `${relativePath}: ${w}`)
358
+ );
359
+ }
360
+ }
361
+ }
362
+ }
363
+ return {
364
+ valid: errors.length === 0,
365
+ errors,
366
+ warnings
367
+ };
368
+ }
369
+ async function validateAllPlugins(pluginsDir) {
370
+ const results = [];
371
+ if (!await directoryExists(pluginsDir)) {
372
+ return {
373
+ valid: false,
374
+ results: [
375
+ {
376
+ name: pluginsDir,
377
+ result: {
378
+ valid: false,
379
+ errors: [`Directory does not exist: ${pluginsDir}`],
380
+ warnings: []
381
+ }
382
+ }
383
+ ],
384
+ summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 }
385
+ };
386
+ }
387
+ const allDirs = await listDirectories(pluginsDir);
388
+ const pluginDirs = [];
389
+ for (const dirName of allDirs) {
390
+ const potentialPluginDir = path.join(pluginsDir, dirName, PLUGIN_DIR);
391
+ if (await directoryExists(potentialPluginDir)) {
392
+ pluginDirs.push(dirName);
393
+ }
394
+ }
395
+ if (pluginDirs.length === 0) {
396
+ return {
397
+ valid: false,
398
+ results: [
399
+ {
400
+ name: pluginsDir,
401
+ result: {
402
+ valid: false,
403
+ errors: [
404
+ `No plugins found in directory: ${pluginsDir}. Plugins must contain a ${PLUGIN_DIR}/ directory.`
405
+ ],
406
+ warnings: []
407
+ }
408
+ }
409
+ ],
410
+ summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 }
411
+ };
412
+ }
413
+ for (const pluginName of pluginDirs) {
414
+ const pluginPath = path.join(pluginsDir, pluginName);
415
+ const result = await validatePlugin(pluginPath);
416
+ results.push({ name: pluginName, result });
417
+ }
418
+ const summary = {
419
+ total: results.length,
420
+ valid: results.filter((r) => r.result.valid).length,
421
+ invalid: results.filter((r) => !r.result.valid).length,
422
+ withWarnings: results.filter((r) => r.result.warnings.length > 0).length
423
+ };
424
+ return {
425
+ valid: summary.invalid === 0,
426
+ results,
427
+ summary
428
+ };
429
+ }
430
+ function printPluginValidationResult(name, result, verbose = false) {
431
+ const status = result.valid ? "\u2713" : "\u2717";
432
+ if (result.valid && result.warnings.length === 0 && !verbose) {
433
+ return;
434
+ }
435
+ console.log(`
436
+ ${status} ${name}`);
437
+ if (result.errors.length > 0) {
438
+ console.log(" Errors:");
439
+ result.errors.forEach((e) => console.log(` - ${e}`));
440
+ }
441
+ if (result.warnings.length > 0) {
442
+ console.log(" Warnings:");
443
+ result.warnings.forEach((w) => console.log(` - ${w}`));
444
+ }
445
+ }
446
+
447
+ export {
448
+ validatePluginManifest,
449
+ validatePlugin,
450
+ validateAllPlugins,
451
+ printPluginValidationResult
452
+ };
453
+ //# sourceMappingURL=chunk-FKU7VSUD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-v2/lib/plugin-validator.ts"],"sourcesContent":["import Ajv, { type ValidateFunction, type ErrorObject } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport {\n fileExists,\n readFile,\n directoryExists,\n listDirectories,\n} from \"../utils/fs\";\nimport { PROJECT_ROOT } from \"../consts\";\nimport type { ValidationResult } from \"../../types\";\n\nconst PLUGIN_DIR = \".claude-plugin\";\nconst PLUGIN_MANIFEST = \"plugin.json\";\nconst SKILL_FILE = \"SKILL.md\";\nconst KEBAB_CASE_REGEX = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\nconst SEMVER_REGEX =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nconst schemaCache = new Map<string, object>();\nconst validatorCache = new Map<string, ValidateFunction>();\n\n// Remote schemas hosted on GitHub (source of truth for skill schemas)\nconst REMOTE_SCHEMAS: Record<string, string> = {\n \"skill-frontmatter.schema.json\":\n \"https://raw.githubusercontent.com/claude-collective/skills/main/src/schemas/skill-frontmatter.schema.json\",\n};\n\nasync function loadSchema(schemaName: string): Promise<object> {\n if (schemaCache.has(schemaName)) {\n return schemaCache.get(schemaName)!;\n }\n\n // Try local locations first for CLI-owned schemas\n const locations = [\n path.join(PROJECT_ROOT, \"src\", \"schemas\", schemaName),\n path.join(process.cwd(), \"src\", \"schemas\", schemaName),\n ];\n\n for (const schemaPath of locations) {\n if (await fileExists(schemaPath)) {\n const content = await readFile(schemaPath);\n const schema = JSON.parse(content);\n schemaCache.set(schemaName, schema);\n return schema;\n }\n }\n\n // Fall back to remote schema from GitHub (for skill schemas)\n const remoteUrl = REMOTE_SCHEMAS[schemaName];\n if (remoteUrl) {\n try {\n const response = await fetch(remoteUrl);\n if (response.ok) {\n const schema = await response.json();\n schemaCache.set(schemaName, schema);\n return schema;\n }\n } catch {\n // Fall through to error\n }\n }\n\n throw new Error(\n `Schema not found: ${schemaName}. Searched: ${locations.join(\", \")}${remoteUrl ? ` and ${remoteUrl}` : \"\"}`,\n );\n}\n\nasync function getValidator(schemaName: string): Promise<ValidateFunction> {\n if (validatorCache.has(schemaName)) {\n return validatorCache.get(schemaName)!;\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(ajv);\n const schema = await loadSchema(schemaName);\n const validate = ajv.compile(schema);\n validatorCache.set(schemaName, validate);\n return validate;\n}\n\nfunction formatAjvErrors(errors: ErrorObject[] | null | undefined): string[] {\n if (!errors) return [];\n\n return errors.map((err) => {\n const errorPath = err.instancePath\n ? err.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\")\n : \"\";\n const message = err.message || \"Unknown error\";\n\n if (err.keyword === \"additionalProperties\") {\n const prop = (err.params as { additionalProperty?: string })\n .additionalProperty;\n return `Unrecognized key: \"${prop}\"`;\n }\n\n if (err.keyword === \"enum\") {\n const allowed = (err.params as { allowedValues?: string[] })\n .allowedValues;\n return errorPath\n ? `${errorPath}: ${message}. Allowed: ${allowed?.join(\", \")}`\n : `${message}. Allowed: ${allowed?.join(\", \")}`;\n }\n\n if (err.keyword === \"pattern\") {\n let hint = \"\";\n if (errorPath === \"name\") {\n hint = \" (must be kebab-case)\";\n } else if (errorPath === \"version\") {\n hint = \" (must be semver: x.y.z)\";\n }\n return errorPath\n ? `${errorPath}: ${message}${hint}`\n : `${message}${hint}`;\n }\n\n return errorPath ? `${errorPath}: ${message}` : message;\n });\n}\n\nfunction extractFrontmatter(content: string): unknown | null {\n const frontmatterRegex = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match || !match[1]) {\n return null;\n }\n\n try {\n return parseYaml(match[1]);\n } catch {\n return null;\n }\n}\n\nfunction isKebabCase(str: string): boolean {\n return KEBAB_CASE_REGEX.test(str);\n}\n\nfunction isValidSemver(str: string): boolean {\n return SEMVER_REGEX.test(str);\n}\n\nexport async function validatePluginStructure(\n pluginPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await directoryExists(pluginPath))) {\n return {\n valid: false,\n errors: [`Plugin directory does not exist: ${pluginPath}`],\n warnings: [],\n };\n }\n\n const pluginDir = path.join(pluginPath, PLUGIN_DIR);\n if (!(await directoryExists(pluginDir))) {\n errors.push(`Missing ${PLUGIN_DIR}/ directory`);\n }\n\n const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST);\n if (!(await fileExists(manifestPath))) {\n errors.push(`Missing ${PLUGIN_DIR}/${PLUGIN_MANIFEST}`);\n }\n\n const readmePath = path.join(pluginPath, \"README.md\");\n if (!(await fileExists(readmePath))) {\n warnings.push(\"Missing README.md (recommended for documentation)\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validatePluginManifest(\n manifestPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(manifestPath))) {\n return {\n valid: false,\n errors: [`Manifest file not found: ${manifestPath}`],\n warnings: [],\n };\n }\n\n let manifest: Record<string, unknown>;\n try {\n const content = await readFile(manifestPath);\n manifest = JSON.parse(content);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n valid: false,\n errors: [`Invalid JSON in ${PLUGIN_MANIFEST}: ${message}`],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"plugin.schema.json\");\n const isValid = validate(manifest);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n if (manifest.name && typeof manifest.name === \"string\") {\n if (!isKebabCase(manifest.name)) {\n errors.push(`name must be kebab-case: \"${manifest.name}\"`);\n }\n }\n\n if (manifest.version && typeof manifest.version === \"string\") {\n if (!isValidSemver(manifest.version)) {\n warnings.push(\n `version \"${manifest.version}\" is not valid semver (expected: major.minor.patch)`,\n );\n }\n }\n\n if (!manifest.description) {\n warnings.push(\n \"Missing description field (recommended for discoverability)\",\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n if (manifest.skills && typeof manifest.skills === \"string\") {\n const skillsPath = path.join(pluginDir, manifest.skills);\n if (!(await directoryExists(skillsPath))) {\n errors.push(`Skills path does not exist: ${manifest.skills}`);\n }\n }\n\n if (manifest.agents && typeof manifest.agents === \"string\") {\n const agentsPath = path.join(pluginDir, manifest.agents);\n if (!(await directoryExists(agentsPath))) {\n errors.push(`Agents path does not exist: ${manifest.agents}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateSkillFrontmatter(\n skillPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(skillPath))) {\n return {\n valid: false,\n errors: [`Skill file not found: ${skillPath}`],\n warnings: [],\n };\n }\n\n const content = await readFile(skillPath);\n const frontmatter = extractFrontmatter(content);\n\n if (frontmatter === null) {\n return {\n valid: false,\n errors: [\"Missing or invalid YAML frontmatter\"],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"skill-frontmatter.schema.json\");\n const isValid = validate(frontmatter);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n const fm = frontmatter as Record<string, unknown>;\n\n if (fm.category) {\n warnings.push(\n 'Deprecated field: \"category\" - use metadata.yaml for category information',\n );\n }\n if (fm.author) {\n warnings.push(\n 'Deprecated field: \"author\" - use metadata.yaml for author information',\n );\n }\n if (fm.version) {\n warnings.push(\n 'Deprecated field: \"version\" - use metadata.yaml for version information',\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAgentFrontmatter(\n agentPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!(await fileExists(agentPath))) {\n return {\n valid: false,\n errors: [`Agent file not found: ${agentPath}`],\n warnings: [],\n };\n }\n\n const content = await readFile(agentPath);\n const frontmatter = extractFrontmatter(content);\n\n if (frontmatter === null) {\n return {\n valid: false,\n errors: [\"Missing or invalid YAML frontmatter\"],\n warnings: [],\n };\n }\n\n const validate = await getValidator(\"agent-frontmatter.schema.json\");\n const isValid = validate(frontmatter);\n\n if (!isValid) {\n errors.push(...formatAjvErrors(validate.errors));\n }\n\n const fm = frontmatter as Record<string, unknown>;\n\n if (fm.name && typeof fm.name === \"string\") {\n if (!isKebabCase(fm.name)) {\n errors.push(`name must be kebab-case: \"${fm.name}\"`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validatePlugin(\n pluginPath: string,\n): Promise<ValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const structureResult = await validatePluginStructure(pluginPath);\n errors.push(...structureResult.errors);\n warnings.push(...structureResult.warnings);\n\n if (!structureResult.valid) {\n return { valid: false, errors, warnings };\n }\n\n const manifestPath = path.join(pluginPath, PLUGIN_DIR, PLUGIN_MANIFEST);\n const manifestResult = await validatePluginManifest(manifestPath);\n errors.push(...manifestResult.errors);\n warnings.push(...manifestResult.warnings);\n\n let manifest: Record<string, unknown> | null = null;\n try {\n const content = await readFile(manifestPath);\n manifest = JSON.parse(content);\n } catch {}\n\n if (manifest) {\n if (manifest.skills && typeof manifest.skills === \"string\") {\n const skillsDir = path.join(pluginPath, manifest.skills);\n if (await directoryExists(skillsDir)) {\n const skillFiles = await fg(\"**/SKILL.md\", {\n cwd: skillsDir,\n absolute: true,\n });\n\n if (skillFiles.length === 0) {\n warnings.push(\n `Skills directory exists but contains no SKILL.md files: ${manifest.skills}`,\n );\n }\n\n for (const skillFile of skillFiles) {\n const relativePath = path.relative(pluginPath, skillFile);\n const skillResult = await validateSkillFrontmatter(skillFile);\n\n if (!skillResult.valid) {\n errors.push(\n ...skillResult.errors.map((e) => `${relativePath}: ${e}`),\n );\n }\n warnings.push(\n ...skillResult.warnings.map((w) => `${relativePath}: ${w}`),\n );\n }\n }\n }\n\n if (manifest.agents && typeof manifest.agents === \"string\") {\n const agentsDir = path.join(pluginPath, manifest.agents);\n if (await directoryExists(agentsDir)) {\n const agentFiles = await fg(\"*.md\", {\n cwd: agentsDir,\n absolute: true,\n });\n\n if (agentFiles.length === 0) {\n warnings.push(\n `Agents directory exists but contains no .md files: ${manifest.agents}`,\n );\n }\n\n for (const agentFile of agentFiles) {\n const relativePath = path.relative(pluginPath, agentFile);\n const agentResult = await validateAgentFrontmatter(agentFile);\n\n if (!agentResult.valid) {\n errors.push(\n ...agentResult.errors.map((e) => `${relativePath}: ${e}`),\n );\n }\n warnings.push(\n ...agentResult.warnings.map((w) => `${relativePath}: ${w}`),\n );\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nexport async function validateAllPlugins(pluginsDir: string): Promise<{\n valid: boolean;\n results: Array<{ name: string; result: ValidationResult }>;\n summary: {\n total: number;\n valid: number;\n invalid: number;\n withWarnings: number;\n };\n}> {\n const results: Array<{ name: string; result: ValidationResult }> = [];\n\n if (!(await directoryExists(pluginsDir))) {\n return {\n valid: false,\n results: [\n {\n name: pluginsDir,\n result: {\n valid: false,\n errors: [`Directory does not exist: ${pluginsDir}`],\n warnings: [],\n },\n },\n ],\n summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 },\n };\n }\n\n const allDirs = await listDirectories(pluginsDir);\n const pluginDirs: string[] = [];\n\n for (const dirName of allDirs) {\n const potentialPluginDir = path.join(pluginsDir, dirName, PLUGIN_DIR);\n if (await directoryExists(potentialPluginDir)) {\n pluginDirs.push(dirName);\n }\n }\n\n if (pluginDirs.length === 0) {\n return {\n valid: false,\n results: [\n {\n name: pluginsDir,\n result: {\n valid: false,\n errors: [\n `No plugins found in directory: ${pluginsDir}. Plugins must contain a ${PLUGIN_DIR}/ directory.`,\n ],\n warnings: [],\n },\n },\n ],\n summary: { total: 0, valid: 0, invalid: 1, withWarnings: 0 },\n };\n }\n\n for (const pluginName of pluginDirs) {\n const pluginPath = path.join(pluginsDir, pluginName);\n const result = await validatePlugin(pluginPath);\n results.push({ name: pluginName, result });\n }\n\n const summary = {\n total: results.length,\n valid: results.filter((r) => r.result.valid).length,\n invalid: results.filter((r) => !r.result.valid).length,\n withWarnings: results.filter((r) => r.result.warnings.length > 0).length,\n };\n\n return {\n valid: summary.invalid === 0,\n results,\n summary,\n };\n}\n\nexport function printPluginValidationResult(\n name: string,\n result: ValidationResult,\n verbose = false,\n): void {\n const status = result.valid ? \"\\u2713\" : \"\\u2717\";\n\n if (result.valid && result.warnings.length === 0 && !verbose) {\n return;\n }\n\n console.log(`\\n ${status} ${name}`);\n\n if (result.errors.length > 0) {\n console.log(\" Errors:\");\n result.errors.forEach((e) => console.log(` - ${e}`));\n }\n\n if (result.warnings.length > 0) {\n console.log(\" Warnings:\");\n result.warnings.forEach((w) => console.log(` - ${w}`));\n }\n}\n"],"mappings":"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","names":[]}