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
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
Install skills from the world's largest marketplace and sync them to **42 AI agents** including Cursor, Claude Code, GitHub Copilot, Windsurf, Cline, Gemini CLI, Zed, and more — all with a single command.
|
|
9
9
|
|
|
10
|
-
**What's new in v1.1.
|
|
10
|
+
**What's new in v1.1.4:** 10 unique power-tools — conflict detection (`doctor --deep`), context budget planner (`budget`), skill diff, frozen installs, skill compose, testing framework, sandbox preview, watch mode, skill splitter, and benchmarking.
|
|
11
11
|
|
|
12
12
|
🌐 **Website:** [agentskills.in](https://agentskills.in)
|
|
13
13
|
|
|
@@ -21,19 +21,24 @@ skills install @anthropic/xlsx
|
|
|
21
21
|
## ✨ Features
|
|
22
22
|
|
|
23
23
|
- **175,000+ Skills** — Access the largest collection of AI agent skills
|
|
24
|
-
- **FZF Interactive Search** — Real-time search with keyboard navigation: `skills search -i`
|
|
25
24
|
- **42 AI Agents** — Cursor, Claude, Copilot, Windsurf, Cline, Gemini CLI, Zed, and 35+ more
|
|
26
|
-
- **
|
|
27
|
-
- **
|
|
25
|
+
- **FZF Interactive Search** — Real-time search with keyboard navigation: `skills search -i`
|
|
26
|
+
- **Conflict Detection** — Find contradictions and overlaps across skills: `skills doctor --deep`
|
|
27
|
+
- **Context Budget** — Smart token-aware skill selection for your project: `skills budget -b 8000`
|
|
28
|
+
- **Skill Diff** — Section-aware comparison of two skills: `skills diff A B`
|
|
29
|
+
- **Frozen Installs** — Deterministic lockfile-based installs (like `npm ci`): `skills frozen`
|
|
30
|
+
- **Skill Compose** — Merge, chain, or conditionally combine skills: `skills compose A B -o C`
|
|
31
|
+
- **Skill Testing** — 10 built-in quality assertions + custom tests: `skills test --all`
|
|
32
|
+
- **Sandbox Preview** — Quality + conflicts check before install: `skills sandbox @owner/repo`
|
|
33
|
+
- **Watch Mode** — Auto-sync skills to agents on file changes: `skills watch`
|
|
34
|
+
- **Skill Splitter** — Split large skills into focused sub-skills: `skills split my-skill`
|
|
35
|
+
- **Benchmarking** — Compare skill quality across your collection: `skills bench --all`
|
|
36
|
+
- **Private Git Repos** — GitLab, Bitbucket, SSH, self-hosted Git: `skills install git@host:team/repo`
|
|
37
|
+
- **npm Packages** — Install from npm registries: `skills install npm:@scope/package`
|
|
28
38
|
- **`.skillsrc` Config** — Enterprise config files for custom registries, tokens, and defaults
|
|
29
39
|
- **Quality Scoring** — 4-dimension skill scoring (0–100): `skills score`
|
|
30
|
-
- **Repo Auto-Index** — Submit entire repos to the marketplace: `skills submit-repo owner/repo`
|
|
31
|
-
- **Adapter Architecture** — Formal adapter pattern for clean multi-agent support
|
|
32
40
|
- **Lock File Tracking** — Track all installations in `~/.skills/skills.lock`
|
|
33
|
-
- **Git URL Support** — Install from GitHub, GitLab, or repos: `skills add owner/repo@skill`
|
|
34
41
|
- **Platform Targeting** — Install to specific platforms with `-t claude,cursor`
|
|
35
|
-
- **Update & Remove** — Full lifecycle: `skills update`, `skills check`, `skills remove`
|
|
36
|
-
- **Privacy-First Telemetry** — Anonymous usage tracking with opt-out
|
|
37
42
|
|
|
38
43
|
---
|
|
39
44
|
|
|
@@ -109,7 +114,21 @@ skills search python
|
|
|
109
114
|
| `skills remove` | Remove installed skills (interactive multi-select) |
|
|
110
115
|
| `skills score [path]` | Score skill quality (0–100, grades F–A) |
|
|
111
116
|
| `skills submit-repo <repo>` | Submit a GitHub repo for marketplace auto-indexing |
|
|
112
|
-
| `skills doctor` | Diagnose issues |
|
|
117
|
+
| `skills doctor` | Diagnose issues (`--deep` for conflict detection) |
|
|
118
|
+
|
|
119
|
+
### Power Tools (v1.1.4)
|
|
120
|
+
|
|
121
|
+
| Command | Description |
|
|
122
|
+
|---------|-------------|
|
|
123
|
+
| `skills budget -b <tokens>` | Smart context budget — load only relevant skills within limit |
|
|
124
|
+
| `skills diff <A> <B>` | Section-aware skill comparison |
|
|
125
|
+
| `skills compose <skills...>` | Merge/chain/conditional skill composition |
|
|
126
|
+
| `skills test [skills...]` | Run quality assertions against skills |
|
|
127
|
+
| `skills frozen` | Deterministic install from lockfile |
|
|
128
|
+
| `skills sandbox <source>` | Preview skill quality + conflicts before installing |
|
|
129
|
+
| `skills watch [dir]` | Auto-sync skills to agents on file changes |
|
|
130
|
+
| `skills split <skill>` | Split large skills into focused sub-skills |
|
|
131
|
+
| `skills bench [skills...]` | Benchmark and compare skill quality |
|
|
113
132
|
|
|
114
133
|
### Install Options
|
|
115
134
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/bench.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAwKpD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerBenchCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('bench [skills...]')
|
|
6
|
+
.description('Benchmark and compare skills by quality, size, and coverage')
|
|
7
|
+
.option('-a, --all', 'Benchmark all installed skills')
|
|
8
|
+
.option('--sort <field>', 'Sort by: quality, tokens, name (default: quality)', 'quality')
|
|
9
|
+
.option('--json', 'Output as JSON')
|
|
10
|
+
.option('--min-quality <score>', 'Filter skills below this quality score (0-100)', parseInt)
|
|
11
|
+
.action(async (skills, options) => {
|
|
12
|
+
try {
|
|
13
|
+
const { existsSync } = await import('fs');
|
|
14
|
+
const { readdir, readFile } = await import('fs/promises');
|
|
15
|
+
const { homedir } = await import('os');
|
|
16
|
+
const { join, basename } = await import('path');
|
|
17
|
+
const matter = (await import('gray-matter')).default;
|
|
18
|
+
const home = homedir();
|
|
19
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
20
|
+
let skillPaths = [];
|
|
21
|
+
if (options.all) {
|
|
22
|
+
if (existsSync(skillsDir)) {
|
|
23
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry.isDirectory() && existsSync(join(skillsDir, entry.name, 'SKILL.md'))) {
|
|
26
|
+
skillPaths.push(join(skillsDir, entry.name));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (skills.length > 0) {
|
|
32
|
+
for (const s of skills) {
|
|
33
|
+
if (existsSync(s))
|
|
34
|
+
skillPaths.push(s);
|
|
35
|
+
else if (existsSync(join(skillsDir, s)))
|
|
36
|
+
skillPaths.push(join(skillsDir, s));
|
|
37
|
+
else
|
|
38
|
+
console.error(chalk.red(` ✗ Skill not found: ${s}`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(chalk.yellow('\n No skills specified. Use --all or provide skill names.\n'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (skillPaths.length === 0) {
|
|
46
|
+
console.log(chalk.yellow('\n No skills found to benchmark.\n'));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const spinner = ora(`Benchmarking ${skillPaths.length} skill(s)...`).start();
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const sp of skillPaths) {
|
|
52
|
+
try {
|
|
53
|
+
const raw = await readFile(join(sp, 'SKILL.md'), 'utf-8');
|
|
54
|
+
const { data, content } = matter(raw);
|
|
55
|
+
const name = data.name || basename(sp);
|
|
56
|
+
const lines = content.split('\n').length;
|
|
57
|
+
const tokens = Math.ceil(raw.length / 4);
|
|
58
|
+
const sections = (content.match(/^#{2,4}\s+/gm) || []).length;
|
|
59
|
+
const codeBlocks = (content.match(/```[\s\S]*?```/g) || []).length;
|
|
60
|
+
const hasExamples = /example|sample|demo/i.test(content);
|
|
61
|
+
const hasInstructions = /^\s*[-*]\s+.+/m.test(content) || /^\s*\d+\.\s+.+/m.test(content);
|
|
62
|
+
// Quality score (0-100)
|
|
63
|
+
let quality = 0;
|
|
64
|
+
if (data.name)
|
|
65
|
+
quality += 10;
|
|
66
|
+
if (data.description && data.description.length > 10)
|
|
67
|
+
quality += 10;
|
|
68
|
+
if (sections >= 2)
|
|
69
|
+
quality += 15;
|
|
70
|
+
if (sections >= 5)
|
|
71
|
+
quality += 5;
|
|
72
|
+
if (codeBlocks >= 1)
|
|
73
|
+
quality += 15;
|
|
74
|
+
if (codeBlocks >= 3)
|
|
75
|
+
quality += 5;
|
|
76
|
+
if (hasExamples)
|
|
77
|
+
quality += 10;
|
|
78
|
+
if (hasInstructions)
|
|
79
|
+
quality += 10;
|
|
80
|
+
if (tokens >= 100 && tokens <= 10000)
|
|
81
|
+
quality += 10;
|
|
82
|
+
if (!/TODO|FIXME|PLACEHOLDER/i.test(content))
|
|
83
|
+
quality += 10;
|
|
84
|
+
results.push({
|
|
85
|
+
name,
|
|
86
|
+
path: sp,
|
|
87
|
+
tokens,
|
|
88
|
+
lines,
|
|
89
|
+
sections,
|
|
90
|
+
codeBlocks,
|
|
91
|
+
quality,
|
|
92
|
+
hasFrontmatter: !!data.name,
|
|
93
|
+
hasExamples,
|
|
94
|
+
hasInstructions,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Skip invalid skills
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
spinner.stop();
|
|
102
|
+
if (options.minQuality) {
|
|
103
|
+
const filtered = results.filter(r => r.quality >= options.minQuality);
|
|
104
|
+
if (filtered.length < results.length) {
|
|
105
|
+
console.log(chalk.gray(` Filtered: ${results.length - filtered.length} skills below quality threshold ${options.minQuality}\n`));
|
|
106
|
+
}
|
|
107
|
+
results.length = 0;
|
|
108
|
+
results.push(...filtered);
|
|
109
|
+
}
|
|
110
|
+
// Sort
|
|
111
|
+
switch (options.sort) {
|
|
112
|
+
case 'tokens':
|
|
113
|
+
results.sort((a, b) => b.tokens - a.tokens);
|
|
114
|
+
break;
|
|
115
|
+
case 'name':
|
|
116
|
+
results.sort((a, b) => a.name.localeCompare(b.name));
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
results.sort((a, b) => b.quality - a.quality);
|
|
120
|
+
}
|
|
121
|
+
if (options.json) {
|
|
122
|
+
console.log(JSON.stringify(results, null, 2));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
console.log(chalk.bold(`\n📈 Skill Benchmark Results\n`));
|
|
126
|
+
// Table header
|
|
127
|
+
const header = ` ${'Skill'.padEnd(25)} ${'Quality'.padEnd(10)} ${'Tokens'.padEnd(8)} ${'Sections'.padEnd(10)} ${'Code'.padEnd(6)} ${'Features'}`;
|
|
128
|
+
console.log(chalk.bold(header));
|
|
129
|
+
console.log(chalk.gray(' ' + '─'.repeat(85)));
|
|
130
|
+
for (const r of results) {
|
|
131
|
+
const qualityColor = r.quality >= 80 ? chalk.green : r.quality >= 60 ? chalk.yellow : chalk.red;
|
|
132
|
+
const qualityBar = qualityColor('█'.repeat(Math.round(r.quality / 10)) + '░'.repeat(10 - Math.round(r.quality / 10)));
|
|
133
|
+
const features = [];
|
|
134
|
+
if (r.hasFrontmatter)
|
|
135
|
+
features.push('📝');
|
|
136
|
+
if (r.hasExamples)
|
|
137
|
+
features.push('💡');
|
|
138
|
+
if (r.hasInstructions)
|
|
139
|
+
features.push('📋');
|
|
140
|
+
console.log(` ${chalk.bold(r.name.slice(0, 24).padEnd(25))} ${qualityBar} ${chalk.gray(String(r.tokens).padEnd(8))} ${chalk.gray(String(r.sections).padEnd(10))} ${chalk.gray(String(r.codeBlocks).padEnd(6))} ${features.join(' ')}`);
|
|
141
|
+
}
|
|
142
|
+
console.log('');
|
|
143
|
+
console.log(chalk.bold(' Summary:'));
|
|
144
|
+
const avgQuality = Math.round(results.reduce((s, r) => s + r.quality, 0) / results.length);
|
|
145
|
+
const totalTokens = results.reduce((s, r) => s + r.tokens, 0);
|
|
146
|
+
console.log(` Skills: ${results.length}`);
|
|
147
|
+
console.log(` Avg quality: ${avgQuality}%`);
|
|
148
|
+
console.log(` Total tokens: ${totalTokens}`);
|
|
149
|
+
console.log(` Legend: 📝 frontmatter 💡 examples 📋 instructions`);
|
|
150
|
+
console.log('');
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench.js","sourceRoot":"","sources":["../../../src/cli/commands/bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/compose.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAwEtD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function registerComposeCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('compose <skills...>')
|
|
6
|
+
.description('Compose multiple skills into a single super-skill')
|
|
7
|
+
.requiredOption('-o, --output <name>', 'Output skill name')
|
|
8
|
+
.option('-s, --strategy <strategy>', 'Merge strategy: merge, chain, conditional', 'merge')
|
|
9
|
+
.option('--no-dedup', 'Disable deduplication of similar bullets')
|
|
10
|
+
.option('--save <dir>', 'Save composed skill to directory')
|
|
11
|
+
.action(async (skills, options) => {
|
|
12
|
+
try {
|
|
13
|
+
const { existsSync } = await import('fs');
|
|
14
|
+
const { writeFile, mkdir } = await import('fs/promises');
|
|
15
|
+
const { homedir } = await import('os');
|
|
16
|
+
const { join } = await import('path');
|
|
17
|
+
const { composeSkills } = await import('../../core/composer.js');
|
|
18
|
+
const home = homedir();
|
|
19
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
20
|
+
// Resolve skill names to paths
|
|
21
|
+
const resolvedPaths = [];
|
|
22
|
+
for (const skill of skills) {
|
|
23
|
+
// Try global dir
|
|
24
|
+
const globalPath = join(skillsDir, skill);
|
|
25
|
+
if (existsSync(join(globalPath, 'SKILL.md'))) {
|
|
26
|
+
resolvedPaths.push(globalPath);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// Try project dir
|
|
30
|
+
const projectPath = join(process.cwd(), '.claude', 'skills', skill);
|
|
31
|
+
if (existsSync(join(projectPath, 'SKILL.md'))) {
|
|
32
|
+
resolvedPaths.push(projectPath);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Try as direct path
|
|
36
|
+
if (existsSync(skill) || existsSync(join(skill, 'SKILL.md'))) {
|
|
37
|
+
resolvedPaths.push(skill);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
console.error(chalk.red(` ✗ Skill not found: ${skill}`));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const spinner = ora(`Composing ${resolvedPaths.length} skills...`).start();
|
|
44
|
+
const result = await composeSkills({
|
|
45
|
+
skills: resolvedPaths,
|
|
46
|
+
output: options.output,
|
|
47
|
+
strategy: options.strategy,
|
|
48
|
+
dedup: options.dedup !== false,
|
|
49
|
+
});
|
|
50
|
+
spinner.succeed(`Composed "${chalk.bold(result.name)}"`);
|
|
51
|
+
console.log('');
|
|
52
|
+
console.log(` Source skills: ${result.sourceSkills.map(s => chalk.cyan(s)).join(', ')}`);
|
|
53
|
+
console.log(` Strategy: ${chalk.bold(options.strategy)}`);
|
|
54
|
+
console.log(` Token count: ${chalk.yellow(String(result.tokenCount))}`);
|
|
55
|
+
if (result.deduplicatedCount > 0) {
|
|
56
|
+
console.log(` Deduplicated: ${chalk.green(String(result.deduplicatedCount))} redundant lines removed`);
|
|
57
|
+
}
|
|
58
|
+
// Save if --save specified
|
|
59
|
+
const saveDir = options.save || join(skillsDir, result.name);
|
|
60
|
+
await mkdir(saveDir, { recursive: true });
|
|
61
|
+
await writeFile(join(saveDir, 'SKILL.md'), result.fullContent);
|
|
62
|
+
console.log(` Saved to: ${chalk.gray(join(saveDir, 'SKILL.md'))}`);
|
|
63
|
+
console.log('');
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/cli/commands/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAyHtD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { AGENTS } from '../agents.js';
|
|
4
|
+
export function registerContextCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command('budget')
|
|
7
|
+
.description('Smart context budget manager — load only the most relevant skills')
|
|
8
|
+
.requiredOption('-b, --budget <tokens>', 'Token budget (e.g. 8000)', parseInt)
|
|
9
|
+
.option('-f, --format <format>', 'Output format: text, xml, json', 'text')
|
|
10
|
+
.option('--min-relevance <score>', 'Minimum relevance score 0-100 (default: 10)', parseInt)
|
|
11
|
+
.option('-p, --project <dir>', 'Project directory to analyze (default: cwd)')
|
|
12
|
+
.option('--list-only', 'Only list skills with scores, do not output content')
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
try {
|
|
15
|
+
const { existsSync } = await import('fs');
|
|
16
|
+
const { readdir } = await import('fs/promises');
|
|
17
|
+
const { homedir } = await import('os');
|
|
18
|
+
const { join } = await import('path');
|
|
19
|
+
const { buildContextPlan, formatContextXML, formatContextJSON } = await import('../../core/context-budget.js');
|
|
20
|
+
const home = homedir();
|
|
21
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
22
|
+
// Also check agent skill dirs
|
|
23
|
+
const allSkillDirs = [];
|
|
24
|
+
// Global skills
|
|
25
|
+
if (existsSync(skillsDir)) {
|
|
26
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
if (entry.isDirectory()) {
|
|
29
|
+
const skillPath = join(skillsDir, entry.name, 'SKILL.md');
|
|
30
|
+
if (existsSync(skillPath)) {
|
|
31
|
+
allSkillDirs.push(join(skillsDir, entry.name));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Check each agent's project and global dirs
|
|
37
|
+
for (const [, config] of Object.entries(AGENTS)) {
|
|
38
|
+
for (const dir of [config.projectDir, config.globalDir]) {
|
|
39
|
+
if (existsSync(dir)) {
|
|
40
|
+
try {
|
|
41
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
if (entry.isDirectory()) {
|
|
44
|
+
const skillPath = join(dir, entry.name, 'SKILL.md');
|
|
45
|
+
if (existsSync(skillPath)) {
|
|
46
|
+
const fullPath = join(dir, entry.name);
|
|
47
|
+
if (!allSkillDirs.includes(fullPath)) {
|
|
48
|
+
allSkillDirs.push(fullPath);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch { }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (allSkillDirs.length === 0) {
|
|
59
|
+
console.log(chalk.yellow('\n No installed skills found. Install some first with `skills install`.\n'));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const spinner = ora(`Analyzing ${allSkillDirs.length} skills against project...`).start();
|
|
63
|
+
const plan = await buildContextPlan(allSkillDirs, {
|
|
64
|
+
budget: options.budget,
|
|
65
|
+
minRelevance: options.minRelevance || 10,
|
|
66
|
+
projectDir: options.project || process.cwd(),
|
|
67
|
+
format: options.format,
|
|
68
|
+
});
|
|
69
|
+
spinner.stop();
|
|
70
|
+
if (options.format === 'json') {
|
|
71
|
+
console.log(formatContextJSON(plan));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (options.format === 'xml') {
|
|
75
|
+
console.log(formatContextXML(plan));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Text output
|
|
79
|
+
console.log(chalk.bold(`\n📊 Context Budget Plan\n`));
|
|
80
|
+
console.log(chalk.gray(` Budget: ${options.budget} tokens`));
|
|
81
|
+
console.log(chalk.gray(` Skills found: ${allSkillDirs.length}`));
|
|
82
|
+
console.log('');
|
|
83
|
+
if (plan.loaded.length > 0) {
|
|
84
|
+
console.log(chalk.green.bold(` ✅ Loading ${plan.loaded.length} skill(s):`));
|
|
85
|
+
for (const skill of plan.loaded) {
|
|
86
|
+
const bar = relevanceBar(skill.relevance);
|
|
87
|
+
console.log(` ${bar} ${chalk.bold(skill.name)} ${chalk.gray(`(${skill.tokens} tokens, ${skill.relevance}% relevant)`)}`);
|
|
88
|
+
console.log(` ${chalk.gray(skill.reason)}`);
|
|
89
|
+
}
|
|
90
|
+
console.log('');
|
|
91
|
+
}
|
|
92
|
+
if (plan.skipped.length > 0) {
|
|
93
|
+
console.log(chalk.yellow(` ⏭️ Skipped ${plan.skipped.length} skill(s):`));
|
|
94
|
+
for (const skill of plan.skipped) {
|
|
95
|
+
console.log(` ${chalk.gray(`${skill.name} (${skill.tokens} tokens, ${skill.relevance}% — ${skill.reason})`)}`);
|
|
96
|
+
}
|
|
97
|
+
console.log('');
|
|
98
|
+
}
|
|
99
|
+
console.log(chalk.bold(' Summary:'));
|
|
100
|
+
console.log(` Used: ${chalk.cyan(String(plan.totalTokens))} / ${options.budget} tokens`);
|
|
101
|
+
console.log(` Remaining: ${chalk.green(String(plan.budgetRemaining))} tokens`);
|
|
102
|
+
console.log('');
|
|
103
|
+
if (!options.listOnly && plan.loaded.length > 0) {
|
|
104
|
+
console.log(chalk.gray(' Tip: Use --format xml to get agent-ready output.\n'));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function relevanceBar(score) {
|
|
114
|
+
const filled = Math.round(score / 5);
|
|
115
|
+
const empty = 20 - filled;
|
|
116
|
+
const color = score >= 70 ? chalk.green : score >= 40 ? chalk.yellow : chalk.red;
|
|
117
|
+
return color('█'.repeat(filled) + '░'.repeat(empty));
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA0GnD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export function registerDiffCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command('diff <skillA> <skillB>')
|
|
5
|
+
.description('Compare two skills side-by-side (installed or paths)')
|
|
6
|
+
.option('--json', 'Output as JSON')
|
|
7
|
+
.action(async (skillA, skillB, options) => {
|
|
8
|
+
try {
|
|
9
|
+
const { existsSync } = await import('fs');
|
|
10
|
+
const { readdir } = await import('fs/promises');
|
|
11
|
+
const { homedir } = await import('os');
|
|
12
|
+
const { join } = await import('path');
|
|
13
|
+
const { diffSkills } = await import('../../core/differ.js');
|
|
14
|
+
const home = homedir();
|
|
15
|
+
const skillsDir = join(home, '.antigravity', 'skills');
|
|
16
|
+
// Resolve skill paths (could be names or paths)
|
|
17
|
+
const resolveSkill = async (input) => {
|
|
18
|
+
// If it's a path that exists, use directly
|
|
19
|
+
if (existsSync(input))
|
|
20
|
+
return input;
|
|
21
|
+
if (existsSync(join(input, 'SKILL.md')))
|
|
22
|
+
return input;
|
|
23
|
+
// Try to find in global skills dir
|
|
24
|
+
const globalPath = join(skillsDir, input);
|
|
25
|
+
if (existsSync(join(globalPath, 'SKILL.md')))
|
|
26
|
+
return globalPath;
|
|
27
|
+
// Try project-level
|
|
28
|
+
const projectPath = join(process.cwd(), '.claude', 'skills', input);
|
|
29
|
+
if (existsSync(join(projectPath, 'SKILL.md')))
|
|
30
|
+
return projectPath;
|
|
31
|
+
throw new Error(`Skill "${input}" not found. Provide a name or path.`);
|
|
32
|
+
};
|
|
33
|
+
const pathA = await resolveSkill(skillA);
|
|
34
|
+
const pathB = await resolveSkill(skillB);
|
|
35
|
+
const result = await diffSkills(pathA, pathB);
|
|
36
|
+
if (options.json) {
|
|
37
|
+
console.log(JSON.stringify(result, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.bold(`\n📊 Skill Diff: ${chalk.cyan(result.skillA)} vs ${chalk.cyan(result.skillB)}\n`));
|
|
41
|
+
// Size comparison
|
|
42
|
+
console.log(chalk.gray(` ${result.skillA}: ${result.linesA} lines`));
|
|
43
|
+
console.log(chalk.gray(` ${result.skillB}: ${result.linesB} lines`));
|
|
44
|
+
const tokenSign = result.tokenDelta >= 0 ? '+' : '';
|
|
45
|
+
console.log(chalk.gray(` Token delta: ${tokenSign}${result.tokenDelta}`));
|
|
46
|
+
console.log('');
|
|
47
|
+
// Added sections
|
|
48
|
+
if (result.added.length > 0) {
|
|
49
|
+
console.log(chalk.green(` ➕ Added (only in ${result.skillB}):`));
|
|
50
|
+
for (const h of result.added) {
|
|
51
|
+
console.log(chalk.green(` + ${h}`));
|
|
52
|
+
}
|
|
53
|
+
console.log('');
|
|
54
|
+
}
|
|
55
|
+
// Removed sections
|
|
56
|
+
if (result.removed.length > 0) {
|
|
57
|
+
console.log(chalk.red(` ➖ Removed (only in ${result.skillA}):`));
|
|
58
|
+
for (const h of result.removed) {
|
|
59
|
+
console.log(chalk.red(` - ${h}`));
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
}
|
|
63
|
+
// Changed sections
|
|
64
|
+
if (result.changed.length > 0) {
|
|
65
|
+
console.log(chalk.yellow(` ✏️ Changed (${result.changed.length}):`));
|
|
66
|
+
for (const diff of result.changed) {
|
|
67
|
+
console.log(` ${chalk.bold(diff.heading)} ${chalk.gray(`(+${diff.linesAdded}/-${diff.linesRemoved} lines)`)}`);
|
|
68
|
+
if (diff.preview) {
|
|
69
|
+
for (const line of diff.preview.split('\n').slice(0, 4)) {
|
|
70
|
+
if (line.startsWith('+')) {
|
|
71
|
+
console.log(` ${chalk.green(line)}`);
|
|
72
|
+
}
|
|
73
|
+
else if (line.startsWith('-')) {
|
|
74
|
+
console.log(` ${chalk.red(line)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
console.log('');
|
|
80
|
+
}
|
|
81
|
+
// Unchanged sections
|
|
82
|
+
if (result.unchanged.length > 0) {
|
|
83
|
+
console.log(chalk.gray(` ✓ Unchanged: ${result.unchanged.join(', ')}`));
|
|
84
|
+
console.log('');
|
|
85
|
+
}
|
|
86
|
+
// Summary
|
|
87
|
+
const totalChanges = result.added.length + result.removed.length + result.changed.length;
|
|
88
|
+
if (totalChanges === 0) {
|
|
89
|
+
console.log(chalk.green(' Skills are identical.\n'));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(chalk.gray(` Total: ${totalChanges} differences found.\n`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error(chalk.red('Error:'), error.message || error);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frozen.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/frozen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAqIrD"}
|