@danielblomma/cortex-mcp 1.3.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +62 -14
  2. package/package.json +2 -2
  3. package/scaffold/mcp/package-lock.json +3 -7
  4. package/scaffold/mcp/package.json +1 -1
  5. package/scaffold/scripts/dashboard.mjs +15 -1
  6. package/scaffold/scripts/ingest.mjs +323 -50
  7. package/scaffold/scripts/parsers/bash-treesitter.mjs +229 -0
  8. package/scaffold/scripts/parsers/cpp-dispatch.mjs +56 -0
  9. package/scaffold/scripts/parsers/cpp-treesitter.mjs +333 -0
  10. package/scaffold/scripts/parsers/csharp.mjs +197 -10
  11. package/scaffold/scripts/parsers/dotnet/CSharpParser/CSharpParser.csproj +1 -0
  12. package/scaffold/scripts/parsers/dotnet/CSharpParser/Program.cs +126 -21
  13. package/scaffold/scripts/parsers/go-treesitter.mjs +283 -0
  14. package/scaffold/scripts/parsers/java-treesitter.mjs +250 -0
  15. package/scaffold/scripts/parsers/javascript/ast.mjs +118 -12
  16. package/scaffold/scripts/parsers/javascript/chunks.mjs +4 -0
  17. package/scaffold/scripts/parsers/javascript/patterns.mjs +6 -0
  18. package/scaffold/scripts/parsers/javascript.mjs +4 -19
  19. package/scaffold/scripts/parsers/node_modules/.package-lock.json +57 -0
  20. package/scaffold/scripts/parsers/node_modules/acorn/CHANGELOG.md +972 -0
  21. package/scaffold/scripts/parsers/node_modules/acorn/LICENSE +21 -0
  22. package/scaffold/scripts/parsers/node_modules/acorn/README.md +301 -0
  23. package/scaffold/scripts/parsers/node_modules/acorn/bin/acorn +4 -0
  24. package/scaffold/scripts/parsers/node_modules/acorn/dist/acorn.d.mts +883 -0
  25. package/scaffold/scripts/parsers/node_modules/acorn/dist/acorn.d.ts +883 -0
  26. package/scaffold/scripts/parsers/node_modules/acorn/dist/acorn.js +6295 -0
  27. package/scaffold/scripts/parsers/node_modules/acorn/dist/acorn.mjs +6266 -0
  28. package/scaffold/scripts/parsers/node_modules/acorn/dist/bin.js +90 -0
  29. package/scaffold/scripts/parsers/node_modules/acorn/package.json +50 -0
  30. package/scaffold/scripts/parsers/node_modules/acorn-typescript/CHANGELOG.md +421 -0
  31. package/scaffold/scripts/parsers/node_modules/acorn-typescript/LICENSE +21 -0
  32. package/scaffold/scripts/parsers/node_modules/acorn-typescript/README.md +81 -0
  33. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/error.d.ts +103 -0
  34. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/error.js +78 -0
  35. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/error.js.map +1 -0
  36. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/decorators.d.ts +167 -0
  37. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/decorators.js +75 -0
  38. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/decorators.js.map +1 -0
  39. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/import-assertions.d.ts +177 -0
  40. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/import-assertions.js +56 -0
  41. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/import-assertions.js.map +1 -0
  42. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/index.d.ts +198 -0
  43. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/index.js +327 -0
  44. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/index.js.map +1 -0
  45. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/xhtml.d.ts +256 -0
  46. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/xhtml.js +256 -0
  47. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/extentions/jsx/xhtml.js.map +1 -0
  48. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/index.d.ts +472 -0
  49. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/index.js +1 -0
  50. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/index.js.map +1 -0
  51. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/index.mjs +1 -0
  52. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/middleware.d.ts +159 -0
  53. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/middleware.js +2 -0
  54. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/middleware.js.map +1 -0
  55. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/parseutil.d.ts +10 -0
  56. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/parseutil.js +38 -0
  57. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/parseutil.js.map +1 -0
  58. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/scopeflags.d.ts +12 -0
  59. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/scopeflags.js +29 -0
  60. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/scopeflags.js.map +1 -0
  61. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/tokenType.d.ts +2 -0
  62. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/tokenType.js +118 -0
  63. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/tokenType.js.map +1 -0
  64. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/types.d.ts +60 -0
  65. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/types.js +2 -0
  66. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/types.js.map +1 -0
  67. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/whitespace.d.ts +2 -0
  68. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/whitespace.js +19 -0
  69. package/scaffold/scripts/parsers/node_modules/acorn-typescript/lib/whitespace.js.map +1 -0
  70. package/scaffold/scripts/parsers/node_modules/acorn-typescript/package.json +53 -0
  71. package/scaffold/scripts/parsers/node_modules/acorn-typescript/tsconfig.json +19 -0
  72. package/scaffold/scripts/parsers/node_modules/acorn-walk/CHANGELOG.md +209 -0
  73. package/scaffold/scripts/parsers/node_modules/acorn-walk/LICENSE +21 -0
  74. package/scaffold/scripts/parsers/node_modules/acorn-walk/README.md +124 -0
  75. package/scaffold/scripts/parsers/node_modules/acorn-walk/dist/walk.d.mts +152 -0
  76. package/scaffold/scripts/parsers/node_modules/acorn-walk/dist/walk.d.ts +152 -0
  77. package/scaffold/scripts/parsers/node_modules/acorn-walk/dist/walk.js +485 -0
  78. package/scaffold/scripts/parsers/node_modules/acorn-walk/dist/walk.mjs +467 -0
  79. package/scaffold/scripts/parsers/node_modules/acorn-walk/package.json +50 -0
  80. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/LICENSE +24 -0
  81. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/README.md +23 -0
  82. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-bash.wasm +0 -0
  83. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-c.wasm +0 -0
  84. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-c_sharp.wasm +0 -0
  85. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-cpp.wasm +0 -0
  86. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-css.wasm +0 -0
  87. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-dart.wasm +0 -0
  88. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-elisp.wasm +0 -0
  89. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-elixir.wasm +0 -0
  90. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-elm.wasm +0 -0
  91. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-embedded_template.wasm +0 -0
  92. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-go.wasm +0 -0
  93. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-html.wasm +0 -0
  94. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-java.wasm +0 -0
  95. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-javascript.wasm +0 -0
  96. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-json.wasm +0 -0
  97. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-kotlin.wasm +0 -0
  98. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-lua.wasm +0 -0
  99. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-objc.wasm +0 -0
  100. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-ocaml.wasm +0 -0
  101. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-php.wasm +0 -0
  102. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-python.wasm +0 -0
  103. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-ql.wasm +0 -0
  104. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-rescript.wasm +0 -0
  105. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-ruby.wasm +0 -0
  106. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-rust.wasm +0 -0
  107. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-scala.wasm +0 -0
  108. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-solidity.wasm +0 -0
  109. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-swift.wasm +0 -0
  110. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-systemrdl.wasm +0 -0
  111. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-tlaplus.wasm +0 -0
  112. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-toml.wasm +0 -0
  113. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-tsx.wasm +0 -0
  114. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-typescript.wasm +0 -0
  115. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-vue.wasm +0 -0
  116. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-yaml.wasm +0 -0
  117. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/out/tree-sitter-zig.wasm +0 -0
  118. package/scaffold/scripts/parsers/node_modules/tree-sitter-wasms/package.json +64 -0
  119. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/LICENSE +21 -0
  120. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/README.md +198 -0
  121. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/package.json +37 -0
  122. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/tree-sitter-web.d.ts +242 -0
  123. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/tree-sitter.js +1 -0
  124. package/scaffold/scripts/parsers/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
  125. package/scaffold/scripts/parsers/package-lock.json +19 -1
  126. package/scaffold/scripts/parsers/package.json +3 -1
  127. package/scaffold/scripts/parsers/python-treesitter.mjs +271 -0
  128. package/scaffold/scripts/parsers/ruby-treesitter.mjs +271 -0
  129. package/scaffold/scripts/parsers/rust-dispatch.mjs +43 -0
  130. package/scaffold/scripts/parsers/rust-treesitter.mjs +291 -0
  131. package/scaffold/scripts/parsers/tree-sitter/base.mjs +163 -0
  132. package/scaffold/scripts/parsers/tree-sitter/queries/bash.calls.scm +7 -0
  133. package/scaffold/scripts/parsers/tree-sitter/queries/bash.chunks.scm +6 -0
  134. package/scaffold/scripts/parsers/tree-sitter/queries/bash.imports.scm +5 -0
  135. package/scaffold/scripts/parsers/tree-sitter/queries/cpp.calls.scm +17 -0
  136. package/scaffold/scripts/parsers/tree-sitter/queries/cpp.chunks.scm +30 -0
  137. package/scaffold/scripts/parsers/tree-sitter/queries/cpp.imports.scm +6 -0
  138. package/scaffold/scripts/parsers/tree-sitter/queries/go.calls.scm +11 -0
  139. package/scaffold/scripts/parsers/tree-sitter/queries/go.chunks.scm +19 -0
  140. package/scaffold/scripts/parsers/tree-sitter/queries/go.imports.scm +6 -0
  141. package/scaffold/scripts/parsers/tree-sitter/queries/java.calls.scm +6 -0
  142. package/scaffold/scripts/parsers/tree-sitter/queries/java.chunks.scm +23 -0
  143. package/scaffold/scripts/parsers/tree-sitter/queries/java.imports.scm +6 -0
  144. package/scaffold/scripts/parsers/tree-sitter/queries/python.calls.scm +11 -0
  145. package/scaffold/scripts/parsers/tree-sitter/queries/python.chunks.scm +11 -0
  146. package/scaffold/scripts/parsers/tree-sitter/queries/python.imports.scm +13 -0
  147. package/scaffold/scripts/parsers/tree-sitter/queries/ruby.calls.scm +6 -0
  148. package/scaffold/scripts/parsers/tree-sitter/queries/ruby.chunks.scm +16 -0
  149. package/scaffold/scripts/parsers/tree-sitter/queries/ruby.imports.scm +8 -0
  150. package/scaffold/scripts/parsers/tree-sitter/queries/rust.calls.scm +31 -0
  151. package/scaffold/scripts/parsers/tree-sitter/queries/rust.chunks.scm +29 -0
  152. package/scaffold/scripts/parsers/tree-sitter/queries/rust.imports.scm +5 -0
  153. package/scaffold/scripts/parsers/vb6.mjs +395 -0
