agent-skills-cli 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +35 -10
  2. package/dist/cli/commands/bench.d.ts +7 -0
  3. package/dist/cli/commands/bench.d.ts.map +1 -0
  4. package/dist/cli/commands/bench.js +158 -0
  5. package/dist/cli/commands/bench.js.map +1 -0
  6. package/dist/cli/commands/compose.d.ts +7 -0
  7. package/dist/cli/commands/compose.d.ts.map +1 -0
  8. package/dist/cli/commands/compose.js +71 -0
  9. package/dist/cli/commands/compose.js.map +1 -0
  10. package/dist/cli/commands/context.d.ts +7 -0
  11. package/dist/cli/commands/context.d.ts.map +1 -0
  12. package/dist/cli/commands/context.js +119 -0
  13. package/dist/cli/commands/context.js.map +1 -0
  14. package/dist/cli/commands/diff.d.ts +7 -0
  15. package/dist/cli/commands/diff.d.ts.map +1 -0
  16. package/dist/cli/commands/diff.js +101 -0
  17. package/dist/cli/commands/diff.js.map +1 -0
  18. package/dist/cli/commands/frozen.d.ts +7 -0
  19. package/dist/cli/commands/frozen.d.ts.map +1 -0
  20. package/dist/cli/commands/frozen.js +133 -0
  21. package/dist/cli/commands/frozen.js.map +1 -0
  22. package/dist/cli/commands/install.d.ts.map +1 -1
  23. package/dist/cli/commands/install.js +4 -1
  24. package/dist/cli/commands/install.js.map +1 -1
  25. package/dist/cli/commands/sandbox.d.ts +7 -0
  26. package/dist/cli/commands/sandbox.d.ts.map +1 -0
  27. package/dist/cli/commands/sandbox.js +174 -0
  28. package/dist/cli/commands/sandbox.js.map +1 -0
  29. package/dist/cli/commands/split.d.ts +7 -0
  30. package/dist/cli/commands/split.d.ts.map +1 -0
  31. package/dist/cli/commands/split.js +80 -0
  32. package/dist/cli/commands/split.js.map +1 -0
  33. package/dist/cli/commands/test.d.ts +7 -0
  34. package/dist/cli/commands/test.d.ts.map +1 -0
  35. package/dist/cli/commands/test.js +121 -0
  36. package/dist/cli/commands/test.js.map +1 -0
  37. package/dist/cli/commands/utils-commands.d.ts.map +1 -1
  38. package/dist/cli/commands/utils-commands.js +72 -4
  39. package/dist/cli/commands/utils-commands.js.map +1 -1
  40. package/dist/cli/commands/watch.d.ts +7 -0
  41. package/dist/cli/commands/watch.d.ts.map +1 -0
  42. package/dist/cli/commands/watch.js +85 -0
  43. package/dist/cli/commands/watch.js.map +1 -0
  44. package/dist/cli/index.js +20 -0
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/core/composer.d.ts +41 -0
  47. package/dist/core/composer.d.ts.map +1 -0
  48. package/dist/core/composer.js +230 -0
  49. package/dist/core/composer.js.map +1 -0
  50. package/dist/core/conflict-detector.d.ts +55 -0
  51. package/dist/core/conflict-detector.d.ts.map +1 -0
  52. package/dist/core/conflict-detector.js +339 -0
  53. package/dist/core/conflict-detector.js.map +1 -0
  54. package/dist/core/context-budget.d.ts +63 -0
  55. package/dist/core/context-budget.d.ts.map +1 -0
  56. package/dist/core/context-budget.js +310 -0
  57. package/dist/core/context-budget.js.map +1 -0
  58. package/dist/core/differ.d.ts +42 -0
  59. package/dist/core/differ.d.ts.map +1 -0
  60. package/dist/core/differ.js +117 -0
  61. package/dist/core/differ.js.map +1 -0
  62. package/dist/core/index.d.ts +12 -0
  63. package/dist/core/index.d.ts.map +1 -1
  64. package/dist/core/index.js +12 -0
  65. package/dist/core/index.js.map +1 -1
  66. package/dist/core/skill-tester.d.ts +54 -0
  67. package/dist/core/skill-tester.d.ts.map +1 -0
  68. package/dist/core/skill-tester.js +201 -0
  69. package/dist/core/skill-tester.js.map +1 -0
  70. package/dist/core/splitter.d.ts +36 -0
  71. package/dist/core/splitter.d.ts.map +1 -0
  72. package/dist/core/splitter.js +186 -0
  73. package/dist/core/splitter.js.map +1 -0
  74. 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.3:** Smart skill discovery (deep recursive search), interactive skill selection for multi-skill repos, and `@owner/repo` marketplace fallback to GitHub clone.
10
+ **What's new in v1.1.5:** Non-interactive bulk install use `-y` to install all skills from any repo without prompts: `skills install @ComposioHQ/awesome-claude-skills -a claude -y`
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
- - **Private Git Repos** — GitLab, Bitbucket, SSH, self-hosted Git with auto-auth: `skills install git@host:team/repo`
27
- - **npm Packages** — Install skills from npm registries: `skills install npm:@scope/package`
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
 
@@ -121,6 +140,11 @@ skills install @facebook/verify --all # Install to all 42 agents
121
140
  skills install pdf -g -a claude # Install globally (~/.claude/skills/)
122
141
  skills install -s verify -a cursor # Install by skill name
123
142
  skills add @facebook/verify -a cursor # 'add' is an alias for 'install'
143
+
144
+ # Bulk install all skills from a repo (no prompts)
145
+ skills install @ComposioHQ/awesome-claude-skills -a claude -y
146
+ skills install @github/awesome-copilot -a cursor,claude -y
147
+ skills install @owner/repo --all -y # All skills to all agents
124
148
  ```
125
149
 
126
150
  ### Git URL Install (`skills add`)
@@ -133,6 +157,7 @@ skills add https://gitlab.com/org/repo # GitLab
133
157
  skills add owner/repo --list # List skills in repo
134
158
  skills add owner/repo -s skill-name # Install specific skill
135
159
  skills add owner/repo -y -g # Non-interactive, global
160
+ skills add owner/repo -a claude -y # Install ALL skills to claude (no prompt)
136
161
  ```
137
162
 
138
163
  ### Private Git Repos
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Skill Benchmarking Command
3
+ * Compare skill effectiveness with metrics and quality scores.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerBenchCommand(program: Command): void;
7
+ //# sourceMappingURL=bench.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Compose Command
3
+ * Merge multiple skills into a single super-skill.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerComposeCommand(program: Command): void;
7
+ //# sourceMappingURL=compose.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Context Budget Command
3
+ * Select skills that fit within a token budget, ranked by project relevance.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerContextCommand(program: Command): void;
7
+ //# sourceMappingURL=context.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Skill Diff Command
3
+ * Compare two skills side-by-side.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerDiffCommand(program: Command): void;
7
+ //# sourceMappingURL=diff.d.ts.map
@@ -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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"}