contextsliver 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +156 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/graph/rank.d.ts +9 -0
  8. package/dist/graph/rank.d.ts.map +1 -0
  9. package/dist/graph/rank.js +10 -0
  10. package/dist/graph/rank.js.map +1 -0
  11. package/dist/graph/schema.d.ts +4 -0
  12. package/dist/graph/schema.d.ts.map +1 -0
  13. package/dist/graph/schema.js +74 -0
  14. package/dist/graph/schema.js.map +1 -0
  15. package/dist/graph/store.d.ts +56 -0
  16. package/dist/graph/store.d.ts.map +1 -0
  17. package/dist/graph/store.js +163 -0
  18. package/dist/graph/store.js.map +1 -0
  19. package/dist/graph/traverse.d.ts +20 -0
  20. package/dist/graph/traverse.d.ts.map +1 -0
  21. package/dist/graph/traverse.js +81 -0
  22. package/dist/graph/traverse.js.map +1 -0
  23. package/dist/graph/types.d.ts +48 -0
  24. package/dist/graph/types.d.ts.map +1 -0
  25. package/dist/graph/types.js +4 -0
  26. package/dist/graph/types.js.map +1 -0
  27. package/dist/index.d.ts +13 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +16 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mcp/responses.d.ts +19 -0
  32. package/dist/mcp/responses.d.ts.map +1 -0
  33. package/dist/mcp/responses.js +25 -0
  34. package/dist/mcp/responses.js.map +1 -0
  35. package/dist/mcp/server.d.ts +16 -0
  36. package/dist/mcp/server.d.ts.map +1 -0
  37. package/dist/mcp/server.js +88 -0
  38. package/dist/mcp/server.js.map +1 -0
  39. package/dist/mcp/tools/cs_blast_radius.d.ts +3 -0
  40. package/dist/mcp/tools/cs_blast_radius.d.ts.map +1 -0
  41. package/dist/mcp/tools/cs_blast_radius.js +96 -0
  42. package/dist/mcp/tools/cs_blast_radius.js.map +1 -0
  43. package/dist/mcp/tools/cs_get_context.d.ts +3 -0
  44. package/dist/mcp/tools/cs_get_context.d.ts.map +1 -0
  45. package/dist/mcp/tools/cs_get_context.js +80 -0
  46. package/dist/mcp/tools/cs_get_context.js.map +1 -0
  47. package/dist/mcp/tools/cs_index_repo.d.ts +3 -0
  48. package/dist/mcp/tools/cs_index_repo.d.ts.map +1 -0
  49. package/dist/mcp/tools/cs_index_repo.js +45 -0
  50. package/dist/mcp/tools/cs_index_repo.js.map +1 -0
  51. package/dist/mcp/tools/cs_index_status.d.ts +3 -0
  52. package/dist/mcp/tools/cs_index_status.d.ts.map +1 -0
  53. package/dist/mcp/tools/cs_index_status.js +31 -0
  54. package/dist/mcp/tools/cs_index_status.js.map +1 -0
  55. package/dist/mcp/tools/cs_search_symbols.d.ts +3 -0
  56. package/dist/mcp/tools/cs_search_symbols.d.ts.map +1 -0
  57. package/dist/mcp/tools/cs_search_symbols.js +51 -0
  58. package/dist/mcp/tools/cs_search_symbols.js.map +1 -0
  59. package/dist/mcp/tools/index.d.ts +4 -0
  60. package/dist/mcp/tools/index.d.ts.map +1 -0
  61. package/dist/mcp/tools/index.js +14 -0
  62. package/dist/mcp/tools/index.js.map +1 -0
  63. package/dist/mcp/types.d.ts +22 -0
  64. package/dist/mcp/types.d.ts.map +1 -0
  65. package/dist/mcp/types.js +2 -0
  66. package/dist/mcp/types.js.map +1 -0
  67. package/dist/parser/extractor.d.ts +16 -0
  68. package/dist/parser/extractor.d.ts.map +1 -0
  69. package/dist/parser/extractor.js +304 -0
  70. package/dist/parser/extractor.js.map +1 -0
  71. package/dist/parser/index.d.ts +30 -0
  72. package/dist/parser/index.d.ts.map +1 -0
  73. package/dist/parser/index.js +270 -0
  74. package/dist/parser/index.js.map +1 -0
  75. package/dist/parser/languages/python.d.ts +3 -0
  76. package/dist/parser/languages/python.d.ts.map +1 -0
  77. package/dist/parser/languages/python.js +14 -0
  78. package/dist/parser/languages/python.js.map +1 -0
  79. package/dist/parser/languages/query-loader.d.ts +10 -0
  80. package/dist/parser/languages/query-loader.d.ts.map +1 -0
  81. package/dist/parser/languages/query-loader.js +33 -0
  82. package/dist/parser/languages/query-loader.js.map +1 -0
  83. package/dist/parser/languages/registry.d.ts +25 -0
  84. package/dist/parser/languages/registry.d.ts.map +1 -0
  85. package/dist/parser/languages/registry.js +33 -0
  86. package/dist/parser/languages/registry.js.map +1 -0
  87. package/dist/parser/languages/typescript.d.ts +11 -0
  88. package/dist/parser/languages/typescript.d.ts.map +1 -0
  89. package/dist/parser/languages/typescript.js +26 -0
  90. package/dist/parser/languages/typescript.js.map +1 -0
  91. package/dist/parser/types.d.ts +36 -0
  92. package/dist/parser/types.d.ts.map +1 -0
  93. package/dist/parser/types.js +2 -0
  94. package/dist/parser/types.js.map +1 -0
  95. package/dist/session/manager.d.ts +28 -0
  96. package/dist/session/manager.d.ts.map +1 -0
  97. package/dist/session/manager.js +82 -0
  98. package/dist/session/manager.js.map +1 -0
  99. package/dist/session/pruner.d.ts +28 -0
  100. package/dist/session/pruner.d.ts.map +1 -0
  101. package/dist/session/pruner.js +24 -0
  102. package/dist/session/pruner.js.map +1 -0
  103. package/dist/session/types.d.ts +21 -0
  104. package/dist/session/types.d.ts.map +1 -0
  105. package/dist/session/types.js +4 -0
  106. package/dist/session/types.js.map +1 -0
  107. package/dist/utils/logger.d.ts +13 -0
  108. package/dist/utils/logger.d.ts.map +1 -0
  109. package/dist/utils/logger.js +36 -0
  110. package/dist/utils/logger.js.map +1 -0
  111. package/dist/utils/paths.d.ts +24 -0
  112. package/dist/utils/paths.d.ts.map +1 -0
  113. package/dist/utils/paths.js +55 -0
  114. package/dist/utils/paths.js.map +1 -0
  115. package/dist/utils/tokens.d.ts +10 -0
  116. package/dist/utils/tokens.d.ts.map +1 -0
  117. package/dist/utils/tokens.js +28 -0
  118. package/dist/utils/tokens.js.map +1 -0
  119. package/dist/watcher/hasher.d.ts +11 -0
  120. package/dist/watcher/hasher.d.ts.map +1 -0
  121. package/dist/watcher/hasher.js +29 -0
  122. package/dist/watcher/hasher.js.map +1 -0
  123. package/dist/watcher/index.d.ts +9 -0
  124. package/dist/watcher/index.d.ts.map +1 -0
  125. package/dist/watcher/index.js +100 -0
  126. package/dist/watcher/index.js.map +1 -0
  127. package/grammars/python/tags.scm +16 -0
  128. package/grammars/typescript/tags.scm +39 -0
  129. package/hooks/pre-tool-use.js +46 -0
  130. package/package.json +89 -0
  131. package/templates/CLAUDE.md +50 -0
  132. package/templates/mcp-config-claude-code.json +9 -0
  133. package/templates/mcp-config-cline.json +15 -0
  134. package/templates/mcp-config-cursor.json +9 -0
