@codragraph/cli 1.6.2

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 (909) hide show
  1. package/README.md +341 -0
  2. package/dist/_shared/graph/types.d.ts +81 -0
  3. package/dist/_shared/graph/types.d.ts.map +1 -0
  4. package/dist/_shared/graph/types.js +8 -0
  5. package/dist/_shared/graph/types.js.map +1 -0
  6. package/dist/_shared/index.d.ts +55 -0
  7. package/dist/_shared/index.d.ts.map +1 -0
  8. package/dist/_shared/index.js +39 -0
  9. package/dist/_shared/index.js.map +1 -0
  10. package/dist/_shared/language-detection.d.ts +23 -0
  11. package/dist/_shared/language-detection.d.ts.map +1 -0
  12. package/dist/_shared/language-detection.js +139 -0
  13. package/dist/_shared/language-detection.js.map +1 -0
  14. package/dist/_shared/languages.d.ts +26 -0
  15. package/dist/_shared/languages.d.ts.map +1 -0
  16. package/dist/_shared/languages.js +27 -0
  17. package/dist/_shared/languages.js.map +1 -0
  18. package/dist/_shared/lbug/schema-constants.d.ts +16 -0
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -0
  20. package/dist/_shared/lbug/schema-constants.js +67 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -0
  22. package/dist/_shared/mro-strategy.d.ts +41 -0
  23. package/dist/_shared/mro-strategy.d.ts.map +1 -0
  24. package/dist/_shared/mro-strategy.js +2 -0
  25. package/dist/_shared/mro-strategy.js.map +1 -0
  26. package/dist/_shared/pipeline.d.ts +16 -0
  27. package/dist/_shared/pipeline.d.ts.map +1 -0
  28. package/dist/_shared/pipeline.js +5 -0
  29. package/dist/_shared/pipeline.js.map +1 -0
  30. package/dist/_shared/scope-resolution/def-index.d.ts +36 -0
  31. package/dist/_shared/scope-resolution/def-index.d.ts.map +1 -0
  32. package/dist/_shared/scope-resolution/def-index.js +51 -0
  33. package/dist/_shared/scope-resolution/def-index.js.map +1 -0
  34. package/dist/_shared/scope-resolution/evidence-weights.d.ts +69 -0
  35. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -0
  36. package/dist/_shared/scope-resolution/evidence-weights.js +84 -0
  37. package/dist/_shared/scope-resolution/evidence-weights.js.map +1 -0
  38. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +139 -0
  39. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -0
  40. package/dist/_shared/scope-resolution/finalize-algorithm.js +479 -0
  41. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -0
  42. package/dist/_shared/scope-resolution/language-classification.d.ts +26 -0
  43. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -0
  44. package/dist/_shared/scope-resolution/language-classification.js +44 -0
  45. package/dist/_shared/scope-resolution/language-classification.js.map +1 -0
  46. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts +80 -0
  47. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts.map +1 -0
  48. package/dist/_shared/scope-resolution/method-dispatch-index.js +79 -0
  49. package/dist/_shared/scope-resolution/method-dispatch-index.js.map +1 -0
  50. package/dist/_shared/scope-resolution/module-scope-index.d.ts +46 -0
  51. package/dist/_shared/scope-resolution/module-scope-index.d.ts.map +1 -0
  52. package/dist/_shared/scope-resolution/module-scope-index.js +58 -0
  53. package/dist/_shared/scope-resolution/module-scope-index.js.map +1 -0
  54. package/dist/_shared/scope-resolution/origin-priority.d.ts +14 -0
  55. package/dist/_shared/scope-resolution/origin-priority.d.ts.map +1 -0
  56. package/dist/_shared/scope-resolution/origin-priority.js +21 -0
  57. package/dist/_shared/scope-resolution/origin-priority.js.map +1 -0
  58. package/dist/_shared/scope-resolution/parsed-file.d.ts +76 -0
  59. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -0
  60. package/dist/_shared/scope-resolution/parsed-file.js +54 -0
  61. package/dist/_shared/scope-resolution/parsed-file.js.map +1 -0
  62. package/dist/_shared/scope-resolution/position-index.d.ts +62 -0
  63. package/dist/_shared/scope-resolution/position-index.d.ts.map +1 -0
  64. package/dist/_shared/scope-resolution/position-index.js +134 -0
  65. package/dist/_shared/scope-resolution/position-index.js.map +1 -0
  66. package/dist/_shared/scope-resolution/qualified-name-index.d.ts +44 -0
  67. package/dist/_shared/scope-resolution/qualified-name-index.d.ts.map +1 -0
  68. package/dist/_shared/scope-resolution/qualified-name-index.js +75 -0
  69. package/dist/_shared/scope-resolution/qualified-name-index.js.map +1 -0
  70. package/dist/_shared/scope-resolution/reference-site.d.ts +75 -0
  71. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -0
  72. package/dist/_shared/scope-resolution/reference-site.js +24 -0
  73. package/dist/_shared/scope-resolution/reference-site.js.map +1 -0
  74. package/dist/_shared/scope-resolution/registries/class-registry.d.ts +27 -0
  75. package/dist/_shared/scope-resolution/registries/class-registry.d.ts.map +1 -0
  76. package/dist/_shared/scope-resolution/registries/class-registry.js +30 -0
  77. package/dist/_shared/scope-resolution/registries/class-registry.js.map +1 -0
  78. package/dist/_shared/scope-resolution/registries/context.d.ts +69 -0
  79. package/dist/_shared/scope-resolution/registries/context.d.ts.map +1 -0
  80. package/dist/_shared/scope-resolution/registries/context.js +44 -0
  81. package/dist/_shared/scope-resolution/registries/context.js.map +1 -0
  82. package/dist/_shared/scope-resolution/registries/evidence.d.ts +56 -0
  83. package/dist/_shared/scope-resolution/registries/evidence.d.ts.map +1 -0
  84. package/dist/_shared/scope-resolution/registries/evidence.js +150 -0
  85. package/dist/_shared/scope-resolution/registries/evidence.js.map +1 -0
  86. package/dist/_shared/scope-resolution/registries/field-registry.d.ts +26 -0
  87. package/dist/_shared/scope-resolution/registries/field-registry.d.ts.map +1 -0
  88. package/dist/_shared/scope-resolution/registries/field-registry.js +31 -0
  89. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -0
  90. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts +81 -0
  91. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -0
  92. package/dist/_shared/scope-resolution/registries/lookup-core.js +332 -0
  93. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -0
  94. package/dist/_shared/scope-resolution/registries/lookup-qualified.d.ts +33 -0
  95. package/dist/_shared/scope-resolution/registries/lookup-qualified.d.ts.map +1 -0
  96. package/dist/_shared/scope-resolution/registries/lookup-qualified.js +56 -0
  97. package/dist/_shared/scope-resolution/registries/lookup-qualified.js.map +1 -0
  98. package/dist/_shared/scope-resolution/registries/method-registry.d.ts +36 -0
  99. package/dist/_shared/scope-resolution/registries/method-registry.d.ts.map +1 -0
  100. package/dist/_shared/scope-resolution/registries/method-registry.js +32 -0
  101. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -0
  102. package/dist/_shared/scope-resolution/registries/tie-breaks.d.ts +43 -0
  103. package/dist/_shared/scope-resolution/registries/tie-breaks.d.ts.map +1 -0
  104. package/dist/_shared/scope-resolution/registries/tie-breaks.js +60 -0
  105. package/dist/_shared/scope-resolution/registries/tie-breaks.js.map +1 -0
  106. package/dist/_shared/scope-resolution/resolve-type-ref.d.ts +53 -0
  107. package/dist/_shared/scope-resolution/resolve-type-ref.d.ts.map +1 -0
  108. package/dist/_shared/scope-resolution/resolve-type-ref.js +126 -0
  109. package/dist/_shared/scope-resolution/resolve-type-ref.js.map +1 -0
  110. package/dist/_shared/scope-resolution/scope-id.d.ts +43 -0
  111. package/dist/_shared/scope-resolution/scope-id.d.ts.map +1 -0
  112. package/dist/_shared/scope-resolution/scope-id.js +46 -0
  113. package/dist/_shared/scope-resolution/scope-id.js.map +1 -0
  114. package/dist/_shared/scope-resolution/scope-tree.d.ts +61 -0
  115. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -0
  116. package/dist/_shared/scope-resolution/scope-tree.js +186 -0
  117. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -0
  118. package/dist/_shared/scope-resolution/shadow/aggregate.d.ts +63 -0
  119. package/dist/_shared/scope-resolution/shadow/aggregate.d.ts.map +1 -0
  120. package/dist/_shared/scope-resolution/shadow/aggregate.js +122 -0
  121. package/dist/_shared/scope-resolution/shadow/aggregate.js.map +1 -0
  122. package/dist/_shared/scope-resolution/shadow/diff.d.ts +59 -0
  123. package/dist/_shared/scope-resolution/shadow/diff.d.ts.map +1 -0
  124. package/dist/_shared/scope-resolution/shadow/diff.js +79 -0
  125. package/dist/_shared/scope-resolution/shadow/diff.js.map +1 -0
  126. package/dist/_shared/scope-resolution/symbol-definition.d.ts +34 -0
  127. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -0
  128. package/dist/_shared/scope-resolution/symbol-definition.js +12 -0
  129. package/dist/_shared/scope-resolution/symbol-definition.js.map +1 -0
  130. package/dist/_shared/scope-resolution/types.d.ts +356 -0
  131. package/dist/_shared/scope-resolution/types.d.ts.map +1 -0
  132. package/dist/_shared/scope-resolution/types.js +17 -0
  133. package/dist/_shared/scope-resolution/types.js.map +1 -0
  134. package/dist/cli/ai-context.d.ts +27 -0
  135. package/dist/cli/ai-context.js +270 -0
  136. package/dist/cli/analyze.d.ts +43 -0
  137. package/dist/cli/analyze.js +312 -0
  138. package/dist/cli/augment.d.ts +13 -0
  139. package/dist/cli/augment.js +33 -0
  140. package/dist/cli/clean.d.ts +10 -0
  141. package/dist/cli/clean.js +78 -0
  142. package/dist/cli/config.d.ts +27 -0
  143. package/dist/cli/config.js +106 -0
  144. package/dist/cli/eval-server.d.ts +37 -0
  145. package/dist/cli/eval-server.js +398 -0
  146. package/dist/cli/graphstore.d.ts +40 -0
  147. package/dist/cli/graphstore.js +639 -0
  148. package/dist/cli/group.d.ts +2 -0
  149. package/dist/cli/group.js +306 -0
  150. package/dist/cli/index-repo.d.ts +15 -0
  151. package/dist/cli/index-repo.js +120 -0
  152. package/dist/cli/index.d.ts +2 -0
  153. package/dist/cli/index.js +236 -0
  154. package/dist/cli/lazy-action.d.ts +6 -0
  155. package/dist/cli/lazy-action.js +18 -0
  156. package/dist/cli/list.d.ts +6 -0
  157. package/dist/cli/list.js +40 -0
  158. package/dist/cli/mcp.d.ts +8 -0
  159. package/dist/cli/mcp.js +36 -0
  160. package/dist/cli/remove.d.ts +30 -0
  161. package/dist/cli/remove.js +99 -0
  162. package/dist/cli/serve.d.ts +4 -0
  163. package/dist/cli/serve.js +37 -0
  164. package/dist/cli/setup.d.ts +8 -0
  165. package/dist/cli/setup.js +543 -0
  166. package/dist/cli/skill-gen.d.ts +26 -0
  167. package/dist/cli/skill-gen.js +555 -0
  168. package/dist/cli/status.d.ts +6 -0
  169. package/dist/cli/status.js +36 -0
  170. package/dist/cli/tool.d.ts +43 -0
  171. package/dist/cli/tool.js +168 -0
  172. package/dist/cli/wiki.d.ts +21 -0
  173. package/dist/cli/wiki.js +579 -0
  174. package/dist/config/ignore-service.d.ts +35 -0
  175. package/dist/config/ignore-service.js +436 -0
  176. package/dist/config/supported-languages.d.ts +13 -0
  177. package/dist/config/supported-languages.js +13 -0
  178. package/dist/core/augmentation/engine.d.ts +26 -0
  179. package/dist/core/augmentation/engine.js +252 -0
  180. package/dist/core/embeddings/ast-utils.d.ts +22 -0
  181. package/dist/core/embeddings/ast-utils.js +105 -0
  182. package/dist/core/embeddings/character-chunk.d.ts +12 -0
  183. package/dist/core/embeddings/character-chunk.js +43 -0
  184. package/dist/core/embeddings/chunker.d.ts +14 -0
  185. package/dist/core/embeddings/chunker.js +239 -0
  186. package/dist/core/embeddings/embedder.d.ts +65 -0
  187. package/dist/core/embeddings/embedder.js +320 -0
  188. package/dist/core/embeddings/embedding-pipeline.d.ts +62 -0
  189. package/dist/core/embeddings/embedding-pipeline.js +486 -0
  190. package/dist/core/embeddings/http-client.d.ts +31 -0
  191. package/dist/core/embeddings/http-client.js +179 -0
  192. package/dist/core/embeddings/index.d.ts +10 -0
  193. package/dist/core/embeddings/index.js +10 -0
  194. package/dist/core/embeddings/line-index.d.ts +7 -0
  195. package/dist/core/embeddings/line-index.js +42 -0
  196. package/dist/core/embeddings/server-mapping.d.ts +15 -0
  197. package/dist/core/embeddings/server-mapping.js +33 -0
  198. package/dist/core/embeddings/structural-extractor.d.ts +15 -0
  199. package/dist/core/embeddings/structural-extractor.js +58 -0
  200. package/dist/core/embeddings/text-generator.d.ts +31 -0
  201. package/dist/core/embeddings/text-generator.js +208 -0
  202. package/dist/core/embeddings/types.d.ts +207 -0
  203. package/dist/core/embeddings/types.js +200 -0
  204. package/dist/core/git-staleness.d.ts +31 -0
  205. package/dist/core/git-staleness.js +137 -0
  206. package/dist/core/graph/graph.d.ts +2 -0
  207. package/dist/core/graph/graph.js +173 -0
  208. package/dist/core/graph/types.d.ts +36 -0
  209. package/dist/core/graph/types.js +1 -0
  210. package/dist/core/graphstore/index.d.ts +46 -0
  211. package/dist/core/graphstore/index.js +80 -0
  212. package/dist/core/graphstore/lbug-row-source.d.ts +19 -0
  213. package/dist/core/graphstore/lbug-row-source.js +141 -0
  214. package/dist/core/group/bridge-db.d.ts +82 -0
  215. package/dist/core/group/bridge-db.js +460 -0
  216. package/dist/core/group/bridge-schema.d.ts +27 -0
  217. package/dist/core/group/bridge-schema.js +55 -0
  218. package/dist/core/group/config-parser.d.ts +7 -0
  219. package/dist/core/group/config-parser.js +100 -0
  220. package/dist/core/group/contract-extractor.d.ts +7 -0
  221. package/dist/core/group/contract-extractor.js +1 -0
  222. package/dist/core/group/cross-impact.d.ts +41 -0
  223. package/dist/core/group/cross-impact.js +441 -0
  224. package/dist/core/group/extractors/fs-utils.d.ts +10 -0
  225. package/dist/core/group/extractors/fs-utils.js +24 -0
  226. package/dist/core/group/extractors/grpc-extractor.d.ts +25 -0
  227. package/dist/core/group/extractors/grpc-extractor.js +401 -0
  228. package/dist/core/group/extractors/grpc-patterns/go.d.ts +2 -0
  229. package/dist/core/group/extractors/grpc-patterns/go.js +97 -0
  230. package/dist/core/group/extractors/grpc-patterns/index.d.ts +19 -0
  231. package/dist/core/group/extractors/grpc-patterns/index.js +46 -0
  232. package/dist/core/group/extractors/grpc-patterns/java.d.ts +2 -0
  233. package/dist/core/group/extractors/grpc-patterns/java.js +173 -0
  234. package/dist/core/group/extractors/grpc-patterns/node.d.ts +4 -0
  235. package/dist/core/group/extractors/grpc-patterns/node.js +290 -0
  236. package/dist/core/group/extractors/grpc-patterns/proto.d.ts +9 -0
  237. package/dist/core/group/extractors/grpc-patterns/proto.js +134 -0
  238. package/dist/core/group/extractors/grpc-patterns/python.d.ts +2 -0
  239. package/dist/core/group/extractors/grpc-patterns/python.js +67 -0
  240. package/dist/core/group/extractors/grpc-patterns/types.d.ts +50 -0
  241. package/dist/core/group/extractors/grpc-patterns/types.js +1 -0
  242. package/dist/core/group/extractors/http-patterns/go.d.ts +2 -0
  243. package/dist/core/group/extractors/http-patterns/go.js +215 -0
  244. package/dist/core/group/extractors/http-patterns/index.d.ts +17 -0
  245. package/dist/core/group/extractors/http-patterns/index.js +44 -0
  246. package/dist/core/group/extractors/http-patterns/java.d.ts +2 -0
  247. package/dist/core/group/extractors/http-patterns/java.js +253 -0
  248. package/dist/core/group/extractors/http-patterns/node.d.ts +4 -0
  249. package/dist/core/group/extractors/http-patterns/node.js +484 -0
  250. package/dist/core/group/extractors/http-patterns/php.d.ts +2 -0
  251. package/dist/core/group/extractors/http-patterns/php.js +178 -0
  252. package/dist/core/group/extractors/http-patterns/python.d.ts +2 -0
  253. package/dist/core/group/extractors/http-patterns/python.js +133 -0
  254. package/dist/core/group/extractors/http-patterns/types.d.ts +61 -0
  255. package/dist/core/group/extractors/http-patterns/types.js +1 -0
  256. package/dist/core/group/extractors/http-route-extractor.d.ts +21 -0
  257. package/dist/core/group/extractors/http-route-extractor.js +421 -0
  258. package/dist/core/group/extractors/manifest-extractor.d.ts +54 -0
  259. package/dist/core/group/extractors/manifest-extractor.js +292 -0
  260. package/dist/core/group/extractors/topic-extractor.d.ts +8 -0
  261. package/dist/core/group/extractors/topic-extractor.js +97 -0
  262. package/dist/core/group/extractors/topic-patterns/go.d.ts +2 -0
  263. package/dist/core/group/extractors/topic-patterns/go.js +120 -0
  264. package/dist/core/group/extractors/topic-patterns/index.d.ts +14 -0
  265. package/dist/core/group/extractors/topic-patterns/index.js +38 -0
  266. package/dist/core/group/extractors/topic-patterns/java.d.ts +2 -0
  267. package/dist/core/group/extractors/topic-patterns/java.js +80 -0
  268. package/dist/core/group/extractors/topic-patterns/node.d.ts +4 -0
  269. package/dist/core/group/extractors/topic-patterns/node.js +155 -0
  270. package/dist/core/group/extractors/topic-patterns/python.d.ts +2 -0
  271. package/dist/core/group/extractors/topic-patterns/python.js +116 -0
  272. package/dist/core/group/extractors/topic-patterns/types.d.ts +25 -0
  273. package/dist/core/group/extractors/topic-patterns/types.js +10 -0
  274. package/dist/core/group/extractors/tree-sitter-scanner.d.ts +113 -0
  275. package/dist/core/group/extractors/tree-sitter-scanner.js +94 -0
  276. package/dist/core/group/group-path-utils.d.ts +17 -0
  277. package/dist/core/group/group-path-utils.js +40 -0
  278. package/dist/core/group/matching.d.ts +13 -0
  279. package/dist/core/group/matching.js +198 -0
  280. package/dist/core/group/normalization.d.ts +3 -0
  281. package/dist/core/group/normalization.js +115 -0
  282. package/dist/core/group/resolve-at-member.d.ts +10 -0
  283. package/dist/core/group/resolve-at-member.js +31 -0
  284. package/dist/core/group/service-boundary-detector.d.ts +8 -0
  285. package/dist/core/group/service-boundary-detector.js +155 -0
  286. package/dist/core/group/service.d.ts +55 -0
  287. package/dist/core/group/service.js +394 -0
  288. package/dist/core/group/storage.d.ts +9 -0
  289. package/dist/core/group/storage.js +91 -0
  290. package/dist/core/group/sync.d.ts +21 -0
  291. package/dist/core/group/sync.js +196 -0
  292. package/dist/core/group/types.d.ts +160 -0
  293. package/dist/core/group/types.js +1 -0
  294. package/dist/core/ingestion/ast-cache.d.ts +26 -0
  295. package/dist/core/ingestion/ast-cache.js +47 -0
  296. package/dist/core/ingestion/binding-accumulator.d.ts +212 -0
  297. package/dist/core/ingestion/binding-accumulator.js +336 -0
  298. package/dist/core/ingestion/call-extractors/configs/c-cpp.d.ts +3 -0
  299. package/dist/core/ingestion/call-extractors/configs/c-cpp.js +8 -0
  300. package/dist/core/ingestion/call-extractors/configs/csharp.d.ts +2 -0
  301. package/dist/core/ingestion/call-extractors/configs/csharp.js +6 -0
  302. package/dist/core/ingestion/call-extractors/configs/dart.d.ts +2 -0
  303. package/dist/core/ingestion/call-extractors/configs/dart.js +5 -0
  304. package/dist/core/ingestion/call-extractors/configs/go.d.ts +2 -0
  305. package/dist/core/ingestion/call-extractors/configs/go.js +5 -0
  306. package/dist/core/ingestion/call-extractors/configs/jvm.d.ts +3 -0
  307. package/dist/core/ingestion/call-extractors/configs/jvm.js +51 -0
  308. package/dist/core/ingestion/call-extractors/configs/php.d.ts +2 -0
  309. package/dist/core/ingestion/call-extractors/configs/php.js +5 -0
  310. package/dist/core/ingestion/call-extractors/configs/python.d.ts +2 -0
  311. package/dist/core/ingestion/call-extractors/configs/python.js +5 -0
  312. package/dist/core/ingestion/call-extractors/configs/ruby.d.ts +2 -0
  313. package/dist/core/ingestion/call-extractors/configs/ruby.js +5 -0
  314. package/dist/core/ingestion/call-extractors/configs/rust.d.ts +2 -0
  315. package/dist/core/ingestion/call-extractors/configs/rust.js +5 -0
  316. package/dist/core/ingestion/call-extractors/configs/swift.d.ts +2 -0
  317. package/dist/core/ingestion/call-extractors/configs/swift.js +5 -0
  318. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.d.ts +3 -0
  319. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.js +8 -0
  320. package/dist/core/ingestion/call-extractors/generic.d.ts +5 -0
  321. package/dist/core/ingestion/call-extractors/generic.js +59 -0
  322. package/dist/core/ingestion/call-processor.d.ts +235 -0
  323. package/dist/core/ingestion/call-processor.js +2639 -0
  324. package/dist/core/ingestion/call-routing.d.ts +55 -0
  325. package/dist/core/ingestion/call-routing.js +95 -0
  326. package/dist/core/ingestion/call-types.d.ts +135 -0
  327. package/dist/core/ingestion/call-types.js +2 -0
  328. package/dist/core/ingestion/class-extractors/configs/c-cpp.d.ts +3 -0
  329. package/dist/core/ingestion/class-extractors/configs/c-cpp.js +11 -0
  330. package/dist/core/ingestion/class-extractors/configs/csharp.d.ts +2 -0
  331. package/dist/core/ingestion/class-extractors/configs/csharp.js +21 -0
  332. package/dist/core/ingestion/class-extractors/configs/dart.d.ts +2 -0
  333. package/dist/core/ingestion/class-extractors/configs/dart.js +7 -0
  334. package/dist/core/ingestion/class-extractors/configs/go.d.ts +2 -0
  335. package/dist/core/ingestion/class-extractors/configs/go.js +20 -0
  336. package/dist/core/ingestion/class-extractors/configs/jvm.d.ts +3 -0
  337. package/dist/core/ingestion/class-extractors/configs/jvm.js +35 -0
  338. package/dist/core/ingestion/class-extractors/configs/php.d.ts +2 -0
  339. package/dist/core/ingestion/class-extractors/configs/php.js +7 -0
  340. package/dist/core/ingestion/class-extractors/configs/python.d.ts +2 -0
  341. package/dist/core/ingestion/class-extractors/configs/python.js +7 -0
  342. package/dist/core/ingestion/class-extractors/configs/ruby.d.ts +2 -0
  343. package/dist/core/ingestion/class-extractors/configs/ruby.js +7 -0
  344. package/dist/core/ingestion/class-extractors/configs/rust.d.ts +2 -0
  345. package/dist/core/ingestion/class-extractors/configs/rust.js +7 -0
  346. package/dist/core/ingestion/class-extractors/configs/swift.d.ts +2 -0
  347. package/dist/core/ingestion/class-extractors/configs/swift.js +18 -0
  348. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.d.ts +4 -0
  349. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.js +28 -0
  350. package/dist/core/ingestion/class-extractors/generic.d.ts +2 -0
  351. package/dist/core/ingestion/class-extractors/generic.js +135 -0
  352. package/dist/core/ingestion/class-types.d.ts +34 -0
  353. package/dist/core/ingestion/class-types.js +1 -0
  354. package/dist/core/ingestion/cluster-enricher.d.ts +38 -0
  355. package/dist/core/ingestion/cluster-enricher.js +168 -0
  356. package/dist/core/ingestion/cobol/cobol-copy-expander.d.ts +57 -0
  357. package/dist/core/ingestion/cobol/cobol-copy-expander.js +392 -0
  358. package/dist/core/ingestion/cobol/cobol-preprocessor.d.ts +210 -0
  359. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1715 -0
  360. package/dist/core/ingestion/cobol/jcl-parser.d.ts +68 -0
  361. package/dist/core/ingestion/cobol/jcl-parser.js +217 -0
  362. package/dist/core/ingestion/cobol/jcl-processor.d.ts +33 -0
  363. package/dist/core/ingestion/cobol/jcl-processor.js +229 -0
  364. package/dist/core/ingestion/cobol-processor.d.ts +54 -0
  365. package/dist/core/ingestion/cobol-processor.js +1232 -0
  366. package/dist/core/ingestion/community-processor.d.ts +39 -0
  367. package/dist/core/ingestion/community-processor.js +318 -0
  368. package/dist/core/ingestion/constants.d.ts +16 -0
  369. package/dist/core/ingestion/constants.js +16 -0
  370. package/dist/core/ingestion/emit-references.d.ts +88 -0
  371. package/dist/core/ingestion/emit-references.js +229 -0
  372. package/dist/core/ingestion/entry-point-scoring.d.ts +58 -0
  373. package/dist/core/ingestion/entry-point-scoring.js +380 -0
  374. package/dist/core/ingestion/export-detection.d.ts +57 -0
  375. package/dist/core/ingestion/export-detection.js +233 -0
  376. package/dist/core/ingestion/field-extractor.d.ts +29 -0
  377. package/dist/core/ingestion/field-extractor.js +25 -0
  378. package/dist/core/ingestion/field-extractors/configs/c-cpp.d.ts +3 -0
  379. package/dist/core/ingestion/field-extractors/configs/c-cpp.js +104 -0
  380. package/dist/core/ingestion/field-extractors/configs/csharp.d.ts +8 -0
  381. package/dist/core/ingestion/field-extractors/configs/csharp.js +116 -0
  382. package/dist/core/ingestion/field-extractors/configs/dart.d.ts +8 -0
  383. package/dist/core/ingestion/field-extractors/configs/dart.js +78 -0
  384. package/dist/core/ingestion/field-extractors/configs/go.d.ts +11 -0
  385. package/dist/core/ingestion/field-extractors/configs/go.js +60 -0
  386. package/dist/core/ingestion/field-extractors/configs/helpers.d.ts +53 -0
  387. package/dist/core/ingestion/field-extractors/configs/helpers.js +158 -0
  388. package/dist/core/ingestion/field-extractors/configs/jvm.d.ts +3 -0
  389. package/dist/core/ingestion/field-extractors/configs/jvm.js +118 -0
  390. package/dist/core/ingestion/field-extractors/configs/php.d.ts +8 -0
  391. package/dist/core/ingestion/field-extractors/configs/php.js +65 -0
  392. package/dist/core/ingestion/field-extractors/configs/python.d.ts +12 -0
  393. package/dist/core/ingestion/field-extractors/configs/python.js +91 -0
  394. package/dist/core/ingestion/field-extractors/configs/ruby.d.ts +16 -0
  395. package/dist/core/ingestion/field-extractors/configs/ruby.js +76 -0
  396. package/dist/core/ingestion/field-extractors/configs/rust.d.ts +9 -0
  397. package/dist/core/ingestion/field-extractors/configs/rust.js +52 -0
  398. package/dist/core/ingestion/field-extractors/configs/swift.d.ts +8 -0
  399. package/dist/core/ingestion/field-extractors/configs/swift.js +65 -0
  400. package/dist/core/ingestion/field-extractors/configs/typescript-javascript.d.ts +3 -0
  401. package/dist/core/ingestion/field-extractors/configs/typescript-javascript.js +56 -0
  402. package/dist/core/ingestion/field-extractors/generic.d.ts +49 -0
  403. package/dist/core/ingestion/field-extractors/generic.js +117 -0
  404. package/dist/core/ingestion/field-extractors/typescript.d.ts +77 -0
  405. package/dist/core/ingestion/field-extractors/typescript.js +291 -0
  406. package/dist/core/ingestion/field-types.d.ts +61 -0
  407. package/dist/core/ingestion/field-types.js +2 -0
  408. package/dist/core/ingestion/filesystem-walker.d.ts +28 -0
  409. package/dist/core/ingestion/filesystem-walker.js +91 -0
  410. package/dist/core/ingestion/finalize-orchestrator.d.ts +63 -0
  411. package/dist/core/ingestion/finalize-orchestrator.js +139 -0
  412. package/dist/core/ingestion/framework-detection.d.ts +150 -0
  413. package/dist/core/ingestion/framework-detection.js +786 -0
  414. package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +13 -0
  415. package/dist/core/ingestion/heritage-extractors/configs/go.js +20 -0
  416. package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +18 -0
  417. package/dist/core/ingestion/heritage-extractors/configs/ruby.js +65 -0
  418. package/dist/core/ingestion/heritage-extractors/generic.d.ts +23 -0
  419. package/dist/core/ingestion/heritage-extractors/generic.js +47 -0
  420. package/dist/core/ingestion/heritage-processor.d.ts +54 -0
  421. package/dist/core/ingestion/heritage-processor.js +360 -0
  422. package/dist/core/ingestion/heritage-types.d.ts +73 -0
  423. package/dist/core/ingestion/heritage-types.js +2 -0
  424. package/dist/core/ingestion/import-processor.d.ts +23 -0
  425. package/dist/core/ingestion/import-processor.js +373 -0
  426. package/dist/core/ingestion/import-resolvers/configs/c-cpp.d.ts +7 -0
  427. package/dist/core/ingestion/import-resolvers/configs/c-cpp.js +14 -0
  428. package/dist/core/ingestion/import-resolvers/configs/csharp.d.ts +8 -0
  429. package/dist/core/ingestion/import-resolvers/configs/csharp.js +27 -0
  430. package/dist/core/ingestion/import-resolvers/configs/dart.d.ts +17 -0
  431. package/dist/core/ingestion/import-resolvers/configs/dart.js +54 -0
  432. package/dist/core/ingestion/import-resolvers/configs/go.d.ts +8 -0
  433. package/dist/core/ingestion/import-resolvers/configs/go.js +26 -0
  434. package/dist/core/ingestion/import-resolvers/configs/jvm.d.ts +13 -0
  435. package/dist/core/ingestion/import-resolvers/configs/jvm.js +68 -0
  436. package/dist/core/ingestion/import-resolvers/configs/php.d.ts +8 -0
  437. package/dist/core/ingestion/import-resolvers/configs/php.js +15 -0
  438. package/dist/core/ingestion/import-resolvers/configs/python.d.ts +12 -0
  439. package/dist/core/ingestion/import-resolvers/configs/python.js +41 -0
  440. package/dist/core/ingestion/import-resolvers/configs/ruby.d.ts +8 -0
  441. package/dist/core/ingestion/import-resolvers/configs/ruby.js +16 -0
  442. package/dist/core/ingestion/import-resolvers/configs/rust.d.ts +8 -0
  443. package/dist/core/ingestion/import-resolvers/configs/rust.js +54 -0
  444. package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +8 -0
  445. package/dist/core/ingestion/import-resolvers/configs/swift.js +29 -0
  446. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.d.ts +9 -0
  447. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.js +23 -0
  448. package/dist/core/ingestion/import-resolvers/csharp.d.ts +18 -0
  449. package/dist/core/ingestion/import-resolvers/csharp.js +115 -0
  450. package/dist/core/ingestion/import-resolvers/go.d.ts +17 -0
  451. package/dist/core/ingestion/import-resolvers/go.js +46 -0
  452. package/dist/core/ingestion/import-resolvers/jvm.d.ts +27 -0
  453. package/dist/core/ingestion/import-resolvers/jvm.js +106 -0
  454. package/dist/core/ingestion/import-resolvers/php.d.ts +24 -0
  455. package/dist/core/ingestion/import-resolvers/php.js +77 -0
  456. package/dist/core/ingestion/import-resolvers/python.d.ts +22 -0
  457. package/dist/core/ingestion/import-resolvers/python.js +72 -0
  458. package/dist/core/ingestion/import-resolvers/resolver-factory.d.ts +24 -0
  459. package/dist/core/ingestion/import-resolvers/resolver-factory.js +33 -0
  460. package/dist/core/ingestion/import-resolvers/ruby.d.ts +14 -0
  461. package/dist/core/ingestion/import-resolvers/ruby.js +17 -0
  462. package/dist/core/ingestion/import-resolvers/rust.d.ts +17 -0
  463. package/dist/core/ingestion/import-resolvers/rust.js +75 -0
  464. package/dist/core/ingestion/import-resolvers/standard.d.ts +30 -0
  465. package/dist/core/ingestion/import-resolvers/standard.js +142 -0
  466. package/dist/core/ingestion/import-resolvers/types.d.ts +68 -0
  467. package/dist/core/ingestion/import-resolvers/types.js +6 -0
  468. package/dist/core/ingestion/import-resolvers/utils.d.ts +35 -0
  469. package/dist/core/ingestion/import-resolvers/utils.js +149 -0
  470. package/dist/core/ingestion/import-target-adapter.d.ts +73 -0
  471. package/dist/core/ingestion/import-target-adapter.js +95 -0
  472. package/dist/core/ingestion/language-config.d.ts +52 -0
  473. package/dist/core/ingestion/language-config.js +181 -0
  474. package/dist/core/ingestion/language-provider.d.ts +410 -0
  475. package/dist/core/ingestion/language-provider.js +24 -0
  476. package/dist/core/ingestion/languages/c-cpp.d.ts +12 -0
  477. package/dist/core/ingestion/languages/c-cpp.js +329 -0
  478. package/dist/core/ingestion/languages/cobol.d.ts +1 -0
  479. package/dist/core/ingestion/languages/cobol.js +26 -0
  480. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +21 -0
  481. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +56 -0
  482. package/dist/core/ingestion/languages/csharp/arity-metadata.d.ts +26 -0
  483. package/dist/core/ingestion/languages/csharp/arity-metadata.js +46 -0
  484. package/dist/core/ingestion/languages/csharp/arity.d.ts +23 -0
  485. package/dist/core/ingestion/languages/csharp/arity.js +37 -0
  486. package/dist/core/ingestion/languages/csharp/cache-stats.d.ts +15 -0
  487. package/dist/core/ingestion/languages/csharp/cache-stats.js +26 -0
  488. package/dist/core/ingestion/languages/csharp/captures.d.ts +19 -0
  489. package/dist/core/ingestion/languages/csharp/captures.js +249 -0
  490. package/dist/core/ingestion/languages/csharp/import-decomposer.d.ts +19 -0
  491. package/dist/core/ingestion/languages/csharp/import-decomposer.js +93 -0
  492. package/dist/core/ingestion/languages/csharp/import-target.d.ts +25 -0
  493. package/dist/core/ingestion/languages/csharp/import-target.js +123 -0
  494. package/dist/core/ingestion/languages/csharp/index.d.ts +82 -0
  495. package/dist/core/ingestion/languages/csharp/index.js +82 -0
  496. package/dist/core/ingestion/languages/csharp/interpret.d.ts +15 -0
  497. package/dist/core/ingestion/languages/csharp/interpret.js +132 -0
  498. package/dist/core/ingestion/languages/csharp/merge-bindings.d.ts +27 -0
  499. package/dist/core/ingestion/languages/csharp/merge-bindings.js +55 -0
  500. package/dist/core/ingestion/languages/csharp/namespace-siblings.d.ts +50 -0
  501. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +374 -0
  502. package/dist/core/ingestion/languages/csharp/query.d.ts +35 -0
  503. package/dist/core/ingestion/languages/csharp/query.js +515 -0
  504. package/dist/core/ingestion/languages/csharp/receiver-binding.d.ts +31 -0
  505. package/dist/core/ingestion/languages/csharp/receiver-binding.js +135 -0
  506. package/dist/core/ingestion/languages/csharp/scope-resolver.d.ts +10 -0
  507. package/dist/core/ingestion/languages/csharp/scope-resolver.js +63 -0
  508. package/dist/core/ingestion/languages/csharp/simple-hooks.d.ts +53 -0
  509. package/dist/core/ingestion/languages/csharp/simple-hooks.js +76 -0
  510. package/dist/core/ingestion/languages/csharp.d.ts +8 -0
  511. package/dist/core/ingestion/languages/csharp.js +152 -0
  512. package/dist/core/ingestion/languages/dart.d.ts +12 -0
  513. package/dist/core/ingestion/languages/dart.js +102 -0
  514. package/dist/core/ingestion/languages/go.d.ts +11 -0
  515. package/dist/core/ingestion/languages/go.js +44 -0
  516. package/dist/core/ingestion/languages/index.d.ts +39 -0
  517. package/dist/core/ingestion/languages/index.js +64 -0
  518. package/dist/core/ingestion/languages/java.d.ts +9 -0
  519. package/dist/core/ingestion/languages/java.js +44 -0
  520. package/dist/core/ingestion/languages/kotlin.d.ts +9 -0
  521. package/dist/core/ingestion/languages/kotlin.js +123 -0
  522. package/dist/core/ingestion/languages/php.d.ts +8 -0
  523. package/dist/core/ingestion/languages/php.js +240 -0
  524. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +24 -0
  525. package/dist/core/ingestion/languages/python/arity-metadata.js +45 -0
  526. package/dist/core/ingestion/languages/python/arity.d.ts +22 -0
  527. package/dist/core/ingestion/languages/python/arity.js +38 -0
  528. package/dist/core/ingestion/languages/python/cache-stats.d.ts +17 -0
  529. package/dist/core/ingestion/languages/python/cache-stats.js +28 -0
  530. package/dist/core/ingestion/languages/python/captures.d.ts +19 -0
  531. package/dist/core/ingestion/languages/python/captures.js +106 -0
  532. package/dist/core/ingestion/languages/python/import-decomposer.d.ts +15 -0
  533. package/dist/core/ingestion/languages/python/import-decomposer.js +112 -0
  534. package/dist/core/ingestion/languages/python/import-target.d.ts +21 -0
  535. package/dist/core/ingestion/languages/python/import-target.js +99 -0
  536. package/dist/core/ingestion/languages/python/index.d.ts +80 -0
  537. package/dist/core/ingestion/languages/python/index.js +80 -0
  538. package/dist/core/ingestion/languages/python/interpret.d.ts +15 -0
  539. package/dist/core/ingestion/languages/python/interpret.js +191 -0
  540. package/dist/core/ingestion/languages/python/merge-bindings.d.ts +16 -0
  541. package/dist/core/ingestion/languages/python/merge-bindings.js +44 -0
  542. package/dist/core/ingestion/languages/python/query.d.ts +9 -0
  543. package/dist/core/ingestion/languages/python/query.js +267 -0
  544. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +21 -0
  545. package/dist/core/ingestion/languages/python/receiver-binding.js +116 -0
  546. package/dist/core/ingestion/languages/python/scope-resolver.d.ts +16 -0
  547. package/dist/core/ingestion/languages/python/scope-resolver.js +53 -0
  548. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +23 -0
  549. package/dist/core/ingestion/languages/python/simple-hooks.js +35 -0
  550. package/dist/core/ingestion/languages/python.d.ts +12 -0
  551. package/dist/core/ingestion/languages/python.js +91 -0
  552. package/dist/core/ingestion/languages/ruby.d.ts +9 -0
  553. package/dist/core/ingestion/languages/ruby.js +210 -0
  554. package/dist/core/ingestion/languages/rust.d.ts +12 -0
  555. package/dist/core/ingestion/languages/rust.js +132 -0
  556. package/dist/core/ingestion/languages/swift.d.ts +12 -0
  557. package/dist/core/ingestion/languages/swift.js +244 -0
  558. package/dist/core/ingestion/languages/typescript.d.ts +11 -0
  559. package/dist/core/ingestion/languages/typescript.js +184 -0
  560. package/dist/core/ingestion/languages/vue.d.ts +13 -0
  561. package/dist/core/ingestion/languages/vue.js +77 -0
  562. package/dist/core/ingestion/markdown-processor.d.ts +17 -0
  563. package/dist/core/ingestion/markdown-processor.js +124 -0
  564. package/dist/core/ingestion/method-extractors/configs/c-cpp.d.ts +3 -0
  565. package/dist/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  566. package/dist/core/ingestion/method-extractors/configs/csharp.d.ts +2 -0
  567. package/dist/core/ingestion/method-extractors/configs/csharp.js +287 -0
  568. package/dist/core/ingestion/method-extractors/configs/dart.d.ts +2 -0
  569. package/dist/core/ingestion/method-extractors/configs/dart.js +376 -0
  570. package/dist/core/ingestion/method-extractors/configs/go.d.ts +2 -0
  571. package/dist/core/ingestion/method-extractors/configs/go.js +176 -0
  572. package/dist/core/ingestion/method-extractors/configs/jvm.d.ts +3 -0
  573. package/dist/core/ingestion/method-extractors/configs/jvm.js +336 -0
  574. package/dist/core/ingestion/method-extractors/configs/php.d.ts +2 -0
  575. package/dist/core/ingestion/method-extractors/configs/php.js +304 -0
  576. package/dist/core/ingestion/method-extractors/configs/python.d.ts +2 -0
  577. package/dist/core/ingestion/method-extractors/configs/python.js +309 -0
  578. package/dist/core/ingestion/method-extractors/configs/ruby.d.ts +2 -0
  579. package/dist/core/ingestion/method-extractors/configs/ruby.js +286 -0
  580. package/dist/core/ingestion/method-extractors/configs/rust.d.ts +2 -0
  581. package/dist/core/ingestion/method-extractors/configs/rust.js +195 -0
  582. package/dist/core/ingestion/method-extractors/configs/swift.d.ts +2 -0
  583. package/dist/core/ingestion/method-extractors/configs/swift.js +277 -0
  584. package/dist/core/ingestion/method-extractors/configs/typescript-javascript.d.ts +3 -0
  585. package/dist/core/ingestion/method-extractors/configs/typescript-javascript.js +338 -0
  586. package/dist/core/ingestion/method-extractors/generic.d.ts +11 -0
  587. package/dist/core/ingestion/method-extractors/generic.js +204 -0
  588. package/dist/core/ingestion/method-types.d.ts +90 -0
  589. package/dist/core/ingestion/method-types.js +2 -0
  590. package/dist/core/ingestion/model/field-registry.d.ts +18 -0
  591. package/dist/core/ingestion/model/field-registry.js +22 -0
  592. package/dist/core/ingestion/model/heritage-map.d.ts +105 -0
  593. package/dist/core/ingestion/model/heritage-map.js +260 -0
  594. package/dist/core/ingestion/model/index.d.ts +20 -0
  595. package/dist/core/ingestion/model/index.js +43 -0
  596. package/dist/core/ingestion/model/method-registry.d.ts +71 -0
  597. package/dist/core/ingestion/model/method-registry.js +134 -0
  598. package/dist/core/ingestion/model/registration-table.d.ts +138 -0
  599. package/dist/core/ingestion/model/registration-table.js +224 -0
  600. package/dist/core/ingestion/model/resolution-context.d.ts +93 -0
  601. package/dist/core/ingestion/model/resolution-context.js +337 -0
  602. package/dist/core/ingestion/model/resolve.d.ts +61 -0
  603. package/dist/core/ingestion/model/resolve.js +381 -0
  604. package/dist/core/ingestion/model/scope-resolution-indexes.d.ts +59 -0
  605. package/dist/core/ingestion/model/scope-resolution-indexes.js +42 -0
  606. package/dist/core/ingestion/model/semantic-model.d.ts +150 -0
  607. package/dist/core/ingestion/model/semantic-model.js +175 -0
  608. package/dist/core/ingestion/model/symbol-table.d.ts +200 -0
  609. package/dist/core/ingestion/model/symbol-table.js +206 -0
  610. package/dist/core/ingestion/model/type-registry.d.ts +39 -0
  611. package/dist/core/ingestion/model/type-registry.js +62 -0
  612. package/dist/core/ingestion/mro-processor.d.ts +46 -0
  613. package/dist/core/ingestion/mro-processor.js +597 -0
  614. package/dist/core/ingestion/named-bindings/csharp.d.ts +3 -0
  615. package/dist/core/ingestion/named-bindings/csharp.js +37 -0
  616. package/dist/core/ingestion/named-bindings/java.d.ts +3 -0
  617. package/dist/core/ingestion/named-bindings/java.js +29 -0
  618. package/dist/core/ingestion/named-bindings/kotlin.d.ts +3 -0
  619. package/dist/core/ingestion/named-bindings/kotlin.js +36 -0
  620. package/dist/core/ingestion/named-bindings/php.d.ts +3 -0
  621. package/dist/core/ingestion/named-bindings/php.js +61 -0
  622. package/dist/core/ingestion/named-bindings/python.d.ts +3 -0
  623. package/dist/core/ingestion/named-bindings/python.js +49 -0
  624. package/dist/core/ingestion/named-bindings/rust.d.ts +3 -0
  625. package/dist/core/ingestion/named-bindings/rust.js +66 -0
  626. package/dist/core/ingestion/named-bindings/types.d.ts +16 -0
  627. package/dist/core/ingestion/named-bindings/types.js +6 -0
  628. package/dist/core/ingestion/named-bindings/typescript.d.ts +3 -0
  629. package/dist/core/ingestion/named-bindings/typescript.js +58 -0
  630. package/dist/core/ingestion/parsing-processor.d.ts +40 -0
  631. package/dist/core/ingestion/parsing-processor.js +576 -0
  632. package/dist/core/ingestion/pipeline-phases/cobol.d.ts +16 -0
  633. package/dist/core/ingestion/pipeline-phases/cobol.js +45 -0
  634. package/dist/core/ingestion/pipeline-phases/communities.d.ts +16 -0
  635. package/dist/core/ingestion/pipeline-phases/communities.js +62 -0
  636. package/dist/core/ingestion/pipeline-phases/cross-file-impl.d.ts +17 -0
  637. package/dist/core/ingestion/pipeline-phases/cross-file-impl.js +156 -0
  638. package/dist/core/ingestion/pipeline-phases/cross-file.d.ts +37 -0
  639. package/dist/core/ingestion/pipeline-phases/cross-file.js +63 -0
  640. package/dist/core/ingestion/pipeline-phases/index.d.ts +22 -0
  641. package/dist/core/ingestion/pipeline-phases/index.js +23 -0
  642. package/dist/core/ingestion/pipeline-phases/markdown.d.ts +17 -0
  643. package/dist/core/ingestion/pipeline-phases/markdown.js +33 -0
  644. package/dist/core/ingestion/pipeline-phases/mro.d.ts +18 -0
  645. package/dist/core/ingestion/pipeline-phases/mro.js +36 -0
  646. package/dist/core/ingestion/pipeline-phases/orm-extraction.d.ts +22 -0
  647. package/dist/core/ingestion/pipeline-phases/orm-extraction.js +92 -0
  648. package/dist/core/ingestion/pipeline-phases/orm.d.ts +15 -0
  649. package/dist/core/ingestion/pipeline-phases/orm.js +74 -0
  650. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +58 -0
  651. package/dist/core/ingestion/pipeline-phases/parse-impl.js +458 -0
  652. package/dist/core/ingestion/pipeline-phases/parse.d.ts +74 -0
  653. package/dist/core/ingestion/pipeline-phases/parse.js +33 -0
  654. package/dist/core/ingestion/pipeline-phases/processes.d.ts +16 -0
  655. package/dist/core/ingestion/pipeline-phases/processes.js +143 -0
  656. package/dist/core/ingestion/pipeline-phases/routes.d.ts +21 -0
  657. package/dist/core/ingestion/pipeline-phases/routes.js +243 -0
  658. package/dist/core/ingestion/pipeline-phases/runner.d.ts +22 -0
  659. package/dist/core/ingestion/pipeline-phases/runner.js +203 -0
  660. package/dist/core/ingestion/pipeline-phases/scan.d.ts +21 -0
  661. package/dist/core/ingestion/pipeline-phases/scan.js +46 -0
  662. package/dist/core/ingestion/pipeline-phases/structure.d.ts +27 -0
  663. package/dist/core/ingestion/pipeline-phases/structure.js +35 -0
  664. package/dist/core/ingestion/pipeline-phases/tools.d.ts +20 -0
  665. package/dist/core/ingestion/pipeline-phases/tools.js +79 -0
  666. package/dist/core/ingestion/pipeline-phases/types.d.ts +79 -0
  667. package/dist/core/ingestion/pipeline-phases/types.js +37 -0
  668. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.d.ts +70 -0
  669. package/dist/core/ingestion/pipeline-phases/wildcard-synthesis.js +312 -0
  670. package/dist/core/ingestion/pipeline.d.ts +36 -0
  671. package/dist/core/ingestion/pipeline.js +89 -0
  672. package/dist/core/ingestion/process-processor.d.ts +51 -0
  673. package/dist/core/ingestion/process-processor.js +317 -0
  674. package/dist/core/ingestion/registry-primary-flag.d.ts +86 -0
  675. package/dist/core/ingestion/registry-primary-flag.js +111 -0
  676. package/dist/core/ingestion/resolve-references.d.ts +63 -0
  677. package/dist/core/ingestion/resolve-references.js +175 -0
  678. package/dist/core/ingestion/route-extractors/expo.d.ts +1 -0
  679. package/dist/core/ingestion/route-extractors/expo.js +36 -0
  680. package/dist/core/ingestion/route-extractors/middleware.d.ts +47 -0
  681. package/dist/core/ingestion/route-extractors/middleware.js +167 -0
  682. package/dist/core/ingestion/route-extractors/nextjs.d.ts +3 -0
  683. package/dist/core/ingestion/route-extractors/nextjs.js +76 -0
  684. package/dist/core/ingestion/route-extractors/php.d.ts +7 -0
  685. package/dist/core/ingestion/route-extractors/php.js +22 -0
  686. package/dist/core/ingestion/route-extractors/response-shapes.d.ts +20 -0
  687. package/dist/core/ingestion/route-extractors/response-shapes.js +294 -0
  688. package/dist/core/ingestion/scope-extractor-bridge.d.ts +32 -0
  689. package/dist/core/ingestion/scope-extractor-bridge.js +44 -0
  690. package/dist/core/ingestion/scope-extractor.d.ts +86 -0
  691. package/dist/core/ingestion/scope-extractor.js +758 -0
  692. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +372 -0
  693. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +212 -0
  694. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +43 -0
  695. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +79 -0
  696. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +57 -0
  697. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +112 -0
  698. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +17 -0
  699. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +46 -0
  700. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.d.ts +19 -0
  701. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +30 -0
  702. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +37 -0
  703. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +113 -0
  704. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +38 -0
  705. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +73 -0
  706. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +42 -0
  707. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +198 -0
  708. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +27 -0
  709. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +131 -0
  710. package/dist/core/ingestion/scope-resolution/passes/imported-return-types.d.ts +48 -0
  711. package/dist/core/ingestion/scope-resolution/passes/imported-return-types.js +130 -0
  712. package/dist/core/ingestion/scope-resolution/passes/mro.d.ts +42 -0
  713. package/dist/core/ingestion/scope-resolution/passes/mro.js +99 -0
  714. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +26 -0
  715. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +61 -0
  716. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +46 -0
  717. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +327 -0
  718. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +47 -0
  719. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +130 -0
  720. package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.d.ts +68 -0
  721. package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +125 -0
  722. package/dist/core/ingestion/scope-resolution/pipeline/registry.d.ts +17 -0
  723. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +21 -0
  724. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +66 -0
  725. package/dist/core/ingestion/scope-resolution/pipeline/run.js +157 -0
  726. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +36 -0
  727. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +52 -0
  728. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +127 -0
  729. package/dist/core/ingestion/scope-resolution/scope/walkers.js +349 -0
  730. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +52 -0
  731. package/dist/core/ingestion/scope-resolution/workspace-index.js +61 -0
  732. package/dist/core/ingestion/shadow-harness.d.ts +113 -0
  733. package/dist/core/ingestion/shadow-harness.js +148 -0
  734. package/dist/core/ingestion/structure-processor.d.ts +2 -0
  735. package/dist/core/ingestion/structure-processor.js +36 -0
  736. package/dist/core/ingestion/tree-sitter-queries.d.ts +16 -0
  737. package/dist/core/ingestion/tree-sitter-queries.js +1338 -0
  738. package/dist/core/ingestion/type-env.d.ts +86 -0
  739. package/dist/core/ingestion/type-env.js +1128 -0
  740. package/dist/core/ingestion/type-extractors/c-cpp.d.ts +7 -0
  741. package/dist/core/ingestion/type-extractors/c-cpp.js +532 -0
  742. package/dist/core/ingestion/type-extractors/csharp.d.ts +2 -0
  743. package/dist/core/ingestion/type-extractors/csharp.js +583 -0
  744. package/dist/core/ingestion/type-extractors/dart.d.ts +15 -0
  745. package/dist/core/ingestion/type-extractors/dart.js +369 -0
  746. package/dist/core/ingestion/type-extractors/go.d.ts +2 -0
  747. package/dist/core/ingestion/type-extractors/go.js +513 -0
  748. package/dist/core/ingestion/type-extractors/jvm.d.ts +3 -0
  749. package/dist/core/ingestion/type-extractors/jvm.js +856 -0
  750. package/dist/core/ingestion/type-extractors/php.d.ts +2 -0
  751. package/dist/core/ingestion/type-extractors/php.js +534 -0
  752. package/dist/core/ingestion/type-extractors/python.d.ts +2 -0
  753. package/dist/core/ingestion/type-extractors/python.js +474 -0
  754. package/dist/core/ingestion/type-extractors/ruby.d.ts +2 -0
  755. package/dist/core/ingestion/type-extractors/ruby.js +377 -0
  756. package/dist/core/ingestion/type-extractors/rust.d.ts +2 -0
  757. package/dist/core/ingestion/type-extractors/rust.js +515 -0
  758. package/dist/core/ingestion/type-extractors/shared.d.ts +131 -0
  759. package/dist/core/ingestion/type-extractors/shared.js +796 -0
  760. package/dist/core/ingestion/type-extractors/swift.d.ts +2 -0
  761. package/dist/core/ingestion/type-extractors/swift.js +484 -0
  762. package/dist/core/ingestion/type-extractors/types.d.ts +172 -0
  763. package/dist/core/ingestion/type-extractors/types.js +1 -0
  764. package/dist/core/ingestion/type-extractors/typescript.d.ts +2 -0
  765. package/dist/core/ingestion/type-extractors/typescript.js +661 -0
  766. package/dist/core/ingestion/utils/ast-helpers.d.ts +89 -0
  767. package/dist/core/ingestion/utils/ast-helpers.js +535 -0
  768. package/dist/core/ingestion/utils/call-analysis.d.ts +75 -0
  769. package/dist/core/ingestion/utils/call-analysis.js +574 -0
  770. package/dist/core/ingestion/utils/env.d.ts +10 -0
  771. package/dist/core/ingestion/utils/env.js +10 -0
  772. package/dist/core/ingestion/utils/event-loop.d.ts +5 -0
  773. package/dist/core/ingestion/utils/event-loop.js +5 -0
  774. package/dist/core/ingestion/utils/graph-sort.d.ts +58 -0
  775. package/dist/core/ingestion/utils/graph-sort.js +100 -0
  776. package/dist/core/ingestion/utils/max-file-size.d.ts +20 -0
  777. package/dist/core/ingestion/utils/max-file-size.js +52 -0
  778. package/dist/core/ingestion/utils/method-props.d.ts +32 -0
  779. package/dist/core/ingestion/utils/method-props.js +147 -0
  780. package/dist/core/ingestion/utils/ruby-self-call.d.ts +52 -0
  781. package/dist/core/ingestion/utils/ruby-self-call.js +59 -0
  782. package/dist/core/ingestion/utils/verbose.d.ts +1 -0
  783. package/dist/core/ingestion/utils/verbose.js +7 -0
  784. package/dist/core/ingestion/variable-extractors/configs/c-cpp.d.ts +3 -0
  785. package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +81 -0
  786. package/dist/core/ingestion/variable-extractors/configs/csharp.d.ts +9 -0
  787. package/dist/core/ingestion/variable-extractors/configs/csharp.js +63 -0
  788. package/dist/core/ingestion/variable-extractors/configs/dart.d.ts +2 -0
  789. package/dist/core/ingestion/variable-extractors/configs/dart.js +94 -0
  790. package/dist/core/ingestion/variable-extractors/configs/go.d.ts +2 -0
  791. package/dist/core/ingestion/variable-extractors/configs/go.js +83 -0
  792. package/dist/core/ingestion/variable-extractors/configs/jvm.d.ts +18 -0
  793. package/dist/core/ingestion/variable-extractors/configs/jvm.js +115 -0
  794. package/dist/core/ingestion/variable-extractors/configs/php.d.ts +14 -0
  795. package/dist/core/ingestion/variable-extractors/configs/php.js +58 -0
  796. package/dist/core/ingestion/variable-extractors/configs/python.d.ts +2 -0
  797. package/dist/core/ingestion/variable-extractors/configs/python.js +101 -0
  798. package/dist/core/ingestion/variable-extractors/configs/ruby.d.ts +11 -0
  799. package/dist/core/ingestion/variable-extractors/configs/ruby.js +52 -0
  800. package/dist/core/ingestion/variable-extractors/configs/rust.d.ts +2 -0
  801. package/dist/core/ingestion/variable-extractors/configs/rust.js +76 -0
  802. package/dist/core/ingestion/variable-extractors/configs/swift.d.ts +2 -0
  803. package/dist/core/ingestion/variable-extractors/configs/swift.js +88 -0
  804. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.d.ts +3 -0
  805. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.js +83 -0
  806. package/dist/core/ingestion/variable-extractors/generic.d.ts +5 -0
  807. package/dist/core/ingestion/variable-extractors/generic.js +80 -0
  808. package/dist/core/ingestion/variable-types.d.ts +82 -0
  809. package/dist/core/ingestion/variable-types.js +2 -0
  810. package/dist/core/ingestion/vue-sfc-extractor.d.ts +44 -0
  811. package/dist/core/ingestion/vue-sfc-extractor.js +94 -0
  812. package/dist/core/ingestion/workers/parse-worker.d.ts +198 -0
  813. package/dist/core/ingestion/workers/parse-worker.js +1928 -0
  814. package/dist/core/ingestion/workers/worker-pool.d.ts +16 -0
  815. package/dist/core/ingestion/workers/worker-pool.js +126 -0
  816. package/dist/core/lbug/csv-generator.d.ts +33 -0
  817. package/dist/core/lbug/csv-generator.js +459 -0
  818. package/dist/core/lbug/lbug-adapter.d.ts +173 -0
  819. package/dist/core/lbug/lbug-adapter.js +1188 -0
  820. package/dist/core/lbug/pool-adapter.d.ts +93 -0
  821. package/dist/core/lbug/pool-adapter.js +543 -0
  822. package/dist/core/lbug/schema.d.ts +62 -0
  823. package/dist/core/lbug/schema.js +484 -0
  824. package/dist/core/run-analyze.d.ts +72 -0
  825. package/dist/core/run-analyze.js +315 -0
  826. package/dist/core/search/bm25-index.d.ts +41 -0
  827. package/dist/core/search/bm25-index.js +209 -0
  828. package/dist/core/search/hybrid-search.d.ts +49 -0
  829. package/dist/core/search/hybrid-search.js +118 -0
  830. package/dist/core/search/phase-timer.d.ts +72 -0
  831. package/dist/core/search/phase-timer.js +106 -0
  832. package/dist/core/tree-sitter/parser-loader.d.ts +8 -0
  833. package/dist/core/tree-sitter/parser-loader.js +84 -0
  834. package/dist/core/wiki/cursor-client.d.ts +31 -0
  835. package/dist/core/wiki/cursor-client.js +122 -0
  836. package/dist/core/wiki/generator.d.ts +129 -0
  837. package/dist/core/wiki/generator.js +898 -0
  838. package/dist/core/wiki/graph-queries.d.ts +84 -0
  839. package/dist/core/wiki/graph-queries.js +244 -0
  840. package/dist/core/wiki/html-viewer.d.ts +10 -0
  841. package/dist/core/wiki/html-viewer.js +303 -0
  842. package/dist/core/wiki/llm-client.d.ts +63 -0
  843. package/dist/core/wiki/llm-client.js +234 -0
  844. package/dist/core/wiki/prompts.d.ts +53 -0
  845. package/dist/core/wiki/prompts.js +181 -0
  846. package/dist/lib/utils.d.ts +1 -0
  847. package/dist/lib/utils.js +3 -0
  848. package/dist/mcp/compatible-stdio-transport.d.ts +25 -0
  849. package/dist/mcp/compatible-stdio-transport.js +200 -0
  850. package/dist/mcp/core/embedder.d.ts +27 -0
  851. package/dist/mcp/core/embedder.js +122 -0
  852. package/dist/mcp/core/lbug-adapter.d.ts +5 -0
  853. package/dist/mcp/core/lbug-adapter.js +5 -0
  854. package/dist/mcp/local/graphstore-handler.d.ts +214 -0
  855. package/dist/mcp/local/graphstore-handler.js +272 -0
  856. package/dist/mcp/local/local-backend.d.ts +347 -0
  857. package/dist/mcp/local/local-backend.js +3218 -0
  858. package/dist/mcp/resources.d.ts +62 -0
  859. package/dist/mcp/resources.js +696 -0
  860. package/dist/mcp/server.d.ts +23 -0
  861. package/dist/mcp/server.js +533 -0
  862. package/dist/mcp/staleness.d.ts +5 -0
  863. package/dist/mcp/staleness.js +4 -0
  864. package/dist/mcp/tools.d.ts +27 -0
  865. package/dist/mcp/tools.js +823 -0
  866. package/dist/server/analyze-job.d.ts +55 -0
  867. package/dist/server/analyze-job.js +150 -0
  868. package/dist/server/analyze-worker.d.ts +13 -0
  869. package/dist/server/analyze-worker.js +59 -0
  870. package/dist/server/api.d.ts +47 -0
  871. package/dist/server/api.js +1727 -0
  872. package/dist/server/git-clone.d.ts +26 -0
  873. package/dist/server/git-clone.js +184 -0
  874. package/dist/server/mcp-http.d.ts +13 -0
  875. package/dist/server/mcp-http.js +100 -0
  876. package/dist/storage/git.d.ts +80 -0
  877. package/dist/storage/git.js +190 -0
  878. package/dist/storage/repo-manager.d.ts +458 -0
  879. package/dist/storage/repo-manager.js +766 -0
  880. package/dist/types/pipeline.d.ts +18 -0
  881. package/dist/types/pipeline.js +1 -0
  882. package/hooks/claude/codragraph-hook.cjs +268 -0
  883. package/hooks/claude/pre-tool-use.sh +79 -0
  884. package/hooks/claude/session-start.sh +42 -0
  885. package/package.json +127 -0
  886. package/scripts/bench-scope-resolution.ts +134 -0
  887. package/scripts/build-tree-sitter-proto.cjs +82 -0
  888. package/scripts/build.js +90 -0
  889. package/scripts/ci-list-migrated-languages.ts +24 -0
  890. package/scripts/patch-tree-sitter-swift.cjs +78 -0
  891. package/skills/codragraph-cli.md +82 -0
  892. package/skills/codragraph-debugging.md +89 -0
  893. package/skills/codragraph-exploring.md +78 -0
  894. package/skills/codragraph-guide.md +64 -0
  895. package/skills/codragraph-impact-analysis.md +97 -0
  896. package/skills/codragraph-pr-review.md +163 -0
  897. package/skills/codragraph-refactoring.md +121 -0
  898. package/vendor/leiden/index.cjs +355 -0
  899. package/vendor/leiden/utils.cjs +392 -0
  900. package/vendor/tree-sitter-proto/binding.gyp +30 -0
  901. package/vendor/tree-sitter-proto/bindings/node/binding.cc +20 -0
  902. package/vendor/tree-sitter-proto/bindings/node/index.d.ts +28 -0
  903. package/vendor/tree-sitter-proto/bindings/node/index.js +7 -0
  904. package/vendor/tree-sitter-proto/package.json +12 -0
  905. package/vendor/tree-sitter-proto/src/node-types.json +1145 -0
  906. package/vendor/tree-sitter-proto/src/parser.c +10149 -0
  907. package/vendor/tree-sitter-proto/src/tree_sitter/alloc.h +54 -0
  908. package/vendor/tree-sitter-proto/src/tree_sitter/array.h +291 -0
  909. package/vendor/tree-sitter-proto/src/tree_sitter/parser.h +266 -0
