@vibe-agent-toolkit/cli 0.1.11 → 0.1.13
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/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +30 -10
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +19 -4
- package/dist/commands/resources/index.js.map +1 -1
- package/dist/commands/resources/validate.d.ts +2 -0
- package/dist/commands/resources/validate.d.ts.map +1 -1
- package/dist/commands/resources/validate.js +6 -3
- package/dist/commands/resources/validate.js.map +1 -1
- package/dist/commands/skills/build.d.ts.map +1 -1
- package/dist/commands/skills/build.js +85 -37
- package/dist/commands/skills/build.js.map +1 -1
- package/dist/commands/skills/command-helpers.d.ts +17 -1
- package/dist/commands/skills/command-helpers.d.ts.map +1 -1
- package/dist/commands/skills/command-helpers.js +16 -0
- package/dist/commands/skills/command-helpers.js.map +1 -1
- package/dist/commands/skills/index.d.ts.map +1 -1
- package/dist/commands/skills/index.js +13 -8
- package/dist/commands/skills/index.js.map +1 -1
- package/dist/commands/skills/install-helpers.d.ts +7 -2
- package/dist/commands/skills/install-helpers.d.ts.map +1 -1
- package/dist/commands/skills/install-helpers.js +18 -2
- package/dist/commands/skills/install-helpers.js.map +1 -1
- package/dist/commands/skills/install.d.ts +2 -0
- package/dist/commands/skills/install.d.ts.map +1 -1
- package/dist/commands/skills/install.js +227 -56
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/skills/shared.d.ts +23 -0
- package/dist/commands/skills/shared.d.ts.map +1 -0
- package/dist/commands/skills/shared.js +33 -0
- package/dist/commands/skills/shared.js.map +1 -0
- package/dist/commands/skills/uninstall.d.ts +11 -0
- package/dist/commands/skills/uninstall.d.ts.map +1 -0
- package/dist/commands/skills/uninstall.js +142 -0
- package/dist/commands/skills/uninstall.js.map +1 -0
- package/dist/commands/skills/validate-command.d.ts.map +1 -1
- package/dist/commands/skills/validate-command.js +55 -42
- package/dist/commands/skills/validate-command.js.map +1 -1
- package/dist/commands/skills/validate.d.ts +6 -11
- package/dist/commands/skills/validate.d.ts.map +1 -1
- package/dist/commands/skills/validate.js +128 -212
- package/dist/commands/skills/validate.js.map +1 -1
- package/package.json +11 -11
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for skills commands
|
|
3
|
+
*/
|
|
4
|
+
import type { VatSkillMetadata } from '@vibe-agent-toolkit/agent-schema';
|
|
5
|
+
import type { createLogger } from '../../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Package.json with VAT skill metadata
|
|
8
|
+
*/
|
|
9
|
+
export interface PackageJson {
|
|
10
|
+
name?: string;
|
|
11
|
+
vat?: {
|
|
12
|
+
skills: VatSkillMetadata[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read and parse package.json from current directory
|
|
17
|
+
*/
|
|
18
|
+
export declare function readPackageJson(cwd: string): Promise<PackageJson>;
|
|
19
|
+
/**
|
|
20
|
+
* Validate skill source exists
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateSkillSource(skill: VatSkillMetadata, cwd: string, logger: ReturnType<typeof createLogger>): string;
|
|
23
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE;QACL,MAAM,EAAE,gBAAgB,EAAE,CAAC;KAC3B,CAAC;CACF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACrC,MAAM,CAWR"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for skills commands
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { readFile } from 'node:fs/promises';
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Read and parse package.json from current directory
|
|
9
|
+
*/
|
|
10
|
+
export async function readPackageJson(cwd) {
|
|
11
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
12
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Reading from validated current directory
|
|
13
|
+
if (!existsSync(packageJsonPath)) {
|
|
14
|
+
throw new Error(`package.json not found in current directory: ${cwd}`);
|
|
15
|
+
}
|
|
16
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Reading from validated current directory
|
|
17
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
18
|
+
return JSON.parse(content);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate skill source exists
|
|
22
|
+
*/
|
|
23
|
+
export function validateSkillSource(skill, cwd, logger) {
|
|
24
|
+
const sourcePath = resolve(cwd, skill.source);
|
|
25
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path resolved from package.json
|
|
26
|
+
if (!existsSync(sourcePath)) {
|
|
27
|
+
logger.error(`❌ Skill source not found: ${skill.source}`);
|
|
28
|
+
logger.error(` Expected path: ${sourcePath}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
return sourcePath;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/skills/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgB1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAElD,+GAA+G;IAC/G,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,+GAA+G;IAC/G,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAuB,EACvB,GAAW,EACX,MAAuC;IAEvC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE9C,sGAAsG;IACtG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,UAAU,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall skills from Claude's skills directory
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Single skill by name: vat skills uninstall <name>
|
|
6
|
+
* - All skills from package: vat skills uninstall --all
|
|
7
|
+
* - Dry-run preview: --dry-run
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function createUninstallCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,sBAAsB,IAAI,OAAO,CA2ChD"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall skills from Claude's skills directory
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Single skill by name: vat skills uninstall <name>
|
|
6
|
+
* - All skills from package: vat skills uninstall --all
|
|
7
|
+
* - Dry-run preview: --dry-run
|
|
8
|
+
*/
|
|
9
|
+
import { lstatSync } from 'node:fs';
|
|
10
|
+
import { rm } from 'node:fs/promises';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { Command } from 'commander';
|
|
13
|
+
import { getClaudeUserPaths } from '../../utils/claude-paths.js';
|
|
14
|
+
import { handleCommandError } from '../../utils/command-error.js';
|
|
15
|
+
import { createLogger } from '../../utils/logger.js';
|
|
16
|
+
import { readPackageJsonVatMetadata, writeYamlHeader } from './install-helpers.js';
|
|
17
|
+
export function createUninstallCommand() {
|
|
18
|
+
const command = new Command('uninstall');
|
|
19
|
+
command
|
|
20
|
+
.description('Uninstall skills from Claude Code skills directory')
|
|
21
|
+
.argument('[name]', 'Name of skill to uninstall')
|
|
22
|
+
.option('-s, --skills-dir <path>', 'Claude skills directory', getClaudeUserPaths().skillsDir)
|
|
23
|
+
.option('-a, --all', 'Uninstall all skills declared in package.json vat.skills[]', false)
|
|
24
|
+
.option('--dry-run', 'Preview uninstall without removing files', false)
|
|
25
|
+
.option('--debug', 'Enable debug logging')
|
|
26
|
+
.action(uninstallCommand)
|
|
27
|
+
.addHelpText('after', `
|
|
28
|
+
Description:
|
|
29
|
+
Removes installed skills from Claude Code's skills directory.
|
|
30
|
+
Detects and handles both symlinks (dev installs) and copied directories.
|
|
31
|
+
|
|
32
|
+
Single skill: vat skills uninstall my-skill
|
|
33
|
+
All from package: vat skills uninstall --all (reads package.json vat.skills[])
|
|
34
|
+
|
|
35
|
+
Output:
|
|
36
|
+
- status: success/error
|
|
37
|
+
- skillsRemoved: number of skills removed
|
|
38
|
+
- skills: array with name, path, wasSymlink for each
|
|
39
|
+
|
|
40
|
+
Exit Codes:
|
|
41
|
+
0 - Uninstall successful
|
|
42
|
+
1 - Skill not found or not installed
|
|
43
|
+
2 - System error
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
$ vat skills uninstall my-skill # Remove single skill
|
|
47
|
+
$ vat skills uninstall --all # Remove all package skills
|
|
48
|
+
$ vat skills uninstall --all --dry-run # Preview removal
|
|
49
|
+
`);
|
|
50
|
+
return command;
|
|
51
|
+
}
|
|
52
|
+
async function uninstallCommand(name, options) {
|
|
53
|
+
const logger = createLogger(options.debug ? { debug: true } : {});
|
|
54
|
+
const startTime = Date.now();
|
|
55
|
+
try {
|
|
56
|
+
// Determine which skills to uninstall
|
|
57
|
+
const skillNames = await resolveSkillNames(name, options, logger);
|
|
58
|
+
const skillsDir = options.skillsDir ?? getClaudeUserPaths().skillsDir;
|
|
59
|
+
const removed = [];
|
|
60
|
+
for (const skillName of skillNames) {
|
|
61
|
+
const result = await removeSkill(skillName, skillsDir, options.dryRun ?? false, logger);
|
|
62
|
+
if (result) {
|
|
63
|
+
removed.push(result);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (removed.length === 0) {
|
|
67
|
+
logger.error('No skills were removed');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const duration = Date.now() - startTime;
|
|
71
|
+
outputUninstallSuccess(removed, duration, logger, options.dryRun);
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
handleCommandError(error, logger, startTime, 'SkillsUninstall');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve skill names from argument or --all flag
|
|
80
|
+
*/
|
|
81
|
+
async function resolveSkillNames(name, options, logger) {
|
|
82
|
+
if (options.all) {
|
|
83
|
+
const cwd = process.cwd();
|
|
84
|
+
const { packageJson, skills } = await readPackageJsonVatMetadata(cwd);
|
|
85
|
+
logger.info(`📦 Uninstalling all skills from ${packageJson.name}`);
|
|
86
|
+
return skills.map(s => s.name);
|
|
87
|
+
}
|
|
88
|
+
if (!name) {
|
|
89
|
+
throw new Error('Skill name required. Usage:\n' +
|
|
90
|
+
' vat skills uninstall <name> # Remove single skill\n' +
|
|
91
|
+
' vat skills uninstall --all # Remove all from package.json');
|
|
92
|
+
}
|
|
93
|
+
return [name];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Remove a single skill from the skills directory
|
|
97
|
+
* Uses lstatSync to detect symlinks (doesn't follow them)
|
|
98
|
+
*/
|
|
99
|
+
async function removeSkill(name, skillsDir, dryRun, logger) {
|
|
100
|
+
const skillPath = join(skillsDir, name);
|
|
101
|
+
// Check if installed (lstatSync detects broken symlinks)
|
|
102
|
+
let wasSymlink = false;
|
|
103
|
+
try {
|
|
104
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Skills dir from config
|
|
105
|
+
const stat = lstatSync(skillPath);
|
|
106
|
+
wasSymlink = stat.isSymbolicLink();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
logger.error(` ⚠️ ${name}: not installed at ${skillPath}`);
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const typeLabel = wasSymlink ? 'symlink' : 'directory';
|
|
113
|
+
if (dryRun) {
|
|
114
|
+
logger.info(` Would remove ${typeLabel}: ${name} (${skillPath})`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
await rm(skillPath, { recursive: true, force: true });
|
|
118
|
+
logger.info(` Removed ${typeLabel}: ${name}`);
|
|
119
|
+
}
|
|
120
|
+
return { name, path: skillPath, wasSymlink };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Output success YAML for uninstall
|
|
124
|
+
*/
|
|
125
|
+
function outputUninstallSuccess(removed, duration, logger, dryRun) {
|
|
126
|
+
writeYamlHeader(dryRun);
|
|
127
|
+
process.stdout.write(`skillsRemoved: ${removed.length}\n`);
|
|
128
|
+
process.stdout.write(`skills:\n`);
|
|
129
|
+
for (const skill of removed) {
|
|
130
|
+
process.stdout.write(` - name: ${skill.name}\n`);
|
|
131
|
+
process.stdout.write(` path: ${skill.path}\n`);
|
|
132
|
+
process.stdout.write(` wasSymlink: ${skill.wasSymlink}\n`);
|
|
133
|
+
}
|
|
134
|
+
process.stdout.write(`duration: ${duration}ms\n`);
|
|
135
|
+
if (dryRun) {
|
|
136
|
+
logger.info(`\n✅ Dry-run: ${removed.length} skill(s) would be removed`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
logger.info(`\n✅ Removed ${removed.length} skill(s)`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/skills/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/validate-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/validate-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,IAAI,OAAO,CAuF/C"}
|
|
@@ -6,50 +6,63 @@ import { validateCommand } from './validate.js';
|
|
|
6
6
|
export function createValidateCommand() {
|
|
7
7
|
const command = new Command('validate');
|
|
8
8
|
command
|
|
9
|
-
.description('Validate
|
|
10
|
-
.argument('[path]', 'Path to
|
|
11
|
-
.option('
|
|
9
|
+
.description('Validate skills for packaging (reads vat.skills from package.json)')
|
|
10
|
+
.argument('[path]', 'Path to directory with package.json (default: current directory)')
|
|
11
|
+
.option('--skill <name>', 'Validate specific skill only')
|
|
12
|
+
.option('-v, --verbose', 'Show full details including excluded reference paths')
|
|
12
13
|
.option('-d, --debug', 'Enable debug logging')
|
|
13
14
|
.action(validateCommand)
|
|
14
15
|
.addHelpText('after', `
|
|
15
16
|
Description:
|
|
16
|
-
Validates
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
Validates skills declared in package.json vat.skills field using
|
|
18
|
+
enhanced packaging validation. Checks size/complexity, link depth,
|
|
19
|
+
navigation patterns, and applies validation overrides.
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- User mode (--user): Validate ~/.claude skills with permissive validation
|
|
23
|
-
- Path mode: Validate skills at specific path with strict validation
|
|
21
|
+
Reads skills from package.json vat.skills and runs validateSkillForPackaging()
|
|
22
|
+
for each skill. Supports validation overrides with expiration checking.
|
|
24
23
|
|
|
25
|
-
Validation
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
24
|
+
Validation Checks:
|
|
25
|
+
Required (non-overridable):
|
|
26
|
+
- Valid YAML frontmatter
|
|
27
|
+
- Skill has a name
|
|
28
|
+
- No reserved words (anthropic/claude)
|
|
29
|
+
- No broken internal links
|
|
30
|
+
- No circular references
|
|
31
|
+
- Links stay within package boundary
|
|
32
|
+
- No filename collisions
|
|
33
|
+
- Forward slashes in paths (not backslashes)
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
+
Best practices (overridable):
|
|
36
|
+
- SKILL.md ≤500 lines (recommended)
|
|
37
|
+
- Total skill size ≤2000 lines
|
|
38
|
+
- File count ≤6 files
|
|
39
|
+
- Reference depth ≤2 levels
|
|
40
|
+
- No links to navigation files (README.md, index.md)
|
|
41
|
+
- Description ≥50 characters
|
|
42
|
+
- Progressive disclosure pattern
|
|
35
43
|
|
|
36
|
-
Validation
|
|
37
|
-
|
|
38
|
-
- Internal file links (relative paths)
|
|
39
|
-
- Anchor links within files (#heading)
|
|
40
|
-
- Cross-file anchor links (file.md#heading)
|
|
41
|
-
- Frontmatter schema (if SKILL.md has frontmatter)
|
|
44
|
+
Validation Overrides:
|
|
45
|
+
Configure overrides in package.json vat.skills:
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
{
|
|
48
|
+
"vat": {
|
|
49
|
+
"skills": [{
|
|
50
|
+
"name": "my-skill",
|
|
51
|
+
"source": "./SKILL.md",
|
|
52
|
+
"path": "./dist/skills/my-skill",
|
|
53
|
+
"ignoreValidationErrors": {
|
|
54
|
+
"SKILL_LENGTH_EXCEEDS_RECOMMENDED": "Complex domain requires detailed examples",
|
|
55
|
+
"SKILL_TOO_MANY_FILES": {
|
|
56
|
+
"reason": "Migration in progress - will split skill",
|
|
57
|
+
"expires": "2026-06-01"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
48
63
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- Strict mode: error on skill.md, Skill.md
|
|
52
|
-
- Permissive mode: warning only
|
|
64
|
+
Non-overridable rules (required for correctness) cannot be ignored.
|
|
65
|
+
Expired overrides are reported as errors.
|
|
53
66
|
|
|
54
67
|
Output:
|
|
55
68
|
YAML summary → stdout (for programmatic parsing)
|
|
@@ -57,19 +70,19 @@ Output:
|
|
|
57
70
|
|
|
58
71
|
Output includes:
|
|
59
72
|
- status: success/error
|
|
60
|
-
- skillsValidated: number of
|
|
61
|
-
- results: per-skill validation details
|
|
73
|
+
- skillsValidated: number of skills validated
|
|
74
|
+
- results: per-skill validation details (activeErrors, ignoredErrors, expiredOverrides)
|
|
62
75
|
- durationSecs: validation time
|
|
63
76
|
|
|
64
77
|
Exit Codes:
|
|
65
|
-
0 - All validations passed
|
|
66
|
-
1 -
|
|
67
|
-
2 - System error (file not found, config
|
|
78
|
+
0 - All validations passed (or all errors ignored by valid overrides)
|
|
79
|
+
1 - Active validation errors found (or expired overrides)
|
|
80
|
+
2 - System error (file not found, invalid config, etc.)
|
|
68
81
|
|
|
69
82
|
Examples:
|
|
70
|
-
$ vat skills validate #
|
|
71
|
-
$ vat skills validate --
|
|
72
|
-
$ vat skills validate packages/
|
|
83
|
+
$ vat skills validate # Validate all skills in package.json
|
|
84
|
+
$ vat skills validate --skill my-skill # Validate specific skill only
|
|
85
|
+
$ vat skills validate packages/my-pkg/ # Validate skills in specific directory
|
|
73
86
|
`);
|
|
74
87
|
return command;
|
|
75
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-command.js","sourceRoot":"","sources":["../../../src/commands/skills/validate-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO;SACJ,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"validate-command.js","sourceRoot":"","sources":["../../../src/commands/skills/validate-command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO;SACJ,WAAW,CAAC,oEAAoE,CAAC;SACjF,QAAQ,CAAC,QAAQ,EAAE,kEAAkE,CAAC;SACtF,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,sDAAsD,CAAC;SAC/E,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;SAC7C,MAAM,CAAC,eAAe,CAAC;SACvB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEL,CACI,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Skills validate command -
|
|
2
|
+
* Skills validate command - validate skills for packaging
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Supports three modes:
|
|
8
|
-
* 1. Project context (default): Validate project skills with strict filename validation
|
|
9
|
-
* 2. User context (--user flag): Validate ~/.claude skills with permissive validation
|
|
10
|
-
* 3. Path context (explicit path): Validate skills at specific path
|
|
4
|
+
* Validates skills declared in package.json vat.skills using validateSkillForPackaging.
|
|
5
|
+
* Supports validation overrides and expiration checking.
|
|
11
6
|
*/
|
|
12
7
|
/**
|
|
13
8
|
* Skills validate command options
|
|
14
9
|
*/
|
|
15
|
-
interface SkillsValidateCommandOptions {
|
|
10
|
+
export interface SkillsValidateCommandOptions {
|
|
11
|
+
skill?: string;
|
|
16
12
|
debug?: boolean;
|
|
17
|
-
|
|
13
|
+
verbose?: boolean;
|
|
18
14
|
}
|
|
19
15
|
/**
|
|
20
16
|
* Skills validate command implementation
|
|
21
17
|
*/
|
|
22
18
|
export declare function validateCommand(pathArg: string | undefined, options: SkillsValidateCommandOptions): Promise<void>;
|
|
23
|
-
export {};
|
|
24
19
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/validate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6LD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|