gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -0,0 +1,319 @@
1
+ // gitnexus/src/core/ingestion/call-extractors/zig-static-gating.ts
2
+ /** Maximum recursion depth when evaluating a boolean condition expression. */
3
+ const MAX_COND_DEPTH = 4;
4
+ // ---------------------------------------------------------------------------
5
+ // Phase 2: per-file extraction
6
+ // ---------------------------------------------------------------------------
7
+ /** Cap on alias-chain hops walked when resolving `const A = B; const B = C; ...`. */
8
+ const MAX_ALIAS_HOPS = 5;
9
+ /**
10
+ * Walk the top-level of a Zig source file and collect known-bool
11
+ * constants. Two passes:
12
+ *
13
+ * Pass 1: collect every top-level `const X = <expr>` where the RHS
14
+ * is either a `boolean` literal (recorded in `literals`) or
15
+ * a single `identifier` (recorded in `aliases`).
16
+ * Pass 2: walk each alias entry up to `MAX_ALIAS_HOPS` hops; if the
17
+ * chain terminates at a known-bool literal, record `X` with
18
+ * the literal's value. Cycles, chains exceeding the cap, and
19
+ * chains exiting file scope (unknown identifier at the root)
20
+ * bail to "unknown".
21
+ *
22
+ * Only `const` decls qualify (not `var`). The function is permissive
23
+ * about modifier tokens (`pub`, type annotation) — it reads only the
24
+ * identifier name and the RHS expression shape.
25
+ */
26
+ export function buildZigBoolConstMap(rootNode) {
27
+ const literals = new Map();
28
+ const aliases = new Map();
29
+ for (const child of rootNode.namedChildren) {
30
+ if (child.type !== 'variable_declaration')
31
+ continue;
32
+ const entry = extractBoolConstOrAlias(child);
33
+ if (!entry)
34
+ continue;
35
+ if (entry.kind === 'literal') {
36
+ literals.set(entry.name, entry.value);
37
+ }
38
+ else {
39
+ aliases.set(entry.name, entry.aliasOf);
40
+ }
41
+ }
42
+ // Pass 2: resolve alias chains.
43
+ for (const [name, target] of aliases) {
44
+ const resolved = resolveAliasChain(name, target, literals, aliases);
45
+ if (resolved !== undefined) {
46
+ literals.set(name, resolved);
47
+ }
48
+ }
49
+ return literals;
50
+ }
51
+ function resolveAliasChain(start, firstTarget, literals, aliases) {
52
+ // Walk: start → firstTarget → aliases.get(firstTarget) → ... up to MAX_ALIAS_HOPS.
53
+ // Cycle protection via a visited set seeded with `start` itself.
54
+ const visited = new Set();
55
+ visited.add(start);
56
+ let current = firstTarget;
57
+ for (let hop = 0; hop < MAX_ALIAS_HOPS; hop++) {
58
+ if (visited.has(current))
59
+ return undefined; // cycle
60
+ visited.add(current);
61
+ const lit = literals.get(current);
62
+ if (lit !== undefined)
63
+ return lit;
64
+ const next = aliases.get(current);
65
+ if (next === undefined)
66
+ return undefined; // chain exits file scope or hits unknown
67
+ current = next;
68
+ }
69
+ return undefined; // hop cap exceeded
70
+ }
71
+ function extractBoolConstOrAlias(decl) {
72
+ // Require `const` and exclude `var`. tree-sitter-zig parses both with
73
+ // the same `variable_declaration` shape; the qualifier is an anonymous
74
+ // child token. A `pub var FOO = false;` is mutable global state — its
75
+ // initial value is NOT a comptime constant and must not feed gating.
76
+ let isConst = false;
77
+ let isVar = false;
78
+ for (let i = 0; i < decl.childCount; i++) {
79
+ const c = decl.child(i);
80
+ if (!c || c.isNamed)
81
+ continue;
82
+ if (c.type === 'const')
83
+ isConst = true;
84
+ else if (c.type === 'var')
85
+ isVar = true;
86
+ }
87
+ if (!isConst || isVar)
88
+ return null;
89
+ let name;
90
+ let value;
91
+ let aliasOf;
92
+ for (const c of decl.namedChildren) {
93
+ if (c.type === 'identifier' && name === undefined) {
94
+ name = c.text;
95
+ continue;
96
+ }
97
+ if (c.type === 'boolean') {
98
+ const t = c.text;
99
+ if (t === 'true')
100
+ value = true;
101
+ else if (t === 'false')
102
+ value = false;
103
+ }
104
+ else if (c.type === 'identifier' && name !== undefined && aliasOf === undefined) {
105
+ // Second `identifier` child is the RHS alias target:
106
+ // `const B = A;` → name='B', aliasOf='A'.
107
+ aliasOf = c.text;
108
+ }
109
+ }
110
+ if (name === undefined)
111
+ return null;
112
+ if (value !== undefined)
113
+ return { kind: 'literal', name, value };
114
+ if (aliasOf !== undefined)
115
+ return { kind: 'alias', name, aliasOf };
116
+ return null;
117
+ }
118
+ export function collectZigStaticGatedRanges(rootNode, localBools, importAliases, lookupBoolsForPath) {
119
+ const out = [];
120
+ for (const node of rootNode.descendantsOfType(['if_statement', 'if_expression'])) {
121
+ const cond = findIfCondition(node);
122
+ const result = cond
123
+ ? evalCond(cond, localBools, importAliases, lookupBoolsForPath, 0)
124
+ : undefined;
125
+ let dead = null;
126
+ if (node.type === 'if_statement') {
127
+ if (result === false)
128
+ dead = node.childForFieldName('body');
129
+ if (result === true)
130
+ dead = node.namedChildren.find((c) => c.type === 'else_clause') ?? null;
131
+ }
132
+ else {
133
+ const arms = ifExpressionArms(node);
134
+ if (result === false)
135
+ dead = arms.consequence;
136
+ if (result === true)
137
+ dead = arms.alternative;
138
+ }
139
+ if (dead) {
140
+ out.push({
141
+ startLine: dead.startPosition.row + 1,
142
+ startCol: dead.startPosition.column,
143
+ endLine: dead.endPosition.row + 1,
144
+ endCol: dead.endPosition.column,
145
+ });
146
+ }
147
+ }
148
+ return out;
149
+ }
150
+ /**
151
+ * The two arms of an `if_expression` (`const x = if (c) a else b;`). Unlike
152
+ * `if_statement` the grammar gives them no field names and no `else_clause`
153
+ * wrapper: the consequence is the first named child after the closing `)`
154
+ * of the condition, the alternative is the first named child after the
155
+ * anonymous `else` token. Either may be absent.
156
+ */
157
+ function ifExpressionArms(node) {
158
+ let consequence = null;
159
+ let alternative = null;
160
+ let slot = 'none';
161
+ for (let i = 0; i < node.childCount; i++) {
162
+ const c = node.child(i);
163
+ if (!c)
164
+ continue;
165
+ if (!c.isNamed) {
166
+ if (c.type === ')' && slot === 'none')
167
+ slot = 'consequence';
168
+ else if (c.type === 'else')
169
+ slot = 'alternative';
170
+ continue;
171
+ }
172
+ if (slot === 'consequence' && !consequence)
173
+ consequence = c;
174
+ else if (slot === 'alternative' && !alternative)
175
+ alternative = c;
176
+ }
177
+ return { consequence, alternative };
178
+ }
179
+ /** Is a (1-based line, 0-based col) position inside one of `ranges`? */
180
+ export function isPositionStaticGated(line, col, ranges) {
181
+ for (const r of ranges) {
182
+ if (line < r.startLine || line > r.endLine)
183
+ continue;
184
+ if (line === r.startLine && col < r.startCol)
185
+ continue;
186
+ if (line === r.endLine && col >= r.endCol)
187
+ continue;
188
+ return true;
189
+ }
190
+ return false;
191
+ }
192
+ /** Pick the condition node out of an `if_statement`. The condition is
193
+ * the first named child (the body / else branches come after). */
194
+ function findIfCondition(ifNode) {
195
+ return ifNode.namedChildren[0] ?? null;
196
+ }
197
+ /**
198
+ * Evaluate a boolean condition expression to a tribool.
199
+ *
200
+ * Handles only the shapes we can resolve symbolically; everything else
201
+ * returns `undefined` ("unknown — treat as live").
202
+ */
203
+ function evalCond(node, localBools, importAliases, lookupBoolsForPath, depth) {
204
+ if (depth > MAX_COND_DEPTH)
205
+ return undefined;
206
+ switch (node.type) {
207
+ case 'boolean': {
208
+ // Bare literal: `if (false)`.
209
+ if (node.text === 'true')
210
+ return true;
211
+ if (node.text === 'false')
212
+ return false;
213
+ return undefined;
214
+ }
215
+ case 'identifier': {
216
+ // Bare flag check: `if (FOO)`.
217
+ const v = localBools.get(node.text);
218
+ return v === undefined ? undefined : v;
219
+ }
220
+ case 'field_expression': {
221
+ // `cfg.FOO` — alias hop.
222
+ const obj = node.namedChildren[0];
223
+ const member = node.namedChildren[1];
224
+ if (obj?.type !== 'identifier' || member?.type !== 'identifier') {
225
+ return undefined;
226
+ }
227
+ const targetFile = importAliases.get(obj.text);
228
+ if (!targetFile)
229
+ return undefined;
230
+ const targetBools = lookupBoolsForPath(targetFile);
231
+ if (!targetBools)
232
+ return undefined;
233
+ const v = targetBools.get(member.text);
234
+ return v === undefined ? undefined : v;
235
+ }
236
+ case 'binary_expression': {
237
+ // `lhs and rhs` / `lhs or rhs` / `lhs == rhs` / `lhs != rhs`.
238
+ const op = findOperatorToken(node);
239
+ const lhs = node.namedChildren[0];
240
+ const rhs = node.namedChildren[1];
241
+ if (!lhs || !rhs)
242
+ return undefined;
243
+ const l = evalCond(lhs, localBools, importAliases, lookupBoolsForPath, depth + 1);
244
+ const r = evalCond(rhs, localBools, importAliases, lookupBoolsForPath, depth + 1);
245
+ if (op === 'and') {
246
+ // `false and *` = false; `* and false` = false.
247
+ if (l === false || r === false)
248
+ return false;
249
+ if (l === true && r === true)
250
+ return true;
251
+ return undefined;
252
+ }
253
+ if (op === 'or') {
254
+ // Only `false or false` is provably false.
255
+ if (l === false && r === false)
256
+ return false;
257
+ if (l === true || r === true)
258
+ return true;
259
+ return undefined;
260
+ }
261
+ if (op === '==') {
262
+ // Equality folds when both sides are known booleans.
263
+ // `FOO == false` ↔ `!FOO`; `FOO == true` ↔ `FOO`.
264
+ if (l === undefined || r === undefined)
265
+ return undefined;
266
+ return l === r;
267
+ }
268
+ if (op === '!=') {
269
+ if (l === undefined || r === undefined)
270
+ return undefined;
271
+ return l !== r;
272
+ }
273
+ // Other comparison ops (<, >, …) — not booleans we can prove.
274
+ return undefined;
275
+ }
276
+ case 'parenthesized_expression': {
277
+ // `(cond)`: transparent.
278
+ const inner = node.namedChildren[0];
279
+ if (!inner)
280
+ return undefined;
281
+ return evalCond(inner, localBools, importAliases, lookupBoolsForPath, depth + 1);
282
+ }
283
+ case 'error_union_type': {
284
+ // tree-sitter-zig has no unary `!` node: prefix `!cond` (boolean
285
+ // negation) parses as `error_union_type` because the same `!` token
286
+ // introduces error-union types. In condition position that reading is
287
+ // never a type, so negate whatever the operand folds to: an
288
+ // identifier, a literal, or a parenthesized compound like `!(A and B)`.
289
+ const inner = node.namedChildren[0];
290
+ if (!inner)
291
+ return undefined;
292
+ const v = evalCond(inner, localBools, importAliases, lookupBoolsForPath, depth + 1);
293
+ if (v === undefined)
294
+ return undefined;
295
+ return !v;
296
+ }
297
+ default:
298
+ return undefined;
299
+ }
300
+ }
301
+ /**
302
+ * Pull the textual operator (e.g. "and", "or") out of a
303
+ * `binary_expression`. In tree-sitter-zig, the operator is an
304
+ * anonymous child token whose `type` equals the operator string.
305
+ */
306
+ function findOperatorToken(binExpr) {
307
+ for (let i = 0; i < binExpr.childCount; i++) {
308
+ const c = binExpr.child(i);
309
+ if (!c)
310
+ continue;
311
+ if (!c.isNamed) {
312
+ // Anonymous tokens for these ops carry their text as the type.
313
+ if (c.type === 'and' || c.type === 'or' || c.type === '==' || c.type === '!=') {
314
+ return c.type;
315
+ }
316
+ }
317
+ }
318
+ return undefined;
319
+ }
@@ -324,7 +324,9 @@ export function resolveRouteHandlerSymbols(model, extractedRoutes, decoratorRout
324
324
  : uniqueById(model.methods.lookupAllByOwner(owner.nodeId, member))?.nodeId;
325
325
  };