@@ -0,0 +1,766 @@
1
+ /**
2
+ * Repository Manager
3
+ *
4
+ * Manages CodraGraph index storage in .codragraph/ at repo root.
5
+ * Also maintains a global registry at ~/.codragraph/registry.json
6
+ * so the MCP server can discover indexed repos from any cwd.
7
+ */
8
+ import fs from 'fs/promises';
9
+ import { realpathSync } from 'fs';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ import { getInferredRepoName } from './git.js';
13
+ /**
14
+ * Normalise a repo path for registry comparison across platforms
15
+ * (#664 review feedback from @evander-wang).
16
+ *
17
+ * Why this exists: `path.resolve` alone is NOT enough for
18
+ * cross-platform registry stability.
19
+ * - **macOS**: tmpdirs and `/var` are symlinks to `/private/var`.
20
+ * A child process that stored `/private/var/folders/.../repo` in
21
+ * the registry cannot later be matched by an outer caller that
22
+ * supplies the symlink form `/var/folders/.../repo`. `path.resolve`
23
+ * does not follow symlinks; `realpathSync.native` does.
24
+ * - **Windows**: GitHub runners surface tmpdirs in 8.3 short-name
25
+ * form (`RUNNERA~1\...`), but `process.cwd()` often returns the
26
+ * long form (`runneradmin\...`). `realpathSync.native` normalises
27
+ * both sides to the long-name canonical path.
28
+ *
29
+ * Fallback behaviour: if the path does not exist on disk (e.g. a user
30
+ * passed `codragraph remove some-alias` and the alias misses every
31
+ * registry entry, or the caller is resolving a path that was deleted
32
+ * after registration), we return `path.resolve(p)` rather than
33
+ * throwing. This preserves the idempotent-on-missing semantics of
34
+ * `resolveRegistryEntry` / `remove`.
35
+ *
36
+ * Backwards compatibility: this function is applied to BOTH the
37
+ * caller-supplied input AND each stored `entry.path` at compare time
38
+ * inside `resolveRegistryEntry`, so registries written by older
39
+ * versions (where `registerRepo` only ran `path.resolve`) still match
40
+ * correctly. Newly-written entries are canonicalised at write time too
41
+ * so the registry stabilises over analyze/re-analyze cycles.
42
+ */
43
+ export const canonicalizePath = (p) => {
44
+ const resolved = path.resolve(p);
45
+ try {
46
+ return realpathSync.native(resolved);
47
+ }
48
+ catch {
49
+ return resolved;
50
+ }
51
+ };
52
+ const CODRAGRAPH_DIR = '.codragraph';
53
+ // ─── Local Storage Helpers ─────────────────────────────────────────────
54
+ /**
55
+ * Get the .codragraph storage path for a repository
56
+ */
57
+ export const getStoragePath = (repoPath) => {
58
+ return path.join(path.resolve(repoPath), CODRAGRAPH_DIR);
59
+ };
60
+ /**
61
+ * Get paths to key storage files
62
+ */
63
+ export const getStoragePaths = (repoPath) => {
64
+ const storagePath = getStoragePath(repoPath);
65
+ return {
66
+ storagePath,
67
+ lbugPath: path.join(storagePath, 'lbug'),
68
+ metaPath: path.join(storagePath, 'meta.json'),
69
+ };
70
+ };
71
+ /**
72
+ * Check whether a KuzuDB index exists in the given storage path.
73
+ * Non-destructive — safe to call from status commands.
74
+ */
75
+ export const hasKuzuIndex = async (storagePath) => {
76
+ try {
77
+ await fs.stat(path.join(storagePath, 'kuzu'));
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ };
84
+ /**
85
+ * Clean up stale KuzuDB files after migration to LadybugDB.
86
+ *
87
+ * Returns:
88
+ * found — true if .codragraph/kuzu existed and was deleted
89
+ * needsReindex — true if kuzu existed but lbug does not (re-analyze required)
90
+ *
91
+ * Callers own the user-facing messaging; this function only deletes files.
92
+ */
93
+ export const cleanupOldKuzuFiles = async (storagePath) => {
94
+ const oldPath = path.join(storagePath, 'kuzu');
95
+ const newPath = path.join(storagePath, 'lbug');
96
+ try {
97
+ await fs.stat(oldPath);
98
+ // Old kuzu file/dir exists — determine if lbug is already present
99
+ let needsReindex = false;
100
+ try {
101
+ await fs.stat(newPath);
102
+ }
103
+ catch {
104
+ needsReindex = true;
105
+ }
106
+ // Delete kuzu database file and its sidecars (.wal, .lock)
107
+ for (const suffix of ['', '.wal', '.lock']) {
108
+ try {
109
+ await fs.unlink(oldPath + suffix);
110
+ }
111
+ catch { }
112
+ }
113
+ // Also handle the case where kuzu was stored as a directory
114
+ try {
115
+ await fs.rm(oldPath, { recursive: true, force: true });
116
+ }
117
+ catch { }
118
+ return { found: true, needsReindex };
119
+ }
120
+ catch {
121
+ // Old path doesn't exist — nothing to do
122
+ return { found: false, needsReindex: false };
123
+ }
124
+ };
125
+ /**
126
+ * Load metadata from an indexed repo
127
+ */
128
+ export const loadMeta = async (storagePath) => {
129
+ try {
130
+ const metaPath = path.join(storagePath, 'meta.json');
131
+ const raw = await fs.readFile(metaPath, 'utf-8');
132
+ return JSON.parse(raw);
133
+ }
134
+ catch {
135
+ return null;
136
+ }
137
+ };
138
+ /**
139
+ * Save metadata to storage
140
+ */
141
+ export const saveMeta = async (storagePath, meta) => {
142
+ await fs.mkdir(storagePath, { recursive: true });
143
+ const metaPath = path.join(storagePath, 'meta.json');
144
+ await fs.writeFile(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
145
+ };
146
+ /**
147
+ * Check if a path has a CodraGraph index
148
+ */
149
+ export const hasIndex = async (repoPath) => {
150
+ const { metaPath } = getStoragePaths(repoPath);
151
+ try {
152
+ await fs.access(metaPath);
153
+ return true;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ };
159
+ /**
160
+ * Load an indexed repo from a path
161
+ */
162
+ export const loadRepo = async (repoPath) => {
163
+ const paths = getStoragePaths(repoPath);
164
+ const meta = await loadMeta(paths.storagePath);
165
+ if (!meta)
166
+ return null;
167
+ return {
168
+ repoPath: path.resolve(repoPath),
169
+ ...paths,
170
+ meta,
171
+ };
172
+ };
173
+ /**
174
+ * Find .codragraph by walking up from a starting path
175
+ */
176
+ export const findRepo = async (startPath) => {
177
+ let current = path.resolve(startPath);
178
+ const root = path.parse(current).root;
179
+ while (current !== root) {
180
+ const repo = await loadRepo(current);
181
+ if (repo)
182
+ return repo;
183
+ current = path.dirname(current);
184
+ }
185
+ return null;
186
+ };
187
+ /**
188
+ * Add .codragraph to .gitignore if not already present
189
+ */
190
+ export const addToGitignore = async (repoPath) => {
191
+ const gitignorePath = path.join(repoPath, '.gitignore');
192
+ try {
193
+ const content = await fs.readFile(gitignorePath, 'utf-8');
194
+ if (content.includes(CODRAGRAPH_DIR))
195
+ return;
196
+ const newContent = content.endsWith('\n')
197
+ ? `${content}${CODRAGRAPH_DIR}\n`
198
+ : `${content}\n${CODRAGRAPH_DIR}\n`;
199
+ await fs.writeFile(gitignorePath, newContent, 'utf-8');
200
+ }
201
+ catch {
202
+ // .gitignore doesn't exist, create it
203
+ await fs.writeFile(gitignorePath, `${CODRAGRAPH_DIR}\n`, 'utf-8');
204
+ }
205
+ };
206
+ // ─── Global Registry (~/.codragraph/registry.json) ───────────────────────
207
+ /**
208
+ * Get the path to the global CodraGraph directory
209
+ */
210
+ export const getGlobalDir = () => {
211
+ return process.env.CODRAGRAPH_HOME || path.join(os.homedir(), '.codragraph');
212
+ };
213
+ /**
214
+ * Get the path to the global registry file
215
+ */
216
+ export const getGlobalRegistryPath = () => {
217
+ return path.join(getGlobalDir(), 'registry.json');
218
+ };
219
+ /**
220
+ * Read the global registry. Returns empty array if not found.
221
+ */
222
+ export const readRegistry = async () => {
223
+ try {
224
+ const raw = await fs.readFile(getGlobalRegistryPath(), 'utf-8');
225
+ const data = JSON.parse(raw);
226
+ return Array.isArray(data) ? data : [];
227
+ }
228
+ catch {
229
+ return [];
230
+ }
231
+ };
232
+ /**
233
+ * Write the global registry to disk
234
+ */
235
+ const writeRegistry = async (entries) => {
236
+ const dir = getGlobalDir();
237
+ await fs.mkdir(dir, { recursive: true });
238
+ await fs.writeFile(getGlobalRegistryPath(), JSON.stringify(entries, null, 2), 'utf-8');
239
+ };
240
+ /**
241
+ * Thrown by {@link registerRepo} when a requested name is already in
242
+ * use by a DIFFERENT path. The CLI layer surfaces this as an actionable
243
+ * error instead of relying on `.message` string-matching.
244
+ *
245
+ * The colliding alias is exposed as `err.registryName` (not `err.name`).
246
+ * `err.name` keeps its inherited `Error.prototype.name` semantics (the
247
+ * class name) so downstream code can do the usual `err.name ===
248
+ * 'RegistryNameCollisionError'` checks; use the `kind` discriminant or
249
+ * `instanceof RegistryNameCollisionError` for type-safe narrowing.
250
+ */
251
+ export class RegistryNameCollisionError extends Error {
252
+ registryName;
253
+ existingPath;
254
+ requestedPath;
255
+ kind = 'RegistryNameCollisionError';
256
+ constructor(registryName, existingPath, requestedPath) {
257
+ super(`Registry name "${registryName}" is already used by "${existingPath}".\n` +
258
+ `Pass --name <alias> to register "${requestedPath}" under a different name, ` +
259
+ `or --allow-duplicate-name to allow both paths under the same name (leaves -r <name> ambiguous for these two).`);
260
+ this.registryName = registryName;
261
+ this.existingPath = existingPath;
262
+ this.requestedPath = requestedPath;
263
+ this.name = 'RegistryNameCollisionError';
264
+ }
265
+ }
266
+ /** Returns true when a previously-registered entry's `name` differs from
267
+ * both `path.basename(entry.path)` and the git-remote-derived name —
268
+ * i.e. a user explicitly aliased it via `analyze --name <alias>` on a
269
+ * prior run. Used to preserve the alias across re-analyses that omit
270
+ * `--name`. The remote-derived name is treated as an inference, not a
271
+ * custom alias, so re-analyses keep tracking remote renames.
272
+ *
273
+ * `inferredName` is passed in (rather than re-derived) so callers can
274
+ * avoid a second `git config` subprocess invocation. */
275
+ const hasCustomAlias = (entry, inferredName) => {
276
+ const resolved = path.resolve(entry.path);
277
+ if (entry.name === path.basename(resolved))
278
+ return false;
279
+ if (inferredName && entry.name === inferredName)
280
+ return false;
281
+ return true;
282
+ };
283
+ /**
284
+ * Register (add or update) a repo in the global registry.
285
+ * Called after `codragraph analyze` completes.
286
+ *
287
+ * Name resolution precedence (#829, #979):
288
+ * 1. explicit `opts.name` (from `analyze --name <alias>`)
289
+ * 2. preserved alias on an existing entry for this path
290
+ * 3. `git config --get remote.origin.url` repo name (#979 — recovers
291
+ * a meaningful name for monorepo subprojects, git worktrees, and
292
+ * Gas-Town-style `<rig>/refinery/rig/` layouts where the basename
293
+ * is generic)
294
+ * 4. `path.basename(repoPath)` (the original default)
295
+ *
296
+ * Duplicate-name guard: if another path already uses the resolved
297
+ * `name`, throw {@link RegistryNameCollisionError} unless
298
+ * `opts.allowDuplicateName` is set. The guard ONLY fires when the user explicitly passed a
299
+ * `name`; un-aliased basename collisions continue to register silently
300
+ * so existing users who don't know about `--name` see no behaviour
301
+ * change.
302
+ *
303
+ * Returns the `name` that was actually written to the registry — the
304
+ * caller can re-use it to keep AGENTS.md / skill files aligned with the
305
+ * MCP-visible repo name (#979).
306
+ */
307
+ export const registerRepo = async (repoPath, meta, opts) => {
308
+ // Preserve the caller's chosen path form in the registry — don't
309
+ // canonicalise at write time. This matters for two reasons:
310
+ // 1. `list` and error messages show the path the user actually
311
+ // knows (e.g. the 8.3 short form they typed), not a runtime-
312
+ // resolved long form they've never seen.
313
+ // 2. Keeps pre-existing #829 test assertions that compare
314
+ // `err.existingPath` against `path.resolve(tmpPath)` stable.
315
+ // Canonicalisation is applied at COMPARE points only (see below),
316
+ // which is where the cross-platform divergence actually matters.
317
+ const resolved = path.resolve(repoPath);
318
+ const { storagePath } = getStoragePaths(resolved);
319
+ // Canonical form used strictly for comparison — `realpathSync.native`
320
+ // expands macOS /var → /private/var and Windows 8.3 → long-name,
321
+ // falling back to `path.resolve` when the path doesn't exist.
322
+ const canonicalInput = canonicalizePath(repoPath);
323
+ const entries = await readRegistry();
324
+ const existingIdx = entries.findIndex((e) => {
325
+ // Canonicalise the STORED entry too so pre-canonicalisation
326
+ // registries (written by older versions, or paths passed in a
327
+ // different form) still match correctly. `canonicalizePath` falls
328
+ // back to `path.resolve` when the path no longer exists on disk,
329
+ // so stale entries that have been rm'd externally still resolve
330
+ // to a stable key instead of throwing.
331
+ const a = canonicalizePath(e.path);
332
+ const b = canonicalInput;
333
+ return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
334
+ });
335
+ const existing = existingIdx >= 0 ? entries[existingIdx] : null;
336
+ // Precedence: explicit --name > preserved alias > remote-inferred > basename.
337
+ // Skip the `git config` subprocess entirely when --name was passed —
338
+ // the remote isn't consulted in that case.
339
+ let name;
340
+ let isPreservedAlias = false;
341
+ if (opts?.name !== undefined) {
342
+ name = opts.name;
343
+ }
344
+ else {
345
+ // Compute the remote-derived name at most once. It feeds both the
346
+ // alias-preservation check (`hasCustomAlias` needs it to distinguish
347
+ // a sticky user alias from a previously-stored remote inference) and
348
+ // the fallback name when neither --name nor a preserved alias apply.
349
+ const inferred = getInferredRepoName(resolved);
350
+ if (existing && hasCustomAlias(existing, inferred)) {
351
+ name = existing.name;
352
+ isPreservedAlias = true;
353
+ }
354
+ else {
355
+ name = inferred ?? path.basename(resolved);
356
+ }
357
+ }
358
+ // Duplicate-name guard: only fire when the user EXPLICITLY asked for
359
+ // this name (via opts.name or a preserved alias). Unqualified basename
360
+ // and remote-inferred collisions are preserved for backward-compat —
361
+ // they still register, and the user sees the ambiguity at `-r` / `list`
362
+ // resolution time (which is already improved by the disambiguated error
363
+ // messages and list output #829 ships).
364
+ const explicitName = opts?.name !== undefined || isPreservedAlias;
365
+ if (explicitName && !opts?.allowDuplicateName) {
366
+ // Compare canonical-vs-canonical here too so `/var/foo` and
367
+ // `/private/var/foo` (same repo, different form) aren't treated as
368
+ // two colliding paths.
369
+ const collidingEntry = entries.find((e, i) => i !== existingIdx &&
370
+ e.name.toLowerCase() === name.toLowerCase() &&
371
+ canonicalizePath(e.path) !== canonicalInput);
372
+ if (collidingEntry) {
373
+ throw new RegistryNameCollisionError(name, collidingEntry.path, resolved);
374
+ }
375
+ }
376
+ const entry = {
377
+ name,
378
+ path: resolved,
379
+ storagePath,
380
+ indexedAt: meta.indexedAt,
381
+ lastCommit: meta.lastCommit,
382
+ remoteUrl: meta.remoteUrl,
383
+ currentBranch: meta.currentBranch,
384
+ headCommit: meta.headCommit,
385
+ stats: meta.stats,
386
+ };
387
+ if (existingIdx >= 0) {
388
+ entries[existingIdx] = entry;
389
+ }
390
+ else {
391
+ entries.push(entry);
392
+ }
393
+ await writeRegistry(entries);
394
+ return name;
395
+ };
396
+ /**
397
+ * Remove a repo from the global registry.
398
+ * Called after `codragraph clean`.
399
+ */
400
+ export const unregisterRepo = async (repoPath) => {
401
+ // Canonicalise BOTH sides so an unregister call issued with the
402
+ // symlink form (`/var/folders/.../repo`) still matches an entry
403
+ // written with the realpath form (`/private/var/folders/.../repo`),
404
+ // and vice versa. Matches the semantics of `registerRepo` and
405
+ // `resolveRegistryEntry` post-#1003 review.
406
+ const resolved = canonicalizePath(repoPath);
407
+ const entries = await readRegistry();
408
+ const matches = (a, b) => process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
409
+ const filtered = entries.filter((e) => !matches(canonicalizePath(e.path), resolved));
410
+ await writeRegistry(filtered);
411
+ };
412
+ /**
413
+ * Thrown by {@link resolveRegistryEntry} when no registered repo matches
414
+ * the caller's target string (by alias, basename, remote-inferred name,
415
+ * or resolved path). CLI callers that want idempotent "remove" semantics
416
+ * should catch this and exit 0 with a warning; non-idempotent callers
417
+ * (e.g. MCP tools) can surface the error directly.
418
+ */
419
+ export class RegistryNotFoundError extends Error {
420
+ target;
421
+ availableNames;
422
+ kind = 'RegistryNotFoundError';
423
+ constructor(target, availableNames) {
424
+ const hint = availableNames.length > 0
425
+ ? ` Available: ${availableNames.join(', ')}.`
426
+ : ' No repositories are currently registered.';
427
+ super(`No registered repo matches "${target}".${hint}`);
428
+ this.target = target;
429
+ this.availableNames = availableNames;
430
+ this.name = 'RegistryNotFoundError';
431
+ }
432
+ }
433
+ /**
434
+ * Thrown by {@link resolveRegistryEntry} when the target string matches
435
+ * the `name` of two or more entries — only possible when the user
436
+ * previously registered duplicates via `analyze --name X
437
+ * --allow-duplicate-name` (#829). The error carries enough information
438
+ * for the caller to render an actionable disambiguation hint without
439
+ * string-matching on `.message`.
440
+ *
441
+ * `kind` is a string literal discriminant (same pattern as
442
+ * {@link RegistryNameCollisionError}) so callers can narrow via
443
+ * `err.kind === 'RegistryAmbiguousTargetError'` without importing the
444
+ * class.
445
+ */
446
+ export class RegistryAmbiguousTargetError extends Error {
447
+ target;
448
+ matches;
449
+ kind = 'RegistryAmbiguousTargetError';
450
+ constructor(target, matches) {
451
+ const listing = matches.map((m) => ` - ${m.name} (${m.path})`).join('\n');
452
+ super(`Multiple registered repos match "${target}":\n${listing}\n` +
453
+ `Pass the absolute path instead to disambiguate.`);
454
+ this.target = target;
455
+ this.matches = matches;
456
+ this.name = 'RegistryAmbiguousTargetError';
457
+ }
458
+ }
459
+ /**
460
+ * Thrown by {@link assertSafeStoragePath} when a registry entry's
461
+ * `storagePath` does NOT point at the expected `<entry.path>/.codragraph`
462
+ * subfolder. CLI destructive commands (`remove`, `clean --all`) should
463
+ * catch this and exit non-zero without deleting anything — the usual
464
+ * cause is a corrupted or hand-edited `~/.codragraph/registry.json`, and
465
+ * proceeding would mean `fs.rm(recursive: true)` on whatever odd path
466
+ * the entry is pointing at.
467
+ */
468
+ export class UnsafeStoragePathError extends Error {
469
+ entry;
470
+ expectedStoragePath;
471
+ actualStoragePath;
472
+ kind = 'UnsafeStoragePathError';
473
+ constructor(entry, expectedStoragePath, actualStoragePath) {
474
+ super(`Refusing to remove storage path for safety: expected ` +
475
+ `"${expectedStoragePath}" under the repo's .codragraph subfolder, ` +
476
+ `but the registry entry has "${actualStoragePath}". ` +
477
+ `This usually means the registry entry is corrupted or was ` +
478
+ `hand-edited. Delete the entry manually from ~/.codragraph/registry.json ` +
479
+ `and re-run analyze.`);
480
+ this.entry = entry;
481
+ this.expectedStoragePath = expectedStoragePath;
482
+ this.actualStoragePath = actualStoragePath;
483
+ this.name = 'UnsafeStoragePathError';
484
+ }
485
+ }
486
+ /**
487
+ * Guard rail for destructive CLI paths (`remove` #664,
488
+ * `clean --all` #258, future MCP `remove` tool): verify that a
489
+ * registry entry's `storagePath` is the canonical `<repo>/.codragraph`
490
+ * subfolder of its `path`. If not, throw {@link UnsafeStoragePathError}
491
+ * so the caller exits without touching disk.
492
+ *
493
+ * Why this exists (#1003 review — @magyargergo):
494
+ * - `~/.codragraph/registry.json` is a plain-text user-writable file.
495
+ * A corrupted, hand-edited, or downgrade/upgrade-racing entry
496
+ * could plausibly end up with `storagePath === ""` (resolves to
497
+ * cwd), `storagePath === path` (the repo root!), `storagePath`
498
+ * equal to a parent/sibling of the repo, or simply any arbitrary
499
+ * filesystem path.
500
+ * - `fs.rm(recursive: true, force: true)` on ANY of those would be
501
+ * a runtime disaster — at best delete the user's working tree, at
502
+ * worst nuke an unrelated directory tree they happen to own.
503
+ * - `clean` (default, cwd-scoped) is safe by construction — it
504
+ * re-derives storagePath from `findRepo(cwd)` and never trusts
505
+ * the registry field. But `clean --all` DOES iterate the registry
506
+ * and trust each entry's stored storagePath (same shape as
507
+ * `remove`), so this helper must be wired into that loop too.
508
+ * - `server/api.ts` recomputes storagePath from `getStoragePath(entry.path)`
509
+ * and so is likewise safe-by-construction.
510
+ *
511
+ * Pure string check — does NOT require the paths to exist on disk.
512
+ * Windows: case-insensitive; POSIX: case-sensitive. Matches the
513
+ * comparison shape used elsewhere in this module.
514
+ */
515
+ export const assertSafeStoragePath = (entry) => {
516
+ const expected = path.join(path.resolve(entry.path), '.codragraph');
517
+ const actual = path.resolve(entry.storagePath);
518
+ const matches = process.platform === 'win32'
519
+ ? expected.toLowerCase() === actual.toLowerCase()
520
+ : expected === actual;
521
+ if (!matches) {
522
+ throw new UnsafeStoragePathError(entry, expected, actual);
523
+ }
524
+ };
525
+ /**
526
+ * Resolve a user-supplied target string (from `codragraph remove <target>`
527
+ * or equivalent MCP tool argument) to a single registry entry.
528
+ *
529
+ * Match precedence (first hit wins, subsequent tiers are only tried if
530
+ * the prior tier produces zero matches):
531
+ * 1. Exact resolved-path match (Windows: case-insensitive).
532
+ * Paths are unique by registry construction, so a path match can
533
+ * never be ambiguous.
534
+ * 2. Exact `name` match (case-insensitive). If ≥ 2 entries share the
535
+ * name — only possible via `--allow-duplicate-name` (#829) —
536
+ * throws {@link RegistryAmbiguousTargetError}.
537
+ *
538
+ * No fuzzy / partial matching — unambiguous, scriptable behaviour is
539
+ * more important than convenience for destructive commands.
540
+ *
541
+ * Throws {@link RegistryNotFoundError} if no entry matches.
542
+ *
543
+ * `entries` is passed in (rather than re-read) so callers that already
544
+ * hold the registry snapshot (e.g. to print a "before" state) can avoid
545
+ * a second disk read, and so tests can inject fixtures without touching
546
+ * `CODRAGRAPH_HOME`.
547
+ */
548
+ export const resolveRegistryEntry = (entries, target) => {
549
+ // Tier 1: path match. Canonicalise BOTH sides so symlink and
550
+ // Windows-8.3 quirks don't cause a false miss — e.g. the caller
551
+ // passes `/var/folders/.../repo` while the registry has
552
+ // `/private/var/folders/.../repo` (both resolve to the same
553
+ // `realpath.native`). See `canonicalizePath` for the rationale.
554
+ //
555
+ // Canonicalising the STORED entry (not just the input) is what gives
556
+ // us backward-compat for registries written by versions that only
557
+ // ran `path.resolve` — both get canonicalised here at compare time.
558
+ const canonicalTarget = canonicalizePath(target);
559
+ const pathMatch = entries.find((e) => {
560
+ const a = canonicalizePath(e.path);
561
+ const b = canonicalTarget;
562
+ return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
563
+ });
564
+ if (pathMatch)
565
+ return pathMatch;
566
+ // Tier 2: name match. Case-insensitive on all platforms — registry
567
+ // name collisions are already filtered case-insensitively in
568
+ // `registerRepo`, so "APP" vs "app" are considered the same key.
569
+ const targetLower = target.toLowerCase();
570
+ const nameMatches = entries.filter((e) => e.name.toLowerCase() === targetLower);
571
+ if (nameMatches.length === 1)
572
+ return nameMatches[0];
573
+ if (nameMatches.length > 1) {
574
+ throw new RegistryAmbiguousTargetError(target, nameMatches);
575
+ }
576
+ // Tier 3: miss. Build the available-names hint ONCE; resolveRepo-style
577
+ // disambiguated labels (`app (/path)`) are applied when the same name
578
+ // appears in multiple entries so the user sees the same hint shape as
579
+ // `-r <name>` errors.
580
+ const nameCounts = new Map();
581
+ for (const e of entries) {
582
+ const key = e.name.toLowerCase();
583
+ nameCounts.set(key, (nameCounts.get(key) ?? 0) + 1);
584
+ }
585
+ const availableNames = entries.map((e) => (nameCounts.get(e.name.toLowerCase()) ?? 0) > 1 ? `${e.name} (${e.path})` : e.name);
586
+ throw new RegistryNotFoundError(target, availableNames);
587
+ };
588
+ /**
589
+ * List all registered repos from the global registry.
590
+ * Optionally validates that each entry's .codragraph/ still exists.
591
+ */
592
+ export const listRegisteredRepos = async (opts) => {
593
+ const entries = await readRegistry();
594
+ if (!opts?.validate)
595
+ return entries;
596
+ // Validate each entry still has a .codragraph/ directory
597
+ const valid = [];
598
+ for (const entry of entries) {
599
+ try {
600
+ await fs.access(path.join(entry.storagePath, 'meta.json'));
601
+ valid.push(entry);
602
+ }
603
+ catch {
604
+ // Index no longer exists — skip
605
+ }
606
+ }
607
+ // If we pruned any entries, save the cleaned registry
608
+ if (valid.length !== entries.length) {
609
+ await writeRegistry(valid);
610
+ }
611
+ return valid;
612
+ };
613
+ /**
614
+ * Get the path to the global CLI config file
615
+ */
616
+ export const getGlobalConfigPath = () => {
617
+ return path.join(getGlobalDir(), 'config.json');
618
+ };
619
+ /**
620
+ * Load CLI config from ~/.codragraph/config.json
621
+ */
622
+ export const loadCLIConfig = async () => {
623
+ try {
624
+ const raw = await fs.readFile(getGlobalConfigPath(), 'utf-8');
625
+ return JSON.parse(raw);
626
+ }
627
+ catch {
628
+ return {};
629
+ }
630
+ };
631
+ /**
632
+ * Save CLI config to ~/.codragraph/config.json
633
+ */
634
+ export const saveCLIConfig = async (config) => {
635
+ const dir = getGlobalDir();
636
+ await fs.mkdir(dir, { recursive: true });
637
+ const configPath = getGlobalConfigPath();
638
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
639
+ // Restrict file permissions on Unix (config may contain API keys)
640
+ if (process.platform !== 'win32') {
641
+ try {
642
+ await fs.chmod(configPath, 0o600);
643
+ }
644
+ catch {
645
+ /* best-effort */
646
+ }
647
+ }
648
+ };
649
+ // ─── Multi-provider config helpers ─────────────────────────────────────
650
+ //
651
+ // These wrap the file-based config so callers can `getProviderConfig`
652
+ // without thinking about the legacy flat fields vs the new `providers`
653
+ // map. When the multi-provider entry is present it wins; otherwise we
654
+ // promote the matching legacy field so older configs keep working.
655
+ /** Default env var per provider — used as the lowest-priority fallback. */
656
+ const PROVIDER_ENV_VARS = {
657
+ claude: 'ANTHROPIC_API_KEY',
658
+ openai: 'OPENAI_API_KEY',
659
+ opencode: 'OPENCODE_API_KEY',
660
+ openrouter: 'OPENROUTER_API_KEY',
661
+ azure: 'AZURE_OPENAI_API_KEY',
662
+ cursor: 'CURSOR_API_KEY',
663
+ custom: 'CODRAGRAPH_CUSTOM_API_KEY',
664
+ };
665
+ /**
666
+ * Resolve a provider's effective config. Resolution order:
667
+ * 1. config.providers[name] (canonical, multi-provider)
668
+ * 2. config.{apiKey,model,...} when the legacy provider field matches
669
+ * 3. process.env[PROVIDER_ENV_VARS[name]] (BYO via env)
670
+ * Returns `null` when nothing is configured for the provider.
671
+ */
672
+ export const getProviderConfig = (config, name) => {
673
+ const explicit = config.providers?.[name];
674
+ if (explicit?.apiKey || explicit?.baseUrl || explicit?.model) {
675
+ return explicit;
676
+ }
677
+ // Legacy promotion: only when the flat `provider` field matches AND
678
+ // an apiKey is present.
679
+ if (config.provider === name && config.apiKey) {
680
+ const promoted = { apiKey: config.apiKey };
681
+ if (config.model !== undefined)
682
+ promoted.model = config.model;
683
+ if (config.baseUrl !== undefined)
684
+ promoted.baseUrl = config.baseUrl;
685
+ if (config.apiVersion !== undefined)
686
+ promoted.apiVersion = config.apiVersion;
687
+ if (config.isReasoningModel !== undefined)
688
+ promoted.isReasoningModel = config.isReasoningModel;
689
+ return promoted;
690
+ }
691
+ const envKey = process.env[PROVIDER_ENV_VARS[name]];
692
+ if (envKey)
693
+ return { apiKey: envKey };
694
+ return null;
695
+ };
696
+ /**
697
+ * Update a single provider's config. Persists to disk. Pass `patch`
698
+ * with only the fields you want to change — others are merged.
699
+ */
700
+ export const setProviderConfig = async (name, patch) => {
701
+ const config = await loadCLIConfig();
702
+ const providers = { ...(config.providers ?? {}) };
703
+ providers[name] = { ...(providers[name] ?? {}), ...patch };
704
+ await saveCLIConfig({ ...config, providers });
705
+ };
706
+ /** Delete a provider's config. Idempotent. */
707
+ export const removeProviderConfig = async (name) => {
708
+ const config = await loadCLIConfig();
709
+ if (!config.providers || !(name in config.providers))
710
+ return;
711
+ const providers = { ...config.providers };
712
+ delete providers[name];
713
+ await saveCLIConfig({ ...config, providers });
714
+ };
715
+ /** List every configured provider with non-secret fields. Used by `codragraph config list`. */
716
+ export const listProviderConfigs = async () => {
717
+ const config = await loadCLIConfig();
718
+ const out = [];
719
+ for (const name of Object.keys(PROVIDER_ENV_VARS)) {
720
+ const cfg = getProviderConfig(config, name);
721
+ if (!cfg)
722
+ continue;
723
+ const entry = { name, hasKey: !!cfg.apiKey };
724
+ if (cfg.baseUrl !== undefined)
725
+ entry.baseUrl = cfg.baseUrl;
726
+ if (cfg.model !== undefined)
727
+ entry.model = cfg.model;
728
+ out.push(entry);
729
+ }
730
+ return out;
731
+ };
732
+ // ─── Sibling-clone detection ─────────────────────────────────────────────
733
+ //
734
+ // A "sibling clone" is a different on-disk path that points at the same
735
+ // logical repository (same `origin` remote URL) as a registered index.
736
+ // This shows up in three operationally important shapes (see issue):
737
+ //
738
+ // 1. The same repo is checked out under multiple paths (worktrees,
739
+ // multi-agent workspaces). Only one is indexed; the others silently
740
+ // diverge from the graph.
741
+ // 2. The indexed clone is itself behind its own HEAD (the existing
742
+ // `checkStaleness` already handles this case).
743
+ // 3. A query is issued from a `cwd` that lives inside a sibling clone
744
+ // whose HEAD has drifted from the indexed `lastCommit`.
745
+ //
746
+ // Detection is intentionally remote-URL-based and does NOT walk the
747
+ // filesystem hunting for unregistered clones — only registered entries
748
+ // are considered. The `cwd`-driven branch ({@link checkSiblingDrift})
749
+ // also accepts an unregistered cwd, because the live caller's working
750
+ // directory is the one place we can cheaply learn about an
751
+ // unregistered clone.
752
+ /**
753
+ * Find other registered entries whose `remoteUrl` matches the given
754
+ * one, excluding `selfPath` (case-insensitive on Windows). Entries
755
+ * without a `remoteUrl` are ignored — we cannot prove sibling-ness
756
+ * without a fingerprint.
757
+ */
758
+ export const findSiblingClones = async (remoteUrl, selfPath) => {
759
+ if (!remoteUrl)
760
+ return [];
761
+ const entries = await readRegistry();
762
+ const isWin = process.platform === 'win32';
763
+ const norm = (p) => (isWin ? path.resolve(p).toLowerCase() : path.resolve(p));
764
+ const self = norm(selfPath);
765
+ return entries.filter((e) => e.remoteUrl === remoteUrl && norm(e.path) !== self);
766
+ };