gitnexus 1.6.9 → 1.6.10-aptos.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +211 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  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/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +197 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +5 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +28 -0
  294. package/dist/core/move/consistency.js +98 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +49 -0
  310. package/dist/core/move/move-ingest.js +320 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +3 -3
  322. package/dist/core/run-analyze.js +1001 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  374. package/hooks/claude/gitnexus-hook.cjs +59 -9
  375. package/hooks/claude/pre-tool-use.sh +0 -0
  376. package/hooks/claude/session-start.sh +0 -0
  377. package/package.json +21 -15
  378. package/scripts/cross-platform-tests.ts +56 -0
  379. package/scripts/ensure-fts.ts +43 -0
  380. package/scripts/install-duckdb-extension.mjs +85 -24
  381. package/scripts/run-cross-platform.ts +61 -6
  382. package/scripts/shard-arg.ts +30 -0
  383. package/scripts/sync-plugin-manifests.mjs +192 -0
  384. package/skills/gitnexus-lfg/README.md +55 -0
  385. package/skills/gitnexus-lfg/SKILL.md +86 -0
  386. package/skills/gitnexus-plan/README.md +142 -0
  387. package/skills/gitnexus-plan/SKILL.md +348 -0
  388. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  389. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  390. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  391. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  392. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  393. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  394. package/skills/gitnexus-review/SKILL.md +273 -0
  395. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  396. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  397. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  398. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  399. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  400. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  401. package/skills/gitnexus-work/README.md +71 -0
  402. package/skills/gitnexus-work/SKILL.md +269 -0
  403. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  404. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  405. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  406. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  407. package/web/assets/agent-Bqxn-abU.js +626 -0
  408. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  409. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  410. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  411. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  412. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  413. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  414. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  415. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  416. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  417. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  418. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  419. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  420. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  421. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  422. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  423. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  424. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  425. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  426. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  427. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  428. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  429. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  430. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  431. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  432. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  433. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  434. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  435. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  436. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  437. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  438. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  439. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  440. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  441. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  442. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  443. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  444. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  445. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  446. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  447. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  448. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  449. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  450. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  451. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  452. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  453. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  454. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  455. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  456. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  457. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  458. package/web/assets/index-CX_fADmQ.css +2 -0
  459. package/web/assets/index-D1Z3dGGz.js +575 -0
  460. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  461. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  462. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  463. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  464. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  465. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  466. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  467. package/web/assets/node-Ct_zna8U.js +8 -0
  468. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  469. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  470. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  471. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  472. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  473. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  474. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  475. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  476. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  477. package/web/assets/sdk-CzHHH8tD.js +37 -0
  478. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  479. package/web/assets/src-JV30wyV8.js +1 -0
  480. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  481. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  482. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  483. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  484. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  485. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  486. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  487. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  488. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  489. package/web/index.html +18 -10
  490. package/skills/gitnexus-pr-review.md +0 -163
  491. package/web/assets/agent-Dli_x7bU.js +0 -660
  492. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  493. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  494. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  495. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  496. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  497. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  498. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  499. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  500. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  501. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  502. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  503. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  504. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  505. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  506. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  507. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  508. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  509. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  510. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  511. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  512. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  513. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  514. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  515. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  516. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  517. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  518. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  519. package/web/assets/index-KctnI3Vq.js +0 -635
  520. package/web/assets/index-_lgn7hs5.css +0 -2
  521. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  522. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  523. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  524. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  525. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  526. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  527. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  528. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  529. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  530. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  531. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  532. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  533. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  534. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  535. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  536. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  537. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  538. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  539. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -14,6 +14,7 @@ import Graph from 'graphology';
14
14
  import { createRequire } from 'node:module';
15
15
  import { fileURLToPath } from 'node:url';
16
16
  import { dirname, resolve } from 'node:path';
17
+ import { Worker } from 'node:worker_threads';
17
18
  const __filename = fileURLToPath(import.meta.url);
18
19
  const __dirname = dirname(__filename);
19
20
  // Navigate to package root (works from both src/ and dist/)
@@ -37,6 +38,20 @@ function createSeededRng(seed) {
37
38
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
38
39
  };
39
40
  }