326
326
  const claim = (routePath, prefix, httpMethod, symbolId) => {
327
- if (!routePath)
327
+ // An empty path is a valid, pathless mapping and normalizes to either `/`
328
+ // or its class/router prefix. Only null means the extractor had no route.
329
+ if (routePath === null)
328
330
  return;
329
331
  const url = normalizeExtractedRoutePath(routePath, prefix);
330
332
  const key = routeNodeKey(normalizeRouteMethod(httpMethod), url);
@@ -0,0 +1,2 @@
1
+ import type { ClassExtractionConfig } from '../../class-types.js';
2
+ export declare const zigClassConfig: ClassExtractionConfig;
@@ -0,0 +1,32 @@
1
+ import { SupportedLanguages } from '../../../../_shared/index.js';
2
+ import { isZigFileStruct, ZIG_CONTAINER_TYPES, zigContainerLabel, zigContainerName, } from '../../languages/zig/captures.js';
3
+ /**
4
+ * Zig containers (struct/enum/union/opaque) are anonymous in the grammar:
5
+ *
6
+ * const Point = struct { ... };
7
+ * pub fn List(comptime T: type) type { return struct { ... }; }
8
+ * fn build() void { const R = struct { ... }; sort(struct { fn lt … }.lt); }
9
+ *
10
+ * The identity is the binding name (first identifier of the parent
11
+ * variable_declaration), the generic type constructor's name, or — for a
12
+ * FUNCTION-LOCAL or ANONYMOUS container — a synthesized `host$Name` /
13
+ * `host$N` (F8). `zigContainerName` is the single source shared with the
14
+ * field/method extractors and the owner walk, so owner ids and node ids
15
+ * agree by construction. Which of the (up to three) ZIG_QUERIES rules that
16
+ * match one container gets to mint it is decided by the provider's
17
+ * `shouldSkipDefinitionCapture` (`isZigRedundantContainerCapture`).
18
+ */
19
+ const extractZigContainerName = (node, filePath) => zigContainerName(node, filePath);
20
+ const extractZigContainerType = (node) => {
21
+ // The file itself, when it declares top-level fields (file-struct); a
22
+ // namespace-only file is not a type — `extract` then yields no symbol.
23
+ if (node.type === 'source_file')
24
+ return isZigFileStruct(node) ? 'Struct' : undefined;
25
+ return zigContainerLabel(node);
26
+ };
27
+ export const zigClassConfig = {
28
+ language: SupportedLanguages.Zig,
29
+ typeDeclarationNodes: [...ZIG_CONTAINER_TYPES, 'source_file'],
30
+ extractName: extractZigContainerName,
31
+ extractType: extractZigContainerType,
32
+ };
@@ -45,6 +45,7 @@ const CLASS_LIKE_LABELS = new Set([
45
45
  'Interface',
46
46
  'Enum',
47
47
  'Record',
48
+ 'Union',
48
49
  ]);
49
50
  const extractScopeSegmentsFromNode = (scopeNode, scopeNameNodeTypes) => {
50
51
  const nameNode = scopeNode.childForFieldName?.('name') ??
@@ -100,7 +101,9 @@ export function createClassExtractor(config) {
100
101
  const extract = (node, fallback) => {
101
102
  if (!typeDeclarationSet.has(node.type))
102
103
  return null;
103
- const name = config.extractName?.(node) ?? extractTypeNameFromNode(node) ?? fallback?.name;
104
+ const name = config.extractName?.(node, fallback?.filePath) ??
105
+ extractTypeNameFromNode(node) ??
106
+ fallback?.name;
104
107
  const type = config.extractType?.(node) ??
105
108
  DEFAULT_LABEL_BY_NODE_TYPE[node.type] ??
106
109
  (isClassLikeLabel(fallback?.type) ? fallback.type : undefined);
@@ -1,6 +1,6 @@
1
1
  import type { NodeLabel, SupportedLanguages } from '../../_shared/index.js';
2
2
  import type { SyntaxNode } from './utils/ast-helpers.js';
3
- export type ClassLikeNodeLabel = Extract<NodeLabel, 'Class' | 'Struct' | 'Interface' | 'Enum' | 'Record'>;
3
+ export type ClassLikeNodeLabel = Extract<NodeLabel, 'Class' | 'Struct' | 'Interface' | 'Enum' | 'Record' | 'Union'>;
4
4
  export interface ExtractedClassSymbol {
5
5
  name: string;
6
6
  type: ClassLikeNodeLabel;
@@ -32,6 +32,8 @@ export interface ClassExtractor {
32
32
  extract(node: SyntaxNode, fallback?: {
33
33
  name?: string;
34
34
  type?: NodeLabel | null;
35
+ /** Repo-relative path of the file being extracted, when known. */
36
+ filePath?: string;
35
37
  }): ExtractedClassSymbol | null;
36
38
  extractQualifiedName(node: SyntaxNode, simpleName: string): string | null;
37
39
  /**
@@ -61,7 +63,9 @@ export interface ClassExtractionConfig {
61
63
  */
62
64
  qualifiedNodeId?: boolean;
63
65
  scopeNameNodeTypes?: string[];
64
- extractName?: (node: SyntaxNode) => string | undefined;
66
+ /** `filePath` is supplied when known (definition-phase extraction) — a
67
+ * language whose file IS a type names it from the path. */
68
+ extractName?: (node: SyntaxNode, filePath?: string) => string | undefined;
65
69
  extractType?: (node: SyntaxNode) => ClassLikeNodeLabel | undefined;
66
70
  extractScopeSegments?: (node: SyntaxNode) => string[] | null | undefined;
67
71
  extractTemplateArguments?: (node: SyntaxNode) => string[] | undefined;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Shared destination-identity keying — the async counterpart of `routeNodeKey`
3
+ * in `route-extractors/route-path.ts`.
4
+ *
5
+ * Deliberately OUTSIDE `frameworks/spring/`, and for the same reason
6
+ * `routeNodeKey` sits outside the routes phase: the identity has to be mintable
7
+ * by anything that names a broker address, so a Node Kafka client or a Celery
8
+ * task queue can land on the very node a Spring publisher minted. A key that
9
+ * lived in the Spring module would force every other producer to import Spring,
10
+ * or — worse — let each one invent its own spelling, and two spellings of one
11
+ * address is precisely the missed connection this overlay exists to make.
12
+ *
13
+ * `broker` is a plain `string`, NOT the Spring `SpringDestinationBroker` union.
14
+ * Importing that union here is the dependency this module exists to avoid, and
15
+ * widening it costs nothing that matters: the union is a subtype of `string`,
16
+ * so a Spring caller passes its own values unchanged, while a future
17
+ * non-Spring caller stays free to attest to a broker Spring has no name for.
18
+ * The trade is real but small — this signature cannot reject a misspelled
19
+ * broker — and it is the same trade `routeNodeKey` makes by taking `method` as
20
+ * a `string` rather than an HTTP-verb union. Pure string logic, no
21
+ * dependencies.
22
+ */
23
+ /**
24
+ * The `Destination` node identity: `(broker, address)` when the broker is
25
+ * known, falling back to the address alone when it is not.
26
+ *
27
+ * The broker belongs IN the key, exactly as the HTTP verb belongs in
28
+ * `routeNodeKey`. `GET /x` and `POST /x` are two nodes, both fully joinable,
29
+ * and neither is punished for the other's existence; `kafka orders` and
30
+ * `rabbit orders` are two nodes on the same terms. A Kafka topic and a Rabbit
31
+ * queue that happen to share a name are two places, and one node for both would
32
+ * report a publisher and a subscriber as connected when nothing connects them.
33
+ *
34
+ * The known objection is that the broker is INFERRED — from a receiver's name,
35
+ * from an annotation table — so a wrong guess splits a pair that is really one.
36
+ * That is true and it is the cost. It is worth paying because the alternative
37
+ * tried first was worse: withdrawing the address from every site that named it
38
+ * split the pair even when the guess was RIGHT, since one unrelated third party
39
+ * writing the same word anywhere in the repository was enough to disconnect
40
+ * everybody on that spelling. Putting the broker in the key bounds the damage
41
+ * of a wrong guess to the one pair it was wrong about, instead of spreading it
42
+ * to every pair that shares an address with a stranger.
43
+ *
44
+ * ── THE ADDRESS-ONLY FALLBACK IS UNREACHABLE TODAY ──────────────────────
45
+ *
46
+ * `SpringDestinationCandidate.broker` is REQUIRED, and every annotation rule
47
+ * and every producer template supplies one, so no Spring caller can reach the
48
+ * `undefined` branch. It is written anyway, and on purpose: the parameter shape
49
+ * is the contract this module offers the next language, and the next language
50
+ * may well capture an address without being able to attest to a broker (a bare
51
+ * `queue.publish(name)` in a dynamic language, a binding that names only a
52
+ * channel). Degrading to address-only is the right answer there — silence about
53
+ * the broker is not a claim about it, and refusing to key such a site at all
54
+ * would lose a real destination over a value nobody disagreed about.
55
+ *
56
+ * Because the branch is dead, it is covered by testing THIS function directly
57
+ * rather than by a pipeline test staged to look as though a phase reached it.
58
+ */
59
+ export declare function destinationNodeKey(broker: string | undefined, address: string): string;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shared destination-identity keying — the async counterpart of `routeNodeKey`
3
+ * in `route-extractors/route-path.ts`.
4
+ *
5
+ * Deliberately OUTSIDE `frameworks/spring/`, and for the same reason
6
+ * `routeNodeKey` sits outside the routes phase: the identity has to be mintable
7
+ * by anything that names a broker address, so a Node Kafka client or a Celery
8
+ * task queue can land on the very node a Spring publisher minted. A key that
9
+ * lived in the Spring module would force every other producer to import Spring,
10
+ * or — worse — let each one invent its own spelling, and two spellings of one
11
+ * address is precisely the missed connection this overlay exists to make.
12
+ *
13
+ * `broker` is a plain `string`, NOT the Spring `SpringDestinationBroker` union.
14
+ * Importing that union here is the dependency this module exists to avoid, and
15
+ * widening it costs nothing that matters: the union is a subtype of `string`,
16
+ * so a Spring caller passes its own values unchanged, while a future
17
+ * non-Spring caller stays free to attest to a broker Spring has no name for.
18
+ * The trade is real but small — this signature cannot reject a misspelled
19
+ * broker — and it is the same trade `routeNodeKey` makes by taking `method` as
20
+ * a `string` rather than an HTTP-verb union. Pure string logic, no
21
+ * dependencies.
22
+ */
23
+ /**
24
+ * The `Destination` node identity: `(broker, address)` when the broker is
25
+ * known, falling back to the address alone when it is not.
26
+ *
27
+ * The broker belongs IN the key, exactly as the HTTP verb belongs in
28
+ * `routeNodeKey`. `GET /x` and `POST /x` are two nodes, both fully joinable,
29
+ * and neither is punished for the other's existence; `kafka orders` and
30
+ * `rabbit orders` are two nodes on the same terms. A Kafka topic and a Rabbit
31
+ * queue that happen to share a name are two places, and one node for both would
32
+ * report a publisher and a subscriber as connected when nothing connects them.
33
+ *
34
+ * The known objection is that the broker is INFERRED — from a receiver's name,
35
+ * from an annotation table — so a wrong guess splits a pair that is really one.
36
+ * That is true and it is the cost. It is worth paying because the alternative
37
+ * tried first was worse: withdrawing the address from every site that named it
38
+ * split the pair even when the guess was RIGHT, since one unrelated third party
39
+ * writing the same word anywhere in the repository was enough to disconnect
40
+ * everybody on that spelling. Putting the broker in the key bounds the damage
41
+ * of a wrong guess to the one pair it was wrong about, instead of spreading it
42
+ * to every pair that shares an address with a stranger.
43
+ *
44
+ * ── THE ADDRESS-ONLY FALLBACK IS UNREACHABLE TODAY ──────────────────────
45
+ *
46
+ * `SpringDestinationCandidate.broker` is REQUIRED, and every annotation rule
47
+ * and every producer template supplies one, so no Spring caller can reach the
48
+ * `undefined` branch. It is written anyway, and on purpose: the parameter shape
49
+ * is the contract this module offers the next language, and the next language
50
+ * may well capture an address without being able to attest to a broker (a bare
51
+ * `queue.publish(name)` in a dynamic language, a binding that names only a
52
+ * channel). Degrading to address-only is the right answer there — silence about
53
+ * the broker is not a claim about it, and refusing to key such a site at all
54
+ * would lose a real destination over a value nobody disagreed about.
55
+ *
56
+ * Because the branch is dead, it is covered by testing THIS function directly
57
+ * rather than by a pipeline test staged to look as though a phase reached it.
58
+ */
59
+ export function destinationNodeKey(broker, address) {
60
+ return broker ? `${broker} ${address}` : address;
61
+ }
@@ -29,8 +29,12 @@ export interface EntryPointScoreResult {
29
29
  */
30
30
  export declare function calculateEntryPointScore(name: string, language: SupportedLanguages, isExported: boolean, callerCount: number, calleeCount: number, filePath?: string): EntryPointScoreResult;
31
31
  /**
32
- * Check if a file path is a test file (should be excluded from entry points)
33
- * Covers common test file patterns across all supported languages
32
+ * Check if a file path is a test file (should be excluded from entry points).
33
+ *
34
+ * Delegates to the shared predicate in `utils/test-file-path.ts`. This used to be
35
+ * a second, hand-maintained copy that had drifted from the one backing the MCP
36
+ * `includeTests` flag — see that module's header. Re-exported under this name so
37
+ * existing importers are unaffected.
34
38
  */
35
39
  export declare function isTestFile(filePath: string): boolean;
36
40
  /**
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { detectFrameworkFromPath } from './framework-detection.js';
13
13
  import { providers } from './languages/index.js';
14
+ import { isTestFilePath } from './utils/test-file-path.js';
14
15
  // ============================================================================
15
16
  // NAME PATTERNS
16
17
  // ============================================================================
@@ -127,52 +128,15 @@ export function calculateEntryPointScore(name, language, isExported, callerCount
127
128
  // HELPER FUNCTIONS
128
129
  // ============================================================================
129
130
  /**
130
- * Check if a file path is a test file (should be excluded from entry points)
131
- * Covers common test file patterns across all supported languages
131
+ * Check if a file path is a test file (should be excluded from entry points).
132
+ *
133
+ * Delegates to the shared predicate in `utils/test-file-path.ts`. This used to be
134
+ * a second, hand-maintained copy that had drifted from the one backing the MCP
135
+ * `includeTests` flag — see that module's header. Re-exported under this name so
136
+ * existing importers are unaffected.
132
137
  */
133
138
  export function isTestFile(filePath) {
134
- const p = filePath.toLowerCase().replace(/\\/g, '/');
135
- return (
136
- // JavaScript/TypeScript test patterns
137
- p.includes('.test.') ||
138
- p.includes('.spec.') ||
139
- p.includes('__tests__/') ||
140
- p.includes('__mocks__/') ||
141
- // Generic test folders
142
- p.includes('/test/') ||
143
- p.includes('/tests/') ||
144
- p.includes('/testing/') ||
145
- // Python test patterns
146
- p.endsWith('_test.py') ||
147
- p.includes('/test_') ||
148
- // Go test patterns
149
- p.endsWith('_test.go') ||
150
- // Java test patterns
151
- p.includes('/src/test/') ||
152
- // Rust test patterns (inline tests are different, but test files)
153
- p.includes('/tests/') ||
154
- // Swift/iOS test patterns
155
- p.endsWith('tests.swift') ||
156
- p.endsWith('test.swift') ||
157
- p.includes('uitests/') ||
158
- // C# test patterns
159
- p.endsWith('tests.cs') ||
160
- p.endsWith('test.cs') ||
161
- p.includes('.tests/') ||
162
- p.includes('.test/') ||
163
- p.includes('.integrationtests/') ||
164
- p.includes('.unittests/') ||
165
- p.includes('/testproject/') ||
166
- // PHP/Laravel test patterns
167
- p.endsWith('test.php') ||
168
- p.endsWith('spec.php') ||
169
- p.includes('/tests/feature/') ||
170
- p.includes('/tests/unit/') ||
171
- // Ruby test patterns
172
- p.endsWith('_spec.rb') ||
173
- p.endsWith('_test.rb') ||
174
- p.includes('/spec/') ||
175
- p.includes('/test/fixtures/'));
139
+ return isTestFilePath(filePath);
176
140
  }
177
141
  /**
178
142
  * Check if a file path is likely a utility/helper file
@@ -56,3 +56,40 @@ export declare const swiftExportChecker: ExportChecker;
56
56
  export declare const rubyExportChecker: ExportChecker;
57
57
  /** Dart: public if no leading underscore (convention, same as Python). */
58
58
  export declare const dartExportChecker: ExportChecker;
59
+ /**
60
+ * Zig: walk to the enclosing decl, scan its direct children for an unnamed `pub`
61
+ * or `export` keyword token (tree-sitter-zig models both as anonymous keyword
62
+ * children of function_declaration / variable_declaration). Two different
63
+ * facts share this one flag, on purpose:
64
+ * - `pub` is Zig-module visibility — reachable from another `.zig` file
65
+ * through `@import`;
66
+ * - `export` is C-ABI linkage (`export fn add(...)`) — the symbol lands in
67
+ * the object file for FFI callers, and it never carries `pub`.
68
+ * `isExported` means "visible outside this compilation unit" graph-wide (C uses
69
+ * external linkage for the same flag), so both qualify. The `visibility`
70
+ * property is the Zig-only fact and is `pub`-only — see `hasZigPubKeyword`:
71
+ * an `export fn` without `pub` is public to C and PRIVATE to other Zig files.
72
+ * Container fields (struct/enum variants) are public if their enclosing
73
+ * variable_declaration is public.
74
+ *
75
+ * The walk stops at the FIRST declaration it reaches: a `fn` inside
76
+ * `pub const T = struct { … }` carries its own `pub` (or not), independent of
77
+ * the container's. Continuing up to the wrapper marked every private method of
78
+ * a public container as exported.
79
+ */
80
+ export declare const zigExportChecker: ExportChecker;
81
+ /**
82
+ * Does this Zig declaration carry a `pub` or `export` keyword child? Feeds
83
+ * `isExported` (visible outside the compilation unit — to Zig importers OR to
84
+ * C callers).
85
+ */
86
+ export declare function hasZigVisibilityKeyword(declNode: SyntaxNode): boolean;
87
+ /**
88
+ * Does this Zig declaration carry a `pub` keyword child? Feeds `visibility`,
89
+ * the Zig-module fact: per the language reference, only `pub` declarations are
90
+ * accessible from another file via `@import`; `export` alone gives C linkage
91
+ * and leaves the declaration private to Zig code. So `export fn c_add` reports
92
+ * `isExported: true` (FFI surface) with `visibility: 'private'` (Zig surface)
93
+ * — two facts, two properties, deliberately not one.
94
+ */
95
+ export declare function hasZigPubKeyword(declNode: SyntaxNode): boolean;