@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.
- package/README.md +269 -72
- 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/select.d.ts.map +1 -1
- package/dist/commands/select.js +15 -9
- package/dist/commands/select.js.map +1 -1
- 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/config/index.d.ts +11 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/validation.d.ts +33 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +241 -0
- package/dist/config/validation.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/retrieval/imports.d.ts +76 -0
- package/dist/retrieval/imports.d.ts.map +1 -0
- package/dist/retrieval/imports.js +258 -0
- package/dist/retrieval/imports.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 +15 -0
- package/dist/selector/formatter.d.ts.map +1 -1
- package/dist/selector/formatter.js +139 -5
- package/dist/selector/formatter.js.map +1 -1
- package/dist/selector/index.d.ts +11 -4
- package/dist/selector/index.d.ts.map +1 -1
- package/dist/selector/index.js +67 -12
- package/dist/selector/index.js.map +1 -1
- package/dist/selector/scoring.d.ts +35 -5
- package/dist/selector/scoring.d.ts.map +1 -1
- package/dist/selector/scoring.js +290 -23
- 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/commands/source.d.ts +0 -3
- package/dist/commands/source.d.ts.map +0 -1
- package/dist/commands/source.js +0 -153
- package/dist/commands/source.js.map +0 -1
- package/dist/utils/output.d.ts +0 -42
- package/dist/utils/output.d.ts.map +0 -1
- package/dist/utils/output.js +0 -62
- package/dist/utils/output.js.map +0 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch Command
|
|
3
|
+
*
|
|
4
|
+
* Watches source directories and auto-reindexes on changes.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import chokidar from 'chokidar';
|
|
8
|
+
import { resolve, relative } from 'path';
|
|
9
|
+
import { loadConfig, ensureInitialized } from '../config/index.js';
|
|
10
|
+
import { openDatabase } from '../db/index.js';
|
|
11
|
+
import { indexSources } from '../indexer/index.js';
|
|
12
|
+
import { writeMessage, writeSuccess, writeWarning, writeDim } from '../utils/streams.js';
|
|
13
|
+
import { formatHighlight, formatDim } from '../utils/format.js';
|
|
14
|
+
/** Default debounce time in milliseconds */
|
|
15
|
+
const DEFAULT_DEBOUNCE_MS = 1000;
|
|
16
|
+
export const watchCommand = new Command('watch')
|
|
17
|
+
.description('Watch sources and auto-reindex on changes')
|
|
18
|
+
.option('-d, --debounce <ms>', 'Debounce time in milliseconds', String(DEFAULT_DEBOUNCE_MS))
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
ensureInitialized();
|
|
21
|
+
const config = loadConfig();
|
|
22
|
+
const debounceMs = parseInt(options.debounce) || DEFAULT_DEBOUNCE_MS;
|
|
23
|
+
if (config.sources.length === 0) {
|
|
24
|
+
writeWarning('No sources configured');
|
|
25
|
+
writeMessage('Add sources first with: contextkit source add <path>');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const cwd = process.cwd();
|
|
29
|
+
// Build watch patterns from sources
|
|
30
|
+
const watchPaths = [];
|
|
31
|
+
for (const source of config.sources) {
|
|
32
|
+
const sourcePath = resolve(cwd, source.path);
|
|
33
|
+
watchPaths.push(sourcePath);
|
|
34
|
+
}
|
|
35
|
+
writeMessage('');
|
|
36
|
+
writeMessage(`${formatHighlight('👁️ Watching')} ${config.sources.length} source(s) for changes...`);
|
|
37
|
+
writeMessage(formatDim(` Debounce: ${debounceMs}ms`));
|
|
38
|
+
writeMessage('');
|
|
39
|
+
for (const source of config.sources) {
|
|
40
|
+
writeMessage(` • ${source.id}: ${source.path}`);
|
|
41
|
+
}
|
|
42
|
+
writeMessage('');
|
|
43
|
+
writeMessage(formatDim('Press Ctrl+C to stop watching.'));
|
|
44
|
+
writeMessage('');
|
|
45
|
+
// Track pending changes
|
|
46
|
+
const pendingChanges = new Set();
|
|
47
|
+
let debounceTimer = null;
|
|
48
|
+
let isIndexing = false;
|
|
49
|
+
/**
|
|
50
|
+
* Run indexing for pending changes
|
|
51
|
+
*/
|
|
52
|
+
async function runIndex() {
|
|
53
|
+
if (isIndexing)
|
|
54
|
+
return;
|
|
55
|
+
if (pendingChanges.size === 0)
|
|
56
|
+
return;
|
|
57
|
+
isIndexing = true;
|
|
58
|
+
const changedFiles = Array.from(pendingChanges);
|
|
59
|
+
pendingChanges.clear();
|
|
60
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
61
|
+
writeMessage(`${formatDim(`[${timestamp}]`)} Detected ${changedFiles.length} change(s), reindexing...`);
|
|
62
|
+
const db = openDatabase();
|
|
63
|
+
try {
|
|
64
|
+
const stats = await indexSources(config.sources, cwd, db, {
|
|
65
|
+
chunkSize: config.settings.chunk_size,
|
|
66
|
+
chunkOverlap: config.settings.chunk_overlap,
|
|
67
|
+
});
|
|
68
|
+
if (stats.filesChanged > 0) {
|
|
69
|
+
writeSuccess(`Indexed ${stats.filesChanged} changed file(s) → ${stats.chunks} chunks`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
writeMessage(formatDim('No changes detected.'));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
writeWarning(`Index error: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
db.close();
|
|
80
|
+
isIndexing = false;
|
|
81
|
+
// If more changes accumulated while indexing, run again
|
|
82
|
+
if (pendingChanges.size > 0) {
|
|
83
|
+
scheduleIndex();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Schedule an index run with debouncing
|
|
89
|
+
*/
|
|
90
|
+
function scheduleIndex() {
|
|
91
|
+
if (debounceTimer) {
|
|
92
|
+
clearTimeout(debounceTimer);
|
|
93
|
+
}
|
|
94
|
+
debounceTimer = setTimeout(runIndex, debounceMs);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle file change event
|
|
98
|
+
*/
|
|
99
|
+
function handleChange(filePath, eventType) {
|
|
100
|
+
// Get relative path for display
|
|
101
|
+
const relPath = relative(cwd, filePath);
|
|
102
|
+
// Check if file matches any source patterns
|
|
103
|
+
let matchesSource = false;
|
|
104
|
+
for (const source of config.sources) {
|
|
105
|
+
const sourcePath = resolve(cwd, source.path);
|
|
106
|
+
if (filePath.startsWith(sourcePath)) {
|
|
107
|
+
// Check include patterns
|
|
108
|
+
for (const pattern of source.patterns.include) {
|
|
109
|
+
// Simple check - could be more sophisticated
|
|
110
|
+
const ext = pattern.replace('**/*', '').replace('*', '');
|
|
111
|
+
if (filePath.endsWith(ext) || pattern === '**/*') {
|
|
112
|
+
matchesSource = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check exclude patterns
|
|
117
|
+
if (matchesSource) {
|
|
118
|
+
for (const pattern of source.patterns.exclude) {
|
|
119
|
+
if (pattern.includes('node_modules') && filePath.includes('node_modules')) {
|
|
120
|
+
matchesSource = false;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
if (pattern.includes('.test.') && filePath.includes('.test.')) {
|
|
124
|
+
matchesSource = false;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (matchesSource)
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
if (matchesSource) {
|
|
134
|
+
pendingChanges.add(filePath);
|
|
135
|
+
writeDim(` ${eventType}: ${relPath}`);
|
|
136
|
+
scheduleIndex();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Setup file watcher
|
|
140
|
+
const watcher = chokidar.watch(watchPaths, {
|
|
141
|
+
ignored: [
|
|
142
|
+
'**/node_modules/**',
|
|
143
|
+
'**/.git/**',
|
|
144
|
+
'**/.contextkit/**',
|
|
145
|
+
'**/dist/**',
|
|
146
|
+
'**/build/**',
|
|
147
|
+
'**/*.test.*',
|
|
148
|
+
'**/*.spec.*',
|
|
149
|
+
],
|
|
150
|
+
persistent: true,
|
|
151
|
+
ignoreInitial: true,
|
|
152
|
+
awaitWriteFinish: {
|
|
153
|
+
stabilityThreshold: 100,
|
|
154
|
+
pollInterval: 100,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
watcher
|
|
158
|
+
.on('add', (path) => handleChange(path, 'added'))
|
|
159
|
+
.on('change', (path) => handleChange(path, 'changed'))
|
|
160
|
+
.on('unlink', (path) => handleChange(path, 'removed'));
|
|
161
|
+
// Handle graceful shutdown
|
|
162
|
+
process.on('SIGINT', () => {
|
|
163
|
+
writeMessage('');
|
|
164
|
+
writeMessage('Stopping watch...');
|
|
165
|
+
watcher.close();
|
|
166
|
+
process.exit(0);
|
|
167
|
+
});
|
|
168
|
+
// Keep process running
|
|
169
|
+
await new Promise(() => { });
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,4CAA4C;AAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;KAC3F,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,iBAAiB,EAAE,CAAC;IAEpB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC;IAErE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QACtC,YAAY,CAAC,sDAAsD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,oCAAoC;IACpC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,YAAY,CAAC,GAAG,eAAe,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,2BAA2B,CAAC,CAAC;IACtG,YAAY,CAAC,SAAS,CAAC,gBAAgB,UAAU,IAAI,CAAC,CAAC,CAAC;IACxD,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,YAAY,CAAC,QAAQ,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,YAAY,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,wBAAwB;IACxB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB;;OAEG;IACH,KAAK,UAAU,QAAQ;QACrB,IAAI,UAAU;YAAE,OAAO;QACvB,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAEtC,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,cAAc,CAAC,KAAK,EAAE,CAAC;QAEvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAClD,YAAY,CAAC,GAAG,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,aAAa,YAAY,CAAC,MAAM,2BAA2B,CAAC,CAAC;QAExG,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,MAAM,CAAC,OAAO,EACd,GAAG,EACH,EAAE,EACF;gBACE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;gBACrC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;aAC5C,CACF,CAAC;YAEF,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC3B,YAAY,CAAC,WAAW,KAAK,CAAC,YAAY,sBAAsB,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YACzF,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,GAAG,KAAK,CAAC;YAEnB,wDAAwD;YACxD,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5B,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,aAAa;QACpB,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QACD,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,SAAS,YAAY,CAAC,QAAgB,EAAE,SAAiB;QACvD,gCAAgC;QAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAExC,4CAA4C;QAC5C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,yBAAyB;gBACzB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBAC9C,6CAA6C;oBAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACzD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;wBACjD,aAAa,GAAG,IAAI,CAAC;wBACrB,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,yBAAyB;gBACzB,IAAI,aAAa,EAAE,CAAC;oBAClB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;4BAC1E,aAAa,GAAG,KAAK,CAAC;4BACtB,MAAM;wBACR,CAAC;wBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC9D,aAAa,GAAG,KAAK,CAAC;4BACtB,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,aAAa;gBAAE,MAAM;QAC3B,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,QAAQ,CAAC,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;YACxC,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;QACzC,OAAO,EAAE;YACP,oBAAoB;YACpB,YAAY;YACZ,mBAAmB;YACnB,YAAY;YACZ,aAAa;YACb,aAAa;YACb,aAAa;SACd;QACD,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,GAAG;YACvB,YAAY,EAAE,GAAG;SAClB;KACF,CAAC,CAAC;IAEH,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SAChD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SACrD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzD,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,YAAY,CAAC,EAAE,CAAC,CAAC;QACjB,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Config } from './types.js';
|
|
2
|
+
import { type ValidationResult } from './validation.js';
|
|
2
3
|
export declare const CONFIG_FILE = "config.yaml";
|
|
3
4
|
export declare const INDEX_DB = "index.db";
|
|
4
5
|
export declare const CONTEXTKIT_DIR = ".contextkit";
|
|
@@ -34,5 +35,15 @@ export declare function saveConfig(config: Config): void;
|
|
|
34
35
|
* Get the default configuration as YAML string
|
|
35
36
|
*/
|
|
36
37
|
export declare function getDefaultConfig(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Load and validate the configuration file
|
|
40
|
+
* Returns both the config and validation result
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadAndValidateConfig(): {
|
|
43
|
+
config: Config;
|
|
44
|
+
validation: ValidationResult;
|
|
45
|
+
};
|
|
37
46
|
export type { Config, Source, Settings } from './types.js';
|
|
47
|
+
export { validateConfig, formatValidationResults } from './validation.js';
|
|
48
|
+
export type { ValidationResult, ValidationError, ValidationWarning } from './validation.js';
|
|
38
49
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAgBnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAiCzC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,CAIxF;AAED,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/config/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { parse, stringify } from 'yaml';
|
|
4
4
|
import { NotInitializedError } from '../errors/index.js';
|
|
5
|
+
import { validateConfig } from './validation.js';
|
|
5
6
|
export const CONFIG_FILE = 'config.yaml';
|
|
6
7
|
export const INDEX_DB = 'index.db';
|
|
7
8
|
export const CONTEXTKIT_DIR = '.contextkit';
|
|
@@ -97,4 +98,14 @@ settings:
|
|
|
97
98
|
chunk_overlap: ${config.settings.chunk_overlap}
|
|
98
99
|
`;
|
|
99
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Load and validate the configuration file
|
|
103
|
+
* Returns both the config and validation result
|
|
104
|
+
*/
|
|
105
|
+
export function loadAndValidateConfig() {
|
|
106
|
+
const config = loadConfig();
|
|
107
|
+
const validation = validateConfig(config, process.cwd());
|
|
108
|
+
return { config, validation };
|
|
109
|
+
}
|
|
110
|
+
export { validateConfig, formatValidationResults } from './validation.js';
|
|
100
111
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Validation Module
|
|
3
|
+
*
|
|
4
|
+
* Validates config.yaml and provides helpful error messages.
|
|
5
|
+
*/
|
|
6
|
+
import type { Config } from './types.js';
|
|
7
|
+
/** Validation result */
|
|
8
|
+
export interface ValidationResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
errors: ValidationError[];
|
|
11
|
+
warnings: ValidationWarning[];
|
|
12
|
+
}
|
|
13
|
+
/** Validation error (config won't work) */
|
|
14
|
+
export interface ValidationError {
|
|
15
|
+
path: string;
|
|
16
|
+
message: string;
|
|
17
|
+
suggestion?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Validation warning (config might have issues) */
|
|
20
|
+
export interface ValidationWarning {
|
|
21
|
+
path: string;
|
|
22
|
+
message: string;
|
|
23
|
+
suggestion?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate the entire config
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateConfig(config: Config, baseDir: string): ValidationResult;
|
|
29
|
+
/**
|
|
30
|
+
* Format validation results for display
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatValidationResults(result: ValidationResult): string;
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAoB,MAAM,YAAY,CAAC;AAE3D,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAwDhF;AA2JD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA6BxE"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Validation Module
|
|
3
|
+
*
|
|
4
|
+
* Validates config.yaml and provides helpful error messages.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { resolve } from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* Validate the entire config
|
|
10
|
+
*/
|
|
11
|
+
export function validateConfig(config, baseDir) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
const warnings = [];
|
|
14
|
+
// Validate version
|
|
15
|
+
if (typeof config.version !== 'number') {
|
|
16
|
+
errors.push({
|
|
17
|
+
path: 'version',
|
|
18
|
+
message: 'Version must be a number',
|
|
19
|
+
suggestion: 'Set version: 1',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Validate sources
|
|
23
|
+
if (!Array.isArray(config.sources)) {
|
|
24
|
+
errors.push({
|
|
25
|
+
path: 'sources',
|
|
26
|
+
message: 'Sources must be an array',
|
|
27
|
+
suggestion: 'Add sources: [] to your config',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Validate each source
|
|
32
|
+
const sourceIds = new Set();
|
|
33
|
+
for (let i = 0; i < config.sources.length; i++) {
|
|
34
|
+
const source = config.sources[i];
|
|
35
|
+
const sourcePath = `sources[${i}]`;
|
|
36
|
+
const sourceResult = validateSource(source, sourcePath, baseDir, sourceIds);
|
|
37
|
+
errors.push(...sourceResult.errors);
|
|
38
|
+
warnings.push(...sourceResult.warnings);
|
|
39
|
+
if (source.id) {
|
|
40
|
+
sourceIds.add(source.id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Validate settings
|
|
45
|
+
if (config.settings) {
|
|
46
|
+
const settingsResult = validateSettings(config.settings);
|
|
47
|
+
errors.push(...settingsResult.errors);
|
|
48
|
+
warnings.push(...settingsResult.warnings);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
warnings.push({
|
|
52
|
+
path: 'settings',
|
|
53
|
+
message: 'Settings not specified, using defaults',
|
|
54
|
+
suggestion: 'Add settings: { chunk_size: 500, chunk_overlap: 50 }',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
valid: errors.length === 0,
|
|
59
|
+
errors,
|
|
60
|
+
warnings,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate a source configuration
|
|
65
|
+
*/
|
|
66
|
+
function validateSource(source, path, baseDir, existingIds) {
|
|
67
|
+
const errors = [];
|
|
68
|
+
const warnings = [];
|
|
69
|
+
// Validate id
|
|
70
|
+
if (!source.id || typeof source.id !== 'string') {
|
|
71
|
+
errors.push({
|
|
72
|
+
path: `${path}.id`,
|
|
73
|
+
message: 'Source must have a string id',
|
|
74
|
+
suggestion: 'Add id: "src" or similar',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else if (existingIds.has(source.id)) {
|
|
78
|
+
errors.push({
|
|
79
|
+
path: `${path}.id`,
|
|
80
|
+
message: `Duplicate source id "${source.id}"`,
|
|
81
|
+
suggestion: 'Each source must have a unique id',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if (!/^[a-zA-Z0-9_-]+$/.test(source.id)) {
|
|
85
|
+
warnings.push({
|
|
86
|
+
path: `${path}.id`,
|
|
87
|
+
message: `Source id "${source.id}" contains special characters`,
|
|
88
|
+
suggestion: 'Use only letters, numbers, dashes, and underscores',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Validate path
|
|
92
|
+
if (!source.path || typeof source.path !== 'string') {
|
|
93
|
+
errors.push({
|
|
94
|
+
path: `${path}.path`,
|
|
95
|
+
message: 'Source must have a path',
|
|
96
|
+
suggestion: 'Add path: "./src"',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Check if path exists
|
|
101
|
+
const absolutePath = resolve(baseDir, source.path);
|
|
102
|
+
if (!existsSync(absolutePath)) {
|
|
103
|
+
errors.push({
|
|
104
|
+
path: `${path}.path`,
|
|
105
|
+
message: `Path "${source.path}" does not exist`,
|
|
106
|
+
suggestion: `Create the directory or fix the path. Looking for: ${absolutePath}`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Validate patterns
|
|
111
|
+
if (!source.patterns) {
|
|
112
|
+
errors.push({
|
|
113
|
+
path: `${path}.patterns`,
|
|
114
|
+
message: 'Source must have patterns',
|
|
115
|
+
suggestion: 'Add patterns: { include: ["**/*.ts"], exclude: ["**/node_modules/**"] }',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Validate include patterns
|
|
120
|
+
if (!Array.isArray(source.patterns.include) || source.patterns.include.length === 0) {
|
|
121
|
+
errors.push({
|
|
122
|
+
path: `${path}.patterns.include`,
|
|
123
|
+
message: 'Include patterns must be a non-empty array',
|
|
124
|
+
suggestion: 'Add include: ["**/*.ts", "**/*.js"]',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
for (const pattern of source.patterns.include) {
|
|
129
|
+
if (typeof pattern !== 'string') {
|
|
130
|
+
errors.push({
|
|
131
|
+
path: `${path}.patterns.include`,
|
|
132
|
+
message: 'Include patterns must be strings',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Validate exclude patterns
|
|
138
|
+
if (!Array.isArray(source.patterns.exclude)) {
|
|
139
|
+
warnings.push({
|
|
140
|
+
path: `${path}.patterns.exclude`,
|
|
141
|
+
message: 'Exclude patterns should be an array',
|
|
142
|
+
suggestion: 'Add exclude: ["**/node_modules/**"]',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Check for common mistakes
|
|
147
|
+
const hasNodeModules = source.patterns.exclude.some(p => p.includes('node_modules'));
|
|
148
|
+
if (!hasNodeModules) {
|
|
149
|
+
warnings.push({
|
|
150
|
+
path: `${path}.patterns.exclude`,
|
|
151
|
+
message: 'node_modules is not excluded',
|
|
152
|
+
suggestion: 'Add "**/node_modules/**" to exclude patterns',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate settings
|
|
161
|
+
*/
|
|
162
|
+
function validateSettings(settings) {
|
|
163
|
+
const errors = [];
|
|
164
|
+
const warnings = [];
|
|
165
|
+
// Validate chunk_size
|
|
166
|
+
if (typeof settings.chunk_size !== 'number') {
|
|
167
|
+
errors.push({
|
|
168
|
+
path: 'settings.chunk_size',
|
|
169
|
+
message: 'chunk_size must be a number',
|
|
170
|
+
suggestion: 'Set chunk_size: 500',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else if (settings.chunk_size < 50) {
|
|
174
|
+
warnings.push({
|
|
175
|
+
path: 'settings.chunk_size',
|
|
176
|
+
message: `chunk_size ${settings.chunk_size} is very small`,
|
|
177
|
+
suggestion: 'Recommended: 300-800 tokens',
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (settings.chunk_size > 2000) {
|
|
181
|
+
warnings.push({
|
|
182
|
+
path: 'settings.chunk_size',
|
|
183
|
+
message: `chunk_size ${settings.chunk_size} is very large`,
|
|
184
|
+
suggestion: 'Recommended: 300-800 tokens',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Validate chunk_overlap
|
|
188
|
+
if (typeof settings.chunk_overlap !== 'number') {
|
|
189
|
+
errors.push({
|
|
190
|
+
path: 'settings.chunk_overlap',
|
|
191
|
+
message: 'chunk_overlap must be a number',
|
|
192
|
+
suggestion: 'Set chunk_overlap: 50',
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (settings.chunk_overlap < 0) {
|
|
196
|
+
errors.push({
|
|
197
|
+
path: 'settings.chunk_overlap',
|
|
198
|
+
message: 'chunk_overlap cannot be negative',
|
|
199
|
+
suggestion: 'Set chunk_overlap: 50',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else if (settings.chunk_overlap >= settings.chunk_size) {
|
|
203
|
+
errors.push({
|
|
204
|
+
path: 'settings.chunk_overlap',
|
|
205
|
+
message: 'chunk_overlap must be less than chunk_size',
|
|
206
|
+
suggestion: `Set chunk_overlap to less than ${settings.chunk_size}`,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Format validation results for display
|
|
213
|
+
*/
|
|
214
|
+
export function formatValidationResults(result) {
|
|
215
|
+
const lines = [];
|
|
216
|
+
if (result.errors.length > 0) {
|
|
217
|
+
lines.push('❌ Configuration Errors:');
|
|
218
|
+
for (const error of result.errors) {
|
|
219
|
+
lines.push(` • ${error.path}: ${error.message}`);
|
|
220
|
+
if (error.suggestion) {
|
|
221
|
+
lines.push(` → ${error.suggestion}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (result.warnings.length > 0) {
|
|
226
|
+
if (lines.length > 0)
|
|
227
|
+
lines.push('');
|
|
228
|
+
lines.push('⚠️ Warnings:');
|
|
229
|
+
for (const warning of result.warnings) {
|
|
230
|
+
lines.push(` • ${warning.path}: ${warning.message}`);
|
|
231
|
+
if (warning.suggestion) {
|
|
232
|
+
lines.push(` → ${warning.suggestion}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (result.valid && result.warnings.length === 0) {
|
|
237
|
+
lines.push('✅ Configuration is valid');
|
|
238
|
+
}
|
|
239
|
+
return lines.join('\n');
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA+CtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAU9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAKhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEzD"}
|
package/dist/db/index.js
CHANGED
|
@@ -14,8 +14,15 @@ CREATE TABLE IF NOT EXISTS sources (
|
|
|
14
14
|
indexed_at TIMESTAMP
|
|
15
15
|
);
|
|
16
16
|
|
|
17
|
-
--
|
|
18
|
-
|
|
17
|
+
-- Files table (for incremental indexing)
|
|
18
|
+
CREATE TABLE IF NOT EXISTS files (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
source_id TEXT NOT NULL REFERENCES sources(id) ON DELETE CASCADE,
|
|
21
|
+
file_path TEXT NOT NULL,
|
|
22
|
+
content_hash TEXT NOT NULL,
|
|
23
|
+
indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
24
|
+
UNIQUE(source_id, file_path)
|
|
25
|
+
);
|
|
19
26
|
|
|
20
27
|
-- Chunks table
|
|
21
28
|
CREATE TABLE IF NOT EXISTS chunks (
|
|
@@ -33,6 +40,8 @@ CREATE TABLE IF NOT EXISTS chunks (
|
|
|
33
40
|
-- Indexes for performance
|
|
34
41
|
CREATE INDEX IF NOT EXISTS idx_chunks_source ON chunks(source_id);
|
|
35
42
|
CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file_path);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_files_source ON files(source_id);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_files_path ON files(source_id, file_path);
|
|
36
45
|
`;
|
|
37
46
|
/**
|
|
38
47
|
* Initialize the database with schema
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,sBAAsB;IACtB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,gBAAgB;IAChB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import { initCommand } from './commands/init.js';
|
|
|
7
7
|
import { sourceCommand } from './commands/source/index.js';
|
|
8
8
|
import { indexCommand } from './commands/index-cmd.js';
|
|
9
9
|
import { selectCommand } from './commands/select.js';
|
|
10
|
+
import { mcpCommand } from './commands/mcp.js';
|
|
11
|
+
import { watchCommand } from './commands/watch.js';
|
|
10
12
|
import { ContextKitError, InvalidUsageError } from './errors/index.js';
|
|
11
13
|
import { writeError, writeMessage } from './utils/streams.js';
|
|
12
14
|
// Get version from package.json
|
|
@@ -60,6 +62,8 @@ program.addCommand(initCommand);
|
|
|
60
62
|
program.addCommand(sourceCommand);
|
|
61
63
|
program.addCommand(indexCommand);
|
|
62
64
|
program.addCommand(selectCommand);
|
|
65
|
+
program.addCommand(mcpCommand);
|
|
66
|
+
program.addCommand(watchCommand);
|
|
63
67
|
// Default action when no command given
|
|
64
68
|
program.action(() => {
|
|
65
69
|
console.log(`
|
|
@@ -74,8 +78,10 @@ Quick Start:
|
|
|
74
78
|
Commands:
|
|
75
79
|
init Initialize ContextKit in current directory
|
|
76
80
|
source Manage source directories
|
|
77
|
-
index Index all sources (
|
|
81
|
+
index Index all sources (incremental by default)
|
|
78
82
|
select Select context for a query
|
|
83
|
+
watch Watch sources and auto-reindex on changes
|
|
84
|
+
mcp Start MCP server for AI assistants
|
|
79
85
|
|
|
80
86
|
Global Options:
|
|
81
87
|
--json Output as JSON
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,gCAAgC;AAChC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACrF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAE5B,+BAA+B;AAC/B,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;GAEG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;QAEtF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,gDAAgD;IAChD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,YAAY,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,8BAA8B,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC;AAED,wBAAwB;AACxB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,qBAAqB,CAAC;KACxD,kBAAkB,EAAE;KACpB,aAAa,CAAC;IACb,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;CACpC,CAAC,CAAC;AAEL,iBAAiB;AACjB,OAAO;KACJ,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;KACxD,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;AAEtD,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,uCAAuC;AACvC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBb,CAAC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* File Discovery Module
|
|
3
3
|
*
|
|
4
4
|
* Discovers files in sources based on include/exclude patterns.
|
|
5
|
+
* Supports incremental indexing via content hashing.
|
|
5
6
|
*/
|
|
6
7
|
import type { Source } from '../config/types.js';
|
|
7
8
|
/** File info returned by discovery */
|
|
@@ -16,7 +17,13 @@ export interface DiscoveredFile {
|
|
|
16
17
|
content: string;
|
|
17
18
|
/** File size in bytes */
|
|
18
19
|
size: number;
|
|
20
|
+
/** Content hash (SHA-256) for change detection */
|
|
21
|
+
contentHash: string;
|
|
19
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Compute SHA-256 hash of content
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeContentHash(content: string): string;
|
|
20
27
|
/** Discovery result for a source */
|
|
21
28
|
export interface DiscoveryResult {
|
|
22
29
|
sourceId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/indexer/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAsD9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAEtF"}
|