gitnexus 1.6.5-rc.3 → 1.6.5-rc.30

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 (316) hide show
  1. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts +26 -0
  2. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts.map +1 -1
  3. package/dist/_shared/scope-resolution/method-dispatch-index.js +22 -3
  4. package/dist/_shared/scope-resolution/method-dispatch-index.js.map +1 -1
  5. package/dist/_shared/scope-resolution/registries/lookup-core.js +18 -1
  6. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  7. package/dist/cli/ai-context.d.ts +1 -0
  8. package/dist/cli/ai-context.js +70 -16
  9. package/dist/cli/analyze.d.ts +18 -0
  10. package/dist/cli/analyze.js +33 -4
  11. package/dist/cli/index.js +8 -1
  12. package/dist/cli/setup.js +6 -0
  13. package/dist/cli/wiki.d.ts +2 -0
  14. package/dist/cli/wiki.js +11 -0
  15. package/dist/core/augmentation/engine.js +24 -4
  16. package/dist/core/embeddings/ast-utils.js +2 -1
  17. package/dist/core/embeddings/http-client.js +22 -6
  18. package/dist/core/group/extractors/grpc-extractor.js +2 -1
  19. package/dist/core/group/extractors/http-patterns/python.js +175 -0
  20. package/dist/core/group/extractors/http-route-extractor.js +2 -1
  21. package/dist/core/group/extractors/include-extractor.js +2 -1
  22. package/dist/core/group/extractors/thrift-extractor.js +2 -1
  23. package/dist/core/group/extractors/tree-sitter-scanner.js +2 -1
  24. package/dist/core/incremental/shadow-candidates.d.ts +44 -0
  25. package/dist/core/incremental/shadow-candidates.js +74 -0
  26. package/dist/core/incremental/subgraph-extract.d.ts +64 -0
  27. package/dist/core/incremental/subgraph-extract.js +111 -0
  28. package/dist/core/ingestion/call-processor.js +166 -47
  29. package/dist/core/ingestion/community-processor.js +18 -0
  30. package/dist/core/ingestion/heritage-processor.js +3 -2
  31. package/dist/core/ingestion/import-processor.js +2 -1
  32. package/dist/core/ingestion/import-resolvers/standard.d.ts +5 -0
  33. package/dist/core/ingestion/import-resolvers/standard.js +27 -1
  34. package/dist/core/ingestion/import-resolvers/utils.js +4 -0
  35. package/dist/core/ingestion/languages/c/arity-metadata.d.ts +14 -0
  36. package/dist/core/ingestion/languages/c/arity-metadata.js +94 -0
  37. package/dist/core/ingestion/languages/c/arity.d.ts +6 -0
  38. package/dist/core/ingestion/languages/c/arity.js +18 -0
  39. package/dist/core/ingestion/languages/c/captures.d.ts +2 -0
  40. package/dist/core/ingestion/languages/c/captures.js +105 -0
  41. package/dist/core/ingestion/languages/c/header-scan.d.ts +7 -0
  42. package/dist/core/ingestion/languages/c/header-scan.js +55 -0
  43. package/dist/core/ingestion/languages/c/import-decomposer.d.ts +8 -0
  44. package/dist/core/ingestion/languages/c/import-decomposer.js +50 -0
  45. package/dist/core/ingestion/languages/c/import-target.d.ts +14 -0
  46. package/dist/core/ingestion/languages/c/import-target.js +57 -0
  47. package/dist/core/ingestion/languages/c/index.d.ts +11 -0
  48. package/dist/core/ingestion/languages/c/index.js +11 -0
  49. package/dist/core/ingestion/languages/c/interpret.d.ts +14 -0
  50. package/dist/core/ingestion/languages/c/interpret.js +48 -0
  51. package/dist/core/ingestion/languages/c/merge-bindings.d.ts +7 -0
  52. package/dist/core/ingestion/languages/c/merge-bindings.js +23 -0
  53. package/dist/core/ingestion/languages/c/query.d.ts +3 -0
  54. package/dist/core/ingestion/languages/c/query.js +161 -0
  55. package/dist/core/ingestion/languages/c/scope-resolver.d.ts +13 -0
  56. package/dist/core/ingestion/languages/c/scope-resolver.js +60 -0
  57. package/dist/core/ingestion/languages/c/simple-hooks.d.ts +14 -0
  58. package/dist/core/ingestion/languages/c/simple-hooks.js +19 -0
  59. package/dist/core/ingestion/languages/c/static-linkage.d.ts +13 -0
  60. package/dist/core/ingestion/languages/c/static-linkage.js +57 -0
  61. package/dist/core/ingestion/languages/c-cpp.js +10 -0
  62. package/dist/core/ingestion/languages/csharp/captures.js +2 -1
  63. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +3 -2
  64. package/dist/core/ingestion/languages/go/captures.js +2 -1
  65. package/dist/core/ingestion/languages/go/range-binding.js +2 -1
  66. package/dist/core/ingestion/languages/java/arity-metadata.d.ts +18 -0
  67. package/dist/core/ingestion/languages/java/arity-metadata.js +40 -0
  68. package/dist/core/ingestion/languages/java/arity.d.ts +10 -0
  69. package/dist/core/ingestion/languages/java/arity.js +24 -0
  70. package/dist/core/ingestion/languages/java/cache-stats.d.ts +15 -0
  71. package/dist/core/ingestion/languages/java/cache-stats.js +26 -0
  72. package/dist/core/ingestion/languages/java/captures.d.ts +17 -0
  73. package/dist/core/ingestion/languages/java/captures.js +187 -0
  74. package/dist/core/ingestion/languages/java/import-decomposer.d.ts +18 -0
  75. package/dist/core/ingestion/languages/java/import-decomposer.js +85 -0
  76. package/dist/core/ingestion/languages/java/import-target.d.ts +17 -0
  77. package/dist/core/ingestion/languages/java/import-target.js +100 -0
  78. package/dist/core/ingestion/languages/java/index.d.ts +29 -0
  79. package/dist/core/ingestion/languages/java/index.js +29 -0
  80. package/dist/core/ingestion/languages/java/interpret.d.ts +13 -0
  81. package/dist/core/ingestion/languages/java/interpret.js +131 -0
  82. package/dist/core/ingestion/languages/java/merge-bindings.d.ts +12 -0
  83. package/dist/core/ingestion/languages/java/merge-bindings.js +40 -0
  84. package/dist/core/ingestion/languages/java/query.d.ts +30 -0
  85. package/dist/core/ingestion/languages/java/query.js +192 -0
  86. package/dist/core/ingestion/languages/java/receiver-binding.d.ts +11 -0
  87. package/dist/core/ingestion/languages/java/receiver-binding.js +95 -0
  88. package/dist/core/ingestion/languages/java/scope-resolver.d.ts +50 -0
  89. package/dist/core/ingestion/languages/java/scope-resolver.js +74 -0
  90. package/dist/core/ingestion/languages/java/simple-hooks.d.ts +13 -0
  91. package/dist/core/ingestion/languages/java/simple-hooks.js +34 -0
  92. package/dist/core/ingestion/languages/java.js +11 -0
  93. package/dist/core/ingestion/languages/php/arity-metadata.d.ts +28 -0
  94. package/dist/core/ingestion/languages/php/arity-metadata.js +63 -0
  95. package/dist/core/ingestion/languages/php/arity.d.ts +25 -0
  96. package/dist/core/ingestion/languages/php/arity.js +40 -0
  97. package/dist/core/ingestion/languages/php/cache-stats.d.ts +15 -0
  98. package/dist/core/ingestion/languages/php/cache-stats.js +26 -0
  99. package/dist/core/ingestion/languages/php/captures.d.ts +34 -0
  100. package/dist/core/ingestion/languages/php/captures.js +739 -0
  101. package/dist/core/ingestion/languages/php/import-decomposer.d.ts +28 -0
  102. package/dist/core/ingestion/languages/php/import-decomposer.js +265 -0
  103. package/dist/core/ingestion/languages/php/import-target.d.ts +47 -0
  104. package/dist/core/ingestion/languages/php/import-target.js +100 -0
  105. package/dist/core/ingestion/languages/php/index.d.ts +68 -0
  106. package/dist/core/ingestion/languages/php/index.js +72 -0
  107. package/dist/core/ingestion/languages/php/interpret.d.ts +36 -0
  108. package/dist/core/ingestion/languages/php/interpret.js +241 -0
  109. package/dist/core/ingestion/languages/php/merge-bindings.d.ts +19 -0
  110. package/dist/core/ingestion/languages/php/merge-bindings.js +47 -0
  111. package/dist/core/ingestion/languages/php/namespace-siblings.d.ts +51 -0
  112. package/dist/core/ingestion/languages/php/namespace-siblings.js +288 -0
  113. package/dist/core/ingestion/languages/php/query.d.ts +32 -0
  114. package/dist/core/ingestion/languages/php/query.js +326 -0
  115. package/dist/core/ingestion/languages/php/receiver-binding.d.ts +36 -0
  116. package/dist/core/ingestion/languages/php/receiver-binding.js +128 -0
  117. package/dist/core/ingestion/languages/php/scope-resolver.d.ts +23 -0
  118. package/dist/core/ingestion/languages/php/scope-resolver.js +358 -0
  119. package/dist/core/ingestion/languages/php/simple-hooks.d.ts +42 -0
  120. package/dist/core/ingestion/languages/php/simple-hooks.js +111 -0
  121. package/dist/core/ingestion/languages/php.d.ts +0 -7
  122. package/dist/core/ingestion/languages/php.js +15 -0
  123. package/dist/core/ingestion/languages/python/captures.js +2 -1
  124. package/dist/core/ingestion/languages/typescript/captures.js +2 -1
  125. package/dist/core/ingestion/parsing-processor.d.ts +22 -2
  126. package/dist/core/ingestion/parsing-processor.js +85 -50
  127. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +5 -0
  128. package/dist/core/ingestion/pipeline-phases/parse-impl.js +119 -11
  129. package/dist/core/ingestion/pipeline-phases/parse.d.ts +14 -0
  130. package/dist/core/ingestion/pipeline.d.ts +13 -0
  131. package/dist/core/ingestion/registry-primary-flag.js +2 -0
  132. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +65 -0
  133. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.d.ts +1 -1
  134. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +12 -2
  135. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +5 -0
  136. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +25 -1
  137. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +79 -7
  138. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +7 -3
  139. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +24 -4
  140. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +21 -2
  141. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +13 -1
  142. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +6 -0
  143. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +17 -0
  144. package/dist/core/ingestion/scope-resolution/pipeline/run.js +31 -7
  145. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -1
  146. package/dist/core/ingestion/tree-sitter-queries.js +10 -0
  147. package/dist/core/ingestion/workers/parse-worker.js +2 -1
  148. package/dist/core/lbug/lbug-adapter.d.ts +26 -0
  149. package/dist/core/lbug/lbug-adapter.js +174 -40
  150. package/dist/core/lbug/pool-adapter.js +19 -2
  151. package/dist/core/run-analyze.d.ts +2 -0
  152. package/dist/core/run-analyze.js +323 -29
  153. package/dist/core/search/hybrid-search.d.ts +3 -0
  154. package/dist/core/search/hybrid-search.js +23 -6
  155. package/dist/core/tree-sitter/safe-parse.d.ts +6 -0
  156. package/dist/core/tree-sitter/safe-parse.js +32 -0
  157. package/dist/core/wiki/generator.js +4 -3
  158. package/dist/core/wiki/html-viewer.js +2 -1
  159. package/dist/core/wiki/llm-client.d.ts +4 -0
  160. package/dist/core/wiki/llm-client.js +3 -3
  161. package/dist/core/wiki/mermaid-sanitizer.d.ts +2 -0
  162. package/dist/core/wiki/mermaid-sanitizer.js +100 -0
  163. package/dist/mcp/local/local-backend.js +20 -7
  164. package/dist/server/git-clone.js +10 -13
  165. package/dist/storage/file-hash.d.ts +47 -0
  166. package/dist/storage/file-hash.js +86 -0
  167. package/dist/storage/git.d.ts +17 -6
  168. package/dist/storage/git.js +46 -12
  169. package/dist/storage/parse-cache.d.ts +67 -0
  170. package/dist/storage/parse-cache.js +182 -0
  171. package/dist/storage/repo-manager.d.ts +41 -1
  172. package/dist/storage/repo-manager.js +17 -2
  173. package/hooks/claude/gitnexus-hook.cjs +8 -1
  174. package/hooks/claude/hook-lock.cjs +119 -0
  175. package/package.json +1 -1
  176. package/scripts/build.js +6 -2
  177. package/web/assets/{agent-BpHQleHE.js → agent-D2kLt6Dl.js} +91 -91
  178. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +1 -0
  179. package/web/assets/architectureDiagram-UL44E2DR-DvIkEGkp.js +36 -0
  180. package/web/assets/blockDiagram-7IZFK4PR-B4niSLvR.js +132 -0
  181. package/web/assets/{c4Diagram-DFAF54RM-DeJV1rCn.js → c4Diagram-Y2BXMSZH-DIzEXalR.js} +6 -6
  182. package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +4 -0
  183. package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +1 -0
  184. package/web/assets/{chunk-7RZVMHOQ-BdIU-RGO.js → chunk-3SSMPTDK-BzGeeheI.js} +1 -1
  185. package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +159 -0
  186. package/web/assets/chunk-5IMINLNL-CnTLsXIV.js +1 -0
  187. package/web/assets/chunk-5VCL7Z4A-w1BCx98Z.js +1 -0
  188. package/web/assets/chunk-6764PJDD-ChwMM2z4.js +1 -0
  189. package/web/assets/chunk-67TQ5CYL-CChC2cAv.js +124 -0
  190. package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +10 -0
  191. package/web/assets/chunk-7W6UQGC5-CgFyfZ6k.js +1 -0
  192. package/web/assets/chunk-AQ6EADP3-CCFje6lL.js +1 -0
  193. package/web/assets/{chunk-KSICW3F5-C2tZmXwv.js → chunk-AZZRMDJM-5E9ARdDQ.js} +1 -1
  194. package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +1 -0
  195. package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +1 -0
  196. package/web/assets/chunk-INKRHTLW-ELpfuk9h.js +70 -0
  197. package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +1 -0
  198. package/web/assets/{chunk-AEOMTBSW-D7qjBMHW.js → chunk-JQRUD6KW-Dcq_Qnyy.js} +1 -1
  199. package/web/assets/chunk-KGFNY3KK-W-VR57xb.js +62 -0
  200. package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +1 -0
  201. package/web/assets/chunk-KNLZD3CH-BuZBOcso.js +1 -0
  202. package/web/assets/chunk-KRXBNO2N-DH2NPM7I.js +1 -0
  203. package/web/assets/chunk-LCXTWHL2-CqJ0oo1x.js +231 -0
  204. package/web/assets/chunk-LII3EMHJ-3X33tCpU.js +1 -0
  205. package/web/assets/chunk-QA3QBVWF-D5Ha3GgB.js +2 -0
  206. package/web/assets/chunk-RERM46MO-DQNbXtfw.js +1 -0
  207. package/web/assets/chunk-RG4AUYOV-D0M6vdq9.js +206 -0
  208. package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +1 -0
  209. package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +1 -0
  210. package/web/assets/chunk-T2UQINTJ-kGYG7ppP.js +1 -0
  211. package/web/assets/chunk-T5OCTHI4--9wWpVws.js +1 -0
  212. package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +1 -0
  213. package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +1 -0
  214. package/web/assets/chunk-UY5QBCOK-Du-c56gs.js +1 -0
  215. package/web/assets/chunk-W44A43WB-lrCpuupA.js +1 -0
  216. package/web/assets/chunk-ZXARS5L4-CSZRiyOf.js +1 -0
  217. package/web/assets/classDiagram-KGZ6W3CR-BB-saqC1.js +1 -0
  218. package/web/assets/classDiagram-v2-72OJOZXJ-Bp2bAlS5.js +1 -0
  219. package/web/assets/cose-bilkent-UX7MHV2Q-BHv2bbtl.js +1 -0
  220. package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +4 -0
  221. package/web/assets/diagram-3NCE3AQN-BUxnDPOY.js +43 -0
  222. package/web/assets/diagram-GF46GFSD-BJTyqqvI.js +24 -0
  223. package/web/assets/diagram-HNR7UZ2L-fUWreZzx.js +3 -0
  224. package/web/assets/diagram-QXG6HAR7-DilMHamP.js +24 -0
  225. package/web/assets/diagram-WEQXMOUZ-8KUrarg1.js +10 -0
  226. package/web/assets/erDiagram-L5TCEMPS-Doj9mSiW.js +85 -0
  227. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +1 -0
  228. package/web/assets/{flowDiagram-OTCZ4VVT-aAZw4c_M.js → flowDiagram-H6V6AXG4-BOSR-i3p.js} +12 -12
  229. package/web/assets/ganttDiagram-JCBTUEKG-BHQssTz6.js +292 -0
  230. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +1 -0
  231. package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +106 -0
  232. package/web/assets/index-j4-NuleT.js +623 -0
  233. package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +1 -0
  234. package/web/assets/infoDiagram-3YFTVSEB-Ce_TvtaV.js +2 -0
  235. package/web/assets/{ishikawaDiagram-YMYX4NHK-BF8AtDaj.js → ishikawaDiagram-BNXS4ZKH-4MXIDCSF.js} +6 -6
  236. package/web/assets/journeyDiagram-M6C3CM3L-DNPYCpvq.js +139 -0
  237. package/web/assets/kanban-definition-75IXJCU3-yYdfm8Kk.js +89 -0
  238. package/web/assets/{katex-GD7MH7QM-CJiOjBBJ.js → katex-K3KEBU37-CrVLz8l7.js} +1 -1
  239. package/web/assets/mindmap-definition-2TDM6QVE-DFNEKM77.js +96 -0
  240. package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +1 -0
  241. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +1 -0
  242. package/web/assets/pieDiagram-CU6KROY3-iZAqpvhd.js +30 -0
  243. package/web/assets/quadrantDiagram-VICAPDV7-bAm6Hi_5.js +7 -0
  244. package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +1 -0
  245. package/web/assets/requirementDiagram-JXO7QTGE-CtDijhnf.js +84 -0
  246. package/web/assets/sankeyDiagram-URQDO5SZ-LFJz53u5.js +40 -0
  247. package/web/assets/sequenceDiagram-VS2MUI6T-BdjvyCHM.js +162 -0
  248. package/web/assets/stateDiagram-7D4R322I-e5odN9fG.js +1 -0
  249. package/web/assets/stateDiagram-v2-36443NZ5-vPsvjR2D.js +1 -0
  250. package/web/assets/timeline-definition-O6YCAMPW-DPAksNQp.js +120 -0
  251. package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +1 -0
  252. package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +1 -0
  253. package/web/assets/vennDiagram-MWXL3ELB-Dtlfdt7J.js +34 -0
  254. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +1 -0
  255. package/web/assets/wardleyDiagram-CUQ6CDDI-B23uRMUC.js +78 -0
  256. package/web/assets/{xychartDiagram-ZHJ5623Y-DZ7fP1_3.js → xychartDiagram-N2JHSOCM-DxwHeksW.js} +6 -6
  257. package/web/index.html +13 -2
  258. package/web/assets/architecture-YZFGNWBL-S5CXDPWN-BUzkWgDl.js +0 -1
  259. package/web/assets/architectureDiagram-EMZXCZ2Q-CXbzok1G.js +0 -36
  260. package/web/assets/blockDiagram-IGV67L2C-DA1QJ4ZB.js +0 -132
  261. package/web/assets/chunk-3GS5O3IE-B8hpnia8.js +0 -231
  262. package/web/assets/chunk-3YCYZ6SJ-B-BVu21C.js +0 -1
  263. package/web/assets/chunk-6NTNNK5N-DW-jYSDr.js +0 -1
  264. package/web/assets/chunk-A34GCYZU-BbZl-IKy.js +0 -1
  265. package/web/assets/chunk-DJ7UZH7F-B5tMfF87.js +0 -1
  266. package/web/assets/chunk-DKKBVRCY-Djm-6K_e.js +0 -4
  267. package/web/assets/chunk-DU5LTGQ6-QPoynYcp.js +0 -1
  268. package/web/assets/chunk-FXACKDTF-jieSmbe2.js +0 -159
  269. package/web/assets/chunk-H3VCZNTA-8EMHZ3SV.js +0 -1
  270. package/web/assets/chunk-HN6EAY2L-CgE_agsD.js +0 -1
  271. package/web/assets/chunk-O5ABG6QK-DEZV1O19.js +0 -1
  272. package/web/assets/chunk-PK6DOVAG-BXv0JnsJ.js +0 -206
  273. package/web/assets/chunk-RNJOYNJ4-BiBkF9dN.js +0 -1
  274. package/web/assets/chunk-RWUO3TPN-DTWzAhQ1.js +0 -1
  275. package/web/assets/chunk-TBF5ZNIQ-BSl6s9lT.js +0 -1
  276. package/web/assets/chunk-TU3PZOEN-DE5Qhc0N.js +0 -1
  277. package/web/assets/chunk-TYMNRAUI-D1NDLIMG.js +0 -1
  278. package/web/assets/chunk-VELTKBKT-C9dVN39o.js +0 -1
  279. package/web/assets/chunk-W7ZLLLMY-Bu-cdLzs.js +0 -1
  280. package/web/assets/chunk-WSB5WSVC-Dor71SOz.js +0 -1
  281. package/web/assets/chunk-XGPFEOL4-CUonLRle.js +0 -1
  282. package/web/assets/classDiagram-PPOCWD7C-Cdd6UdVv.js +0 -1
  283. package/web/assets/classDiagram-v2-23LJLIIU-DNhxY2Ib.js +0 -1
  284. package/web/assets/cose-bilkent-PNC4W37J-DdZq7Qz_.js +0 -1
  285. package/web/assets/dagre-E77IOHMT-Cfj_6e17.js +0 -4
  286. package/web/assets/diagram-H7BISOXX-BNvpsrBv.js +0 -43
  287. package/web/assets/diagram-JC5VWROH-Cn0rtDbJ.js +0 -24
  288. package/web/assets/diagram-LXUTUG65-CHfoVKNm.js +0 -10
  289. package/web/assets/diagram-WEHSV5V5-BLxHksnu.js +0 -24
  290. package/web/assets/erDiagram-GCSMX5X6-DfdN6iqF.js +0 -85
  291. package/web/assets/ganttDiagram-MUNLMDZQ-BEfC_7Or.js +0 -292
  292. package/web/assets/gitGraph-7Q5UKJZL-54BCDZD5-B6ZeRLP0.js +0 -1
  293. package/web/assets/gitGraphDiagram-3HKGZ4G3-CG0kC8Q5.js +0 -106
  294. package/web/assets/index-3NUCUW2s.js +0 -886
  295. package/web/assets/info-OMHHGYJF-BF2H5H6G-BIOsZy0W.js +0 -1
  296. package/web/assets/infoDiagram-MN7RKWGX-DUoMH-pq.js +0 -2
  297. package/web/assets/journeyDiagram-SO5T7YLQ-BW8oKa3N.js +0 -139
  298. package/web/assets/kanban-definition-LJHFXRCJ-DzbOsR-2.js +0 -89
  299. package/web/assets/mindmap-definition-2EUWGEK5-BIXGQALq.js +0 -96
  300. package/web/assets/packet-4T2RLAQJ-EV4IVRXR-Bs7ysNMU.js +0 -1
  301. package/web/assets/pie-ZZUOXDRM-N23DN5KN-Csi8nnbH.js +0 -1
  302. package/web/assets/pieDiagram-3IATQBI2-QY-u7P6a.js +0 -30
  303. package/web/assets/quadrantDiagram-E256RVCF-Di4aNiU8.js +0 -7
  304. package/web/assets/radar-PYXPWWZC-P6TP7ZYP-DJlyXh2-.js +0 -1
  305. package/web/assets/requirementDiagram-M5DCFWZL-CzUUrhQD.js +0 -84
  306. package/web/assets/sankeyDiagram-L3NBLAOT-D2fbMiIU.js +0 -10
  307. package/web/assets/sequenceDiagram-ZOUHS735-BNdkqguh.js +0 -157
  308. package/web/assets/stateDiagram-MLPALWAM-51_Q2w2L.js +0 -1
  309. package/web/assets/stateDiagram-v2-B5LQ5ZB2-8nHs2aNE.js +0 -1
  310. package/web/assets/timeline-definition-5SPVSISX-DkMiGj4Z.js +0 -120
  311. package/web/assets/treeView-SZITEDCU-5DXDK3XO-Cy6P0_CZ.js +0 -1
  312. package/web/assets/treemap-W4RFUUIX-WYLRDWKO-C_pp1R7A.js +0 -1
  313. package/web/assets/vennDiagram-IE5QUKF5-BCxMmf9q.js +0 -34
  314. package/web/assets/wardley-RL74JXVD-BCRCBASE-CMStJhpn.js +0 -1
  315. package/web/assets/wardleyDiagram-XU3VSMPF-ijlLF77s.js +0 -20
  316. /package/web/assets/{context-builder-CqQNhRj1.js → context-builder-_HS0v2ma.js} +0 -0
