@mduenas/codegraph 0.4.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/LICENSE +21 -0
- package/README.md +641 -0
- package/dist/bin/codegraph.d.ts +20 -0
- package/dist/bin/codegraph.d.ts.map +1 -0
- package/dist/bin/codegraph.js +704 -0
- package/dist/bin/codegraph.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +291 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +30 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +244 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +86 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +402 -0
- package/dist/context/index.js.map +1 -0
- package/dist/db/index.d.ts +64 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +170 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +105 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +148 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +669 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/directory.d.ts +45 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +191 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +136 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +219 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction/grammars.d.ts +36 -0
- package/dist/extraction/grammars.d.ts.map +1 -0
- package/dist/extraction/grammars.js +181 -0
- package/dist/extraction/grammars.js.map +1 -0
- package/dist/extraction/index.d.ts +91 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +493 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +176 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -0
- package/dist/extraction/tree-sitter.js +1798 -0
- package/dist/extraction/tree-sitter.js.map +1 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/queries.d.ts.map +1 -0
- package/dist/graph/queries.js +355 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +465 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +496 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +818 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/banner.d.ts +40 -0
- package/dist/installer/banner.d.ts.map +1 -0
- package/dist/installer/banner.js +162 -0
- package/dist/installer/banner.js.map +1 -0
- package/dist/installer/claude-md-template.d.ts +10 -0
- package/dist/installer/claude-md-template.d.ts.map +1 -0
- package/dist/installer/claude-md-template.js +46 -0
- package/dist/installer/claude-md-template.js.map +1 -0
- package/dist/installer/config-writer.d.ts +36 -0
- package/dist/installer/config-writer.d.ts.map +1 -0
- package/dist/installer/config-writer.js +282 -0
- package/dist/installer/config-writer.js.map +1 -0
- package/dist/installer/index.d.ts +13 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +155 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/prompts.d.ts +18 -0
- package/dist/installer/prompts.d.ts.map +1 -0
- package/dist/installer/prompts.js +113 -0
- package/dist/installer/prompts.js.map +1 -0
- package/dist/mcp/index.d.ts +64 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +207 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +93 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +442 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +89 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +170 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
- package/dist/resolution/frameworks/csharp.js +274 -0
- package/dist/resolution/frameworks/csharp.js.map +1 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.d.ts.map +1 -0
- package/dist/resolution/frameworks/express.js +208 -0
- package/dist/resolution/frameworks/express.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -0
- package/dist/resolution/frameworks/go.js +225 -0
- package/dist/resolution/frameworks/go.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +33 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -0
- package/dist/resolution/frameworks/index.js +113 -0
- package/dist/resolution/frameworks/index.js.map +1 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.d.ts.map +1 -0
- package/dist/resolution/frameworks/java.js +239 -0
- package/dist/resolution/frameworks/java.js.map +1 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
- package/dist/resolution/frameworks/laravel.js +198 -0
- package/dist/resolution/frameworks/laravel.js.map +1 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.d.ts.map +1 -0
- package/dist/resolution/frameworks/python.js +331 -0
- package/dist/resolution/frameworks/python.js.map +1 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/react.d.ts.map +1 -0
- package/dist/resolution/frameworks/react.js +294 -0
- package/dist/resolution/frameworks/react.js.map +1 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
- package/dist/resolution/frameworks/ruby.js +262 -0
- package/dist/resolution/frameworks/ruby.js.map +1 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts.map +1 -0
- package/dist/resolution/frameworks/rust.js +222 -0
- package/dist/resolution/frameworks/rust.js.map +1 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift.js +486 -0
- package/dist/resolution/frameworks/swift.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +20 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -0
- package/dist/resolution/import-resolver.js +445 -0
- package/dist/resolution/import-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +72 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +301 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +27 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -0
- package/dist/resolution/name-matcher.js +210 -0
- package/dist/resolution/name-matcher.js.map +1 -0
- package/dist/resolution/types.d.ts +108 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +8 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/sync/git-hooks.d.ts +66 -0
- package/dist/sync/git-hooks.d.ts.map +1 -0
- package/dist/sync/git-hooks.js +281 -0
- package/dist/sync/git-hooks.js.map +1 -0
- package/dist/sync/index.d.ts +13 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +18 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +410 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +165 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +116 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +295 -0
- package/dist/utils.js.map +1 -0
- package/dist/vectors/embedder.d.ts +140 -0
- package/dist/vectors/embedder.d.ts.map +1 -0
- package/dist/vectors/embedder.js +336 -0
- package/dist/vectors/embedder.js.map +1 -0
- package/dist/vectors/index.d.ts +9 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +20 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/manager.d.ts +119 -0
- package/dist/vectors/manager.d.ts.map +1 -0
- package/dist/vectors/manager.js +274 -0
- package/dist/vectors/manager.js.map +1 -0
- package/dist/vectors/search.d.ts +134 -0
- package/dist/vectors/search.d.ts.map +1 -0
- package/dist/vectors/search.js +409 -0
- package/dist/vectors/search.js.map +1 -0
- package/package.json +67 -0
- package/scripts/postinstall.js +68 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Extraction Orchestrator
|
|
4
|
+
*
|
|
5
|
+
* Coordinates file scanning, parsing, and database storage.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.getSupportedLanguages = exports.isLanguageSupported = exports.detectLanguage = exports.extractFromSource = exports.ExtractionOrchestrator = void 0;
|
|
42
|
+
exports.hashContent = hashContent;
|
|
43
|
+
exports.shouldIncludeFile = shouldIncludeFile;
|
|
44
|
+
exports.scanDirectory = scanDirectory;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
48
|
+
const tree_sitter_1 = require("./tree-sitter");
|
|
49
|
+
const grammars_1 = require("./grammars");
|
|
50
|
+
const errors_1 = require("../errors");
|
|
51
|
+
/**
|
|
52
|
+
* Calculate SHA256 hash of file contents
|
|
53
|
+
*/
|
|
54
|
+
function hashContent(content) {
|
|
55
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if a path matches any glob pattern (simplified)
|
|
59
|
+
*/
|
|
60
|
+
function matchesGlob(filePath, pattern) {
|
|
61
|
+
// Convert glob to regex using placeholders to avoid conflicts
|
|
62
|
+
let regexStr = pattern;
|
|
63
|
+
// Replace glob patterns with placeholders first
|
|
64
|
+
regexStr = regexStr.replace(/\*\*\//g, '\x00GLOBSTAR_SLASH\x00');
|
|
65
|
+
regexStr = regexStr.replace(/\*\*/g, '\x00GLOBSTAR\x00');
|
|
66
|
+
regexStr = regexStr.replace(/\*/g, '\x00STAR\x00');
|
|
67
|
+
regexStr = regexStr.replace(/\?/g, '\x00QUESTION\x00');
|
|
68
|
+
// Escape regex special characters
|
|
69
|
+
regexStr = regexStr.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
70
|
+
// Replace placeholders with regex equivalents
|
|
71
|
+
regexStr = regexStr.replace(/\x00GLOBSTAR_SLASH\x00/g, '(?:.*/)?'); // **/ = zero or more dirs
|
|
72
|
+
regexStr = regexStr.replace(/\x00GLOBSTAR\x00/g, '.*'); // ** = anything
|
|
73
|
+
regexStr = regexStr.replace(/\x00STAR\x00/g, '[^/]*'); // * = anything except /
|
|
74
|
+
regexStr = regexStr.replace(/\x00QUESTION\x00/g, '.'); // ? = single char
|
|
75
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
76
|
+
return regex.test(filePath);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a file should be included based on config
|
|
80
|
+
*/
|
|
81
|
+
function shouldIncludeFile(filePath, config) {
|
|
82
|
+
// Check exclude patterns first
|
|
83
|
+
for (const pattern of config.exclude) {
|
|
84
|
+
if (matchesGlob(filePath, pattern)) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Check include patterns
|
|
89
|
+
for (const pattern of config.include) {
|
|
90
|
+
if (matchesGlob(filePath, pattern)) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Recursively scan directory for source files
|
|
98
|
+
*/
|
|
99
|
+
function scanDirectory(rootDir, config, onProgress) {
|
|
100
|
+
const files = [];
|
|
101
|
+
let count = 0;
|
|
102
|
+
function walk(dir) {
|
|
103
|
+
let entries;
|
|
104
|
+
try {
|
|
105
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
(0, errors_1.logDebug)('Skipping unreadable directory', { dir, error: String(error) });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
const fullPath = path.join(dir, entry.name);
|
|
113
|
+
const relativePath = path.relative(rootDir, fullPath);
|
|
114
|
+
if (entry.isDirectory()) {
|
|
115
|
+
// Check if directory should be excluded
|
|
116
|
+
const dirPattern = relativePath + '/';
|
|
117
|
+
let excluded = false;
|
|
118
|
+
for (const pattern of config.exclude) {
|
|
119
|
+
if (matchesGlob(dirPattern, pattern) || matchesGlob(relativePath, pattern)) {
|
|
120
|
+
excluded = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!excluded) {
|
|
125
|
+
walk(fullPath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (entry.isFile()) {
|
|
129
|
+
if (shouldIncludeFile(relativePath, config)) {
|
|
130
|
+
files.push(relativePath);
|
|
131
|
+
count++;
|
|
132
|
+
if (onProgress) {
|
|
133
|
+
onProgress(count, relativePath);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
walk(rootDir);
|
|
140
|
+
return files;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Extraction orchestrator
|
|
144
|
+
*/
|
|
145
|
+
class ExtractionOrchestrator {
|
|
146
|
+
rootDir;
|
|
147
|
+
config;
|
|
148
|
+
queries;
|
|
149
|
+
constructor(rootDir, config, queries) {
|
|
150
|
+
this.rootDir = rootDir;
|
|
151
|
+
this.config = config;
|
|
152
|
+
this.queries = queries;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Index all files in the project
|
|
156
|
+
*/
|
|
157
|
+
async indexAll(onProgress, signal) {
|
|
158
|
+
const startTime = Date.now();
|
|
159
|
+
const errors = [];
|
|
160
|
+
let filesIndexed = 0;
|
|
161
|
+
let filesSkipped = 0;
|
|
162
|
+
let totalNodes = 0;
|
|
163
|
+
let totalEdges = 0;
|
|
164
|
+
// Phase 1: Scan for files
|
|
165
|
+
onProgress?.({
|
|
166
|
+
phase: 'scanning',
|
|
167
|
+
current: 0,
|
|
168
|
+
total: 0,
|
|
169
|
+
});
|
|
170
|
+
const files = scanDirectory(this.rootDir, this.config, (current, file) => {
|
|
171
|
+
onProgress?.({
|
|
172
|
+
phase: 'scanning',
|
|
173
|
+
current,
|
|
174
|
+
total: 0,
|
|
175
|
+
currentFile: file,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
if (signal?.aborted) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
filesIndexed: 0,
|
|
182
|
+
filesSkipped: 0,
|
|
183
|
+
nodesCreated: 0,
|
|
184
|
+
edgesCreated: 0,
|
|
185
|
+
errors: [{ message: 'Aborted', severity: 'error' }],
|
|
186
|
+
durationMs: Date.now() - startTime,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Phase 2: Parse files
|
|
190
|
+
const total = files.length;
|
|
191
|
+
for (let i = 0; i < files.length; i++) {
|
|
192
|
+
if (signal?.aborted) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
filesIndexed,
|
|
196
|
+
filesSkipped,
|
|
197
|
+
nodesCreated: totalNodes,
|
|
198
|
+
edgesCreated: totalEdges,
|
|
199
|
+
errors: [{ message: 'Aborted', severity: 'error' }, ...errors],
|
|
200
|
+
durationMs: Date.now() - startTime,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const filePath = files[i];
|
|
204
|
+
onProgress?.({
|
|
205
|
+
phase: 'parsing',
|
|
206
|
+
current: i + 1,
|
|
207
|
+
total,
|
|
208
|
+
currentFile: filePath,
|
|
209
|
+
});
|
|
210
|
+
const result = await this.indexFile(filePath);
|
|
211
|
+
if (result.errors.length > 0) {
|
|
212
|
+
errors.push(...result.errors);
|
|
213
|
+
}
|
|
214
|
+
if (result.nodes.length > 0) {
|
|
215
|
+
filesIndexed++;
|
|
216
|
+
totalNodes += result.nodes.length;
|
|
217
|
+
totalEdges += result.edges.length;
|
|
218
|
+
}
|
|
219
|
+
else if (result.errors.length === 0) {
|
|
220
|
+
filesSkipped++;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Phase 3: Resolve references
|
|
224
|
+
onProgress?.({
|
|
225
|
+
phase: 'resolving',
|
|
226
|
+
current: 0,
|
|
227
|
+
total: 1,
|
|
228
|
+
});
|
|
229
|
+
// TODO: Implement reference resolution in Phase 3
|
|
230
|
+
return {
|
|
231
|
+
success: errors.filter((e) => e.severity === 'error').length === 0,
|
|
232
|
+
filesIndexed,
|
|
233
|
+
filesSkipped,
|
|
234
|
+
nodesCreated: totalNodes,
|
|
235
|
+
edgesCreated: totalEdges,
|
|
236
|
+
errors,
|
|
237
|
+
durationMs: Date.now() - startTime,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Index specific files
|
|
242
|
+
*/
|
|
243
|
+
async indexFiles(filePaths) {
|
|
244
|
+
const startTime = Date.now();
|
|
245
|
+
const errors = [];
|
|
246
|
+
let filesIndexed = 0;
|
|
247
|
+
let filesSkipped = 0;
|
|
248
|
+
let totalNodes = 0;
|
|
249
|
+
let totalEdges = 0;
|
|
250
|
+
for (const filePath of filePaths) {
|
|
251
|
+
const result = await this.indexFile(filePath);
|
|
252
|
+
if (result.errors.length > 0) {
|
|
253
|
+
errors.push(...result.errors);
|
|
254
|
+
}
|
|
255
|
+
if (result.nodes.length > 0) {
|
|
256
|
+
filesIndexed++;
|
|
257
|
+
totalNodes += result.nodes.length;
|
|
258
|
+
totalEdges += result.edges.length;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
filesSkipped++;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
success: errors.filter((e) => e.severity === 'error').length === 0,
|
|
266
|
+
filesIndexed,
|
|
267
|
+
filesSkipped,
|
|
268
|
+
nodesCreated: totalNodes,
|
|
269
|
+
edgesCreated: totalEdges,
|
|
270
|
+
errors,
|
|
271
|
+
durationMs: Date.now() - startTime,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Index a single file
|
|
276
|
+
*/
|
|
277
|
+
async indexFile(relativePath) {
|
|
278
|
+
const fullPath = path.join(this.rootDir, relativePath);
|
|
279
|
+
// Check file exists and is readable
|
|
280
|
+
let content;
|
|
281
|
+
let stats;
|
|
282
|
+
try {
|
|
283
|
+
stats = fs.statSync(fullPath);
|
|
284
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
return {
|
|
288
|
+
nodes: [],
|
|
289
|
+
edges: [],
|
|
290
|
+
unresolvedReferences: [],
|
|
291
|
+
errors: [
|
|
292
|
+
{
|
|
293
|
+
message: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
|
|
294
|
+
severity: 'error',
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
durationMs: 0,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
// Check file size
|
|
301
|
+
if (stats.size > this.config.maxFileSize) {
|
|
302
|
+
return {
|
|
303
|
+
nodes: [],
|
|
304
|
+
edges: [],
|
|
305
|
+
unresolvedReferences: [],
|
|
306
|
+
errors: [
|
|
307
|
+
{
|
|
308
|
+
message: `File exceeds max size (${stats.size} > ${this.config.maxFileSize})`,
|
|
309
|
+
severity: 'warning',
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
durationMs: 0,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
// Detect language
|
|
316
|
+
const language = (0, grammars_1.detectLanguage)(relativePath);
|
|
317
|
+
if (!(0, grammars_1.isLanguageSupported)(language)) {
|
|
318
|
+
return {
|
|
319
|
+
nodes: [],
|
|
320
|
+
edges: [],
|
|
321
|
+
unresolvedReferences: [],
|
|
322
|
+
errors: [],
|
|
323
|
+
durationMs: 0,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// Extract from source
|
|
327
|
+
const result = (0, tree_sitter_1.extractFromSource)(relativePath, content, language);
|
|
328
|
+
// Store in database
|
|
329
|
+
if (result.nodes.length > 0 || result.errors.length === 0) {
|
|
330
|
+
this.storeExtractionResult(relativePath, content, language, stats, result);
|
|
331
|
+
}
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Store extraction result in database
|
|
336
|
+
*/
|
|
337
|
+
storeExtractionResult(filePath, content, language, stats, result) {
|
|
338
|
+
const contentHash = hashContent(content);
|
|
339
|
+
// Check if file already exists and hasn't changed
|
|
340
|
+
const existingFile = this.queries.getFileByPath(filePath);
|
|
341
|
+
if (existingFile && existingFile.contentHash === contentHash) {
|
|
342
|
+
return; // No changes
|
|
343
|
+
}
|
|
344
|
+
// Delete existing data for this file
|
|
345
|
+
if (existingFile) {
|
|
346
|
+
this.queries.deleteFile(filePath);
|
|
347
|
+
}
|
|
348
|
+
// Insert nodes
|
|
349
|
+
if (result.nodes.length > 0) {
|
|
350
|
+
this.queries.insertNodes(result.nodes);
|
|
351
|
+
}
|
|
352
|
+
// Insert edges
|
|
353
|
+
if (result.edges.length > 0) {
|
|
354
|
+
this.queries.insertEdges(result.edges);
|
|
355
|
+
}
|
|
356
|
+
// Insert unresolved references
|
|
357
|
+
for (const ref of result.unresolvedReferences) {
|
|
358
|
+
this.queries.insertUnresolvedRef(ref);
|
|
359
|
+
}
|
|
360
|
+
// Insert file record
|
|
361
|
+
const fileRecord = {
|
|
362
|
+
path: filePath,
|
|
363
|
+
contentHash,
|
|
364
|
+
language,
|
|
365
|
+
size: stats.size,
|
|
366
|
+
modifiedAt: stats.mtimeMs,
|
|
367
|
+
indexedAt: Date.now(),
|
|
368
|
+
nodeCount: result.nodes.length,
|
|
369
|
+
errors: result.errors.length > 0 ? result.errors : undefined,
|
|
370
|
+
};
|
|
371
|
+
this.queries.upsertFile(fileRecord);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Sync with current file state
|
|
375
|
+
*/
|
|
376
|
+
async sync(onProgress) {
|
|
377
|
+
const startTime = Date.now();
|
|
378
|
+
let filesChecked = 0;
|
|
379
|
+
let filesAdded = 0;
|
|
380
|
+
let filesModified = 0;
|
|
381
|
+
let filesRemoved = 0;
|
|
382
|
+
let nodesUpdated = 0;
|
|
383
|
+
// Get current files on disk
|
|
384
|
+
onProgress?.({
|
|
385
|
+
phase: 'scanning',
|
|
386
|
+
current: 0,
|
|
387
|
+
total: 0,
|
|
388
|
+
});
|
|
389
|
+
const currentFiles = new Set(scanDirectory(this.rootDir, this.config));
|
|
390
|
+
filesChecked = currentFiles.size;
|
|
391
|
+
// Get tracked files from database
|
|
392
|
+
const trackedFiles = this.queries.getAllFiles();
|
|
393
|
+
// Find files to remove (in DB but not on disk)
|
|
394
|
+
for (const tracked of trackedFiles) {
|
|
395
|
+
if (!currentFiles.has(tracked.path)) {
|
|
396
|
+
this.queries.deleteFile(tracked.path);
|
|
397
|
+
filesRemoved++;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// Find files to add or update
|
|
401
|
+
const filesToIndex = [];
|
|
402
|
+
for (const filePath of currentFiles) {
|
|
403
|
+
const fullPath = path.join(this.rootDir, filePath);
|
|
404
|
+
let content;
|
|
405
|
+
try {
|
|
406
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
(0, errors_1.logDebug)('Skipping unreadable file during sync', { filePath, error: String(error) });
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
const contentHash = hashContent(content);
|
|
413
|
+
const tracked = trackedFiles.find((f) => f.path === filePath);
|
|
414
|
+
if (!tracked) {
|
|
415
|
+
// New file
|
|
416
|
+
filesToIndex.push(filePath);
|
|
417
|
+
filesAdded++;
|
|
418
|
+
}
|
|
419
|
+
else if (tracked.contentHash !== contentHash) {
|
|
420
|
+
// Modified file
|
|
421
|
+
filesToIndex.push(filePath);
|
|
422
|
+
filesModified++;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Index changed files
|
|
426
|
+
const total = filesToIndex.length;
|
|
427
|
+
for (let i = 0; i < filesToIndex.length; i++) {
|
|
428
|
+
const filePath = filesToIndex[i];
|
|
429
|
+
onProgress?.({
|
|
430
|
+
phase: 'parsing',
|
|
431
|
+
current: i + 1,
|
|
432
|
+
total,
|
|
433
|
+
currentFile: filePath,
|
|
434
|
+
});
|
|
435
|
+
const result = await this.indexFile(filePath);
|
|
436
|
+
nodesUpdated += result.nodes.length;
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
filesChecked,
|
|
440
|
+
filesAdded,
|
|
441
|
+
filesModified,
|
|
442
|
+
filesRemoved,
|
|
443
|
+
nodesUpdated,
|
|
444
|
+
durationMs: Date.now() - startTime,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Get files that have changed since last index
|
|
449
|
+
*/
|
|
450
|
+
getChangedFiles() {
|
|
451
|
+
const currentFiles = new Set(scanDirectory(this.rootDir, this.config));
|
|
452
|
+
const trackedFiles = this.queries.getAllFiles();
|
|
453
|
+
const added = [];
|
|
454
|
+
const modified = [];
|
|
455
|
+
const removed = [];
|
|
456
|
+
// Find removed files
|
|
457
|
+
for (const tracked of trackedFiles) {
|
|
458
|
+
if (!currentFiles.has(tracked.path)) {
|
|
459
|
+
removed.push(tracked.path);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// Find added and modified files
|
|
463
|
+
for (const filePath of currentFiles) {
|
|
464
|
+
const fullPath = path.join(this.rootDir, filePath);
|
|
465
|
+
let content;
|
|
466
|
+
try {
|
|
467
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
(0, errors_1.logDebug)('Skipping unreadable file while detecting changes', { filePath, error: String(error) });
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
const contentHash = hashContent(content);
|
|
474
|
+
const tracked = trackedFiles.find((f) => f.path === filePath);
|
|
475
|
+
if (!tracked) {
|
|
476
|
+
added.push(filePath);
|
|
477
|
+
}
|
|
478
|
+
else if (tracked.contentHash !== contentHash) {
|
|
479
|
+
modified.push(filePath);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return { added, modified, removed };
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
exports.ExtractionOrchestrator = ExtractionOrchestrator;
|
|
486
|
+
// Re-export useful types and functions
|
|
487
|
+
var tree_sitter_2 = require("./tree-sitter");
|
|
488
|
+
Object.defineProperty(exports, "extractFromSource", { enumerable: true, get: function () { return tree_sitter_2.extractFromSource; } });
|
|
489
|
+
var grammars_2 = require("./grammars");
|
|
490
|
+
Object.defineProperty(exports, "detectLanguage", { enumerable: true, get: function () { return grammars_2.detectLanguage; } });
|
|
491
|
+
Object.defineProperty(exports, "isLanguageSupported", { enumerable: true, get: function () { return grammars_2.isLanguageSupported; } });
|
|
492
|
+
Object.defineProperty(exports, "getSupportedLanguages", { enumerable: true, get: function () { return grammars_2.getSupportedLanguages; } });
|
|
493
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-sitter Parser Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Handles parsing source code and extracting structural information.
|
|
5
|
+
*/
|
|
6
|
+
import { Language, NodeKind, ExtractionResult } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Generate a unique node ID
|
|
9
|
+
*
|
|
10
|
+
* Uses a 32-character (128-bit) hash to avoid collisions when indexing
|
|
11
|
+
* large codebases with many files containing similar symbols.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateNodeId(filePath: string, kind: NodeKind, name: string, line: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* TreeSitterExtractor - Main extraction class
|
|
16
|
+
*/
|
|
17
|
+
export declare class TreeSitterExtractor {
|
|
18
|
+
private filePath;
|
|
19
|
+
private language;
|
|
20
|
+
private source;
|
|
21
|
+
private tree;
|
|
22
|
+
private nodes;
|
|
23
|
+
private edges;
|
|
24
|
+
private unresolvedReferences;
|
|
25
|
+
private errors;
|
|
26
|
+
private extractor;
|
|
27
|
+
private nodeStack;
|
|
28
|
+
constructor(filePath: string, source: string, language?: Language);
|
|
29
|
+
/**
|
|
30
|
+
* Parse and extract from the source code
|
|
31
|
+
*/
|
|
32
|
+
extract(): ExtractionResult;
|
|
33
|
+
/**
|
|
34
|
+
* Visit a node and extract information
|
|
35
|
+
*/
|
|
36
|
+
private visitNode;
|
|
37
|
+
/**
|
|
38
|
+
* Create a Node object
|
|
39
|
+
*/
|
|
40
|
+
private createNode;
|
|
41
|
+
/**
|
|
42
|
+
* Build qualified name from node stack
|
|
43
|
+
*/
|
|
44
|
+
private buildQualifiedName;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a node has a child of a specific type
|
|
47
|
+
*/
|
|
48
|
+
private hasChildOfType;
|
|
49
|
+
/**
|
|
50
|
+
* Extract a function
|
|
51
|
+
*/
|
|
52
|
+
private extractFunction;
|
|
53
|
+
/**
|
|
54
|
+
* Extract a class
|
|
55
|
+
*/
|
|
56
|
+
private extractClass;
|
|
57
|
+
/**
|
|
58
|
+
* Extract a method
|
|
59
|
+
*/
|
|
60
|
+
private extractMethod;
|
|
61
|
+
/**
|
|
62
|
+
* Extract an interface/protocol/trait
|
|
63
|
+
*/
|
|
64
|
+
private extractInterface;
|
|
65
|
+
/**
|
|
66
|
+
* Extract a struct
|
|
67
|
+
*/
|
|
68
|
+
private extractStruct;
|
|
69
|
+
/**
|
|
70
|
+
* Extract an enum
|
|
71
|
+
*/
|
|
72
|
+
private extractEnum;
|
|
73
|
+
/**
|
|
74
|
+
* Extract an import
|
|
75
|
+
*/
|
|
76
|
+
private extractImport;
|
|
77
|
+
/**
|
|
78
|
+
* Extract a function call
|
|
79
|
+
*/
|
|
80
|
+
private extractCall;
|
|
81
|
+
/**
|
|
82
|
+
* Visit function body and extract calls
|
|
83
|
+
*/
|
|
84
|
+
private visitFunctionBody;
|
|
85
|
+
/**
|
|
86
|
+
* Extract inheritance relationships
|
|
87
|
+
*/
|
|
88
|
+
private extractInheritance;
|
|
89
|
+
/**
|
|
90
|
+
* Extract a Kotlin class with enhanced metadata (data, sealed, abstract)
|
|
91
|
+
*/
|
|
92
|
+
private extractKotlinClass;
|
|
93
|
+
/**
|
|
94
|
+
* Extract a Kotlin enum class
|
|
95
|
+
*/
|
|
96
|
+
private extractKotlinEnum;
|
|
97
|
+
/**
|
|
98
|
+
* Extract a Kotlin enum entry
|
|
99
|
+
*/
|
|
100
|
+
private extractKotlinEnumEntry;
|
|
101
|
+
/**
|
|
102
|
+
* Extract a Kotlin object declaration (singleton)
|
|
103
|
+
*/
|
|
104
|
+
private extractKotlinObject;
|
|
105
|
+
/**
|
|
106
|
+
* Extract a Kotlin companion object
|
|
107
|
+
*/
|
|
108
|
+
private extractKotlinCompanionObject;
|
|
109
|
+
/**
|
|
110
|
+
* Extract a Kotlin property (val/var)
|
|
111
|
+
*/
|
|
112
|
+
private extractKotlinProperty;
|
|
113
|
+
/**
|
|
114
|
+
* Extract a Kotlin type alias
|
|
115
|
+
*/
|
|
116
|
+
private extractKotlinTypeAlias;
|
|
117
|
+
/**
|
|
118
|
+
* Extract Kotlin inheritance (delegation specifiers after ":")
|
|
119
|
+
*/
|
|
120
|
+
private extractKotlinInheritance;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* LiquidExtractor - Extracts relationships from Liquid template files
|
|
124
|
+
*
|
|
125
|
+
* Liquid is a templating language (used by Shopify, Jekyll, etc.) that doesn't
|
|
126
|
+
* have traditional functions or classes. Instead, we extract:
|
|
127
|
+
* - Section references ({% section 'name' %})
|
|
128
|
+
* - Snippet references ({% render 'name' %} and {% include 'name' %})
|
|
129
|
+
* - Schema blocks ({% schema %}...{% endschema %})
|
|
130
|
+
*/
|
|
131
|
+
export declare class LiquidExtractor {
|
|
132
|
+
private filePath;
|
|
133
|
+
private source;
|
|
134
|
+
private nodes;
|
|
135
|
+
private edges;
|
|
136
|
+
private unresolvedReferences;
|
|
137
|
+
private errors;
|
|
138
|
+
constructor(filePath: string, source: string);
|
|
139
|
+
/**
|
|
140
|
+
* Extract from Liquid source
|
|
141
|
+
*/
|
|
142
|
+
extract(): ExtractionResult;
|
|
143
|
+
/**
|
|
144
|
+
* Create a file node for the Liquid template
|
|
145
|
+
*/
|
|
146
|
+
private createFileNode;
|
|
147
|
+
/**
|
|
148
|
+
* Extract {% render 'snippet' %} and {% include 'snippet' %} references
|
|
149
|
+
*/
|
|
150
|
+
private extractSnippetReferences;
|
|
151
|
+
/**
|
|
152
|
+
* Extract {% section 'name' %} references
|
|
153
|
+
*/
|
|
154
|
+
private extractSectionReferences;
|
|
155
|
+
/**
|
|
156
|
+
* Extract {% schema %}...{% endschema %} blocks
|
|
157
|
+
*/
|
|
158
|
+
private extractSchema;
|
|
159
|
+
/**
|
|
160
|
+
* Extract {% assign var = value %} statements
|
|
161
|
+
*/
|
|
162
|
+
private extractAssignments;
|
|
163
|
+
/**
|
|
164
|
+
* Get the line number for a character index
|
|
165
|
+
*/
|
|
166
|
+
private getLineNumber;
|
|
167
|
+
/**
|
|
168
|
+
* Get the character index of the start of a line
|
|
169
|
+
*/
|
|
170
|
+
private getLineStart;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Extract nodes and edges from source code
|
|
174
|
+
*/
|
|
175
|
+
export declare function extractFromSource(filePath: string, source: string, language?: Language): ExtractionResult;
|
|
176
|
+
//# sourceMappingURL=tree-sitter.d.ts.map
|