@vibe-agent-toolkit/cli 0.1.15-rc.3 → 0.1.15-rc.7
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/bin.js +18 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/audit-settings.d.ts +18 -0
- package/dist/commands/audit-settings.d.ts.map +1 -0
- package/dist/commands/audit-settings.js +284 -0
- package/dist/commands/audit-settings.js.map +1 -0
- package/dist/commands/audit.d.ts +1 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +59 -6
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/build.d.ts +15 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +92 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/claude/build.d.ts +14 -0
- package/dist/commands/claude/build.d.ts.map +1 -0
- package/dist/commands/claude/build.js +252 -0
- package/dist/commands/claude/build.js.map +1 -0
- package/dist/commands/claude/claude-config.d.ts +20 -0
- package/dist/commands/claude/claude-config.d.ts.map +1 -0
- package/dist/commands/claude/claude-config.js +20 -0
- package/dist/commands/claude/claude-config.js.map +1 -0
- package/dist/commands/claude/index.d.ts +8 -0
- package/dist/commands/claude/index.d.ts.map +1 -0
- package/dist/commands/claude/index.js +38 -0
- package/dist/commands/claude/index.js.map +1 -0
- package/dist/commands/claude/verify.d.ts +13 -0
- package/dist/commands/claude/verify.d.ts.map +1 -0
- package/dist/commands/claude/verify.js +215 -0
- package/dist/commands/claude/verify.js.map +1 -0
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +33 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/phase-utils.d.ts +48 -0
- package/dist/commands/phase-utils.d.ts.map +1 -0
- package/dist/commands/phase-utils.js +61 -0
- package/dist/commands/phase-utils.js.map +1 -0
- package/dist/commands/skills/install.d.ts +1 -0
- package/dist/commands/skills/install.d.ts.map +1 -1
- package/dist/commands/skills/install.js +57 -2
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/skills/list.js +2 -2
- package/dist/commands/skills/list.js.map +1 -1
- package/dist/commands/skills/uninstall.d.ts.map +1 -1
- package/dist/commands/skills/uninstall.js +1 -1
- package/dist/commands/skills/uninstall.js.map +1 -1
- package/dist/commands/verify.d.ts +16 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +84 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/config-loader.d.ts +7 -3
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +11 -5
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/resource-loader.d.ts +1 -2
- package/dist/utils/resource-loader.d.ts.map +1 -1
- package/dist/utils/resource-loader.js +1 -11
- package/dist/utils/resource-loader.js.map +1 -1
- package/dist/utils/user-context-scanner.d.ts.map +1 -1
- package/dist/utils/user-context-scanner.js +1 -1
- package/dist/utils/user-context-scanner.js.map +1 -1
- package/docs/index.md +1 -0
- package/package.json +12 -13
- package/dist/schemas/config.d.ts +0 -1122
- package/dist/schemas/config.d.ts.map +0 -1
- package/dist/schemas/config.js +0 -141
- package/dist/schemas/config.js.map +0 -1
- package/dist/utils/claude-paths.d.ts +0 -32
- package/dist/utils/claude-paths.d.ts.map +0 -1
- package/dist/utils/claude-paths.js +0 -34
- package/dist/utils/claude-paths.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vat build` — top-level build orchestration
|
|
3
|
+
*
|
|
4
|
+
* Builds everything the project describes, in dependency order:
|
|
5
|
+
* 1. vat skills build (portable dist/skills/ output)
|
|
6
|
+
* 2. vat claude build (Claude plugin artifacts)
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
export interface BuildCommandOptions {
|
|
10
|
+
only?: string;
|
|
11
|
+
marketplace?: string;
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function createBuildTopLevelCommand(): Command;
|
|
15
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAsCpD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vat build` — top-level build orchestration
|
|
3
|
+
*
|
|
4
|
+
* Builds everything the project describes, in dependency order:
|
|
5
|
+
* 1. vat skills build (portable dist/skills/ output)
|
|
6
|
+
* 2. vat claude build (Claude plugin artifacts)
|
|
7
|
+
*/
|
|
8
|
+
import { spawnSync } from 'node:child_process';
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import { handleCommandError } from '../utils/command-error.js';
|
|
11
|
+
import { writeYamlOutput } from '../utils/output.js';
|
|
12
|
+
import { buildClaudePhaseArgs, createPhaseContext } from './phase-utils.js';
|
|
13
|
+
export function createBuildTopLevelCommand() {
|
|
14
|
+
const command = new Command('build');
|
|
15
|
+
command
|
|
16
|
+
.description('Build all project artifacts in dependency order (skills → claude plugins)')
|
|
17
|
+
.option('--only <phase>', 'Build only a specific phase: skills, claude')
|
|
18
|
+
.option('--marketplace <name>', 'Build specific marketplace only (claude phase)')
|
|
19
|
+
.option('--debug', 'Enable debug logging')
|
|
20
|
+
.action(buildTopLevelCommand)
|
|
21
|
+
.addHelpText('after', `
|
|
22
|
+
Description:
|
|
23
|
+
Builds all project artifacts in dependency order. Equivalent to running
|
|
24
|
+
vat skills build followed by vat claude build.
|
|
25
|
+
|
|
26
|
+
Phases:
|
|
27
|
+
skills → builds dist/skills/ from package.json vat.skills (platform-agnostic)
|
|
28
|
+
claude → wraps dist/skills/ into Claude plugin structure (requires skills phase)
|
|
29
|
+
|
|
30
|
+
Output:
|
|
31
|
+
YAML summary for each phase → stdout
|
|
32
|
+
Build progress → stderr
|
|
33
|
+
|
|
34
|
+
Exit Codes:
|
|
35
|
+
0 - All phases completed successfully
|
|
36
|
+
1 - Build error
|
|
37
|
+
2 - System error
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
$ vat build # Build everything
|
|
41
|
+
$ vat build --only skills # Build portable skills only
|
|
42
|
+
$ vat build --only claude # Build Claude artifacts only (skills must be pre-built)
|
|
43
|
+
$ vat build --marketplace acme # Build specific marketplace
|
|
44
|
+
`);
|
|
45
|
+
return command;
|
|
46
|
+
}
|
|
47
|
+
function buildPhaseList(options) {
|
|
48
|
+
const { only } = options;
|
|
49
|
+
const phases = [];
|
|
50
|
+
if (!only || only === 'skills') {
|
|
51
|
+
phases.push({ name: 'skills', args: ['skills', 'build'] });
|
|
52
|
+
}
|
|
53
|
+
if (!only || only === 'claude') {
|
|
54
|
+
phases.push({ name: 'claude', args: buildClaudePhaseArgs('build', options) });
|
|
55
|
+
}
|
|
56
|
+
return phases;
|
|
57
|
+
}
|
|
58
|
+
async function buildTopLevelCommand(options) {
|
|
59
|
+
const phases = buildPhaseList(options);
|
|
60
|
+
const { logger, startTime, binPath } = createPhaseContext(options.debug, phases, options.only, 'skills, claude');
|
|
61
|
+
try {
|
|
62
|
+
logger.info(`🔨 vat build (phases: ${phases.map((p) => p.name).join(' → ')})`);
|
|
63
|
+
for (const phase of phases) {
|
|
64
|
+
logger.info(`\n▶ Phase: ${phase.name}`);
|
|
65
|
+
const result = spawnSync(process.execPath, [binPath, ...phase.args], {
|
|
66
|
+
stdio: ['inherit', 'inherit', 'inherit'],
|
|
67
|
+
});
|
|
68
|
+
if (result.status !== 0) {
|
|
69
|
+
const duration = Date.now() - startTime;
|
|
70
|
+
writeYamlOutput({
|
|
71
|
+
status: 'error',
|
|
72
|
+
error: `Phase '${phase.name}' failed with exit code ${result.status ?? 'unknown'}`,
|
|
73
|
+
phase: phase.name,
|
|
74
|
+
duration: `${duration}ms`,
|
|
75
|
+
});
|
|
76
|
+
process.exit(result.status ?? 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const duration = Date.now() - startTime;
|
|
80
|
+
logger.info(`\n✅ Build complete`);
|
|
81
|
+
writeYamlOutput({
|
|
82
|
+
status: 'success',
|
|
83
|
+
phasesCompleted: phases.map((p) => p.name),
|
|
84
|
+
duration: `${duration}ms`,
|
|
85
|
+
});
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
handleCommandError(error, logger, startTime, 'Build');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vat claude build` — generate Claude plugin marketplace artifacts
|
|
3
|
+
*
|
|
4
|
+
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces and package.json → vat.skills.
|
|
5
|
+
* Wraps pre-built dist/skills/ output into Claude plugin directory structure.
|
|
6
|
+
* Generates plugin.json and marketplace.json metadata files.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
export interface ClaudeBuildCommandOptions {
|
|
10
|
+
marketplace?: string;
|
|
11
|
+
debug?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function createBuildCommand(): Command;
|
|
14
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD,wBAAgB,kBAAkB,IAAI,OAAO,CA0C5C"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vat claude build` — generate Claude plugin marketplace artifacts
|
|
3
|
+
*
|
|
4
|
+
* Reads vibe-agent-toolkit.config.yaml → claude.marketplaces and package.json → vat.skills.
|
|
5
|
+
* Wraps pre-built dist/skills/ output into Claude plugin directory structure.
|
|
6
|
+
* Generates plugin.json and marketplace.json metadata files.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { cp, mkdir, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { handleCommandError } from '../../utils/command-error.js';
|
|
13
|
+
import { createLogger } from '../../utils/logger.js';
|
|
14
|
+
import { writeYamlOutput } from '../../utils/output.js';
|
|
15
|
+
import { readPackageJson } from '../skills/shared.js';
|
|
16
|
+
import { loadClaudeProjectConfig } from './claude-config.js';
|
|
17
|
+
export function createBuildCommand() {
|
|
18
|
+
const command = new Command('build');
|
|
19
|
+
command
|
|
20
|
+
.description('Generate Claude plugin marketplace artifacts from pre-built skills')
|
|
21
|
+
.option('--marketplace <name>', 'Build specific marketplace only')
|
|
22
|
+
.option('--debug', 'Enable debug logging')
|
|
23
|
+
.action(buildCommand)
|
|
24
|
+
.addHelpText('after', `
|
|
25
|
+
Description:
|
|
26
|
+
Reads vibe-agent-toolkit.config.yaml and package.json to build Claude plugin
|
|
27
|
+
artifacts from pre-built dist/skills/ output. Must run vat skills build first.
|
|
28
|
+
|
|
29
|
+
For each inline marketplace (skips file: entries):
|
|
30
|
+
- Matches skill selectors against vat.skills names (exact or glob)
|
|
31
|
+
- Copies dist/skills/<name>/ into plugin directory structure
|
|
32
|
+
- Generates plugin.json and marketplace.json
|
|
33
|
+
|
|
34
|
+
Source-layout (file:) marketplaces are skipped (they are verified, not built).
|
|
35
|
+
|
|
36
|
+
Output paths (defaults, overridable via config):
|
|
37
|
+
dist/plugins/<plugin-name>/ ← plugin directory
|
|
38
|
+
dist/.claude-plugin/marketplace.json ← marketplace catalog
|
|
39
|
+
|
|
40
|
+
Output:
|
|
41
|
+
YAML summary → stdout
|
|
42
|
+
Build progress → stderr
|
|
43
|
+
|
|
44
|
+
Exit Codes:
|
|
45
|
+
0 - Build successful
|
|
46
|
+
1 - Build error (missing skills, invalid config)
|
|
47
|
+
2 - System error
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
$ vat skills build && vat claude build # Build skills then wrap for Claude
|
|
51
|
+
$ vat claude build --marketplace acme # Build specific marketplace
|
|
52
|
+
`);
|
|
53
|
+
return command;
|
|
54
|
+
}
|
|
55
|
+
async function buildCommand(options) {
|
|
56
|
+
const logger = createLogger(options.debug ? { debug: true } : {});
|
|
57
|
+
const startTime = Date.now();
|
|
58
|
+
try {
|
|
59
|
+
const { configPath, configDir, claudeConfig } = await loadClaudeProjectConfig();
|
|
60
|
+
if (!claudeConfig?.marketplaces || Object.keys(claudeConfig.marketplaces).length === 0) {
|
|
61
|
+
writeYamlOutput({
|
|
62
|
+
status: 'success',
|
|
63
|
+
message: 'No claude.marketplaces configured — nothing to build',
|
|
64
|
+
duration: `${Date.now() - startTime}ms`,
|
|
65
|
+
});
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
// Read package.json for skill definitions
|
|
69
|
+
const packageJson = await readPackageJson(configDir);
|
|
70
|
+
const vatSkills = packageJson.vat?.skills ?? [];
|
|
71
|
+
logger.info(`📦 Building Claude plugin artifacts`);
|
|
72
|
+
logger.info(` Config: ${configPath}`);
|
|
73
|
+
logger.info(` Skills available: ${vatSkills.length}`);
|
|
74
|
+
const results = [];
|
|
75
|
+
const marketplaces = claudeConfig.marketplaces;
|
|
76
|
+
for (const name of Object.keys(marketplaces)) {
|
|
77
|
+
const mpConfig = marketplaces[name];
|
|
78
|
+
// Skip if --marketplace filter specified and doesn't match
|
|
79
|
+
if (options.marketplace && options.marketplace !== name) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
logger.info(`\n🏪 Building marketplace: ${name}`);
|
|
83
|
+
const result = await buildMarketplace(name, mpConfig, vatSkills, configDir, logger);
|
|
84
|
+
results.push(result);
|
|
85
|
+
if (result.status === 'error') {
|
|
86
|
+
logger.error(` ❌ Failed: ${result.reason ?? 'unknown error'}`);
|
|
87
|
+
const duration = Date.now() - startTime;
|
|
88
|
+
writeYamlOutput({
|
|
89
|
+
status: 'error',
|
|
90
|
+
error: result.reason ?? 'Build failed',
|
|
91
|
+
marketplace: name,
|
|
92
|
+
duration: `${duration}ms`,
|
|
93
|
+
});
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const duration = Date.now() - startTime;
|
|
98
|
+
const totalPlugins = results.flatMap((r) => r.plugins).length;
|
|
99
|
+
const totalSkills = results.flatMap((r) => r.plugins).flatMap((p) => p.skillsCopied).length;
|
|
100
|
+
writeYamlOutput({
|
|
101
|
+
status: 'success',
|
|
102
|
+
marketplacesBuilt: results.filter((r) => r.status === 'built').length,
|
|
103
|
+
pluginsBuilt: totalPlugins,
|
|
104
|
+
skillsPackaged: totalSkills,
|
|
105
|
+
marketplaces: results.map((r) => ({
|
|
106
|
+
name: r.name,
|
|
107
|
+
status: r.status,
|
|
108
|
+
...(r.reason ? { reason: r.reason } : {}),
|
|
109
|
+
...(r.marketplaceJsonPath ? { marketplaceJson: r.marketplaceJsonPath } : {}),
|
|
110
|
+
plugins: r.plugins.map((p) => ({
|
|
111
|
+
name: p.pluginName,
|
|
112
|
+
dir: p.pluginDir,
|
|
113
|
+
skills: p.skillsCopied,
|
|
114
|
+
})),
|
|
115
|
+
})),
|
|
116
|
+
duration: `${duration}ms`,
|
|
117
|
+
});
|
|
118
|
+
process.exit(0);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
handleCommandError(error, logger, startTime, 'ClaudeBuild');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function buildMarketplace(name, config, vatSkills, configDir, logger) {
|
|
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');
|
|
140
|
+
const plugins = [];
|
|
141
|
+
const pluginEntries = [];
|
|
142
|
+
const pluginDefs = config.plugins ?? [{ name, skills: '*' }];
|
|
143
|
+
for (const pluginDef of pluginDefs) {
|
|
144
|
+
// Determine which skills go into this plugin
|
|
145
|
+
const pluginSkills = pluginDef.skills === '*' || pluginDef.skills === undefined
|
|
146
|
+
? selectedSkills
|
|
147
|
+
: selectedSkills.filter((s) => Array.isArray(pluginDef.skills) ? pluginDef.skills.includes(s.name) : true);
|
|
148
|
+
const pluginResult = await buildPlugin(pluginDef.name, pluginSkills, configDir, pluginsDir, logger);
|
|
149
|
+
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
|
+
}
|
|
163
|
+
// Generate marketplace.json
|
|
164
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
165
|
+
await mkdir(dirname(marketplaceJsonPath), { recursive: true });
|
|
166
|
+
const marketplace = {
|
|
167
|
+
name,
|
|
168
|
+
...(config.owner ? { owner: config.owner } : {}),
|
|
169
|
+
...(config.metadata ? { metadata: config.metadata } : {}),
|
|
170
|
+
plugins: pluginEntries,
|
|
171
|
+
};
|
|
172
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
173
|
+
await writeFile(marketplaceJsonPath, JSON.stringify(marketplace, null, 2));
|
|
174
|
+
logger.info(` ✅ marketplace.json → ${marketplaceJsonPath}`);
|
|
175
|
+
return {
|
|
176
|
+
name,
|
|
177
|
+
status: 'built',
|
|
178
|
+
plugins,
|
|
179
|
+
marketplaceJsonPath,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async function buildPlugin(pluginName, skills, configDir, pluginsDir, logger) {
|
|
183
|
+
const pluginDir = join(pluginsDir, pluginName);
|
|
184
|
+
const skillsCopied = [];
|
|
185
|
+
logger.info(` 📦 Building plugin: ${pluginName}`);
|
|
186
|
+
for (const skill of skills) {
|
|
187
|
+
const skillDistPath = resolveRelativePath(skill.path, configDir);
|
|
188
|
+
// Verify skill is built
|
|
189
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved from config
|
|
190
|
+
if (!existsSync(skillDistPath)) {
|
|
191
|
+
throw new Error(`Skill "${skill.name}" not built at ${skillDistPath}. ` +
|
|
192
|
+
`Run: vat skills build (or vat build to build everything)`);
|
|
193
|
+
}
|
|
194
|
+
// Copy skill into plugin directory structure
|
|
195
|
+
const destPath = join(pluginDir, 'skills', skill.name);
|
|
196
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
197
|
+
await mkdir(destPath, { recursive: true });
|
|
198
|
+
await cp(skillDistPath, destPath, { recursive: true });
|
|
199
|
+
skillsCopied.push(skill.name);
|
|
200
|
+
logger.info(` ✅ ${skill.name} → skills/${skill.name}`);
|
|
201
|
+
}
|
|
202
|
+
// Generate plugin.json
|
|
203
|
+
const pluginJsonDir = join(pluginDir, '.claude-plugin');
|
|
204
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
205
|
+
await mkdir(pluginJsonDir, { recursive: true });
|
|
206
|
+
const pluginJson = {
|
|
207
|
+
name: pluginName,
|
|
208
|
+
skills: skillsCopied.map((skillName) => `skills/${skillName}`),
|
|
209
|
+
};
|
|
210
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolved paths
|
|
211
|
+
await writeFile(join(pluginJsonDir, 'plugin.json'), JSON.stringify(pluginJson, null, 2));
|
|
212
|
+
logger.info(` ✅ .claude-plugin/plugin.json`);
|
|
213
|
+
return { pluginName, pluginDir, skillsCopied };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Resolve skill selectors (exact names or glob patterns) against available skills.
|
|
217
|
+
* Supports exact name match and simple glob suffix like "acme-*".
|
|
218
|
+
*/
|
|
219
|
+
function resolveSkillSelectors(selectors, availableSkills) {
|
|
220
|
+
if (selectors.length === 0) {
|
|
221
|
+
return availableSkills;
|
|
222
|
+
}
|
|
223
|
+
const matched = new Set();
|
|
224
|
+
for (const selector of selectors) {
|
|
225
|
+
for (const skill of availableSkills) {
|
|
226
|
+
if (matchesSelector(skill.name, selector)) {
|
|
227
|
+
matched.add(skill.name);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return availableSkills.filter((s) => matched.has(s.name));
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if a skill name matches a selector.
|
|
235
|
+
* Supports exact match and simple glob patterns (prefix*, suffix*, *contains*).
|
|
236
|
+
*/
|
|
237
|
+
function matchesSelector(skillName, selector) {
|
|
238
|
+
if (selector === '*') {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
// Convert simple glob to regex: replace * with .*
|
|
242
|
+
// eslint-disable-next-line security/detect-non-literal-regexp -- selector is from project config, bounded by name format
|
|
243
|
+
const regex = new RegExp(`^${selector.replaceAll('*', '.*')}$`);
|
|
244
|
+
return regex.test(skillName);
|
|
245
|
+
}
|
|
246
|
+
function resolveRelativePath(filePath, baseDir) {
|
|
247
|
+
if (isAbsolute(filePath)) {
|
|
248
|
+
return filePath;
|
|
249
|
+
}
|
|
250
|
+
return resolve(baseDir, filePath);
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/claude/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared config loading utilities for `vat claude` subcommands.
|
|
3
|
+
*/
|
|
4
|
+
import { type ClaudeConfig } from '@vibe-agent-toolkit/resources';
|
|
5
|
+
export interface LoadedClaudeConfig {
|
|
6
|
+
configPath: string;
|
|
7
|
+
configDir: string;
|
|
8
|
+
claudeConfig: ClaudeConfig;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Find, parse, and return the claude: section of the project config.
|
|
12
|
+
* Throws if the config file cannot be found or parsed.
|
|
13
|
+
* Returns null for claudeConfig when the claude: section is absent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadClaudeProjectConfig(): Promise<{
|
|
16
|
+
configPath: string;
|
|
17
|
+
configDir: string;
|
|
18
|
+
claudeConfig: ClaudeConfig | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=claude-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-config.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/claude-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEnG,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;CACxC,CAAC,CAUD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared config loading utilities for `vat claude` subcommands.
|
|
3
|
+
*/
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
import { findConfigFile, parseConfigFile } from '@vibe-agent-toolkit/resources';
|
|
6
|
+
/**
|
|
7
|
+
* Find, parse, and return the claude: section of the project config.
|
|
8
|
+
* Throws if the config file cannot be found or parsed.
|
|
9
|
+
* Returns null for claudeConfig when the claude: section is absent.
|
|
10
|
+
*/
|
|
11
|
+
export async function loadClaudeProjectConfig() {
|
|
12
|
+
const configPath = await findConfigFile();
|
|
13
|
+
if (!configPath) {
|
|
14
|
+
throw new Error('No vibe-agent-toolkit.config.yaml found. Run from a project directory.');
|
|
15
|
+
}
|
|
16
|
+
const config = await parseConfigFile(configPath);
|
|
17
|
+
const configDir = dirname(configPath);
|
|
18
|
+
return { configPath, configDir, claudeConfig: config.claude };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=claude-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../../../src/commands/claude/claude-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAqB,MAAM,+BAA+B,CAAC;AAQnG;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAK3C,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,IAAI,OAAO,CAkC7C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude command group
|
|
3
|
+
*
|
|
4
|
+
* Commands for building and verifying Claude plugin marketplace artifacts
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { createBuildCommand } from './build.js';
|
|
8
|
+
import { createVerifyCommand } from './verify.js';
|
|
9
|
+
export function createClaudeCommand() {
|
|
10
|
+
const command = new Command('claude');
|
|
11
|
+
command
|
|
12
|
+
.description('Build and verify Claude plugin marketplace artifacts')
|
|
13
|
+
.helpCommand(false)
|
|
14
|
+
.addHelpText('after', `
|
|
15
|
+
Description:
|
|
16
|
+
Commands for working with Claude Code plugin marketplaces and plugin.json artifacts.
|
|
17
|
+
Reads claude: section from vibe-agent-toolkit.config.yaml.
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
$ vat claude build # Generate plugin artifacts from pre-built skills
|
|
21
|
+
$ vat claude verify # Validate marketplace.json and plugin.json files
|
|
22
|
+
$ vat claude verify --marketplace lfa # Verify a specific marketplace
|
|
23
|
+
|
|
24
|
+
Workflow:
|
|
25
|
+
1. Configure: Add claude: section to vibe-agent-toolkit.config.yaml
|
|
26
|
+
2. Build: vat skills build (build portable skills first)
|
|
27
|
+
3. Package: vat claude build (wrap skills into Claude plugin format)
|
|
28
|
+
4. Verify: vat claude verify (validate generated artifacts)
|
|
29
|
+
|
|
30
|
+
Or use the top-level commands:
|
|
31
|
+
$ vat build # Runs skills build then claude build
|
|
32
|
+
$ vat verify # Validates everything (resources, skills, claude)
|
|
33
|
+
`);
|
|
34
|
+
command.addCommand(createBuildCommand());
|
|
35
|
+
command.addCommand(createVerifyCommand());
|
|
36
|
+
return command;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/claude/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,sDAAsD,CAAC;SACnE,WAAW,CAAC,KAAK,CAAC;SAClB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;CAmBL,CACI,CAAC;IAEJ,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `vat claude verify` — validate Claude plugin marketplace artifacts
|
|
3
|
+
*
|
|
4
|
+
* Validates existing marketplace.json, plugin.json, and managed-settings.json files
|
|
5
|
+
* against their schemas. Does not build anything — validates what exists.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export interface ClaudeVerifyCommandOptions {
|
|
9
|
+
marketplace?: string;
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function createVerifyCommand(): Command;
|
|
13
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/claude/verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD,wBAAgB,mBAAmB,IAAI,OAAO,CAoC7C"}
|