@@ -4,23 +4,85 @@ import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { execSync } from "node:child_process";
7
- import { parseCode as parseJavaScriptCode } from "./parsers/javascript.mjs";
8
- import {
9
- isVbNetParserAvailable,
10
- parseCode as parseVbNetCode
11
- } from "./parsers/vbnet.mjs";
12
- import {
13
- isCSharpParserAvailable,
14
- parseCode as parseCSharpCode
15
- } from "./parsers/csharp.mjs";
16
- import {
17
- isCppParserAvailable,
18
- parseCode as parseCppCode
19
- } from "./parsers/cpp.mjs";
20
- import { parseCode as parseConfigCode } from "./parsers/config.mjs";
21
- import { parseCode as parseResourcesCode } from "./parsers/resources.mjs";
22
- import { parseCode as parseSqlCode } from "./parsers/sql.mjs";
23
- import { parseCode as parseRustCode } from "./parsers/rust.mjs";
7
+ import { parseCode } from "./parsers/javascript.mjs";
8
+
9
+ const parseJavaScriptCode = parseCode;
10
+ let parseVbNetCode = null;
11
+ let parseCSharpCode = null;
12
+ let parseCSharpProject = null;
13
+ let parseCppCode = null;
14
+ let parseConfigCode = null;
15
+ let parseResourcesCode = null;
16
+ let parseSqlCode = null;
17
+ let parseRustCode = null;
18
+ let parsePythonCode = null;
19
+ let parseGoCode = null;
20
+ let parseJavaCode = null;
21
+ let parseRubyCode = null;
22
+ let parseBashCode = null;
23
+ let parseVb6Code = null;
24
+ let isVbNetParserAvailable = () => false;
25
+ let isCSharpParserAvailable = () => false;
26
+ let isCppParserAvailable = () => false;
27
+
28
+ async function loadOptionalParsers() {
29
+ const loaders = [
30
+ import("./parsers/vbnet.mjs").then((module) => {
31
+ parseVbNetCode = module.parseCode;
32
+ isVbNetParserAvailable =
33
+ typeof module.isVbNetParserAvailable === "function"
34
+ ? module.isVbNetParserAvailable
35
+ : () => typeof module.parseCode === "function";
36
+ }),
37
+ import("./parsers/csharp.mjs").then((module) => {
38
+ parseCSharpCode = module.parseCode;
39
+ parseCSharpProject = module.parseProject ?? null;
40
+ isCSharpParserAvailable =
41
+ typeof module.isCSharpParserAvailable === "function"
42
+ ? module.isCSharpParserAvailable
43
+ : () => typeof module.parseCode === "function";
44
+ }),
45
+ import("./parsers/cpp-dispatch.mjs").then((module) => {
46
+ parseCppCode = module.parseCode;
47
+ isCppParserAvailable =
48
+ typeof module.isCppParserAvailable === "function"
49
+ ? module.isCppParserAvailable
50
+ : () => typeof module.parseCode === "function";
51
+ }),
52
+ import("./parsers/config.mjs").then((module) => {
53
+ parseConfigCode = module.parseCode;
54
+ }),
55
+ import("./parsers/resources.mjs").then((module) => {
56
+ parseResourcesCode = module.parseCode;
57
+ }),
58
+ import("./parsers/sql.mjs").then((module) => {
59
+ parseSqlCode = module.parseCode;
60
+ }),
61
+ import("./parsers/rust-dispatch.mjs").then((module) => {
62
+ parseRustCode = module.parseCode;
63
+ }),
64
+ import("./parsers/python-treesitter.mjs").then((module) => {
65
+ parsePythonCode = module.parseCode;
66
+ }),
67
+ import("./parsers/go-treesitter.mjs").then((module) => {
68
+ parseGoCode = module.parseCode;
69
+ }),
70
+ import("./parsers/java-treesitter.mjs").then((module) => {
71
+ parseJavaCode = module.parseCode;
72
+ }),
73
+ import("./parsers/ruby-treesitter.mjs").then((module) => {
74
+ parseRubyCode = module.parseCode;
75
+ }),
76
+ import("./parsers/bash-treesitter.mjs").then((module) => {
77
+ parseBashCode = module.parseCode;
78
+ }),
79
+ import("./parsers/vb6.mjs").then((module) => {
80
+ parseVb6Code = module.parseCode;
81
+ })
82
+ ];
83
+
84
+ await Promise.allSettled(loaders);
85
+ }
24
86
 
