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,310 @@
1
+ /**
2
+ * Context Budget Manager
3
+ * Ranks installed skills by relevance to the current project and selects
4
+ * the best combination that fits within a token budget.
5
+ *
6
+ * Relevance scoring (no LLM required):
7
+ * 1. File extension matching — project files vs. skill code languages
8
+ * 2. Dependency matching — package.json / requirements.txt keywords
9
+ * 3. Keyword density — skill keywords vs. project file names
10
+ * 4. Recency boost — recently installed skills get a small bump
11
+ */
12
+ import { readFile, readdir } from 'fs/promises';
13
+ import { existsSync } from 'fs';
14
+ import { join, extname, basename } from 'path';
15
+ import matter from 'gray-matter';
16
+ // ── Extension → Language Mapping ─────────────────────────────────────────
17
+ const EXT_TO_LANGUAGE = {
18
+ '.ts': ['typescript', 'ts', 'node', 'javascript'],
19
+ '.tsx': ['typescript', 'react', 'tsx', 'frontend'],
20
+ '.js': ['javascript', 'js', 'node'],
21
+ '.jsx': ['javascript', 'react', 'jsx', 'frontend'],
22
+ '.py': ['python', 'py', 'django', 'flask', 'fastapi'],
23
+ '.rs': ['rust', 'rs', 'cargo'],
24
+ '.go': ['go', 'golang'],
25
+ '.java': ['java', 'spring', 'maven', 'gradle'],
26
+ '.kt': ['kotlin', 'android'],
27
+ '.swift': ['swift', 'ios', 'swiftui'],
28
+ '.rb': ['ruby', 'rails', 'gems'],
29
+ '.php': ['php', 'laravel', 'wordpress'],
30
+ '.cs': ['csharp', 'dotnet', 'unity'],
31
+ '.cpp': ['cpp', 'c++'],
32
+ '.c': ['c', 'embedded'],
33
+ '.vue': ['vue', 'vuejs', 'frontend'],
34
+ '.svelte': ['svelte', 'sveltekit', 'frontend'],
35
+ '.astro': ['astro', 'frontend'],
36
+ '.sol': ['solidity', 'web3', 'ethereum'],
37
+ '.yml': ['devops', 'ci', 'config'],
38
+ '.yaml': ['devops', 'ci', 'config'],
39
+ '.tf': ['terraform', 'infrastructure', 'devops'],
40
+ '.dockerfile': ['docker', 'containers', 'devops'],
41
+ '.sql': ['sql', 'database', 'postgres', 'mysql'],
42
+ '.prisma': ['prisma', 'database', 'orm'],
43
+ '.graphql': ['graphql', 'api'],
44
+ '.proto': ['protobuf', 'grpc', 'api'],
45
+ '.md': ['documentation', 'markdown'],
46
+ '.css': ['css', 'styling', 'frontend'],
47
+ '.scss': ['sass', 'styling', 'frontend'],
48
+ };
49
+ // ── Main Entry ───────────────────────────────────────────────────────────
50
+ /**
51
+ * Build a context plan that fits installed skills into a token budget.
52
+ *
53
+ * @param skillPaths — array of absolute paths to skill directories
54
+ * @param options — budget + project analysis options
55
+ */
56
+ export async function buildContextPlan(skillPaths, options) {
57
+ const { budget, minRelevance = 10, projectDir = process.cwd() } = options;
58
+ // 1. Analyze project
59
+ const projectSignals = await analyzeProjectSignals(projectDir);
60
+ // 2. Score each skill
61
+ const scored = [];
62
+ for (const sp of skillPaths) {
63
+ const skill = await scoreSkillRelevance(sp, projectSignals);
64
+ if (skill)
65
+ scored.push(skill);
66
+ }
67
+ // 3. Sort by relevance (descending)
68
+ scored.sort((a, b) => b.relevance - a.relevance);
69
+ // 4. Greedy selection within budget
70
+ const loaded = [];
71
+ const skipped = [];
72
+ let usedTokens = 0;
73
+ for (const skill of scored) {
74
+ if (skill.relevance < minRelevance) {
75
+ skipped.push(skill);
76
+ continue;
77
+ }
78
+ if (usedTokens + skill.tokens <= budget) {
79
+ loaded.push(skill);
80
+ usedTokens += skill.tokens;
81
+ }
82
+ else {
83
+ skipped.push(skill);
84
+ }
85
+ }
86
+ return {
87
+ loaded,
88
+ skipped,
89
+ totalTokens: usedTokens,
90
+ budget,
91
+ budgetRemaining: budget - usedTokens,
92
+ };
93
+ }
94
+ /**
95
+ * Analyze the project directory to extract signals.
96
+ */
97
+ async function analyzeProjectSignals(projectDir) {
98
+ const languages = new Set();
99
+ const dependencies = new Set();
100
+ const fileKeywords = new Set();
101
+ // Scan file extensions (top 2 levels only)
102
+ try {
103
+ await scanExtensions(projectDir, languages, fileKeywords, 0, 2);
104
+ }
105
+ catch {
106
+ // Directory may not exist
107
+ }
108
+ // Read package.json if exists
109
+ const pkgPath = join(projectDir, 'package.json');
110
+ if (existsSync(pkgPath)) {
111
+ try {
112
+ const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
113
+ const allDeps = {
114
+ ...pkg.dependencies,
115
+ ...pkg.devDependencies,
116
+ };
117
+ for (const dep of Object.keys(allDeps || {})) {
118
+ dependencies.add(dep.replace(/^@/, '').replace(/\//g, '-').toLowerCase());
119
+ // Also add the base name
120
+ const lastPart = dep.split('/').pop();
121
+ if (lastPart)
122
+ dependencies.add(lastPart.toLowerCase());
123
+ }
124
+ // Also add scripts keywords
125
+ if (pkg.scripts) {
126
+ for (const script of Object.values(pkg.scripts)) {
127
+ const words = script.split(/\s+/).filter((w) => w.length > 3);
128
+ words.forEach((w) => fileKeywords.add(w.toLowerCase()));
129
+ }
130
+ }
131
+ }
132
+ catch {
133
+ // Invalid JSON
134
+ }
135
+ }
136
+ // Read requirements.txt if exists
137
+ const reqPath = join(projectDir, 'requirements.txt');
138
+ if (existsSync(reqPath)) {
139
+ try {
140
+ const content = await readFile(reqPath, 'utf-8');
141
+ for (const line of content.split('\n')) {
142
+ const pkg = line.trim().split(/[=<>!]/)[0].trim();
143
+ if (pkg && !pkg.startsWith('#')) {
144
+ dependencies.add(pkg.toLowerCase());
145
+ }
146
+ }
147
+ }
148
+ catch {
149
+ // Invalid file
150
+ }
151
+ }
152
+ // Read Cargo.toml if exists
153
+ const cargoPath = join(projectDir, 'Cargo.toml');
154
+ if (existsSync(cargoPath)) {
155
+ try {
156
+ const content = await readFile(cargoPath, 'utf-8');
157
+ const depMatches = content.matchAll(/^\s*(\w[\w-]*)\s*=/gm);
158
+ for (const match of depMatches) {
159
+ dependencies.add(match[1].toLowerCase());
160
+ }
161
+ }
162
+ catch { }
163
+ }
164
+ return {
165
+ languages: [...languages],
166
+ dependencies: [...dependencies],
167
+ fileKeywords: [...fileKeywords],
168
+ };
169
+ }
170
+ /**
171
+ * Recursively scan extensions in a directory.
172
+ */
173
+ async function scanExtensions(dir, languages, fileKeywords, depth, maxDepth) {
174
+ if (depth >= maxDepth)
175
+ return;
176
+ const entries = await readdir(dir, { withFileTypes: true });
177
+ for (const entry of entries) {
178
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
179
+ continue;
180
+ if (entry.isFile()) {
181
+ const ext = extname(entry.name).toLowerCase();
182
+ const langs = EXT_TO_LANGUAGE[ext];
183
+ if (langs)
184
+ langs.forEach(l => languages.add(l));
185
+ // Add filename without extension as keyword
186
+ const nameWithoutExt = basename(entry.name, ext).toLowerCase();
187
+ if (nameWithoutExt.length > 2)
188
+ fileKeywords.add(nameWithoutExt);
189
+ }
190
+ else if (entry.isDirectory()) {
191
+ fileKeywords.add(entry.name.toLowerCase());
192
+ await scanExtensions(join(dir, entry.name), languages, fileKeywords, depth + 1, maxDepth);
193
+ }
194
+ }
195
+ }
196
+ // ── Skill Scoring ────────────────────────────────────────────────────────
197
+ /**
198
+ * Score a single skill's relevance to the project.
199
+ */
200
+ async function scoreSkillRelevance(skillPath, signals) {
201
+ const skillMd = skillPath.endsWith('SKILL.md') ? skillPath : join(skillPath, 'SKILL.md');
202
+ if (!existsSync(skillMd))
203
+ return null;
204
+ try {
205
+ const raw = await readFile(skillMd, 'utf-8');
206
+ const { data, content } = matter(raw);
207
+ const name = data.name || basename(skillPath);
208
+ const tokens = Math.ceil(raw.length / 4);
209
+ // Extract skill keywords from body
210
+ const skillKeywords = extractSignificantWords(content);
211
+ const skillDescription = (data.description || '').toLowerCase();
212
+ // Score components
213
+ let score = 0;
214
+ const reasons = [];
215
+ // 1. Language match (0-40 points)
216
+ const langScore = matchScore(skillKeywords, signals.languages) * 40;
217
+ if (langScore > 0)
218
+ reasons.push(`lang match: ${Math.round(langScore)}pts`);
219
+ score += langScore;
220
+ // 2. Dependency match (0-30 points)
221
+ const depScore = matchScore(skillKeywords, signals.dependencies) * 30;
222
+ if (depScore > 0)
223
+ reasons.push(`dep match: ${Math.round(depScore)}pts`);
224
+ score += depScore;
225
+ // 3. File keyword match (0-20 points)
226
+ const fileScore = matchScore(skillKeywords, signals.fileKeywords) * 20;
227
+ if (fileScore > 0)
228
+ reasons.push(`file match: ${Math.round(fileScore)}pts`);
229
+ score += fileScore;
230
+ // 4. Description match against all signals (0-10 points)
231
+ const allSignals = [...signals.languages, ...signals.dependencies, ...signals.fileKeywords];
232
+ const descWords = skillDescription.split(/\s+/);
233
+ const descHits = descWords.filter((w) => allSignals.some((s) => s.includes(w) || w.includes(s))).length;
234
+ const descScore = Math.min(10, (descHits / Math.max(1, descWords.length)) * 30);
235
+ if (descScore > 0)
236
+ reasons.push(`desc match: ${Math.round(descScore)}pts`);
237
+ score += descScore;
238
+ // Clamp to 0-100
239
+ const relevance = Math.round(Math.min(100, Math.max(0, score)));
240
+ const reason = reasons.length > 0 ? reasons.join(', ') : 'no project match';
241
+ return { name, path: skillPath, tokens, relevance, reason, content: raw };
242
+ }
243
+ catch {
244
+ return null;
245
+ }
246
+ }
247
+ /**
248
+ * How well do skill keywords match project signals? Returns 0-1.
249
+ */
250
+ function matchScore(skillWords, signals) {
251
+ if (skillWords.length === 0 || signals.length === 0)
252
+ return 0;
253
+ let hits = 0;
254
+ const signalSet = new Set(signals);
255
+ for (const word of skillWords) {
256
+ if (signalSet.has(word))
257
+ hits++;
258
+ // Also check partial match (e.g. "react" matches "react-dom")
259
+ for (const sig of signals) {
260
+ if (sig.includes(word) || word.includes(sig)) {
261
+ hits += 0.5;
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ return Math.min(1, hits / Math.max(1, signals.length));
267
+ }
268
+ /**
269
+ * Extract significant words from text (no stop words, min length 3).
270
+ */
271
+ function extractSignificantWords(text) {
272
+ const stopWords = new Set([
273
+ 'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'had',
274
+ 'her', 'was', 'one', 'our', 'out', 'use', 'has', 'word', 'each', 'make',
275
+ 'like', 'just', 'over', 'such', 'take', 'than', 'them', 'would', 'other',
276
+ 'into', 'when', 'some', 'time', 'very', 'your', 'with', 'this', 'that',
277
+ 'from', 'they', 'been', 'have', 'will', 'should', 'using', 'skill',
278
+ ]);
279
+ return [...new Set(text.toLowerCase()
280
+ .replace(/[^a-z0-9\s-]/g, ' ')
281
+ .split(/\s+/)
282
+ .filter(w => w.length >= 3 && !stopWords.has(w)))];
283
+ }
284
+ // ── Output Formatters ────────────────────────────────────────────────────
285
+ /**
286
+ * Format the context plan as XML for agent consumption.
287
+ */
288
+ export function formatContextXML(plan) {
289
+ const lines = ['<skills>'];
290
+ for (const skill of plan.loaded) {
291
+ lines.push(` <skill name="${skill.name}" tokens="${skill.tokens}" relevance="${skill.relevance}">`);
292
+ lines.push(` ${skill.content}`);
293
+ lines.push(' </skill>');
294
+ }
295
+ lines.push('</skills>');
296
+ return lines.join('\n');
297
+ }
298
+ /**
299
+ * Format the context plan as JSON.
300
+ */
301
+ export function formatContextJSON(plan) {
302
+ return JSON.stringify({
303
+ loaded: plan.loaded.map(s => ({ name: s.name, tokens: s.tokens, relevance: s.relevance, reason: s.reason })),
304
+ skipped: plan.skipped.map(s => ({ name: s.name, tokens: s.tokens, relevance: s.relevance, reason: s.reason })),
305
+ totalTokens: plan.totalTokens,
306
+ budget: plan.budget,
307
+ budgetRemaining: plan.budgetRemaining,
308
+ }, null, 2);
309
+ }
310
+ //# sourceMappingURL=context-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget.js","sourceRoot":"","sources":["../../src/core/context-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Skill Differ Module
3
+ * Compare two skills side-by-side with section-aware diffing.
4
+ */
5
+ export interface SectionDiff {
6
+ /** Section heading */
7
+ heading: string;
8
+ /** Lines added in B */
9
+ linesAdded: number;
10
+ /** Lines removed from A */
11
+ linesRemoved: number;
12
+ /** Unified diff preview */
13
+ preview: string;
14
+ }
15
+ export interface DiffResult {
16
+ /** Skill A name */
17
+ skillA: string;
18
+ /** Skill B name */
19
+ skillB: string;
20
+ /** Sections only in B */
21
+ added: string[];
22
+ /** Sections only in A */
23
+ removed: string[];
24
+ /** Changed sections */
25
+ changed: SectionDiff[];
26
+ /** Unchanged sections */
27
+ unchanged: string[];
28
+ /** Token count difference (positive = B is larger) */
29
+ tokenDelta: number;
30
+ /** Total lines in A */
31
+ linesA: number;
32
+ /** Total lines in B */
33
+ linesB: number;
34
+ }
35
+ /**
36
+ * Compare two skills and produce a diff result.
37
+ *
38
+ * @param pathA — path to first skill directory or SKILL.md
39
+ * @param pathB — path to second skill directory or SKILL.md
40
+ */
41
+ export declare function diffSkills(pathA: string, pathB: string): Promise<DiffResult>;
42
+ //# sourceMappingURL=differ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../src/core/differ.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,WAAW;IACxB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yBAAyB;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uBAAuB;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yBAAyB;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAClB;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsElF"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Skill Differ Module
3
+ * Compare two skills side-by-side with section-aware diffing.
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
+ * Compare two skills and produce a diff result.
12
+ *
13
+ * @param pathA — path to first skill directory or SKILL.md
14
+ * @param pathB — path to second skill directory or SKILL.md
15
+ */
16
+ export async function diffSkills(pathA, pathB) {
17
+ const skillA = await loadSkillForDiff(pathA);
18
+ const skillB = await loadSkillForDiff(pathB);
19
+ if (!skillA)
20
+ throw new Error(`Cannot load skill at ${pathA}`);
21
+ if (!skillB)
22
+ throw new Error(`Cannot load skill at ${pathB}`);
23
+ const sectionsA = parseSections(skillA.body);
24
+ const sectionsB = parseSections(skillB.body);
25
+ const headingsA = new Set(sectionsA.map(s => s.heading));
26
+ const headingsB = new Set(sectionsB.map(s => s.heading));
27
+ // Added sections (in B but not A)
28
+ const added = [...headingsB].filter(h => !headingsA.has(h));
29
+ // Removed sections (in A but not B)
30
+ const removed = [...headingsA].filter(h => !headingsB.has(h));
31
+ // Changed and unchanged sections
32
+ const changed = [];
33
+ const unchanged = [];
34
+ const commonHeadings = [...headingsA].filter(h => headingsB.has(h));
35
+ for (const heading of commonHeadings) {
36
+ const secA = sectionsA.find(s => s.heading === heading);
37
+ const secB = sectionsB.find(s => s.heading === heading);
38
+ if (secA.content.trim() === secB.content.trim()) {
39
+ unchanged.push(heading);
40
+ }
41
+ else {
42
+ const linesA = secA.content.split('\n');
43
+ const linesB = secB.content.split('\n');
44
+ // Simple line diff
45
+ const addedLines = linesB.filter(l => !linesA.includes(l));
46
+ const removedLines = linesA.filter(l => !linesB.includes(l));
47
+ // Build preview (max 6 lines)
48
+ const previewLines = [];
49
+ for (const line of removedLines.slice(0, 3)) {
50
+ previewLines.push(`- ${line}`);
51
+ }
52
+ for (const line of addedLines.slice(0, 3)) {
53
+ previewLines.push(`+ ${line}`);
54
+ }
55
+ changed.push({
56
+ heading,
57
+ linesAdded: addedLines.length,
58
+ linesRemoved: removedLines.length,
59
+ preview: previewLines.join('\n'),
60
+ });
61
+ }
62
+ }
63
+ const tokensA = Math.ceil(skillA.raw.length / 4);
64
+ const tokensB = Math.ceil(skillB.raw.length / 4);
65
+ return {
66
+ skillA: skillA.name,
67
+ skillB: skillB.name,
68
+ added,
69
+ removed,
70
+ changed,
71
+ unchanged,
72
+ tokenDelta: tokensB - tokensA,
73
+ linesA: skillA.body.split('\n').length,
74
+ linesB: skillB.body.split('\n').length,
75
+ };
76
+ }
77
+ async function loadSkillForDiff(path) {
78
+ const skillMd = path.endsWith('SKILL.md') ? path : join(path, 'SKILL.md');
79
+ if (!existsSync(skillMd))
80
+ return null;
81
+ try {
82
+ const raw = await readFile(skillMd, 'utf-8');
83
+ const { data, content } = matter(raw);
84
+ return {
85
+ name: data.name || basename(path),
86
+ body: content,
87
+ raw,
88
+ };
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ function parseSections(body) {
95
+ const lines = body.split('\n');
96
+ const sections = [];
97
+ let currentHeading = '(intro)';
98
+ let currentLines = [];
99
+ for (const line of lines) {
100
+ const match = line.match(/^#{1,4}\s+(.+)/);
101
+ if (match) {
102
+ if (currentLines.length > 0) {
103
+ sections.push({ heading: currentHeading, content: currentLines.join('\n') });
104
+ }
105
+ currentHeading = match[1].trim().toLowerCase();
106
+ currentLines = [];
107
+ }
108
+ else {
109
+ currentLines.push(line);
110
+ }
111
+ }
112
+ if (currentLines.length > 0) {
113
+ sections.push({ heading: currentHeading, content: currentLines.join('\n') });
114
+ }
115
+ return sections;
116
+ }
117
+ //# sourceMappingURL=differ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.js","sourceRoot":"","sources":["../../src/core/differ.ts"],"names":[],"mappings":"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"}
@@ -31,4 +31,16 @@ export { loadSkillsRC, getSourcesByType, getRegistryForScope, getAuthEnvVar, } f
31
31
  export type { SkillsRC, SkillsRCSource, SkillsRCDefaults, } from './skillsrc.js';
32
32
  export { assessQuality, formatScoreBar, getScoreColor, } from './quality.js';
33
33
  export type { QualityScore, ScoreDetail, } from './quality.js';
34
+ export { detectConflicts, } from './conflict-detector.js';
35
+ export type { Conflict, Overlap, ConflictResult, } from './conflict-detector.js';
36
+ export { buildContextPlan, formatContextXML, formatContextJSON, } from './context-budget.js';
37
+ export type { SkillWithRelevance, ContextPlan, ContextOptions, } from './context-budget.js';
38
+ export { diffSkills, } from './differ.js';
39
+ export type { SectionDiff, DiffResult, } from './differ.js';
40
+ export { composeSkills, } from './composer.js';
41
+ export type { ComposeStrategy, ComposeOptions, ComposedSkill, } from './composer.js';
42
+ export { testSkill, testSkills, } from './skill-tester.js';
43
+ export type { SkillTest, TestResult, AssertionResult, } from './skill-tester.js';
44
+ export { splitSkill, } from './splitter.js';
45
+ export type { SplitSkill, SplitResult, } from './splitter.js';
34
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -36,4 +36,16 @@ export { SCANNER_RULES, getRulesByCategory, getRuleById, getCategories, createEm
36
36
  export { loadSkillsRC, getSourcesByType, getRegistryForScope, getAuthEnvVar, } from './skillsrc.js';
37
37
  // Quality scoring (4-dimension skill assessment)
38
38
  export { assessQuality, formatScoreBar, getScoreColor, } from './quality.js';
39
+ // Conflict Detector (v1.1.4)
40
+ export { detectConflicts, } from './conflict-detector.js';
41
+ // Context Budget Manager (v1.1.4)
42
+ export { buildContextPlan, formatContextXML, formatContextJSON, } from './context-budget.js';
43
+ // Skill Differ (v1.1.4)
44
+ export { diffSkills, } from './differ.js';
45
+ // Skill Composer (v1.1.4)
46
+ export { composeSkills, } from './composer.js';
47
+ // Skill Tester (v1.1.4)
48
+ export { testSkill, testSkills, } from './skill-tester.js';
49
+ // Skill Splitter (v1.1.4)
50
+ export { splitSkill, } from './splitter.js';
39
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,mBAAmB;AACnB,OAAO,EACH,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACtB,MAAM,aAAa,CAAC;AAErB,sBAAsB;AACtB,OAAO,EACH,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACzB,MAAM,gBAAgB,CAAC;AAExB,qBAAqB;AACrB,OAAO,EACH,uBAAuB,EACvB,6BAA6B,EAC7B,+BAA+B,EAC/B,yBAAyB,EAC5B,MAAM,eAAe,CAAC;AAEvB,qBAAqB;AACrB,OAAO,EACH,aAAa,EACb,YAAY,EACZ,WAAW,EACd,MAAM,eAAe,CAAC;AAEvB,wBAAwB;AACxB,OAAO,EACH,UAAU,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,kBAAkB,CAAC;AAE1B,8DAA8D;AAC9D,OAAO,EACH,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACvB,MAAM,eAAe,CAAC;AAWvB,2BAA2B;AAC3B,OAAO,EACH,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACvB,MAAM,aAAa,CAAC;AAOrB,oDAAoD;AACpD,OAAO,EACH,KAAK,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACb,MAAM,gBAAgB,CAAC;AAExB,gFAAgF;AAChF,OAAO,EACH,WAAW,EACX,YAAY,EACZ,oBAAoB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,kDAAkD;AAClD,OAAO,EACH,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,aAAa,EACb,WAAW,GACd,MAAM,eAAe,CAAC;AAIvB,yCAAyC;AACzC,OAAO,EACH,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACxB,MAAM,gBAAgB,CAAC;AAQxB,qCAAqC;AACrC,OAAO,EACH,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAClB,MAAM,iBAAiB,CAAC;AASzB,iDAAiD;AACjD,OAAO,EACH,cAAc,EACd,mBAAmB,EACnB,UAAU,GACb,MAAM,cAAc,CAAC;AAQtB,mCAAmC;AACnC,OAAO,EACH,QAAQ,EACR,UAAU,EACV,OAAO,GACV,MAAM,YAAY,CAAC;AAMpB,4CAA4C;AAC5C,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,qBAAqB,GACxB,MAAM,oBAAoB,CAAC;AAS5B,uCAAuC;AACvC,OAAO,EACH,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GAChB,MAAM,eAAe,CAAC;AAQvB,iDAAiD;AACjD,OAAO,EACH,aAAa,EACb,cAAc,EACd,aAAa,GAChB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
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
+ export interface SkillTest {
11
+ /** Test name */
12
+ name: string;
13
+ /** Test type */
14
+ type: 'structure' | 'content' | 'quality';
15
+ /** Expected condition */
16
+ assertion: string;
17
+ /** Check function */
18
+ check: (content: string, data: Record<string, any>) => boolean;
19
+ }
20
+ export interface TestResult {
21
+ /** Skill name */
22
+ skillName: string;
23
+ /** Skill path */
24
+ skillPath: string;
25
+ /** Individual assertion results */
26
+ assertions: AssertionResult[];
27
+ /** Overall pass/fail */
28
+ passed: boolean;
29
+ /** Duration in ms */
30
+ duration: number;
31
+ /** Pass rate */
32
+ passRate: number;
33
+ }
34
+ export interface AssertionResult {
35
+ /** Test name */
36
+ name: string;
37
+ /** Pass/fail */
38
+ passed: boolean;
39
+ /** Type of test */
40
+ type: string;
41
+ /** Error message if failed */
42
+ message?: string;
43
+ }
44
+ /**
45
+ * Run all tests against a skill.
46
+ *
47
+ * @param skillPath — path to skill directory or SKILL.md
48
+ */
49
+ export declare function testSkill(skillPath: string): Promise<TestResult>;
50
+ /**
51
+ * Run tests against multiple skills.
52
+ */
53
+ export declare function testSkills(skillPaths: string[]): Promise<TestResult[]>;
54
+ //# sourceMappingURL=skill-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tester.d.ts","sourceRoot":"","sources":["../../src/core/skill-tester.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,WAAW,SAAS;IACtB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;CAClE;AAED,MAAM,WAAW,UAAU;IACvB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,wBAAwB;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAsHD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiDtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiB5E"}