@vibe-agent-toolkit/cli 0.1.9 ā 0.1.12
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 +57 -33
- 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 +13 -0
- package/dist/commands/skills/build.d.ts.map +1 -0
- package/dist/commands/skills/build.js +253 -0
- package/dist/commands/skills/build.js.map +1 -0
- package/dist/commands/skills/command-helpers.d.ts +46 -0
- package/dist/commands/skills/command-helpers.d.ts.map +1 -0
- package/dist/commands/skills/command-helpers.js +70 -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 +125 -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/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/validate-command.d.ts +6 -0
- package/dist/commands/skills/validate-command.d.ts.map +1 -0
- package/dist/commands/skills/validate-command.js +89 -0
- package/dist/commands/skills/validate-command.js.map +1 -0
- package/dist/commands/skills/validate.d.ts +19 -0
- package/dist/commands/skills/validate.d.ts.map +1 -0
- package/dist/commands/skills/validate.js +180 -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,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 (but not during npm link)
|
|
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,CAc5C"}
|
|
@@ -0,0 +1,125 @@
|
|
|
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 (but not during npm link)
|
|
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
|
+
// Check npm command to distinguish between:
|
|
119
|
+
// - npm install -g ā npm_command === 'install' ā Run postinstall ā
|
|
120
|
+
// - npm link ā npm_command === 'link' ā Skip postinstall ā
|
|
121
|
+
// This prevents npm link from corrupting npm's internal state
|
|
122
|
+
const isInstallCommand = process.env['npm_command'] === 'install';
|
|
123
|
+
return isGlobal && isPostinstall && isInstallCommand;
|
|
124
|
+
}
|
|
125
|
+
//# 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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
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 { existsSync } from 'node:fs';
|
|
11
|
+
import { cp, mkdir, mkdtemp, rm } from 'node:fs/promises';
|
|
12
|
+
import { basename, join, resolve } from 'node:path';
|
|
13
|
+
import { normalizedTmpdir } from '@vibe-agent-toolkit/utils';
|
|
14
|
+
import AdmZip from 'adm-zip';
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { getClaudeUserPaths } from '../../utils/claude-paths.js';
|
|
17
|
+
import { handleCommandError } from '../../utils/command-error.js';
|
|
18
|
+
import { createLogger } from '../../utils/logger.js';
|
|
19
|
+
import { detectSource, downloadNpmPackage, isGlobalNpmInstall, readPackageJsonVatMetadata, } from './install-helpers.js';
|
|
20
|
+
export function createInstallCommand() {
|
|
21
|
+
const command = new Command('install');
|
|
22
|
+
command
|
|
23
|
+
.description('Install a skill to Claude Code skills directory')
|
|
24
|
+
.argument('[source]', 'Source to install from (npm:package, ZIP file, or directory path)')
|
|
25
|
+
.option('-s, --skills-dir <path>', 'Claude skills directory', getClaudeUserPaths().skillsDir)
|
|
26
|
+
.option('-n, --name <name>', 'Custom name for installed skill (default: auto-detect from source)')
|
|
27
|
+
.option('-f, --force', 'Overwrite existing skill if present', false)
|
|
28
|
+
.option('--dry-run', 'Preview installation without creating files', false)
|
|
29
|
+
.option('--npm-postinstall', 'Run as npm postinstall hook (internal use)', false)
|
|
30
|
+
.option('--debug', 'Enable debug logging')
|
|
31
|
+
.action(installCommand)
|
|
32
|
+
.addHelpText('after', `
|
|
33
|
+
Description:
|
|
34
|
+
Installs a skill to Claude Code's skills directory from various sources.
|
|
35
|
+
|
|
36
|
+
Supported sources:
|
|
37
|
+
- npm package: npm:@scope/package-name
|
|
38
|
+
- Local ZIP file: ./path/to/skill.zip
|
|
39
|
+
- Local directory: ./path/to/skill-dir
|
|
40
|
+
- npm postinstall: --npm-postinstall (automatic during global install)
|
|
41
|
+
|
|
42
|
+
Default skills directory: ~/.claude/skills/
|
|
43
|
+
|
|
44
|
+
Output:
|
|
45
|
+
- status: success/error
|
|
46
|
+
- skillName: Name of installed skill
|
|
47
|
+
- installPath: Where the skill was installed
|
|
48
|
+
- source: Original source
|
|
49
|
+
- sourceType: npm/local/zip/npm-postinstall
|
|
50
|
+
|
|
51
|
+
Exit Codes:
|
|
52
|
+
0 - Installation successful
|
|
53
|
+
1 - Installation error (invalid source, skill exists, etc.)
|
|
54
|
+
2 - System error
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
$ vat skills install npm:@vibe-agent-toolkit/vat-development-agents
|
|
58
|
+
$ vat skills install ./cat-agents-skill.zip
|
|
59
|
+
$ vat skills install ./my-skill-dir --name custom-skill-name
|
|
60
|
+
$ vat skills install skill.zip --force
|
|
61
|
+
`);
|
|
62
|
+
return command;
|
|
63
|
+
}
|
|
64
|
+
async function installCommand(source, options) {
|
|
65
|
+
const logger = createLogger(options.debug ? { debug: true } : {});
|
|
66
|
+
const startTime = Date.now();
|
|
67
|
+
try {
|
|
68
|
+
// Handle --npm-postinstall flag
|
|
69
|
+
if (options.npmPostinstall) {
|
|
70
|
+
await handleNpmPostinstall(options, logger, startTime);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Regular install - source is required
|
|
74
|
+
if (!source) {
|
|
75
|
+
throw new Error('Source argument required. Use npm:package, ./dir, or ./file.zip');
|
|
76
|
+
}
|
|
77
|
+
// Detect source type
|
|
78
|
+
const sourceType = detectSource(source);
|
|
79
|
+
logger.debug(`Detected source type: ${sourceType}`);
|
|
80
|
+
// Route to appropriate handler
|
|
81
|
+
switch (sourceType) {
|
|
82
|
+
case 'npm': {
|
|
83
|
+
await handleNpmInstall(source, options, logger, startTime);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'local': {
|
|
87
|
+
await handleLocalInstall(source, options, logger, startTime);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case 'zip': {
|
|
91
|
+
await handleZipInstall(source, options, logger, startTime);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'npm-postinstall': {
|
|
95
|
+
// This case is handled by --npm-postinstall flag, not by source detection
|
|
96
|
+
throw new Error('npm-postinstall source type should be handled by --npm-postinstall flag');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
handleCommandError(error, logger, startTime, 'SkillsInstall');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handle npm package installation
|
|
106
|
+
*/
|
|
107
|
+
async function handleNpmInstall(source, options, logger, startTime) {
|
|
108
|
+
const packageName = source.startsWith('npm:') ? source.slice(4) : source;
|
|
109
|
+
logger.info(`š„ Installing skill from npm: ${packageName}`);
|
|
110
|
+
// Create temp directory
|
|
111
|
+
const tempDir = await mkdtemp(join(normalizedTmpdir(), 'vat-install-npm-'));
|
|
112
|
+
try {
|
|
113
|
+
// Download and extract npm package
|
|
114
|
+
logger.info(' Downloading package...');
|
|
115
|
+
const extractedPath = downloadNpmPackage(packageName, tempDir);
|
|
116
|
+
// Read vat metadata from package.json
|
|
117
|
+
const { skills } = await readPackageJsonVatMetadata(extractedPath);
|
|
118
|
+
if (skills.length === 0) {
|
|
119
|
+
throw new Error(`No skills found in package ${packageName}`);
|
|
120
|
+
}
|
|
121
|
+
// Install first skill (or specific skill if --name provided)
|
|
122
|
+
const skillToInstall = options.name
|
|
123
|
+
? skills.find(s => s.name === options.name)
|
|
124
|
+
: skills[0];
|
|
125
|
+
if (!skillToInstall) {
|
|
126
|
+
throw new Error(`Skill "${options.name ?? ''}" not found in package ${packageName}. ` +
|
|
127
|
+
`Available: ${skills.map(s => s.name).join(', ')}`);
|
|
128
|
+
}
|
|
129
|
+
// Determine skill path (from vat.skills metadata)
|
|
130
|
+
const skillPath = resolve(extractedPath, skillToInstall.path);
|
|
131
|
+
// Install skill
|
|
132
|
+
await installSkillFromPath(skillPath, skillToInstall.name, options, logger);
|
|
133
|
+
const duration = Date.now() - startTime;
|
|
134
|
+
outputSuccess(skillToInstall.name, join(options.skillsDir ?? getClaudeUserPaths().skillsDir, skillToInstall.name), `npm:${packageName}`, 'npm', duration, logger, options.dryRun);
|
|
135
|
+
process.exit(0);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
// Cleanup temp directory
|
|
139
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle local directory installation
|
|
144
|
+
*/
|
|
145
|
+
async function handleLocalInstall(source, options, logger, startTime) {
|
|
146
|
+
const sourcePath = resolve(source);
|
|
147
|
+
logger.info(`š„ Installing skill from directory: ${sourcePath}`);
|
|
148
|
+
// Check if directory contains package.json with vat.skills
|
|
149
|
+
const packageJsonPath = join(sourcePath, 'package.json');
|
|
150
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- User-provided CLI argument
|
|
151
|
+
const hasPackageJson = existsSync(packageJsonPath);
|
|
152
|
+
let skillName;
|
|
153
|
+
let skillPath;
|
|
154
|
+
if (hasPackageJson) {
|
|
155
|
+
// Read vat metadata
|
|
156
|
+
const { skills } = await readPackageJsonVatMetadata(sourcePath);
|
|
157
|
+
const skillToInstall = options.name
|
|
158
|
+
? skills.find(s => s.name === options.name)
|
|
159
|
+
: skills[0];
|
|
160
|
+
if (!skillToInstall) {
|
|
161
|
+
throw new Error(`Skill "${options.name ?? ''}" not found in package. ` +
|
|
162
|
+
`Available: ${skills.map(s => s.name).join(', ')}`);
|
|
163
|
+
}
|
|
164
|
+
skillName = skillToInstall.name;
|
|
165
|
+
skillPath = resolve(sourcePath, skillToInstall.path);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Plain directory - use directory name
|
|
169
|
+
skillName = options.name ?? basename(sourcePath);
|
|
170
|
+
skillPath = sourcePath;
|
|
171
|
+
}
|
|
172
|
+
await installSkillFromPath(skillPath, skillName, options, logger);
|
|
173
|
+
const duration = Date.now() - startTime;
|
|
174
|
+
outputSuccess(skillName, join(options.skillsDir ?? getClaudeUserPaths().skillsDir, skillName), `local:${sourcePath}`, 'local', duration, logger, options.dryRun);
|
|
175
|
+
process.exit(0);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Handle ZIP file installation
|
|
179
|
+
*/
|
|
180
|
+
async function handleZipInstall(source, options, logger, startTime) {
|
|
181
|
+
const sourcePath = resolve(source);
|
|
182
|
+
logger.info(`š„ Installing skill from ZIP: ${sourcePath}`);
|
|
183
|
+
// Validate ZIP exists
|
|
184
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- User-provided CLI argument
|
|
185
|
+
if (!existsSync(sourcePath)) {
|
|
186
|
+
throw new Error(`ZIP file not found: ${sourcePath}`);
|
|
187
|
+
}
|
|
188
|
+
const skillName = options.name ?? basename(sourcePath, '.zip');
|
|
189
|
+
const { installPath } = await prepareInstallation(skillName, options);
|
|
190
|
+
if (!options.dryRun) {
|
|
191
|
+
// Extract ZIP
|
|
192
|
+
logger.info(' Extracting ZIP...');
|
|
193
|
+
const zip = new AdmZip(sourcePath);
|
|
194
|
+
// eslint-disable-next-line sonarjs/no-unsafe-unzip -- User-provided local files, isolated plugin directory
|
|
195
|
+
zip.extractAllTo(installPath, /* overwrite */ true);
|
|
196
|
+
}
|
|
197
|
+
const duration = Date.now() - startTime;
|
|
198
|
+
outputSuccess(skillName, installPath, sourcePath, 'zip', duration, logger, options.dryRun);
|
|
199
|
+
process.exit(0);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Handle npm postinstall hook
|
|
203
|
+
*/
|
|
204
|
+
async function handleNpmPostinstall(options, logger, startTime) {
|
|
205
|
+
logger.info(`š„ Running npm postinstall hook`);
|
|
206
|
+
// Check if this is a global install
|
|
207
|
+
if (!isGlobalNpmInstall()) {
|
|
208
|
+
logger.info(' Skipping: Not a global npm install');
|
|
209
|
+
process.exit(0);
|
|
210
|
+
}
|
|
211
|
+
// Read package.json from current directory
|
|
212
|
+
const cwd = process.cwd();
|
|
213
|
+
const { packageJson, skills } = await readPackageJsonVatMetadata(cwd);
|
|
214
|
+
logger.info(` Package: ${packageJson.name}@${packageJson.version}`);
|
|
215
|
+
logger.info(` Skills found: ${skills.length}`);
|
|
216
|
+
// Install all skills from package
|
|
217
|
+
for (const skill of skills) {
|
|
218
|
+
const skillPath = resolve(cwd, skill.path);
|
|
219
|
+
await installSkillFromPath(skillPath, skill.name, options, logger);
|
|
220
|
+
}
|
|
221
|
+
const duration = Date.now() - startTime;
|
|
222
|
+
logger.info(`ā
Installed ${skills.length} skill(s) from ${packageJson.name}`);
|
|
223
|
+
logger.info(` Duration: ${duration}ms`);
|
|
224
|
+
process.exit(0);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Prepare plugins directory and check for conflicts
|
|
228
|
+
* Returns the install path for the skill
|
|
229
|
+
*/
|
|
230
|
+
async function prepareInstallation(skillName, options) {
|
|
231
|
+
const skillsDir = options.skillsDir ?? getClaudeUserPaths().skillsDir;
|
|
232
|
+
const installPath = join(skillsDir, skillName);
|
|
233
|
+
// Check if skill already exists
|
|
234
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Constructed from validated paths
|
|
235
|
+
if (existsSync(installPath) && !options.force) {
|
|
236
|
+
throw new Error(`Skill already exists at ${installPath}. Use --force to overwrite.`);
|
|
237
|
+
}
|
|
238
|
+
if (!options.dryRun) {
|
|
239
|
+
// Create plugins directory
|
|
240
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Plugins directory path, safe
|
|
241
|
+
await mkdir(skillsDir, { recursive: true });
|
|
242
|
+
}
|
|
243
|
+
return { skillsDir, installPath };
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Install skill from a path to plugins directory
|
|
247
|
+
*/
|
|
248
|
+
async function installSkillFromPath(skillPath, skillName, options, logger) {
|
|
249
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Validated path
|
|
250
|
+
if (!existsSync(skillPath)) {
|
|
251
|
+
throw new Error(`Skill path not found: ${skillPath}`);
|
|
252
|
+
}
|
|
253
|
+
const { installPath } = await prepareInstallation(skillName, options);
|
|
254
|
+
if (!options.dryRun) {
|
|
255
|
+
// Copy skill to plugins directory
|
|
256
|
+
logger.info(` Installing ${skillName}...`);
|
|
257
|
+
await cp(skillPath, installPath, { recursive: true, force: true });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Output success YAML and human-readable messages
|
|
262
|
+
*/
|
|
263
|
+
function outputSuccess(skillName, installPath, source, sourceType, duration, logger, dryRun) {
|
|
264
|
+
// Output YAML to stdout
|
|
265
|
+
process.stdout.write('---\n');
|
|
266
|
+
process.stdout.write(`status: success\n`);
|
|
267
|
+
if (dryRun) {
|
|
268
|
+
process.stdout.write(`dryRun: true\n`);
|
|
269
|
+
}
|
|
270
|
+
process.stdout.write(`skillName: ${skillName}\n`);
|
|
271
|
+
process.stdout.write(`installPath: ${installPath}\n`);
|
|
272
|
+
process.stdout.write(`source: ${source}\n`);
|
|
273
|
+
process.stdout.write(`sourceType: ${sourceType}\n`);
|
|
274
|
+
process.stdout.write(`duration: ${duration}ms\n`);
|
|
275
|
+
if (dryRun) {
|
|
276
|
+
logger.info(`ā
Dry-run complete (no files created)`);
|
|
277
|
+
logger.info(` Skill: ${skillName}`);
|
|
278
|
+
logger.info(` Would install to: ${installPath}`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
logger.info(`ā
Installed skill: ${skillName}`);
|
|
282
|
+
logger.info(` Location: ${installPath}`);
|
|
283
|
+
logger.info(`\nš” Run 'vat skills list' to verify installation`);
|
|
284
|
+
logger.info(` Restart Claude Code or run /reload-skills to use the new skill`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/skills/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,GAE3B,MAAM,sBAAsB,CAAC;AAW9B,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC,OAAO;SACJ,WAAW,CAAC,iDAAiD,CAAC;SAC9D,QAAQ,CAAC,UAAU,EAAE,mEAAmE,CAAC;SACzF,MAAM,CACL,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAAE,CAAC,SAAS,CAC/B;SACA,MAAM,CAAC,mBAAmB,EAAE,oEAAoE,CAAC;SACjG,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,KAAK,CAAC;SACnE,MAAM,CAAC,WAAW,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACzE,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,EAAE,KAAK,CAAC;SAChF,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,cAAc,CAAC;SACtB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BL,CACI,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAA0B,EAC1B,OAAoC;IAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,gCAAgC;QAChC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QAEpD,+BAA+B;QAC/B,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7D,MAAM;YACR,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,0EAA0E;gBAC1E,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,OAAoC,EACpC,MAAuC,EACvC,SAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAEzE,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;IAE5D,wBAAwB;IACxB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE/D,sCAAsC;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CAAC,aAAa,CAAC,CAAC;QAEnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,6DAA6D;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI;YACjC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;YAC3C,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEd,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,UAAU,OAAO,CAAC,IAAI,IAAI,EAAE,0BAA0B,WAAW,IAAI;gBACnE,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9D,gBAAgB;QAChB,MAAM,oBAAoB,CACxB,SAAS,EACT,cAAc,CAAC,IAAI,EACnB,OAAO,EACP,MAAM,CACP,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,aAAa,CACX,cAAc,CAAC,IAAI,EACnB,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,EAC9E,OAAO,WAAW,EAAE,EACpB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,CAAC,MAAM,CACf,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,yBAAyB;QACzB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,OAAoC,EACpC,MAAuC,EACvC,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;IAEjE,2DAA2D;IAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACzD,iGAAiG;IACjG,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAEnD,IAAI,SAAiB,CAAC;IACtB,IAAI,SAAiB,CAAC;IAEtB,IAAI,cAAc,EAAE,CAAC;QACnB,oBAAoB;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAEhE,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI;YACjC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;YAC3C,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEd,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,UAAU,OAAO,CAAC,IAAI,IAAI,EAAE,0BAA0B;gBACpD,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;QACJ,CAAC;QAED,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QAChC,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,uCAAuC;QACvC,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjD,SAAS,GAAG,UAAU,CAAC;IACzB,CAAC;IAED,MAAM,oBAAoB,CACxB,SAAS,EACT,SAAS,EACT,OAAO,EACP,MAAM,CACP,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,aAAa,CACX,SAAS,EACT,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EACpE,SAAS,UAAU,EAAE,EACrB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,OAAoC,EACpC,MAAuC,EACvC,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;IAE3D,sBAAsB;IACtB,iGAAiG;IACjG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,cAAc;QACd,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,2GAA2G;QAC3G,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAAoC,EACpC,MAAuC,EACvC,SAAiB;IAEjB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE/C,oCAAoC;IACpC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2CAA2C;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAEtE,MAAM,CAAC,IAAI,CAAC,eAAe,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjD,kCAAkC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,oBAAoB,CACxB,SAAS,EACT,KAAK,CAAC,IAAI,EACV,OAAO,EACP,MAAM,CACP,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,kBAAkB,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC;IAE1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,mBAAmB,CAChC,SAAiB,EACjB,OAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC,SAAS,CAAC;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE/C,gCAAgC;IAChC,uGAAuG;IACvG,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,2BAA2B,WAAW,6BAA6B,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,2BAA2B;QAC3B,mGAAmG;QACnG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,SAAiB,EACjB,SAAiB,EACjB,OAAoC,EACpC,MAAuC;IAEvC,qFAAqF;IACrF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,kCAAkC;QAClC,MAAM,CAAC,IAAI,CAAC,iBAAiB,SAAS,KAAK,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,SAAiB,EACjB,WAAmB,EACnB,MAAc,EACd,UAAuB,EACvB,QAAgB,EAChB,MAAuC,EACvC,MAAgB;IAEhB,wBAAwB;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,UAAU,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,MAAM,CAAC,CAAC;IAElD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List skills in project or user installation
|
|
3
|
+
*
|
|
4
|
+
* By default, lists project skills. Use --user flag to list user-installed skills.
|
|
5
|
+
*/
|
|
6
|
+
export interface SkillsListCommandOptions {
|
|
7
|
+
user?: boolean;
|
|
8
|
+
verbose?: boolean;
|
|
9
|
+
debug?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function listCommand(pathArg: string | undefined, options: SkillsListCommandOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA6FD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|