claude-ex 1.0.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.
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = search;
4
+ exports.getCallers = getCallers;
5
+ exports.getContext = getContext;
6
+ exports.getImpact = getImpact;
7
+ exports.getDeps = getDeps;
8
+ exports.getRank = getRank;
9
+ exports.getModules = getModules;
10
+ exports.getStats = getStats;
11
+ exports.brief = brief;
12
+ exports.preEditContext = preEditContext;
13
+ exports.searchFromRoot = searchFromRoot;
14
+ exports.getCallersFromRoot = getCallersFromRoot;
15
+ exports.getContextFromRoot = getContextFromRoot;
16
+ exports.getImpactFromRoot = getImpactFromRoot;
17
+ exports.getDepsFromRoot = getDepsFromRoot;
18
+ exports.getRankFromRoot = getRankFromRoot;
19
+ exports.getModulesFromRoot = getModulesFromRoot;
20
+ exports.getStatsFromRoot = getStatsFromRoot;
21
+ exports.briefFromRoot = briefFromRoot;
22
+ exports.preEditContextFromRoot = preEditContextFromRoot;
23
+ const schema_1 = require("../db/schema");
24
+ // FTS5 query sanitizer
25
+ function sanitizeFts(query) {
26
+ const tokens = query.replace(/[^\w\s]/g, ' ').trim().split(/\s+/).filter(Boolean);
27
+ if (tokens.length === 0)
28
+ return '';
29
+ return tokens.map(t => `"${t}"`).join(' OR ');
30
+ }
31
+ // --- DB-direct functions (for MCP server hot path) ---
32
+ function search(db, query, limit = 15) {
33
+ const ftsQuery = sanitizeFts(query);
34
+ if (!ftsQuery)
35
+ return [];
36
+ const stmt = db.prepare(`
37
+ SELECT s.name, s.qualified_name, s.kind, f.path as file,
38
+ s.line_start, s.line_end, s.signature,
39
+ COALESCE(r.pagerank, 0) as pagerank,
40
+ snippet(symbols_fts, 4, '>>>', '<<<', '...', 30) as snippet
41
+ FROM symbols_fts fts
42
+ JOIN symbols s ON s.id = fts.rowid
43
+ JOIN files f ON f.id = s.file_id
44
+ LEFT JOIN rankings r ON r.symbol_id = s.id
45
+ WHERE symbols_fts MATCH ?
46
+ ORDER BY r.pagerank DESC, fts.rank
47
+ LIMIT ?
48
+ `);
49
+ return stmt.all(ftsQuery, limit);
50
+ }
51
+ function getCallers(db, symbolName) {
52
+ const stmt = db.prepare(`
53
+ SELECT DISTINCT s.name, s.qualified_name, s.kind, f.path as file,
54
+ s.line_start, s.line_end, s.signature,
55
+ COALESCE(r.pagerank, 0) as pagerank
56
+ FROM edges e
57
+ JOIN symbols target ON target.id = e.to_id
58
+ JOIN symbols s ON s.id = e.from_id
59
+ JOIN files f ON f.id = s.file_id
60
+ LEFT JOIN rankings r ON r.symbol_id = s.id
61
+ WHERE (target.name = ? OR target.qualified_name = ?)
62
+ AND e.kind IN ('calls', 'references')
63
+ ORDER BY r.pagerank DESC
64
+ `);
65
+ return stmt.all(symbolName, symbolName);
66
+ }
67
+ function getContext(db, symbolName) {
68
+ // Find the symbol (prefer exported, highest pagerank)
69
+ const sym = db.prepare(`
70
+ SELECT s.id, s.name, s.qualified_name, s.kind, f.path as file,
71
+ s.line_start, s.line_end, s.signature, s.docstring, s.content as code,
72
+ s.file_id
73
+ FROM symbols s
74
+ JOIN files f ON f.id = s.file_id
75
+ LEFT JOIN rankings r ON r.symbol_id = s.id
76
+ WHERE s.name = ? OR s.qualified_name = ?
77
+ ORDER BY s.exported DESC, COALESCE(r.pagerank, 0) DESC
78
+ LIMIT 1
79
+ `).get(symbolName, symbolName);
80
+ if (!sym)
81
+ return null;
82
+ // Dependencies (edges FROM this symbol)
83
+ const deps = db.prepare(`
84
+ SELECT s.name, s.qualified_name, s.kind, f.path as file,
85
+ s.line_start, s.line_end, s.signature,
86
+ COALESCE(r.pagerank, 0) as pagerank
87
+ FROM edges e
88
+ JOIN symbols s ON s.id = e.to_id
89
+ JOIN files f ON f.id = s.file_id
90
+ LEFT JOIN rankings r ON r.symbol_id = s.id
91
+ WHERE e.from_id = ?
92
+ `).all(sym.id);
93
+ // Dependents (edges TO this symbol)
94
+ const dependents = db.prepare(`
95
+ SELECT s.name, s.qualified_name, s.kind, f.path as file,
96
+ s.line_start, s.line_end, s.signature,
97
+ COALESCE(r.pagerank, 0) as pagerank
98
+ FROM edges e
99
+ JOIN symbols s ON s.id = e.from_id
100
+ JOIN files f ON f.id = s.file_id
101
+ LEFT JOIN rankings r ON r.symbol_id = s.id
102
+ WHERE e.to_id = ?
103
+ `).all(sym.id);
104
+ // Same-file siblings
105
+ const siblings = db.prepare(`
106
+ SELECT s.name, s.qualified_name, s.kind, f.path as file,
107
+ s.line_start, s.line_end, s.signature,
108
+ COALESCE(r.pagerank, 0) as pagerank
109
+ FROM symbols s
110
+ JOIN files f ON f.id = s.file_id
111
+ LEFT JOIN rankings r ON r.symbol_id = s.id
112
+ WHERE s.file_id = ? AND s.id != ?
113
+ ORDER BY s.line_start
114
+ `).all(sym.file_id, sym.id);
115
+ return {
116
+ symbol: {
117
+ name: sym.name,
118
+ qualifiedName: sym.qualified_name,
119
+ kind: sym.kind,
120
+ file: sym.file,
121
+ lineStart: sym.line_start,
122
+ lineEnd: sym.line_end,
123
+ signature: sym.signature,
124
+ docstring: sym.docstring,
125
+ code: sym.code,
126
+ },
127
+ dependencies: deps,
128
+ dependents,
129
+ sameFileSymbols: siblings,
130
+ };
131
+ }
132
+ function getImpact(db, filePath, maxDepth = 10) {
133
+ const stmt = db.prepare(`
134
+ WITH RECURSIVE impact(file_id, depth) AS (
135
+ SELECT fd.from_file, 1
136
+ FROM file_deps fd
137
+ JOIN files f ON f.id = fd.to_file
138
+ WHERE f.path = ?
139
+ UNION
140
+ SELECT fd.from_file, i.depth + 1
141
+ FROM file_deps fd
142
+ JOIN impact i ON i.file_id = fd.to_file
143
+ WHERE i.depth < ?
144
+ )
145
+ SELECT f.path as file, MIN(i.depth) as depth,
146
+ (SELECT COUNT(*) FROM symbols s WHERE s.file_id = f.id) as symbolCount
147
+ FROM impact i
148
+ JOIN files f ON f.id = i.file_id
149
+ GROUP BY f.path
150
+ ORDER BY depth, symbolCount DESC
151
+ `);
152
+ return stmt.all(filePath, maxDepth);
153
+ }
154
+ function getDeps(db, symbolName) {
155
+ const stmt = db.prepare(`
156
+ SELECT DISTINCT s.name, s.qualified_name, s.kind, f.path as file,
157
+ s.line_start, s.line_end, s.signature,
158
+ COALESCE(r.pagerank, 0) as pagerank
159
+ FROM edges e
160
+ JOIN symbols source ON source.id = e.from_id
161
+ JOIN symbols s ON s.id = e.to_id
162
+ JOIN files f ON f.id = s.file_id
163
+ LEFT JOIN rankings r ON r.symbol_id = s.id
164
+ WHERE (source.name = ? OR source.qualified_name = ?)
165
+ ORDER BY r.pagerank DESC
166
+ `);
167
+ return stmt.all(symbolName, symbolName);
168
+ }
169
+ function getRank(db, top = 20) {
170
+ const stmt = db.prepare(`
171
+ SELECT s.name, s.qualified_name, s.kind, f.path as file,
172
+ s.line_start, s.line_end, s.signature,
173
+ r.pagerank
174
+ FROM rankings r
175
+ JOIN symbols s ON s.id = r.symbol_id
176
+ JOIN files f ON f.id = s.file_id
177
+ WHERE s.kind IN ('function', 'class', 'method', 'interface', 'type')
178
+ ORDER BY r.pagerank DESC
179
+ LIMIT ?
180
+ `);
181
+ return stmt.all(top);
182
+ }
183
+ function getModules(db) {
184
+ // Group files by top-level directory
185
+ const files = db.prepare(`
186
+ SELECT f.id, f.path,
187
+ CASE WHEN INSTR(f.path, '/') > 0
188
+ THEN SUBSTR(f.path, 1, INSTR(f.path, '/') - 1)
189
+ ELSE '.'
190
+ END as module
191
+ FROM files f
192
+ `).all();
193
+ const moduleMap = new Map();
194
+ for (const f of files) {
195
+ if (!moduleMap.has(f.module)) {
196
+ moduleMap.set(f.module, { fileIds: new Set(), files: [] });
197
+ }
198
+ moduleMap.get(f.module).fileIds.add(f.id);
199
+ moduleMap.get(f.module).files.push(f.path);
200
+ }
201
+ const results = [];
202
+ for (const [name, data] of moduleMap) {
203
+ const symbolCount = db.prepare(`SELECT COUNT(*) as cnt FROM symbols WHERE file_id IN (${[...data.fileIds].join(',')})`).get();
204
+ // Find which other modules this module imports from
205
+ const deps = db.prepare(`
206
+ SELECT DISTINCT
207
+ CASE WHEN INSTR(f2.path, '/') > 0
208
+ THEN SUBSTR(f2.path, 1, INSTR(f2.path, '/') - 1)
209
+ ELSE '.'
210
+ END as target_module
211
+ FROM file_deps fd
212
+ JOIN files f2 ON f2.id = fd.to_file
213
+ WHERE fd.from_file IN (${[...data.fileIds].join(',')})
214
+ `).all();
215
+ results.push({
216
+ name,
217
+ fileCount: data.files.length,
218
+ symbolCount: symbolCount.cnt,
219
+ importsFrom: deps.map(d => d.target_module).filter(m => m !== name),
220
+ });
221
+ }
222
+ return results.sort((a, b) => b.symbolCount - a.symbolCount);
223
+ }
224
+ function getStats(db) {
225
+ const files = db.prepare('SELECT COUNT(*) as cnt FROM files').get().cnt;
226
+ const symbols = db.prepare('SELECT COUNT(*) as cnt FROM symbols').get().cnt;
227
+ const edges = db.prepare('SELECT COUNT(*) as cnt FROM edges').get().cnt;
228
+ const fileDeps = db.prepare('SELECT COUNT(*) as cnt FROM file_deps').get().cnt;
229
+ return { files, symbols, edges, fileDeps };
230
+ }
231
+ function brief(db) {
232
+ const stats = getStats(db);
233
+ const topSymbols = getRank(db, 10);
234
+ const modules = getModules(db);
235
+ // Language breakdown
236
+ const langs = db.prepare(`
237
+ SELECT language, COUNT(*) as cnt FROM files WHERE language IS NOT NULL GROUP BY language ORDER BY cnt DESC
238
+ `).all();
239
+ const lines = [];
240
+ lines.push(`Project: ${stats.files} files, ${stats.symbols} symbols, ${stats.edges} relationships`);
241
+ if (langs.length > 0) {
242
+ lines.push(`Languages: ${langs.map(l => `${l.language} (${l.cnt})`).join(', ')}`);
243
+ }
244
+ if (modules.length > 0) {
245
+ lines.push(`Modules: ${modules.slice(0, 8).map(m => `${m.name}/ (${m.fileCount} files)`).join(', ')}`);
246
+ }
247
+ if (topSymbols.length > 0) {
248
+ lines.push('');
249
+ lines.push('Key symbols (by structural importance):');
250
+ for (const sym of topSymbols) {
251
+ lines.push(` ${sym.qualifiedName || sym.name} [${sym.kind}] in ${sym.file}`);
252
+ }
253
+ }
254
+ lines.push('');
255
+ lines.push('Use MCP tools (search_code, get_callers, get_dependents, get_symbol) for structural queries.');
256
+ return lines.join('\n');
257
+ }
258
+ function preEditContext(db, filePath) {
259
+ const file = db.prepare('SELECT id FROM files WHERE path = ?').get(filePath);
260
+ if (!file)
261
+ return `File ${filePath} not in index.`;
262
+ const lines = [];
263
+ // What this file exports
264
+ const exports = db.prepare(`
265
+ SELECT name, kind, signature FROM symbols WHERE file_id = ? AND exported = 1 ORDER BY line_start
266
+ `).all(file.id);
267
+ if (exports.length > 0) {
268
+ lines.push(`Exports from ${filePath}:`);
269
+ for (const exp of exports) {
270
+ lines.push(` ${exp.name} [${exp.kind}]${exp.signature ? ': ' + exp.signature.slice(0, 80) : ''}`);
271
+ }
272
+ }
273
+ // What files import from this file
274
+ const dependents = db.prepare(`
275
+ SELECT DISTINCT f.path FROM file_deps fd JOIN files f ON f.id = fd.from_file WHERE fd.to_file = ?
276
+ `).all(file.id);
277
+ if (dependents.length > 0) {
278
+ lines.push('');
279
+ lines.push(`\u26a0\ufe0f ${dependents.length} file(s) depend on this file:`);
280
+ for (const dep of dependents.slice(0, 15)) {
281
+ lines.push(` ${dep.path}`);
282
+ }
283
+ if (dependents.length > 15) {
284
+ lines.push(` ... and ${dependents.length - 15} more`);
285
+ }
286
+ }
287
+ // What this file imports
288
+ const imports = db.prepare(`
289
+ SELECT f.path, fd.import_name FROM file_deps fd JOIN files f ON f.id = fd.to_file WHERE fd.from_file = ?
290
+ `).all(file.id);
291
+ if (imports.length > 0) {
292
+ lines.push('');
293
+ lines.push('Imports:');
294
+ for (const imp of imports) {
295
+ lines.push(` from ${imp.path} (${imp.import_name})`);
296
+ }
297
+ }
298
+ return lines.length > 0 ? lines.join('\n') : `File ${filePath} indexed but has no tracked exports/imports.`;
299
+ }
300
+ // --- Convenience wrappers for CLI (open/close DB internally) ---
301
+ function withDb(rootDir, fn) {
302
+ const db = (0, schema_1.openDatabase)(rootDir);
303
+ try {
304
+ return fn(db);
305
+ }
306
+ finally {
307
+ db.close();
308
+ }
309
+ }
310
+ function searchFromRoot(rootDir, query, limit) {
311
+ return withDb(rootDir, db => search(db, query, limit));
312
+ }
313
+ function getCallersFromRoot(rootDir, name) {
314
+ return withDb(rootDir, db => getCallers(db, name));
315
+ }
316
+ function getContextFromRoot(rootDir, name) {
317
+ return withDb(rootDir, db => getContext(db, name));
318
+ }
319
+ function getImpactFromRoot(rootDir, file, maxDepth) {
320
+ return withDb(rootDir, db => getImpact(db, file, maxDepth));
321
+ }
322
+ function getDepsFromRoot(rootDir, name) {
323
+ return withDb(rootDir, db => getDeps(db, name));
324
+ }
325
+ function getRankFromRoot(rootDir, top) {
326
+ return withDb(rootDir, db => getRank(db, top));
327
+ }
328
+ function getModulesFromRoot(rootDir) {
329
+ return withDb(rootDir, db => getModules(db));
330
+ }
331
+ function getStatsFromRoot(rootDir) {
332
+ return withDb(rootDir, db => getStats(db));
333
+ }
334
+ function briefFromRoot(rootDir) {
335
+ return withDb(rootDir, db => brief(db));
336
+ }
337
+ function preEditContextFromRoot(rootDir, filePath) {
338
+ return withDb(rootDir, db => preEditContext(db, filePath));
339
+ }
340
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/query/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function findProjectRoot(startDir?: string): string | null;
2
+ export declare function ensureCodexDir(rootDir: string): string;
3
+ export declare function relativePath(rootDir: string, filePath: string): string;
4
+ export declare function formatMs(ms: number): string;
5
+ export declare function truncate(str: string, maxLen: number): string;
package/dist/utils.js ADDED
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.findProjectRoot = findProjectRoot;
37
+ exports.ensureCodexDir = ensureCodexDir;
38
+ exports.relativePath = relativePath;
39
+ exports.formatMs = formatMs;
40
+ exports.truncate = truncate;
41
+ const path = __importStar(require("path"));
42
+ const fs = __importStar(require("fs"));
43
+ function findProjectRoot(startDir) {
44
+ let dir = startDir ? path.resolve(startDir) : process.cwd();
45
+ while (true) {
46
+ if (fs.existsSync(path.join(dir, '.codex', 'index.db'))) {
47
+ return dir;
48
+ }
49
+ const parent = path.dirname(dir);
50
+ if (parent === dir)
51
+ return null;
52
+ dir = parent;
53
+ }
54
+ }
55
+ function ensureCodexDir(rootDir) {
56
+ const codexDir = path.join(rootDir, '.codex');
57
+ if (!fs.existsSync(codexDir)) {
58
+ fs.mkdirSync(codexDir, { recursive: true });
59
+ }
60
+ return codexDir;
61
+ }
62
+ function relativePath(rootDir, filePath) {
63
+ return path.relative(rootDir, path.resolve(rootDir, filePath));
64
+ }
65
+ function formatMs(ms) {
66
+ if (ms < 1000)
67
+ return `${ms.toFixed(0)}ms`;
68
+ return `${(ms / 1000).toFixed(2)}s`;
69
+ }
70
+ function truncate(str, maxLen) {
71
+ if (str.length <= maxLen)
72
+ return str;
73
+ return str.slice(0, maxLen) + '...';
74
+ }
75
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,0CAUC;AAED,wCAMC;AAED,oCAEC;AAED,4BAGC;AAED,4BAGC;AAnCD,2CAA6B;AAC7B,uCAAyB;AAEzB,SAAgB,eAAe,CAAC,QAAiB;IAC7C,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5D,OAAO,IAAI,EAAE,CAAC;QACV,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,GAAG,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC1D,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAgB,QAAQ,CAAC,EAAU;IAC/B,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAW,EAAE,MAAc;IAChD,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAC;IACrC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import Database from 'better-sqlite3';
2
+ export declare function startWatcher(rootDir: string, db: Database.Database, onReindex?: (file: string) => void): Promise<any>;
3
+ export declare function startDaemon(rootDir: string): void;
4
+ export declare function stopDaemon(rootDir: string): void;
5
+ export declare function isDaemonRunning(rootDir: string): boolean;
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startWatcher = startWatcher;
37
+ exports.startDaemon = startDaemon;
38
+ exports.stopDaemon = stopDaemon;
39
+ exports.isDaemonRunning = isDaemonRunning;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const child_process = __importStar(require("child_process"));
43
+ const indexer_1 = require("../indexer");
44
+ const parser_1 = require("../indexer/parser");
45
+ const IGNORE_PATTERNS = [
46
+ '**/node_modules/**', '**/.git/**', '**/.codex/**', '**/dist/**',
47
+ '**/build/**', '**/out/**', '**/.next/**', '**/.nuxt/**',
48
+ '**/__pycache__/**', '**/target/**', '**/vendor/**', '**/coverage/**',
49
+ '**/.cache/**', '**/tmp/**', '**/temp/**',
50
+ ];
51
+ async function startWatcher(rootDir, db, onReindex) {
52
+ const chokidar = await Promise.resolve().then(() => __importStar(require('chokidar')));
53
+ const watcher = chokidar.watch(rootDir, {
54
+ ignored: IGNORE_PATTERNS,
55
+ persistent: true,
56
+ ignoreInitial: true,
57
+ awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },
58
+ });
59
+ const debounceMap = new Map();
60
+ function handleChange(fullPath) {
61
+ const relPath = path.relative(rootDir, fullPath);
62
+ if (!(0, parser_1.isSupportedFile)(relPath))
63
+ return;
64
+ // Debounce 200ms per file
65
+ const existing = debounceMap.get(relPath);
66
+ if (existing)
67
+ clearTimeout(existing);
68
+ debounceMap.set(relPath, setTimeout(() => {
69
+ debounceMap.delete(relPath);
70
+ try {
71
+ (0, indexer_1.reindexFile)(rootDir, relPath, db);
72
+ onReindex?.(relPath);
73
+ }
74
+ catch (err) {
75
+ process.stderr.write(`[codex] reindex error ${relPath}: ${err}\n`);
76
+ }
77
+ }, 200));
78
+ }
79
+ function handleDelete(fullPath) {
80
+ const relPath = path.relative(rootDir, fullPath);
81
+ try {
82
+ (0, indexer_1.reindexFile)(rootDir, relPath, db);
83
+ }
84
+ catch {
85
+ // ignore
86
+ }
87
+ }
88
+ watcher.on('change', handleChange);
89
+ watcher.on('add', handleChange);
90
+ watcher.on('unlink', handleDelete);
91
+ return watcher;
92
+ }
93
+ function startDaemon(rootDir) {
94
+ const pidFile = path.join(rootDir, '.codex', 'codex.pid');
95
+ const script = path.resolve(__dirname, '..', 'index.js');
96
+ const child = child_process.spawn(process.execPath, [script, 'daemon-worker', rootDir], {
97
+ detached: true,
98
+ stdio: 'ignore',
99
+ });
100
+ child.unref();
101
+ if (child.pid) {
102
+ fs.writeFileSync(pidFile, String(child.pid));
103
+ console.log(`Daemon started (PID: ${child.pid})`);
104
+ }
105
+ }
106
+ function stopDaemon(rootDir) {
107
+ const pidFile = path.join(rootDir, '.codex', 'codex.pid');
108
+ if (!fs.existsSync(pidFile)) {
109
+ console.log('No daemon running.');
110
+ return;
111
+ }
112
+ const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
113
+ try {
114
+ process.kill(pid, 'SIGTERM');
115
+ fs.unlinkSync(pidFile);
116
+ console.log(`Daemon stopped (PID: ${pid})`);
117
+ }
118
+ catch {
119
+ fs.unlinkSync(pidFile);
120
+ console.log('Daemon was not running. Cleaned up PID file.');
121
+ }
122
+ }
123
+ function isDaemonRunning(rootDir) {
124
+ const pidFile = path.join(rootDir, '.codex', 'codex.pid');
125
+ if (!fs.existsSync(pidFile))
126
+ return false;
127
+ const pid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
128
+ try {
129
+ process.kill(pid, 0);
130
+ return true;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/watcher/daemon.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "claude-ex",
3
+ "version": "1.0.0",
4
+ "description": "Local code intelligence layer for Claude Code — indexes codebases into a SQLite graph database with symbols, dependency edges, and PageRank",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "claude-ex": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "start": "node dist/index.js",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/vihaanshahh/claude-ex.git"
23
+ },
24
+ "keywords": ["claude", "code-intelligence", "mcp", "tree-sitter", "sqlite", "claude-code"],
25
+ "author": "vihaanshahh",
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "better-sqlite3": "^11.7.0",
29
+ "chokidar": "^4.0.3",
30
+ "commander": "^13.1.0",
31
+ "@modelcontextprotocol/sdk": "^1.0.0",
32
+ "tree-sitter": "^0.22.4",
33
+ "tree-sitter-javascript": "^0.23.1",
34
+ "tree-sitter-typescript": "^0.23.2",
35
+ "tree-sitter-python": "^0.23.6",
36
+ "tree-sitter-json": "^0.24.8",
37
+ "tree-sitter-css": "^0.23.2",
38
+ "tree-sitter-html": "^0.23.2",
39
+ "tree-sitter-rust": "^0.23.2",
40
+ "tree-sitter-go": "^0.23.4",
41
+ "tree-sitter-bash": "^0.23.3",
42
+ "tree-sitter-c": "^0.23.4",
43
+ "tree-sitter-cpp": "^0.23.4"
44
+ },
45
+ "devDependencies": {
46
+ "@types/better-sqlite3": "^7.6.12",
47
+ "@types/node": "^22.13.0",
48
+ "typescript": "^5.7.3"
49
+ }
50
+ }