@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.
Files changed (44) hide show
  1. package/dist/commands/audit.d.ts.map +1 -1
  2. package/dist/commands/audit.js +30 -10
  3. package/dist/commands/audit.js.map +1 -1
  4. package/dist/commands/resources/index.d.ts.map +1 -1
  5. package/dist/commands/resources/index.js +19 -4
  6. package/dist/commands/resources/index.js.map +1 -1
  7. package/dist/commands/resources/validate.d.ts +2 -0
  8. package/dist/commands/resources/validate.d.ts.map +1 -1
  9. package/dist/commands/resources/validate.js +6 -3
  10. package/dist/commands/resources/validate.js.map +1 -1
  11. package/dist/commands/skills/build.d.ts.map +1 -1
  12. package/dist/commands/skills/build.js +85 -37
  13. package/dist/commands/skills/build.js.map +1 -1
  14. package/dist/commands/skills/command-helpers.d.ts +17 -1
  15. package/dist/commands/skills/command-helpers.d.ts.map +1 -1
  16. package/dist/commands/skills/command-helpers.js +16 -0
  17. package/dist/commands/skills/command-helpers.js.map +1 -1
  18. package/dist/commands/skills/index.d.ts.map +1 -1
  19. package/dist/commands/skills/index.js +13 -8
  20. package/dist/commands/skills/index.js.map +1 -1
  21. package/dist/commands/skills/install-helpers.d.ts +7 -2
  22. package/dist/commands/skills/install-helpers.d.ts.map +1 -1
  23. package/dist/commands/skills/install-helpers.js +18 -2
  24. package/dist/commands/skills/install-helpers.js.map +1 -1
  25. package/dist/commands/skills/install.d.ts +2 -0
  26. package/dist/commands/skills/install.d.ts.map +1 -1
  27. package/dist/commands/skills/install.js +227 -56
  28. package/dist/commands/skills/install.js.map +1 -1
  29. package/dist/commands/skills/shared.d.ts +23 -0
  30. package/dist/commands/skills/shared.d.ts.map +1 -0
  31. package/dist/commands/skills/shared.js +33 -0
  32. package/dist/commands/skills/shared.js.map +1 -0
  33. package/dist/commands/skills/uninstall.d.ts +11 -0
  34. package/dist/commands/skills/uninstall.d.ts.map +1 -0
  35. package/dist/commands/skills/uninstall.js +142 -0
  36. package/dist/commands/skills/uninstall.js.map +1 -0
  37. package/dist/commands/skills/validate-command.d.ts.map +1 -1
  38. package/dist/commands/skills/validate-command.js +55 -42
  39. package/dist/commands/skills/validate-command.js.map +1 -1
  40. package/dist/commands/skills/validate.d.ts +6 -11
  41. package/dist/commands/skills/validate.d.ts.map +1 -1
  42. package/dist/commands/skills/validate.js +128 -212
  43. package/dist/commands/skills/validate.js.map +1 -1
  44. 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,CA0E/C"}
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 SKILL.md files (links, frontmatter, skill rules)')
10
- .argument('[path]', 'Path to validate (default: current directory)')
11
- .option('-u, --user', 'Validate user-installed skills in ~/.claude')
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 all SKILL.md files using both resource validation (markdown,
17
- links, frontmatter) and skill-specific validation (reserved words, XML
18
- tags, console compatibility). Reports all errors in a unified format.
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
- Supports three modes:
21
- - Project mode (default): Validate project skills with strict filename validation
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 Modes:
26
- Project mode (strict):
27
- - Respects vibe-agent-toolkit.config.yaml boundaries
28
- - Filename must be exactly "SKILL.md" (case-sensitive)
29
- - Errors on non-standard filenames (skill.md, Skill.md)
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
- User mode (permissive):
32
- - Scans ~/.claude/plugins and ~/.claude/skills
33
- - Filename warnings for non-standard names (not errors)
34
- - More tolerant for user-installed content
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 Checks:
37
- Resource validation:
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
- Skill-specific validation:
44
- - Reserved word checks (name field)
45
- - XML tag detection (name/description fields)
46
- - Console compatibility warnings
47
- - Frontmatter required fields (name, description)
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
- Filename validation:
50
- - Must be "SKILL.md" (uppercase)
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 SKILL.md files found
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 - Validation errors found (warnings don't fail)
67
- 2 - System error (file not found, config invalid, etc.)
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 # Project mode: validate all project skills
71
- $ vat skills validate --user # User mode: validate ~/.claude skills
72
- $ vat skills validate packages/ # Path mode: validate specific directory
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,2DAA2D,CAAC;SACxE,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,YAAY,EAAE,6CAA6C,CAAC;SACnE,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;SAC7C,MAAM,CAAC,eAAe,CAAC;SACvB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DL,CACI,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,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 - unified validation for SKILL.md files
2
+ * Skills validate command - validate skills for packaging
3
3
  *
4
- * Combines resource validation (markdown, links, frontmatter) with
5
- * skill-specific validation (reserved words, XML tags, console compatibility).
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
- user?: boolean;
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;;;;;;;;;;GAUG;AAoSH;;GAEG;AACH,UAAU,4BAA4B;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAkGf"}
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"}