@milo4jo/contextkit 0.1.2 → 0.5.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 (81) hide show
  1. package/README.md +269 -72
  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/select.d.ts.map +1 -1
  10. package/dist/commands/select.js +15 -9
  11. package/dist/commands/select.js.map +1 -1
  12. package/dist/commands/watch.d.ts +8 -0
  13. package/dist/commands/watch.d.ts.map +1 -0
  14. package/dist/commands/watch.js +171 -0
  15. package/dist/commands/watch.js.map +1 -0
  16. package/dist/config/index.d.ts +11 -0
  17. package/dist/config/index.d.ts.map +1 -1
  18. package/dist/config/index.js +11 -0
  19. package/dist/config/index.js.map +1 -1
  20. package/dist/config/validation.d.ts +33 -0
  21. package/dist/config/validation.d.ts.map +1 -0
  22. package/dist/config/validation.js +241 -0
  23. package/dist/config/validation.js.map +1 -0
  24. package/dist/db/index.d.ts.map +1 -1
  25. package/dist/db/index.js +11 -2
  26. package/dist/db/index.js.map +1 -1
  27. package/dist/index.js +7 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/indexer/discovery.d.ts +7 -0
  30. package/dist/indexer/discovery.d.ts.map +1 -1
  31. package/dist/indexer/discovery.js +9 -0
  32. package/dist/indexer/discovery.js.map +1 -1
  33. package/dist/indexer/index.d.ts +17 -3
  34. package/dist/indexer/index.d.ts.map +1 -1
  35. package/dist/indexer/index.js +135 -24
  36. package/dist/indexer/index.js.map +1 -1
  37. package/dist/mcp/index.d.ts +7 -0
  38. package/dist/mcp/index.d.ts.map +1 -0
  39. package/dist/mcp/index.js +7 -0
  40. package/dist/mcp/index.js.map +1 -0
  41. package/dist/mcp/server.d.ts +20 -0
  42. package/dist/mcp/server.d.ts.map +1 -0
  43. package/dist/mcp/server.js +252 -0
  44. package/dist/mcp/server.js.map +1 -0
  45. package/dist/mcp-server.d.ts +18 -0
  46. package/dist/mcp-server.d.ts.map +1 -0
  47. package/dist/mcp-server.js +22 -0
  48. package/dist/mcp-server.js.map +1 -0
  49. package/dist/retrieval/imports.d.ts +76 -0
  50. package/dist/retrieval/imports.d.ts.map +1 -0
  51. package/dist/retrieval/imports.js +258 -0
  52. package/dist/retrieval/imports.js.map +1 -0
  53. package/dist/selector/budget.d.ts +2 -0
  54. package/dist/selector/budget.d.ts.map +1 -1
  55. package/dist/selector/budget.js +19 -6
  56. package/dist/selector/budget.js.map +1 -1
  57. package/dist/selector/formatter.d.ts +15 -0
  58. package/dist/selector/formatter.d.ts.map +1 -1
  59. package/dist/selector/formatter.js +139 -5
  60. package/dist/selector/formatter.js.map +1 -1
  61. package/dist/selector/index.d.ts +11 -4
  62. package/dist/selector/index.d.ts.map +1 -1
  63. package/dist/selector/index.js +67 -12
  64. package/dist/selector/index.js.map +1 -1
  65. package/dist/selector/scoring.d.ts +35 -5
  66. package/dist/selector/scoring.d.ts.map +1 -1
  67. package/dist/selector/scoring.js +290 -23
  68. package/dist/selector/scoring.js.map +1 -1
  69. package/dist/utils/streams.d.ts +4 -0
  70. package/dist/utils/streams.d.ts.map +1 -1
  71. package/dist/utils/streams.js +7 -0
  72. package/dist/utils/streams.js.map +1 -1
  73. package/package.json +18 -6
  74. package/dist/commands/source.d.ts +0 -3
  75. package/dist/commands/source.d.ts.map +0 -1
  76. package/dist/commands/source.js +0 -153
  77. package/dist/commands/source.js.map +0 -1
  78. package/dist/utils/output.d.ts +0 -42
  79. package/dist/utils/output.d.ts.map +0 -1
  80. package/dist/utils/output.js +0 -62
  81. package/dist/utils/output.js.map +0 -1
