gitnexus 1.5.3 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +10 -0
  2. package/dist/_shared/graph/types.d.ts +1 -1
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/language-detection.d.ts.map +1 -1
  7. package/dist/_shared/language-detection.js +2 -0
  8. package/dist/_shared/language-detection.js.map +1 -1
  9. package/dist/_shared/languages.d.ts +1 -0
  10. package/dist/_shared/languages.d.ts.map +1 -1
  11. package/dist/_shared/languages.js +1 -0
  12. package/dist/_shared/languages.js.map +1 -1
  13. package/dist/_shared/lbug/schema-constants.d.ts +1 -1
  14. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.js +3 -1
  16. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  17. package/dist/_shared/mro-strategy.d.ts +19 -0
  18. package/dist/_shared/mro-strategy.d.ts.map +1 -0
  19. package/dist/_shared/mro-strategy.js +2 -0
  20. package/dist/_shared/mro-strategy.js.map +1 -0
  21. package/dist/cli/ai-context.d.ts +1 -0
  22. package/dist/cli/ai-context.js +28 -4
  23. package/dist/cli/analyze.d.ts +2 -0
  24. package/dist/cli/analyze.js +30 -4
  25. package/dist/cli/group.d.ts +2 -0
  26. package/dist/cli/group.js +233 -0
  27. package/dist/cli/index.js +3 -0
  28. package/dist/cli/serve.js +4 -1
  29. package/dist/cli/setup.js +34 -3
  30. package/dist/config/ignore-service.js +8 -3
  31. package/dist/core/augmentation/engine.js +1 -1
  32. package/dist/core/git-staleness.d.ts +13 -0
  33. package/dist/core/git-staleness.js +29 -0
  34. package/dist/core/group/bridge-db.d.ts +82 -0
  35. package/dist/core/group/bridge-db.js +460 -0
  36. package/dist/core/group/bridge-schema.d.ts +27 -0
  37. package/dist/core/group/bridge-schema.js +55 -0
  38. package/dist/core/group/config-parser.d.ts +3 -0
  39. package/dist/core/group/config-parser.js +83 -0
  40. package/dist/core/group/contract-extractor.d.ts +7 -0
  41. package/dist/core/group/contract-extractor.js +1 -0
  42. package/dist/core/group/extractors/fs-utils.d.ts +10 -0
  43. package/dist/core/group/extractors/fs-utils.js +24 -0
  44. package/dist/core/group/extractors/grpc-extractor.d.ts +25 -0
  45. package/dist/core/group/extractors/grpc-extractor.js +386 -0
  46. package/dist/core/group/extractors/grpc-patterns/go.d.ts +2 -0
  47. package/dist/core/group/extractors/grpc-patterns/go.js +97 -0
  48. package/dist/core/group/extractors/grpc-patterns/index.d.ts +19 -0
  49. package/dist/core/group/extractors/grpc-patterns/index.js +46 -0
  50. package/dist/core/group/extractors/grpc-patterns/java.d.ts +2 -0
  51. package/dist/core/group/extractors/grpc-patterns/java.js +173 -0
  52. package/dist/core/group/extractors/grpc-patterns/node.d.ts +4 -0
  53. package/dist/core/group/extractors/grpc-patterns/node.js +290 -0
  54. package/dist/core/group/extractors/grpc-patterns/proto.d.ts +9 -0
  55. package/dist/core/group/extractors/grpc-patterns/proto.js +134 -0
  56. package/dist/core/group/extractors/grpc-patterns/python.d.ts +2 -0
  57. package/dist/core/group/extractors/grpc-patterns/python.js +67 -0
  58. package/dist/core/group/extractors/grpc-patterns/types.d.ts +50 -0
  59. package/dist/core/group/extractors/grpc-patterns/types.js +1 -0
  60. package/dist/core/group/extractors/http-patterns/go.d.ts +2 -0
  61. package/dist/core/group/extractors/http-patterns/go.js +215 -0
  62. package/dist/core/group/extractors/http-patterns/index.d.ts +17 -0
  63. package/dist/core/group/extractors/http-patterns/index.js +44 -0
  64. package/dist/core/group/extractors/http-patterns/java.d.ts +2 -0
  65. package/dist/core/group/extractors/http-patterns/java.js +253 -0
  66. package/dist/core/group/extractors/http-patterns/node.d.ts +4 -0
  67. package/dist/core/group/extractors/http-patterns/node.js +354 -0
  68. package/dist/core/group/extractors/http-patterns/php.d.ts +2 -0
  69. package/dist/core/group/extractors/http-patterns/php.js +70 -0
  70. package/dist/core/group/extractors/http-patterns/python.d.ts +2 -0
  71. package/dist/core/group/extractors/http-patterns/python.js +133 -0
  72. package/dist/core/group/extractors/http-patterns/types.d.ts +61 -0
  73. package/dist/core/group/extractors/http-patterns/types.js +1 -0
  74. package/dist/core/group/extractors/http-route-extractor.d.ts +21 -0
  75. package/dist/core/group/extractors/http-route-extractor.js +391 -0
  76. package/dist/core/group/extractors/manifest-extractor.d.ts +54 -0
  77. package/dist/core/group/extractors/manifest-extractor.js +235 -0
  78. package/dist/core/group/extractors/topic-extractor.d.ts +8 -0
  79. package/dist/core/group/extractors/topic-extractor.js +97 -0
  80. package/dist/core/group/extractors/topic-patterns/go.d.ts +2 -0
  81. package/dist/core/group/extractors/topic-patterns/go.js +120 -0
  82. package/dist/core/group/extractors/topic-patterns/index.d.ts +14 -0
  83. package/dist/core/group/extractors/topic-patterns/index.js +38 -0
  84. package/dist/core/group/extractors/topic-patterns/java.d.ts +2 -0
  85. package/dist/core/group/extractors/topic-patterns/java.js +80 -0
  86. package/dist/core/group/extractors/topic-patterns/node.d.ts +4 -0
  87. package/dist/core/group/extractors/topic-patterns/node.js +155 -0
  88. package/dist/core/group/extractors/topic-patterns/python.d.ts +2 -0
  89. package/dist/core/group/extractors/topic-patterns/python.js +116 -0
  90. package/dist/core/group/extractors/topic-patterns/types.d.ts +25 -0
  91. package/dist/core/group/extractors/topic-patterns/types.js +10 -0
  92. package/dist/core/group/extractors/tree-sitter-scanner.d.ts +113 -0
  93. package/dist/core/group/extractors/tree-sitter-scanner.js +94 -0
  94. package/dist/core/group/matching.d.ts +13 -0
  95. package/dist/core/group/matching.js +198 -0
  96. package/dist/core/group/normalization.d.ts +3 -0
  97. package/dist/core/group/normalization.js +115 -0
  98. package/dist/core/group/service-boundary-detector.d.ts +8 -0
  99. package/dist/core/group/service-boundary-detector.js +155 -0
  100. package/dist/core/group/service.d.ts +46 -0
  101. package/dist/core/group/service.js +160 -0
  102. package/dist/core/group/storage.d.ts +9 -0
  103. package/dist/core/group/storage.js +91 -0
  104. package/dist/core/group/sync.d.ts +21 -0
  105. package/dist/core/group/sync.js +148 -0
  106. package/dist/core/group/types.d.ts +130 -0
  107. package/dist/core/group/types.js +1 -0
  108. package/dist/core/ingestion/binding-accumulator.d.ts +212 -0
  109. package/dist/core/ingestion/binding-accumulator.js +336 -0
  110. package/dist/core/ingestion/call-processor.d.ts +155 -24
  111. package/dist/core/ingestion/call-processor.js +1129 -247
  112. package/dist/core/ingestion/class-extractors/generic.d.ts +2 -0
  113. package/dist/core/ingestion/class-extractors/generic.js +135 -0
  114. package/dist/core/ingestion/class-types.d.ts +34 -0
  115. package/dist/core/ingestion/class-types.js +1 -0
  116. package/dist/core/ingestion/cobol-processor.d.ts +1 -1
  117. package/dist/core/ingestion/entry-point-scoring.d.ts +1 -0
  118. package/dist/core/ingestion/entry-point-scoring.js +1 -0
  119. package/dist/core/ingestion/field-types.d.ts +2 -2
  120. package/dist/core/ingestion/filesystem-walker.js +8 -0
  121. package/dist/core/ingestion/framework-detection.d.ts +1 -0
  122. package/dist/core/ingestion/framework-detection.js +1 -0
  123. package/dist/core/ingestion/heritage-processor.d.ts +8 -15
  124. package/dist/core/ingestion/heritage-processor.js +15 -28
  125. package/dist/core/ingestion/import-processor.d.ts +1 -11
  126. package/dist/core/ingestion/import-processor.js +1 -13
  127. package/dist/core/ingestion/import-resolvers/utils.js +1 -0
  128. package/dist/core/ingestion/import-resolvers/vue.d.ts +8 -0
  129. package/dist/core/ingestion/import-resolvers/vue.js +9 -0
  130. package/dist/core/ingestion/language-config.js +1 -1
  131. package/dist/core/ingestion/language-provider.d.ts +14 -3
  132. package/dist/core/ingestion/languages/c-cpp.js +168 -1
  133. package/dist/core/ingestion/languages/csharp.js +20 -0
  134. package/dist/core/ingestion/languages/dart.js +26 -4
  135. package/dist/core/ingestion/languages/go.js +22 -0
  136. package/dist/core/ingestion/languages/index.d.ts +1 -0
  137. package/dist/core/ingestion/languages/index.js +2 -0
  138. package/dist/core/ingestion/languages/java.js +17 -0
  139. package/dist/core/ingestion/languages/kotlin.js +24 -1
  140. package/dist/core/ingestion/languages/php.js +23 -11
  141. package/dist/core/ingestion/languages/python.js +9 -0
  142. package/dist/core/ingestion/languages/ruby.js +43 -0
  143. package/dist/core/ingestion/languages/rust.js +38 -0
  144. package/dist/core/ingestion/languages/swift.js +31 -0
  145. package/dist/core/ingestion/languages/typescript.d.ts +1 -0
  146. package/dist/core/ingestion/languages/typescript.js +52 -3
  147. package/dist/core/ingestion/languages/vue.d.ts +13 -0
  148. package/dist/core/ingestion/languages/vue.js +81 -0
  149. package/dist/core/ingestion/markdown-processor.d.ts +1 -1
  150. package/dist/core/ingestion/method-extractors/configs/c-cpp.d.ts +3 -0
  151. package/dist/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  152. package/dist/core/ingestion/method-extractors/configs/csharp.js +5 -1
  153. package/dist/core/ingestion/method-extractors/configs/dart.d.ts +2 -0
  154. package/dist/core/ingestion/method-extractors/configs/dart.js +376 -0
  155. package/dist/core/ingestion/method-extractors/configs/go.d.ts +2 -0
  156. package/dist/core/ingestion/method-extractors/configs/go.js +176 -0
  157. package/dist/core/ingestion/method-extractors/configs/jvm.js +14 -4
  158. package/dist/core/ingestion/method-extractors/configs/php.d.ts +2 -0
  159. package/dist/core/ingestion/method-extractors/configs/php.js +304 -0
  160. package/dist/core/ingestion/method-extractors/configs/python.d.ts +2 -0
  161. package/dist/core/ingestion/method-extractors/configs/python.js +309 -0
  162. package/dist/core/ingestion/method-extractors/configs/ruby.d.ts +2 -0
  163. package/dist/core/ingestion/method-extractors/configs/ruby.js +286 -0
  164. package/dist/core/ingestion/method-extractors/configs/rust.d.ts +2 -0
  165. package/dist/core/ingestion/method-extractors/configs/rust.js +195 -0
  166. package/dist/core/ingestion/method-extractors/configs/swift.d.ts +2 -0
  167. package/dist/core/ingestion/method-extractors/configs/swift.js +277 -0
  168. package/dist/core/ingestion/method-extractors/configs/typescript-javascript.js +85 -8
  169. package/dist/core/ingestion/method-extractors/generic.d.ts +6 -0
  170. package/dist/core/ingestion/method-extractors/generic.js +84 -17
  171. package/dist/core/ingestion/method-types.d.ts +29 -0
  172. package/dist/core/ingestion/model/field-registry.d.ts +18 -0
  173. package/dist/core/ingestion/model/field-registry.js +22 -0
  174. package/dist/core/ingestion/model/heritage-map.d.ts +70 -0
  175. package/dist/core/ingestion/model/heritage-map.js +159 -0
  176. package/dist/core/ingestion/model/index.d.ts +20 -0
  177. package/dist/core/ingestion/model/index.js +41 -0
  178. package/dist/core/ingestion/model/method-registry.d.ts +62 -0
  179. package/dist/core/ingestion/model/method-registry.js +130 -0
  180. package/dist/core/ingestion/model/registration-table.d.ts +139 -0
  181. package/dist/core/ingestion/model/registration-table.js +224 -0
  182. package/dist/core/ingestion/model/resolution-context.d.ts +93 -0
  183. package/dist/core/ingestion/model/resolution-context.js +337 -0
  184. package/dist/core/ingestion/model/resolve.d.ts +56 -0
  185. package/dist/core/ingestion/model/resolve.js +297 -0
  186. package/dist/core/ingestion/model/semantic-model.d.ts +86 -0
  187. package/dist/core/ingestion/model/semantic-model.js +120 -0
  188. package/dist/core/ingestion/model/symbol-table.d.ts +222 -0
  189. package/dist/core/ingestion/model/symbol-table.js +206 -0
  190. package/dist/core/ingestion/model/type-registry.d.ts +39 -0
  191. package/dist/core/ingestion/model/type-registry.js +62 -0
  192. package/dist/core/ingestion/mro-processor.d.ts +5 -4
  193. package/dist/core/ingestion/mro-processor.js +311 -107
  194. package/dist/core/ingestion/parsing-processor.d.ts +5 -4
  195. package/dist/core/ingestion/parsing-processor.js +224 -87
  196. package/dist/core/ingestion/pipeline-phases/cobol.d.ts +16 -0
  197. package/dist/core/ingestion/pipeline-phases/cobol.js +45 -0
  198. package/dist/core/ingestion/pipeline-phases/communities.d.ts +16 -0
  199. package/dist/core/ingestion/pipeline-phases/communities.js +62 -0
  200. package/dist/core/ingestion/pipeline-phases/cross-file-impl.d.ts +17 -0
  201. package/dist/core/ingestion/pipeline-phases/cross-file-impl.js +156 -0
  202. package/dist/core/ingestion/pipeline-phases/cross-file.d.ts +37 -0
  203. package/dist/core/ingestion/pipeline-phases/cross-file.js +63 -0
  204. package/dist/core/ingestion/pipeline-phases/index.d.ts +21 -0
  205. package/dist/core/ingestion/pipeline-phases/index.js +22 -0
  206. package/dist/core/ingestion/pipeline-phases/markdown.d.ts +17 -0
  207. package/dist/core/ingestion/pipeline-phases/markdown.js +33 -0
  208. package/dist/core/ingestion/pipeline-phases/mro.d.ts +18 -0
  209. package/dist/core/ingestion/pipeline-phases/mro.js +36 -0
  210. package/dist/core/ingestion/pipeline-phases/orm-extraction.d.ts +22 -0
  211. package/dist/core/ingestion/pipeline-phases/orm-extraction.js +92 -0
  212. package/dist/core/ingestion/pipeline-phases/orm.d.ts +15 -0
  213. package/dist/core/ingestion/pipeline-phases/orm.js +74 -0
  214. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +47 -0
  215. package/dist/core/ingestion/pipeline-phases/parse-impl.js +437 -0
  216. package/dist/core/ingestion/pipeline-phases/parse.d.ts +49 -0
  217. package/dist/core/ingestion/pipeline-phases/parse.js +33 -0
  218. package/dist/core/ingestion/pipeline-phases/processes.d.ts +16 -0
  219. package/dist/core/ingestion/pipeline-phases/processes.js +143 -0
  220. package/dist/core/ingestion/pipeline-phases/routes.d.ts +21 -0
  221. package/dist/core/ingestion/pipeline-phases/routes.js +243 -0
  222. package/dist/core/ingestion/pipeline-phases/runner.d.ts +22 -0
  223. package/dist/core/ingestion/pipeline-phases/runner.js +203 -0
  224. package/dist/core/ingestion/pipeline-phases/scan.d.ts +21 -0
  225. package/dist/core/ingestion/pipeline-phases/scan.js +46 -0
  226. package/dist/core/ingestion/pipeline-phases/structure.d.ts +27 -0
  227. package/dist/core/ingestion/pipeline-phases/structure.js +35 -0
  228. package/dist/core/ingestion/pipeline-phases/tools.d.ts +20 -0
  229. package/dist/core/ingestion/pipeline-phases/tools.js +79 -0
  230. package/dist/core/ingestion/pipeline-phases/types.d.ts +79 -0
  231. package/dist/core/ingestion/pipeline-phases/types.js +37 -0
  232. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.d.ts +35 -0
  233. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.js +174 -0
  234. package/dist/core/ingestion/pipeline.d.ts +18 -10
  235. package/dist/core/ingestion/pipeline.js +66 -1410
  236. package/dist/core/ingestion/process-processor.js +1 -1
  237. package/dist/core/ingestion/tree-sitter-queries.d.ts +5 -5
  238. package/dist/core/ingestion/tree-sitter-queries.js +90 -0
  239. package/dist/core/ingestion/type-env.d.ts +15 -2
  240. package/dist/core/ingestion/type-env.js +163 -102
  241. package/dist/core/ingestion/type-extractors/csharp.js +17 -0
  242. package/dist/core/ingestion/type-extractors/jvm.js +11 -0
  243. package/dist/core/ingestion/type-extractors/php.js +0 -55
  244. package/dist/core/ingestion/type-extractors/ruby.js +0 -32
  245. package/dist/core/ingestion/type-extractors/swift.js +13 -0
  246. package/dist/core/ingestion/type-extractors/types.d.ts +8 -8
  247. package/dist/core/ingestion/type-extractors/typescript.js +66 -69
  248. package/dist/core/ingestion/utils/ast-helpers.d.ts +32 -44
  249. package/dist/core/ingestion/utils/ast-helpers.js +157 -573
  250. package/dist/core/ingestion/utils/env.d.ts +10 -0
  251. package/dist/core/ingestion/utils/env.js +10 -0
  252. package/dist/core/ingestion/utils/graph-sort.d.ts +58 -0
  253. package/dist/core/ingestion/utils/graph-sort.js +100 -0
  254. package/dist/core/ingestion/utils/method-props.d.ts +32 -0
  255. package/dist/core/ingestion/utils/method-props.js +147 -0
  256. package/dist/core/ingestion/vue-sfc-extractor.d.ts +44 -0
  257. package/dist/core/ingestion/vue-sfc-extractor.js +94 -0
  258. package/dist/core/ingestion/workers/parse-worker.d.ts +31 -19
  259. package/dist/core/ingestion/workers/parse-worker.js +469 -200
  260. package/dist/core/lbug/lbug-adapter.d.ts +6 -0
  261. package/dist/core/lbug/lbug-adapter.js +134 -27
  262. package/dist/core/lbug/pool-adapter.d.ts +76 -0
  263. package/dist/core/lbug/pool-adapter.js +522 -0
  264. package/dist/core/run-analyze.d.ts +2 -0
  265. package/dist/core/run-analyze.js +1 -1
  266. package/dist/core/search/bm25-index.js +1 -1
  267. package/dist/core/tree-sitter/parser-loader.js +1 -0
  268. package/dist/core/wiki/graph-queries.js +1 -1
  269. package/dist/mcp/core/embedder.js +6 -5
  270. package/dist/mcp/core/lbug-adapter.d.ts +3 -63
  271. package/dist/mcp/core/lbug-adapter.js +3 -484
  272. package/dist/mcp/local/local-backend.d.ts +31 -2
  273. package/dist/mcp/local/local-backend.js +255 -46
  274. package/dist/mcp/resources.js +5 -4
  275. package/dist/mcp/staleness.d.ts +3 -13
  276. package/dist/mcp/staleness.js +2 -31
  277. package/dist/mcp/tools.js +80 -4
  278. package/dist/server/analyze-job.d.ts +2 -0
  279. package/dist/server/analyze-job.js +4 -0
  280. package/dist/server/api.d.ts +20 -1
  281. package/dist/server/api.js +306 -71
  282. package/dist/server/git-clone.d.ts +2 -1
  283. package/dist/server/git-clone.js +98 -5
  284. package/dist/storage/git.d.ts +13 -0
  285. package/dist/storage/git.js +25 -0
  286. package/dist/storage/repo-manager.js +1 -1
  287. package/package.json +9 -3
  288. package/scripts/patch-tree-sitter-swift.cjs +78 -0
  289. package/vendor/tree-sitter-proto/binding.gyp +30 -0
  290. package/vendor/tree-sitter-proto/bindings/node/binding.cc +20 -0
  291. package/vendor/tree-sitter-proto/bindings/node/index.d.ts +28 -0
  292. package/vendor/tree-sitter-proto/bindings/node/index.js +7 -0
  293. package/vendor/tree-sitter-proto/package.json +18 -0
  294. package/vendor/tree-sitter-proto/src/node-types.json +1145 -0
  295. package/vendor/tree-sitter-proto/src/parser.c +10149 -0
  296. package/vendor/tree-sitter-proto/src/tree_sitter/alloc.h +54 -0
  297. package/vendor/tree-sitter-proto/src/tree_sitter/array.h +291 -0
  298. package/vendor/tree-sitter-proto/src/tree_sitter/parser.h +266 -0
  299. package/dist/core/ingestion/named-binding-processor.d.ts +0 -18
  300. package/dist/core/ingestion/named-binding-processor.js +0 -42
  301. package/dist/core/ingestion/resolution-context.d.ts +0 -58
  302. package/dist/core/ingestion/resolution-context.js +0 -135
  303. package/dist/core/ingestion/symbol-table.d.ts +0 -79
  304. package/dist/core/ingestion/symbol-table.js +0 -115