41
+ const COMMUNITY_ENGINE_ENV = 'GITNEXUS_COMMUNITY_ENGINE';
42
+ const DEFAULT_COMMUNITY_ENGINE = 'graphology';
43
+ const LEIDEN_TIMEOUT_MS = 60_000;
44
+ const ICEBUG_TIMEOUT_MS = 60_000;
45
+ const MIN_CONFIDENCE_LARGE = 0.5;
46
+ export const resolveCommunityDetectionEngine = (raw = process.env[COMMUNITY_ENGINE_ENV]) => {
47
+ if (raw === undefined || raw.trim() === '')
48
+ return DEFAULT_COMMUNITY_ENGINE;
49
+ const normalized = raw.trim().toLowerCase();
50
+ if (normalized === 'graphology' || normalized === 'icebug' || normalized === 'auto') {
51
+ return normalized;
52
+ }
53
+ return DEFAULT_COMMUNITY_ENGINE;
54
+ };
40
55
  // ============================================================================
41
56
  // COMMUNITY COLORS (for visualization)
42
57
  // ============================================================================
@@ -66,59 +81,28 @@ export const getCommunityColor = (communityIndex) => {
66
81
  * This runs AFTER all relationships (CALLS, IMPORTS, etc.) have been built.
67
82
  * It uses primarily CALLS edges to cluster code that works together.
68
83
  */
69
- export const processCommunities = async (knowledgeGraph, onProgress) => {
84
+ export const processCommunities = async (knowledgeGraph, onProgress, options = {}) => {
70
85
  onProgress?.('Building graph for community detection...', 0);
71
- // Pre-check total symbol count to determine large-graph mode before building
72
- let symbolCount = 0;
73
- knowledgeGraph.forEachNode((node) => {
74
- if (node.label === 'Function' ||
75
- node.label === 'Class' ||
76
- node.label === 'Method' ||
77
- node.label === 'Interface') {
78
- symbolCount++;
79
- }
80
- });
81
- const isLarge = symbolCount > 10_000;
82
- const graph = buildGraphologyGraph(knowledgeGraph, isLarge);
86
+ const engineRequested = options.engine ?? resolveCommunityDetectionEngine();
87
+ const projection = buildCommunityProjection(knowledgeGraph);
88
+ const graph = buildGraphologyGraph(projection);
83
89
  if (graph.order === 0) {
84
90
  return {
85
91
  communities: [],
86
92
  memberships: [],
87
- stats: { totalCommunities: 0, modularity: 0, nodesProcessed: 0 },
93
+ stats: {
94
+ totalCommunities: 0,
95
+ modularity: 0,
96
+ nodesProcessed: 0,
97
+ engine: DEFAULT_COMMUNITY_ENGINE,
98
+ engineRequested,
99
+ },
88
100
  };
89
101
  }
90
102
  const nodeCount = graph.order;
91
103
  const edgeCount = graph.size;
92
- onProgress?.(`Running Leiden on ${nodeCount} nodes, ${edgeCount} edges${isLarge ? ` (filtered from ${symbolCount} symbols)` : ''}...`, 30);
93
- // Large graphs: higher resolution + capped iterations (matching Python leidenalg default of 2).
94
- // The first 2 iterations capture ~95%+ of modularity; additional iterations have diminishing returns.
95
- // Timeout: abort after 60s for pathological graph structures.
96
- const LEIDEN_TIMEOUT_MS = 60_000;
97
- let details;
98
- try {
99
- details = await Promise.race([
100
- Promise.resolve(leiden.detailed(graph, {
101
- resolution: isLarge ? 2.0 : 1.0,
102
- maxIterations: isLarge ? 3 : 0,
103
- rng: createSeededRng(LEIDEN_SEED),
104
- })),
105
- new Promise((_, reject) => setTimeout(() => reject(new Error('Leiden timeout')), LEIDEN_TIMEOUT_MS)),
106
- ]);
107
- }
108
- catch (e) {
109
- if (e.message === 'Leiden timeout') {
110
- onProgress?.('Community detection timed out, using fallback...', 60);
111
- // Fallback: assign all nodes to community 0
112
- const communities = {};
113
- graph.forEachNode((node) => {
114
- communities[node] = 0;
115
- });
116
- details = { communities, count: 1, modularity: 0 };
117
- }
118
- else {
119
- throw e;
120
- }
121
- }
104
+ onProgress?.(`Running Leiden on ${nodeCount} nodes, ${edgeCount} edges${projection.isLarge ? ` (filtered from ${projection.symbolCount} symbols)` : ''}...`, 30);
105
+ const details = await runCommunityEngine(graph, projection, engineRequested, options, onProgress);
122
106
  onProgress?.(`Found ${details.count} communities...`, 60);
123
107
  // Step 3: Create community nodes with heuristic labels
124
108
  const communityNodes = createCommunityNodes(details.communities, details.count, graph, knowledgeGraph);
@@ -139,27 +123,32 @@ export const processCommunities = async (knowledgeGraph, onProgress) => {
139
123
  totalCommunities: details.count,
140
124
  modularity: details.modularity,
141
125
  nodesProcessed: graph.order,
126
+ engine: details.engine,
127
+ engineRequested: details.engineRequested,
128
+ fallbackReason: details.fallbackReason,
142
129
  },
143
130
  };
144
131
  };
145
132
  // ============================================================================
146
- // HELPER: Build graphology graph from knowledge graph
133
+ // HELPER: Build community projection from knowledge graph
147
134
  // ============================================================================
148
135
  /**
149
- * Build a graphology graph containing only symbol nodes and clustering edges.
136
+ * Build a community projection containing only symbol nodes and clustering edges.
150
137
  * For large graphs (>10K symbols), filter out low-confidence fuzzy-global edges
151
138
  * and degree-1 nodes that add noise and massively increase Leiden runtime.
152
139
  */
153
- const MIN_CONFIDENCE_LARGE = 0.5;
154
- const buildGraphologyGraph = (knowledgeGraph, isLarge) => {
155
- const GraphCtor = Graph;
156
- const graph = new GraphCtor({ type: 'undirected', allowSelfLoops: false });
157
- const symbolTypes = new Set(['Function', 'Class', 'Method', 'Interface']);
158
- const clusteringRelTypes = new Set(['CALLS', 'EXTENDS', 'IMPLEMENTS']);
140
+ export const buildCommunityProjection = (knowledgeGraph) => {
141
+ let symbolCount = 0;
142
+ knowledgeGraph.forEachNode((node) => {
143
+ if (isCommunitySymbol(node)) {
144
+ symbolCount++;
145
+ }
146
+ });
147
+ const isLarge = symbolCount > 10_000;
159
148
  const connectedNodes = new Set();
160
149
  const nodeDegree = new Map();
161
150
  knowledgeGraph.forEachRelationship((rel) => {
162
- if (!clusteringRelTypes.has(rel.type) || rel.sourceId === rel.targetId)
151
+ if (!isClusteringRelationship(rel.type) || rel.sourceId === rel.targetId)
163
152
  return;
164
153
  if (isLarge && rel.confidence < MIN_CONFIDENCE_LARGE)
165
154
  return;
@@ -168,34 +157,304 @@ const buildGraphologyGraph = (knowledgeGraph, isLarge) => {
168
157
  nodeDegree.set(rel.sourceId, (nodeDegree.get(rel.sourceId) || 0) + 1);
169
158
  nodeDegree.set(rel.targetId, (nodeDegree.get(rel.targetId) || 0) + 1);
170
159
  });
160
+ const nodes = [];
161
+ const nodeIndexById = new Map();
162
+ const eligibleNodes = [];
171
163
  knowledgeGraph.forEachNode((node) => {
172
- if (!symbolTypes.has(node.label) || !connectedNodes.has(node.id))
164
+ if (!isCommunitySymbol(node) || !connectedNodes.has(node.id))
173
165
  return;
174
166
  // For large graphs, skip degree-1 nodes — they just become singletons or
175
167
  // get absorbed into their single neighbor's community, but cost iteration time.
176
168
  if (isLarge && (nodeDegree.get(node.id) || 0) < 2)
177
169
  return;
178
- graph.addNode(node.id, {
170
+ eligibleNodes.push(node);
171
+ });
172
+ eligibleNodes.sort((left, right) => (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
173
+ for (const node of eligibleNodes) {
174
+ nodeIndexById.set(node.id, nodes.length);
175
+ nodes.push({
176
+ id: node.id,
179
177
  name: node.properties.name,
180
178
  filePath: node.properties.filePath,
181
179
  type: node.label,
182
180
  });
183
- });
181
+ }
182
+ const seenEdges = new Set();
183
+ const edges = [];
184
184
  knowledgeGraph.forEachRelationship((rel) => {
185
- if (!clusteringRelTypes.has(rel.type))
185
+ if (!isClusteringRelationship(rel.type) || rel.sourceId === rel.targetId)
186
186
  return;
187
187
  if (isLarge && rel.confidence < MIN_CONFIDENCE_LARGE)
188
188
  return;
189
- if (graph.hasNode(rel.sourceId) &&
190
- graph.hasNode(rel.targetId) &&
191
- rel.sourceId !== rel.targetId) {
192
- if (!graph.hasEdge(rel.sourceId, rel.targetId)) {
193
- graph.addEdge(rel.sourceId, rel.targetId);
194
- }
195
- }
189
+ const sourceIndex = nodeIndexById.get(rel.sourceId);
190
+ const targetIndex = nodeIndexById.get(rel.targetId);
191
+ if (sourceIndex === undefined || targetIndex === undefined || sourceIndex === targetIndex)
192
+ return;
193
+ const [a, b] = sourceIndex < targetIndex ? [sourceIndex, targetIndex] : [targetIndex, sourceIndex];
194
+ const edgeKey = `${a}:${b}`;
195
+ if (seenEdges.has(edgeKey))
196
+ return;
197
+ seenEdges.add(edgeKey);
198
+ edges.push([a, b]);
196
199
  });
200
+ edges.sort(([leftA, leftB], [rightA, rightB]) => leftA - rightA || leftB - rightB);
201
+ return { nodes, edges, symbolCount, isLarge };
202
+ };
203
+ export const buildCommunityCsr = (projection) => {
204
+ const adjacency = Array.from({ length: projection.nodes.length }, () => new Set());
205
+ for (const [sourceIndex, targetIndex] of projection.edges) {
206
+ adjacency[sourceIndex].add(targetIndex);
207
+ adjacency[targetIndex].add(sourceIndex);
208
+ }
209
+ const edgeTraversalCount = adjacency.reduce((count, neighbors) => count + neighbors.size, 0);
210
+ const indptr = new BigUint64Array(projection.nodes.length + 1);
211
+ const indices = new BigUint64Array(edgeTraversalCount);
212
+ let cursor = 0;
213
+ for (let nodeIndex = 0; nodeIndex < adjacency.length; nodeIndex++) {
214
+ indptr[nodeIndex] = BigInt(cursor);
215
+ const neighbors = [...adjacency[nodeIndex]].sort((a, b) => a - b);
216
+ for (const neighbor of neighbors) {
217
+ indices[cursor++] = BigInt(neighbor);
218
+ }
219
+ }
220
+ indptr[projection.nodes.length] = BigInt(cursor);
221
+ return { indptr, indices };
222
+ };
223
+ export const buildGraphologyGraph = (projection) => {
224
+ const GraphCtor = Graph;
225
+ const graph = new GraphCtor({ type: 'undirected', allowSelfLoops: false });
226
+ for (const node of projection.nodes) {
227
+ graph.addNode(node.id, {
228
+ name: node.name,
229
+ filePath: node.filePath,
230
+ type: node.type,
231
+ });
232
+ }
233
+ for (const [sourceIndex, targetIndex] of projection.edges) {
234
+ graph.addEdge(projection.nodes[sourceIndex].id, projection.nodes[targetIndex].id);
235
+ }
197
236
  return graph;
198
237
  };
238
+ const isCommunitySymbol = (node) => node.label === 'Function' ||
239
+ node.label === 'Class' ||
240
+ node.label === 'Method' ||
241
+ node.label === 'Interface';
242
+ const isClusteringRelationship = (type) => type === 'CALLS' || type === 'EXTENDS' || type === 'IMPLEMENTS';
243
+ const runCommunityEngine = async (graph, projection, engineRequested, options, onProgress) => {
244
+ if (engineRequested === 'graphology') {
245
+ return runGraphologyLeiden(graph, projection.isLarge, engineRequested);
246
+ }
247
+ try {
248
+ return await runIcebugLeiden(projection, engineRequested, options);
249
+ }
250
+ catch (error) {
251
+ const fallbackReason = error instanceof Error ? error.message : String(error);
252
+ onProgress?.(`Icebug community engine unavailable, falling back to Graphology: ${fallbackReason}`, 35);
253
+ const fallback = await runGraphologyLeiden(graph, projection.isLarge, engineRequested);
254
+ return { ...fallback, fallbackReason };
255
+ }
256
+ };
257
+ const runGraphologyLeiden = async (graph, isLarge, engineRequested) => {
258
+ try {
259
+ const details = await Promise.race([
260
+ Promise.resolve(leiden.detailed(graph, {
261
+ resolution: isLarge ? 2.0 : 1.0,
262
+ maxIterations: isLarge ? 3 : 0,
263
+ rng: createSeededRng(LEIDEN_SEED),
264
+ })),
265
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Leiden timeout')), LEIDEN_TIMEOUT_MS)),
266
+ ]);
267
+ return { ...details, engine: 'graphology', engineRequested };
268
+ }
269
+ catch (e) {
270
+ if (e.message !== 'Leiden timeout') {
271
+ throw e;
272
+ }
273
+ // Fallback: assign all nodes to community 0
274
+ const communities = {};
275
+ graph.forEachNode((node) => {
276
+ communities[node] = 0;
277
+ });
278
+ return {
279
+ communities,
280
+ count: 1,
281
+ modularity: 0,
282
+ engine: 'graphology',
283
+ engineRequested,
284
+ fallbackReason: 'Graphology Leiden timeout',
285
+ };
286
+ }
287
+ };
288
+ const runIcebugLeiden = async (projection, engineRequested, options) => {
289
+ const csr = buildCommunityCsr(projection);
290
+ const nativeResult = await runIcebugWorker(projection.nodes.length, csr, options);
291
+ const partition = nativeResult.partition;
292
+ if (!Number.isFinite(nativeResult.modularity)) {
293
+ throw new Error('optional icebug modularity was not finite');
294
+ }
295
+ if (partition.length !== projection.nodes.length ||
296
+ partition.some((community) => !Number.isSafeInteger(community))) {
297
+ throw new Error(`optional icebug partition was malformed for ${projection.nodes.length} projected nodes`);
298
+ }
299
+ const communities = normalizePartition(projection, partition);
300
+ return {
301
+ communities,
302
+ count: new Set(Object.values(communities)).size,
303
+ modularity: nativeResult.modularity,
304
+ engine: 'icebug',
305
+ engineRequested,
306
+ };
307
+ };
308
+ const runIcebugWorker = (nodeCount, csr, options) => {
309
+ const threads = options.icebug?.threads ?? 1;
310
+ if (!Number.isSafeInteger(threads) || threads !== 1) {
311
+ throw new Error('optional icebug engine currently requires deterministic threads=1');
312
+ }
313
+ if (options.icebug?.randomize === true) {
314
+ throw new Error('optional icebug engine currently requires randomize=false');
315
+ }
316
+ const worker = new Worker(ICEBUG_WORKER_SOURCE, {
317
+ eval: true,
318
+ workerData: {
319
+ nodeCount,
320
+ indices: csr.indices,
321
+ indptr: csr.indptr,
322
+ threads,
323
+ seed: options.icebug?.seed ?? LEIDEN_SEED,
324
+ iterations: options.icebug?.iterations ?? 4,
325
+ gamma: options.icebug?.gamma ?? 1.0,
326
+ randomize: options.icebug?.randomize ?? false,
327
+ },
328
+ });
329
+ return new Promise((resolve, reject) => {
330
+ let settled = false;
331
+ const timeout = setTimeout(() => {
332
+ settled = true;
333
+ void worker.terminate();
334
+ reject(new Error(`optional icebug community engine timed out after ${ICEBUG_TIMEOUT_MS}ms`));
335
+ }, ICEBUG_TIMEOUT_MS);
336
+ worker.once('message', (message) => {
337
+ settled = true;
338
+ clearTimeout(timeout);
339
+ void worker.terminate();
340
+ if (message.ok === true) {
341
+ resolve(message);
342
+ }
343
+ else {
344
+ reject(new Error(message.error));
345
+ }
346
+ });
347
+ worker.once('error', (error) => {
348
+ settled = true;
349
+ clearTimeout(timeout);
350
+ void worker.terminate();
351
+ reject(error);
352
+ });
353
+ worker.once('exit', (code) => {
354
+ if (settled)
355
+ return;
356
+ clearTimeout(timeout);
357
+ if (code === 0) {
358
+ reject(new Error('optional icebug worker exited before returning a partition'));
359
+ return;
360
+ }
361
+ reject(new Error(`optional icebug worker exited with code ${code}`));
362
+ });
363
+ });
364
+ };
365
+ const ICEBUG_WORKER_SOURCE = `
366
+ const { parentPort, workerData } = require('node:worker_threads');
367
+
368
+ const isNumericArrayLike = (value) =>
369
+ typeof value === 'object' &&
370
+ value !== null &&
371
+ 'length' in value &&
372
+ typeof value.length === 'number';
373
+
374
+ const readPartition = (runner) => {
375
+ const candidates = [
376
+ typeof runner.getPartition === 'function' ? runner.getPartition() : runner.partition,
377
+ typeof runner.getCommunities === 'function' ? runner.getCommunities() : undefined,
378
+ typeof runner.getMembership === 'function' ? runner.getMembership() : undefined,
379
+ typeof runner.getMemberships === 'function' ? runner.getMemberships() : undefined,
380
+ ];
381
+
382
+ for (const candidate of candidates) {
383
+ if (isNumericArrayLike(candidate)) {
384
+ return Array.from(candidate, Number);
385
+ }
386
+ }
387
+
388
+ throw new Error('optional icebug ParallelLeidenView did not expose a partition array');
389
+ };
390
+
391
+ const readModularity = (runner) => {
392
+ if (typeof runner.getModularity === 'function') return runner.getModularity();
393
+ if (typeof runner.modularity === 'function') return runner.modularity();
394
+ if (typeof runner.modularity === 'number') return runner.modularity;
395
+ return 0;
396
+ };
397
+
398
+ (async () => {
399
+ const imported = await import('icebug');
400
+ const icebug = imported.default ?? imported;
401
+ const fromCSR = icebug.Graph?.fromCSR;
402
+ const ParallelLeidenView = icebug.community?.ParallelLeidenView;
403
+ if (!fromCSR || !ParallelLeidenView) {
404
+ throw new Error('optional icebug module does not expose Graph.fromCSR/ParallelLeidenView');
405
+ }
406
+
407
+ if (typeof icebug.setNumberOfThreads !== 'function' || typeof icebug.setSeed !== 'function') {
408
+ throw new Error('optional icebug module does not expose deterministic thread/seed controls');
409
+ }
410
+ icebug.setNumberOfThreads(workerData.threads);
411
+ icebug.setSeed(workerData.seed, false);
412
+
413
+ const nativeGraph = fromCSR(workerData.nodeCount, false, workerData.indices, workerData.indptr);
414
+ let runner;
415
+ try {
416
+ runner = new ParallelLeidenView(nativeGraph, {
417
+ iterations: workerData.iterations,
418
+ gamma: workerData.gamma,
419
+ randomize: workerData.randomize,
420
+ });
421
+ } catch {
422
+ runner = new ParallelLeidenView(
423
+ nativeGraph,
424
+ workerData.iterations,
425
+ workerData.gamma,
426
+ workerData.randomize,
427
+ );
428
+ }
429
+
430
+ if (typeof runner.run !== 'function') {
431
+ throw new Error('optional icebug ParallelLeidenView does not expose run()');
432
+ }
433
+
434
+ runner.run();
435
+ parentPort.postMessage({
436
+ ok: true,
437
+ partition: readPartition(runner),
438
+ modularity: readModularity(runner),
439
+ });
440
+ })().catch((error) => {
441
+ parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });
442
+ });
443
+ `;
444
+ const normalizePartition = (projection, partition) => {
445
+ const remap = new Map();
446
+ const communities = {};
447
+ for (let index = 0; index < projection.nodes.length; index++) {
448
+ const rawCommunity = String(partition[index]);
449
+ let communityId = remap.get(rawCommunity);
450
+ if (communityId === undefined) {
451
+ communityId = remap.size;
452
+ remap.set(rawCommunity, communityId);
453
+ }
454
+ communities[projection.nodes[index].id] = communityId;
455
+ }
456
+ return communities;
457
+ };
199
458
  // ============================================================================
200
459
  // HELPER: Create community nodes with heuristic labels
201
460
  // ============================================================================
@@ -44,6 +44,7 @@
44
44
  * ancestor scope, and if THAT produces nothing either the edge is
45
45
  * skipped (with a count returned in `EmitStats.skippedNoCaller`).
46
46
  */
47
+ import { toZeroBasedLine } from './utils/line-base.js';
47
48
  /**
48
49
  * Drain `referenceIndex.bySourceScope` into graph edges.
49
50
  *
@@ -95,8 +96,8 @@ export function emitScopeGraph(input) {
95
96
  properties: {
96
97
  name: scope.kind,
97
98
  filePath: scope.filePath,
98
- startLine: scope.range.startLine,
99
- endLine: scope.range.endLine,
99
+ startLine: toZeroBasedLine(scope.range.startLine),
100
+ endLine: toZeroBasedLine(scope.range.endLine),
100
101
  description: `Scope: ${scope.kind}`,
101
102
  },
102
103
  });
@@ -223,6 +224,10 @@ function mapKindToType(kind) {
223
224
  case 'type-reference':
224
225
  case 'import-use':
225
226
  case 'macro':
227
+ // value-ref: function registered as an object-literal property value —
228
+ // a reference, not an invocation; CALLS are synthesized separately by
229
+ // the property-dispatch pass (#2437).
230
+ case 'value-ref':
226
231
  return 'USES';
227
232
  }
228
233
  }
@@ -60,6 +60,10 @@ export const walkRepositoryPaths = async (repoPath, onProgress) => {
60
60
  }
61
61
  }
62
62
  }
63
+ // Filesystem/glob traversal order is not stable across filesystems or repeated
64
+ // scans. Canonicalize once at the scan boundary so every downstream phase sees
65
+ // the same repository order.
66
+ entries.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
63
67
  if (skippedLarge > 0) {
64
68
  const isDefault = maxFileSizeBytes === DEFAULT_MAX_FILE_SIZE_BYTES;
65
69
  const isOverrideUnset = !process.env.GITNEXUS_MAX_FILE_SIZE;
@@ -0,0 +1,3 @@
1
+ import type { AnalysisFeatureDescriptor } from '../../../analysis-features.js';
2
+ /** Durable completeness contract for Java/Kotlin Spring Bean evidence. */
3
+ export declare const SPRING_BEAN_INVENTORY_FEATURE: AnalysisFeatureDescriptor;
@@ -0,0 +1,7 @@
1
+ import { isSpringBeanCandidateSourceFile } from './bean-catalog.js';
2
+ /** Durable completeness contract for Java/Kotlin Spring Bean evidence. */
3
+ export const SPRING_BEAN_INVENTORY_FEATURE = {
4
+ id: 'spring.bean-inventory',
5
+ version: 1,
6
+ appliesTo: (filePaths) => filePaths.some(isSpringBeanCandidateSourceFile),
7
+ };
@@ -0,0 +1,30 @@
1
+ import type { Capture, ParsedFile, ScopeId } from '../../../../_shared/index.js';
2
+ import type { KnowledgeGraph } from '../../../graph/types.js';
3
+ import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
4
+ import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
5
+ export interface ClassAnnotationFact {
6
+ readonly classScopeId: ScopeId;
7
+ readonly annotationNames: readonly string[];
8
+ }
9
+ export interface ClassAnnotationFactStore {
10
+ clear(): void;
11
+ set(filePath: string, facts: readonly ClassAnnotationFact[]): void;
12
+ get(filePath: string): readonly ClassAnnotationFact[];
13
+ }
14
+ /** Per-language store for capture facts that cross the worker boundary. */
15
+ export declare function createClassAnnotationFactStore(): ClassAnnotationFactStore;
16
+ /** Record one annotation from the language's existing scope-query traversal. */
17
+ export declare function recordClassAnnotationCapture(facts: Map<ScopeId, Set<string>>, filePath: string, classCapture: Pick<Capture, 'range'>, annotationName: string): void;
18
+ export declare function materializeClassAnnotationFacts(facts: ReadonlyMap<ScopeId, ReadonlySet<string>>): readonly ClassAnnotationFact[];
19
+ export interface SpringBeanCandidateAdapter {
20
+ getClassAnnotationFacts(filePath: string): readonly ClassAnnotationFact[];
21
+ isPackageVisibilityIncomplete(filePath: string): boolean;
22
+ }
23
+ type RecognizedAnnotationNames = {
24
+ readonly has: (value: string) => boolean;
25
+ };
26
+ /** Build a scope-aware Spring annotation resolver shared by framework hooks. */
27
+ export declare function createSpringAnnotationNameResolver(indexes: ScopeResolutionIndexes): (rawName: string, parsed: ParsedFile, enclosingScope: ScopeId | null, recognizedAnnotations: RecognizedAnnotationNames, isPackageVisibilityIncomplete: boolean) => string | undefined;
28
+ /** Build a language hook that enriches Class nodes after scope resolution. */
29
+ export declare function createSpringBeanCandidateAttacher(adapter: SpringBeanCandidateAdapter): (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes) => void;
30
+ export {};