@@ -3,51 +3,137 @@
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.45, // 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
20
+ importBoost: 0.05, // File is imported by selected chunks
15
21
  };
16
22
  /**
17
23
  * Calculate scores and rank chunks
18
24
  */
19
- export function rankChunks(chunks, query) {
20
- // Extract keywords from query for path matching
25
+ export function rankChunks(chunks, query, options = {}) {
26
+ // Extract keywords and symbols from query
21
27
  const queryKeywords = extractKeywords(query);
22
- // Find max/min for normalization (recency not used yet since we don't track it)
23
- const ranked = chunks.map((chunk) => {
24
- // Semantic similarity (already 0-1)
28
+ const querySymbols = extractSymbols(query);
29
+ // First pass: score all chunks without import boost
30
+ const initialScores = chunks.map((chunk) => {
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
30
32
  const pathMatchScore = calculatePathMatch(chunk.filePath, queryKeywords);
31
- // Combined score
32
- const score = WEIGHTS.similarity * similarityScore +
33
- WEIGHTS.recency * recencyScore +
34
- WEIGHTS.pathMatch * pathMatchScore;
33
+ const contentMatchScore = calculateContentMatch(chunk.content, queryKeywords);
34
+ const symbolMatchScore = calculateSymbolMatch(chunk.content, querySymbols);
35
+ const fileTypeBoost = calculateFileTypeBoost(chunk.filePath);
36
+ const baseScore = WEIGHTS.similarity * similarityScore +
37
+ WEIGHTS.pathMatch * pathMatchScore +
38
+ WEIGHTS.contentMatch * contentMatchScore +
39
+ WEIGHTS.symbolMatch * symbolMatchScore +
40
+ WEIGHTS.fileTypeBoost * fileTypeBoost;
41
+ return {
42
+ chunk,
43
+ baseScore,
44
+ similarityScore,
45
+ pathMatchScore,
46
+ contentMatchScore,
47
+ symbolMatchScore,
48
+ fileTypeBoost,
49
+ };
50
+ });
51
+ // Sort by base score to find top files
52
+ initialScores.sort((a, b) => b.baseScore - a.baseScore);
53
+ // Calculate import boosts if import graph is provided
54
+ const importBoosts = calculateImportBoosts(initialScores, options.importGraph);
55
+ // Second pass: apply import boosts and create final ranked chunks
56
+ const ranked = initialScores.map(({ chunk, baseScore, similarityScore, pathMatchScore, contentMatchScore, symbolMatchScore, fileTypeBoost, }) => {
57
+ const importBoost = importBoosts.get(chunk.filePath) || 0;
58
+ const score = baseScore + WEIGHTS.importBoost * importBoost;
35
59
  return {
36
60
  ...chunk,
37
61
  score,
38
62
  scoreBreakdown: {
39
63
  similarity: similarityScore,
40
- recency: recencyScore,
41
64
  pathMatch: pathMatchScore,
65
+ contentMatch: contentMatchScore,
66
+ symbolMatch: symbolMatchScore,
67
+ fileTypeBoost: fileTypeBoost,
68
+ importBoost: importBoost,
42
69
  },
43
70
  };
44
71
  });
45
72
  // Sort by final score descending
46
73
  ranked.sort((a, b) => b.score - a.score);
74
+ // Apply diversity penalty if enabled
75
+ if (options.diversityPenalty) {
76
+ return applyDiversityPenalty(ranked);
77
+ }
47
78
  return ranked;
48
79
  }
49
80
  /**
50
- * Extract keywords from query for path matching
81
+ * Calculate import boosts for files based on their relationship to top-scoring files
82
+ *
83
+ * If a top-scoring file imports another file, that file gets a boost.
84
+ * Boost decays based on how far from top the importer is.
85
+ */
86
+ function calculateImportBoosts(scoredChunks, importGraph) {
87
+ const boosts = new Map();
88
+ if (!importGraph) {
89
+ return boosts;
90
+ }
91
+ // Get unique files from top chunks (consider top 20 as "selected")
92
+ const topFiles = new Set();
93
+ const fileScores = new Map();
94
+ for (const { chunk, baseScore } of scoredChunks.slice(0, 20)) {
95
+ if (!topFiles.has(chunk.filePath)) {
96
+ topFiles.add(chunk.filePath);
97
+ fileScores.set(chunk.filePath, baseScore);
98
+ }
99
+ }
100
+ // For each top file, boost its imports
101
+ for (const filePath of topFiles) {
102
+ const fileScore = fileScores.get(filePath) || 0;
103
+ const imports = importGraph.imports.get(filePath) || [];
104
+ for (const importedFile of imports) {
105
+ // Boost proportional to the importer's score
106
+ // Higher scoring importers give stronger boosts
107
+ const boost = Math.min(fileScore, 1.0);
108
+ const currentBoost = boosts.get(importedFile) || 0;
109
+ // Take max boost if multiple files import the same file
110
+ boosts.set(importedFile, Math.max(currentBoost, boost));
111
+ }
112
+ }
113
+ return boosts;
114
+ }
115
+ /**
116
+ * Apply diversity penalty to avoid too many chunks from same file
117
+ */
118
+ function applyDiversityPenalty(chunks) {
119
+ const fileChunkCount = new Map();
120
+ const PENALTY_PER_DUPLICATE = 0.1;
121
+ const MAX_PENALTY = 0.3;
122
+ return chunks.map((chunk) => {
123
+ const count = fileChunkCount.get(chunk.filePath) || 0;
124
+ fileChunkCount.set(chunk.filePath, count + 1);
125
+ if (count > 0) {
126
+ const penalty = Math.min(count * PENALTY_PER_DUPLICATE, MAX_PENALTY);
127
+ return {
128
+ ...chunk,
129
+ score: chunk.score * (1 - penalty),
130
+ };
131
+ }
132
+ return chunk;
133
+ }).sort((a, b) => b.score - a.score);
134
+ }
135
+ /**
136
+ * Extract keywords from query for matching
51
137
  */
52
138
  function extractKeywords(query) {
53
139
  return query
@@ -56,6 +142,24 @@ function extractKeywords(query) {
56
142
  .filter((word) => word.length > 2)
57
143
  .filter((word) => !STOP_WORDS.has(word));
58
144
  }
145
+ /**
146
+ * Extract potential code symbols from query (camelCase, snake_case, etc.)
147
+ */
148
+ function extractSymbols(query) {
149
+ const symbols = [];
150
+ // Match camelCase, PascalCase, snake_case patterns
151
+ const symbolPattern = /[a-zA-Z_][a-zA-Z0-9_]*(?:[A-Z][a-z0-9]*)+|[a-z]+(?:_[a-z0-9]+)+/g;
152
+ const matches = query.match(symbolPattern) || [];
153
+ symbols.push(...matches.map(s => s.toLowerCase()));
154
+ // Also include any word that looks like a function/variable name (>4 chars, no spaces)
155
+ const words = query.split(/\s+/);
156
+ for (const word of words) {
157
+ if (word.length > 4 && /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(word)) {
158
+ symbols.push(word.toLowerCase());
159
+ }
160
+ }
161
+ return [...new Set(symbols)];
162
+ }
59
163
  /**
60
164
  * Calculate path match score (0-1)
61
165
  */
@@ -71,7 +175,104 @@ function calculatePathMatch(filePath, keywords) {
71
175
  }
72
176
  return matches / keywords.length;
73
177
  }
74
- /** Common words to ignore in path matching */
178
+ /**
179
+ * Calculate content keyword match score (0-1)
180
+ * Looks for exact keyword matches in content
181
+ */
182
+ function calculateContentMatch(content, keywords) {
183
+ if (keywords.length === 0)
184
+ return 0;
185
+ let matches = 0;
186
+ let totalWeight = 0;
187
+ for (const keyword of keywords) {
188
+ // Count occurrences (capped at 5 for normalization)
189
+ const regex = new RegExp(`\\b${escapeRegex(keyword)}\\b`, 'gi');
190
+ const occurrences = (content.match(regex) || []).length;
191
+ if (occurrences > 0) {
192
+ matches++;
193
+ // Bonus for multiple occurrences (diminishing returns)
194
+ totalWeight += Math.min(occurrences, 5) / 5;
195
+ }
196
+ }
197
+ // Combine match ratio and occurrence weight
198
+ const matchRatio = matches / keywords.length;
199
+ const avgWeight = matches > 0 ? totalWeight / matches : 0;
200
+ return matchRatio * 0.7 + avgWeight * 0.3;
201
+ }
202
+ /**
203
+ * Calculate code symbol match score (0-1)
204
+ * Looks for function names, class names, etc.
205
+ */
206
+ function calculateSymbolMatch(content, symbols) {
207
+ if (symbols.length === 0)
208
+ return 0;
209
+ let matches = 0;
210
+ // Common code patterns to look for
211
+ const patterns = [
212
+ /function\s+(\w+)/gi, // function declarations
213
+ /const\s+(\w+)\s*=/gi, // const assignments
214
+ /class\s+(\w+)/gi, // class declarations
215
+ /export\s+(?:async\s+)?function\s+(\w+)/gi, // exported functions
216
+ /export\s+const\s+(\w+)/gi, // exported consts
217
+ /(\w+)\s*[:=]\s*(?:async\s+)?\(/gi, // method/property functions
218
+ ];
219
+ // Extract all symbols from content
220
+ const contentSymbols = new Set();
221
+ for (const pattern of patterns) {
222
+ let match;
223
+ while ((match = pattern.exec(content)) !== null) {
224
+ contentSymbols.add(match[1].toLowerCase());
225
+ }
226
+ }
227
+ // Check for matches
228
+ for (const symbol of symbols) {
229
+ if (contentSymbols.has(symbol)) {
230
+ matches++;
231
+ }
232
+ else {
233
+ // Partial match (symbol is substring of content symbol or vice versa)
234
+ for (const contentSymbol of contentSymbols) {
235
+ if (contentSymbol.includes(symbol) || symbol.includes(contentSymbol)) {
236
+ matches += 0.5;
237
+ break;
238
+ }
239
+ }
240
+ }
241
+ }
242
+ return Math.min(matches / symbols.length, 1);
243
+ }
244
+ /**
245
+ * Calculate file type boost (0-1)
246
+ * Prioritizes implementation files over tests, configs, etc.
247
+ */
248
+ function calculateFileTypeBoost(filePath) {
249
+ const pathLower = filePath.toLowerCase();
250
+ // Test files - lower priority
251
+ if (pathLower.includes('.test.') || pathLower.includes('.spec.') || pathLower.includes('__tests__')) {
252
+ return 0.3;
253
+ }
254
+ // Config/setup files - lower priority
255
+ if (pathLower.includes('config') || pathLower.includes('setup') || pathLower.endsWith('.json')) {
256
+ return 0.4;
257
+ }
258
+ // Type definition files
259
+ if (pathLower.endsWith('.d.ts')) {
260
+ return 0.5;
261
+ }
262
+ // Index/barrel files - medium priority
263
+ if (pathLower.endsWith('/index.ts') || pathLower.endsWith('/index.js')) {
264
+ return 0.6;
265
+ }
266
+ // Core implementation files - highest priority
267
+ return 1.0;
268
+ }
269
+ /**
270
+ * Escape special regex characters
271
+ */
272
+ function escapeRegex(str) {
273
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
274
+ }
275
+ /** Common words to ignore in matching */
75
276
  const STOP_WORDS = new Set([
76
277
  'the',
77
278
  'a',
@@ -109,5 +310,71 @@ const STOP_WORDS = new Set([
109
310
  'to',
110
311
  'in',
111
312
  'on',
313
+ 'work',
314
+ 'works',
315
+ 'working',
316
+ 'use',
317
+ 'using',
318
+ 'used',
319
+ 'can',
320
+ 'could',
321
+ 'would',
322
+ 'should',
323
+ 'will',
324
+ 'get',
325
+ 'set',
326
+ 'make',
327
+ 'find',
328
+ 'show',
329
+ 'tell',
330
+ 'want',
331
+ 'need',
332
+ 'code',
333
+ 'file',
334
+ 'function',
112
335
  ]);
336
+ /**
337
+ * Build an import graph from a dependency map
338
+ */
339
+ export function buildImportGraph(dependencyMap) {
340
+ const imports = new Map();
341
+ const importedBy = new Map();
342
+ for (const [file, deps] of dependencyMap) {
343
+ imports.set(file, deps);
344
+ for (const dep of deps) {
345
+ const existing = importedBy.get(dep) || [];
346
+ if (!existing.includes(file)) {
347
+ existing.push(file);
348
+ }
349
+ importedBy.set(dep, existing);
350
+ }
351
+ }
352
+ return { imports, importedBy };
353
+ }
354
+ /**
355
+ * Get files that should be included based on imports from selected files
356
+ */
357
+ export function getRelatedImports(selectedFiles, importGraph, options = {}) {
358
+ const maxDepth = options.maxDepth ?? 1;
359
+ const related = new Set();
360
+ const visited = new Set(selectedFiles);
361
+ let currentLevel = selectedFiles;
362
+ for (let depth = 0; depth < maxDepth; depth++) {
363
+ const nextLevel = [];
364
+ for (const file of currentLevel) {
365
+ const imports = importGraph.imports.get(file) || [];
366
+ for (const importedFile of imports) {
367
+ if (!visited.has(importedFile)) {
368
+ visited.add(importedFile);
369
+ related.add(importedFile);
370
+ nextLevel.push(importedFile);
371
+ }
372
+ }
373
+ }
374
+ currentLevel = nextLevel;
375
+ if (currentLevel.length === 0)
376
+ break;
377
+ }
378
+ return Array.from(related);
379
+ }
113
380
  //# 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.5.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",
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const sourceCommand: Command;
3
- //# sourceMappingURL=source.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,aAAa,SAKtB,CAAC"}
@@ -1,153 +0,0 @@
1
- import { Command } from 'commander';
2
- import { existsSync, statSync } from 'fs';
3
- import { resolve, relative, basename } from 'path';
4
- import chalk from 'chalk';
5
- import fg from 'fast-glob';
6
- import { loadConfig, saveConfig, ensureInitialized } from '../config/index.js';
7
- import { output } from '../utils/output.js';
8
- export const sourceCommand = new Command('source')
9
- .description('Manage sources')
10
- .action(() => {
11
- // Show subcommand help when no subcommand given
12
- sourceCommand.help();
13
- });
14
- // source add
15
- sourceCommand
16
- .command('add <path>')
17
- .description('Add a directory as a source')
18
- .option('-n, --name <name>', 'Custom name for the source')
19
- .option('-i, --include <patterns...>', 'Include patterns (glob)')
20
- .option('-e, --exclude <patterns...>', 'Exclude patterns (glob)')
21
- .action(async (path, options) => {
22
- ensureInitialized();
23
- const absolutePath = resolve(process.cwd(), path);
24
- const relativePath = './' + relative(process.cwd(), absolutePath);
25
- // Validate path exists
26
- if (!existsSync(absolutePath)) {
27
- output.error('Path not found');
28
- // Try to suggest similar paths
29
- const parent = resolve(absolutePath, '..');
30
- if (existsSync(parent)) {
31
- const entries = fg.sync(['*'], { cwd: parent, onlyDirectories: true });
32
- const similar = entries.filter((e) => e.toLowerCase().includes(basename(path).toLowerCase()));
33
- if (similar.length > 0) {
34
- console.error(`Did you mean '${similar[0]}'?`);
35
- }
36
- }
37
- process.exit(1);
38
- }
39
- // Validate it's a directory
40
- if (!statSync(absolutePath).isDirectory()) {
41
- output.error('Not a directory');
42
- console.error(`'${path}' is a file, not a directory.`);
43
- process.exit(1);
44
- }
45
- // Load config
46
- const config = loadConfig();
47
- // Generate source ID
48
- const sourceId = options.name || basename(absolutePath);
49
- // Check for duplicates
50
- const existing = config.sources.find((s) => s.id === sourceId);
51
- if (existing) {
52
- output.error('Source already exists');
53
- console.error(`A source named '${sourceId}' already exists.`);
54
- console.error(`Use a different name with ${chalk.cyan('--name')}`);
55
- process.exit(1);
56
- }
57
- // Count files
58
- const defaultInclude = ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx', '**/*.md', '**/*.json'];
59
- const defaultExclude = ['**/node_modules/**', '**/dist/**', '**/.git/**'];
60
- const include = options.include || defaultInclude;
61
- const exclude = options.exclude || defaultExclude;
62
- const files = fg.sync(include, {
63
- cwd: absolutePath,
64
- ignore: exclude,
65
- onlyFiles: true,
66
- });
67
- // Create source entry
68
- const source = {
69
- id: sourceId,
70
- path: relativePath,
71
- patterns: {
72
- include,
73
- exclude,
74
- },
75
- };
76
- // Add to config
77
- config.sources.push(source);
78
- saveConfig(config);
79
- // Output
80
- output.success(`Added source '${chalk.cyan(sourceId)}'`);
81
- console.log(` Path: ${relativePath}`);
82
- console.log(` Files: ${files.length} (${getFileExtensions(files)})`);
83
- console.log();
84
- console.log(`Run ${chalk.cyan('contextkit index')} to index this source.`);
85
- });
86
- // source list
87
- sourceCommand
88
- .command('list')
89
- .description('List configured sources')
90
- .action(() => {
91
- ensureInitialized();
92
- const config = loadConfig();
93
- const opts = sourceCommand.parent?.opts() || {};
94
- if (config.sources.length === 0) {
95
- if (opts.json) {
96
- console.log(JSON.stringify({ sources: [] }));
97
- }
98
- else {
99
- console.log('No sources configured.');
100
- console.log(`Add one with ${chalk.cyan('contextkit source add <path>')}`);
101
- }
102
- return;
103
- }
104
- if (opts.json) {
105
- console.log(JSON.stringify({ sources: config.sources }, null, 2));
106
- return;
107
- }
108
- if (opts.plain) {
109
- for (const source of config.sources) {
110
- console.log(`${source.id}\t${source.path}`);
111
- }
112
- return;
113
- }
114
- // Table output
115
- console.log();
116
- console.log(chalk.bold('Sources:'));
117
- console.log(` ${chalk.gray('NAME'.padEnd(15))} ${chalk.gray('PATH')}`);
118
- for (const source of config.sources) {
119
- console.log(` ${source.id.padEnd(15)} ${source.path}`);
120
- }
121
- console.log();
122
- console.log(`Total: ${config.sources.length} source${config.sources.length === 1 ? '' : 's'}`);
123
- });
124
- // source remove
125
- sourceCommand
126
- .command('remove <name>')
127
- .alias('rm')
128
- .description('Remove a source')
129
- .action((name) => {
130
- ensureInitialized();
131
- const config = loadConfig();
132
- const index = config.sources.findIndex((s) => s.id === name);
133
- if (index === -1) {
134
- output.error('Source not found');
135
- console.error(`No source named '${name}'.`);
136
- console.error(`Run ${chalk.cyan('contextkit source list')} to see available sources.`);
137
- process.exit(1);
138
- }
139
- config.sources.splice(index, 1);
140
- saveConfig(config);
141
- output.success(`Removed source '${chalk.cyan(name)}'`);
142
- console.log(`Run ${chalk.cyan('contextkit index')} to update the index.`);
143
- });
144
- function getFileExtensions(files) {
145
- const exts = new Set();
146
- for (const file of files) {
147
- const ext = file.split('.').pop();
148
- if (ext)
149
- exts.add(ext);
150
- }
151
- return Array.from(exts).slice(0, 5).join(', ') + (exts.size > 5 ? '...' : '');
152
- }
153
- //# sourceMappingURL=source.js.map