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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAIA,KAAK,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAS;gBAEf,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,SAAM;IAMjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,OAAO,CAAC,WAAW;IAwBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAIA,KAAK,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,SAAM,EAItE;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB3B;IAED,OAAO,CAAC,WAAW;IAwBb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1B;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edhindex",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Local-first hybrid code search engine with knowledge graph — BM25 + vector + rerank, tree-sitter parsing, MCP server",
5
5
  "keywords": [
6
6
  "code-search",
@@ -47,9 +47,17 @@
47
47
  "test": "vitest run"
48
48
  },
49
49
  "dependencies": {
50
+ "@derekstride/tree-sitter-sql": "^0.3.11",
50
51
  "@huggingface/transformers": "^4.2.0",
51
52
  "@lancedb/lancedb": "^0.31.0",
52
53
  "@modelcontextprotocol/sdk": "^1.29.0",
54
+ "@tree-sitter-grammars/tree-sitter-hcl": "^1.2.0",
55
+ "@tree-sitter-grammars/tree-sitter-markdown": "^0.3.2",
56
+ "@tree-sitter-grammars/tree-sitter-svelte": "^1.0.2",
57
+ "@tree-sitter-grammars/tree-sitter-toml": "^0.7.0",
58
+ "@tree-sitter-grammars/tree-sitter-xml": "^0.7.0",
59
+ "@tree-sitter-grammars/tree-sitter-yaml": "^0.7.1",
60
+ "apache-arrow": "^21.1.0",
53
61
  "better-sqlite3": "^12.11.1",
54
62
  "chalk": "^5.6.2",
55
63
  "chokidar": "^5.0.0",
@@ -61,25 +69,69 @@
61
69
  "tree-sitter-cpp": "^0.23.4",
62
70
  "tree-sitter-css": "^0.25.0",
63
71
  "tree-sitter-dart": "^1.0.0",
72
+ "tree-sitter-dockerfile": "^0.0.1-security",
64
73
  "tree-sitter-go": "^0.25.0",
65
74
  "tree-sitter-haskell": "^0.23.1",
66
75
  "tree-sitter-html": "^0.23.2",
67
76
  "tree-sitter-java": "^0.23.5",
68
77
  "tree-sitter-json": "^0.24.8",
78
+ "tree-sitter-kotlin": "^0.3.8",
79
+ "tree-sitter-lua": "^2.1.3",
69
80
  "tree-sitter-php": "^0.24.2",
70
81
  "tree-sitter-python": "^0.25.0",
71
82
  "tree-sitter-ruby": "^0.23.1",
72
83
  "tree-sitter-rust": "^0.24.0",
73
84
  "tree-sitter-scala": "^0.24.0",
74
85
  "tree-sitter-solidity": "^1.2.13",
86
+ "tree-sitter-sql": "^0.1.0",
87
+ "tree-sitter-swift": "^0.7.1",
75
88
  "tree-sitter-typescript": "^0.23.2",
89
+ "tree-sitter-vue": "^0.2.1",
90
+ "tree-sitter-wasm-prebuilt": "^0.0.3",
91
+ "tree-sitter-wasms": "^0.1.13",
76
92
  "web-tree-sitter": "^0.26.11"
77
93
  },
