@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.
Files changed (53) hide show
  1. package/README.md +236 -71
  2. package/dist/commands/index-cmd.d.ts.map +1 -1
  3. package/dist/commands/index-cmd.js +10 -2
  4. package/dist/commands/index-cmd.js.map +1 -1
  5. package/dist/commands/mcp.d.ts +8 -0
  6. package/dist/commands/mcp.d.ts.map +1 -0
  7. package/dist/commands/mcp.js +23 -0
  8. package/dist/commands/mcp.js.map +1 -0
  9. package/dist/commands/watch.d.ts +8 -0
  10. package/dist/commands/watch.d.ts.map +1 -0
  11. package/dist/commands/watch.js +171 -0
  12. package/dist/commands/watch.js.map +1 -0
  13. package/dist/db/index.d.ts.map +1 -1
  14. package/dist/db/index.js +11 -2
  15. package/dist/db/index.js.map +1 -1
  16. package/dist/index.js +7 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/indexer/discovery.d.ts +7 -0
  19. package/dist/indexer/discovery.d.ts.map +1 -1
  20. package/dist/indexer/discovery.js +9 -0
  21. package/dist/indexer/discovery.js.map +1 -1
  22. package/dist/indexer/index.d.ts +17 -3
  23. package/dist/indexer/index.d.ts.map +1 -1
  24. package/dist/indexer/index.js +135 -24
  25. package/dist/indexer/index.js.map +1 -1
  26. package/dist/mcp/index.d.ts +7 -0
  27. package/dist/mcp/index.d.ts.map +1 -0
  28. package/dist/mcp/index.js +7 -0
  29. package/dist/mcp/index.js.map +1 -0
  30. package/dist/mcp/server.d.ts +20 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +252 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp-server.d.ts +18 -0
  35. package/dist/mcp-server.d.ts.map +1 -0
  36. package/dist/mcp-server.js +22 -0
  37. package/dist/mcp-server.js.map +1 -0
  38. package/dist/selector/budget.d.ts +2 -0
  39. package/dist/selector/budget.d.ts.map +1 -1
  40. package/dist/selector/budget.js +19 -6
  41. package/dist/selector/budget.js.map +1 -1
  42. package/dist/selector/formatter.d.ts.map +1 -1
  43. package/dist/selector/formatter.js +7 -5
  44. package/dist/selector/formatter.js.map +1 -1
  45. package/dist/selector/scoring.d.ts +15 -5
  46. package/dist/selector/scoring.d.ts.map +1 -1
  47. package/dist/selector/scoring.js +193 -19
  48. package/dist/selector/scoring.js.map +1 -1
  49. package/dist/utils/streams.d.ts +4 -0
  50. package/dist/utils/streams.d.ts.map +1 -1
  51. package/dist/utils/streams.js +7 -0
  52. package/dist/utils/streams.js.map +1 -1
  53. package/package.json +18 -6
@@ -3,51 +3,88 @@
3
3
  *
4
4
  * Calculates final scores for chunks based on multiple signals.
5
5
  *
6
- * Score = 0.6 × semantic_similarity
7
- * + 0.2 × recency_bonus
8
- * + 0.2 × path_match_bonus
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.6,
13
- recency: 0.2,
14
- pathMatch: 0.2,
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 for path matching
24
+ export function rankChunks(chunks, query, options = {}) {
25
+ // Extract keywords and symbols from query
21
26
  const queryKeywords = extractKeywords(query);
22
- // Find max/min for normalization (recency not used yet since we don't track it)
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
- // Recency bonus (placeholder - would use indexed_at if we tracked per-chunk)
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.recency * recencyScore +
34
- WEIGHTS.pathMatch * pathMatchScore;
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
- * Extract keywords from query for path matching
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
- /** Common words to ignore in path matching */
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;;;;;;;;GAQG;AAgBH,sBAAsB;AACtB,MAAM,OAAO,GAAG;IACd,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAqB,EAAE,KAAa;IAC7D,gDAAgD;IAChD,MAAM,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAE7C,gFAAgF;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,oCAAoC;QACpC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC;QAEzC,6EAA6E;QAC7E,yCAAyC;QACzC,MAAM,YAAY,GAAG,GAAG,CAAC;QAEzB,mBAAmB;QACnB,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEzE,iBAAiB;QACjB,MAAM,KAAK,GACT,OAAO,CAAC,UAAU,GAAG,eAAe;YACpC,OAAO,CAAC,OAAO,GAAG,YAAY;YAC9B,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC;QAErC,OAAO;YACL,GAAG,KAAK;YACR,KAAK;YACL,cAAc,EAAE;gBACd,UAAU,EAAE,eAAe;gBAC3B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,cAAc;aAC1B;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAgB,EAAE,QAAkB;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;AACnC,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,KAAK;IACL,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC,CAAC"}
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/selector/scoring.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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.1.2",
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://github.com/milo4jo/contextkit#readme",
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",