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.
- package/README.md +65 -0
- package/dist/claude/claudemd.d.ts +3 -0
- package/dist/claude/claudemd.js +112 -0
- package/dist/claude/claudemd.js.map +1 -0
- package/dist/claude/installer.d.ts +1 -0
- package/dist/claude/installer.js +193 -0
- package/dist/claude/installer.js.map +1 -0
- package/dist/claude/mcp.d.ts +1 -0
- package/dist/claude/mcp.js +195 -0
- package/dist/claude/mcp.js.map +1 -0
- package/dist/db/schema.d.ts +25 -0
- package/dist/db/schema.js +218 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/collector.d.ts +1 -0
- package/dist/indexer/collector.js +133 -0
- package/dist/indexer/collector.js.map +1 -0
- package/dist/indexer/index.d.ts +13 -0
- package/dist/indexer/index.js +326 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parser.d.ts +31 -0
- package/dist/indexer/parser.js +407 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/query/engine.d.ts +65 -0
- package/dist/query/engine.js +340 -0
- package/dist/query/engine.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +75 -0
- package/dist/utils.js.map +1 -0
- package/dist/watcher/daemon.d.ts +5 -0
- package/dist/watcher/daemon.js +136 -0
- package/dist/watcher/daemon.js.map +1 -0
- package/package.json +50 -0
|
@@ -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":";;AA8DA,wBAkBC;AAED,gCAeC;AAED,gCAoEC;AAED,8BAqBC;AAED,0BAcC;AAED,0BAaC;AAED,gCA+CC;AAED,4BAMC;AAED,sBAgCC;AAED,wCAgDC;AAaD,wCAEC;AAED,gDAEC;AAED,gDAEC;AAED,8CAEC;AAED,0CAEC;AAED,0CAEC;AAED,gDAEC;AAED,4CAEC;AAED,sCAEC;AAED,wDAEC;AA5ZD,yCAA4C;AAoD5C,uBAAuB;AACvB,SAAS,WAAW,CAAC,KAAa;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,wDAAwD;AAExD,SAAgB,MAAM,CAAC,EAAqB,EAAE,KAAa,EAAE,QAAgB,EAAE;IAC3E,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;KAYvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAmB,CAAC;AACvD,CAAC;AAED,SAAgB,UAAU,CAAC,EAAqB,EAAE,UAAkB;IAChE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;KAYvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAmB,CAAC;AAC9D,CAAC;AAED,SAAgB,UAAU,CAAC,EAAqB,EAAE,UAAkB;IAChE,sDAAsD;IACtD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;KAUtB,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAQ,CAAC;IAEtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,wCAAwC;IACxC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;KASvB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAmB,CAAC;IAEjC,oCAAoC;IACpC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;KAS7B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAmB,CAAC;IAEjC,qBAAqB;IACrB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;KAS3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAmB,CAAC;IAE9C,OAAO;QACH,MAAM,EAAE;YACJ,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,aAAa,EAAE,GAAG,CAAC,cAAc;YACjC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;SACjB;QACD,YAAY,EAAE,IAAI;QAClB,UAAU;QACV,eAAe,EAAE,QAAQ;KAC5B,CAAC;AACN,CAAC;AAED,SAAgB,SAAS,CAAC,EAAqB,EAAE,QAAgB,EAAE,WAAmB,EAAE;IACpF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;KAkBvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAmB,CAAC;AAC1D,CAAC;AAED,SAAgB,OAAO,CAAC,EAAqB,EAAE,UAAkB;IAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;KAWvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAmB,CAAC;AAC9D,CAAC;AAED,SAAgB,OAAO,CAAC,EAAqB,EAAE,MAAc,EAAE;IAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;KAUvB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAmB,CAAC;AAC3C,CAAC;AAED,SAAgB,UAAU,CAAC,EAAqB;IAC5C,qCAAqC;IACrC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;KAOxB,CAAC,CAAC,GAAG,EAAoD,CAAC;IAE3D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqD,CAAC;IAC/E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC1B,yDAAyD,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAC1F,CAAC,GAAG,EAAqB,CAAC;QAE3B,oDAAoD;QACpD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;qCAQK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACvD,CAAC,CAAC,GAAG,EAAiC,CAAC;QAExC,OAAO,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC5B,WAAW,EAAE,WAAW,CAAC,GAAG;YAC5B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SACtE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACjE,CAAC;AAED,SAAgB,QAAQ,CAAC,EAAqB;IAC1C,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAU,CAAC,GAAG,CAAC;IACjF,MAAM,OAAO,GAAI,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAU,CAAC,GAAG,CAAC;IACrF,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAU,CAAC,GAAG,CAAC;IACjF,MAAM,QAAQ,GAAI,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAU,CAAC,GAAG,CAAC;IACxF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,SAAgB,KAAK,CAAC,EAAqB;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE/B,qBAAqB;IACrB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;;KAExB,CAAC,CAAC,GAAG,EAAyC,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,OAAO,aAAa,KAAK,CAAC,KAAK,gBAAgB,CAAC,CAAC;IAEpG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAC3G,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,cAAc,CAAC,EAAqB,EAAE,QAAgB;IAClE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA+B,CAAC;IAC3G,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,QAAQ,gBAAgB,CAAC;IAEnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;KAE1B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAA+D,CAAC;IAE9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvG,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;KAE7B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAuB,CAAC;IAEtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,MAAM,+BAA+B,CAAC,CAAC;QAC7E,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;KAE1B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAA4C,CAAC;IAE3D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,QAAQ,8CAA8C,CAAC;AAChH,CAAC;AAED,kEAAkE;AAElE,SAAS,MAAM,CAAI,OAAe,EAAE,EAAgC;IAChE,MAAM,EAAE,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,KAAc;IACzE,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,IAAY;IAC5D,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,IAAY;IAC5D,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAe,EAAE,IAAY,EAAE,QAAiB;IAC9E,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe,EAAE,IAAY;IACzD,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe,EAAE,GAAY;IACzD,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe;IAC9C,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC5C,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,aAAa,CAAC,OAAe;IACzC,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAe,EAAE,QAAgB;IACpE,OAAO,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,oCAiDC;AAED,kCAeC;AAED,gCAgBC;AAED,0CAWC;AA/GD,uCAAyB;AACzB,2CAA6B;AAC7B,6DAA+C;AAE/C,wCAAyC;AACzC,8CAAoD;AAEpD,MAAM,eAAe,GAAG;IACpB,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY;IAChE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa;IACxD,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB;IACrE,cAAc,EAAE,WAAW,EAAE,YAAY;CAC5C,CAAC;AAEK,KAAK,UAAU,YAAY,CAC9B,OAAe,EACf,EAAqB,EACrB,SAAkC;IAElC,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;QACpC,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;KAClE,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEtD,SAAS,YAAY,CAAC,QAAgB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAA,wBAAe,EAAC,OAAO,CAAC;YAAE,OAAO;QAEtC,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QAErC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE;YACrC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC;gBACD,IAAA,qBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;YACvE,CAAC;QACL,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACb,CAAC;IAED,SAAS,YAAY,CAAC,QAAgB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC;YACD,IAAA,qBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;IACL,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEnC,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;QACpF,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAClB,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACtD,CAAC;AACL,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACX,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACL,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAChE,CAAC;AACL,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
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
|
+
}
|