edhindex 1.1.0 → 2.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.
Files changed (190) hide show
  1. package/README.md +31 -11
  2. package/dist/cli/index.js +1 -1
  3. package/dist/embeddings/transformers.d.ts.map +1 -1
  4. package/dist/graph/builder.d.ts.map +1 -1
  5. package/dist/graph/builder.js +13 -0
  6. package/dist/graph/builder.js.map +1 -1
  7. package/dist/graph/serve.js.map +1 -1
  8. package/dist/graph/service.d.ts.map +1 -1
  9. package/dist/graph/storage.d.ts.map +1 -1
  10. package/dist/graph/types.d.ts +1 -1
  11. package/dist/graph/types.d.ts.map +1 -1
  12. package/dist/graph/types.js.map +1 -1
  13. package/dist/indexer/fixture.test.js.map +1 -1
  14. package/dist/indexer/indexer.d.ts.map +1 -1
  15. package/dist/indexer/parser.js.map +1 -1
  16. package/dist/language/adapters/astro.d.ts +12 -0
  17. package/dist/language/adapters/astro.d.ts.map +1 -0
  18. package/dist/language/adapters/astro.js +195 -0
  19. package/dist/language/adapters/astro.js.map +1 -0
  20. package/dist/language/adapters/c.d.ts.map +1 -1
  21. package/dist/language/adapters/c.js.map +1 -1
  22. package/dist/language/adapters/config.d.ts +14 -0
  23. package/dist/language/adapters/config.d.ts.map +1 -0
  24. package/dist/language/adapters/config.js +136 -0
  25. package/dist/language/adapters/config.js.map +1 -0
  26. package/dist/language/adapters/cpp.d.ts.map +1 -1
  27. package/dist/language/adapters/cpp.js.map +1 -1
  28. package/dist/language/adapters/csharp.d.ts.map +1 -1
  29. package/dist/language/adapters/csharp.js.map +1 -1
  30. package/dist/language/adapters/css.d.ts.map +1 -1
  31. package/dist/language/adapters/css.js.map +1 -1
  32. package/dist/language/adapters/csv.d.ts +11 -0
  33. package/dist/language/adapters/csv.d.ts.map +1 -0
  34. package/dist/language/adapters/csv.js +103 -0
  35. package/dist/language/adapters/csv.js.map +1 -0
  36. package/dist/language/adapters/dart.d.ts +7 -0
  37. package/dist/language/adapters/dart.d.ts.map +1 -0
  38. package/dist/language/adapters/dart.js +37 -0
  39. package/dist/language/adapters/dart.js.map +1 -0
  40. package/dist/language/adapters/dockerfile.d.ts +12 -0
  41. package/dist/language/adapters/dockerfile.d.ts.map +1 -0
  42. package/dist/language/adapters/dockerfile.js +71 -0
  43. package/dist/language/adapters/dockerfile.js.map +1 -0
  44. package/dist/language/adapters/documentation.d.ts +12 -0
  45. package/dist/language/adapters/documentation.d.ts.map +1 -0
  46. package/dist/language/adapters/documentation.js +146 -0
  47. package/dist/language/adapters/documentation.js.map +1 -0
  48. package/dist/language/adapters/go.d.ts.map +1 -1
  49. package/dist/language/adapters/go.js.map +1 -1
  50. package/dist/language/adapters/haskell.d.ts +7 -0
  51. package/dist/language/adapters/haskell.d.ts.map +1 -0
  52. package/dist/language/adapters/haskell.js +33 -0
  53. package/dist/language/adapters/haskell.js.map +1 -0
  54. package/dist/language/adapters/html.d.ts.map +1 -1
  55. package/dist/language/adapters/html.js.map +1 -1
  56. package/dist/language/adapters/java.d.ts.map +1 -1
  57. package/dist/language/adapters/java.js.map +1 -1
  58. package/dist/language/adapters/javascript.d.ts.map +1 -1
  59. package/dist/language/adapters/javascript.js.map +1 -1
  60. package/dist/language/adapters/json-variants.d.ts +11 -0
  61. package/dist/language/adapters/json-variants.d.ts.map +1 -0
  62. package/dist/language/adapters/json-variants.js +57 -0
  63. package/dist/language/adapters/json-variants.js.map +1 -0
  64. package/dist/language/adapters/json.d.ts.map +1 -1
  65. package/dist/language/adapters/json.js.map +1 -1
  66. package/dist/language/adapters/kotlin.d.ts +7 -0
  67. package/dist/language/adapters/kotlin.d.ts.map +1 -0
  68. package/dist/language/adapters/kotlin.js +35 -0
  69. package/dist/language/adapters/kotlin.js.map +1 -0
  70. package/dist/language/adapters/lua.d.ts +7 -0
  71. package/dist/language/adapters/lua.d.ts.map +1 -0
  72. package/dist/language/adapters/lua.js +32 -0
  73. package/dist/language/adapters/lua.js.map +1 -0
  74. package/dist/language/adapters/markdown.d.ts +12 -0
  75. package/dist/language/adapters/markdown.d.ts.map +1 -0
  76. package/dist/language/adapters/markdown.js +76 -0
  77. package/dist/language/adapters/markdown.js.map +1 -0
  78. package/dist/language/adapters/php.d.ts.map +1 -1
  79. package/dist/language/adapters/php.js.map +1 -1
  80. package/dist/language/adapters/python.d.ts.map +1 -1
  81. package/dist/language/adapters/python.js.map +1 -1
  82. package/dist/language/adapters/ruby.d.ts.map +1 -1
  83. package/dist/language/adapters/ruby.js.map +1 -1
  84. package/dist/language/adapters/rust.d.ts.map +1 -1
  85. package/dist/language/adapters/rust.js.map +1 -1
  86. package/dist/language/adapters/salesforce.d.ts +15 -0
  87. package/dist/language/adapters/salesforce.d.ts.map +1 -0
  88. package/dist/language/adapters/salesforce.js +223 -0
  89. package/dist/language/adapters/salesforce.js.map +1 -0
  90. package/dist/language/adapters/scala.d.ts +7 -0
  91. package/dist/language/adapters/scala.d.ts.map +1 -0
  92. package/dist/language/adapters/scala.js +37 -0
  93. package/dist/language/adapters/scala.js.map +1 -0
  94. package/dist/language/adapters/solidity.d.ts +7 -0
  95. package/dist/language/adapters/solidity.d.ts.map +1 -0
  96. package/dist/language/adapters/solidity.js +40 -0
  97. package/dist/language/adapters/solidity.js.map +1 -0
  98. package/dist/language/adapters/sql.d.ts +12 -0
  99. package/dist/language/adapters/sql.d.ts.map +1 -0
  100. package/dist/language/adapters/sql.js +93 -0
  101. package/dist/language/adapters/sql.js.map +1 -0
  102. package/dist/language/adapters/svelte.d.ts +11 -0
  103. package/dist/language/adapters/svelte.d.ts.map +1 -0
  104. package/dist/language/adapters/svelte.js +76 -0
  105. package/dist/language/adapters/svelte.js.map +1 -0
  106. package/dist/language/adapters/svg.d.ts +13 -0
  107. package/dist/language/adapters/svg.d.ts.map +1 -0
  108. package/dist/language/adapters/svg.js +130 -0
  109. package/dist/language/adapters/svg.js.map +1 -0
  110. package/dist/language/adapters/swift.d.ts +7 -0
  111. package/dist/language/adapters/swift.d.ts.map +1 -0
  112. package/dist/language/adapters/swift.js +42 -0
  113. package/dist/language/adapters/swift.js.map +1 -0
  114. package/dist/language/adapters/terraform.d.ts +7 -0
  115. package/dist/language/adapters/terraform.d.ts.map +1 -0
  116. package/dist/language/adapters/terraform.js +23 -0
  117. package/dist/language/adapters/terraform.js.map +1 -0
  118. package/dist/language/adapters/text.d.ts +14 -0
  119. package/dist/language/adapters/text.d.ts.map +1 -0
  120. package/dist/language/adapters/text.js +178 -0
  121. package/dist/language/adapters/text.js.map +1 -0
  122. package/dist/language/adapters/toml.d.ts +12 -0
  123. package/dist/language/adapters/toml.d.ts.map +1 -0
  124. package/dist/language/adapters/toml.js +79 -0
  125. package/dist/language/adapters/toml.js.map +1 -0
  126. package/dist/language/adapters/typescript.d.ts.map +1 -1
  127. package/dist/language/adapters/typescript.js.map +1 -1
  128. package/dist/language/adapters/vue.d.ts +11 -0
  129. package/dist/language/adapters/vue.d.ts.map +1 -0
  130. package/dist/language/adapters/vue.js +67 -0
  131. package/dist/language/adapters/vue.js.map +1 -0
  132. package/dist/language/adapters/xml.d.ts +12 -0
  133. package/dist/language/adapters/xml.d.ts.map +1 -0
  134. package/dist/language/adapters/xml.js +71 -0
  135. package/dist/language/adapters/xml.js.map +1 -0
  136. package/dist/language/adapters/yaml.d.ts +11 -0
  137. package/dist/language/adapters/yaml.d.ts.map +1 -0
  138. package/dist/language/adapters/yaml.js +60 -0
  139. package/dist/language/adapters/yaml.js.map +1 -0
  140. package/dist/language/base.d.ts.map +1 -1
  141. package/dist/language/base.js.map +1 -1
  142. package/dist/language/generic.d.ts.map +1 -1
  143. package/dist/language/registry.d.ts.map +1 -1
  144. package/dist/language/registry.js +51 -0
  145. package/dist/language/registry.js.map +1 -1
  146. package/dist/language/types.d.ts +14 -1
  147. package/dist/language/types.d.ts.map +1 -1
  148. package/dist/language/types.js +13 -0
  149. package/dist/language/types.js.map +1 -1
  150. package/dist/logging.d.ts.map +1 -1
  151. package/dist/mcp/server.js.map +1 -1
  152. package/dist/mcp-config.js.map +1 -1
  153. package/dist/retrieval/search.d.ts.map +1 -1
  154. package/dist/storage/fts.d.ts.map +1 -1
  155. package/dist/storage/metadata.d.ts.map +1 -1
  156. package/dist/vector/lancedb.d.ts.map +1 -1
  157. package/dist/watcher/index.d.ts.map +1 -1
  158. package/package.json +54 -2
  159. package/src/cli/index.ts +1 -1
  160. package/src/graph/builder.ts +13 -0
  161. package/src/graph/types.ts +14 -1
  162. package/src/language/adapters/astro.ts +206 -0
  163. package/src/language/adapters/config.ts +144 -0
  164. package/src/language/adapters/csv.ts +110 -0
  165. package/src/language/adapters/dart.ts +39 -0
  166. package/src/language/adapters/dockerfile.ts +78 -0
  167. package/src/language/adapters/documentation.ts +158 -0
  168. package/src/language/adapters/haskell.ts +35 -0
  169. package/src/language/adapters/json-variants.ts +60 -0
  170. package/src/language/adapters/kotlin.ts +37 -0
  171. package/src/language/adapters/lua.ts +34 -0
  172. package/src/language/adapters/markdown.ts +81 -0
  173. package/src/language/adapters/salesforce.ts +236 -0
  174. package/src/language/adapters/scala.ts +39 -0
  175. package/src/language/adapters/solidity.ts +42 -0
  176. package/src/language/adapters/sql.ts +99 -0
  177. package/src/language/adapters/svelte.ts +80 -0
  178. package/src/language/adapters/svg.ts +137 -0
  179. package/src/language/adapters/swift.ts +44 -0
  180. package/src/language/adapters/terraform.ts +25 -0
  181. package/src/language/adapters/text.ts +195 -0
  182. package/src/language/adapters/toml.ts +82 -0
  183. package/src/language/adapters/vue.ts +70 -0
  184. package/src/language/adapters/xml.ts +74 -0
  185. package/src/language/adapters/yaml.ts +63 -0
  186. package/src/language/registry.ts +53 -0
  187. package/src/language/types.ts +13 -0
  188. package/src/types/better-sqlite3.d.ts +55 -0
  189. package/src/types/cli-progress.d.ts +32 -0
  190. package/src/types/vitest.d.ts +11 -0
