agent-skills-cli 1.1.3 โ 1.1.4
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/README.md +29 -10
- package/dist/cli/commands/bench.d.ts +7 -0
- package/dist/cli/commands/bench.d.ts.map +1 -0
- package/dist/cli/commands/bench.js +158 -0
- package/dist/cli/commands/bench.js.map +1 -0
- package/dist/cli/commands/compose.d.ts +7 -0
- package/dist/cli/commands/compose.d.ts.map +1 -0
- package/dist/cli/commands/compose.js +71 -0
- package/dist/cli/commands/compose.js.map +1 -0
- package/dist/cli/commands/context.d.ts +7 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +119 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +101 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/frozen.d.ts +7 -0
- package/dist/cli/commands/frozen.d.ts.map +1 -0
- package/dist/cli/commands/frozen.js +133 -0
- package/dist/cli/commands/frozen.js.map +1 -0
- package/dist/cli/commands/sandbox.d.ts +7 -0
- package/dist/cli/commands/sandbox.d.ts.map +1 -0
- package/dist/cli/commands/sandbox.js +174 -0
- package/dist/cli/commands/sandbox.js.map +1 -0
- package/dist/cli/commands/split.d.ts +7 -0
- package/dist/cli/commands/split.d.ts.map +1 -0
- package/dist/cli/commands/split.js +80 -0
- package/dist/cli/commands/split.js.map +1 -0
- package/dist/cli/commands/test.d.ts +7 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +121 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/utils-commands.d.ts.map +1 -1
- package/dist/cli/commands/utils-commands.js +72 -4
- package/dist/cli/commands/utils-commands.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +7 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +85 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/composer.d.ts +41 -0
- package/dist/core/composer.d.ts.map +1 -0
- package/dist/core/composer.js +230 -0
- package/dist/core/composer.js.map +1 -0
- package/dist/core/conflict-detector.d.ts +55 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +339 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/context-budget.d.ts +63 -0
- package/dist/core/context-budget.d.ts.map +1 -0
- package/dist/core/context-budget.js +310 -0
- package/dist/core/context-budget.js.map +1 -0
- package/dist/core/differ.d.ts +42 -0
- package/dist/core/differ.d.ts.map +1 -0
- package/dist/core/differ.js +117 -0
- package/dist/core/differ.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/skill-tester.d.ts +54 -0
- package/dist/core/skill-tester.d.ts.map +1 -0
- package/dist/core/skill-tester.js +201 -0
- package/dist/core/skill-tester.js.map +1 -0
- package/dist/core/splitter.d.ts +36 -0
- package/dist/core/splitter.d.ts.map +1 -0
- package/dist/core/splitter.js +186 -0
- package/dist/core/splitter.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerFrozenCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('frozen')
|
|
6
|
+
.description('Install skills from the lockfile with pinned versions (like npm ci)')
|
|
7
|
+
.option('--verify', 'Only verify that installed skills match the lock file')
|
|
8
|
+
.option('--strict', 'Fail if any skill cannot be restored exactly')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
try {
|
|
11
|
+
const { existsSync } = await import('fs');
|
|
12
|
+
const { readFile, rm, mkdir, cp } = await import('fs/promises');
|
|
13
|
+
const { homedir } = await import('os');
|
|
14
|
+
const { join } = await import('path');
|
|
15
|
+
const { readLock } = await import('../../core/skill-lock.js');
|
|
16
|
+
const { exec } = await import('child_process');
|
|
17
|
+
const { promisify } = await import('util');
|
|
18
|
+
const execAsync = promisify(exec);
|
|
19
|
+
const lock = await readLock();
|
|
20
|
+
const skills = Object.values(lock.skills);
|
|
21
|
+
if (skills.length === 0) {
|
|
22
|
+
console.log(chalk.yellow('\n No skills in lockfile. Install skills first with `skills install`.\n'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log(chalk.bold(`\nโ๏ธ Frozen Install${options.verify ? ' (verify mode)' : ''}\n`));
|
|
26
|
+
console.log(chalk.gray(` Found ${skills.length} skill(s) in lockfile.\n`));
|
|
27
|
+
let passed = 0;
|
|
28
|
+
let failed = 0;
|
|
29
|
+
for (const entry of skills) {
|
|
30
|
+
const spinner = ora(`${options.verify ? 'Verifying' : 'Restoring'} ${entry.name}...`).start();
|
|
31
|
+
try {
|
|
32
|
+
if (options.verify) {
|
|
33
|
+
// Verify mode: check if skill exists and matches
|
|
34
|
+
const exists = existsSync(join(entry.canonicalPath, entry.name, 'SKILL.md'));
|
|
35
|
+
if (exists) {
|
|
36
|
+
spinner.succeed(`${entry.name} ${chalk.gray('โ verified')}`);
|
|
37
|
+
passed++;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
spinner.fail(`${entry.name} ${chalk.red('โ missing')}`);
|
|
41
|
+
failed++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Restore mode: reinstall from source
|
|
46
|
+
if (entry.sourceType === 'github' || entry.sourceType === 'private-git') {
|
|
47
|
+
const tmpDir = join(homedir(), '.antigravity', 'tmp', `frozen-${Date.now()}`);
|
|
48
|
+
await mkdir(tmpDir, { recursive: true });
|
|
49
|
+
let cloneCmd = `git clone --depth 1`;
|
|
50
|
+
if (entry.version) {
|
|
51
|
+
// Try to checkout specific commit
|
|
52
|
+
cloneCmd = `git clone`;
|
|
53
|
+
}
|
|
54
|
+
cloneCmd += ` ${entry.source} ${tmpDir}`;
|
|
55
|
+
try {
|
|
56
|
+
await execAsync(cloneCmd, { timeout: 30000 });
|
|
57
|
+
if (entry.version) {
|
|
58
|
+
try {
|
|
59
|
+
await execAsync(`git checkout ${entry.version}`, { cwd: tmpDir });
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Version might not be a valid ref, continue
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Copy to canonical path
|
|
66
|
+
const destDir = join(entry.canonicalPath, entry.name);
|
|
67
|
+
await mkdir(destDir, { recursive: true });
|
|
68
|
+
// Find SKILL.md in cloned repo
|
|
69
|
+
const skillMd = join(tmpDir, 'SKILL.md');
|
|
70
|
+
if (existsSync(skillMd)) {
|
|
71
|
+
await cp(tmpDir, destDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Look for skill subdirectory
|
|
75
|
+
const { readdir } = await import('fs/promises');
|
|
76
|
+
const entries = await readdir(tmpDir, { withFileTypes: true });
|
|
77
|
+
for (const e of entries) {
|
|
78
|
+
if (e.isDirectory() && existsSync(join(tmpDir, e.name, 'SKILL.md'))) {
|
|
79
|
+
await cp(join(tmpDir, e.name), destDir, { recursive: true });
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Cleanup
|
|
85
|
+
await rm(tmpDir, { recursive: true, force: true }).catch(() => { });
|
|
86
|
+
spinner.succeed(`${entry.name} ${chalk.gray(`restored from ${entry.sourceType}`)}`);
|
|
87
|
+
passed++;
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
await rm(tmpDir, { recursive: true, force: true }).catch(() => { });
|
|
91
|
+
throw err;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (entry.sourceType === 'local') {
|
|
95
|
+
// Local source โ just verify it still exists
|
|
96
|
+
if (existsSync(join(entry.source, 'SKILL.md'))) {
|
|
97
|
+
spinner.succeed(`${entry.name} ${chalk.gray('local source valid')}`);
|
|
98
|
+
passed++;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
spinner.fail(`${entry.name} ${chalk.red('local source missing')}`);
|
|
102
|
+
failed++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
spinner.info(`${entry.name} ${chalk.gray(`skipped (${entry.sourceType} source)`)}`);
|
|
107
|
+
passed++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
spinner.fail(`${entry.name} ${chalk.red(err.message || 'failed')}`);
|
|
113
|
+
failed++;
|
|
114
|
+
if (options.strict) {
|
|
115
|
+
console.log(chalk.red('\n Strict mode: aborting on first failure.\n'));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
console.log('');
|
|
121
|
+
console.log(chalk.bold(' Summary:'));
|
|
122
|
+
console.log(` ${chalk.green(`${passed} succeeded`)} / ${chalk.red(`${failed} failed`)} / ${skills.length} total`);
|
|
123
|
+
console.log('');
|
|
124
|
+
if (failed > 0)
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=frozen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frozen.js","sourceRoot":"","sources":["../../../src/cli/commands/frozen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox Preview Command
|
|
3
|
+
* Preview a skill's effects before installation: score, conflicts, token impact.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function registerSandboxCommand(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAmLtD"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerSandboxCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('sandbox <source>')
|
|
6
|
+
.description('Preview a skill before installing โ score, conflicts, and token impact')
|
|
7
|
+
.option('-f, --format <format>', 'Output format: text, json', 'text')
|
|
8
|
+
.action(async (source, options) => {
|
|
9
|
+
try {
|
|
10
|
+
const { existsSync } = await import('fs');
|
|
11
|
+
const { readdir, readFile, mkdtemp, rm } = await import('fs/promises');
|
|
12
|
+
const { homedir } = await import('os');
|
|
13
|
+
const { join, basename } = await import('path');
|
|
14
|
+
const { tmpdir } = await import('os');
|
|
15
|
+
console.log(chalk.bold(`\n๐งช Sandbox Preview: ${chalk.cyan(source)}\n`));
|
|
16
|
+
let skillPath = '';
|
|
17
|
+
let tempDir = '';
|
|
18
|
+
let isTemp = false;
|
|
19
|
+
// Resolve the source
|
|
20
|
+
if (existsSync(source) && existsSync(join(source, 'SKILL.md'))) {
|
|
21
|
+
skillPath = source;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Try to clone from GitHub
|
|
25
|
+
const spinner = ora('Fetching skill from remote...').start();
|
|
26
|
+
try {
|
|
27
|
+
const { exec } = await import('child_process');
|
|
28
|
+
const { promisify } = await import('util');
|
|
29
|
+
const execAsync = promisify(exec);
|
|
30
|
+
tempDir = await mkdtemp(join(tmpdir(), 'skills-sandbox-'));
|
|
31
|
+
isTemp = true;
|
|
32
|
+
let gitUrl = source;
|
|
33
|
+
if (!source.includes('://') && !source.startsWith('git@')) {
|
|
34
|
+
gitUrl = `https://github.com/${source.replace(/^@/, '')}`;
|
|
35
|
+
}
|
|
36
|
+
await execAsync(`git clone --depth 1 ${gitUrl} ${tempDir}`, { timeout: 30000 });
|
|
37
|
+
// Find SKILL.md
|
|
38
|
+
if (existsSync(join(tempDir, 'SKILL.md'))) {
|
|
39
|
+
skillPath = tempDir;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const entries = await readdir(tempDir, { withFileTypes: true });
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (entry.isDirectory() && existsSync(join(tempDir, entry.name, 'SKILL.md'))) {
|
|
45
|
+
skillPath = join(tempDir, entry.name);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
spinner.succeed('Fetched skill');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
spinner.fail('Could not fetch skill');
|
|
54
|
+
console.error(chalk.red(` ${err.message || err}`));
|
|
55
|
+
if (tempDir)
|
|
56
|
+
await rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!skillPath || !existsSync(join(skillPath, 'SKILL.md'))) {
|
|
61
|
+
console.error(chalk.red(' No SKILL.md found.\n'));
|
|
62
|
+
if (isTemp)
|
|
63
|
+
await rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Read the skill
|
|
67
|
+
const raw = await readFile(join(skillPath, 'SKILL.md'), 'utf-8');
|
|
68
|
+
let frontmatter = {};
|
|
69
|
+
try {
|
|
70
|
+
const matter = (await import('gray-matter')).default;
|
|
71
|
+
const parsed = matter(raw);
|
|
72
|
+
frontmatter = parsed.data;
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
const name = frontmatter.name || basename(skillPath);
|
|
76
|
+
const tokens = Math.ceil(raw.length / 4);
|
|
77
|
+
const lines = raw.split('\n').length;
|
|
78
|
+
const description = frontmatter.description || chalk.gray('(no description)');
|
|
79
|
+
// 1. Basic info
|
|
80
|
+
console.log(chalk.bold(' ๐ Skill Info'));
|
|
81
|
+
console.log(` Name: ${chalk.cyan(name)}`);
|
|
82
|
+
console.log(` Description: ${chalk.gray(description)}`);
|
|
83
|
+
console.log(` Tokens: ${chalk.yellow(String(tokens))}`);
|
|
84
|
+
console.log(` Lines: ${chalk.gray(String(lines))}`);
|
|
85
|
+
console.log('');
|
|
86
|
+
// 2. Quality scoring
|
|
87
|
+
const qualitySpinner = ora(' Running quality checks...').start();
|
|
88
|
+
try {
|
|
89
|
+
const { testSkill } = await import('../../core/skill-tester.js');
|
|
90
|
+
const testResult = await testSkill(skillPath);
|
|
91
|
+
qualitySpinner.stop();
|
|
92
|
+
console.log(chalk.bold(' ๐งช Quality Score'));
|
|
93
|
+
const passRate = testResult.passRate;
|
|
94
|
+
const grade = passRate >= 90 ? chalk.green('A') :
|
|
95
|
+
passRate >= 80 ? chalk.green('B') :
|
|
96
|
+
passRate >= 70 ? chalk.yellow('C') :
|
|
97
|
+
passRate >= 60 ? chalk.yellow('D') :
|
|
98
|
+
chalk.red('F');
|
|
99
|
+
console.log(` Grade: ${grade} (${passRate}%)`);
|
|
100
|
+
// Show failed checks
|
|
101
|
+
const failures = testResult.assertions.filter(a => !a.passed);
|
|
102
|
+
if (failures.length > 0) {
|
|
103
|
+
console.log(` Issues:`);
|
|
104
|
+
for (const f of failures) {
|
|
105
|
+
console.log(` ${chalk.red('โ')} ${f.name}: ${chalk.gray(f.message || '')}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.log('');
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
qualitySpinner.stop();
|
|
112
|
+
console.log(chalk.gray(' Quality check unavailable.\n'));
|
|
113
|
+
}
|
|
114
|
+
// 3. Conflict check against installed skills
|
|
115
|
+
const conflictSpinner = ora(' Checking for conflicts...').start();
|
|
116
|
+
try {
|
|
117
|
+
const home = homedir();
|
|
118
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
119
|
+
const existingPaths = [];
|
|
120
|
+
if (existsSync(skillsDir)) {
|
|
121
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (entry.isDirectory() && existsSync(join(skillsDir, entry.name, 'SKILL.md'))) {
|
|
124
|
+
existingPaths.push(join(skillsDir, entry.name));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (existingPaths.length > 0) {
|
|
129
|
+
const { detectConflicts } = await import('../../core/conflict-detector.js');
|
|
130
|
+
const result = await detectConflicts([...existingPaths, skillPath]);
|
|
131
|
+
conflictSpinner.stop();
|
|
132
|
+
console.log(chalk.bold(' โ๏ธ Conflict Analysis'));
|
|
133
|
+
if (result.conflicts.length === 0 && result.overlaps.length === 0) {
|
|
134
|
+
console.log(chalk.green(' โ No conflicts with installed skills.'));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (result.conflicts.length > 0) {
|
|
138
|
+
console.log(chalk.red(` ${result.conflicts.length} conflict(s) found:`));
|
|
139
|
+
for (const c of result.conflicts.slice(0, 3)) {
|
|
140
|
+
console.log(` ${chalk.red('โ')} ${c.description}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (result.overlaps.length > 0) {
|
|
144
|
+
console.log(chalk.yellow(` ${result.overlaps.length} overlap(s) found (~${result.summary.estimatedTokenWaste} wasted tokens)`));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
conflictSpinner.stop();
|
|
150
|
+
console.log(chalk.bold(' โ๏ธ Conflict Analysis'));
|
|
151
|
+
console.log(chalk.green(' โ No installed skills to conflict with.'));
|
|
152
|
+
}
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
conflictSpinner.stop();
|
|
157
|
+
console.log(chalk.gray(' Conflict check unavailable.\n'));
|
|
158
|
+
}
|
|
159
|
+
// 4. Verdict
|
|
160
|
+
console.log(chalk.bold(' ๐ Verdict'));
|
|
161
|
+
console.log(` This skill would consume ${chalk.yellow(`~${tokens} tokens`)} of your context budget.`);
|
|
162
|
+
console.log(chalk.gray(' Use `skills install` to proceed with installation.\n'));
|
|
163
|
+
// Cleanup
|
|
164
|
+
if (isTemp) {
|
|
165
|
+
await rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/cli/commands/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/split.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAoFpD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerSplitCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('split <skill>')
|
|
6
|
+
.description('Split a large skill into focused sub-skills by topic')
|
|
7
|
+
.option('-m, --min-sections <n>', 'Minimum sections per sub-skill (default: 2)', parseInt)
|
|
8
|
+
.option('--save <dir>', 'Save sub-skills to directory')
|
|
9
|
+
.option('--dry-run', 'Only preview the split, do not save')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.action(async (skill, options) => {
|
|
12
|
+
try {
|
|
13
|
+
const { existsSync } = await import('fs');
|
|
14
|
+
const { mkdir, writeFile } = await import('fs/promises');
|
|
15
|
+
const { homedir } = await import('os');
|
|
16
|
+
const { join } = await import('path');
|
|
17
|
+
const { splitSkill } = await import('../../core/splitter.js');
|
|
18
|
+
const home = homedir();
|
|
19
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
20
|
+
// Resolve skill path
|
|
21
|
+
let skillPath = skill;
|
|
22
|
+
if (!existsSync(skillPath) && !existsSync(join(skillPath, 'SKILL.md'))) {
|
|
23
|
+
// Try global
|
|
24
|
+
const globalPath = join(skillsDir, skill);
|
|
25
|
+
if (existsSync(join(globalPath, 'SKILL.md'))) {
|
|
26
|
+
skillPath = globalPath;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.error(chalk.red(` โ Skill not found: ${skill}\n`));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const spinner = ora('Analyzing skill for splitting...').start();
|
|
34
|
+
const result = await splitSkill(skillPath, options.minSections || 2);
|
|
35
|
+
spinner.stop();
|
|
36
|
+
if (options.json) {
|
|
37
|
+
console.log(JSON.stringify(result, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.bold(`\nโ๏ธ Skill Splitter: ${chalk.cyan(result.originalName)}\n`));
|
|
41
|
+
console.log(chalk.gray(` Original: ${result.originalTokens} tokens`));
|
|
42
|
+
console.log('');
|
|
43
|
+
if (!result.worthSplitting) {
|
|
44
|
+
console.log(chalk.yellow(` โ Not worth splitting: ${result.reason}\n`));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.green(` Can be split into ${result.skills.length} sub-skills:\n`));
|
|
48
|
+
for (const sub of result.skills) {
|
|
49
|
+
console.log(` ๐ฆ ${chalk.bold(sub.name)} ${chalk.gray(`(${sub.tokens} tokens)`)}`);
|
|
50
|
+
console.log(` Sections: ${sub.headings.join(', ')}`);
|
|
51
|
+
console.log('');
|
|
52
|
+
}
|
|
53
|
+
const totalTokens = result.skills.reduce((s, sk) => s + sk.tokens, 0);
|
|
54
|
+
const savings = result.originalTokens - totalTokens;
|
|
55
|
+
console.log(chalk.bold(' Summary:'));
|
|
56
|
+
console.log(` Original: ${chalk.yellow(String(result.originalTokens))} tokens`);
|
|
57
|
+
console.log(` After split: ${chalk.green(String(totalTokens))} tokens total`);
|
|
58
|
+
if (savings > 0) {
|
|
59
|
+
console.log(` Overhead: ${chalk.gray(`+${savings} tokens from frontmatter duplication`)}`);
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
// Save if not dry run
|
|
63
|
+
if (!options.dryRun && (options.save || !options.dryRun)) {
|
|
64
|
+
const saveDir = options.save || skillsDir;
|
|
65
|
+
for (const sub of result.skills) {
|
|
66
|
+
const subDir = join(saveDir, sub.name);
|
|
67
|
+
await mkdir(subDir, { recursive: true });
|
|
68
|
+
await writeFile(join(subDir, 'SKILL.md'), sub.fullContent);
|
|
69
|
+
console.log(` ${chalk.green('โ')} Saved ${chalk.bold(sub.name)} โ ${chalk.gray(join(subDir, 'SKILL.md'))}`);
|
|
70
|
+
}
|
|
71
|
+
console.log('');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.js","sourceRoot":"","sources":["../../../src/cli/commands/split.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA8HnD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerTestCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('test [skills...]')
|
|
6
|
+
.description('Run quality tests and assertions against skills')
|
|
7
|
+
.option('-a, --all', 'Test all installed skills')
|
|
8
|
+
.option('--json', 'Output results as JSON')
|
|
9
|
+
.option('-v, --verbose', 'Show all assertions (not just failures)')
|
|
10
|
+
.action(async (skills, options) => {
|
|
11
|
+
try {
|
|
12
|
+
const { existsSync } = await import('fs');
|
|
13
|
+
const { readdir } = await import('fs/promises');
|
|
14
|
+
const { homedir } = await import('os');
|
|
15
|
+
const { join } = await import('path');
|
|
16
|
+
const { testSkill, testSkills } = await import('../../core/skill-tester.js');
|
|
17
|
+
const home = homedir();
|
|
18
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
19
|
+
let skillPaths = [];
|
|
20
|
+
if (options.all) {
|
|
21
|
+
// Test all installed skills
|
|
22
|
+
if (existsSync(skillsDir)) {
|
|
23
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry.isDirectory()) {
|
|
26
|
+
skillPaths.push(join(skillsDir, entry.name));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (skills.length > 0) {
|
|
32
|
+
for (const skill of skills) {
|
|
33
|
+
// Try as path
|
|
34
|
+
if (existsSync(skill)) {
|
|
35
|
+
skillPaths.push(skill);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Try as name in global
|
|
39
|
+
const globalPath = join(skillsDir, skill);
|
|
40
|
+
if (existsSync(globalPath)) {
|
|
41
|
+
skillPaths.push(globalPath);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Try project dir
|
|
45
|
+
const projectPath = join(process.cwd(), '.claude', 'skills', skill);
|
|
46
|
+
if (existsSync(projectPath)) {
|
|
47
|
+
skillPaths.push(projectPath);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
console.error(chalk.red(` โ Skill not found: ${skill}`));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Try project-level skills
|
|
55
|
+
const projectSkills = join(process.cwd(), '.claude', 'skills');
|
|
56
|
+
if (existsSync(projectSkills)) {
|
|
57
|
+
const entries = await readdir(projectSkills, { withFileTypes: true });
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (entry.isDirectory()) {
|
|
60
|
+
skillPaths.push(join(projectSkills, entry.name));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (skillPaths.length === 0) {
|
|
65
|
+
console.log(chalk.yellow('\n No skills specified. Use --all or provide skill names.\n'));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (skillPaths.length === 0) {
|
|
70
|
+
console.log(chalk.yellow('\n No skills found to test.\n'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const spinner = ora(`Testing ${skillPaths.length} skill(s)...`).start();
|
|
74
|
+
const results = await testSkills(skillPaths);
|
|
75
|
+
spinner.stop();
|
|
76
|
+
if (options.json) {
|
|
77
|
+
console.log(JSON.stringify(results, null, 2));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log(chalk.bold(`\n๐งช Skill Test Results\n`));
|
|
81
|
+
let totalPassed = 0;
|
|
82
|
+
let totalFailed = 0;
|
|
83
|
+
for (const result of results) {
|
|
84
|
+
const icon = result.passed ? chalk.green('โ') : chalk.red('โ');
|
|
85
|
+
const rate = result.passRate >= 80
|
|
86
|
+
? chalk.green(`${result.passRate}%`)
|
|
87
|
+
: result.passRate >= 60
|
|
88
|
+
? chalk.yellow(`${result.passRate}%`)
|
|
89
|
+
: chalk.red(`${result.passRate}%`);
|
|
90
|
+
console.log(` ${icon} ${chalk.bold(result.skillName)} ${rate} ${chalk.gray(`(${result.duration}ms)`)}`);
|
|
91
|
+
if (options.verbose || !result.passed) {
|
|
92
|
+
for (const assertion of result.assertions) {
|
|
93
|
+
if (options.verbose || !assertion.passed) {
|
|
94
|
+
const aIcon = assertion.passed ? chalk.green(' โ') : chalk.red(' โ');
|
|
95
|
+
const msg = assertion.passed
|
|
96
|
+
? chalk.gray(assertion.name)
|
|
97
|
+
: `${chalk.red(assertion.name)}: ${chalk.gray(assertion.message || '')}`;
|
|
98
|
+
console.log(` ${aIcon} ${msg}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (result.passed)
|
|
103
|
+
totalPassed++;
|
|
104
|
+
else
|
|
105
|
+
totalFailed++;
|
|
106
|
+
}
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log(chalk.bold(' Summary:'));
|
|
109
|
+
console.log(` ${chalk.green(`${totalPassed} passed`)} / ${chalk.red(`${totalFailed} failed`)} / ${results.length} total`);
|
|
110
|
+
console.log('');
|
|
111
|
+
if (totalFailed > 0) {
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/cli/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/utils-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"utils-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/utils-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA4MrD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAgEpD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA+JrD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA+DnD"}
|