25
87
  const __filename = fileURLToPath(import.meta.url);
26
88
  const __dirname = path.dirname(__filename);
@@ -75,7 +137,11 @@ const SUPPORTED_TEXT_EXTENSIONS = new Set([
75
137
  ".cpp",
76
138
  ".hpp",
77
139
  ".cc",
78
- ".hh"
140
+ ".hh",
141
+ ".bas",
142
+ ".cls",
143
+ ".frm",
144
+ ".ctl"
79
145
  ]);
80
146
 
81
147
  const LEGACY_DOTNET_METADATA_EXTENSIONS = new Set([
@@ -90,7 +156,7 @@ const LEGACY_DOTNET_METADATA_EXTENSIONS = new Set([
90
156
  ".settings"
91
157
  ]);
92
158
 
93
- const PROJECT_DEFINITION_EXTENSIONS = new Set([".sln", ".vbproj", ".csproj", ".fsproj"]);
159
+ const PROJECT_DEFINITION_EXTENSIONS = new Set([".sln", ".vbproj", ".csproj", ".fsproj", ".vcxproj"]);
94
160
  const STRUCTURED_NON_CODE_CHUNK_EXTENSIONS = new Set([".config", ".resx", ".settings"]);
95
161
 
96
162
  const CODE_FILE_EXTENSIONS = new Set([
@@ -120,7 +186,11 @@ const CODE_FILE_EXTENSIONS = new Set([
120
186
  ".cpp",
121
187
  ".hpp",
122
188
  ".cc",
123
- ".hh"
189
+ ".hh",
190
+ ".bas",
191
+ ".cls",
192
+ ".frm",
193
+ ".ctl"
124
194
  ]);
125
195
 
126
196
  const SQL_REFERENCE_SOURCE_EXTENSIONS = new Set([
@@ -199,99 +269,200 @@ const CHUNK_PARSERS = new Map([
199
269
  ".vb",
200
270
  {
201
271
  language: "vbnet",
202
- parse: parseVbNetCode,
203
- isAvailable: isVbNetParserAvailable
272
+ parse: (...args) => parseVbNetCode(...args),
273
+ isAvailable: () =>
274
+ typeof parseVbNetCode === "function" && isVbNetParserAvailable()
204
275
  }
205
276
  ],
206
277
  [
207
278
  ".cs",
208
279
  {
209
280
  language: "csharp",
210
- parse: parseCSharpCode,
211
- isAvailable: isCSharpParserAvailable
281
+ parse: (...args) => parseCSharpCode(...args),
282
+ isAvailable: () =>
283
+ typeof parseCSharpCode === "function" && isCSharpParserAvailable()
212
284
  }
213
285
  ],
214
286
  [
215
287
  ".sql",
216
288
  {
217
289
  language: "sql",
218
- parse: parseSqlCode
290
+ parse: (...args) => parseSqlCode(...args),
291
+ isAvailable: () => typeof parseSqlCode === "function"
219
292
  }
220
293
  ],
221
294
  [
222
295
  ".config",
223
296
  {
224
297
  language: "config",
225
- parse: parseConfigCode
298
+ parse: (...args) => parseConfigCode(...args),
299
+ isAvailable: () => typeof parseConfigCode === "function"
226
300
  }
227
301
  ],
228
302
  [
229
303
  ".resx",
230
304
  {
231
305
  language: "resource",
232
- parse: parseResourcesCode
306
+ parse: (...args) => parseResourcesCode(...args),
307
+ isAvailable: () => typeof parseResourcesCode === "function"
233
308
  }
234
309
  ],
235
310
  [
236
311
  ".settings",
237
312
  {
238
313
  language: "settings",
239
- parse: parseResourcesCode
314
+ parse: (...args) => parseResourcesCode(...args),
315
+ isAvailable: () => typeof parseResourcesCode === "function"
240
316
  }
241
317
  ],
242
318
  [
243
319
  ".c",
244
320
  {
245
321
  language: "c",
246
- parse: parseCppCode,
247
- isAvailable: isCppParserAvailable
322
+ parse: (...args) => parseCppCode(...args),
323
+ isAvailable: () =>
324
+ typeof parseCppCode === "function" && isCppParserAvailable()
248
325
  }
249
326
  ],
250
327
  [
251
328
  ".h",
252
329
  {
253
330
  language: "c",
254
- parse: parseCppCode,
255
- isAvailable: isCppParserAvailable
331
+ parse: (...args) => parseCppCode(...args),
332
+ isAvailable: () =>
333
+ typeof parseCppCode === "function" && isCppParserAvailable()
256
334
  }
257
335
  ],
258
336
  [
259
337
  ".cpp",
260
338
  {
261
339
  language: "cpp",
262
- parse: parseCppCode,
263
- isAvailable: isCppParserAvailable
340
+ parse: (...args) => parseCppCode(...args),
341
+ isAvailable: () =>
342
+ typeof parseCppCode === "function" && isCppParserAvailable()
264
343
  }
265
344
  ],
266
345
  [
267
346
  ".cc",
268
347
  {
269
348
  language: "cpp",
270
- parse: parseCppCode,
271
- isAvailable: isCppParserAvailable
349
+ parse: (...args) => parseCppCode(...args),
350
+ isAvailable: () =>
351
+ typeof parseCppCode === "function" && isCppParserAvailable()
272
352
  }
273
353
  ],
274
354
  [
275
355
  ".hpp",
276
356
  {
277
357
  language: "cpp",
278
- parse: parseCppCode,
279
- isAvailable: isCppParserAvailable
358
+ parse: (...args) => parseCppCode(...args),
359
+ isAvailable: () =>
360
+ typeof parseCppCode === "function" && isCppParserAvailable()
280
361
  }
281
362
  ],
282
363
  [
283
364
  ".hh",
284
365
  {
285
366
  language: "cpp",
286
- parse: parseCppCode,
287
- isAvailable: isCppParserAvailable
367
+ parse: (...args) => parseCppCode(...args),
368
+ isAvailable: () =>
369
+ typeof parseCppCode === "function" && isCppParserAvailable()
288
370
  }
289
371
  ],
290
372
  [
291
373
  ".rs",
292
374
  {
293
375
  language: "rust",
294
- parse: parseRustCode
376
+ parse: (...args) => parseRustCode(...args),
377
+ isAvailable: () => typeof parseRustCode === "function"
378
+ }
379
+ ],
380
+ [
381
+ ".py",
382
+ {
383
+ language: "python",
384
+ parse: (...args) => parsePythonCode(...args),
385
+ isAvailable: () => typeof parsePythonCode === "function"
386
+ }
387
+ ],
388
+ [
389
+ ".go",
390
+ {
391
+ language: "go",
392
+ parse: (...args) => parseGoCode(...args),
393
+ isAvailable: () => typeof parseGoCode === "function"
394
+ }
395
+ ],
396
+ [
397
+ ".java",
398
+ {
399
+ language: "java",
400
+ parse: (...args) => parseJavaCode(...args),
401
+ isAvailable: () => typeof parseJavaCode === "function"
402
+ }
403
+ ],
404
+ [
405
+ ".rb",
406
+ {
407
+ language: "ruby",
408
+ parse: (...args) => parseRubyCode(...args),
409
+ isAvailable: () => typeof parseRubyCode === "function"
410
+ }
411
+ ],
412
+ [
413
+ ".sh",
414
+ {
415
+ language: "bash",
416
+ parse: (...args) => parseBashCode(...args),
417
+ isAvailable: () => typeof parseBashCode === "function"
418
+ }
419
+ ],
420
+ [
421
+ ".bash",
422
+ {
423
+ language: "bash",
424
+ parse: (...args) => parseBashCode(...args),
425
+ isAvailable: () => typeof parseBashCode === "function"
426
+ }
427
+ ],
428
+ [
429
+ ".zsh",
430
+ {
431
+ language: "bash",
432
+ parse: (...args) => parseBashCode(...args),
433
+ isAvailable: () => typeof parseBashCode === "function"
434
+ }
435
+ ],
436
+ [
437
+ ".bas",
438
+ {
439
+ language: "vb6",
440
+ parse: (...args) => parseVb6Code(...args),
441
+ isAvailable: () => typeof parseVb6Code === "function"
442
+ }
443
+ ],
444
+ [
445
+ ".cls",
446
+ {
447
+ language: "vb6",
448
+ parse: (...args) => parseVb6Code(...args),
449
+ isAvailable: () => typeof parseVb6Code === "function"
450
+ }
451
+ ],
452
+ [
453
+ ".frm",
454
+ {
455
+ language: "vb6",
456
+ parse: (...args) => parseVb6Code(...args),
457
+ isAvailable: () => typeof parseVb6Code === "function"
458
+ }
459
+ ],
460
+ [
461
+ ".ctl",
462
+ {
463
+ language: "vb6",
464
+ parse: (...args) => parseVb6Code(...args),
465
+ isAvailable: () => typeof parseVb6Code === "function"
295
466
  }
296
467
  ]
297
468
  ]);
@@ -953,6 +1124,58 @@ function namedEntryChunkAliases(chunk) {
953
1124
  return [...aliases];
954
1125
  }
955
1126
 
1127
+ function buildChunkAliasIndexes(chunkRecords) {
1128
+ const sqlChunkIdsByAlias = new Map();
1129
+ const configChunkIdsByAlias = new Map();
1130
+ const resourceChunkIdsByAlias = new Map();
1131
+ const settingChunkIdsByAlias = new Map();
1132
+
1133
+ for (const chunk of chunkRecords) {
1134
+ if (isWindowChunkId(chunk?.id)) {
1135
+ continue;
1136
+ }
1137
+
1138
+ const language = String(chunk?.language ?? "").toLowerCase();
1139
+ if (language === "sql") {
1140
+ for (const alias of sqlChunkAliases(chunk.name)) {
1141
+ const existing = sqlChunkIdsByAlias.get(alias) ?? [];
1142
+ sqlChunkIdsByAlias.set(alias, [...existing, chunk.id]);
1143
+ }
1144
+ continue;
1145
+ }
1146
+
1147
+ if (language === "config") {
1148
+ for (const alias of configChunkAliases(chunk)) {
1149
+ const existing = configChunkIdsByAlias.get(alias) ?? [];
1150
+ configChunkIdsByAlias.set(alias, [...existing, chunk.id]);
1151
+ }
1152
+ continue;
1153
+ }
1154
+
1155
+ if (language === "resource") {
1156
+ for (const alias of namedEntryChunkAliases(chunk)) {
1157
+ const existing = resourceChunkIdsByAlias.get(alias) ?? [];
1158
+ resourceChunkIdsByAlias.set(alias, [...existing, chunk.id]);
1159
+ }
1160
+ continue;
1161
+ }
1162
+
1163
+ if (language === "settings") {
1164
+ for (const alias of namedEntryChunkAliases(chunk)) {
1165
+ const existing = settingChunkIdsByAlias.get(alias) ?? [];
1166
+ settingChunkIdsByAlias.set(alias, [...existing, chunk.id]);
1167
+ }
1168
+ }
1169
+ }
1170
+
1171
+ return {
1172
+ sqlChunkIdsByAlias,
1173
+ configChunkIdsByAlias,
1174
+ resourceChunkIdsByAlias,
1175
+ settingChunkIdsByAlias
1176
+ };
1177
+ }
1178
+
956
1179
  function extractSqlReferenceNamesFromString(text) {
957
1180
  const refs = new Set();
958
1181
 
@@ -1701,6 +1924,8 @@ function projectLanguageForExtension(ext) {
1701
1924
  return "csharp";
1702
1925
  case ".fsproj":
1703
1926
  return "fsharp";
1927
+ case ".vcxproj":
1928
+ return "cpp";
1704
1929
  case ".sln":
1705
1930
  return "solution";
1706
1931
  default:
@@ -1734,7 +1959,7 @@ function parseSolutionProject(fileRecord, indexedFileIds) {
1734
1959
  const ext = path.extname(fileRecord.path).toLowerCase();
1735
1960
  const fallbackName = path.basename(fileRecord.path, ext);
1736
1961
  const projectPattern =
1737
- /^Project\([^)]*\)\s*=\s*"([^"]+)",\s*"([^"]+\.(?:vbproj|csproj|fsproj))",\s*"\{[^"]+\}"$/gim;
1962
+ /^Project\([^)]*\)\s*=\s*"([^"]+)",\s*"([^"]+\.(?:vbproj|csproj|fsproj|vcxproj))",\s*"\{[^"]+\}"$/gim;
1738
1963
 
1739
1964
  let match;
1740
1965
  while ((match = projectPattern.exec(fileRecord.content)) !== null) {
@@ -2274,7 +2499,8 @@ function splitChunkIntoWindows(chunkRecord, options) {
2274
2499
  return windows;
2275
2500
  }
2276
2501
 
2277
- function main() {
2502
+ async function main() {
2503
+ await loadOptionalParsers();
2278
2504
  const { mode, verbose } = parseArgs(process.argv);
2279
2505
  const configPath = path.join(CONTEXT_DIR, "config.yaml");
2280
2506
  const rulesPath = path.join(CONTEXT_DIR, "rules.yaml");
@@ -2482,19 +2708,54 @@ function main() {
2482
2708
 
2483
2709
  // Extract chunks from changed or uncached code files
2484
2710
  let windowedChunkCount = 0;
2485
- const sqlChunkIdsByAlias = new Map();
2486
- const configChunkIdsByAlias = new Map();
2487
- const resourceChunkIdsByAlias = new Map();
2488
- const settingChunkIdsByAlias = new Map();
2711
+ let {
2712
+ sqlChunkIdsByAlias,
2713
+ configChunkIdsByAlias,
2714
+ resourceChunkIdsByAlias,
2715
+ settingChunkIdsByAlias
2716
+ } = buildChunkAliasIndexes([...chunkRecordMap.values()]);
2489
2717
  const deferredSqlCallEdges = [];
2490
2718
 
2719
+ // C# project-wide batch parse: when Roslyn is available and batching
2720
+ // isn't disabled, compile all .cs files together via CSharpCompilation
2721
+ // to enable SemanticModel-resolved calls (e.g. "System.IO.File.ReadAllText"
2722
+ // instead of bare "ReadAllText"). Falls back silently to per-file parse
2723
+ // if batch isn't usable.
2724
+ const csharpBatchCache = new Map();
2725
+ if (
2726
+ typeof parseCSharpProject === "function" &&
2727
+ isCSharpParserAvailable() &&
2728
+ process.env.CORTEX_CSHARP_BATCH !== "never"
2729
+ ) {
2730
+ const csharpFilesForBatch = fileRecords.filter((r) => {
2731
+ if (r.kind !== "CODE") return false;
2732
+ if (path.extname(r.path).toLowerCase() !== ".cs") return false;
2733
+ return !incrementalMode || changedFileIds.has(r.id) || !cachedChunkFileIds.has(r.id);
2734
+ });
2735
+ if (csharpFilesForBatch.length > 0) {
2736
+ const allCsharpInputs = fileRecords
2737
+ .filter((r) => r.kind === "CODE" && path.extname(r.path).toLowerCase() === ".cs")
2738
+ .map((r) => ({ path: r.path, content: r.content }));
2739
+ try {
2740
+ const batchResult = parseCSharpProject(allCsharpInputs);
2741
+ for (const [filePath, result] of batchResult) {
2742
+ csharpBatchCache.set(filePath, result);
2743
+ }
2744
+ } catch (error) {
2745
+ if (verbose) {
2746
+ console.log(`[ingest] C# batch parse failed, falling back per-file: ${error.message}`);
2747
+ }
2748
+ }
2749
+ }
2750
+ }
2751
+
2491
2752
  for (const fileRecord of fileRecords) {
2492
2753
  const ext = path.extname(fileRecord.path).toLowerCase();
2493
2754
  const parser = getChunkParserForExtension(ext);
2494
2755
  const isStructuredNonCodeChunk = STRUCTURED_NON_CODE_CHUNK_EXTENSIONS.has(ext);
2495
2756
  if (fileRecord.kind !== "CODE" && !isStructuredNonCodeChunk) continue;
2496
2757
  if (!parser) continue;
2497
- if (typeof parser.isAvailable === "function" && !parser.isAvailable()) continue;
2758
+ if (typeof parser.isAvailable === "function" && !(await parser.isAvailable())) continue;
2498
2759
 
2499
2760
  const shouldParseFile =
2500
2761
  !incrementalMode || changedFileIds.has(fileRecord.id) || !cachedChunkFileIds.has(fileRecord.id);
@@ -2512,7 +2773,9 @@ function main() {
2512
2773
  );
2513
2774
 
2514
2775
  try {
2515
- const parseResult = parser.parse(fileRecord.content, fileRecord.path, parser.language);
2776
+ const parseResult = parser.language === "csharp" && csharpBatchCache.has(fileRecord.path)
2777
+ ? csharpBatchCache.get(fileRecord.path)
2778
+ : await parser.parse(fileRecord.content, fileRecord.path, parser.language);
2516
2779
 
2517
2780
  if (parseResult.errors.length > 0 && verbose) {
2518
2781
  console.log(`[ingest] parse errors in ${fileRecord.path}:`, parseResult.errors[0].message);
@@ -2663,6 +2926,12 @@ function main() {
2663
2926
  }
2664
2927
 
2665
2928
  const chunkRecords = [...chunkRecordMap.values()].sort((a, b) => String(a.id).localeCompare(String(b.id)));
2929
+ ({
2930
+ sqlChunkIdsByAlias,
2931
+ configChunkIdsByAlias,
2932
+ resourceChunkIdsByAlias,
2933
+ settingChunkIdsByAlias
2934
+ } = buildChunkAliasIndexes(chunkRecords));
2666
2935
 
2667
2936
  // Filter CALLS relations to only valid targets (chunks that actually exist)
2668
2937
  const chunkIdSet = new Set(chunkRecords.map(c => c.id));
@@ -3276,10 +3545,14 @@ function main() {
3276
3545
 
3277
3546
  const isMainModule = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(__filename);
3278
3547
  if (isMainModule) {
3279
- main();
3548
+ main().catch((error) => {
3549
+ console.error(error instanceof Error ? error.message : String(error));
3550
+ process.exit(1);
3551
+ });
3280
3552
  }
3281
3553
 
3282
3554
  export {
3555
+ buildChunkAliasIndexes,
3283
3556
  buildSqlResourceReferenceMap,
3284
3557
  detectKind,
3285
3558
  extractSqlObjectReferencesFromContent,