@@ -0,0 +1,2 @@
1
+ import type { ClassExtractionConfig, ClassExtractor } from '../class-types.js';
2
+ export declare function createClassExtractor(config: ClassExtractionConfig): ClassExtractor;
@@ -0,0 +1,135 @@
1
+ const DEFAULT_SCOPE_NAME_NODE_TYPES = new Set([
2
+ 'nested_namespace_specifier',
3
+ 'scoped_identifier',
4
+ 'scoped_type_identifier',
5
+ 'qualified_name',
6
+ 'namespace_name',
7
+ 'namespace_identifier',
8
+ 'package_identifier',
9
+ 'type_identifier',
10
+ 'identifier',
11
+ 'name',
12
+ 'constant',
13
+ ]);
14
+ const DEFAULT_TYPE_NAME_NODE_TYPES = new Set([
15
+ 'type_identifier',
16
+ 'identifier',
17
+ 'simple_identifier',
18
+ 'namespace_identifier',
19
+ 'constant',
20
+ 'name',
21
+ ]);
22
+ const DEFAULT_LABEL_BY_NODE_TYPE = {
23
+ class_declaration: 'Class',
24
+ abstract_class_declaration: 'Class',
25
+ interface_declaration: 'Interface',
26
+ struct_declaration: 'Struct',
27
+ record_declaration: 'Record',
28
+ enum_declaration: 'Enum',
29
+ class_definition: 'Class',
30
+ struct_specifier: 'Struct',
31
+ class_specifier: 'Class',
32
+ enum_specifier: 'Enum',
33
+ struct_item: 'Struct',
34
+ enum_item: 'Enum',
35
+ class: 'Class',
36
+ object_declaration: 'Class',
37
+ companion_object: 'Class',
38
+ protocol_declaration: 'Interface',
39
+ extension_declaration: 'Class',
40
+ };
41
+ const CLASS_LIKE_LABELS = new Set([
42
+ 'Class',
43
+ 'Struct',
44
+ 'Interface',
45
+ 'Enum',
46
+ 'Record',
47
+ ]);
48
+ const normalizeQualifiedName = (value) => value
49
+ .replace(/\s+/g, '')
50
+ .replace(/^::/, '')
51
+ .replace(/::/g, '.')
52
+ .replace(/\\/g, '.')
53
+ .replace(/\.+/g, '.')
54
+ .replace(/^\.+|\.+$/g, '');
55
+ const splitQualifiedName = (value) => {
56
+ const normalized = normalizeQualifiedName(value);
57
+ return normalized ? normalized.split('.').filter(Boolean) : [];
58
+ };
59
+ const extractScopeSegmentsFromNode = (scopeNode, scopeNameNodeTypes) => {
60
+ const nameNode = scopeNode.childForFieldName?.('name') ??
61
+ scopeNode.namedChildren?.find((child) => scopeNameNodeTypes.has(child.type));
62
+ return nameNode ? splitQualifiedName(nameNode.text) : [];
63
+ };
64
+ const extractTypeNameFromNode = (node) => {
65
+ const nameField = node.childForFieldName?.('name');
66
+ if (nameField)
67
+ return nameField.text;
68
+ const nameChild = node.namedChildren?.find((child) => DEFAULT_TYPE_NAME_NODE_TYPES.has(child.type));
69
+ return nameChild?.text;
70
+ };
71
+ const isClassLikeLabel = (label) => label !== undefined && label !== null && CLASS_LIKE_LABELS.has(label);
72
+ export function createClassExtractor(config) {
73
+ const typeDeclarationSet = new Set(config.typeDeclarationNodes);
74
+ const fileScopeSet = new Set(config.fileScopeNodeTypes ?? []);
75
+ const ancestorScopeSet = new Set(config.ancestorScopeNodeTypes ?? []);
76
+ const scopeNameNodeTypes = new Set([
77
+ ...DEFAULT_SCOPE_NAME_NODE_TYPES,
78
+ ...(config.scopeNameNodeTypes ?? []),
79
+ ]);
80
+ const buildQualifiedName = (node, simpleName) => {
81
+ let root = node;
82
+ while (root.parent)
83
+ root = root.parent;
84
+ const readScopeSegments = (scopeNode) => config.extractScopeSegments?.(scopeNode) ??
85
+ extractScopeSegmentsFromNode(scopeNode, scopeNameNodeTypes);
86
+ const fileScopeSegments = [];
87
+ for (const child of root.namedChildren ?? []) {
88
+ if (fileScopeSet.has(child.type)) {
89
+ fileScopeSegments.push(...readScopeSegments(child));
90
+ }
91
+ }
92
+ const ancestorScopes = [];
93
+ let current = node.parent;
94
+ while (current) {
95
+ if (ancestorScopeSet.has(current.type)) {
96
+ const segments = readScopeSegments(current);
97
+ if (segments.length > 0)
98
+ ancestorScopes.push(segments);
99
+ }
100
+ current = current.parent;
101
+ }
102
+ return [
103
+ ...fileScopeSegments,
104
+ ...ancestorScopes.reverse().flat(),
105
+ ...splitQualifiedName(simpleName),
106
+ ]
107
+ .filter(Boolean)
108
+ .join('.');
109
+ };
110
+ const extract = (node, fallback) => {
111
+ if (!typeDeclarationSet.has(node.type))
112
+ return null;
113
+ const name = config.extractName?.(node) ?? extractTypeNameFromNode(node) ?? fallback?.name;
114
+ const type = config.extractType?.(node) ??
115
+ DEFAULT_LABEL_BY_NODE_TYPE[node.type] ??
116
+ (isClassLikeLabel(fallback?.type) ? fallback.type : undefined);
117
+ if (!name || !type)
118
+ return null;
119
+ return {
120
+ name,
121
+ type,
122
+ qualifiedName: buildQualifiedName(node, name) || name,
123
+ };
124
+ };
125
+ return {
126
+ language: config.language,
127
+ isTypeDeclaration(node) {
128
+ return typeDeclarationSet.has(node.type);
129
+ },
130
+ extract,
131
+ extractQualifiedName(node, simpleName) {
132
+ return extract(node, { name: simpleName })?.qualifiedName ?? null;
133
+ },
134
+ };
135
+ }
@@ -0,0 +1,34 @@
1
+ import type { NodeLabel, SupportedLanguages } from '../../_shared/index.js';
2
+ import type { SyntaxNode } from './utils/ast-helpers.js';
3
+ export type ClassLikeNodeLabel = Extract<NodeLabel, 'Class' | 'Struct' | 'Interface' | 'Enum' | 'Record'>;
4
+ export interface ExtractedClassSymbol {
5
+ name: string;
6
+ type: ClassLikeNodeLabel;
7
+ qualifiedName: string;
8
+ }
9
+ /**
10
+ * Cross-language qualified type names are normalized to dot-separated scope
11
+ * segments:
12
+ * - file/package scope contributes leading segments when the language has one
13
+ * - lexical namespace/module/type scope contributes enclosing segments
14
+ * - the simple type name is always the trailing segment
15
+ */
16
+ export interface ClassExtractor {
17
+ language: SupportedLanguages;
18
+ isTypeDeclaration(node: SyntaxNode): boolean;
19
+ extract(node: SyntaxNode, fallback?: {
20
+ name?: string;
21
+ type?: NodeLabel | null;
22
+ }): ExtractedClassSymbol | null;
23
+ extractQualifiedName(node: SyntaxNode, simpleName: string): string | null;
24
+ }
25
+ export interface ClassExtractionConfig {
26
+ language: SupportedLanguages;
27
+ typeDeclarationNodes: string[];
28
+ fileScopeNodeTypes?: string[];
29
+ ancestorScopeNodeTypes?: string[];
30
+ scopeNameNodeTypes?: string[];
31
+ extractName?: (node: SyntaxNode) => string | undefined;
32
+ extractType?: (node: SyntaxNode) => ClassLikeNodeLabel | undefined;
33
+ extractScopeSegments?: (node: SyntaxNode) => string[] | null | undefined;
34
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -50,5 +50,5 @@ export declare function isJclFile(filePath: string): boolean;
50
50
  * @param allPathSet - Set of all file paths in the repository
51
51
  * @returns Summary of what was extracted
52
52
  */
53
- export declare const processCobol: (graph: KnowledgeGraph, files: CobolFile[], allPathSet: Set<string>) => CobolProcessResult;
53
+ export declare const processCobol: (graph: KnowledgeGraph, files: CobolFile[], allPathSet: ReadonlySet<string>) => CobolProcessResult;
54
54
  export {};
@@ -25,6 +25,7 @@ export declare const ENTRY_POINT_PATTERNS: {
25
25
  php: RegExp[];
26
26
  ruby: RegExp[];
27
27
  dart: RegExp[];
28
+ vue: any[];
28
29
  cobol: any[];
29
30
  };
30
31
  export interface EntryPointScoreResult {
@@ -210,6 +210,7 @@ export const ENTRY_POINT_PATTERNS = {
210
210
  /^onEvent$/, // BLoC event handler
211
211
  /^mapEventToState$/, // Legacy BLoC pattern
212
212
  ],
213
+ [SupportedLanguages.Vue]: [], // Vue uses TypeScript queries — entry points handled via TS patterns
213
214
  [SupportedLanguages.Cobol]: [], // Standalone regex processor — no tree-sitter entry points
214
215
  };
215
216
  /** Pre-computed merged patterns (universal + language-specific) to avoid per-call array allocation. */
@@ -1,5 +1,5 @@
1
1
  import type { TypeEnvironment } from './type-env.js';
2
- import type { SymbolTable } from './symbol-table.js';
2
+ import type { SymbolTableReader } from './model/symbol-table.js';
3
3
  import { SupportedLanguages } from '../../_shared/index.js';
4
4
  /**
5
5
  * Visibility levels used across all supported languages.
@@ -42,7 +42,7 @@ export interface FieldExtractorContext {
42
42
  /** Type environment for resolution */
43
43
  typeEnv: TypeEnvironment;
44
44
  /** Symbol table for FQN lookups */
45
- symbolTable: SymbolTable;
45
+ symbolTable: SymbolTableReader;
46
46
  /** Current file path */
47
47
  filePath: string;
48
48
  /** Language ID */
@@ -1,3 +1,4 @@
1
+ import { isVerboseIngestionEnabled } from './utils/verbose.js';
1
2
  import fs from 'fs/promises';
2
3
  import path from 'path';
3
4
  import { glob } from 'glob';
@@ -20,6 +21,7 @@ export const walkRepositoryPaths = async (repoPath, onProgress) => {
20
21
  const entries = [];
21
22
  let processed = 0;
22
23
  let skippedLarge = 0;
24
+ const skippedLargePaths = [];
23
25
  for (let start = 0; start < filtered.length; start += READ_CONCURRENCY) {
24
26
  const batch = filtered.slice(start, start + READ_CONCURRENCY);
25
27
  const results = await Promise.allSettled(batch.map(async (relativePath) => {
@@ -27,6 +29,7 @@ export const walkRepositoryPaths = async (repoPath, onProgress) => {
27
29
  const stat = await fs.stat(fullPath);
28
30
  if (stat.size > MAX_FILE_SIZE) {
29
31
  skippedLarge++;
32
+ skippedLargePaths.push(relativePath.replace(/\\/g, '/'));
30
33
  return null;
31
34
  }
32
35
  return { path: relativePath.replace(/\\/g, '/'), size: stat.size };
@@ -44,6 +47,11 @@ export const walkRepositoryPaths = async (repoPath, onProgress) => {
44
47
  }
45
48
  if (skippedLarge > 0) {
46
49
  console.warn(` Skipped ${skippedLarge} large files (>${MAX_FILE_SIZE / 1024}KB, likely generated/vendored)`);
50
+ if (isVerboseIngestionEnabled()) {
51
+ for (const p of skippedLargePaths) {
52
+ console.warn(` - ${p}`);
53
+ }
54
+ }
47
55
  }
48
56
  return entries;
49
57
  };
@@ -139,6 +139,7 @@ export declare const AST_FRAMEWORK_PATTERNS_BY_LANGUAGE: {
139
139
  reason: string;
140
140
  patterns: string[];
141
141
  }[];
142
+ vue: any[];
142
143
  cobol: any[];
143
144
  };
144
145
  /**
@@ -747,6 +747,7 @@ export const AST_FRAMEWORK_PATTERNS_BY_LANGUAGE = {
747
747
  patterns: FRAMEWORK_AST_PATTERNS.riverpod,
748
748
  },
749
749
  ],
750
+ [SupportedLanguages.Vue]: [], // Vue uses TypeScript AST framework detection
750
751
  [SupportedLanguages.Cobol]: [], // Standalone regex processor — no AST framework patterns
751
752
  };
752
753
  /** Pre-lowercased patterns for O(1) pattern matching at runtime */
@@ -15,22 +15,15 @@
15
15
  */
16
16
  import { KnowledgeGraph } from '../graph/types.js';
17
17
  import { ASTCache } from './ast-cache.js';
18
- import { SupportedLanguages } from '../../_shared/index.js';
19
- import type { ExtractedHeritage } from './workers/parse-worker.js';
20
- import type { ResolutionContext } from './resolution-context.js';
18
+ import type { ExtractedHeritage, HeritageStrategyLookup } from './model/heritage-map.js';
19
+ import type { ResolutionContext } from './model/resolution-context.js';
21
20
  /**
22
- * Determine whether a heritage.extends capture is actually an IMPLEMENTS relationship.
23
- * Uses the symbol table first (authoritative Tier 1); falls back to provider-defined
24
- * heuristics for external symbols not present in the graph:
25
- * - interfaceNamePattern: matched against parent name (e.g., /^I[A-Z]/ for C#/Java)
26
- * - heritageDefaultEdge: 'IMPLEMENTS' causes all unresolved parents to map to IMPLEMENTS
27
- * - All others: default EXTENDS
21
+ * Derive the heritage-resolution strategy for a language from its
22
+ * `LanguageProvider`. This is the production wiring that `buildHeritageMap`
23
+ * and the standalone `resolveExtendsType` call site use the model layer
24
+ * itself stays unaware of the provider registry.
28
25
  */
29
- /** Exported for implementor-map construction (C#/Java: `extends` rows in base_list may be interfaces). */
30
- export declare const resolveExtendsType: (parentName: string, currentFilePath: string, ctx: ResolutionContext, language: SupportedLanguages) => {
31
- type: "EXTENDS" | "IMPLEMENTS";
32
- idPrefix: string;
33
- };
26
+ export declare const getHeritageStrategyForLanguage: HeritageStrategyLookup;
34
27
  export declare const processHeritage: (graph: KnowledgeGraph, files: {
35
28
  path: string;
36
29
  content: string;
@@ -43,7 +36,7 @@ export declare const processHeritageFromExtracted: (graph: KnowledgeGraph, extra
43
36
  /**
44
37
  * Walk source files with the same heritage captures as parse-worker, producing
45
38
  * {@link ExtractedHeritage} rows without mutating the graph. Used on the
46
- * sequential pipeline path so `buildImplementorMap(..., ctx)` can run before
39
+ * sequential pipeline path so `buildHeritageMap(..., ctx)` can run before
47
40
  * `processCalls` (worker path defers calls until heritage from all chunks exists).
48
41
  */
49
42
  export declare function extractExtractedHeritageFromFiles(files: {
@@ -21,33 +21,20 @@ import { isVerboseIngestionEnabled } from './utils/verbose.js';
21
21
  import { yieldToEventLoop } from './utils/event-loop.js';
22
22
  import { getProvider } from './languages/index.js';
23
23
  import { getTreeSitterBufferSize } from './constants.js';
24
- import { TIER_CONFIDENCE } from './resolution-context.js';
24
+ import { resolveExtendsType } from './model/heritage-map.js';
25
+ import { TIER_CONFIDENCE } from './model/resolution-context.js';
25
26
  /**
26
- * Determine whether a heritage.extends capture is actually an IMPLEMENTS relationship.
27
- * Uses the symbol table first (authoritative Tier 1); falls back to provider-defined
28
- * heuristics for external symbols not present in the graph:
29
- * - interfaceNamePattern: matched against parent name (e.g., /^I[A-Z]/ for C#/Java)
30
- * - heritageDefaultEdge: 'IMPLEMENTS' causes all unresolved parents to map to IMPLEMENTS
31
- * - All others: default EXTENDS
27
+ * Derive the heritage-resolution strategy for a language from its
28
+ * `LanguageProvider`. This is the production wiring that `buildHeritageMap`
29
+ * and the standalone `resolveExtendsType` call site use the model layer
30
+ * itself stays unaware of the provider registry.
32
31
  */
33
- /** Exported for implementor-map construction (C#/Java: `extends` rows in base_list may be interfaces). */
34
- export const resolveExtendsType = (parentName, currentFilePath, ctx, language) => {
35
- const resolved = ctx.resolve(parentName, currentFilePath);
36
- if (resolved && resolved.candidates.length > 0) {
37
- const isInterface = resolved.candidates[0].type === 'Interface';
38
- return isInterface
39
- ? { type: 'IMPLEMENTS', idPrefix: 'Interface' }
40
- : { type: 'EXTENDS', idPrefix: 'Class' };
41
- }
42
- // Unresolved symbol — fall back to provider-defined heuristics
43
- const provider = getProvider(language);
44
- if (provider.interfaceNamePattern?.test(parentName)) {
45
- return { type: 'IMPLEMENTS', idPrefix: 'Interface' };
46
- }
47
- if (provider.heritageDefaultEdge === 'IMPLEMENTS') {
48
- return { type: 'IMPLEMENTS', idPrefix: 'Interface' };
49
- }
50
- return { type: 'EXTENDS', idPrefix: 'Class' };
32
+ export const getHeritageStrategyForLanguage = (lang) => {
33
+ const provider = getProvider(lang);
34
+ return {
35
+ interfaceNamePattern: provider.interfaceNamePattern,
36
+ defaultEdge: provider.heritageDefaultEdge ?? 'EXTENDS',
37
+ };
51
38
  };
52
39
  const resolveHeritageId = (name, filePath, ctx, fallbackLabel, fallbackKey) => {
53
40
  const resolved = ctx.resolve(name, filePath);
@@ -136,7 +123,7 @@ export const processHeritage = async (graph, files, astCache, ctx, onProgress) =
136
123
  }
137
124
  const className = captureMap['heritage.class'].text;
138
125
  const parentClassName = captureMap['heritage.extends'].text;
139
- const { type: relType, idPrefix } = resolveExtendsType(parentClassName, file.path, ctx, language);
126
+ const { type: relType, idPrefix } = resolveExtendsType(parentClassName, file.path, ctx, getHeritageStrategyForLanguage(language));
140
127
  const child = resolveHeritageId(className, file.path, ctx, 'Class', `${file.path}:${className}`);
141
128
  const parent = resolveHeritageId(parentClassName, file.path, ctx, idPrefix);
142
129
  if (child.id && parent.id && child.id !== parent.id) {
@@ -209,7 +196,7 @@ export const processHeritageFromExtracted = async (graph, extractedHeritage, ctx
209
196
  const fileLanguage = getLanguageFromFilename(h.filePath);
210
197
  if (!fileLanguage)
211
198
  continue;
212
- const { type: relType, idPrefix } = resolveExtendsType(h.parentName, h.filePath, ctx, fileLanguage);
199
+ const { type: relType, idPrefix } = resolveExtendsType(h.parentName, h.filePath, ctx, getHeritageStrategyForLanguage(fileLanguage));
213
200
  const child = resolveHeritageId(h.className, h.filePath, ctx, 'Class', `${h.filePath}:${h.className}`);
214
201
  const parent = resolveHeritageId(h.parentName, h.filePath, ctx, idPrefix);
215
202
  if (child.id && parent.id && child.id !== parent.id) {
@@ -260,7 +247,7 @@ export const processHeritageFromExtracted = async (graph, extractedHeritage, ctx
260
247
  /**
261
248
  * Walk source files with the same heritage captures as parse-worker, producing
262
249
  * {@link ExtractedHeritage} rows without mutating the graph. Used on the
263
- * sequential pipeline path so `buildImplementorMap(..., ctx)` can run before
250
+ * sequential pipeline path so `buildHeritageMap(..., ctx)` can run before
264
251
  * `processCalls` (worker path defers calls until heritage from all chunks exists).
265
252
  */
266
253
  export async function extractExtractedHeritageFromFiles(files, astCache) {
@@ -2,21 +2,11 @@ import { KnowledgeGraph } from '../graph/types.js';
2
2
  import { ASTCache } from './ast-cache.js';
3
3
  import type { LanguageProvider } from './language-provider.js';
4
4
  import type { ExtractedImport } from './workers/parse-worker.js';
5
- import type { ResolutionContext } from './resolution-context.js';
5
+ import type { ResolutionContext } from './model/resolution-context.js';
6
6
  import type { ImportResolutionContext } from './import-resolvers/types.js';
7
7
  import type { SyntaxNode } from './utils/ast-helpers.js';
8
8
  export type ImportMap = Map<string, Set<string>>;
9
9
  export type PackageMap = Map<string, Set<string>>;
10
- export interface NamedImportBinding {
11
- sourcePath: string;
12
- exportedName: string;
13
- }
14
- export type NamedImportMap = Map<string, Map<string, NamedImportBinding>>;
15
- /**
16
- * Check if a file path is directly inside a package directory identified by its suffix.
17
- * Used by the symbol resolver for Go and C# directory-level import matching.
18
- */
19
- export declare function isFileInPackageDir(filePath: string, dirSuffix: string): boolean;
20
10
  export declare function buildImportResolutionContext(allPaths: string[]): ImportResolutionContext;
21
11
  /**
22
12
  * Clean and preprocess a raw import source text into a resolved import path.
@@ -8,7 +8,7 @@ import { yieldToEventLoop } from './utils/event-loop.js';
8
8
  import { getTreeSitterBufferSize } from './constants.js';
9
9
  import { loadImportConfigs } from './language-config.js';
10
10
  import { buildSuffixIndex } from './import-resolvers/utils.js';
11
- const isDev = process.env.NODE_ENV === 'development';
11
+ import { isDev } from './utils/env.js';
12
12
  /** Group files by provider (only those with implicit import wiring), then call each wirer
13
13
  * with its own language's files. O(n) over files, O(1) per provider lookup. */
14
14
  function wireImplicitImports(files, importMap, addImportEdge, projectConfig) {
@@ -32,18 +32,6 @@ function wireImplicitImports(files, importMap, addImportEdge, projectConfig) {
32
32
  }
33
33
  }
34
34
  }
35
- /**
36
- * Check if a file path is directly inside a package directory identified by its suffix.
37
- * Used by the symbol resolver for Go and C# directory-level import matching.
38
- */
39
- export function isFileInPackageDir(filePath, dirSuffix) {
40
- // Prepend '/' so paths like "internal/auth/service.go" match suffix "/internal/auth/"
41
- const normalized = '/' + filePath.replace(/\\/g, '/');
42
- if (!normalized.includes(dirSuffix))
43
- return false;
44
- const afterDir = normalized.substring(normalized.indexOf(dirSuffix) + dirSuffix.length);
45
- return !afterDir.includes('/');
46
- }
47
35
  // ImportResolutionContext is defined in ./import-resolvers/types.ts — re-exported here for consumers.
48
36
  export function buildImportResolutionContext(allPaths) {
49
37
  const allFileList = allPaths;
@@ -10,6 +10,7 @@ export const EXTENSIONS = [
10
10
  '.ts',
11
11
  '.jsx',
12
12
  '.js',
13
+ '.vue',
13
14
  '/index.tsx',
14
15
  '/index.ts',
15
16
  '/index.jsx',
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vue import resolver — delegates to TypeScript's standard resolver.
3
+ *
4
+ * Vue <script> blocks use the same import syntax as TypeScript (including
5
+ * tsconfig path aliases like `@/`), so no custom resolution logic is needed.
6
+ */
7
+ import type { ImportResolverFn } from './types.js';
8
+ export declare const resolveVueImport: ImportResolverFn;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Vue import resolver — delegates to TypeScript's standard resolver.
3
+ *
4
+ * Vue <script> blocks use the same import syntax as TypeScript (including
5
+ * tsconfig path aliases like `@/`), so no custom resolution logic is needed.
6
+ */
7
+ import { SupportedLanguages } from '../../../_shared/index.js';
8
+ import { resolveStandard } from './standard.js';
9
+ export const resolveVueImport = (raw, fp, ctx) => resolveStandard(raw, fp, ctx, SupportedLanguages.TypeScript);
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs/promises';
2
2
  import path from 'path';
3
- const isDev = process.env.NODE_ENV === 'development';
3
+ import { isDev } from './utils/env.js';
4
4
  // ============================================================================
5
5
  // LANGUAGE-SPECIFIC CONFIG LOADERS
6
6
  // ============================================================================
@@ -8,9 +8,10 @@
8
8
  * The providers table in `languages/index.ts` uses `satisfies Record<SupportedLanguages, LanguageProvider>`
9
9
  * so adding a language to the enum without creating a provider is a compiler error.
10
10
  */
11
- import type { SupportedLanguages } from '../../_shared/index.js';
11
+ import type { SupportedLanguages, MroStrategy } from '../../_shared/index.js';
12
12
  import type { LanguageTypeConfig } from './type-extractors/types.js';
13
13
  import type { CallRouter } from './call-routing.js';
14
+ import type { ClassExtractor } from './class-types.js';
14
15
  import type { ExportChecker } from './export-detection.js';
15
16
  import type { FieldExtractor } from './field-extractor.js';
16
17
  import type { MethodExtractor } from './method-types.js';
@@ -20,8 +21,6 @@ import type { SyntaxNode } from './utils/ast-helpers.js';
20
21
  import type { NodeLabel } from '../../_shared/index.js';
21
22
  /** Tree-sitter query captures: capture name → AST node (or undefined if not captured). */
22
23
  export type CaptureMap = Record<string, SyntaxNode | undefined>;
23
- /** MRO strategy for multiple inheritance resolution. */
24
- export type MroStrategy = 'first-wins' | 'c3' | 'leftmost-base' | 'implements-split' | 'qualified-syntax';
25
24
  /** How a language handles imports — determines wildcard synthesis behavior. */
26
25
  export type ImportSemantics = 'named' | 'wildcard' | 'namespace';
27
26
  /**
@@ -67,6 +66,14 @@ interface LanguageProviderConfig {
67
66
  * Called with only THIS language's files (pre-grouped by the processor).
68
67
  * Default: undefined (no implicit imports). */
69
68
  readonly implicitImportWirer?: (languageFiles: string[], importMap: ReadonlyMap<string, ReadonlySet<string>>, addImportEdge: (src: string, target: string) => void, projectConfig: unknown) => void;
69
+ /** Resolve a container node during enclosing-owner tree walks.
70
+ * Called when a CLASS_CONTAINER_TYPES node is found while walking up.
71
+ * - Return a different SyntaxNode to remap the container (e.g., Ruby
72
+ * singleton_class → enclosing class/module).
73
+ * - Return null to skip this container and keep walking up.
74
+ * - Omit (undefined) to use the container node as-is (default).
75
+ * Default: undefined (no remapping). */
76
+ readonly resolveEnclosingOwner?: (node: SyntaxNode) => SyntaxNode | null;
70
77
  /** Resolve the enclosing function name + label from an AST ancestor node
71
78
  * that is NOT a standard FUNCTION_NODE_TYPE. For languages where the
72
79
  * function body is a sibling of the signature (e.g. Dart: function_body ↔
@@ -101,6 +108,10 @@ interface LanguageProviderConfig {
101
108
  * declarations. Produces MethodInfo[] with name, parameters, visibility, isAbstract,
102
109
  * isFinal, annotations metadata. Default: undefined (no method extraction). */
103
110
  readonly methodExtractor?: MethodExtractor;
111
+ /** Class/type extractor for deriving canonical qualified names for class-like symbols.
112
+ * Uses the same provider-driven strategy pattern as method/field extraction so
113
+ * namespace/package/module rules stay language-specific. */
114
+ readonly classExtractor?: ClassExtractor;
104
115
  /** Extract a semantic description for a definition node (e.g., PHP Eloquent
105
116
  * property arrays, relation method descriptions).
106
117
  * Default: undefined (no description extraction). */