@@ -36,10 +36,26 @@ export interface MethodDispatchIndex {
36
36
  readonly mroByOwnerDefId: ReadonlyMap<DefId, readonly DefId[]>;
37
37
  /** Interfaces / traits → classes that implement them. */
38
38
  readonly implsByInterfaceDefId: ReadonlyMap<DefId, readonly DefId[]>;
39
+ /**
40
+ * Optional parallel MRO view that EXCLUDES mixin-like augmentation
41
+ * (e.g., PHP traits). Populated only when the input supplies
42
+ * `computeExtendsOnlyMro`. Used by the super-branch dispatch in
43
+ * `receiver-bound-calls` so that `parent::method()` walks the
44
+ * inheritance chain only, not the trait-augmented one. Undefined for
45
+ * languages without mixin-like semantics — callers should fall back
46
+ * to `mroFor` when this is missing.
47
+ */
48
+ readonly extendsOnlyMroByOwnerDefId?: ReadonlyMap<DefId, readonly DefId[]>;
39
49
  /** `mroByOwnerDefId.get`, with an empty frozen array on miss. */
40
50
  mroFor(ownerDefId: DefId): readonly DefId[];
41
51
  /** `implsByInterfaceDefId.get`, with an empty frozen array on miss. */
42
52
  implementorsOf(interfaceDefId: DefId): readonly DefId[];
53
+ /**
54
+ * `extendsOnlyMroByOwnerDefId.get`, with an empty frozen array on miss.
55
+ * Undefined when `extendsOnlyMroByOwnerDefId` was not populated; callers
56
+ * should treat this as equivalent to `mroFor` for non-mixin languages.
57
+ */
58
+ readonly extendsOnlyMroFor?: (ownerDefId: DefId) => readonly DefId[];
43
59
  }