@@ -0,0 +1,304 @@
1
+ // Symbol + import extractor.
2
+ //
3
+ // Given source code and a language plugin, run the tags.scm query and turn the matches into
4
+ // structured ParseResult { symbols, imports }. This is pure (no DB, no fs) so it's trivially
5
+ // testable with golden files.
6
+ //
7
+ // Key responsibilities:
8
+ // - pair each @definition.* capture with its sibling @name capture in the same match
9
+ // - compute a condensed signature (first line of the declaration, no body)
10
+ // - for TS `const x = ...` (captured as variable), reclassify as a function if the value is
11
+ // an arrow function or function expression
12
+ // - read class heritage clauses (extends/implements) directly off the class node — more robust
13
+ // than encoding them as nested optional query patterns
14
+ // - parse import nodes to extract the source specifier + imported names
15
+ import Parser, { Query } from 'tree-sitter';
16
+ import { typescriptGrammarForFile } from './languages/typescript.js';
17
+ // One cached Query per plugin (Query construction is a bit expensive and the query is static).
18
+ const queryCache = new WeakMap();
19
+ // Parser instances are reusable; we keep one per plugin to amortize setup. Indexing is
20
+ // synchronous per file so reusing a parser is safe.
21
+ const parserCache = new WeakMap();
22
+ /** Build (or fetch) a cached Query for a plugin's default grammar. */
23
+ export function getQuery(plugin) {
24
+ let q = queryCache.get(plugin);
25
+ if (!q) {
26
+ // Query throws on a malformed/invalid query string. We surface that as a clear error.
27
+ try {
28
+ q = new Query(plugin.language, plugin.query);
29
+ }
30
+ catch (err) {
31
+ throw new Error(`Invalid tree-sitter query for '${plugin.id}': ${err.message}`);
32
+ }
33
+ queryCache.set(plugin, q);
34
+ }
35
+ return q;
36
+ }
37
+ /** Build (or fetch) a cached Parser for a plugin. */
38
+ export function getParser(plugin) {
39
+ let p = parserCache.get(plugin);
40
+ if (!p) {
41
+ p = new Parser();
42
+ p.setLanguage(plugin.language);
43
+ parserCache.set(plugin, p);
44
+ }
45
+ return p;
46
+ }
47
+ /**
48
+ * Extract symbols + imports from source code.
49
+ *
50
+ * @param source - raw file text
51
+ * @param plugin - the language plugin (provides grammar + query)
52
+ * @param filePath - used only to pick tsx vs ts grammar for the TS family
53
+ */
54
+ export function extractSymbols(source, plugin, filePath) {
55
+ // For TS, pick the right grammar (tsx vs ts) and parse with a parser set to it.
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ let language = plugin.language;
58
+ const parser = new Parser();
59
+ if (plugin.id === 'typescript' && filePath) {
60
+ const grammar = typescriptGrammarForFile(filePath);
61
+ if (grammar) {
62
+ language = grammar;
63
+ parser.setLanguage(grammar);
64
+ }
65
+ else {
66
+ parser.setLanguage(plugin.language);
67
+ }
68
+ }
69
+ else {
70
+ parser.setLanguage(plugin.language);
71
+ }
72
+ const tree = parser.parse(source);
73
+ if (!tree)
74
+ return { symbols: [], imports: [] };
75
+ // Use a query compiled against THIS grammar (tsx vs ts have different node schemas).
76
+ let query;
77
+ try {
78
+ query = new Query(language, plugin.query);
79
+ }
80
+ catch (err) {
81
+ throw new Error(`Invalid tree-sitter query for '${plugin.id}': ${err.message}`);
82
+ }
83
+ const matches = query.matches(tree.rootNode);
84
+ const symbols = [];
85
+ const imports = [];
86
+ const seenSymbolKeys = new Set(); // dedupe (some patterns overlap)
87
+ for (const match of matches) {
88
+ // Bucket captures by name within this match.
89
+ let defKind = null;
90
+ let defNode = null;
91
+ let nameNode = null;
92
+ let isImport = false;
93
+ for (const cap of match.captures) {
94
+ if (cap.name === 'import') {
95
+ isImport = true;
96
+ // don't break — there may be no other captures
97
+ }
98
+ else if (cap.name.startsWith('definition.')) {
99
+ defKind = cap.name.replace('definition.', '');
100
+ defNode = cap.node;
101
+ }
102
+ else if (cap.name === 'name') {
103
+ nameNode = cap.node;
104
+ }
105
+ }
106
+ if (isImport) {
107
+ const imp = parseImportNode(match.captures[0].node, plugin.id);
108
+ if (imp)
109
+ imports.push(imp);
110
+ continue;
111
+ }
112
+ if (!defKind || !defNode || !nameNode)
113
+ continue;
114
+ const name = nameNode.text;
115
+ if (!name)
116
+ continue;
117
+ let kind = defKind;
118
+ // Reclassify TS `const x = () => ...` (captured as variable) as a function.
119
+ // The captured node may be the lexical_declaration (parent) or the variable_declarator;
120
+ // find the declarator either way, then inspect its value.
121
+ if (kind === 'variable' && plugin.id === 'typescript' && defNode) {
122
+ const declarator = defNode.type === 'variable_declarator'
123
+ ? defNode
124
+ : defNode.childForFieldName('declaration') ?? // export_statement
125
+ (defNode.namedChildren.find((c) => c.type === 'variable_declarator') ?? null);
126
+ const valueNode = declarator?.childForFieldName('value') ?? null;
127
+ if (valueNode && isFunctionValueNode(valueNode)) {
128
+ kind = 'function';
129
+ }
130
+ }
131
+ const key = `${kind}:${name}:${defNode.startPosition.row}`;
132
+ if (seenSymbolKeys.has(key))
133
+ continue;
134
+ seenSymbolKeys.add(key);
135
+ const symbol = {
136
+ name,
137
+ kind,
138
+ line_start: defNode.startPosition.row + 1, // tree-sitter rows are 0-based
139
+ line_end: defNode.endPosition.row + 1,
140
+ signature: signatureFor(defNode),
141
+ };
142
+ // Class inheritance: read heritage clauses directly off the class node (TS).
143
+ if (kind === 'class' && plugin.id === 'typescript') {
144
+ const heritage = readTsClassHeritage(defNode);
145
+ if (heritage.extends.length)
146
+ symbol.extends = heritage.extends;
147
+ if (heritage.implements.length)
148
+ symbol.implements = heritage.implements;
149
+ }
150
+ // Python class bases live in the argument_list; the query already captured @extends names.
151
+ if (kind === 'class' && plugin.id === 'python') {
152
+ const ext = match.captures
153
+ .filter((c) => c.name === 'extends')
154
+ .map((c) => c.node.text)
155
+ .filter((t) => t && !['object'].includes(t)); // drop implicit `object`
156
+ if (ext.length)
157
+ symbol.extends = ext;
158
+ }
159
+ symbols.push(symbol);
160
+ }
161
+ return { symbols, imports };
162
+ }
163
+ /** Is a TS variable's value a function-shaped node (arrow or function expression)? */
164
+ function isFunctionValueNode(node) {
165
+ return node.type === 'arrow_function' || node.type === 'function_expression';
166
+ }
167
+ /**
168
+ * Build a condensed signature: the first line of the declaration, with the body elided.
169
+ * e.g. "export function login(u: string): Token {" → "function login(u: string): Token"
170
+ */
171
+ function signatureFor(node) {
172
+ // For a variable_declarator captured as variable/function, the parent lexical_declaration
173
+ // holds the `export`/`const` prefix. Use the declarator text for the signature.
174
+ let text;
175
+ if (node.type === 'variable_declarator') {
176
+ // Include the leading const/let/export by walking to the parent statement if present.
177
+ const parent = node.parent;
178
+ if (parent && (parent.type === 'lexical_declaration' || parent.type === 'export_statement')) {
179
+ const kw = parent.type === 'export_statement' ? 'export ' : '';
180
+ const decl = parent.type === 'export_statement' ? parent.childForFieldName('declaration') : parent;
181
+ const prefix = decl && decl.type === 'lexical_declaration' ? firstToken(decl) : 'const';
182
+ text = `${kw}${prefix} ${node.text}`;
183
+ }
184
+ else {
185
+ text = node.text;
186
+ }
187
+ }
188
+ else {
189
+ text = node.text;
190
+ }
191
+ // Take the first line and trim the trailing { or ; and surrounding whitespace.
192
+ const firstLine = text.split('\n')[0] ?? text;
193
+ return firstLine.replace(/[{;]\s*$/, '').trim();
194
+ }
195
+ function firstToken(decl) {
196
+ const child = decl.firstChild;
197
+ return child ? child.text : 'const';
198
+ }
199
+ /**
200
+ * Read extends/implements heritage clause names from a TS class_declaration node.
201
+ * The grammar puts these under class_heritage → extends_clause / implements_clause.
202
+ */
203
+ function readTsClassHeritage(classNode) {
204
+ const result = { extends: [], implements: [] };
205
+ // Walk immediate + heritage children for clause nodes.
206
+ const walk = (n) => {
207
+ for (const child of n.namedChildren ?? []) {
208
+ if (child.type === 'extends_clause') {
209
+ const value = child.childForFieldName('value');
210
+ if (value)
211
+ result.extends.push(value.text.split('<')[0]); // strip generic args
212
+ }
213
+ else if (child.type === 'implements_clause') {
214
+ for (const t of child.namedChildren) {
215
+ if (t.type === 'type_identifier' || t.type === 'generic_type') {
216
+ result.implements.push(t.text.split('<')[0]);
217
+ }
218
+ }
219
+ }
220
+ if (child.namedChildren?.length)
221
+ walk(child);
222
+ }
223
+ };
224
+ walk(classNode);
225
+ return result;
226
+ }
227
+ /**
228
+ * Parse an import node into { specifier, names }. Handles the common shapes for TS and Python.
229
+ */
230
+ function parseImportNode(node, language) {
231
+ const text = node.text;
232
+ if (language === 'typescript') {
233
+ return parseTsImport(node, text);
234
+ }
235
+ if (language === 'python') {
236
+ return parsePythonImport(node, text);
237
+ }
238
+ return { specifier: text, names: [] };
239
+ }
240
+ /** TS imports: extract the source string and the imported binding names. */
241
+ function parseTsImport(node, text) {
242
+ // Source: the string literal (last child of the import statement, typically).
243
+ const sourceClause = node.childForFieldName('source');
244
+ const specifier = sourceClause
245
+ ? sourceClause.text.replace(/^["']|["']$/g, '')
246
+ : extractStringLiteral(text);
247
+ const names = [];
248
+ // named imports: import { A, B as C } from "..."
249
+ const namedFields = node.descendantsOfType('import_clause');
250
+ for (const clause of namedFields) {
251
+ for (const spec of clause.descendantsOfType('import_specifier')) {
252
+ const nameNode = spec.childForFieldName('name');
253
+ if (nameNode)
254
+ names.push(nameNode.text);
255
+ }
256
+ // default import: import DefaultName from "..."
257
+ const idents = clause.namedChildren.filter((c) => c.type === 'identifier');
258
+ for (const id of idents) {
259
+ if (!names.includes(id.text))
260
+ names.push(id.text);
261
+ }
262
+ // namespace import: import * as Ns from "..."
263
+ const ns = clause.descendantsOfType('namespace_import');
264
+ for (const n of ns) {
265
+ // namespace_import node's sibling identifier holds the name
266
+ const id = n.nextNamedSibling;
267
+ if (id)
268
+ names.push(id.text);
269
+ }
270
+ }
271
+ return { specifier, names };
272
+ }
273
+ /** Python imports: `import a.b as c` or `from m import x, y as z`. */
274
+ function parsePythonImport(node, text) {
275
+ // from_statement has module: ... and names: ...
276
+ if (node.type === 'import_from_statement') {
277
+ const moduleNode = node.childForFieldName('module');
278
+ const specifier = moduleNode ? moduleNode.text : '';
279
+ const names = [];
280
+ const dotted = node.descendantsOfType('dotted_name');
281
+ for (const d of dotted) {
282
+ // the last segment is the imported binding name for `from m import x`
283
+ const segs = d.text.split('.');
284
+ const last = segs[segs.length - 1];
285
+ if (last && !names.includes(last))
286
+ names.push(last);
287
+ }
288
+ return { specifier, names };
289
+ }
290
+ // plain import: `import a.b.c` → specifier a.b.c, names [a] (the binding)
291
+ const dotted = node.descendantsOfType('dotted_name');
292
+ if (dotted.length) {
293
+ const specifier = dotted[0].text;
294
+ const last = specifier.split('.')[0]; // `import a.b` binds `a`
295
+ return { specifier, names: [last] };
296
+ }
297
+ return { specifier: text, names: [] };
298
+ }
299
+ /** Last resort: pull a quoted string out of raw import text. */
300
+ function extractStringLiteral(text) {
301
+ const m = text.match(/from\s+(['"])(.*?)\1/) || text.match(/import\s+(['"])(.*?)\1/);
302
+ return m ? m[2] : '';
303
+ }
304
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/parser/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { GraphStore } from '../graph/store.js';
2
+ /** Default ignored directories during indexing. */
3
+ export declare const IGNORED_DIRS: Set<string>;
4
+ /** Index a single file into the store (replaces its prior symbols). Returns the file id. */
5
+ export declare function indexFile(store: GraphStore, projectRoot: string, absoluteFilePath: string, source: string, contentHash: string): {
6
+ fileId: number;
7
+ symbolIds: {
8
+ name: string;
9
+ id: number;
10
+ }[];
11
+ } | null;
12
+ export interface IndexOptions {
13
+ /** Force re-index even when the stored content hash matches. */
14
+ force?: boolean;
15
+ }
16
+ export interface IndexResult {
17
+ filesIndexed: number;
18
+ filesSkipped: number;
19
+ symbols: number;
20
+ edges: number;
21
+ durationMs: number;
22
+ }
23
+ /**
24
+ * Index an entire project: walk supported files, parse each, persist symbols, then resolve
25
+ * cross-file imports + inheritance into edges.
26
+ */
27
+ export declare function indexRepository(store: GraphStore, projectRoot: string, opts?: IndexOptions): IndexResult;
28
+ /** Walk the project tree, returning absolute paths of supported files, respecting ignores. */
29
+ export declare function collectSupportedFiles(root: string): string[];
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQ/C,mDAAmD;AACnD,eAAO,MAAM,YAAY,aAcvB,CAAC;AAIH,4FAA4F;AAC5F,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,IAAI,CAiCtE;AAED,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,YAAiB,GACtB,WAAW,CAgIb;AAqCD,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA+B5D"}
@@ -0,0 +1,270 @@
1
+ // Parser entry point: indexFile + indexRepository.
2
+ //
3
+ // indexFile: parse one file, persist its symbols to the graph (idempotent — re-indexing a file
4
+ // replaces its symbols).
5
+ // indexRepository: walk the project tree, index every supported file, then resolve all
6
+ // cross-file imports + class inheritance into symbol→symbol edges.
7
+ //
8
+ // Edge resolution (v0.1 scope): we resolve RELATIVE imports ('./x', '../y') to target files on
9
+ // disk and create 'imports' edges between same-named symbols. We also create 'extends'/'implements'
10
+ // edges from class symbols to their base/interface names when those resolve to known symbols.
11
+ // Bare specifiers ('react', '@myorg/ui') are deferred to monorepo resolution (v0.3) — we record
12
+ // the import but don't create an edge.
13
+ import { createHash } from 'node:crypto';
14
+ import { readdirSync, readFileSync, statSync, existsSync } from 'node:fs';
15
+ import { join, relative, resolve } from 'node:path';
16
+ import { extractSymbols } from './extractor.js';
17
+ import { pluginForFile } from './languages/registry.js';
18
+ import { resolveRelativeImport, toPosix } from '../utils/paths.js';
19
+ import { log } from '../utils/logger.js';
20
+ /** Default ignored directories during indexing. */
21
+ export const IGNORED_DIRS = new Set([
22
+ 'node_modules',
23
+ '.git',
24
+ '.sliver',
25
+ 'dist',
26
+ 'build',
27
+ 'out',
28
+ '__pycache__',
29
+ '.next',
30
+ '.nuxt',
31
+ 'coverage',
32
+ '.cache',
33
+ '.turbo',
34
+ '.verdaccio',
35
+ ]);
36
+ const IGNORED_SUFFIXES = ['.min.js', '.min.css', '.map'];
37
+ /** Index a single file into the store (replaces its prior symbols). Returns the file id. */
38
+ export function indexFile(store, projectRoot, absoluteFilePath, source, contentHash) {
39
+ const relPath = toPosix(relative(resolve(projectRoot), absoluteFilePath));
40
+ const plugin = pluginForFile(relPath);
41
+ if (!plugin)
42
+ return null;
43
+ let parseResult;
44
+ try {
45
+ parseResult = extractSymbols(source, plugin, relPath);
46
+ }
47
+ catch (err) {
48
+ log(`Failed to parse ${relPath}: ${err.message}`, 'warn');
49
+ return null;
50
+ }
51
+ return store.transaction(() => {
52
+ const fileId = store.upsertFile(relPath, contentHash, plugin.id);
53
+ store.deleteFileSymbols(fileId); // clean slate for this file
54
+ const symbolIds = [];
55
+ for (const sym of parseResult.symbols) {
56
+ const id = store.insertSymbol({
57
+ file_id: fileId,
58
+ name: sym.name,
59
+ kind: sym.kind,
60
+ line_start: sym.line_start,
61
+ line_end: sym.line_end,
62
+ signature: sym.signature,
63
+ package: null,
64
+ });
65
+ symbolIds.push({ name: sym.name, id });
66
+ }
67
+ return { fileId, symbolIds };
68
+ });
69
+ }
70
+ /**
71
+ * Index an entire project: walk supported files, parse each, persist symbols, then resolve
72
+ * cross-file imports + inheritance into edges.
73
+ */
74
+ export function indexRepository(store, projectRoot, opts = {}) {
75
+ const start = Date.now();
76
+ const root = resolve(projectRoot);
77
+ const files = collectSupportedFiles(root);
78
+ log(`Indexing ${files.length} file(s) under ${root}`);
79
+ // 1) Parse + persist symbols (and remember per-file imports for the edge pass).
80
+ const fileMeta = new Map();
81
+ let filesIndexed = 0;
82
+ let filesSkipped = 0;
83
+ for (const absPath of files) {
84
+ const relPath = toPosix(relative(root, absPath));
85
+ const source = safeRead(absPath);
86
+ if (source === null)
87
+ continue;
88
+ const contentHash = sha256(source);
89
+ if (!opts.force) {
90
+ const existing = store.getFileHash(relPath);
91
+ if (existing === contentHash) {
92
+ filesSkipped++;
93
+ // Still need fileMeta for edge resolution if symbols already exist.
94
+ hydrateFileMeta(store, relPath, fileMeta);
95
+ continue;
96
+ }
97
+ }
98
+ const result = indexFile(store, root, absPath, source, contentHash);
99
+ if (!result)
100
+ continue;
101
+ filesIndexed++;
102
+ const plugin = pluginForFile(relPath);
103
+ let parseResult;
104
+ try {
105
+ parseResult = extractSymbols(source, plugin, relPath);
106
+ }
107
+ catch {
108
+ parseResult = { symbols: [], imports: [] };
109
+ }
110
+ const symbolsByName = new Map();
111
+ for (const { name, id } of result.symbolIds)
112
+ symbolsByName.set(name, id);
113
+ fileMeta.set(relPath, {
114
+ fileId: result.fileId,
115
+ symbolsByName,
116
+ imports: parseResult.imports,
117
+ symbols: parseResult.symbols,
118
+ });
119
+ }
120
+ // 2) Resolve imports → edges.
121
+ //
122
+ // An import "file A imports symbol X from file B" doesn't name a symbol in A — A merely
123
+ // references X. Our edges are symbol→symbol, so we model this as: every top-level symbol in A
124
+ // (which lives in A's module scope and may reference X) gets an 'imports' edge to X in B.
125
+ // This is an over-approximation (not every symbol in A uses X) but it's sound for v0.1's
126
+ // "what does this symbol connect to?" traversal; precise call-graph edges land in a later phase.
127
+ let edges = 0;
128
+ const topLevelsOf = (meta) => meta.symbols
129
+ .filter((s) => s.kind === 'class' || s.kind === 'interface' || s.kind === 'type' || s.kind === 'function' || s.kind === 'variable')
130
+ .map((s) => meta.symbolsByName.get(s.name))
131
+ .filter((id) => id !== undefined);
132
+ for (const [importerRel, meta] of fileMeta) {
133
+ const importerTopLevels = topLevelsOf(meta);
134
+ for (const imp of meta.imports) {
135
+ const targetRel = resolveRelativeImport(imp.specifier, importerRel, root);
136
+ if (!targetRel)
137
+ continue; // bare/builtin or not found on disk
138
+ const targetMeta = fileMeta.get(targetRel);
139
+ if (!targetMeta)
140
+ continue;
141
+ for (const name of imp.names) {
142
+ const toId = targetMeta.symbolsByName.get(name);
143
+ if (toId === undefined)
144
+ continue;
145
+ // Connect every top-level importer symbol to the imported symbol.
146
+ for (const fromId of importerTopLevels) {
147
+ store.insertEdge(fromId, toId, 'imports');
148
+ edges++;
149
+ }
150
+ }
151
+ }
152
+ // 3) Resolve class inheritance edges (extends/implements) within the file.
153
+ for (const sym of meta.symbols) {
154
+ if (sym.kind !== 'class')
155
+ continue;
156
+ const fromId = meta.symbolsByName.get(sym.name);
157
+ if (!fromId)
158
+ continue;
159
+ for (const edgeKind of ['extends', 'implements']) {
160
+ const targets = edgeKind === 'extends' ? sym.extends : sym.implements;
161
+ for (const targetName of targets ?? []) {
162
+ // resolve in this file first, else any symbol with that name
163
+ let toId = meta.symbolsByName.get(targetName);
164
+ if (!toId) {
165
+ const found = store.findSymbolByName(targetName);
166
+ if (found)
167
+ toId = found.id;
168
+ }
169
+ if (toId) {
170
+ store.insertEdge(fromId, toId, edgeKind);
171
+ edges++;
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ const stats = store.stats();
178
+ const durationMs = Date.now() - start;
179
+ log(`Index done: ${filesIndexed} indexed, ${filesSkipped} skipped, ` +
180
+ `${stats.symbols} symbols, ${edges} new edges in ${durationMs}ms`);
181
+ return {
182
+ filesIndexed,
183
+ filesSkipped,
184
+ symbols: stats.symbols,
185
+ edges,
186
+ durationMs,
187
+ };
188
+ }
189
+ /** If we skipped a file (hash match), load its existing symbols from the store for edge resolution. */
190
+ function hydrateFileMeta(store, relPath, fileMeta) {
191
+ const file = store.getFile(relPath);
192
+ if (!file)
193
+ return;
194
+ // symbols: query all symbols in this file
195
+ const symbols = store.raw
196
+ .prepare('SELECT id, name, kind, line_start, line_end FROM symbols WHERE file_id = ?')
197
+ .all(file.id);
198
+ const symbolsByName = new Map();
199
+ for (const s of symbols)
200
+ symbolsByName.set(s.name, s.id);
201
+ // imports: re-parse to get import specifiers (cheap relative to DB; we don't store imports)
202
+ const absPath = resolve(relPath);
203
+ let imports = [];
204
+ if (existsSync(absPath)) {
205
+ const src = safeRead(absPath);
206
+ if (src) {
207
+ const plugin = pluginForFile(relPath);
208
+ if (plugin) {
209
+ try {
210
+ imports = extractSymbols(src, plugin, relPath).imports;
211
+ }
212
+ catch {
213
+ imports = [];
214
+ }
215
+ }
216
+ }
217
+ }
218
+ fileMeta.set(relPath, { fileId: file.id, symbolsByName, imports, symbols: [] });
219
+ }
220
+ /** Walk the project tree, returning absolute paths of supported files, respecting ignores. */
221
+ export function collectSupportedFiles(root) {
222
+ const out = [];
223
+ const walk = (dir) => {
224
+ let entries;
225
+ try {
226
+ entries = readdirSync(dir);
227
+ }
228
+ catch {
229
+ return;
230
+ }
231
+ for (const name of entries) {
232
+ if (IGNORED_DIRS.has(name))
233
+ continue;
234
+ const full = join(dir, name);
235
+ let st;
236
+ try {
237
+ st = statSync(full);
238
+ }
239
+ catch {
240
+ continue;
241
+ }
242
+ if (st.isDirectory()) {
243
+ if (name.startsWith('.') && name !== '.')
244
+ continue; // hidden dirs
245
+ walk(full);
246
+ }
247
+ else if (st.isFile()) {
248
+ if (IGNORED_SUFFIXES.some((sfx) => name.endsWith(sfx)))
249
+ continue;
250
+ if (pluginForFile(toPosix(relative(root, full)))) {
251
+ out.push(full);
252
+ }
253
+ }
254
+ }
255
+ };
256
+ walk(root);
257
+ return out;
258
+ }
259
+ function safeRead(absPath) {
260
+ try {
261
+ return readFileSync(absPath, 'utf-8');
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ }
267
+ function sha256(s) {
268
+ return createHash('sha256').update(s).digest('hex');
269
+ }
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LanguagePlugin } from './registry.js';
2
+ export declare const pythonPlugin: LanguagePlugin;
3
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/parser/languages/python.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,eAAO,MAAM,YAAY,EAAE,cAK1B,CAAC"}