@@ -0,0 +1,25 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType } from '../types.js';
4
+
5
+ const GRAMMAR: GrammarConfig = {
6
+ language: 'hcl',
7
+ wasmPath: new URL('../../node_modules/@tree-sitter-grammars/tree-sitter-hcl/tree-sitter-hcl.wasm', import.meta.url).pathname,
8
+ queryPatterns: {
9
+ block: '(block (identifier) @name)',
10
+ attribute: '(attribute (identifier) @name)',
11
+ },
12
+ typeMap: {
13
+ block: SymbolType.Module,
14
+ attribute: SymbolType.Property,
15
+ },
16
+ nameNodeTypes: ['identifier'],
17
+ importNodeTypes: [],
18
+ exportNodeTypes: [],
19
+ };
20
+
21
+ export class TerraformAdapter extends BaseTreeSitterAdapter {
22
+ protected grammar = GRAMMAR;
23
+ languageName(): string { return 'Terraform'; }
24
+ fileExtensions(): string[] { return ['.tf', '.tfvars']; }
25
+ }
@@ -0,0 +1,195 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class TextAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'Text'; }
5
+ fileExtensions(): string[] { return ['.txt', '.log']; }
6
+ fileNames(): string[] { return []; }
7
+ canParse(filePath: string): boolean {
8
+ const lower = filePath.toLowerCase();
9
+ return lower.endsWith('.txt') || lower.endsWith('.log');
10
+ }
11
+ supportsSymbols(): boolean { return true; }
12
+
13
+ async parse(content: string, filePath: string): Promise<ParseResult> {
14
+ const lines = content.split('\n');
15
+ const symbols: CodeSymbol[] = [];
16
+ const imports: string[] = [];
17
+ const exports: string[] = [];
18
+ const comments: string[] = [];
19
+
20
+ if (filePath.endsWith('.log')) {
21
+ this.extractLogEntries(lines, symbols, filePath);
22
+ } else {
23
+ this.extractTextSections(lines, symbols, filePath);
24
+ }
25
+
26
+ return { symbols, imports, exports, comments };
27
+ }
28
+
29
+ private extractLogEntries(lines: string[], symbols: CodeSymbol[], filePath: string) {
30
+ const logPatterns = [
31
+ { regex: /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/i, type: SymbolType.Function },
32
+ { regex: /^\[?\d{4}-\d{2}-\d{2}\]?/i, type: SymbolType.Function },
33
+ { regex: /^(ERROR|WARN|INFO|DEBUG|FATAL)/i, type: SymbolType.Function },
34
+ { regex: /^Exception|Error|Warning/i, type: SymbolType.Function },
35
+ ];
36
+
37
+ for (let i = 0; i < lines.length; i++) {
38
+ const line = lines[i].trim();
39
+
40
+ if (!line) continue;
41
+
42
+ for (const pattern of logPatterns) {
43
+ if (pattern.regex.test(line)) {
44
+ symbols.push({
45
+ id: `${filePath}:${i + 1}`,
46
+ name: line.substring(0, 50),
47
+ type: pattern.type,
48
+ language: 'log',
49
+ file: filePath,
50
+ startLine: i + 1,
51
+ endLine: i + 1,
52
+ parent: null,
53
+ children: [],
54
+ metadata: { fullLine: line },
55
+ });
56
+ break;
57
+ }
58
+ }
59
+
60
+ // Extract stack traces
61
+ if (line.includes('at ') && line.includes('(') && line.includes(')')) {
62
+ symbols.push({
63
+ id: `${filePath}:${i + 1}:stack`,
64
+ name: 'stackTrace',
65
+ type: SymbolType.Function,
66
+ language: 'log',
67
+ file: filePath,
68
+ startLine: i + 1,
69
+ endLine: i + 1,
70
+ parent: null,
71
+ children: [],
72
+ metadata: { trace: line },
73
+ });
74
+ }
75
+ }
76
+ }
77
+
78
+ private extractTextSections(lines: string[], symbols: CodeSymbol[], filePath: string) {
79
+ let currentSection: string | null = null;
80
+ let currentSectionId: string | null = null;
81
+ let sectionStart = 0;
82
+
83
+ for (let i = 0; i < lines.length; i++) {
84
+ const line = lines[i].trim();
85
+
86
+ // Detect section headers (lines that are all uppercase, or followed by underline)
87
+ const isHeader = this.isSectionHeader(line, lines[i + 1]);
88
+
89
+ if (isHeader && line.length > 0) {
90
+ // Save previous section
91
+ if (currentSection) {
92
+ symbols.push({
93
+ id: currentSectionId!,
94
+ name: currentSection,
95
+ type: SymbolType.Section,
96
+ language: 'text',
97
+ file: filePath,
98
+ startLine: sectionStart,
99
+ endLine: i,
100
+ parent: null,
101
+ children: [],
102
+ metadata: {},
103
+ });
104
+ }
105
+
106
+ // Start new section
107
+ currentSection = line;
108
+ currentSectionId = `${filePath}:${i + 1}`;
109
+ sectionStart = i + 1;
110
+ }
111
+ }
112
+
113
+ // Save last section
114
+ if (currentSection) {
115
+ symbols.push({
116
+ id: currentSectionId!,
117
+ name: currentSection,
118
+ type: SymbolType.Section,
119
+ language: 'text',
120
+ file: filePath,
121
+ startLine: sectionStart,
122
+ endLine: lines.length,
123
+ parent: null,
124
+ children: [],
125
+ metadata: {},
126
+ });
127
+ }
128
+
129
+ // If no sections found, create paragraph-based symbols
130
+ if (symbols.length === 0) {
131
+ this.extractParagraphs(lines, symbols, filePath);
132
+ }
133
+ }
134
+
135
+ private isSectionHeader(line: string, nextLine: string | undefined): boolean {
136
+ if (!line || line.length < 3) return false;
137
+
138
+ // Check if line is all uppercase
139
+ if (line === line.toUpperCase() && /[A-Z]/.test(line)) return true;
140
+
141
+ // Check if next line is underline (=== or ---)
142
+ if (nextLine) {
143
+ const underline = nextLine.trim();
144
+ if (/^[=-]{3,}$/.test(underline)) return true;
145
+ }
146
+
147
+ return false;
148
+ }
149
+
150
+ private extractParagraphs(lines: string[], symbols: CodeSymbol[], filePath: string) {
151
+ let paragraphStart = 0;
152
+ let paragraphText = '';
153
+
154
+ for (let i = 0; i < lines.length; i++) {
155
+ const line = lines[i].trim();
156
+
157
+ if (line === '') {
158
+ if (paragraphText.length > 0) {
159
+ symbols.push({
160
+ id: `${filePath}:${paragraphStart + 1}`,
161
+ name: paragraphText.substring(0, 50),
162
+ type: SymbolType.Section,
163
+ language: 'text',
164
+ file: filePath,
165
+ startLine: paragraphStart + 1,
166
+ endLine: i,
167
+ parent: null,
168
+ children: [],
169
+ metadata: { size: paragraphText.length },
170
+ });
171
+ paragraphText = '';
172
+ }
173
+ paragraphStart = i + 1;
174
+ } else {
175
+ paragraphText += (paragraphText ? ' ' : '') + line;
176
+ }
177
+ }
178
+
179
+ // Handle last paragraph
180
+ if (paragraphText.length > 0) {
181
+ symbols.push({
182
+ id: `${filePath}:${paragraphStart + 1}`,
183
+ name: paragraphText.substring(0, 50),
184
+ type: SymbolType.Section,
185
+ language: 'text',
186
+ file: filePath,
187
+ startLine: paragraphStart + 1,
188
+ endLine: lines.length,
189
+ parent: null,
190
+ children: [],
191
+ metadata: { size: paragraphText.length },
192
+ });
193
+ }
194
+ }
195
+ }
@@ -0,0 +1,82 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType, CodeSymbol } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'toml',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-toml.wasm', import.meta.url).pathname,
10
+ queryPatterns: {},
11
+ typeMap: {},
12
+ nameNodeTypes: ['bare_key', 'string'],
13
+ importNodeTypes: [],
14
+ exportNodeTypes: [],
15
+ };
16
+
17
+ export class TomlAdapter extends BaseTreeSitterAdapter {
18
+ protected grammar = GRAMMAR;
19
+ languageName(): string { return 'TOML'; }
20
+ fileExtensions(): string[] { return ['.toml']; }
21
+
22
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
23
+ const symbols: CodeSymbol[] = [];
24
+ this.walkToml(tree.rootNode, symbols, filePath, '');
25
+ return symbols;
26
+ }
27
+
28
+ private walkToml(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
29
+ if (node.type === 'table' || node.type === 'table_array_element') {
30
+ const key = this.extractTomlKey(node);
31
+ if (key) {
32
+ const id = `${filePath}:${node.startPosition.row + 1}`;
33
+ symbols.push({
34
+ id, name: key, type: SymbolType.Section, language: 'toml',
35
+ file: filePath, startLine: node.startPosition.row + 1,
36
+ endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
37
+ });
38
+ parentId = id;
39
+ }
40
+ } else if (node.type === 'pair') {
41
+ const key = this.extractPairKey(node);
42
+ if (key) {
43
+ const id = `${filePath}:${node.startPosition.row + 1}`;
44
+ symbols.push({
45
+ id, name: key, type: SymbolType.Property, language: 'toml',
46
+ file: filePath, startLine: node.startPosition.row + 1,
47
+ endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
48
+ });
49
+ }
50
+ }
51
+
52
+ for (let i = 0; i < node.childCount; i++) {
53
+ const child = node.child(i);
54
+ if (child) this.walkToml(child, symbols, filePath, parentId);
55
+ }
56
+ }
57
+
58
+ private extractTomlKey(node: any): string | null {
59
+ for (let i = 0; i < node.childCount; i++) {
60
+ const child = node.child(i);
61
+ if (!child) continue;
62
+ if (child.type === 'bare_key' || child.type === 'string') {
63
+ return child.text?.replace(/"/g, '') || null;
64
+ }
65
+ if (child.type === 'dotted_key') {
66
+ return child.text || null;
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+
72
+ private extractPairKey(node: any): string | null {
73
+ for (let i = 0; i < node.childCount; i++) {
74
+ const child = node.child(i);
75
+ if (!child) continue;
76
+ if (child.type === 'bare_key' || child.type === 'string') {
77
+ return child.text?.replace(/"/g, '') || null;
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ }
@@ -0,0 +1,70 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType, CodeSymbol } from '../types.js';
4
+
5
+ const GRAMMAR: GrammarConfig = {
6
+ language: 'vue',
7
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-vue.wasm', import.meta.url).pathname,
8
+ queryPatterns: {},
9
+ typeMap: {},
10
+ nameNodeTypes: ['tag_name', 'attribute_name', 'directive_attribute'],
11
+ importNodeTypes: [],
12
+ exportNodeTypes: [],
13
+ };
14
+
15
+ export class VueAdapter extends BaseTreeSitterAdapter {
16
+ protected grammar = GRAMMAR;
17
+ languageName(): string { return 'Vue'; }
18
+ fileExtensions(): string[] { return ['.vue']; }
19
+
20
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
21
+ const symbols: CodeSymbol[] = [];
22
+ this.walkVue(tree.rootNode, symbols, filePath);
23
+ return symbols;
24
+ }
25
+
26
+ private walkVue(node: any, symbols: CodeSymbol[], filePath: string) {
27
+ // Extract top-level sections: <template>, <script>, <style>
28
+ if (node.type === 'element') {
29
+ const tagName = this.extractTagName(node);
30
+ if (tagName && ['template', 'script', 'style'].includes(tagName.toLowerCase())) {
31
+ const id = `${filePath}:${node.startPosition.row + 1}`;
32
+ symbols.push({
33
+ id, name: tagName, type: SymbolType.Section, language: 'vue',
34
+ file: filePath, startLine: node.startPosition.row + 1,
35
+ endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
36
+ });
37
+ }
38
+
39
+ // Extract custom components (PascalCase or kebab-case with -)
40
+ if (tagName && (tagName[0] === tagName[0].toUpperCase() || tagName.includes('-'))) {
41
+ const id = `${filePath}:${node.startPosition.row + 1}`;
42
+ symbols.push({
43
+ id, name: tagName, type: SymbolType.Class, language: 'vue',
44
+ file: filePath, startLine: node.startPosition.row + 1,
45
+ endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
46
+ });
47
+ }
48
+ }
49
+
50
+ for (let i = 0; i < node.childCount; i++) {
51
+ const child = node.child(i);
52
+ if (child) this.walkVue(child, symbols, filePath);
53
+ }
54
+ }
55
+
56
+ private extractTagName(node: any): string | null {
57
+ for (let i = 0; i < node.childCount; i++) {
58
+ const child = node.child(i);
59
+ if (!child) continue;
60
+ if (child.type === 'tag_name') return child.text;
61
+ if (child.type === 'start_tag' || child.type === 'self_closing_tag') {
62
+ for (let j = 0; j < child.childCount; j++) {
63
+ const grandchild = child.child(j);
64
+ if (grandchild && grandchild.type === 'tag_name') return grandchild.text;
65
+ }
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ }
@@ -0,0 +1,74 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType, CodeSymbol } from '../types.js';
4
+
5
+ const GRAMMAR: GrammarConfig = {
6
+ language: 'xml',
7
+ wasmPath: new URL('../../node_modules/@tree-sitter-grammars/tree-sitter-xml/tree-sitter-xml.wasm', import.meta.url).pathname,
8
+ queryPatterns: {},
9
+ typeMap: {},
10
+ nameNodeTypes: ['tag_name', 'attribute_name'],
11
+ importNodeTypes: [],
12
+ exportNodeTypes: [],
13
+ };
14
+
15
+ export class XmlAdapter extends BaseTreeSitterAdapter {
16
+ protected grammar = GRAMMAR;
17
+ languageName(): string { return 'XML'; }
18
+ fileExtensions(): string[] { return ['.xml']; }
19
+
20
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
21
+ const symbols: CodeSymbol[] = [];
22
+ this.collectElements(tree.rootNode, symbols, filePath, '');
23
+ return symbols;
24
+ }
25
+
26
+ private collectElements(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
27
+ if (node.type === 'element') {
28
+ const tagName = this.extractTagName(node);
29
+ if (tagName) {
30
+ const id = `${filePath}:${node.startPosition.row + 1}`;
31
+ const symbolType = this.getSymbolType(tagName);
32
+
33
+ symbols.push({
34
+ id, name: tagName, type: symbolType, language: 'xml',
35
+ file: filePath, startLine: node.startPosition.row + 1,
36
+ endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
37
+ });
38
+
39
+ // Recurse into child elements
40
+ for (let i = 0; i < node.childCount; i++) {
41
+ const child = node.child(i);
42
+ if (child) this.collectElements(child, symbols, filePath, id);
43
+ }
44
+ return;
45
+ }
46
+ }
47
+
48
+ for (let i = 0; i < node.childCount; i++) {
49
+ const child = node.child(i);
50
+ if (child) this.collectElements(child, symbols, filePath, parentId);
51
+ }
52
+ }
53
+
54
+ private extractTagName(node: any): string | null {
55
+ for (let i = 0; i < node.childCount; i++) {
56
+ const child = node.child(i);
57
+ if (!child) continue;
58
+ if (child.type === 'tag_name') return child.text;
59
+ if (child.type === 'start_tag' || child.type === 'self_closing_tag') {
60
+ for (let j = 0; j < child.childCount; j++) {
61
+ const grandchild = child.child(j);
62
+ if (grandchild && grandchild.type === 'tag_name') return grandchild.text;
63
+ }
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+
69
+ private getSymbolType(tagName: string): SymbolType {
70
+ const significant = ['configuration', 'settings', 'properties', 'beans', 'component', 'module', 'project'];
71
+ if (significant.includes(tagName.toLowerCase())) return SymbolType.Module;
72
+ return SymbolType.Property;
73
+ }
74
+ }
@@ -0,0 +1,63 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType, CodeSymbol } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'yaml',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-yaml.wasm', import.meta.url).pathname,
10
+ queryPatterns: {},
11
+ typeMap: {},
12
+ nameNodeTypes: ['string_scalar', 'plain_scalar'],
13
+ importNodeTypes: [],
14
+ exportNodeTypes: [],
15
+ };
16
+
17
+ export class YamlAdapter extends BaseTreeSitterAdapter {
18
+ protected grammar = GRAMMAR;
19
+ languageName(): string { return 'YAML'; }
20
+ fileExtensions(): string[] { return ['.yaml', '.yml']; }
21
+
22
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
23
+ const symbols: CodeSymbol[] = [];
24
+ this.walkYaml(tree.rootNode, symbols, filePath, '');
25
+ return symbols;
26
+ }
27
+
28
+ private walkYaml(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
29
+ if (node.type === 'block_mapping_pair' || node.type === 'flow_pair') {
30
+ const key = this.extractYamlKey(node);
31
+ if (key) {
32
+ const id = `${filePath}:${node.startPosition.row + 1}`;
33
+ symbols.push({
34
+ id, name: key, type: SymbolType.Property, language: 'yaml',
35
+ file: filePath, startLine: node.startPosition.row + 1,
36
+ endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
37
+ });
38
+ // Recurse into nested mappings
39
+ for (let i = 0; i < node.childCount; i++) {
40
+ const child = node.child(i);
41
+ if (child && (child.type === 'block_mapping' || child.type === 'flow_mapping')) {
42
+ this.walkYaml(child, symbols, filePath, id);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ for (let i = 0; i < node.childCount; i++) {
48
+ const child = node.child(i);
49
+ if (child) this.walkYaml(child, symbols, filePath, parentId);
50
+ }
51
+ }
52
+
53
+ private extractYamlKey(node: any): string | null {
54
+ for (let i = 0; i < node.childCount; i++) {
55
+ const child = node.child(i);
56
+ if (!child) continue;
57
+ if (child.type === 'string_scalar' || child.type === 'plain_scalar') {
58
+ return child.text || null;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ }
@@ -13,6 +13,30 @@ import { PhpAdapter } from './adapters/php.js';
13
13
  import { HtmlAdapter } from './adapters/html.js';
14
14
  import { CssAdapter } from './adapters/css.js';
15
15
  import { JsonAdapter } from './adapters/json.js';
16
+ import { SwiftAdapter } from './adapters/swift.js';
17
+ import { KotlinAdapter } from './adapters/kotlin.js';
18
+ import { DartAdapter } from './adapters/dart.js';
19
+ import { ScalaAdapter } from './adapters/scala.js';
20
+ import { HaskellAdapter } from './adapters/haskell.js';
21
+ import { SolidityAdapter } from './adapters/solidity.js';
22
+ import { LuaAdapter } from './adapters/lua.js';
23
+ import { YamlAdapter } from './adapters/yaml.js';
24
+ import { TomlAdapter } from './adapters/toml.js';
25
+ import { SqlAdapter } from './adapters/sql.js';
26
+ import { MarkdownAdapter } from './adapters/markdown.js';
27
+ import { XmlAdapter } from './adapters/xml.js';
28
+ import { VueAdapter } from './adapters/vue.js';
29
+ import { SvelteAdapter } from './adapters/svelte.js';
30
+ import { TerraformAdapter } from './adapters/terraform.js';
31
+ import { DockerfileAdapter } from './adapters/dockerfile.js';
32
+ import { SalesforceAdapter } from './adapters/salesforce.js';
33
+ import { CsvAdapter } from './adapters/csv.js';
34
+ import { JsonVariantsAdapter } from './adapters/json-variants.js';
35
+ import { ConfigAdapter } from './adapters/config.js';
36
+ import { DocumentationAdapter } from './adapters/documentation.js';
37
+ import { SvgAdapter } from './adapters/svg.js';
38
+ import { TextAdapter } from './adapters/text.js';
39
+ import { AstroAdapter } from './adapters/astro.js';
16
40
  import { GenericAdapter } from './generic.js';
17
41
 
18
42
  export type AdapterEntry = {
@@ -33,6 +57,7 @@ export class LanguageRegistry {
33
57
  }
34
58
 
35
59
  private registerDefaults() {
60
+ // Tier 1: Full symbol extraction (programming languages)
36
61
  this.register('ts', new TypeScriptAdapter(), 1);
37
62
  this.register('js', new JavaScriptAdapter(), 1);
38
63
  this.register('py', new PythonAdapter(), 1);
@@ -44,9 +69,37 @@ export class LanguageRegistry {
44
69
  this.register('cpp', new CppAdapter(), 1);
45
70
  this.register('csharp', new CSharpAdapter(), 1);
46
71
  this.register('php', new PhpAdapter(), 1);
72
+ this.register('swift', new SwiftAdapter(), 1);
73
+ this.register('kotlin', new KotlinAdapter(), 1);
74
+ this.register('dart', new DartAdapter(), 1);
75
+ this.register('scala', new ScalaAdapter(), 1);
76
+ this.register('haskell', new HaskellAdapter(), 1);
77
+ this.register('solidity', new SolidityAdapter(), 1);
78
+ this.register('lua', new LuaAdapter(), 1);
79
+
80
+ // Tier 2: Structural extraction (markup, config, data)
47
81
  this.register('html', new HtmlAdapter(), 2);
48
82
  this.register('css', new CssAdapter(), 2);
49
83
  this.register('json', new JsonAdapter(), 2);
84
+ this.register('yaml', new YamlAdapter(), 2);
85
+ this.register('toml', new TomlAdapter(), 2);
86
+ this.register('sql', new SqlAdapter(), 2);
87
+ this.register('markdown', new MarkdownAdapter(), 2);
88
+
89
+ // Tier 2: Additional markup and config languages
90
+ this.register('xml', new XmlAdapter(), 2);
91
+ this.register('vue', new VueAdapter(), 2);
92
+ this.register('svelte', new SvelteAdapter(), 2);
93
+ this.register('terraform', new TerraformAdapter(), 2);
94
+ this.register('dockerfile', new DockerfileAdapter(), 2);
95
+ this.register('salesforce', new SalesforceAdapter(), 2);
96
+ this.register('csv', new CsvAdapter(), 2);
97
+ this.register('json-variants', new JsonVariantsAdapter(), 2);
98
+ this.register('config', new ConfigAdapter(), 2);
99
+ this.register('documentation', new DocumentationAdapter(), 2);
100
+ this.register('svg', new SvgAdapter(), 2);
101
+ this.register('text', new TextAdapter(), 2);
102
+ this.register('astro', new AstroAdapter(), 2);
50
103
  }
51
104
 
52
105
  register(key: string, adapter: LanguageAdapter, tier: 1 | 2 | 3) {
@@ -18,6 +18,19 @@ export enum SymbolType {
18
18
  Export = 'export',
19
19
  Comment = 'comment',
20
20
  Unknown = 'unknown',
21
+ Package = 'package',
22
+ Constructor = 'constructor',
23
+ Extension = 'extension',
24
+ Field = 'field',
25
+ TypeAlias = 'type_alias',
26
+ Document = 'document',
27
+ Section = 'section',
28
+ Table = 'table',
29
+ Selector = 'selector',
30
+ Rule = 'rule',
31
+ Actor = 'actor',
32
+ Object = 'object',
33
+ Protocol = 'protocol',
21
34
  }
22
35
 
23
36
  export interface CodeSymbol {
@@ -0,0 +1,55 @@
1
+ declare module 'better-sqlite3' {
2
+ namespace Database {
3
+ interface Database {
4
+ prepare(sql: string): Statement;
5
+ exec(sql: string): Database;
6
+ pragma(pragma: string, options?: { simple?: boolean }): any;
7
+ function(name: string, cb: (...args: any[]) => any): Database;
8
+ aggregate(name: string, options: any): Database;
9
+ loadExtension(path: string, entryPoint?: string): Database;
10
+ close(): Database;
11
+ defaultSafeIntegers(toggleState?: boolean): Database;
12
+ unsafeMode(unsafe?: boolean): Database;
13
+ transaction(fn: (...args: any[]) => any): (...args: any[]) => any;
14
+ savepoint(fn: (...args: any[]) => any): (...args: any[]) => any;
15
+ checkpoint(databaseName?: string): Database;
16
+ readonly(toggleState?: boolean): Database;
17
+ open: boolean;
18
+ inTransaction: boolean;
19
+ name: string;
20
+ memory: boolean;
21
+ readonly: boolean;
22
+ }
23
+
24
+ interface Statement {
25
+ database: Database;
26
+ source: string;
27
+ reader: boolean;
28
+ readonly: boolean;
29
+ busy: boolean;
30
+ run(...params: any[]): RunResult;
31
+ get(...params: any[]): any;
32
+ all(...params: any[]): any[];
33
+ iterate(...params: any[]): IterableIterator<any>;
34
+ pluck(toggleState?: boolean): Statement;
35
+ expand(toggleState?: boolean): Statement;
36
+ raw(toggleState?: boolean): Statement;
37
+ columns(toggleState?: boolean): Statement;
38
+ bind(...params: any[]): Statement;
39
+ safeIntegers(toggleState?: boolean): Statement;
40
+ }
41
+
42
+ interface RunResult {
43
+ changes: number;
44
+ lastInsertRowid: number | bigint;
45
+ }
46
+ }
47
+
48
+ interface DatabaseConstructor {
49
+ new(filename?: string | Buffer, options?: any): Database.Database;
50
+ (filename?: string | Buffer, options?: any): Database.Database;
51
+ }
52
+
53
+ const Database: DatabaseConstructor;
54
+ export = Database;
55
+ }