@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
@@ -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":"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"}
@@ -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;AAEzC,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,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,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"}
@@ -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
@@ -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;AAGzD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAW,CAAC;IAExC,8BAA8B;IAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAW;QACrB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE;YACR,UAAU,EAAE,GAAG;YACf,aAAa,EAAE,EAAE;SAClB;KACF,CAAC;IAEF,OAAO;;;WAGE,MAAM,CAAC,OAAO;;;;;;;;;;;;;;;;;gBAiBT,MAAM,CAAC,QAAQ,CAAC,UAAU;mBACvB,MAAM,CAAC,QAAQ,CAAC,aAAa;CAC/C,CAAC;AACF,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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAwB/B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,mBAAmB;IACnB,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,0BAA0B;YACnC,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,0BAA0B;YACnC,UAAU,EAAE,gCAAgC;SAC7C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;YAEnC,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,wCAAwC;YACjD,UAAU,EAAE,sDAAsD;SACnE,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,MAAc,EACd,IAAY,EACZ,OAAe,EACf,WAAwB;IAExB,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,cAAc;IACd,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,IAAI,KAAK;YAClB,OAAO,EAAE,8BAA8B;YACvC,UAAU,EAAE,0BAA0B;SACvC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,IAAI,KAAK;YAClB,OAAO,EAAE,wBAAwB,MAAM,CAAC,EAAE,GAAG;YAC7C,UAAU,EAAE,mCAAmC;SAChD,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,GAAG,IAAI,KAAK;YAClB,OAAO,EAAE,cAAc,MAAM,CAAC,EAAE,+BAA+B;YAC/D,UAAU,EAAE,oDAAoD;SACjE,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,IAAI,OAAO;YACpB,OAAO,EAAE,yBAAyB;YAClC,UAAU,EAAE,mBAAmB;SAChC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,IAAI,OAAO;gBACpB,OAAO,EAAE,SAAS,MAAM,CAAC,IAAI,kBAAkB;gBAC/C,UAAU,EAAE,sDAAsD,YAAY,EAAE;aACjF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,IAAI,WAAW;YACxB,OAAO,EAAE,2BAA2B;YACpC,UAAU,EAAE,yEAAyE;SACtF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,IAAI,mBAAmB;gBAChC,OAAO,EAAE,4CAA4C;gBACrD,UAAU,EAAE,qCAAqC;aAClD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAChC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,GAAG,IAAI,mBAAmB;wBAChC,OAAO,EAAE,kCAAkC;qBAC5C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,IAAI,mBAAmB;gBAChC,OAAO,EAAE,qCAAqC;gBAC9C,UAAU,EAAE,qCAAqC;aAClD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;YACrF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,GAAG,IAAI,mBAAmB;oBAChC,OAAO,EAAE,8BAA8B;oBACvC,UAAU,EAAE,8CAA8C;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,sBAAsB;IACtB,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,6BAA6B;YACtC,UAAU,EAAE,qBAAqB;SAClC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,EAAE,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,cAAc,QAAQ,CAAC,UAAU,gBAAgB;YAC1D,UAAU,EAAE,6BAA6B;SAC1C,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,cAAc,QAAQ,CAAC,UAAU,gBAAgB;YAC1D,UAAU,EAAE,6BAA6B;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,gCAAgC;YACzC,UAAU,EAAE,uBAAuB;SACpC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,kCAAkC;YAC3C,UAAU,EAAE,uBAAuB;SACpC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,4CAA4C;YACrD,UAAU,EAAE,kCAAkC,QAAQ,CAAC,UAAU,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAwB;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAsCtC;;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"}
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
- -- Ensure chunk_count column exists (migration)
18
- -- SQLite doesn't support IF NOT EXISTS for columns, so we handle this in code
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
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Bd,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"}
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 (re-run after code changes)
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":";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,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;AAElC,uCAAuC;AACvC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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;;;;GAIG;AAKH,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;CACd;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,CAqD9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAEtF"}
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"}