78
94
  "devDependencies": {
79
95
  "@types/better-sqlite3": "^7.6.13",
80
96
  "@types/cli-progress": "^3.11.6",
81
97
  "@types/node": "^22.13.0",
82
- "typescript": "^5.7.0",
98
+ "typescript": "^5.9.3",
83
99
  "vitest": "^4.1.10"
100
+ },
101
+ "allowScripts": {
102
+ "@derekstride/tree-sitter-sql@0.3.11": true,
103
+ "onnxruntime-node@1.19.2": true,
104
+ "onnxruntime-node@1.24.3": true,
105
+ "sharp@0.33.5": true,
106
+ "sharp@0.34.5": true,
107
+ "@tree-sitter-grammars/tree-sitter-markdown@0.3.2": true,
108
+ "@tree-sitter-grammars/tree-sitter-toml@0.7.0": true,
109
+ "@tree-sitter-grammars/tree-sitter-yaml@0.7.1": true,
110
+ "better-sqlite3@12.11.1": true,
111
+ "protobufjs@7.6.5": true,
112
+ "tree-sitter-c@0.24.1": true,
113
+ "tree-sitter-c@0.23.6": true,
114
+ "tree-sitter-c-sharp@0.23.5": true,
115
+ "tree-sitter-cli@0.23.2": true,
116
+ "tree-sitter-cpp@0.23.4": true,
117
+ "tree-sitter-css@0.25.0": true,
118
+ "tree-sitter-dart@1.0.0": true,
119
+ "tree-sitter-go@0.25.0": true,
120
+ "tree-sitter-haskell@0.23.1": true,
121
+ "tree-sitter-html@0.23.2": true,
122
+ "tree-sitter-java@0.23.5": true,
123
+ "tree-sitter-javascript@0.23.1": true,
124
+ "tree-sitter-json@0.24.8": true,
125
+ "tree-sitter-kotlin@0.3.8": true,
126
+ "tree-sitter-lua@2.1.3": true,
127
+ "tree-sitter-php@0.24.2": true,
128
+ "tree-sitter-python@0.25.0": true,
129
+ "tree-sitter-ruby@0.23.1": true,
130
+ "tree-sitter-rust@0.24.0": true,
131
+ "tree-sitter-scala@0.24.0": true,
132
+ "tree-sitter-solidity@1.2.13": true,
133
+ "tree-sitter-swift@0.7.1": true,
134
+ "tree-sitter-typescript@0.23.2": true,
135
+ "yarn@1.22.22": true
84
136
  }
85
137
  }
package/src/cli/index.ts CHANGED
@@ -19,7 +19,7 @@ const program = new Command();
19
19
  program
20
20
  .name('edhindex')
21
21
  .description('Local-first hybrid code search engine with MCP')
22
- .version('1.0.0')
22
+ .version('2.0.0')
23
23
  .option('-v, --verbose', 'Enable verbose logging')
24
24
  .option('--debug', 'Enable debug logging')
