@vibe-agent-toolkit/cli 0.1.15 → 0.1.16-rc.2
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.
- package/dist/commands/claude/build.d.ts +4 -4
- package/dist/commands/claude/build.d.ts.map +1 -1
- package/dist/commands/claude/build.js +87 -122
- package/dist/commands/claude/build.js.map +1 -1
- package/dist/commands/claude/verify.d.ts +9 -3
- package/dist/commands/claude/verify.d.ts.map +1 -1
- package/dist/commands/claude/verify.js +60 -52
- package/dist/commands/claude/verify.js.map +1 -1
- package/dist/commands/skills/build.d.ts +4 -1
- package/dist/commands/skills/build.d.ts.map +1 -1
- package/dist/commands/skills/build.js +120 -101
- package/dist/commands/skills/build.js.map +1 -1
- package/dist/commands/skills/command-helpers.d.ts +12 -4
- package/dist/commands/skills/command-helpers.d.ts.map +1 -1
- package/dist/commands/skills/command-helpers.js +4 -4
- package/dist/commands/skills/command-helpers.js.map +1 -1
- package/dist/commands/skills/install-helpers.d.ts +2 -3
- package/dist/commands/skills/install-helpers.d.ts.map +1 -1
- package/dist/commands/skills/install-helpers.js.map +1 -1
- package/dist/commands/skills/install.d.ts +6 -1
- package/dist/commands/skills/install.d.ts.map +1 -1
- package/dist/commands/skills/install.js +182 -187
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/skills/shared.d.ts +10 -4
- package/dist/commands/skills/shared.d.ts.map +1 -1
- package/dist/commands/skills/shared.js +11 -9
- package/dist/commands/skills/shared.js.map +1 -1
- package/dist/commands/skills/skill-discovery.d.ts +20 -0
- package/dist/commands/skills/skill-discovery.d.ts.map +1 -0
- package/dist/commands/skills/skill-discovery.js +71 -0
- package/dist/commands/skills/skill-discovery.js.map +1 -0
- package/dist/commands/skills/uninstall.js +1 -1
- package/dist/commands/skills/uninstall.js.map +1 -1
- package/dist/commands/skills/validate-command.js +2 -2
- package/dist/commands/skills/validate-command.js.map +1 -1
- package/dist/commands/skills/validate.d.ts +2 -2
- package/dist/commands/skills/validate.d.ts.map +1 -1
- package/dist/commands/skills/validate.js +48 -66
- package/dist/commands/skills/validate.js.map +1 -1
- package/package.json +11 -11
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vat claude build` — generate Claude plugin
|
|
2
|
+
* `vat claude build` — generate Claude plugin artifacts from pre-built skills
|
|
3
3
|
*
|
|
4
|
-
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces.
|
|
5
|
+
* Discovers available skills from dist/skills/ (built by `vat skills build`).
|
|
6
|
+
* Wraps skills into Claude plugin directory structure with plugin.json metadata.
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from 'commander';
|
|
9
9
|
export interface ClaudeBuildCommandOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAeD,wBAAgB,kBAAkB,IAAI,OAAO,CAwC5C"}
|
|
@@ -1,45 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vat claude build` — generate Claude plugin
|
|
2
|
+
* `vat claude build` — generate Claude plugin artifacts from pre-built skills
|
|
3
3
|
*
|
|
4
|
-
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces.
|
|
5
|
+
* Discovers available skills from dist/skills/ (built by `vat skills build`).
|
|
6
|
+
* Wraps skills into Claude plugin directory structure with plugin.json metadata.
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { cp, mkdir, writeFile } from 'node:fs/promises';
|
|
10
|
-
import {
|
|
9
|
+
import { cp, mkdir, readdir, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
11
|
import { Command } from 'commander';
|
|
12
12
|
import { handleCommandError } from '../../utils/command-error.js';
|
|
13
13
|
import { createLogger } from '../../utils/logger.js';
|
|
14
14
|
import { writeYamlOutput } from '../../utils/output.js';
|
|
15
|
-
import { readPackageJson } from '../skills/shared.js';
|
|
16
15
|
import { loadClaudeProjectConfig } from './claude-config.js';
|
|
17
16
|
export function createBuildCommand() {
|
|
18
17
|
const command = new Command('build');
|
|
19
18
|
command
|
|
20
|
-
.description('Generate Claude plugin
|
|
19
|
+
.description('Generate Claude plugin artifacts from pre-built skills')
|
|
21
20
|
.option('--marketplace <name>', 'Build specific marketplace only')
|
|
22
21
|
.option('--debug', 'Enable debug logging')
|
|
23
22
|
.action(buildCommand)
|
|
24
23
|
.addHelpText('after', `
|
|
25
24
|
Description:
|
|
26
|
-
Reads vibe-agent-toolkit.config.yaml
|
|
27
|
-
|
|
25
|
+
Reads vibe-agent-toolkit.config.yaml to build Claude plugin artifacts
|
|
26
|
+
from pre-built dist/skills/ output. Must run vat skills build first.
|
|
28
27
|
|
|
29
|
-
For each
|
|
30
|
-
-
|
|
31
|
-
- Copies
|
|
32
|
-
- Generates plugin.json and
|
|
28
|
+
For each marketplace, for each plugin:
|
|
29
|
+
- Resolves skill selectors ("*" or name list) against dist/skills/ directories
|
|
30
|
+
- Copies matched skills into plugin directory structure
|
|
31
|
+
- Generates plugin.json with name, description, and author
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
dist/.claude-plugin/marketplace.json ← marketplace catalog
|
|
33
|
+
Output structure:
|
|
34
|
+
dist/.claude/plugins/marketplaces/<marketplace>/plugins/<plugin>/
|
|
35
|
+
.claude-plugin/plugin.json
|
|
36
|
+
skills/<skillName>/SKILL.md
|
|
39
37
|
|
|
40
38
|
Output:
|
|
41
|
-
YAML summary
|
|
42
|
-
Build progress
|
|
39
|
+
YAML summary -> stdout
|
|
40
|
+
Build progress -> stderr
|
|
43
41
|
|
|
44
42
|
Exit Codes:
|
|
45
43
|
0 - Build successful
|
|
@@ -48,10 +46,22 @@ Exit Codes:
|
|
|
48
46
|
|
|
49
47
|
Example:
|
|
50
48
|
$ vat skills build && vat claude build # Build skills then wrap for Claude
|
|
51
|
-
$ vat claude build --marketplace acme # Build specific marketplace
|
|
52
49
|
`);
|
|
53
50
|
return command;
|
|
54
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Discover available skill names by listing directories in dist/skills/.
|
|
54
|
+
*/
|
|
55
|
+
async function discoverBuiltSkills(configDir) {
|
|
56
|
+
const skillsDir = join(configDir, 'dist', 'skills');
|
|
57
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
58
|
+
if (!existsSync(skillsDir)) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
62
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
63
|
+
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
|
|
64
|
+
}
|
|
55
65
|
async function buildCommand(options) {
|
|
56
66
|
const logger = createLogger(options.debug ? { debug: true } : {});
|
|
57
67
|
const startTime = Date.now();
|
|
@@ -65,12 +75,11 @@ async function buildCommand(options) {
|
|
|
65
75
|
});
|
|
66
76
|
process.exit(0);
|
|
67
77
|
}
|
|
68
|
-
//
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
logger.info(`📦 Building Claude plugin artifacts`);
|
|
78
|
+
// Discover available skills from dist/skills/
|
|
79
|
+
const availableSkills = await discoverBuiltSkills(configDir);
|
|
80
|
+
logger.info(`Building Claude plugin artifacts`);
|
|
72
81
|
logger.info(` Config: ${configPath}`);
|
|
73
|
-
logger.info(` Skills available: ${
|
|
82
|
+
logger.info(` Skills available: ${availableSkills.length} (${availableSkills.join(', ')})`);
|
|
74
83
|
const results = [];
|
|
75
84
|
const marketplaces = claudeConfig.marketplaces;
|
|
76
85
|
for (const name of Object.keys(marketplaces)) {
|
|
@@ -79,11 +88,11 @@ async function buildCommand(options) {
|
|
|
79
88
|
if (options.marketplace && options.marketplace !== name) {
|
|
80
89
|
continue;
|
|
81
90
|
}
|
|
82
|
-
logger.info(`\n
|
|
83
|
-
const result = await buildMarketplace(name, mpConfig,
|
|
91
|
+
logger.info(`\n Building marketplace: ${name}`);
|
|
92
|
+
const result = await buildMarketplace(name, mpConfig, availableSkills, configDir, logger);
|
|
84
93
|
results.push(result);
|
|
85
94
|
if (result.status === 'error') {
|
|
86
|
-
logger.error(`
|
|
95
|
+
logger.error(` Failed: ${result.reason ?? 'unknown error'}`);
|
|
87
96
|
const duration = Date.now() - startTime;
|
|
88
97
|
writeYamlOutput({
|
|
89
98
|
status: 'error',
|
|
@@ -106,7 +115,6 @@ async function buildCommand(options) {
|
|
|
106
115
|
name: r.name,
|
|
107
116
|
status: r.status,
|
|
108
117
|
...(r.reason ? { reason: r.reason } : {}),
|
|
109
|
-
...(r.marketplaceJsonPath ? { marketplaceJson: r.marketplaceJsonPath } : {}),
|
|
110
118
|
plugins: r.plugins.map((p) => ({
|
|
111
119
|
name: p.pluginName,
|
|
112
120
|
dir: p.pluginDir,
|
|
@@ -121,63 +129,40 @@ async function buildCommand(options) {
|
|
|
121
129
|
handleCommandError(error, logger, startTime, 'ClaudeBuild');
|
|
122
130
|
}
|
|
123
131
|
}
|
|
124
|
-
async function buildMarketplace(name, config,
|
|
125
|
-
// Source-layout (file:) marketplaces are skipped — verify only, not built
|
|
126
|
-
if (config.file) {
|
|
127
|
-
logger.info(` Skipping (source-layout file: ${config.file})`);
|
|
128
|
-
return { name, status: 'skipped', reason: 'source-layout (file: only — use vat claude verify)', plugins: [] };
|
|
129
|
-
}
|
|
130
|
-
// Resolve skill selectors against vat.skills
|
|
131
|
-
const selectedSkills = resolveSkillSelectors(config.skills ?? [], vatSkills);
|
|
132
|
-
logger.info(` Matched ${selectedSkills.length} skill(s): ${selectedSkills.map((s) => s.name).join(', ')}`);
|
|
133
|
-
// Determine output paths
|
|
134
|
-
const pluginsDir = config.output?.pluginsDir
|
|
135
|
-
? resolveRelativePath(config.output.pluginsDir, configDir)
|
|
136
|
-
: join(configDir, 'dist', 'plugins');
|
|
137
|
-
const marketplaceJsonPath = config.output?.marketplaceJson
|
|
138
|
-
? resolveRelativePath(config.output.marketplaceJson, configDir)
|
|
139
|
-
: join(configDir, 'dist', '.claude-plugin', 'marketplace.json');
|
|
132
|
+
async function buildMarketplace(name, config, availableSkills, configDir, logger) {
|
|
140
133
|
const plugins = [];
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const pluginResult = await buildPlugin(
|
|
134
|
+
for (const pluginDef of config.plugins) {
|
|
135
|
+
// Resolve which skills this plugin gets
|
|
136
|
+
const resolvedSkills = resolvePluginSkills(pluginDef, availableSkills);
|
|
137
|
+
logger.info(` Plugin "${pluginDef.name}": ${resolvedSkills.length} skill(s) matched`);
|
|
138
|
+
if (resolvedSkills.length === 0) {
|
|
139
|
+
logger.info(` (no skills matched selectors)`);
|
|
140
|
+
}
|
|
141
|
+
const pluginResult = await buildPlugin(name, pluginDef, resolvedSkills, configDir, config.owner, logger);
|
|
149
142
|
plugins.push(pluginResult);
|
|
150
|
-
// Build plugin entry for marketplace.json.
|
|
151
|
-
// `source` is required by the Claude marketplace format — use a relative path from
|
|
152
|
-
// the marketplace.json location to the plugin directory so the artifact is portable
|
|
153
|
-
// regardless of where the npm package is installed.
|
|
154
|
-
const pluginDir = join(pluginsDir, pluginDef.name);
|
|
155
|
-
const relativeSource = relative(dirname(marketplaceJsonPath), pluginDir);
|
|
156
|
-
pluginEntries.push({
|
|
157
|
-
name: pluginDef.name,
|
|
158
|
-
source: relativeSource,
|
|
159
|
-
...(pluginDef.version ? { version: pluginDef.version } : {}),
|
|
160
|
-
skills: pluginResult.skillsCopied.map((skillName) => `skills/${skillName}`),
|
|
161
|
-
});
|
|
162
143
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
144
|
+
return { name, status: 'built', plugins };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Resolve which skills a plugin gets based on its `skills` selector.
|
|
148
|
+
* "*" means all available skills; string[] means match each selector against available skill names.
|
|
149
|
+
*/
|
|
150
|
+
function resolvePluginSkills(pluginDef, availableSkills) {
|
|
151
|
+
if (pluginDef.skills === '*') {
|
|
152
|
+
return availableSkills;
|
|
153
|
+
}
|
|
154
|
+
const matched = new Set();
|
|
155
|
+
for (const selector of pluginDef.skills) {
|
|
156
|
+
// Also try the fs-safe form of the selector (colon → __) since
|
|
157
|
+
// availableSkills are directory names which use the fs-safe form.
|
|
158
|
+
const fsSelector = skillNameToFsPath(selector);
|
|
159
|
+
for (const skillName of availableSkills) {
|
|
160
|
+
if (matchesSelector(skillName, selector) || matchesSelector(skillName, fsSelector)) {
|
|
161
|
+
matched.add(skillName);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return [...matched];
|
|
181
166
|
}
|
|
182
167
|
/**
|
|
183
168
|
* Convert a skill name to a filesystem-safe path segment.
|
|
@@ -189,59 +174,45 @@ async function buildMarketplace(name, config, vatSkills, configDir, logger) {
|
|
|
189
174
|
function skillNameToFsPath(name) {
|
|
190
175
|
return name.replaceAll(':', '__');
|
|
191
176
|
}
|
|
192
|
-
async function buildPlugin(
|
|
193
|
-
const pluginDir = join(
|
|
177
|
+
async function buildPlugin(marketplaceName, pluginDef, skills, configDir, owner, logger) {
|
|
178
|
+
const pluginDir = join(configDir, 'dist', '.claude', 'plugins', 'marketplaces', marketplaceName, 'plugins', pluginDef.name);
|
|
194
179
|
const skillsCopied = [];
|
|
195
|
-
logger.info(`
|
|
196
|
-
for (const
|
|
197
|
-
const skillDistPath =
|
|
180
|
+
logger.info(` Building plugin: ${pluginDef.name}`);
|
|
181
|
+
for (const skillName of skills) {
|
|
182
|
+
const skillDistPath = join(configDir, 'dist', 'skills', skillName);
|
|
198
183
|
// Verify skill is built
|
|
199
184
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
200
185
|
if (!existsSync(skillDistPath)) {
|
|
201
|
-
throw new Error(`Skill "${
|
|
186
|
+
throw new Error(`Skill "${skillName}" not built at ${skillDistPath}. ` +
|
|
202
187
|
`Run: vat skills build (or vat build to build everything)`);
|
|
203
188
|
}
|
|
204
189
|
// Copy skill into plugin directory structure.
|
|
205
190
|
// Use skillNameToFsPath to strip colons — colon-namespaced skill names (e.g.
|
|
206
191
|
// "pkg:sub-skill") are valid VAT identifiers but invalid directory names on Windows.
|
|
207
|
-
const fsPath = skillNameToFsPath(
|
|
192
|
+
const fsPath = skillNameToFsPath(skillName);
|
|
208
193
|
const destPath = join(pluginDir, 'skills', fsPath);
|
|
209
194
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
210
195
|
await mkdir(destPath, { recursive: true });
|
|
211
196
|
await cp(skillDistPath, destPath, { recursive: true });
|
|
212
197
|
skillsCopied.push(fsPath);
|
|
213
|
-
logger.info(`
|
|
198
|
+
logger.info(` ${skillName} -> skills/${fsPath}`);
|
|
214
199
|
}
|
|
215
|
-
// Generate plugin.json
|
|
200
|
+
// Generate plugin.json — STRICT: only name, description, author
|
|
216
201
|
const pluginJsonDir = join(pluginDir, '.claude-plugin');
|
|
217
202
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
218
203
|
await mkdir(pluginJsonDir, { recursive: true });
|
|
219
204
|
const pluginJson = {
|
|
220
|
-
name:
|
|
221
|
-
|
|
205
|
+
name: pluginDef.name,
|
|
206
|
+
description: pluginDef.description,
|
|
207
|
+
author: {
|
|
208
|
+
name: owner.name,
|
|
209
|
+
...(owner.email ? { email: owner.email } : {}),
|
|
210
|
+
},
|
|
222
211
|
};
|
|
223
212
|
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
224
213
|
await writeFile(join(pluginJsonDir, 'plugin.json'), JSON.stringify(pluginJson, null, 2));
|
|
225
|
-
logger.info(`
|
|
226
|
-
return { pluginName, pluginDir, skillsCopied };
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Resolve skill selectors (exact names or glob patterns) against available skills.
|
|
230
|
-
* Supports exact name match and simple glob suffix like "acme-*".
|
|
231
|
-
*/
|
|
232
|
-
function resolveSkillSelectors(selectors, availableSkills) {
|
|
233
|
-
if (selectors.length === 0) {
|
|
234
|
-
return availableSkills;
|
|
235
|
-
}
|
|
236
|
-
const matched = new Set();
|
|
237
|
-
for (const selector of selectors) {
|
|
238
|
-
for (const skill of availableSkills) {
|
|
239
|
-
if (matchesSelector(skill.name, selector)) {
|
|
240
|
-
matched.add(skill.name);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
return availableSkills.filter((s) => matched.has(s.name));
|
|
214
|
+
logger.info(` .claude-plugin/plugin.json`);
|
|
215
|
+
return { pluginName: pluginDef.name, pluginDir, skillsCopied };
|
|
245
216
|
}
|
|
246
217
|
/**
|
|
247
218
|
* Check if a skill name matches a selector.
|
|
@@ -256,10 +227,4 @@ function matchesSelector(skillName, selector) {
|
|
|
256
227
|
const regex = new RegExp(`^${selector.replaceAll('*', '.*')}$`);
|
|
257
228
|
return regex.test(skillName);
|
|
258
229
|
}
|
|
259
|
-
function resolveRelativePath(filePath, baseDir) {
|
|
260
|
-
if (isAbsolute(filePath)) {
|
|
261
|
-
return filePath;
|
|
262
|
-
}
|
|
263
|
-
return resolve(baseDir, filePath);
|
|
264
|
-
}
|
|
265
230
|
//# sourceMappingURL=build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vat claude verify` — validate Claude plugin
|
|
2
|
+
* `vat claude verify` — validate Claude plugin artifacts at conventional paths
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* For each marketplace in claude.marketplaces, verifies built artifacts at:
|
|
5
|
+
* dist/.claude/plugins/marketplaces/<marketplaceName>/plugins/<pluginName>/
|
|
6
|
+
*
|
|
7
|
+
* For each plugin:
|
|
8
|
+
* - .claude-plugin/plugin.json must exist and validate against PluginJsonSchema
|
|
9
|
+
* - At least one skills/{name}/SKILL.md must exist
|
|
10
|
+
*
|
|
11
|
+
* If claude.managedSettings is configured: validates against ManagedSettingsSchema
|
|
6
12
|
*/
|
|
7
13
|
import { Command } from 'commander';
|
|
8
14
|
export interface ClaudeVerifyCommandOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAeD,wBAAgB,mBAAmB,IAAI,OAAO,CAsC7C"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vat claude verify` — validate Claude plugin
|
|
2
|
+
* `vat claude verify` — validate Claude plugin artifacts at conventional paths
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* For each marketplace in claude.marketplaces, verifies built artifacts at:
|
|
5
|
+
* dist/.claude/plugins/marketplaces/<marketplaceName>/plugins/<pluginName>/
|
|
6
|
+
*
|
|
7
|
+
* For each plugin:
|
|
8
|
+
* - .claude-plugin/plugin.json must exist and validate against PluginJsonSchema
|
|
9
|
+
* - At least one skills/{name}/SKILL.md must exist
|
|
10
|
+
*
|
|
11
|
+
* If claude.managedSettings is configured: validates against ManagedSettingsSchema
|
|
6
12
|
*/
|
|
7
|
-
import { readFile } from 'node:fs/promises';
|
|
13
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
8
14
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
9
|
-
import {
|
|
15
|
+
import { PluginJsonSchema } from '@vibe-agent-toolkit/agent-skills';
|
|
10
16
|
import { ManagedSettingsSchema } from '@vibe-agent-toolkit/claude-marketplace';
|
|
11
17
|
import { Command } from 'commander';
|
|
12
18
|
import { handleCommandError } from '../../utils/command-error.js';
|
|
@@ -22,12 +28,14 @@ export function createVerifyCommand() {
|
|
|
22
28
|
.action(verifyCommand)
|
|
23
29
|
.addHelpText('after', `
|
|
24
30
|
Description:
|
|
25
|
-
Validates
|
|
31
|
+
Validates built Claude plugin artifacts at conventional paths.
|
|
26
32
|
Does not build anything — validates what already exists.
|
|
27
33
|
|
|
28
|
-
For each marketplace in claude.marketplaces:
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
For each marketplace in claude.marketplaces, checks:
|
|
35
|
+
dist/.claude/plugins/marketplaces/<name>/plugins/<plugin>/
|
|
36
|
+
.claude-plugin/plugin.json — validates against PluginJsonSchema
|
|
37
|
+
skills/*/SKILL.md — at least one must exist
|
|
38
|
+
|
|
31
39
|
If claude.managedSettings is configured: validates against ManagedSettingsSchema
|
|
32
40
|
|
|
33
41
|
Output:
|
|
@@ -94,7 +102,6 @@ async function verifyCommand(options) {
|
|
|
94
102
|
marketplaces: marketplaceResults.map((r) => ({
|
|
95
103
|
name: r.name,
|
|
96
104
|
status: r.status,
|
|
97
|
-
...(r.file ? { file: r.file } : {}),
|
|
98
105
|
...(r.errors.length > 0 ? { errors: r.errors.map((e) => e.error) } : {}),
|
|
99
106
|
})),
|
|
100
107
|
...(claudeConfig.managedSettings
|
|
@@ -116,58 +123,59 @@ async function verifyCommand(options) {
|
|
|
116
123
|
handleCommandError(error, logger, startTime, 'ClaudeVerify');
|
|
117
124
|
}
|
|
118
125
|
}
|
|
119
|
-
async function
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const fileErrors = await validateJsonFile(marketplaceJsonPath, MarketplaceSchema, logger);
|
|
126
|
-
errors.push(...fileErrors);
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// File does not exist — report as verification error (run vat build to generate it)
|
|
130
|
-
errors.push({
|
|
131
|
-
file: marketplaceJsonPath,
|
|
132
|
-
error: `marketplace.json not found — run vat build (or vat claude build) to generate it`,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
const pluginsDir = config.output?.pluginsDir
|
|
136
|
-
? resolveRelativePath(config.output.pluginsDir, configDir)
|
|
137
|
-
: join(configDir, 'dist', 'plugins');
|
|
138
|
-
for (const plugin of config.plugins ?? []) {
|
|
139
|
-
const pluginJsonPath = join(pluginsDir, plugin.name, '.claude-plugin', 'plugin.json');
|
|
126
|
+
async function verifyMarketplace(name, config, configDir, logger) {
|
|
127
|
+
const result = { name, errors: [], status: 'valid' };
|
|
128
|
+
for (const plugin of config.plugins) {
|
|
129
|
+
const pluginDir = join(configDir, 'dist', '.claude', 'plugins', 'marketplaces', name, 'plugins', plugin.name);
|
|
130
|
+
// Verify .claude-plugin/plugin.json exists and validates
|
|
131
|
+
const pluginJsonPath = join(pluginDir, '.claude-plugin', 'plugin.json');
|
|
140
132
|
try {
|
|
141
|
-
const pluginErrors = await validateJsonFile(pluginJsonPath,
|
|
142
|
-
errors.push(...pluginErrors);
|
|
133
|
+
const pluginErrors = await validateJsonFile(pluginJsonPath, PluginJsonSchema, logger);
|
|
134
|
+
result.errors.push(...pluginErrors);
|
|
143
135
|
}
|
|
144
136
|
catch {
|
|
145
|
-
|
|
146
|
-
errors.push({
|
|
137
|
+
result.errors.push({
|
|
147
138
|
file: pluginJsonPath,
|
|
148
|
-
error:
|
|
139
|
+
error: 'plugin.json not found — run vat build (or vat claude build) to generate it',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// Verify at least one skills/*/SKILL.md exists
|
|
143
|
+
const skillsDir = join(pluginDir, 'skills');
|
|
144
|
+
const hasSkills = await verifySkillsExist(skillsDir);
|
|
145
|
+
if (!hasSkills) {
|
|
146
|
+
result.errors.push({
|
|
147
|
+
file: skillsDir,
|
|
148
|
+
error: 'No skills/*/SKILL.md found — run vat build (or vat claude build) to generate skills',
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
|
-
|
|
152
|
+
result.status = result.errors.length > 0 ? 'error' : 'valid';
|
|
153
|
+
return result;
|
|
153
154
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
155
|
+
/**
|
|
156
|
+
* Check that at least one skills/{name}/SKILL.md file exists in the given directory.
|
|
157
|
+
*/
|
|
158
|
+
async function verifySkillsExist(skillsDir) {
|
|
159
|
+
let entries;
|
|
160
|
+
try {
|
|
161
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- skillsDir resolved from config
|
|
162
|
+
entries = await readdir(skillsDir);
|
|
162
163
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const { file, errors } = await verifyInlineMarketplace(config, configDir, logger);
|
|
166
|
-
result.file = file;
|
|
167
|
-
result.errors.push(...errors);
|
|
164
|
+
catch {
|
|
165
|
+
return false;
|
|
168
166
|
}
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
try {
|
|
169
|
+
const skillMdPath = join(skillsDir, entry, 'SKILL.md');
|
|
170
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
171
|
+
await readFile(skillMdPath, 'utf-8');
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// This entry doesn't have a SKILL.md, check the next one
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
171
179
|
}
|
|
172
180
|
async function verifyManagedSettings(settingsPath, configDir, logger) {
|
|
173
181
|
const filePath = resolveRelativePath(settingsPath, configDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build skills from source into dist/skills/ during package build
|
|
3
3
|
*
|
|
4
|
-
* Reads
|
|
4
|
+
* Reads skills config from vibe-agent-toolkit.config.yaml, discovers SKILL.md
|
|
5
|
+
* files via include/exclude globs, reads frontmatter for skill names, merges
|
|
6
|
+
* packaging config (schema defaults -> config defaults -> per-skill overrides),
|
|
7
|
+
* validates, and packages into dist/skills/<name>/.
|
|
5
8
|
*/
|
|
6
9
|
import { Command } from 'commander';
|
|
7
10
|
export interface SkillsBuildCommandOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/build.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAaD,wBAAgB,kBAAkB,IAAI,OAAO,CAiD5C"}
|