@milo4jo/contextkit 0.1.2 → 0.3.0
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 +236 -71
- package/dist/commands/index-cmd.d.ts.map +1 -1
- package/dist/commands/index-cmd.js +10 -2
- package/dist/commands/index-cmd.js.map +1 -1
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +23 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +171 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +11 -2
- package/dist/db/index.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/discovery.d.ts +7 -0
- package/dist/indexer/discovery.d.ts.map +1 -1
- package/dist/indexer/discovery.js +9 -0
- package/dist/indexer/discovery.js.map +1 -1
- package/dist/indexer/index.d.ts +17 -3
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +135 -24
- package/dist/indexer/index.js.map +1 -1
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +20 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +252 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp-server.d.ts +18 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +22 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/selector/budget.d.ts +2 -0
- package/dist/selector/budget.d.ts.map +1 -1
- package/dist/selector/budget.js +19 -6
- package/dist/selector/budget.js.map +1 -1
- package/dist/selector/formatter.d.ts.map +1 -1
- package/dist/selector/formatter.js +7 -5
- package/dist/selector/formatter.js.map +1 -1
- package/dist/selector/scoring.d.ts +15 -5
- package/dist/selector/scoring.d.ts.map +1 -1
- package/dist/selector/scoring.js +193 -19
- package/dist/selector/scoring.js.map +1 -1
- package/dist/utils/streams.d.ts +4 -0
- package/dist/utils/streams.d.ts.map +1 -1
- package/dist/utils/streams.js +7 -0
- package/dist/utils/streams.js.map +1 -1
- package/package.json +18 -6
package/dist/selector/scoring.js
CHANGED
|
@@ -3,51 +3,88 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Calculates final scores for chunks based on multiple signals.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Multi-factor scoring:
|
|
7
|
+
* - Semantic similarity (embeddings)
|
|
8
|
+
* - Path relevance (query keywords in file path)
|
|
9
|
+
* - Content keyword matching (exact word matches)
|
|
10
|
+
* - Code symbol matching (function/class names)
|
|
11
|
+
* - File type boost (implementation files > tests)
|
|
9
12
|
*/
|
|
10
|
-
/** Scoring weights */
|
|
13
|
+
/** Scoring weights - tuned for code search */
|
|
11
14
|
const WEIGHTS = {
|
|
12
|
-
similarity: 0.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
similarity: 0.50, // Semantic similarity is primary signal
|
|
16
|
+
pathMatch: 0.15, // Path contains query keywords
|
|
17
|
+
contentMatch: 0.15, // Content contains exact keywords
|
|
18
|
+
symbolMatch: 0.15, // Contains relevant function/class names
|
|
19
|
+
fileTypeBoost: 0.05, // File type priority
|
|
15
20
|
};
|
|
16
21
|
/**
|
|
17
22
|
* Calculate scores and rank chunks
|
|
18
23
|
*/
|
|
19
|
-
export function rankChunks(chunks, query) {
|
|
20
|
-
// Extract keywords from query
|
|
24
|
+
export function rankChunks(chunks, query, options = {}) {
|
|
25
|
+
// Extract keywords and symbols from query
|
|
21
26
|
const queryKeywords = extractKeywords(query);
|
|
22
|
-
|
|
27
|
+
const querySymbols = extractSymbols(query);
|
|
28
|
+
// Score all chunks
|
|
23
29
|
const ranked = chunks.map((chunk) => {
|
|
24
30
|
// Semantic similarity (already 0-1)
|
|
25
31
|
const similarityScore = chunk.similarity;
|
|
26
|
-
//
|
|
27
|
-
// For now, give all chunks equal recency
|
|
28
|
-
const recencyScore = 0.5;
|
|
29
|
-
// Path match bonus
|
|
32
|
+
// Path match bonus (query keywords in file path)
|
|
30
33
|
const pathMatchScore = calculatePathMatch(chunk.filePath, queryKeywords);
|
|
34
|
+
// Content keyword match (exact words in content)
|
|
35
|
+
const contentMatchScore = calculateContentMatch(chunk.content, queryKeywords);
|
|
36
|
+
// Code symbol match (function/class names)
|
|
37
|
+
const symbolMatchScore = calculateSymbolMatch(chunk.content, querySymbols);
|
|
38
|
+
// File type boost
|
|
39
|
+
const fileTypeBoost = calculateFileTypeBoost(chunk.filePath);
|
|
31
40
|
// Combined score
|
|
32
41
|
const score = WEIGHTS.similarity * similarityScore +
|
|
33
|
-
WEIGHTS.
|
|
34
|
-
WEIGHTS.
|
|
42
|
+
WEIGHTS.pathMatch * pathMatchScore +
|
|
43
|
+
WEIGHTS.contentMatch * contentMatchScore +
|
|
44
|
+
WEIGHTS.symbolMatch * symbolMatchScore +
|
|
45
|
+
WEIGHTS.fileTypeBoost * fileTypeBoost;
|
|
35
46
|
return {
|
|
36
47
|
...chunk,
|
|
37
48
|
score,
|
|
38
49
|
scoreBreakdown: {
|
|
39
50
|
similarity: similarityScore,
|
|
40
|
-
recency: recencyScore,
|
|
41
51
|
pathMatch: pathMatchScore,
|
|
52
|
+
contentMatch: contentMatchScore,
|
|
53
|
+
symbolMatch: symbolMatchScore,
|
|
54
|
+
fileTypeBoost: fileTypeBoost,
|
|
42
55
|
},
|
|
43
56
|
};
|
|
44
57
|
});
|
|
45
58
|
// Sort by final score descending
|
|
46
59
|
ranked.sort((a, b) => b.score - a.score);
|
|
60
|
+
// Apply diversity penalty if enabled
|
|
61
|
+
if (options.diversityPenalty) {
|
|
62
|
+
return applyDiversityPenalty(ranked);
|
|
63
|
+
}
|
|
47
64
|
return ranked;
|
|
48
65
|
}
|
|
49
66
|
/**
|
|
50
|
-
*
|
|
67
|
+
* Apply diversity penalty to avoid too many chunks from same file
|
|
68
|
+
*/
|
|
69
|
+
function applyDiversityPenalty(chunks) {
|
|
70
|
+
const fileChunkCount = new Map();
|
|
71
|
+
const PENALTY_PER_DUPLICATE = 0.1;
|
|
72
|
+
const MAX_PENALTY = 0.3;
|
|
73
|
+
return chunks.map((chunk) => {
|
|
74
|
+
const count = fileChunkCount.get(chunk.filePath) || 0;
|
|
75
|
+
fileChunkCount.set(chunk.filePath, count + 1);
|
|
76
|
+
if (count > 0) {
|
|
77
|
+
const penalty = Math.min(count * PENALTY_PER_DUPLICATE, MAX_PENALTY);
|
|
78
|
+
return {
|
|
79
|
+
...chunk,
|
|
80
|
+
score: chunk.score * (1 - penalty),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return chunk;
|
|
84
|
+
}).sort((a, b) => b.score - a.score);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract keywords from query for matching
|
|
51
88
|
*/
|
|
52
89
|
function extractKeywords(query) {
|
|
53
90
|
return query
|
|
@@ -56,6 +93,24 @@ function extractKeywords(query) {
|
|
|
56
93
|
.filter((word) => word.length > 2)
|
|
57
94
|
.filter((word) => !STOP_WORDS.has(word));
|
|
58
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract potential code symbols from query (camelCase, snake_case, etc.)
|
|
98
|
+
*/
|
|
99
|
+
function extractSymbols(query) {
|
|
100
|
+
const symbols = [];
|
|
101
|
+
// Match camelCase, PascalCase, snake_case patterns
|
|
102
|
+
const symbolPattern = /[a-zA-Z_][a-zA-Z0-9_]*(?:[A-Z][a-z0-9]*)+|[a-z]+(?:_[a-z0-9]+)+/g;
|
|
103
|
+
const matches = query.match(symbolPattern) || [];
|
|
104
|
+
symbols.push(...matches.map(s => s.toLowerCase()));
|
|
105
|
+
// Also include any word that looks like a function/variable name (>4 chars, no spaces)
|
|
106
|
+
const words = query.split(/\s+/);
|
|
107
|
+
for (const word of words) {
|
|
108
|
+
if (word.length > 4 && /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(word)) {
|
|
109
|
+
symbols.push(word.toLowerCase());
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [...new Set(symbols)];
|
|
113
|
+
}
|
|
59
114
|
/**
|
|
60
115
|
* Calculate path match score (0-1)
|
|
61
116
|
*/
|
|
@@ -71,7 +126,104 @@ function calculatePathMatch(filePath, keywords) {
|
|
|
71
126
|
}
|
|
72
127
|
return matches / keywords.length;
|
|
73
128
|
}
|
|
74
|
-
/**
|
|
129
|
+
/**
|
|
130
|
+
* Calculate content keyword match score (0-1)
|
|
131
|
+
* Looks for exact keyword matches in content
|
|
132
|
+
*/
|
|
133
|
+
function calculateContentMatch(content, keywords) {
|
|
134
|
+
if (keywords.length === 0)
|
|
135
|
+
return 0;
|
|
136
|
+
let matches = 0;
|
|
137
|
+
let totalWeight = 0;
|
|
138
|
+
for (const keyword of keywords) {
|
|
139
|
+
// Count occurrences (capped at 5 for normalization)
|
|
140
|
+
const regex = new RegExp(`\\b${escapeRegex(keyword)}\\b`, 'gi');
|
|
141
|
+
const occurrences = (content.match(regex) || []).length;
|
|
142
|
+
if (occurrences > 0) {
|
|
143
|
+
matches++;
|
|
144
|
+
// Bonus for multiple occurrences (diminishing returns)
|
|
145
|
+
totalWeight += Math.min(occurrences, 5) / 5;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Combine match ratio and occurrence weight
|
|
149
|
+
const matchRatio = matches / keywords.length;
|
|
150
|
+
const avgWeight = matches > 0 ? totalWeight / matches : 0;
|
|
151
|
+
return matchRatio * 0.7 + avgWeight * 0.3;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Calculate code symbol match score (0-1)
|
|
155
|
+
* Looks for function names, class names, etc.
|
|
156
|
+
*/
|
|
157
|
+
function calculateSymbolMatch(content, symbols) {
|
|
158
|
+
if (symbols.length === 0)
|
|
159
|
+
return 0;
|
|
160
|
+
let matches = 0;
|
|
161
|
+
// Common code patterns to look for
|
|
162
|
+
const patterns = [
|
|
163
|
+
/function\s+(\w+)/gi, // function declarations
|
|
164
|
+
/const\s+(\w+)\s*=/gi, // const assignments
|
|
165
|
+
/class\s+(\w+)/gi, // class declarations
|
|
166
|
+
/export\s+(?:async\s+)?function\s+(\w+)/gi, // exported functions
|
|
167
|
+
/export\s+const\s+(\w+)/gi, // exported consts
|
|
168
|
+
/(\w+)\s*[:=]\s*(?:async\s+)?\(/gi, // method/property functions
|
|
169
|
+
];
|
|
170
|
+
// Extract all symbols from content
|
|
171
|
+
const contentSymbols = new Set();
|
|
172
|
+
for (const pattern of patterns) {
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
175
|
+
contentSymbols.add(match[1].toLowerCase());
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Check for matches
|
|
179
|
+
for (const symbol of symbols) {
|
|
180
|
+
if (contentSymbols.has(symbol)) {
|
|
181
|
+
matches++;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// Partial match (symbol is substring of content symbol or vice versa)
|
|
185
|
+
for (const contentSymbol of contentSymbols) {
|
|
186
|
+
if (contentSymbol.includes(symbol) || symbol.includes(contentSymbol)) {
|
|
187
|
+
matches += 0.5;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return Math.min(matches / symbols.length, 1);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Calculate file type boost (0-1)
|
|
197
|
+
* Prioritizes implementation files over tests, configs, etc.
|
|
198
|
+
*/
|
|
199
|
+
function calculateFileTypeBoost(filePath) {
|
|
200
|
+
const pathLower = filePath.toLowerCase();
|
|
201
|
+
// Test files - lower priority
|
|
202
|
+
if (pathLower.includes('.test.') || pathLower.includes('.spec.') || pathLower.includes('__tests__')) {
|
|
203
|
+
return 0.3;
|
|
204
|
+
}
|
|
205
|
+
// Config/setup files - lower priority
|
|
206
|
+
if (pathLower.includes('config') || pathLower.includes('setup') || pathLower.endsWith('.json')) {
|
|
207
|
+
return 0.4;
|
|
208
|
+
}
|
|
209
|
+
// Type definition files
|
|
210
|
+
if (pathLower.endsWith('.d.ts')) {
|
|
211
|
+
return 0.5;
|
|
212
|
+
}
|
|
213
|
+
// Index/barrel files - medium priority
|
|
214
|
+
if (pathLower.endsWith('/index.ts') || pathLower.endsWith('/index.js')) {
|
|
215
|
+
return 0.6;
|
|
216
|
+
}
|
|
217
|
+
// Core implementation files - highest priority
|
|
218
|
+
return 1.0;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Escape special regex characters
|
|
222
|
+
*/
|
|
223
|
+
function escapeRegex(str) {
|
|
224
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
225
|
+
}
|
|
226
|
+
/** Common words to ignore in matching */
|
|
75
227
|
const STOP_WORDS = new Set([
|
|
76
228
|
'the',
|
|
77
229
|
'a',
|
|
@@ -109,5 +261,27 @@ const STOP_WORDS = new Set([
|
|
|
109
261
|
'to',
|
|
110
262
|
'in',
|
|
111
263
|
'on',
|
|
264
|
+
'work',
|
|
265
|
+
'works',
|
|
266
|
+
'working',
|
|
267
|
+
'use',
|
|
268
|
+
'using',
|
|
269
|
+
'used',
|
|
270
|
+
'can',
|
|
271
|
+
'could',
|
|
272
|
+
'would',
|
|
273
|
+
'should',
|
|
274
|
+
'will',
|
|
275
|
+
'get',
|
|
276
|
+
'set',
|
|
277
|
+
'make',
|
|
278
|
+
'find',
|
|
279
|
+
'show',
|
|
280
|
+
'tell',
|
|
281
|
+
'want',
|
|
282
|
+
'need',
|
|
283
|
+
'code',
|
|
284
|
+
'file',
|
|
285
|
+
'function',
|
|
112
286
|
]);
|
|
113
287
|
//# sourceMappingURL=scoring.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/selector/scoring.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/selector/scoring.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/streams.d.ts
CHANGED
|
@@ -37,4 +37,8 @@ export declare function writeWarning(message: string): void;
|
|
|
37
37
|
* Write info to stderr
|
|
38
38
|
*/
|
|
39
39
|
export declare function writeInfo(message: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Write dim/muted text to stderr
|
|
42
|
+
*/
|
|
43
|
+
export declare function writeDim(message: string): void;
|
|
40
44
|
//# sourceMappingURL=streams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG/C"}
|
|
1
|
+
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG9C"}
|
package/dist/utils/streams.js
CHANGED
|
@@ -58,4 +58,11 @@ export function writeInfo(message) {
|
|
|
58
58
|
const prefix = shouldUseColor() ? chalk.blue('ℹ') : 'ℹ';
|
|
59
59
|
process.stderr.write(`${prefix} ${message}\n`);
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Write dim/muted text to stderr
|
|
63
|
+
*/
|
|
64
|
+
export function writeDim(message) {
|
|
65
|
+
const text = shouldUseColor() ? chalk.dim(message) : message;
|
|
66
|
+
process.stderr.write(`${text}\n`);
|
|
67
|
+
}
|
|
61
68
|
//# sourceMappingURL=streams.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milo4jo/contextkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Intelligent context selection for LLM applications",
|
|
5
5
|
"author": "Milo <milo4jo@outlook.de>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"contextkit": "dist/index.js"
|
|
9
|
+
"contextkit": "dist/index.js",
|
|
10
|
+
"contextkit-mcp": "dist/mcp-server.js"
|
|
10
11
|
},
|
|
11
12
|
"main": "./dist/index.js",
|
|
12
13
|
"types": "./dist/index.d.ts",
|
|
@@ -22,12 +23,15 @@
|
|
|
22
23
|
"format": "prettier --write .",
|
|
23
24
|
"format:check": "prettier --check .",
|
|
24
25
|
"clean": "rm -rf dist",
|
|
25
|
-
"prepublishOnly": "npm run build"
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
27
|
+
"test": "vitest run"
|
|
26
28
|
},
|
|
27
29
|
"dependencies": {
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
28
31
|
"@xenova/transformers": "^2.17.2",
|
|
29
32
|
"better-sqlite3": "^11.7.0",
|
|
30
33
|
"chalk": "^5.3.0",
|
|
34
|
+
"chokidar": "^5.0.0",
|
|
31
35
|
"cli-progress": "^3.12.0",
|
|
32
36
|
"commander": "^12.1.0",
|
|
33
37
|
"fast-glob": "^3.3.2",
|
|
@@ -41,12 +45,13 @@
|
|
|
41
45
|
"eslint": "^9.18.0",
|
|
42
46
|
"prettier": "^3.4.2",
|
|
43
47
|
"typescript": "^5.7.3",
|
|
44
|
-
"typescript-eslint": "^8.20.0"
|
|
48
|
+
"typescript-eslint": "^8.20.0",
|
|
49
|
+
"vitest": "^4.0.18"
|
|
45
50
|
},
|
|
46
51
|
"engines": {
|
|
47
52
|
"node": ">=18"
|
|
48
53
|
},
|
|
49
|
-
"homepage": "https://
|
|
54
|
+
"homepage": "https://contextkit-site.vercel.app",
|
|
50
55
|
"bugs": {
|
|
51
56
|
"url": "https://github.com/milo4jo/contextkit/issues"
|
|
52
57
|
},
|
|
@@ -58,7 +63,14 @@
|
|
|
58
63
|
"embeddings",
|
|
59
64
|
"claude",
|
|
60
65
|
"gpt",
|
|
61
|
-
"cli"
|
|
66
|
+
"cli",
|
|
67
|
+
"mcp",
|
|
68
|
+
"model-context-protocol",
|
|
69
|
+
"semantic-search",
|
|
70
|
+
"code-search",
|
|
71
|
+
"context-window",
|
|
72
|
+
"token-budget",
|
|
73
|
+
"coding-assistant"
|
|
62
74
|
],
|
|
63
75
|
"repository": {
|
|
64
76
|
"type": "git",
|