44
60
  export interface MethodDispatchInput {
45
61
  /**
@@ -75,6 +91,16 @@ export interface MethodDispatchInput {
75
91
  * write-wins policy and fires at most once per unique owner.
76
92
  */
77
93
  readonly implementsOf: (ownerDefId: DefId) => readonly DefId[];
94
+ /**
95
+ * Optional: return the EXTENDS-only ancestor chain for `ownerDefId`,
96
+ * excluding the owner itself AND any mixin-like augmentation (e.g.,
97
+ * PHP traits). Languages without mixin semantics leave this undefined
98
+ * and the index's `extendsOnlyMroByOwnerDefId` stays unpopulated.
99
+ *
100
+ * Same contract as `computeMro`: pure, deterministic, `[]` on no parents.
101
+ * Called at most once per unique owner (first-write-wins).
102
+ */
103
+ readonly computeExtendsOnlyMro?: (ownerDefId: DefId) => readonly DefId[];
78
104
  }
79
105
  export declare function buildMethodDispatchIndex(input: MethodDispatchInput): MethodDispatchIndex;
80
106
  //# sourceMappingURL=method-dispatch-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"method-dispatch-index.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAC/D,yDAAyD;IACzD,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAErE,iEAAiE;IACjE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IAC5C,uEAAuE;IACvE,cAAc,CAAC,cAAc,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC7D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CAChE;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAqCxF"}
