@vibe-agent-toolkit/cli 0.1.9 → 0.1.11
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/vat +174 -0
- package/dist/bin.js +2 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/audit/hierarchical-output.d.ts.map +1 -1
- package/dist/commands/audit/hierarchical-output.js +74 -13
- package/dist/commands/audit/hierarchical-output.js.map +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +36 -32
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/skills/build.d.ts +13 -0
- package/dist/commands/skills/build.d.ts.map +1 -0
- package/dist/commands/skills/build.js +205 -0
- package/dist/commands/skills/build.js.map +1 -0
- package/dist/commands/skills/command-helpers.d.ts +30 -0
- package/dist/commands/skills/command-helpers.d.ts.map +1 -0
- package/dist/commands/skills/command-helpers.js +54 -0
- package/dist/commands/skills/command-helpers.js.map +1 -0
- package/dist/commands/skills/index.d.ts +8 -0
- package/dist/commands/skills/index.d.ts.map +1 -0
- package/dist/commands/skills/index.js +96 -0
- package/dist/commands/skills/index.js.map +1 -0
- package/dist/commands/skills/install-helpers.d.ts +45 -0
- package/dist/commands/skills/install-helpers.d.ts.map +1 -0
- package/dist/commands/skills/install-helpers.js +120 -0
- package/dist/commands/skills/install-helpers.js.map +1 -0
- package/dist/commands/skills/install.d.ts +20 -0
- package/dist/commands/skills/install.d.ts.map +1 -0
- package/dist/commands/skills/install.js +287 -0
- package/dist/commands/skills/install.js.map +1 -0
- package/dist/commands/skills/list.d.ts +12 -0
- package/dist/commands/skills/list.d.ts.map +1 -0
- package/dist/commands/skills/list.js +124 -0
- package/dist/commands/skills/list.js.map +1 -0
- package/dist/commands/skills/package.d.ts +16 -0
- package/dist/commands/skills/package.d.ts.map +1 -0
- package/dist/commands/skills/package.js +293 -0
- package/dist/commands/skills/package.js.map +1 -0
- package/dist/commands/skills/validate-command.d.ts +6 -0
- package/dist/commands/skills/validate-command.d.ts.map +1 -0
- package/dist/commands/skills/validate-command.js +76 -0
- package/dist/commands/skills/validate-command.js.map +1 -0
- package/dist/commands/skills/validate.d.ts +24 -0
- package/dist/commands/skills/validate.d.ts.map +1 -0
- package/dist/commands/skills/validate.js +264 -0
- package/dist/commands/skills/validate.js.map +1 -0
- package/dist/utils/claude-paths.d.ts +32 -0
- package/dist/utils/claude-paths.d.ts.map +1 -0
- package/dist/utils/claude-paths.js +34 -0
- package/dist/utils/claude-paths.js.map +1 -0
- package/dist/utils/skill-discovery.d.ts +49 -0
- package/dist/utils/skill-discovery.d.ts.map +1 -0
- package/dist/utils/skill-discovery.js +73 -0
- package/dist/utils/skill-discovery.js.map +1 -0
- package/dist/utils/user-context-scanner.d.ts +31 -0
- package/dist/utils/user-context-scanner.d.ts.map +1 -0
- package/dist/utils/user-context-scanner.js +60 -0
- package/dist/utils/user-context-scanner.js.map +1 -0
- package/docs/audit.md +1 -0
- package/docs/skills.md +561 -0
- package/package.json +18 -12
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build skills from source into dist/skills/ during package build
|
|
3
|
+
*
|
|
4
|
+
* Reads vat.skills from package.json and builds each skill using packageSkill()
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { dirname, join, resolve } from 'node:path';
|
|
9
|
+
import { packageSkill } from '@vibe-agent-toolkit/agent-skills';
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { handleCommandError } from '../../utils/command-error.js';
|
|
12
|
+
import { createLogger } from '../../utils/logger.js';
|
|
13
|
+
import { filterSkillsByName, writeYamlHeader } from './command-helpers.js';
|
|
14
|
+
export function createBuildCommand() {
|
|
15
|
+
const command = new Command('build');
|
|
16
|
+
command
|
|
17
|
+
.description('Build skills from source (reads vat.skills from package.json)')
|
|
18
|
+
.option('--skill <name>', 'Build specific skill only')
|
|
19
|
+
.option('--dry-run', 'Preview build without creating files')
|
|
20
|
+
.option('--debug', 'Enable debug logging')
|
|
21
|
+
.action(buildCommand)
|
|
22
|
+
.addHelpText('after', `
|
|
23
|
+
Description:
|
|
24
|
+
Builds all skills declared in package.json vat.skills field. For each
|
|
25
|
+
skill, validates the source exists, runs packageSkill(), and outputs to
|
|
26
|
+
the configured path directory.
|
|
27
|
+
|
|
28
|
+
Typically run as part of package build: "build": "tsc && vat skills build"
|
|
29
|
+
|
|
30
|
+
Package.json Structure:
|
|
31
|
+
{
|
|
32
|
+
"vat": {
|
|
33
|
+
"version": "1.0",
|
|
34
|
+
"type": "agent-bundle",
|
|
35
|
+
"skills": [
|
|
36
|
+
{
|
|
37
|
+
"name": "my-skill",
|
|
38
|
+
"source": "./resources/skills/SKILL.md",
|
|
39
|
+
"path": "./dist/skills/my-skill"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Output:
|
|
46
|
+
YAML summary → stdout (for programmatic parsing)
|
|
47
|
+
Build progress → stderr (for human reading)
|
|
48
|
+
|
|
49
|
+
Exit Codes:
|
|
50
|
+
0 - Build successful (or dry-run preview)
|
|
51
|
+
1 - Invalid source or build error
|
|
52
|
+
2 - System error (missing package.json, invalid config)
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
$ vat skills build # Build all skills
|
|
56
|
+
$ vat skills build --skill my-skill # Build specific skill
|
|
57
|
+
$ vat skills build --dry-run # Preview without building
|
|
58
|
+
`);
|
|
59
|
+
return command;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Read and parse package.json from current directory
|
|
63
|
+
*/
|
|
64
|
+
async function readPackageJson(cwd) {
|
|
65
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
66
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Reading from validated current directory
|
|
67
|
+
if (!existsSync(packageJsonPath)) {
|
|
68
|
+
throw new Error(`package.json not found in current directory: ${cwd}`);
|
|
69
|
+
}
|
|
70
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Reading from validated current directory
|
|
71
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
72
|
+
const packageJson = JSON.parse(content);
|
|
73
|
+
if (!packageJson.vat?.skills || packageJson.vat.skills.length === 0) {
|
|
74
|
+
throw new Error('No skills found in package.json vat.skills field. Add skill metadata to build skills.');
|
|
75
|
+
}
|
|
76
|
+
return packageJson;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validate skill source exists
|
|
80
|
+
*/
|
|
81
|
+
function validateSkillSource(skill, cwd, logger) {
|
|
82
|
+
const sourcePath = resolve(cwd, skill.source);
|
|
83
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path resolved from package.json
|
|
84
|
+
if (!existsSync(sourcePath)) {
|
|
85
|
+
logger.error(`❌ Skill source not found: ${skill.source}`);
|
|
86
|
+
logger.error(` Expected path: ${sourcePath}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
return sourcePath;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build a single skill
|
|
93
|
+
*/
|
|
94
|
+
async function buildSkill(skill, sourcePath, cwd, logger) {
|
|
95
|
+
const outputPath = resolve(cwd, skill.path);
|
|
96
|
+
const basePath = dirname(sourcePath);
|
|
97
|
+
logger.info(`\n📦 Building skill: ${skill.name}`);
|
|
98
|
+
logger.info(` Source: ${skill.source}`);
|
|
99
|
+
logger.info(` Output: ${skill.path}`);
|
|
100
|
+
const result = await packageSkill(sourcePath, {
|
|
101
|
+
outputPath,
|
|
102
|
+
formats: ['directory'],
|
|
103
|
+
rewriteLinks: true,
|
|
104
|
+
basePath,
|
|
105
|
+
});
|
|
106
|
+
logger.info(` ✅ Built ${result.files.dependencies.length + 1} files`);
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Output dry-run results
|
|
111
|
+
*/
|
|
112
|
+
function outputDryRunYaml(skills, packageName, duration) {
|
|
113
|
+
writeYamlHeader({
|
|
114
|
+
status: 'success',
|
|
115
|
+
dryRun: true,
|
|
116
|
+
package: packageName,
|
|
117
|
+
skillsFound: skills.length,
|
|
118
|
+
});
|
|
119
|
+
process.stdout.write(`skills:\n`);
|
|
120
|
+
for (const skill of skills) {
|
|
121
|
+
process.stdout.write(` - name: ${skill.name}\n`);
|
|
122
|
+
process.stdout.write(` source: ${skill.source}\n`);
|
|
123
|
+
process.stdout.write(` path: ${skill.path}\n`);
|
|
124
|
+
}
|
|
125
|
+
process.stdout.write(`duration: ${duration}ms\n`);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Perform dry-run preview
|
|
129
|
+
*/
|
|
130
|
+
async function performDryRun(skillsToBuild, packageName, logger) {
|
|
131
|
+
const startTime = Date.now();
|
|
132
|
+
const cwd = process.cwd();
|
|
133
|
+
logger.info(`🔍 Dry-run: Analyzing skill build...`);
|
|
134
|
+
logger.info(` Package: ${packageName}`);
|
|
135
|
+
logger.info(` Skills to build: ${skillsToBuild.length}`);
|
|
136
|
+
// Validate all sources exist
|
|
137
|
+
logger.info(`\n📋 Skills:`);
|
|
138
|
+
for (const skill of skillsToBuild) {
|
|
139
|
+
// Validate source exists (throws if missing)
|
|
140
|
+
validateSkillSource(skill, cwd, logger);
|
|
141
|
+
logger.info(` ✅ ${skill.name}`);
|
|
142
|
+
logger.info(` Source: ${skill.source} (exists)`);
|
|
143
|
+
logger.info(` Output: ${skill.path}`);
|
|
144
|
+
}
|
|
145
|
+
const duration = Date.now() - startTime;
|
|
146
|
+
// Output YAML results
|
|
147
|
+
outputDryRunYaml(skillsToBuild, packageName, duration);
|
|
148
|
+
logger.info(`\n✅ Dry-run complete (no files created)`);
|
|
149
|
+
logger.info(` Run without --dry-run to build the skills`);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Output build results
|
|
153
|
+
*/
|
|
154
|
+
function outputBuildYaml(results, packageName, duration) {
|
|
155
|
+
writeYamlHeader({
|
|
156
|
+
status: 'success',
|
|
157
|
+
package: packageName,
|
|
158
|
+
skillsBuilt: results.length,
|
|
159
|
+
});
|
|
160
|
+
process.stdout.write(`skills:\n`);
|
|
161
|
+
for (const { skill, result } of results) {
|
|
162
|
+
process.stdout.write(` - name: ${skill.name}\n`);
|
|
163
|
+
process.stdout.write(` outputPath: ${result.outputPath}\n`);
|
|
164
|
+
process.stdout.write(` filesPackaged: ${result.files.dependencies.length + 1}\n`);
|
|
165
|
+
}
|
|
166
|
+
process.stdout.write(`duration: ${duration}ms\n`);
|
|
167
|
+
}
|
|
168
|
+
async function buildCommand(options) {
|
|
169
|
+
const logger = createLogger(options.debug ? { debug: true } : {});
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
try {
|
|
172
|
+
const cwd = process.cwd();
|
|
173
|
+
logger.info(`📖 Reading package.json from ${cwd}`);
|
|
174
|
+
// Read package.json
|
|
175
|
+
const packageJson = await readPackageJson(cwd);
|
|
176
|
+
const skills = packageJson.vat?.skills ?? [];
|
|
177
|
+
if (skills.length === 0) {
|
|
178
|
+
throw new Error('No skills found in package.json vat.skills');
|
|
179
|
+
}
|
|
180
|
+
// Filter by skill name if specified
|
|
181
|
+
const skillsToBuild = filterSkillsByName(skills, options.skill);
|
|
182
|
+
logger.info(`📦 Found ${skillsToBuild.length} skill(s) to build`);
|
|
183
|
+
// Handle dry-run mode
|
|
184
|
+
if (options.dryRun) {
|
|
185
|
+
await performDryRun(skillsToBuild, packageJson.name, logger);
|
|
186
|
+
process.exit(0);
|
|
187
|
+
}
|
|
188
|
+
// Build each skill
|
|
189
|
+
const results = [];
|
|
190
|
+
for (const skill of skillsToBuild) {
|
|
191
|
+
const sourcePath = validateSkillSource(skill, cwd, logger);
|
|
192
|
+
const result = await buildSkill(skill, sourcePath, cwd, logger);
|
|
193
|
+
results.push({ skill, result });
|
|
194
|
+
}
|
|
195
|
+
const duration = Date.now() - startTime;
|
|
196
|
+
// Output YAML results
|
|
197
|
+
outputBuildYaml(results, packageJson.name, duration);
|
|
198
|
+
logger.info(`\n✅ Built ${results.length} skill(s) successfully`);
|
|
199
|
+
process.exit(0);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
handleCommandError(error, logger, startTime, 'SkillsBuild');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/skills/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for skill commands
|
|
3
|
+
*/
|
|
4
|
+
import type { VatSkillMetadata } from '@vibe-agent-toolkit/agent-schema';
|
|
5
|
+
import type { Logger } from '../../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handle command errors consistently
|
|
8
|
+
*
|
|
9
|
+
* @param error - Error object
|
|
10
|
+
* @param logger - Logger instance
|
|
11
|
+
* @param startTime - Command start timestamp
|
|
12
|
+
* @param commandName - Name of command for error messages
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleCommandError(error: unknown, logger: Logger, startTime: number, commandName: string): never;
|
|
15
|
+
/**
|
|
16
|
+
* Filter skills by name if specified
|
|
17
|
+
*
|
|
18
|
+
* @param skills - All skills from package.json
|
|
19
|
+
* @param skillName - Optional skill name to filter by
|
|
20
|
+
* @returns Filtered skills array
|
|
21
|
+
* @throws Error if skillName specified but not found
|
|
22
|
+
*/
|
|
23
|
+
export declare function filterSkillsByName(skills: VatSkillMetadata[], skillName?: string): VatSkillMetadata[];
|
|
24
|
+
/**
|
|
25
|
+
* Write YAML header to stdout
|
|
26
|
+
*
|
|
27
|
+
* @param fields - Key-value pairs to write as YAML
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeYamlHeader(fields: Record<string, string | number | boolean>): void;
|
|
30
|
+
//# sourceMappingURL=command-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/command-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,KAAK,CAcP;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,EAAE,CAcpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAKvF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for skill commands
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Handle command errors consistently
|
|
6
|
+
*
|
|
7
|
+
* @param error - Error object
|
|
8
|
+
* @param logger - Logger instance
|
|
9
|
+
* @param startTime - Command start timestamp
|
|
10
|
+
* @param commandName - Name of command for error messages
|
|
11
|
+
*/
|
|
12
|
+
export function handleCommandError(error, logger, startTime, commandName) {
|
|
13
|
+
const duration = Date.now() - startTime;
|
|
14
|
+
if (error instanceof Error) {
|
|
15
|
+
logger.error(`${commandName} failed: ${error.message}`);
|
|
16
|
+
logger.debug(`Error stack: ${error.stack ?? 'No stack trace'}`);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
logger.error(`${commandName} failed: ${String(error)}`);
|
|
20
|
+
}
|
|
21
|
+
logger.debug(`Duration: ${duration}ms`);
|
|
22
|
+
// Exit with code 2 for unexpected errors
|
|
23
|
+
process.exit(2);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Filter skills by name if specified
|
|
27
|
+
*
|
|
28
|
+
* @param skills - All skills from package.json
|
|
29
|
+
* @param skillName - Optional skill name to filter by
|
|
30
|
+
* @returns Filtered skills array
|
|
31
|
+
* @throws Error if skillName specified but not found
|
|
32
|
+
*/
|
|
33
|
+
export function filterSkillsByName(skills, skillName) {
|
|
34
|
+
if (!skillName) {
|
|
35
|
+
return skills;
|
|
36
|
+
}
|
|
37
|
+
const filtered = skills.filter(s => s.name === skillName);
|
|
38
|
+
if (filtered.length === 0) {
|
|
39
|
+
throw new Error(`Skill "${skillName}" not found in package.json vat.skills`);
|
|
40
|
+
}
|
|
41
|
+
return filtered;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write YAML header to stdout
|
|
45
|
+
*
|
|
46
|
+
* @param fields - Key-value pairs to write as YAML
|
|
47
|
+
*/
|
|
48
|
+
export function writeYamlHeader(fields) {
|
|
49
|
+
process.stdout.write('---\n');
|
|
50
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
51
|
+
process.stdout.write(`${key}: ${value}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=command-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../../src/commands/skills/command-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,MAAc,EACd,SAAiB,EACjB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,IAAI,CAAC,CAAC;IAExC,yCAAyC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA0B,EAC1B,SAAkB;IAElB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,UAAU,SAAS,wCAAwC,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiD;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,mBAAmB,IAAI,OAAO,CAwC7C"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills command group
|
|
3
|
+
*
|
|
4
|
+
* Commands for packaging, distributing, and managing Claude skills
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { createBuildCommand } from './build.js';
|
|
8
|
+
import { createInstallCommand } from './install.js';
|
|
9
|
+
import { listCommand } from './list.js';
|
|
10
|
+
import { createPackageCommand } from './package.js';
|
|
11
|
+
import { createValidateCommand } from './validate-command.js';
|
|
12
|
+
export function createSkillsCommand() {
|
|
13
|
+
const command = new Command('skills');
|
|
14
|
+
command
|
|
15
|
+
.description('Package, install, and manage Claude Code skills')
|
|
16
|
+
.helpCommand(false)
|
|
17
|
+
.addHelpText('after', `
|
|
18
|
+
Examples:
|
|
19
|
+
$ vat skills validate # Validate all skills
|
|
20
|
+
$ vat skills build # Build skills from package.json
|
|
21
|
+
$ vat skills package resources/skills/SKILL.md # Package a skill
|
|
22
|
+
$ vat skills install ./my-skill.zip # Install from ZIP
|
|
23
|
+
$ vat skills list # List installed skills
|
|
24
|
+
|
|
25
|
+
Distribution Workflow:
|
|
26
|
+
1. Validate: Ensure SKILL.md is valid
|
|
27
|
+
2. Build: Build skills into dist/ (for npm packages)
|
|
28
|
+
3. Package: Create distributable ZIP from SKILL.md
|
|
29
|
+
4. Share: Distribute via npm or GitHub releases
|
|
30
|
+
5. Install: Users install from npm or extract ZIP to ~/.claude/plugins/
|
|
31
|
+
|
|
32
|
+
For detailed command help:
|
|
33
|
+
$ vat skills validate --help
|
|
34
|
+
$ vat skills build --help
|
|
35
|
+
$ vat skills package --help
|
|
36
|
+
$ vat skills install --help
|
|
37
|
+
$ vat skills list --help
|
|
38
|
+
`);
|
|
39
|
+
// Add subcommands
|
|
40
|
+
command.addCommand(createValidateCommand());
|
|
41
|
+
command.addCommand(createBuildCommand());
|
|
42
|
+
command.addCommand(createPackageCommand());
|
|
43
|
+
command.addCommand(createInstallCommand());
|
|
44
|
+
command.addCommand(createListCommand());
|
|
45
|
+
return command;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create list command
|
|
49
|
+
*/
|
|
50
|
+
function createListCommand() {
|
|
51
|
+
const listCmd = new Command('list');
|
|
52
|
+
listCmd
|
|
53
|
+
.description('List skills in project or user installation')
|
|
54
|
+
.argument('[path]', 'Path to list skills from (default: current directory)')
|
|
55
|
+
.option('-u, --user', 'List user-installed skills in ~/.claude')
|
|
56
|
+
.option('-v, --verbose', 'Show detailed information')
|
|
57
|
+
.option('--debug', 'Enable debug logging')
|
|
58
|
+
.action(listCommand)
|
|
59
|
+
.addHelpText('after', `
|
|
60
|
+
Description:
|
|
61
|
+
Lists all skills in the project (default) or user installation (--user flag).
|
|
62
|
+
Discovers SKILL.md files and reports validation status.
|
|
63
|
+
|
|
64
|
+
Supports three modes:
|
|
65
|
+
- Project mode (default): List skills in project with config boundaries
|
|
66
|
+
- User mode (--user): List skills in ~/.claude installation
|
|
67
|
+
- Path mode: List skills at specific path
|
|
68
|
+
|
|
69
|
+
Validation Status:
|
|
70
|
+
✅ valid: Filename is "SKILL.md" (uppercase)
|
|
71
|
+
⚠️ warning: Non-standard filename detected (skill.md, Skill.md, etc.)
|
|
72
|
+
|
|
73
|
+
Output:
|
|
74
|
+
YAML summary → stdout (for programmatic parsing)
|
|
75
|
+
Human-readable list → stderr (for human reading)
|
|
76
|
+
|
|
77
|
+
Output includes:
|
|
78
|
+
- status: success
|
|
79
|
+
- context: project/user
|
|
80
|
+
- skillsFound: number of skills discovered
|
|
81
|
+
- skills: array of skill objects with validation status
|
|
82
|
+
|
|
83
|
+
Exit Codes:
|
|
84
|
+
0 - List operation successful (warnings don't fail)
|
|
85
|
+
2 - System error (directory not found, config invalid, etc.)
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
$ vat skills list # List project skills (default)
|
|
89
|
+
$ vat skills list --user # List user-installed skills
|
|
90
|
+
$ vat skills list packages/ # List skills at specific path
|
|
91
|
+
$ vat skills list --verbose # Show full paths and warnings
|
|
92
|
+
`);
|
|
93
|
+
return listCmd;
|
|
94
|
+
}
|
|
95
|
+
// No verbose help for skills command yet - can be added later if needed
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/skills/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,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,iDAAiD,CAAC;SAC9D,WAAW,CAAC,KAAK,CAAC;SAClB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;CAqBL,CACI,CAAC;IAEJ,kBAAkB;IAClB,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO;SACJ,WAAW,CAAC,6CAA6C,CAAC;SAC1D,QAAQ,CAAC,QAAQ,EAAE,uDAAuD,CAAC;SAC3E,MAAM,CAAC,YAAY,EAAE,yCAAyC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;SACpD,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,WAAW,CAAC;SACnB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCL,CACI,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wEAAwE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for installing skills from various sources
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - npm packages (npm:@scope/package)
|
|
6
|
+
* - Local directories
|
|
7
|
+
* - ZIP files
|
|
8
|
+
* - npm postinstall hook
|
|
9
|
+
*/
|
|
10
|
+
import type { VatSkillMetadata } from '@vibe-agent-toolkit/agent-schema';
|
|
11
|
+
export type SkillSource = 'npm' | 'local' | 'zip' | 'npm-postinstall';
|
|
12
|
+
export interface PackageJsonVat {
|
|
13
|
+
version?: string;
|
|
14
|
+
type?: string;
|
|
15
|
+
skills?: VatSkillMetadata[];
|
|
16
|
+
}
|
|
17
|
+
export interface PackageJson {
|
|
18
|
+
name: string;
|
|
19
|
+
version: string;
|
|
20
|
+
vat?: PackageJsonVat;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect source type from user input
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectSource(input: string): SkillSource;
|
|
26
|
+
/**
|
|
27
|
+
* Read package.json and extract vat field
|
|
28
|
+
*/
|
|
29
|
+
export declare function readPackageJsonVatMetadata(dir: string): Promise<{
|
|
30
|
+
packageJson: PackageJson;
|
|
31
|
+
skills: VatSkillMetadata[];
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Download and extract npm package to temp directory
|
|
35
|
+
* Returns path to extracted package
|
|
36
|
+
*
|
|
37
|
+
* Uses npm pack to download, then tar npm package for cross-platform extraction
|
|
38
|
+
*/
|
|
39
|
+
export declare function downloadNpmPackage(packageName: string, tempDir: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Validate npm postinstall environment
|
|
42
|
+
* Returns true if running in global install context
|
|
43
|
+
*/
|
|
44
|
+
export declare function isGlobalNpmInstall(): boolean;
|
|
45
|
+
//# sourceMappingURL=install-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-helpers.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/install-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAqCvD;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC,CAwBnE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyC/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAQ5C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for installing skills from various sources
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - npm packages (npm:@scope/package)
|
|
6
|
+
* - Local directories
|
|
7
|
+
* - ZIP files
|
|
8
|
+
* - npm postinstall hook
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, statSync } from 'node:fs';
|
|
11
|
+
import { readFile } from 'node:fs/promises';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { safeExecSync } from '@vibe-agent-toolkit/utils';
|
|
14
|
+
import * as tar from 'tar';
|
|
15
|
+
/**
|
|
16
|
+
* Detect source type from user input
|
|
17
|
+
*/
|
|
18
|
+
export function detectSource(input) {
|
|
19
|
+
// Special flag for npm postinstall hook
|
|
20
|
+
if (input === '--npm-postinstall') {
|
|
21
|
+
return 'npm-postinstall';
|
|
22
|
+
}
|
|
23
|
+
// npm package with explicit prefix
|
|
24
|
+
if (input.startsWith('npm:')) {
|
|
25
|
+
return 'npm';
|
|
26
|
+
}
|
|
27
|
+
// ZIP file (explicit extension)
|
|
28
|
+
if (input.endsWith('.zip')) {
|
|
29
|
+
return 'zip';
|
|
30
|
+
}
|
|
31
|
+
// Check filesystem
|
|
32
|
+
const absolutePath = resolve(input);
|
|
33
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- User-provided CLI argument
|
|
34
|
+
if (existsSync(absolutePath)) {
|
|
35
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- User-provided CLI argument, validated above
|
|
36
|
+
const stat = statSync(absolutePath);
|
|
37
|
+
if (stat.isDirectory()) {
|
|
38
|
+
return 'local';
|
|
39
|
+
}
|
|
40
|
+
if (stat.isFile()) {
|
|
41
|
+
return 'zip';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`Cannot detect source type for: ${input}\n` +
|
|
45
|
+
`Expected: npm:package-name, /path/to/dir, /path/to/file.zip, or --npm-postinstall`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Read package.json and extract vat field
|
|
49
|
+
*/
|
|
50
|
+
export async function readPackageJsonVatMetadata(dir) {
|
|
51
|
+
const packageJsonPath = join(dir, 'package.json');
|
|
52
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Directory path validated by caller
|
|
53
|
+
if (!existsSync(packageJsonPath)) {
|
|
54
|
+
throw new Error(`package.json not found in: ${dir}`);
|
|
55
|
+
}
|
|
56
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Directory path validated by caller
|
|
57
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
58
|
+
const packageJson = JSON.parse(content);
|
|
59
|
+
if (!packageJson.vat?.skills || packageJson.vat.skills.length === 0) {
|
|
60
|
+
throw new Error(`No skills found in package.json vat.skills field.\n` +
|
|
61
|
+
`Package: ${packageJson.name}\n` +
|
|
62
|
+
`Expected vat.skills array with at least one skill.`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
packageJson,
|
|
66
|
+
skills: packageJson.vat.skills,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Download and extract npm package to temp directory
|
|
71
|
+
* Returns path to extracted package
|
|
72
|
+
*
|
|
73
|
+
* Uses npm pack to download, then tar npm package for cross-platform extraction
|
|
74
|
+
*/
|
|
75
|
+
export function downloadNpmPackage(packageName, tempDir) {
|
|
76
|
+
// Remove npm: prefix if present
|
|
77
|
+
const actualPackageName = packageName.startsWith('npm:')
|
|
78
|
+
? packageName.slice(4)
|
|
79
|
+
: packageName;
|
|
80
|
+
// Use npm pack to download package (creates .tgz in current dir)
|
|
81
|
+
const packOutput = safeExecSync('npm', ['pack', actualPackageName], {
|
|
82
|
+
cwd: tempDir,
|
|
83
|
+
encoding: 'utf-8',
|
|
84
|
+
});
|
|
85
|
+
if (!packOutput) {
|
|
86
|
+
throw new Error(`npm pack failed for package: ${actualPackageName}`);
|
|
87
|
+
}
|
|
88
|
+
// npm pack outputs the filename (e.g., "package-1.0.0.tgz")
|
|
89
|
+
const tarballName = packOutput.toString().trim();
|
|
90
|
+
const tarballPath = join(tempDir, tarballName);
|
|
91
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path is constructed from temp dir
|
|
92
|
+
if (!existsSync(tarballPath)) {
|
|
93
|
+
throw new Error(`npm pack succeeded but tarball not found: ${tarballPath}`);
|
|
94
|
+
}
|
|
95
|
+
// Extract tarball using tar npm package (cross-platform)
|
|
96
|
+
// Creates package/ subdirectory
|
|
97
|
+
tar.extract({
|
|
98
|
+
file: tarballPath,
|
|
99
|
+
cwd: tempDir,
|
|
100
|
+
sync: true,
|
|
101
|
+
});
|
|
102
|
+
const packageDir = join(tempDir, 'package');
|
|
103
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path is constructed from temp dir
|
|
104
|
+
if (!existsSync(packageDir)) {
|
|
105
|
+
throw new Error(`npm tarball extracted but package/ directory not found`);
|
|
106
|
+
}
|
|
107
|
+
return packageDir;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Validate npm postinstall environment
|
|
111
|
+
* Returns true if running in global install context
|
|
112
|
+
*/
|
|
113
|
+
export function isGlobalNpmInstall() {
|
|
114
|
+
// Check if npm_config_global is set (npm sets this during global installs)
|
|
115
|
+
const isGlobal = process.env['npm_config_global'] === 'true';
|
|
116
|
+
// Check if running as postinstall script
|
|
117
|
+
const isPostinstall = process.env['npm_lifecycle_event'] === 'postinstall';
|
|
118
|
+
return isGlobal && isPostinstall;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=install-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-helpers.js","sourceRoot":"","sources":["../../../src/commands/skills/install-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install a skill to Claude's plugins directory
|
|
3
|
+
*
|
|
4
|
+
* Supports installing from:
|
|
5
|
+
* - npm packages (npm:@scope/package)
|
|
6
|
+
* - Local ZIP file
|
|
7
|
+
* - Local directory
|
|
8
|
+
* - npm postinstall hook (--npm-postinstall)
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export interface SkillsInstallCommandOptions {
|
|
12
|
+
skillsDir?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
force?: boolean;
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
debug?: boolean;
|
|
17
|
+
npmPostinstall?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function createInstallCommand(): Command;
|
|
20
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAoD9C"}
|