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.
- 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/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +60 -19
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/sandbox.d.ts +7 -0
- package/dist/cli/commands/sandbox.d.ts.map +1 -0
- package/dist/cli/commands/sandbox.js +174 -0
- package/dist/cli/commands/sandbox.js.map +1 -0
- package/dist/cli/commands/split.d.ts +7 -0
- package/dist/cli/commands/split.d.ts.map +1 -0
- package/dist/cli/commands/split.js +80 -0
- package/dist/cli/commands/split.js.map +1 -0
- package/dist/cli/commands/test.d.ts +7 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +121 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/utils-commands.d.ts.map +1 -1
- package/dist/cli/commands/utils-commands.js +72 -4
- package/dist/cli/commands/utils-commands.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +7 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +85 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/composer.d.ts +41 -0
- package/dist/core/composer.d.ts.map +1 -0
- package/dist/core/composer.js +230 -0
- package/dist/core/composer.js.map +1 -0
- package/dist/core/conflict-detector.d.ts +55 -0
- package/dist/core/conflict-detector.d.ts.map +1 -0
- package/dist/core/conflict-detector.js +339 -0
- package/dist/core/conflict-detector.js.map +1 -0
- package/dist/core/context-budget.d.ts +63 -0
- package/dist/core/context-budget.d.ts.map +1 -0
- package/dist/core/context-budget.js +310 -0
- package/dist/core/context-budget.js.map +1 -0
- package/dist/core/differ.d.ts +42 -0
- package/dist/core/differ.d.ts.map +1 -0
- package/dist/core/differ.js +117 -0
- package/dist/core/differ.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/skill-tester.d.ts +54 -0
- package/dist/core/skill-tester.d.ts.map +1 -0
- package/dist/core/skill-tester.js +201 -0
- package/dist/core/skill-tester.js.map +1 -0
- package/dist/core/splitter.d.ts +36 -0
- package/dist/core/splitter.d.ts.map +1 -0
- package/dist/core/splitter.js +186 -0
- package/dist/core/splitter.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Conflict Detector Module
|
|
3
|
+
* Detects contradictory instructions and overlapping topics across installed skills.
|
|
4
|
+
*
|
|
5
|
+
* 3 detection strategies (no LLM required):
|
|
6
|
+
* 1. Keyword Contradiction — imperative statements that oppose each other
|
|
7
|
+
* 2. Topic Overlap — skills covering identical topics (token waste)
|
|
8
|
+
* 3. Rule Extraction — Do/Don't lists with conflicting directives
|
|
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
|
+
// ── Patterns ─────────────────────────────────────────────────────────────
|
|
15
|
+
/** Patterns for extracting imperative directives */
|
|
16
|
+
const DIRECTIVE_PATTERNS = [
|
|
17
|
+
{ regex: /^\s*[-*]?\s*(?:always\s+)use\s+(.+)/i, verb: 'use' },
|
|
18
|
+
{ regex: /^\s*[-*]?\s*always\s+(.+)/i, verb: 'always' },
|
|
19
|
+
{ regex: /^\s*[-*]?\s*never\s+(.+)/i, verb: 'never' },
|
|
20
|
+
{ regex: /^\s*[-*]?\s*avoid\s+(.+)/i, verb: 'avoid' },
|
|
21
|
+
{ regex: /^\s*[-*]?\s*prefer\s+(.+)/i, verb: 'prefer' },
|
|
22
|
+
{ regex: /^\s*[-*]?\s*(?:do\s+not|don'?t)\s+(.+)/i, verb: 'dont' },
|
|
23
|
+
{ regex: /^\s*[-*]?\s*do\s+(.+)/i, verb: 'do' },
|
|
24
|
+
];
|
|
25
|
+
/** Verbs that oppose each other */
|
|
26
|
+
const OPPOSING_VERBS = [
|
|
27
|
+
['use', 'avoid'],
|
|
28
|
+
['always', 'never'],
|
|
29
|
+
['prefer', 'avoid'],
|
|
30
|
+
['do', 'dont'],
|
|
31
|
+
['use', 'dont'],
|
|
32
|
+
['always', 'dont'],
|
|
33
|
+
['use', 'never'],
|
|
34
|
+
];
|
|
35
|
+
/** Code fence language regex */
|
|
36
|
+
const CODE_FENCE_RE = /```(\w+)/g;
|
|
37
|
+
/** Common stop words to ignore in topic matching */
|
|
38
|
+
const STOP_WORDS = new Set([
|
|
39
|
+
'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
40
|
+
'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
41
|
+
'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',
|
|
42
|
+
'should', 'could', 'may', 'might', 'shall', 'can', 'need', 'must',
|
|
43
|
+
'this', 'that', 'these', 'those', 'it', 'its', 'you', 'your', 'we',
|
|
44
|
+
'our', 'they', 'their', 'when', 'where', 'how', 'what', 'which',
|
|
45
|
+
'who', 'whom', 'if', 'then', 'else', 'not', 'no', 'as', 'so',
|
|
46
|
+
'than', 'too', 'very', 'just', 'about', 'up', 'out', 'all', 'also',
|
|
47
|
+
'each', 'every', 'any', 'some', 'such', 'only', 'own', 'same',
|
|
48
|
+
'use', 'using', 'used', 'make', 'sure', 'file', 'code', 'skill',
|
|
49
|
+
]);
|
|
50
|
+
// ── Main Entry ───────────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Detect conflicts and overlaps across a set of installed skills.
|
|
53
|
+
*
|
|
54
|
+
* @param skillPaths — array of absolute paths to skill directories
|
|
55
|
+
* (each should contain a SKILL.md)
|
|
56
|
+
*/
|
|
57
|
+
export async function detectConflicts(skillPaths) {
|
|
58
|
+
// 1. Load all skills
|
|
59
|
+
const skills = [];
|
|
60
|
+
for (const p of skillPaths) {
|
|
61
|
+
const skill = await loadSkillContent(p);
|
|
62
|
+
if (skill)
|
|
63
|
+
skills.push(skill);
|
|
64
|
+
}
|
|
65
|
+
// 2. Run detection strategies
|
|
66
|
+
const conflicts = detectContradictions(skills);
|
|
67
|
+
const overlaps = detectOverlaps(skills);
|
|
68
|
+
// 3. Build summary
|
|
69
|
+
const critical = conflicts.filter(c => c.severity === 'critical').length;
|
|
70
|
+
const warnings = conflicts.filter(c => c.severity === 'warning').length;
|
|
71
|
+
const estimatedTokenWaste = overlaps.reduce((sum, o) => sum + o.tokenWaste, 0);
|
|
72
|
+
return {
|
|
73
|
+
conflicts,
|
|
74
|
+
overlaps,
|
|
75
|
+
summary: {
|
|
76
|
+
total: conflicts.length + overlaps.length,
|
|
77
|
+
critical,
|
|
78
|
+
warnings,
|
|
79
|
+
overlapCount: overlaps.length,
|
|
80
|
+
estimatedTokenWaste,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// ── Strategy 1: Keyword Contradiction ────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Extract directives from all skills, then cross-compare for contradictions.
|
|
87
|
+
*/
|
|
88
|
+
function detectContradictions(skills) {
|
|
89
|
+
const conflicts = [];
|
|
90
|
+
for (let i = 0; i < skills.length; i++) {
|
|
91
|
+
for (let j = i + 1; j < skills.length; j++) {
|
|
92
|
+
const a = skills[i];
|
|
93
|
+
const b = skills[j];
|
|
94
|
+
for (const da of a.directives) {
|
|
95
|
+
for (const db of b.directives) {
|
|
96
|
+
const opposition = checkOpposition(da, db);
|
|
97
|
+
if (opposition) {
|
|
98
|
+
conflicts.push({
|
|
99
|
+
severity: opposition.confidence > 0.7 ? 'critical' : 'warning',
|
|
100
|
+
skillA: a.name,
|
|
101
|
+
skillB: b.name,
|
|
102
|
+
category: opposition.category,
|
|
103
|
+
description: opposition.description,
|
|
104
|
+
lineA: da.original,
|
|
105
|
+
lineB: db.original,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return conflicts;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if two directives oppose each other.
|
|
116
|
+
*/
|
|
117
|
+
function checkOpposition(a, b) {
|
|
118
|
+
// Check if verbs are opposing
|
|
119
|
+
const isOpposing = OPPOSING_VERBS.some(([v1, v2]) => (a.verb === v1 && b.verb === v2) || (a.verb === v2 && b.verb === v1));
|
|
120
|
+
if (!isOpposing)
|
|
121
|
+
return null;
|
|
122
|
+
// Check if subjects are similar (normalized comparison)
|
|
123
|
+
const similarity = subjectSimilarity(a.subject, b.subject);
|
|
124
|
+
if (similarity < 0.4)
|
|
125
|
+
return null;
|
|
126
|
+
// Determine category from subject keywords
|
|
127
|
+
const category = categorizeSubject(a.subject + ' ' + b.subject);
|
|
128
|
+
return {
|
|
129
|
+
confidence: similarity,
|
|
130
|
+
category,
|
|
131
|
+
description: `"${a.verb} ${a.subject}" conflicts with "${b.verb} ${b.subject}"`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Compute similarity between two subjects (0-1).
|
|
136
|
+
* Uses normalized word overlap (Jaccard-like).
|
|
137
|
+
*/
|
|
138
|
+
function subjectSimilarity(a, b) {
|
|
139
|
+
const wordsA = extractWords(a);
|
|
140
|
+
const wordsB = extractWords(b);
|
|
141
|
+
if (wordsA.length === 0 || wordsB.length === 0)
|
|
142
|
+
return 0;
|
|
143
|
+
const setA = new Set(wordsA);
|
|
144
|
+
const setB = new Set(wordsB);
|
|
145
|
+
let intersection = 0;
|
|
146
|
+
for (const word of setA) {
|
|
147
|
+
if (setB.has(word))
|
|
148
|
+
intersection++;
|
|
149
|
+
}
|
|
150
|
+
const union = new Set([...setA, ...setB]).size;
|
|
151
|
+
return union === 0 ? 0 : intersection / union;
|
|
152
|
+
}
|
|
153
|
+
// ── Strategy 2: Topic Overlap ────────────────────────────────────────────
|
|
154
|
+
/**
|
|
155
|
+
* Detect skills that cover the same topic (duplicate instructions).
|
|
156
|
+
*/
|
|
157
|
+
function detectOverlaps(skills) {
|
|
158
|
+
const overlaps = [];
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
for (let i = 0; i < skills.length; i++) {
|
|
161
|
+
for (let j = i + 1; j < skills.length; j++) {
|
|
162
|
+
const a = skills[i];
|
|
163
|
+
const b = skills[j];
|
|
164
|
+
const key = [a.name, b.name].sort().join('::');
|
|
165
|
+
if (seen.has(key))
|
|
166
|
+
continue;
|
|
167
|
+
// Check heading overlap
|
|
168
|
+
const headingOverlap = arrayOverlap(a.topics.headings, b.topics.headings);
|
|
169
|
+
// Check keyword overlap
|
|
170
|
+
const keywordOverlap = arrayOverlap(a.topics.keywords, b.topics.keywords);
|
|
171
|
+
// Check language overlap
|
|
172
|
+
const langOverlap = arrayOverlap(a.topics.codeLanguages, b.topics.codeLanguages);
|
|
173
|
+
// Weighted score
|
|
174
|
+
const score = headingOverlap * 0.5 + keywordOverlap * 0.35 + langOverlap * 0.15;
|
|
175
|
+
if (score > 0.35) {
|
|
176
|
+
seen.add(key);
|
|
177
|
+
// Estimate token waste: smaller skill's token count × overlap ratio
|
|
178
|
+
const tokensA = Math.ceil(a.body.length / 4);
|
|
179
|
+
const tokensB = Math.ceil(b.body.length / 4);
|
|
180
|
+
const waste = Math.round(Math.min(tokensA, tokensB) * score);
|
|
181
|
+
// Find the common topic
|
|
182
|
+
const commonHeadings = a.topics.headings.filter(h => b.topics.headings.includes(h));
|
|
183
|
+
const commonKeywords = a.topics.keywords.filter(k => b.topics.keywords.includes(k));
|
|
184
|
+
const topic = commonHeadings.length > 0
|
|
185
|
+
? commonHeadings.slice(0, 3).join(', ')
|
|
186
|
+
: commonKeywords.slice(0, 5).join(', ');
|
|
187
|
+
overlaps.push({
|
|
188
|
+
skills: [a.name, b.name],
|
|
189
|
+
topic: topic || 'general instructions',
|
|
190
|
+
tokenWaste: waste,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return overlaps;
|
|
196
|
+
}
|
|
197
|
+
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
198
|
+
/**
|
|
199
|
+
* Load a skill's content and extract directives + topics.
|
|
200
|
+
*/
|
|
201
|
+
async function loadSkillContent(skillPath) {
|
|
202
|
+
const skillMd = skillPath.endsWith('SKILL.md')
|
|
203
|
+
? skillPath
|
|
204
|
+
: join(skillPath, 'SKILL.md');
|
|
205
|
+
if (!existsSync(skillMd))
|
|
206
|
+
return null;
|
|
207
|
+
try {
|
|
208
|
+
const raw = await readFile(skillMd, 'utf-8');
|
|
209
|
+
const { data, content } = matter(raw);
|
|
210
|
+
const name = data.name || basename(skillPath);
|
|
211
|
+
const directives = extractDirectives(content);
|
|
212
|
+
const topics = extractTopics(content);
|
|
213
|
+
return { name, path: skillPath, body: content, directives, topics };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Extract imperative directives from skill body.
|
|
221
|
+
*/
|
|
222
|
+
function extractDirectives(body) {
|
|
223
|
+
const directives = [];
|
|
224
|
+
const lines = body.split('\n');
|
|
225
|
+
for (const line of lines) {
|
|
226
|
+
const trimmed = line.trim();
|
|
227
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('```'))
|
|
228
|
+
continue;
|
|
229
|
+
for (const { regex, verb } of DIRECTIVE_PATTERNS) {
|
|
230
|
+
const match = trimmed.match(regex);
|
|
231
|
+
if (match) {
|
|
232
|
+
const subject = match[1].replace(/[.!,;:]+$/, '').trim().toLowerCase();
|
|
233
|
+
if (subject.length > 2 && subject.length < 200) {
|
|
234
|
+
directives.push({ line: trimmed, verb, subject, original: trimmed });
|
|
235
|
+
}
|
|
236
|
+
break; // only match first pattern per line
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return directives;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Extract topic signals from skill body: headings, keywords, code languages.
|
|
244
|
+
*/
|
|
245
|
+
function extractTopics(body) {
|
|
246
|
+
const lines = body.split('\n');
|
|
247
|
+
const headings = [];
|
|
248
|
+
const allWords = [];
|
|
249
|
+
const codeLanguages = [];
|
|
250
|
+
let inCodeBlock = false;
|
|
251
|
+
for (const line of lines) {
|
|
252
|
+
if (line.trim().startsWith('```')) {
|
|
253
|
+
inCodeBlock = !inCodeBlock;
|
|
254
|
+
// Extract language from opening fence
|
|
255
|
+
if (inCodeBlock) {
|
|
256
|
+
const match = line.match(/```(\w+)/);
|
|
257
|
+
if (match && match[1]) {
|
|
258
|
+
codeLanguages.push(match[1].toLowerCase());
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (inCodeBlock)
|
|
264
|
+
continue;
|
|
265
|
+
// Extract headings (## or ###)
|
|
266
|
+
const headingMatch = line.match(/^#{2,4}\s+(.+)/);
|
|
267
|
+
if (headingMatch) {
|
|
268
|
+
headings.push(headingMatch[1].toLowerCase().trim());
|
|
269
|
+
}
|
|
270
|
+
// Extract significant words
|
|
271
|
+
const words = extractWords(line);
|
|
272
|
+
allWords.push(...words);
|
|
273
|
+
}
|
|
274
|
+
// Get top keywords by frequency (skip stop words)
|
|
275
|
+
const freq = new Map();
|
|
276
|
+
for (const word of allWords) {
|
|
277
|
+
freq.set(word, (freq.get(word) || 0) + 1);
|
|
278
|
+
}
|
|
279
|
+
const keywords = [...freq.entries()]
|
|
280
|
+
.filter(([, count]) => count >= 2)
|
|
281
|
+
.sort((a, b) => b[1] - a[1])
|
|
282
|
+
.slice(0, 30)
|
|
283
|
+
.map(([word]) => word);
|
|
284
|
+
return {
|
|
285
|
+
keywords,
|
|
286
|
+
headings: [...new Set(headings)],
|
|
287
|
+
codeLanguages: [...new Set(codeLanguages)],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Extract significant words from a line (lowercase, no stop words, min length 3).
|
|
292
|
+
*/
|
|
293
|
+
function extractWords(text) {
|
|
294
|
+
return text
|
|
295
|
+
.toLowerCase()
|
|
296
|
+
.replace(/[^a-z0-9\s-]/g, ' ')
|
|
297
|
+
.split(/\s+/)
|
|
298
|
+
.filter(w => w.length >= 3 && !STOP_WORDS.has(w));
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Compute overlap ratio between two arrays (Jaccard index).
|
|
302
|
+
*/
|
|
303
|
+
function arrayOverlap(a, b) {
|
|
304
|
+
if (a.length === 0 || b.length === 0)
|
|
305
|
+
return 0;
|
|
306
|
+
const setA = new Set(a);
|
|
307
|
+
const setB = new Set(b);
|
|
308
|
+
let intersection = 0;
|
|
309
|
+
for (const item of setA) {
|
|
310
|
+
if (setB.has(item))
|
|
311
|
+
intersection++;
|
|
312
|
+
}
|
|
313
|
+
const union = new Set([...setA, ...setB]).size;
|
|
314
|
+
return union === 0 ? 0 : intersection / union;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Categorize a subject string into a conflict category.
|
|
318
|
+
*/
|
|
319
|
+
function categorizeSubject(text) {
|
|
320
|
+
const lower = text.toLowerCase();
|
|
321
|
+
const categories = [
|
|
322
|
+
['formatting', ['format', 'indent', 'tab', 'space', 'semicolon', 'quote', 'lint', 'prettier', 'eslint']],
|
|
323
|
+
['architecture', ['component', 'class', 'function', 'functional', 'module', 'pattern', 'architecture', 'structure']],
|
|
324
|
+
['testing', ['test', 'spec', 'jest', 'vitest', 'mocha', 'assert', 'mock', 'stub']],
|
|
325
|
+
['styling', ['css', 'style', 'tailwind', 'sass', 'scss', 'styled', 'theme', 'color']],
|
|
326
|
+
['state management', ['state', 'redux', 'zustand', 'context', 'store', 'signal', 'observable']],
|
|
327
|
+
['dependencies', ['import', 'require', 'dependency', 'package', 'library', 'framework']],
|
|
328
|
+
['language', ['typescript', 'javascript', 'python', 'rust', 'go', 'java', 'type', 'interface']],
|
|
329
|
+
['security', ['auth', 'token', 'password', 'secret', 'encrypt', 'cors', 'xss', 'csrf']],
|
|
330
|
+
['deployment', ['deploy', 'build', 'ci', 'cd', 'docker', 'kubernetes', 'vercel', 'aws']],
|
|
331
|
+
['api', ['api', 'rest', 'graphql', 'endpoint', 'route', 'fetch', 'request', 'response']],
|
|
332
|
+
];
|
|
333
|
+
for (const [category, keywords] of categories) {
|
|
334
|
+
if (keywords.some(kw => lower.includes(kw)))
|
|
335
|
+
return category;
|
|
336
|
+
}
|
|
337
|
+
return 'general';
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=conflict-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../../src/core/conflict-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
export interface SkillWithRelevance {
|
|
13
|
+
/** Skill name */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Path to skill directory */
|
|
16
|
+
path: string;
|
|
17
|
+
/** Estimated token count */
|
|
18
|
+
tokens: number;
|
|
19
|
+
/** Relevance score 0-100 */
|
|
20
|
+
relevance: number;
|
|
21
|
+
/** Why this relevance score */
|
|
22
|
+
reason: string;
|
|
23
|
+
/** Full SKILL.md content (for output) */
|
|
24
|
+
content: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ContextPlan {
|
|
27
|
+
/** Skills selected to load (within budget) */
|
|
28
|
+
loaded: SkillWithRelevance[];
|
|
29
|
+
/** Skills skipped (didn't fit or too irrelevant) */
|
|
30
|
+
skipped: SkillWithRelevance[];
|
|
31
|
+
/** Total tokens used */
|
|
32
|
+
totalTokens: number;
|
|
33
|
+
/** Budget that was set */
|
|
34
|
+
budget: number;
|
|
35
|
+
/** Budget remaining */
|
|
36
|
+
budgetRemaining: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ContextOptions {
|
|
39
|
+
/** Token budget */
|
|
40
|
+
budget: number;
|
|
41
|
+
/** Minimum relevance score to include (0-100, default 10) */
|
|
42
|
+
minRelevance?: number;
|
|
43
|
+
/** Project directory to analyze (default: process.cwd()) */
|
|
44
|
+
projectDir?: string;
|
|
45
|
+
/** Output format */
|
|
46
|
+
format?: 'text' | 'xml' | 'json';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build a context plan that fits installed skills into a token budget.
|
|
50
|
+
*
|
|
51
|
+
* @param skillPaths — array of absolute paths to skill directories
|
|
52
|
+
* @param options — budget + project analysis options
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildContextPlan(skillPaths: string[], options: ContextOptions): Promise<ContextPlan>;
|
|
55
|
+
/**
|
|
56
|
+
* Format the context plan as XML for agent consumption.
|
|
57
|
+
*/
|
|
58
|
+
export declare function formatContextXML(plan: ContextPlan): string;
|
|
59
|
+
/**
|
|
60
|
+
* Format the context plan as JSON.
|
|
61
|
+
*/
|
|
62
|
+
export declare function formatContextJSON(plan: ContextPlan): string;
|
|
63
|
+
//# sourceMappingURL=context-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../../src/core/context-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,kBAAkB;IAC/B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,8CAA8C;IAC9C,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,oDAAoD;IACpD,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACpC;AAuCD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAClC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,WAAW,CAAC,CAyCtB;AA+ND;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAQ3D"}
|