agent-skills-cli 1.1.2 → 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.
Files changed (74) hide show
  1. package/README.md +29 -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 +60 -19
  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
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Skill Testing Framework
3
+ * Run static and dynamic assertions against skills.
4
+ *
5
+ * Test definitions can come from:
6
+ * 1. skill-test.yml in the skill directory
7
+ * 2. tests section in SKILL.md frontmatter
8
+ * 3. Built-in structural checks
9
+ */
10
+ import { readFile } from 'fs/promises';
11
+ import { existsSync } from 'fs';
12
+ import { join, basename } from 'path';
13
+ import matter from 'gray-matter';
14
+ // ── Built-in Tests ───────────────────────────────────────────────────────
15
+ function getBuiltinTests() {
16
+ return [
17
+ {
18
+ name: 'Has frontmatter name',
19
+ type: 'structure',
20
+ assertion: 'SKILL.md must have a name field in frontmatter',
21
+ check: (_content, data) => !!data.name && typeof data.name === 'string',
22
+ },
23
+ {
24
+ name: 'Has frontmatter description',
25
+ type: 'structure',
26
+ assertion: 'SKILL.md must have a description field in frontmatter',
27
+ check: (_content, data) => !!data.description && typeof data.description === 'string' && data.description.length > 10,
28
+ },
29
+ {
30
+ name: 'Has meaningful content',
31
+ type: 'content',
32
+ assertion: 'SKILL.md body should have at least 50 characters',
33
+ check: (content) => content.trim().length >= 50,
34
+ },
35
+ {
36
+ name: 'Has section headings',
37
+ type: 'structure',
38
+ assertion: 'SKILL.md should have at least one ## heading',
39
+ check: (content) => /^#{2,4}\s+.+/m.test(content),
40
+ },
41
+ {
42
+ name: 'Has "when to use" section',
43
+ type: 'content',
44
+ assertion: 'Should describe when the skill should be used',
45
+ check: (content) => /when\s+to\s+use|usage|use\s+cases?|scenarios?/i.test(content),
46
+ },
47
+ {
48
+ name: 'Has actionable instructions',
49
+ type: 'content',
50
+ assertion: 'Should contain numbered steps or bullet points',
51
+ check: (content) => /^\s*[-*]\s+.+/m.test(content) || /^\s*\d+\.\s+.+/m.test(content),
52
+ },
53
+ {
54
+ name: 'Has code examples',
55
+ type: 'content',
56
+ assertion: 'Should include at least one code block',
57
+ check: (content) => /```[\s\S]*?```/.test(content),
58
+ },
59
+ {
60
+ name: 'Description is concise',
61
+ type: 'quality',
62
+ assertion: 'Description should be under 200 characters',
63
+ check: (_content, data) => !data.description || data.description.length <= 200,
64
+ },
65
+ {
66
+ name: 'No placeholder content',
67
+ type: 'quality',
68
+ assertion: 'Should not contain TODO, FIXME, or placeholder text',
69
+ check: (content) => !/\b(TODO|FIXME|PLACEHOLDER|CHANGE\s+ME|INSERT\s+HERE)\b/i.test(content),
70
+ },
71
+ {
72
+ name: 'Reasonable length',
73
+ type: 'quality',
74
+ assertion: 'SKILL.md should be between 100 and 50,000 characters',
75
+ check: (content) => content.length >= 100 && content.length <= 50000,
76
+ },
77
+ ];
78
+ }
79
+ // ── Custom Test Parsing ──────────────────────────────────────────────────
80
+ /**
81
+ * Load custom tests from skill-test.yml if it exists.
82
+ */
83
+ async function loadCustomTests(skillDir) {
84
+ const testFile = join(skillDir, 'skill-test.yml');
85
+ if (!existsSync(testFile))
86
+ return [];
87
+ try {
88
+ const raw = await readFile(testFile, 'utf-8');
89
+ const { data } = matter(`---\n${raw}\n---`);
90
+ if (!data.tests || !Array.isArray(data.tests))
91
+ return [];
92
+ return data.tests.map((t) => ({
93
+ name: t.name || 'Custom test',
94
+ type: 'content',
95
+ assertion: t.assertion || t.name,
96
+ check: (content) => {
97
+ let pass = true;
98
+ if (t.expect_contains) {
99
+ for (const kw of t.expect_contains) {
100
+ if (!content.includes(kw))
101
+ pass = false;
102
+ }
103
+ }
104
+ if (t.expect_not_contains) {
105
+ for (const kw of t.expect_not_contains) {
106
+ if (content.includes(kw))
107
+ pass = false;
108
+ }
109
+ }
110
+ if (t.expect_min_length) {
111
+ if (content.length < t.expect_min_length)
112
+ pass = false;
113
+ }
114
+ if (t.expect_sections) {
115
+ for (const section of t.expect_sections) {
116
+ if (!new RegExp(`^#{2,4}\\s+${section}`, 'im').test(content))
117
+ pass = false;
118
+ }
119
+ }
120
+ return pass;
121
+ },
122
+ }));
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ }
128
+ // ── Main Entry ───────────────────────────────────────────────────────────
129
+ /**
130
+ * Run all tests against a skill.
131
+ *
132
+ * @param skillPath — path to skill directory or SKILL.md
133
+ */
134
+ export async function testSkill(skillPath) {
135
+ const start = Date.now();
136
+ const skillMd = skillPath.endsWith('SKILL.md') ? skillPath : join(skillPath, 'SKILL.md');
137
+ const skillDir = skillPath.endsWith('SKILL.md') ? join(skillPath, '..') : skillPath;
138
+ if (!existsSync(skillMd)) {
139
+ throw new Error(`SKILL.md not found at ${skillMd}`);
140
+ }
141
+ const raw = await readFile(skillMd, 'utf-8');
142
+ const { data, content } = matter(raw);
143
+ const name = data.name || basename(skillDir);
144
+ // Combine built-in + custom tests
145
+ const builtinTests = getBuiltinTests();
146
+ const customTests = await loadCustomTests(skillDir);
147
+ const allTests = [...builtinTests, ...customTests];
148
+ // Run tests
149
+ const assertions = [];
150
+ for (const test of allTests) {
151
+ try {
152
+ const passed = test.check(content, data);
153
+ assertions.push({
154
+ name: test.name,
155
+ passed,
156
+ type: test.type,
157
+ message: passed ? undefined : test.assertion,
158
+ });
159
+ }
160
+ catch (err) {
161
+ assertions.push({
162
+ name: test.name,
163
+ passed: false,
164
+ type: test.type,
165
+ message: `Error: ${err.message || err}`,
166
+ });
167
+ }
168
+ }
169
+ const passedCount = assertions.filter(a => a.passed).length;
170
+ return {
171
+ skillName: name,
172
+ skillPath: skillDir,
173
+ assertions,
174
+ passed: assertions.every(a => a.passed),
175
+ duration: Date.now() - start,
176
+ passRate: Math.round((passedCount / assertions.length) * 100),
177
+ };
178
+ }
179
+ /**
180
+ * Run tests against multiple skills.
181
+ */
182
+ export async function testSkills(skillPaths) {
183
+ const results = [];
184
+ for (const path of skillPaths) {
185
+ try {
186
+ results.push(await testSkill(path));
187
+ }
188
+ catch (err) {
189
+ results.push({
190
+ skillName: basename(path),
191
+ skillPath: path,
192
+ assertions: [{ name: 'Load skill', passed: false, type: 'structure', message: err.message }],
193
+ passed: false,
194
+ duration: 0,
195
+ passRate: 0,
196
+ });
197
+ }
198
+ }
199
+ return results;
200
+ }
201
+ //# sourceMappingURL=skill-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tester.js","sourceRoot":"","sources":["../../src/core/skill-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Skill Splitter Module
3
+ * Splits a monolithic skill into focused sub-skills based on topic sections.
4
+ */
5
+ export interface SplitSkill {
6
+ /** Suggested name for this sub-skill */
7
+ name: string;
8
+ /** Section heading(s) this came from */
9
+ headings: string[];
10
+ /** Content body */
11
+ body: string;
12
+ /** Full SKILL.md content with frontmatter */
13
+ fullContent: string;
14
+ /** Estimated token count */
15
+ tokens: number;
16
+ }
17
+ export interface SplitResult {
18
+ /** Original skill name */
19
+ originalName: string;
20
+ /** Original token count */
21
+ originalTokens: number;
22
+ /** Generated sub-skills */
23
+ skills: SplitSkill[];
24
+ /** Whether the split was meaningful */
25
+ worthSplitting: boolean;
26
+ /** Reason if not worth it */
27
+ reason?: string;
28
+ }
29
+ /**
30
+ * Split a skill into sub-skills based on topic clustering.
31
+ *
32
+ * @param skillPath — path to skill directory or SKILL.md
33
+ * @param minSections — minimum sections per sub-skill (default 2)
34
+ */
35
+ export declare function splitSkill(skillPath: string, minSections?: number): Promise<SplitResult>;
36
+ //# sourceMappingURL=splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/core/splitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,UAAU;IACvB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,uCAAuC;IACvC,cAAc,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAC5B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAU,GACxB,OAAO,CAAC,WAAW,CAAC,CAmEtB"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Skill Splitter Module
3
+ * Splits a monolithic skill into focused sub-skills based on topic sections.
4
+ */
5
+ import { readFile } from 'fs/promises';
6
+ import { existsSync } from 'fs';
7
+ import { join, basename } from 'path';
8
+ import matter from 'gray-matter';
9
+ // ── Main Entry ───────────────────────────────────────────────────────────
10
+ /**
11
+ * Split a skill into sub-skills based on topic clustering.
12
+ *
13
+ * @param skillPath — path to skill directory or SKILL.md
14
+ * @param minSections — minimum sections per sub-skill (default 2)
15
+ */
16
+ export async function splitSkill(skillPath, minSections = 2) {
17
+ const skillMd = skillPath.endsWith('SKILL.md') ? skillPath : join(skillPath, 'SKILL.md');
18
+ if (!existsSync(skillMd))
19
+ throw new Error(`SKILL.md not found at ${skillMd}`);
20
+ const raw = await readFile(skillMd, 'utf-8');
21
+ const { data, content } = matter(raw);
22
+ const name = data.name || basename(skillPath);
23
+ const originalTokens = Math.ceil(raw.length / 4);
24
+ // Parse into sections
25
+ const sections = parseSections(content);
26
+ // Not worth splitting if too few sections
27
+ if (sections.length < 3) {
28
+ return {
29
+ originalName: name,
30
+ originalTokens,
31
+ skills: [],
32
+ worthSplitting: false,
33
+ reason: `Only ${sections.length} section(s) found — too few to split meaningfully.`,
34
+ };
35
+ }
36
+ // Group sections by topic similarity
37
+ const groups = clusterSections(sections, minSections);
38
+ if (groups.length <= 1) {
39
+ return {
40
+ originalName: name,
41
+ originalTokens,
42
+ skills: [],
43
+ worthSplitting: false,
44
+ reason: 'All sections belong to a single coherent topic.',
45
+ };
46
+ }
47
+ // Build sub-skills
48
+ const subSkills = groups.map((group, i) => {
49
+ const subName = group.suggestedName || `${name}-part-${i + 1}`;
50
+ const headings = group.sections.map(s => s.heading);
51
+ const body = group.sections.map(s => `## ${s.heading}\n${s.content}`).join('\n\n');
52
+ const fullContent = [
53
+ '---',
54
+ `name: ${subName}`,
55
+ `description: "Split from ${name}: ${headings.slice(0, 2).join(', ')}"`,
56
+ `split_from: "${name}"`,
57
+ '---',
58
+ '',
59
+ body,
60
+ ].join('\n');
61
+ return {
62
+ name: subName,
63
+ headings,
64
+ body,
65
+ fullContent,
66
+ tokens: Math.ceil(fullContent.length / 4),
67
+ };
68
+ });
69
+ return {
70
+ originalName: name,
71
+ originalTokens,
72
+ skills: subSkills,
73
+ worthSplitting: true,
74
+ };
75
+ }
76
+ function parseSections(body) {
77
+ const lines = body.split('\n');
78
+ const sections = [];
79
+ let currentHeading = '';
80
+ let currentLevel = 0;
81
+ let currentLines = [];
82
+ for (const line of lines) {
83
+ const match = line.match(/^(#{2,4})\s+(.+)/);
84
+ if (match) {
85
+ if (currentHeading && currentLines.length > 0) {
86
+ const content = currentLines.join('\n');
87
+ sections.push({
88
+ heading: currentHeading,
89
+ level: currentLevel,
90
+ content,
91
+ keywords: extractKeywords(currentHeading + ' ' + content),
92
+ });
93
+ }
94
+ currentHeading = match[2].trim();
95
+ currentLevel = match[1].length;
96
+ currentLines = [];
97
+ }
98
+ else {
99
+ currentLines.push(line);
100
+ }
101
+ }
102
+ if (currentHeading && currentLines.length > 0) {
103
+ const content = currentLines.join('\n');
104
+ sections.push({
105
+ heading: currentHeading,
106
+ level: currentLevel,
107
+ content,
108
+ keywords: extractKeywords(currentHeading + ' ' + content),
109
+ });
110
+ }
111
+ return sections;
112
+ }
113
+ function clusterSections(sections, minPerGroup) {
114
+ // Topic categories for clustering
115
+ const topicGroups = {
116
+ 'setup': ['install', 'setup', 'getting started', 'prerequisites', 'requirements', 'configuration', 'config'],
117
+ 'coding-style': ['style', 'format', 'naming', 'conventions', 'lint', 'prettier', 'eslint', 'pattern'],
118
+ 'testing': ['test', 'spec', 'jest', 'vitest', 'mocha', 'assert', 'coverage', 'mock'],
119
+ 'architecture': ['architecture', 'structure', 'pattern', 'component', 'module', 'design', 'layer'],
120
+ 'deployment': ['deploy', 'build', 'ci', 'cd', 'docker', 'kubernetes', 'production', 'hosting'],
121
+ 'security': ['security', 'auth', 'token', 'password', 'encrypt', 'cors', 'xss', 'vulnerability'],
122
+ 'api': ['api', 'rest', 'graphql', 'endpoint', 'route', 'middleware', 'handler'],
123
+ 'database': ['database', 'sql', 'query', 'model', 'schema', 'migration', 'orm', 'prisma'],
124
+ 'documentation': ['doc', 'readme', 'changelog', 'comment', 'jsdoc', 'tsdoc'],
125
+ 'performance': ['performance', 'optimize', 'cache', 'lazy', 'bundle', 'minify', 'compress'],
126
+ };
127
+ // Assign each section to a topic
128
+ const assigned = new Map();
129
+ for (const section of sections) {
130
+ let bestTopic = 'other';
131
+ let bestScore = 0;
132
+ for (const [topic, keywords] of Object.entries(topicGroups)) {
133
+ const score = section.keywords.filter(kw => keywords.some(tk => kw.includes(tk) || tk.includes(kw))).length;
134
+ if (score > bestScore) {
135
+ bestScore = score;
136
+ bestTopic = topic;
137
+ }
138
+ }
139
+ if (!assigned.has(bestTopic))
140
+ assigned.set(bestTopic, []);
141
+ assigned.get(bestTopic).push(section);
142
+ }
143
+ // Filter groups that have enough sections
144
+ const groups = [];
145
+ const overflow = [];
146
+ for (const [topic, secs] of assigned) {
147
+ if (secs.length >= minPerGroup) {
148
+ groups.push({ sections: secs, suggestedName: topic });
149
+ }
150
+ else {
151
+ overflow.push(...secs);
152
+ }
153
+ }
154
+ // Add overflow sections to the closest group or create an "other" group
155
+ if (overflow.length > 0) {
156
+ if (overflow.length >= minPerGroup) {
157
+ groups.push({ sections: overflow, suggestedName: 'general' });
158
+ }
159
+ else if (groups.length > 0) {
160
+ // Add to the largest group
161
+ groups.sort((a, b) => b.sections.length - a.sections.length);
162
+ groups[0].sections.push(...overflow);
163
+ }
164
+ else {
165
+ // All sections are in overflow — not worth splitting
166
+ return [{ sections: overflow, suggestedName: 'general' }];
167
+ }
168
+ }
169
+ return groups;
170
+ }
171
+ // ── Helpers ──────────────────────────────────────────────────────────────
172
+ const STOP_WORDS = new Set([
173
+ 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
174
+ 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',
175
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'should',
176
+ 'could', 'may', 'might', 'shall', 'can', 'need', 'must',
177
+ 'use', 'using', 'used', 'make', 'sure', 'file', 'code',
178
+ ]);
179
+ function extractKeywords(text) {
180
+ return text
181
+ .toLowerCase()
182
+ .replace(/[^a-z0-9\s-]/g, ' ')
183
+ .split(/\s+/)
184
+ .filter(w => w.length >= 3 && !STOP_WORDS.has(w));
185
+ }
186
+ //# sourceMappingURL=splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/core/splitter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-skills-cli",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Universal CLI for Agent Skills - works with 42 AI agents including Cursor, Claude Code, GitHub Copilot, Windsurf, Cline, Zed, and more. Supports private Git repos, npm packages, and enterprise configurations.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",