25
25
  .hook('preAction', (thisCommand) => {
@@ -226,6 +226,19 @@ export class GraphBuilder {
226
226
  case 'property': return 'variable';
227
227
  case 'module': return 'module';
228
228
  case 'namespace': return 'module';
229
+ case 'package': return 'package';
230
+ case 'constructor': return 'constructor';
231
+ case 'extension': return 'extension';
232
+ case 'field': return 'field';
233
+ case 'type_alias': return 'type_alias';
234
+ case 'document': return 'document';
235
+ case 'section': return 'section';
236
+ case 'table': return 'table';
237
+ case 'selector': return 'selector';
238
+ case 'rule': return 'rule';
239
+ case 'actor': return 'actor';
240
+ case 'object': return 'object';
241
+ case 'protocol': return 'protocol';
229
242
  default: return 'module';
230
243
  }
231
244
  }
@@ -10,7 +10,20 @@ export type NodeType =
10
10
  | 'method'
11
11
  | 'variable'
12
12
  | 'import'
13
- | 'export';
13
+ | 'export'
14
+ | 'package'
15
+ | 'constructor'
16
+ | 'extension'
17
+ | 'field'
18
+ | 'type_alias'
19
+ | 'document'
20
+ | 'section'
21
+ | 'table'
22
+ | 'selector'
23
+ | 'rule'
24
+ | 'actor'
25
+ | 'object'
26
+ | 'protocol';
14
27
 
15
28
  export type EdgeType =
16
29
  | 'contains'
@@ -0,0 +1,206 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class AstroAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'Astro'; }
5
+ fileExtensions(): string[] { return ['.astro']; }
6
+ fileNames(): string[] { return []; }
7
+ canParse(filePath: string): boolean {
8
+ return filePath.toLowerCase().endsWith('.astro');
9
+ }
10
+ supportsSymbols(): boolean { return true; }
11
+
12
+ async parse(content: string, filePath: string): Promise<ParseResult> {
13
+ const lines = content.split('\n');
14
+ const symbols: CodeSymbol[] = [];
15
+ const imports: string[] = [];
16
+ const exports: string[] = [];
17
+ const comments: string[] = [];
18
+
19
+ this.extractAstroComponents(lines, symbols, imports, filePath);
20
+ this.extractComments(lines, comments);
21
+
22
+ return { symbols, imports, exports, comments };
23
+ }
24
+
25
+ private extractAstroComponents(lines: string[], symbols: CodeSymbol[], imports: string[], filePath: string) {
26
+ // Astro files have three sections: frontmatter (---), template, and style
27
+ let inFrontmatter = false;
28
+ let frontmatterStart = 0;
29
+ let currentSection: string | null = null;
30
+ let currentSectionId: string | null = null;
31
+
32
+ for (let i = 0; i < lines.length; i++) {
33
+ const line = lines[i].trim();
34
+
35
+ // Frontmatter boundaries
36
+ if (line === '---') {
37
+ if (!inFrontmatter) {
38
+ inFrontmatter = true;
39
+ frontmatterStart = i;
40
+ currentSectionId = `${filePath}:${i + 1}`;
41
+ symbols.push({
42
+ id: currentSectionId,
43
+ name: 'frontmatter',
44
+ type: SymbolType.Section,
45
+ language: 'astro',
46
+ file: filePath,
47
+ startLine: i + 1,
48
+ endLine: i + 1,
49
+ parent: null,
50
+ children: [],
51
+ metadata: {},
52
+ });
53
+ } else {
54
+ inFrontmatter = false;
55
+ if (currentSectionId) {
56
+ // Update end line for frontmatter
57
+ const idx = symbols.findIndex(s => s.id === currentSectionId);
58
+ if (idx >= 0) {
59
+ symbols[idx].endLine = i + 1;
60
+ }
61
+ }
62
+ }
63
+ continue;
64
+ }
65
+
66
+ // Extract imports in frontmatter
67
+ if (inFrontmatter) {
68
+ const importMatch = line.match(/^import\s+(.+?)\s+from\s+['"](.+?)['"]/);
69
+ if (importMatch) {
70
+ imports.push(line);
71
+ symbols.push({
72
+ id: `${filePath}:${i + 1}`,
73
+ name: importMatch[1],
74
+ type: SymbolType.Import,
75
+ language: 'astro',
76
+ file: filePath,
77
+ startLine: i + 1,
78
+ endLine: i + 1,
79
+ parent: currentSectionId,
80
+ children: [],
81
+ metadata: { source: importMatch[2] },
82
+ });
83
+ }
84
+
85
+ // Extract variable declarations
86
+ const varMatch = line.match(/^(?:const|let|var)\s+(\w+)/);
87
+ if (varMatch) {
88
+ symbols.push({
89
+ id: `${filePath}:${i + 1}`,
90
+ name: varMatch[1],
91
+ type: SymbolType.Variable,
92
+ language: 'astro',
93
+ file: filePath,
94
+ startLine: i + 1,
95
+ endLine: i + 1,
96
+ parent: currentSectionId,
97
+ children: [],
98
+ metadata: {},
99
+ });
100
+ }
101
+ }
102
+
103
+ // Extract Astro components in template
104
+ if (!inFrontmatter) {
105
+ const componentMatch = line.match(/<(\w+[-\w]*)/);
106
+ if (componentMatch) {
107
+ const componentName = componentMatch[1];
108
+ // Astro components are PascalCase or kebab-case
109
+ if (componentName[0] === componentName[0].toUpperCase() || componentName.includes('-')) {
110
+ symbols.push({
111
+ id: `${filePath}:${i + 1}`,
112
+ name: componentName,
113
+ type: SymbolType.Class,
114
+ language: 'astro',
115
+ file: filePath,
116
+ startLine: i + 1,
117
+ endLine: i + 1,
118
+ parent: null,
119
+ children: [],
120
+ metadata: {},
121
+ });
122
+ }
123
+ }
124
+
125
+ // Extract style blocks
126
+ if (line.includes('<style')) {
127
+ currentSectionId = `${filePath}:${i + 1}`;
128
+ symbols.push({
129
+ id: currentSectionId,
130
+ name: 'style',
131
+ type: SymbolType.Section,
132
+ language: 'astro',
133
+ file: filePath,
134
+ startLine: i + 1,
135
+ endLine: i + 1,
136
+ parent: null,
137
+ children: [],
138
+ metadata: {},
139
+ });
140
+ }
141
+
142
+ // Extract script blocks
143
+ if (line.includes('<script')) {
144
+ currentSectionId = `${filePath}:${i + 1}`;
145
+ symbols.push({
146
+ id: currentSectionId,
147
+ name: 'script',
148
+ type: SymbolType.Section,
149
+ language: 'astro',
150
+ file: filePath,
151
+ startLine: i + 1,
152
+ endLine: i + 1,
153
+ parent: null,
154
+ children: [],
155
+ metadata: {},
156
+ });
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ private extractComments(lines: string[], comments: string[]) {
163
+ let inBlockComment = false;
164
+ let blockComment = '';
165
+
166
+ for (const line of lines) {
167
+ if (inBlockComment) {
168
+ const endIdx = line.indexOf('*/');
169
+ if (endIdx >= 0) {
170
+ blockComment += line.substring(0, endIdx + 2);
171
+ comments.push(blockComment.trim());
172
+ blockComment = '';
173
+ inBlockComment = false;
174
+ } else {
175
+ blockComment += line + '\n';
176
+ }
177
+ } else {
178
+ const startIdx = line.indexOf('/*');
179
+ if (startIdx >= 0) {
180
+ const endIdx = line.indexOf('*/', startIdx + 2);
181
+ if (endIdx >= 0) {
182
+ comments.push(line.substring(startIdx, endIdx + 2).trim());
183
+ } else {
184
+ blockComment = line.substring(startIdx) + '\n';
185
+ inBlockComment = true;
186
+ }
187
+ }
188
+
189
+ // Single-line comments
190
+ const lineCommentIdx = line.indexOf('//');
191
+ if (lineCommentIdx >= 0) {
192
+ comments.push(line.substring(lineCommentIdx).trim());
193
+ }
194
+
195
+ // HTML comments
196
+ const htmlCommentIdx = line.indexOf('<!--');
197
+ if (htmlCommentIdx >= 0) {
198
+ const endIdx = line.indexOf('-->', htmlCommentIdx + 4);
199
+ if (endIdx >= 0) {
200
+ comments.push(line.substring(htmlCommentIdx, endIdx + 3).trim());
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
@@ -0,0 +1,144 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class ConfigAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'Config'; }
5
+ fileExtensions(): string[] { return ['.ini', '.properties', '.env', '.conf', '.cfg']; }
6
+ fileNames(): string[] { return ['.gitignore', '.editorconfig']; }
7
+ canParse(filePath: string): boolean {
8
+ const lower = filePath.toLowerCase();
9
+ for (const ext of this.fileExtensions()) {
10
+ if (lower.endsWith(ext)) return true;
11
+ }
12
+ for (const name of this.fileNames()) {
13
+ if (lower.endsWith('/' + name) || lower === name || lower.endsWith(name)) return true;
14
+ }
15
+ return false;
16
+ }
17
+ supportsSymbols(): boolean { return true; }
18
+
19
+ async parse(content: string, filePath: string): Promise<ParseResult> {
20
+ const lines = content.split('\n');
21
+ const symbols: CodeSymbol[] = [];
22
+ const imports: string[] = [];
23
+ const exports: string[] = [];
24
+ const comments: string[] = [];
25
+
26
+ if (filePath.endsWith('.ini') || filePath.endsWith('.conf') || filePath.endsWith('.cfg') || filePath.endsWith('.editorconfig')) {
27
+ this.extractIniStyle(lines, symbols, filePath);
28
+ } else if (filePath.endsWith('.properties') || filePath.endsWith('.env')) {
29
+ this.extractKeyValue(lines, symbols, filePath);
30
+ } else if (filePath.endsWith('.gitignore')) {
31
+ this.extractGitignore(lines, symbols, filePath);
32
+ } else {
33
+ this.extractKeyValue(lines, symbols, filePath);
34
+ }
35
+
36
+ this.extractComments(lines, comments);
37
+
38
+ return { symbols, imports, exports, comments };
39
+ }
40
+
41
+ private extractIniStyle(lines: string[], symbols: CodeSymbol[], filePath: string) {
42
+ let currentSection: string | null = null;
43
+ let currentSectionId: string | null = null;
44
+
45
+ for (let i = 0; i < lines.length; i++) {
46
+ const line = lines[i].trim();
47
+
48
+ // Section headers: [section]
49
+ const sectionMatch = line.match(/^\[(.+)\]$/);
50
+ if (sectionMatch) {
51
+ currentSection = sectionMatch[1];
52
+ currentSectionId = `${filePath}:${i + 1}`;
53
+ symbols.push({
54
+ id: currentSectionId,
55
+ name: currentSection,
56
+ type: SymbolType.Section,
57
+ language: 'config',
58
+ file: filePath,
59
+ startLine: i + 1,
60
+ endLine: i + 1,
61
+ parent: null,
62
+ children: [],
63
+ metadata: {},
64
+ });
65
+ continue;
66
+ }
67
+
68
+ // Key-value pairs
69
+ const kvMatch = line.match(/^([^#=]+?)\s*=\s*(.+)$/);
70
+ if (kvMatch) {
71
+ symbols.push({
72
+ id: `${filePath}:${i + 1}`,
73
+ name: kvMatch[1].trim(),
74
+ type: SymbolType.Property,
75
+ language: 'config',
76
+ file: filePath,
77
+ startLine: i + 1,
78
+ endLine: i + 1,
79
+ parent: currentSectionId,
80
+ children: [],
81
+ metadata: { value: kvMatch[2].trim() },
82
+ });
83
+ }
84
+ }
85
+ }
86
+
87
+ private extractKeyValue(lines: string[], symbols: CodeSymbol[], filePath: string) {
88
+ for (let i = 0; i < lines.length; i++) {
89
+ const line = lines[i].trim();
90
+
91
+ // Skip empty lines and comments
92
+ if (!line || line.startsWith('#') || line.startsWith('!')) continue;
93
+
94
+ // Key-value pairs
95
+ const kvMatch = line.match(/^([^=]+?)\s*=\s*(.+)$/);
96
+ if (kvMatch) {
97
+ symbols.push({
98
+ id: `${filePath}:${i + 1}`,
99
+ name: kvMatch[1].trim(),
100
+ type: SymbolType.Property,
101
+ language: 'config',
102
+ file: filePath,
103
+ startLine: i + 1,
104
+ endLine: i + 1,
105
+ parent: null,
106
+ children: [],
107
+ metadata: { value: kvMatch[2].trim() },
108
+ });
109
+ }
110
+ }
111
+ }
112
+
113
+ private extractGitignore(lines: string[], symbols: CodeSymbol[], filePath: string) {
114
+ for (let i = 0; i < lines.length; i++) {
115
+ const line = lines[i].trim();
116
+
117
+ // Skip empty lines and comments
118
+ if (!line || line.startsWith('#')) continue;
119
+
120
+ // Treat each pattern as a property
121
+ symbols.push({
122
+ id: `${filePath}:${i + 1}`,
123
+ name: line,
124
+ type: SymbolType.Property,
125
+ language: 'config',
126
+ file: filePath,
127
+ startLine: i + 1,
128
+ endLine: i + 1,
129
+ parent: null,
130
+ children: [],
131
+ metadata: {},
132
+ });
133
+ }
134
+ }
135
+
136
+ private extractComments(lines: string[], comments: string[]) {
137
+ for (const line of lines) {
138
+ const trimmed = line.trim();
139
+ if (trimmed.startsWith('#') || trimmed.startsWith(';') || trimmed.startsWith('!')) {
140
+ comments.push(trimmed);
141
+ }
142
+ }
143
+ }
144
+ }
@@ -0,0 +1,110 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class CsvAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'CSV'; }
5
+ fileExtensions(): string[] { return ['.csv']; }
6
+ fileNames(): string[] { return []; }
7
+ canParse(filePath: string): boolean {
8
+ return filePath.toLowerCase().endsWith('.csv');
9
+ }
10
+ supportsSymbols(): boolean { return true; }
11
+
12
+ async parse(content: string, filePath: string): Promise<ParseResult> {
13
+ const lines = content.split('\n');
14
+ const symbols: CodeSymbol[] = [];
15
+ const imports: string[] = [];
16
+ const exports: string[] = [];
17
+ const comments: string[] = [];
18
+
19
+ if (lines.length > 0) {
20
+ // Extract header row as column definitions
21
+ const headers = this.parseCSVLine(lines[0]);
22
+ if (headers.length > 0) {
23
+ symbols.push({
24
+ id: `${filePath}:1`,
25
+ name: 'headers',
26
+ type: SymbolType.Module,
27
+ language: 'csv',
28
+ file: filePath,
29
+ startLine: 1,
30
+ endLine: 1,
31
+ parent: null,
32
+ children: [],
33
+ metadata: { columns: headers, columnCount: headers.length },
34
+ });
35
+
36
+ // Extract each column as a property
37
+ headers.forEach((header, index) => {
38
+ if (header.trim()) {
39
+ symbols.push({
40
+ id: `${filePath}:1:${index}`,
41
+ name: header.trim(),
42
+ type: SymbolType.Property,
43
+ language: 'csv',
44
+ file: filePath,
45
+ startLine: 1,
46
+ endLine: 1,
47
+ parent: `${filePath}:1`,
48
+ children: [],
49
+ metadata: { columnIndex: index },
50
+ });
51
+ }
52
+ });
53
+ }
54
+
55
+ // Extract data summary
56
+ const dataLines = lines.length - 1;
57
+ if (dataLines > 0) {
58
+ symbols.push({
59
+ id: `${filePath}:data`,
60
+ name: 'data',
61
+ type: SymbolType.Table,
62
+ language: 'csv',
63
+ file: filePath,
64
+ startLine: 2,
65
+ endLine: lines.length,
66
+ parent: null,
67
+ children: [],
68
+ metadata: { rowCount: dataLines, columnCount: headers.length },
69
+ });
70
+ }
71
+
72
+ // Extract comments (lines starting with #)
73
+ for (let i = 0; i < lines.length; i++) {
74
+ const line = lines[i].trim();
75
+ if (line.startsWith('#')) {
76
+ comments.push(line);
77
+ }
78
+ }
79
+ }
80
+
81
+ return { symbols, imports, exports, comments };
82
+ }
83
+
84
+ private parseCSVLine(line: string): string[] {
85
+ const result: string[] = [];
86
+ let current = '';
87
+ let inQuotes = false;
88
+
89
+ for (let i = 0; i < line.length; i++) {
90
+ const char = line[i];
91
+
92
+ if (char === '"') {
93
+ if (inQuotes && i + 1 < line.length && line[i + 1] === '"') {
94
+ current += '"';
95
+ i++; // Skip next quote
96
+ } else {
97
+ inQuotes = !inQuotes;
98
+ }
99
+ } else if (char === ',' && !inQuotes) {
100
+ result.push(current);
101
+ current = '';
102
+ } else {
103
+ current += char;
104
+ }
105
+ }
106
+
107
+ result.push(current);
108
+ return result;
109
+ }
110
+ }
@@ -0,0 +1,39 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'dart',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-dart.wasm', import.meta.url).pathname,
10
+ queryPatterns: {
11
+ class_declaration: '(class_declaration name: (identifier) @name)',
12
+ mixin_declaration: '(mixin_declaration name: (identifier) @name)',
13
+ extension_declaration: '(extension_declaration name: (identifier) @name)',
14
+ enum_declaration: '(enum_declaration name: (identifier) @name)',
15
+ function_declaration: '(function_signature name: (identifier) @name)',
16
+ method_declaration: '(method_signature name: (identifier) @name)',
17
+ },
18
+ typeMap: {
19
+ class_declaration: SymbolType.Class,
20
+ mixin_declaration: SymbolType.Extension,
21
+ extension_declaration: SymbolType.Extension,
22
+ enum_declaration: SymbolType.Enum,
23
+ typedef_declaration: SymbolType.TypeAlias,
24
+ function_declaration: SymbolType.Function,
25
+ method_declaration: SymbolType.Method,
26
+ constructor_declaration: SymbolType.Constructor,
27
+ variable_declaration: SymbolType.Variable,
28
+ import_or_export: SymbolType.Import,
29
+ },
30
+ nameNodeTypes: ['identifier'],
31
+ importNodeTypes: ['import_or_export'],
32
+ exportNodeTypes: [],
33
+ };
34
+
35
+ export class DartAdapter extends BaseTreeSitterAdapter {
36
+ protected grammar = GRAMMAR;
37
+ languageName(): string { return 'Dart'; }
38
+ fileExtensions(): string[] { return ['.dart']; }
39
+ }