1
+ {"version":3,"file":"method-dispatch-index.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAC/D,yDAAyD;IACzD,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IACrE;;;;;;;;OAQG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAE3E,iEAAiE;IACjE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IAC5C,uEAAuE;IACvE,cAAc,CAAC,cAAc,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC7D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC/D;;;;;;;;OAQG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CAC1E;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAgDxF"}
@@ -30,6 +30,9 @@
30
30
  // ─── Builder ────────────────────────────────────────────────────────────────
31
31
  export function buildMethodDispatchIndex(input) {
32
32
  const mroByOwnerDefId = new Map();
33
+ const extendsOnlyByOwnerDefId = input.computeExtendsOnlyMro
34
+ ? new Map()
35
+ : undefined;
33
36
  const implsBuilding = new Map();
34
37
  const implsSeen = new Map();
35
38
  for (const ownerId of input.owners) {
@@ -39,6 +42,12 @@ export function buildMethodDispatchIndex(input) {
39
42
  const chain = input.computeMro(ownerId);
40
43
  mroByOwnerDefId.set(ownerId, Object.freeze(chain.slice()));
41
44
  }
45
+ if (input.computeExtendsOnlyMro !== undefined &&
46
+ extendsOnlyByOwnerDefId !== undefined &&
47
+ !extendsOnlyByOwnerDefId.has(ownerId)) {
48
+ const extOnly = input.computeExtendsOnlyMro(ownerId);
49
+ extendsOnlyByOwnerDefId.set(ownerId, Object.freeze(extOnly.slice()));
50
+ }
42
51
  for (const ifaceId of input.implementsOf(ownerId)) {
43
52
  let seen = implsSeen.get(ifaceId);
44
53
  if (seen === undefined) {
@@ -60,12 +69,12 @@ export function buildMethodDispatchIndex(input) {
60
69
  for (const [ifaceId, owners] of implsBuilding) {
61
70
  implsByInterfaceDefId.set(ifaceId, Object.freeze(owners.slice()));
62
71
  }
63
- return wrapIndex(mroByOwnerDefId, implsByInterfaceDefId);
72
+ return wrapIndex(mroByOwnerDefId, implsByInterfaceDefId, extendsOnlyByOwnerDefId);
64
73
  }
65
74
  // ─── Internal ───────────────────────────────────────────────────────────────
66
75
  const EMPTY = Object.freeze([]);
67
- function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId) {
68
- return {
76
+ function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId, extendsOnlyMroByOwnerDefId) {
77
+ const base = {
69
78
  mroByOwnerDefId,
70
79
  implsByInterfaceDefId,
71
80
  mroFor(ownerDefId) {
@@ -75,5 +84,15 @@ function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId) {
75
84
  return implsByInterfaceDefId.get(interfaceDefId) ?? EMPTY;
76
85
  },
77
86
  };
87
+ if (extendsOnlyMroByOwnerDefId !== undefined) {
88
+ return {
89
+ ...base,
90
+ extendsOnlyMroByOwnerDefId,
91
+ extendsOnlyMroFor(ownerDefId) {
92
+ return extendsOnlyMroByOwnerDefId.get(ownerDefId) ?? EMPTY;
93
+ },
94
+ };
95
+ }
96
+ return base;
78
97
  }
79
98
  //# sourceMappingURL=method-dispatch-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"method-dispatch-index.js","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAyDH,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,GAAG,EAAS,CAAC;gBACxB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAElB,IAAI,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,GAAG,EAAE,CAAC;gBACZ,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9C,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAE/E,MAAM,KAAK,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElD,SAAS,SAAS,CAChB,eAA6C,EAC7C,qBAAmD;IAEnD,OAAO;QACL,eAAe;QACf,qBAAqB;QACrB,MAAM,CAAC,UAAiB;YACtB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC;QACD,cAAc,CAAC,cAAqB;YAClC,OAAO,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"method-dispatch-index.js","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAmFH,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3D,MAAM,uBAAuB,GAAG,KAAK,CAAC,qBAAqB;QACzD,CAAC,CAAC,IAAI,GAAG,EAA2B;QACpC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IACE,KAAK,CAAC,qBAAqB,KAAK,SAAS;YACzC,uBAAuB,KAAK,SAAS;YACrC,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,EACrC,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACrD,uBAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,GAAG,EAAS,CAAC;gBACxB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAElB,IAAI,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,GAAG,EAAE,CAAC;gBACZ,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9C,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC,eAAe,EAAE,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AACpF,CAAC;AAED,+EAA+E;AAE/E,MAAM,KAAK,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElD,SAAS,SAAS,CAChB,eAA6C,EAC7C,qBAAmD,EACnD,0BAAoE;IAEpE,MAAM,IAAI,GAAwB;QAChC,eAAe;QACf,qBAAqB;QACrB,MAAM,CAAC,UAAiB;YACtB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC;QACD,cAAc,CAAC,cAAqB;YAClC,OAAO,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC5D,CAAC;KACF,CAAC;IACF,IAAI,0BAA0B,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO;YACL,GAAG,IAAI;YACP,0BAA0B;YAC1B,iBAAiB,CAAC,UAAiB;gBACjC,OAAO,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;YAC7D,CAAC;SACF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -299,14 +299,31 @@ function applyArityFilter(callsite, perCandidate, ctx) {
299
299
  return;
300
300
  }
301
301
  let anyCompatible = false;
302
+ let anyUnknown = false;
302
303
  for (const state of perCandidate.values()) {
303
304
  const verdict = arityFn(callsite, state.def);
304
305
  state.signals.arityVerdict = verdict;
305
306
  if (verdict === 'compatible')
306
307
  anyCompatible = true;
308
+ else if (verdict === 'unknown')
309
+ anyUnknown = true;
307
310
  }
308
- if (!anyCompatible)
311
+ // When ALL candidates are 'incompatible' (none compatible, none unknown),
312
+ // the call is genuinely arity-broken — drop every candidate so the
313
+ // registry returns no resolution. This matches the PHP variadic case
314
+ // f(int $req, ...$rest) called with zero args: every candidate definitively
315
+ // rejects, and emitting an edge to a definitively-rejected callable is
316
+ // a false positive. When some candidates are 'unknown' (missing metadata),
317
+ // keep the set so downstream evidence can break the tie — that's the
318
+ // original safety-fallback behavior.
319
+ if (!anyCompatible) {
320
+ if (!anyUnknown) {
321
+ for (const defId of perCandidate.keys()) {
322
+ perCandidate.delete(defId);
323
+ }
324
+ }
309
325
  return;
326
+ }
310
327
  // Filter: when at least one compatible candidate exists, drop incompatibles.
311
328
  for (const [defId, state] of perCandidate) {
312
329
  if (state.signals.arityVerdict === 'incompatible') {
@@ -1 +1 @@
1
- {"version":3,"file":"lookup-core.js","sourceRoot":"","sources":["../../../src/scope-resolution/registries/lookup-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lookup-core.js","sourceRoot":"","sources":["../../../src/scope-resolution/registries/lookup-core.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ interface RepoStats {
17
17
  export interface AIContextOptions {
18
18
  skipAgentsMd?: boolean;
19
19
  noStats?: boolean;
20
+ skipSkills?: boolean;
20
21
  }
21
22
  /**
22
23
  * Generate AI context files after indexing
@@ -68,20 +68,31 @@ async function findGroupsContainingRegistryName(registryName) {
68
68
  }
69
69
  return hits;
70
70
  }
71
- function generateGitNexusContent(projectName, stats, generatedSkills, groupNames, noStats) {
71
+ function generateGitNexusContent(projectName, stats, generatedSkills, groupNames, noStats, skipSkills) {
72
72
  const generatedRows = generatedSkills && generatedSkills.length > 0
73
73
  ? generatedSkills
74
74
  .map((s) => `| Work in the ${s.label} area (${s.symbolCount} symbols) | \`.claude/skills/generated/${s.name}/SKILL.md\` |`)
75
75
  .join('\n')
76
76
  : '';
77
- const skillsTable = `| Task | Read this skill file |
78
- |------|---------------------|
79
- | Understand architecture / "How does X work?" | \`.claude/skills/gitnexus/gitnexus-exploring/SKILL.md\` |
77
+ // Standard skill rows reference files installed by installSkills(). When
78
+ // --skip-skills suppresses that install, these rows must be omitted — else
79
+ // AGENTS.md/CLAUDE.md would direct agents to read files that don't exist.
80
+ // Community skills (generatedRows) live in .claude/skills/generated/ and
81
+ // are independent of --skip-skills, so they remain when present.
82
+ const standardSkillsRows = skipSkills
83
+ ? ''
84
+ : `| Understand architecture / "How does X work?" | \`.claude/skills/gitnexus/gitnexus-exploring/SKILL.md\` |
80
85
  | Blast radius / "What breaks if I change X?" | \`.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md\` |
81
86
  | Trace bugs / "Why is X failing?" | \`.claude/skills/gitnexus/gitnexus-debugging/SKILL.md\` |
82
87
  | Rename / extract / split / refactor | \`.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md\` |
83
88
  | Tools, resources, schema reference | \`.claude/skills/gitnexus/gitnexus-guide/SKILL.md\` |
84
- | Index, status, clean, wiki CLI commands | \`.claude/skills/gitnexus/gitnexus-cli/SKILL.md\` |${generatedRows ? '\n' + generatedRows : ''}`;
89
+ | Index, status, clean, wiki CLI commands | \`.claude/skills/gitnexus/gitnexus-cli/SKILL.md\` |`;
90
+ const tableBody = [standardSkillsRows, generatedRows].filter(Boolean).join('\n');
91
+ const skillsTable = tableBody
92
+ ? `| Task | Read this skill file |
93
+ |------|---------------------|
94
+ ${tableBody}`
95
+ : '';
85
96
  return `${GITNEXUS_START_MARKER}
86
97
  # GitNexus — Code Intelligence
87
98
 
@@ -119,11 +130,13 @@ ${groupNames && groupNames.length > 0
119
130
  This repository is listed under GitNexus **group(s): ${groupNames.join(', ')}** (see \`~/.gitnexus/groups/\`). For cross-repo analysis, use MCP tools \`impact\`, \`query\`, and \`context\` with \`repo\` set to \`@<groupName>\` or \`@<groupName>/<memberPath>\` (paths match keys in that group’s \`group.yaml\`). Use \`group_list\` / \`group_sync\` for membership and sync. From the terminal: \`npx gitnexus group list\`, \`npx gitnexus group sync <name>\`, \`npx gitnexus group impact <name> --target <symbol> --repo <group-path>\`.
120
131
 
121
132
  `
122
- : ''}## CLI
133
+ : ''}${skillsTable
134
+ ? `## CLI
123
135
 
124
136
  ${skillsTable}
125
137
 
126
- ${GITNEXUS_END_MARKER}`;
138
+ `
139
+ : ''}${GITNEXUS_END_MARKER}`;
127
140
  }
128
141
  /**
129
142
  * Check if a file exists
@@ -143,7 +156,7 @@ async function fileExists(filePath) {
143
156
  * - If file exists without GitNexus section: append
144
157
  * - If file exists with GitNexus section: replace that section
145
158
  */
146
- async function upsertGitNexusSection(filePath, content) {
159
+ async function upsertGitNexusSection(filePath, content, projectName, stats) {
147
160
  const exists = await fileExists(filePath);
148
161
  if (!exists) {
149
162
  await fs.writeFile(filePath, content, 'utf-8');
@@ -159,7 +172,43 @@ async function upsertGitNexusSection(filePath, content) {
159
172
  const startIdx = findSectionMarkerIndex(existingContent, GITNEXUS_START_MARKER);
160
173
  const endIdx = findSectionMarkerIndex(existingContent, GITNEXUS_END_MARKER, startIdx === -1 ? 0 : startIdx);
161
174
  if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
162
- // Replace existing section
175
+ const existingSection = existingContent.substring(startIdx, endIdx + GITNEXUS_END_MARKER.length);
176
+ // If the existing section contains <!-- gitnexus:keep -->, preserve the user's
177
+ // custom layout and only update the stats line (node/edge/flow counts).
178
+ // This lets teams trim the verbose default template to a lean format without
179
+ // having it overwritten on every `gitnexus analyze`.
180
+ //
181
+ // Note: the keep-marker check operates on `existingSection` (the substring
182
+ // between valid section markers identified by findSectionMarkerIndex), so
183
+ // a keep marker in user prose OUTSIDE the GitNexus block has no effect.
184
+ if (existingSection.includes('<!-- gitnexus:keep -->')) {
185
+ // Build the new stats line from the caller-provided values directly.
186
+ // We do NOT re-extract from `content` because:
187
+ // (a) first-bold extraction is fragile if the template evolves
188
+ // (b) the parenthesized-text fallback can match unrelated tuples
189
+ // like `({target: "symbolName", direction: "upstream"})`
190
+ // when noStats is set
191
+ // Passing projectName + stats explicitly makes the contract obvious.
192
+ // noStats controls template generation, not keep-section stat updates — the user opted into a stats line by keeping it.
193
+ const newStatsInner = `${stats.nodes || 0} symbols, ${stats.edges || 0} relationships, ${stats.processes || 0} execution flows`;
194
+ const statsLine = `Indexed as **${projectName}** (${newStatsInner})`;
195
+ // Match either canonical phrasing at line start (`^` with `m` flag) so we
196
+ // cannot replace prose embedded mid-paragraph. Deliberately no `$`: text
197
+ // after the closing `)` on the same line (e.g. ". MCP tools.") stays intact.
198
+ const statsPattern = /^(?:Indexed as|indexed by GitNexus as) \*\*[^*]+\*\* \([^)]+\)/m;
199
+ if (statsPattern.test(existingSection)) {
200
+ const updatedSection = existingSection.replace(statsPattern, statsLine);
201
+ const before = existingContent.substring(0, startIdx);
202
+ const after = existingContent.substring(endIdx + GITNEXUS_END_MARKER.length);
203
+ await fs.writeFile(filePath, (before + updatedSection + after).trim() + '\n', 'utf-8');
204
+ return 'updated';
205
+ }
206
+ // Keep marker present but no stats line matched. Section is preserved
207
+ // unchanged on disk; return a distinct status so callers/CLI output
208
+ // don't mis-report this as 'updated' (which would imply a write).
209
+ return 'preserved';
210
+ }
211
+ // No keep marker — replace existing section with full verbose content
163
212
  const before = existingContent.substring(0, startIdx);
164
213
  const after = existingContent.substring(endIdx + GITNEXUS_END_MARKER.length);
165
214
  const newContent = before + content + after;
@@ -246,26 +295,31 @@ Use GitNexus tools to accomplish this task.
246
295
  */
247
296
  export async function generateAIContextFiles(repoPath, _storagePath, projectName, stats, generatedSkills, options) {
248
297
  const groupNames = await findGroupsContainingRegistryName(projectName);
249
- const content = generateGitNexusContent(projectName, stats, generatedSkills, groupNames, options?.noStats);
298
+ const content = generateGitNexusContent(projectName, stats, generatedSkills, groupNames, options?.noStats, options?.skipSkills);
250
299
  const createdFiles = [];
251
300
  if (!options?.skipAgentsMd) {
252
301
  // Create AGENTS.md (standard for Cursor, Windsurf, OpenCode, Cline, etc.)
253
302
  const agentsPath = path.join(repoPath, 'AGENTS.md');
254
- const agentsResult = await upsertGitNexusSection(agentsPath, content);
303
+ const agentsResult = await upsertGitNexusSection(agentsPath, content, projectName, stats);
255
304
  createdFiles.push(`AGENTS.md (${agentsResult})`);
256
305
  // Create CLAUDE.md (for Claude Code)
257
306
  const claudePath = path.join(repoPath, 'CLAUDE.md');
258
- const claudeResult = await upsertGitNexusSection(claudePath, content);
307
+ const claudeResult = await upsertGitNexusSection(claudePath, content, projectName, stats);
259
308
  createdFiles.push(`CLAUDE.md (${claudeResult})`);
260
309
  }
261
310
  else {
262
311
  createdFiles.push('AGENTS.md (skipped via --skip-agents-md)');
263
312
  createdFiles.push('CLAUDE.md (skipped via --skip-agents-md)');
264
313
  }
265
- // Install skills to .claude/skills/gitnexus/
266
- const installedSkills = await installSkills(repoPath);
267
- if (installedSkills.length > 0) {
268
- createdFiles.push(`.claude/skills/gitnexus/ (${installedSkills.length} skills)`);
314
+ // Install skills to .claude/skills/gitnexus/ (unless --skip-skills)
315
+ if (!options?.skipSkills) {
316
+ const installedSkills = await installSkills(repoPath);
317
+ if (installedSkills.length > 0) {
318
+ createdFiles.push(`.claude/skills/gitnexus/ (${installedSkills.length} skills)`);
319
+ }
320
+ }
321
+ else {
322
+ createdFiles.push('.claude/skills/gitnexus/ (skipped via --skip-skills)');
269
323
  }
270
324
  return { files: createdFiles };
271
325
  }
@@ -29,6 +29,10 @@ export interface AnalyzeOptions {
29
29
  skipAgentsMd?: boolean;
30
30
  /** Omit volatile symbol/relationship counts from AGENTS.md and CLAUDE.md. */
31
31
  noStats?: boolean;
32
+ /** Skip installing standard GitNexus skill files to .claude/skills/gitnexus/. */
33
+ skipSkills?: boolean;
34
+ /** Pure index mode: skip all file injection (AGENTS.md, CLAUDE.md, skills). */
35
+ indexOnly?: boolean;
32
36
  /** Index the folder even when no .git directory is present. */
33
37
  skipGit?: boolean;
34
38
  /**
@@ -59,4 +63,18 @@ export interface AnalyzeOptions {
59
63
  embeddingSubBatchSize?: string;
60
64
  embeddingDevice?: string;
61
65
  }
66
+ /**
67
+ * Whether the post-index skill step should run.
68
+ *
69
+ * The gated block does two things in sequence: (1) generates the community
70
+ * skill files from `--skills`, and (2) re-runs `generateAIContextFiles` so
71
+ * AGENTS.md/CLAUDE.md can reference the freshly written skills. Both are
72
+ * suppressed together — `--index-only` drops the entire step, not just the
73
+ * community-skill write. Name retained for the test contract; see call site
74
+ * in `analyzeCommand` for the AGENTS.md/CLAUDE.md re-generation it also gates.
75
+ *
76
+ * Kept as a pure helper so the `--index-only --skills` contract is unit-tested
77
+ * without booting the full analyze pipeline (#742 review).
78
+ */
79
+ export declare const shouldGenerateCommunitySkillFiles: (options: Pick<AnalyzeOptions, "skills" | "indexOnly"> | undefined, pipelineResult: unknown) => boolean;
62
80
  export declare const analyzeCommand: (inputPath?: string, options?: AnalyzeOptions) => Promise<void>;
@@ -86,6 +86,20 @@ function ensureHeap() {
86
86
  }
87
87
  return true;
88
88
  }
89
+ /**
90
+ * Whether the post-index skill step should run.
91
+ *
92
+ * The gated block does two things in sequence: (1) generates the community
93
+ * skill files from `--skills`, and (2) re-runs `generateAIContextFiles` so
94
+ * AGENTS.md/CLAUDE.md can reference the freshly written skills. Both are
95
+ * suppressed together — `--index-only` drops the entire step, not just the
96
+ * community-skill write. Name retained for the test contract; see call site
97
+ * in `analyzeCommand` for the AGENTS.md/CLAUDE.md re-generation it also gates.
98
+ *
99
+ * Kept as a pure helper so the `--index-only --skills` contract is unit-tested
100
+ * without booting the full analyze pipeline (#742 review).
101
+ */
102
+ export const shouldGenerateCommunitySkillFiles = (options, pipelineResult) => Boolean(options?.skills && pipelineResult && !options?.indexOnly);
89
103
  export const analyzeCommand = async (inputPath, options) => {
90
104
  if (ensureHeap())
91
105
  return;
@@ -151,6 +165,15 @@ export const analyzeCommand = async (inputPath, options) => {
151
165
  process.env.GITNEXUS_EMBEDDING_DEVICE = options.embeddingDevice;
152
166
  }
153
167
  console.log('\n GitNexus Analyzer\n');
168
+ // `--index-only` is the stronger contract — it suppresses every form of file
169
+ // injection, including community skill writes that `--skills` would normally
170
+ // produce. Surface the override explicitly so users don't wonder why a
171
+ // pipeline re-index ran but no skill files appeared. The pipeline still
172
+ // re-runs (see `force: options?.force || options?.skills` below); the warning
173
+ // is purely about the dropped post-index write step.
174
+ if (options?.indexOnly && options?.skills) {
175
+ console.log(' Note: --index-only overrides --skills; community skill files will not be written.\n');
176
+ }
154
177
  let repoPath;
155
178
  if (inputPath) {
156
179
  repoPath = path.resolve(inputPath);
@@ -285,6 +308,9 @@ export const analyzeCommand = async (inputPath, options) => {
285
308
  const t0 = Date.now();
286
309
  // ── Run shared analysis orchestrator ───────────────────────────────
287
310
  try {
311
+ const skipAll = options?.indexOnly;
312
+ const skipAgentsMd = skipAll || options?.skipAgentsMd;
313
+ const skipSkills = skipAll || options?.skipSkills;
288
314
  const result = await runFullAnalysis(repoPath, {
289
315
  // Pipeline re-index — OR'd with --skills because skill generation
290
316
  // needs a fresh pipelineResult. Has no bearing on the registry
@@ -294,7 +320,8 @@ export const analyzeCommand = async (inputPath, options) => {
294
320
  embeddingsNodeLimit,
295
321
  dropEmbeddings: options?.dropEmbeddings,
296
322
  skipGit: options?.skipGit,
297
- skipAgentsMd: options?.skipAgentsMd,
323
+ skipAgentsMd,
324
+ skipSkills,
298
325
  noStats: options?.noStats,
299
326
  registryName: options?.name,
300
327
  // Registry-collision bypass — its own CLI flag, intentionally NOT
@@ -335,8 +362,10 @@ export const analyzeCommand = async (inputPath, options) => {
335
362
  // exit code and an actionable error instead of being mistaken for
336
363
  // a healthy index.
337
364
  await assertAnalysisFinalized(repoPath);
338
- // Skill generation (CLI-only, uses pipeline result from analysis)
339
- if (options?.skills && result.pipelineResult) {
365
+ // Skill generation (CLI-only, uses pipeline result from analysis).
366
+ // Gated so `--index-only --skills` skips community skill writes too
367
+ // (`shouldGenerateCommunitySkillFiles` — see unit test).
368
+ if (shouldGenerateCommunitySkillFiles(options, result.pipelineResult)) {
340
369
  updateBar(99, 'Generating skill files...');
341
370
  try {
342
371
  const { generateSkillFiles } = await import('./skill-gen.js');
@@ -364,7 +393,7 @@ export const analyzeCommand = async (inputPath, options) => {
364
393
  communities: s.communities,
365
394
  clusters: aggregatedClusterCount,
366
395
  processes: s.processes,
367
- }, skillResult.skills, { skipAgentsMd: options?.skipAgentsMd, noStats: options?.noStats });
396
+ }, skillResult.skills, { skipAgentsMd, skipSkills, noStats: options?.noStats });
368
397
  }
369
398
  }
370
399
  catch {
package/dist/cli/index.js CHANGED
@@ -21,9 +21,14 @@ program
21
21
  'Optional [limit] overrides the 50,000-node safety cap; pass 0 to disable the cap entirely.')
22
22
  .option('--drop-embeddings', 'Drop existing embeddings on rebuild. By default, an `analyze` without `--embeddings` ' +
23
23
  'preserves any embeddings already present in the index.')
24
- .option('--skills', 'Generate repo-specific skill files from detected communities')
24
+ .option('--skills', 'Generate repo-specific skill files from detected communities ' +
25
+ '(no-op when --index-only is also set).')
25
26
  .option('--skip-agents-md', 'Skip updating the gitnexus section in AGENTS.md and CLAUDE.md')
26
27
  .option('--no-stats', 'Omit volatile file/symbol counts from AGENTS.md and CLAUDE.md')
28
+ .option('--skip-skills', 'Skip installing standard GitNexus skill files under .claude/skills/gitnexus/. ' +
29
+ 'Does not suppress community skills from --skills (those use .claude/skills/generated/). ' +
30
+ 'Use --index-only to skip all AI-context file injection.')
31
+ .option('--index-only', 'Pure index mode: skip all file injection (AGENTS.md, CLAUDE.md, skills)')
27
32
  .option('--skip-git', 'Treat the provided path/cwd as the index root and skip parent git-root discovery')
28
33
  .option('--name <alias>', 'Register this repo under a custom name in ~/.gitnexus/registry.json ' +
29
34
  '(disambiguates repos whose paths share a basename, e.g. two different .../app folders)')
@@ -98,6 +103,8 @@ program
98
103
  .option('--reasoning-model', 'Mark deployment as reasoning model (o1/o3/o4-mini) — strips temperature, uses max_completion_tokens')
99
104
  .option('--no-reasoning-model', 'Disable reasoning model mode (overrides saved config)')
100
105
  .option('--concurrency <n>', 'Parallel LLM calls (default: 3)', '3')
106
+ .option('--timeout <seconds>', 'Per-attempt LLM request timeout in seconds (default: 60)')
107
+ .option('--retries <n>', 'Max LLM retry attempts per request (default: 3)')
101
108
  .option('--gist', 'Publish wiki as a public GitHub Gist after generation')
102
109
  .option('-v, --verbose', 'Enable verbose output (show LLM commands and responses)')
103
110
  .option('--review', 'Stop after grouping to review module structure before generating pages')
package/dist/cli/setup.js CHANGED
@@ -308,6 +308,12 @@ async function installClaudeCodeHooks(result) {
308
308
  catch {
309
309
  // Script not found in source — skip
310
310
  }
311
+ try {
312
+ await fs.copyFile(path.join(pluginHooksPath, 'hook-lock.cjs'), path.join(destHooksDir, 'hook-lock.cjs'));
313
+ }
314
+ catch {
315
+ // Helper not found in source — skip
316
+ }
311
317
  const hookPath = path.join(destHooksDir, 'gitnexus-hook.cjs').replace(/\\/g, '/');
312
318
  // Escape backslashes FIRST, then quotes (CodeQL js/incomplete-sanitization).
313
319
  // The previous shape `replace(/"/g, '\\"')` alone would let `path\with"quote`
@@ -17,5 +17,7 @@ export interface WikiCommandOptions {
17
17
  provider?: LLMProvider;
18
18
  verbose?: boolean;
19
19
  review?: boolean;
20
+ timeout?: string;
21
+ retries?: string;
20
22
  }
21
23
  export declare const wikiCommand: (inputPath?: string, options?: WikiCommandOptions) => Promise<void>;
package/dist/cli/wiki.js CHANGED
@@ -304,6 +304,17 @@ export const wikiCommand = async (inputPath, options) => {
304
304
  }
305
305
  }
306
306
  }
307
+ // ── Apply per-run overrides not saved to config ────────────────────
308
+ if (options?.timeout) {
309
+ const secs = parseInt(options.timeout, 10);
310
+ if (!isNaN(secs) && secs > 0)
311
+ llmConfig.requestTimeoutMs = secs * 1000;
312
+ }
313
+ if (options?.retries) {
314
+ const n = parseInt(options.retries, 10);
315
+ if (!isNaN(n) && n > 0)
316
+ llmConfig.maxAttempts = n;
317
+ }
307
318
  // ── Setup progress bar with elapsed timer ──────────────────────────
308
319
  const bar = new cliProgress.SingleBar({
309
320
  format: ' {bar} {percentage}% | {phase}',
@@ -76,6 +76,9 @@ async function findRepoForCwd(cwd) {
76
76
  export async function augment(pattern, cwd) {
77
77
  if (!pattern || pattern.length < 3)
78
78
  return '';
79
+ const patternFirstWord = pattern.trim().replace(/'/g, "''").split(/\s+/)[0];
80
+ if (!patternFirstWord || patternFirstWord.length < 2)
81
+ return '';
79
82
  const workDir = cwd || process.cwd();
80
83
  try {
81
84
  const repo = await findRepoForCwd(workDir);
@@ -90,9 +93,7 @@ export async function augment(pattern, cwd) {
90
93
  await initLbug(repoId, repo.lbugPath);
91
94
  }
92
95
  // Step 1: BM25 search (fast, no embeddings)
93
- const { results: bm25Results } = await searchFTSFromLbug(pattern, 10, repoId);
94
- if (bm25Results.length === 0)
95
- return '';
96
+ const { results: bm25Results, ftsAvailable } = await searchFTSFromLbug(pattern, 10, repoId);
96
97
  // Step 2: Map BM25 file results to symbols
97
98
  const symbolMatches = [];
98
99
  for (const result of bm25Results.slice(0, 5)) {
@@ -100,7 +101,7 @@ export async function augment(pattern, cwd) {
100
101
  try {
101
102
  const symbols = await executeQuery(repoId, `
102
103
  MATCH (n) WHERE n.filePath = '${escaped}'
103
- AND n.name CONTAINS '${pattern.replace(/'/g, "''").split(/\s+/)[0]}'
104
+ AND n.name CONTAINS '${patternFirstWord}'
104
105
  RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath
105
106
  LIMIT 3
106
107
  `);
@@ -118,6 +119,25 @@ export async function augment(pattern, cwd) {
118
119
  /* skip */
119
120
  }
120
121
  }
122
+ // When FTS indexes are unavailable (read-only DB, first run before indexes are built),
123
+ // fall back to a direct name CONTAINS query so enrichment still works.
124
+ if (symbolMatches.length === 0 && !ftsAvailable) {
125
+ const fallbackRows = await executeQuery(repoId, `
126
+ MATCH (n)
127
+ WHERE n.name CONTAINS '${patternFirstWord}'
128
+ RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath
129
+ LIMIT 5
130
+ `).catch(() => []);
131
+ for (const sym of fallbackRows) {
132
+ symbolMatches.push({
133
+ nodeId: sym.id || sym[0],
134
+ name: sym.name || sym[1],
135
+ type: sym.type || sym[2],
136
+ filePath: sym.filePath || sym[3],
137
+ score: 1.0,
138
+ });
139
+ }
140
+ }
121
141
  if (symbolMatches.length === 0)
122
142
  return '';
123
143
  // Step 3: Batch-fetch callers/callees/processes/cohesion for top matches
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { getLanguageFromFilename } from '../../_shared/index.js';
7
7
  import { createParserForLanguage, isLanguageAvailable, resolveLanguageKey, } from '../tree-sitter/parser-loader.js';
8
+ import { parseSourceSafe } from '../tree-sitter/safe-parse.js';
8
9
  const parserCache = new Map();
9
10
  /**
10
11
  * Ensure parser is initialized and language is loaded, then parse content.
@@ -22,7 +23,7 @@ export const ensureAndParse = async (content, filePath) => {
22
23
  parserInstance = await createParserForLanguage(language, filePath);
23
24
  parserCache.set(parserKey, parserInstance);
24
25
  }
25
- return parserInstance.parse(content);
26
+ return parseSourceSafe(parserInstance, content);
26
27
  };
27
28
  const FUNCTION_LIKE_TYPES = new Set([
28
29
  'function_declaration',