gitnexus 1.6.10-rc.99 → 1.6.10

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 (775) hide show
  1. package/README.md +177 -18
  2. package/dist/_shared/graph/types.d.ts +21 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +3 -3
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +1 -1
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  9. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  10. package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +19 -7
  13. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  14. package/dist/_shared/language-detection.d.ts.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +3 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  22. package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
  23. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  24. package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
  25. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  27. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  29. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  30. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  33. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  34. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  35. package/dist/_shared/scope-resolution/types.d.ts +278 -3
  36. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  37. package/dist/cli/ai-context.d.ts +3 -2
  38. package/dist/cli/ai-context.js +71 -16
  39. package/dist/cli/analyze-config.d.ts +1 -1
  40. package/dist/cli/analyze-options.d.ts +131 -0
  41. package/dist/cli/analyze-options.js +1 -0
  42. package/dist/cli/analyze.d.ts +21 -113
  43. package/dist/cli/analyze.js +172 -29
  44. package/dist/cli/cli-message.d.ts +1 -1
  45. package/dist/cli/detect-changes-format.js +19 -2
  46. package/dist/cli/doctor.d.ts +12 -0
  47. package/dist/cli/doctor.js +32 -5
  48. package/dist/cli/editor-targets.js +6 -0
  49. package/dist/cli/eval-server.js +2 -1
  50. package/dist/cli/format-symbol.d.ts +15 -0
  51. package/dist/cli/format-symbol.js +17 -0
  52. package/dist/cli/generated-skill.d.ts +17 -0
  53. package/dist/cli/generated-skill.js +1 -0
  54. package/dist/cli/group.js +229 -21
  55. package/dist/cli/help-i18n.js +1 -2
  56. package/dist/cli/i18n/en.d.ts +11 -9
  57. package/dist/cli/i18n/en.js +13 -9
  58. package/dist/cli/i18n/resources.d.ts +15 -11
  59. package/dist/cli/i18n/zh-CN.d.ts +4 -2
  60. package/dist/cli/i18n/zh-CN.js +11 -9
  61. package/dist/cli/index.js +8 -4
  62. package/dist/cli/resolve-invocation.d.ts +7 -3
  63. package/dist/cli/resolve-invocation.js +7 -3
  64. package/dist/cli/setup.js +4 -3
  65. package/dist/cli/skill-gen.d.ts +1 -6
  66. package/dist/cli/tool.d.ts +1 -0
  67. package/dist/cli/tool.js +74 -17
  68. package/dist/cli/wiki.js +53 -10
  69. package/dist/config/ignore-service.d.ts +2 -0
  70. package/dist/config/ignore-service.js +54 -13
  71. package/dist/core/analyzer-identity.d.ts +80 -0
  72. package/dist/core/analyzer-identity.js +364 -26
  73. package/dist/core/augmentation/engine.js +86 -71
  74. package/dist/core/embedding-checkpoint.d.ts +143 -0
  75. package/dist/core/embedding-checkpoint.js +221 -0
  76. package/dist/core/embedding-count.d.ts +61 -0
  77. package/dist/core/embedding-count.js +69 -0
  78. package/dist/core/embeddings/ast-utils.js +9 -1
  79. package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
  80. package/dist/core/embeddings/embedding-pipeline.js +253 -14
  81. package/dist/core/embeddings/http-client.d.ts +5 -0
  82. package/dist/core/embeddings/http-client.js +142 -27
  83. package/dist/core/graph/graph.js +3 -0
  84. package/dist/core/graph/import-cycles.d.ts +194 -3
  85. package/dist/core/graph/import-cycles.js +522 -73
  86. package/dist/core/graph/types.d.ts +18 -0
  87. package/dist/core/group/bridge-db.d.ts +204 -1
  88. package/dist/core/group/bridge-db.js +401 -28
  89. package/dist/core/group/completeness.d.ts +130 -0
  90. package/dist/core/group/completeness.js +83 -0
  91. package/dist/core/group/config-parser.js +0 -5
  92. package/dist/core/group/cross-impact.d.ts +46 -1
  93. package/dist/core/group/cross-impact.js +220 -19
  94. package/dist/core/group/cross-trace.d.ts +32 -11
  95. package/dist/core/group/cross-trace.js +114 -20
  96. package/dist/core/group/extractors/http-patterns/java.js +278 -22
  97. package/dist/core/group/extractors/http-patterns/node.js +332 -216
  98. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  99. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  100. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  101. package/dist/core/group/extractors/include-extractor.js +20 -2
  102. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  103. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  104. package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
  105. package/dist/core/group/group-lock.d.ts +31 -0
  106. package/dist/core/group/group-lock.js +166 -0
  107. package/dist/core/group/service.js +297 -16
  108. package/dist/core/group/storage.d.ts +3 -0
  109. package/dist/core/group/storage.js +7 -39
  110. package/dist/core/group/sync.d.ts +49 -3
  111. package/dist/core/group/sync.js +0 -0
  112. package/dist/core/group/types.d.ts +183 -8
  113. package/dist/core/group/types.js +28 -1
  114. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  115. package/dist/core/incremental/subgraph-extract.js +33 -10
  116. package/dist/core/index-freshness.d.ts +77 -2
  117. package/dist/core/index-freshness.js +109 -2
  118. package/dist/core/ingestion/call-processor.d.ts +13 -1
  119. package/dist/core/ingestion/call-processor.js +110 -3
  120. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  121. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  122. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  123. package/dist/core/ingestion/cfg/emit.js +9 -23
  124. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  125. package/dist/core/ingestion/cluster-enricher.js +8 -4
  126. package/dist/core/ingestion/community-processor.d.ts +21 -3
  127. package/dist/core/ingestion/community-processor.js +81 -82
  128. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  129. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  130. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  131. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  132. package/dist/core/ingestion/di-extractors/types.js +15 -0
  133. package/dist/core/ingestion/filesystem-walker.js +30 -14
  134. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  139. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  141. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  143. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  145. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  148. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  150. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  152. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  154. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  156. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  157. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  158. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  159. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  160. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  161. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  162. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  163. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  165. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  167. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  169. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  171. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  172. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  173. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  174. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  175. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  176. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  177. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  178. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  179. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  180. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  181. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  182. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  184. package/dist/core/ingestion/language-config.d.ts +29 -1
  185. package/dist/core/ingestion/language-config.js +110 -35
  186. package/dist/core/ingestion/language-provider.d.ts +209 -7
  187. package/dist/core/ingestion/language-provider.js +37 -0
  188. package/dist/core/ingestion/languages/c/captures.js +7 -0
  189. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  190. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  191. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  192. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  193. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  194. package/dist/core/ingestion/languages/cobol.js +13 -0
  195. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  196. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  197. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  198. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  199. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  201. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  202. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  203. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  204. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  205. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  207. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  208. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  209. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  210. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  211. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  212. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  213. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  214. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  215. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  216. package/dist/core/ingestion/languages/dart/index.js +1 -1
  217. package/dist/core/ingestion/languages/dart/query.js +98 -1
  218. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  219. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  220. package/dist/core/ingestion/languages/dart.js +6 -1
  221. package/dist/core/ingestion/languages/go/captures.js +108 -3
  222. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  224. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  225. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  226. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  227. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  229. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  231. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  232. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  233. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  234. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  235. package/dist/core/ingestion/languages/go/query.js +56 -3
  236. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  237. package/dist/core/ingestion/languages/go.js +9 -0
  238. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  240. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  242. package/dist/core/ingestion/languages/java/captures.js +77 -32
  243. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  244. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  245. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  246. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  247. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  248. package/dist/core/ingestion/languages/java/query.js +15 -3
  249. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  250. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  251. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  252. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  253. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  254. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  256. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  257. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  258. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  260. package/dist/core/ingestion/languages/java.js +94 -3
  261. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  262. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  263. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  264. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  265. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  266. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  267. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  268. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  269. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  270. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  271. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  272. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  274. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  275. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  277. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  278. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  279. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  281. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  282. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  283. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  289. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  291. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  292. package/dist/core/ingestion/languages/php/captures.js +319 -51
  293. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  294. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  295. package/dist/core/ingestion/languages/php/query.js +31 -0
  296. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  298. package/dist/core/ingestion/languages/python/captures.js +29 -0
  299. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  300. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  301. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  302. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  303. package/dist/core/ingestion/languages/python/index.js +1 -1
  304. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  305. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  306. package/dist/core/ingestion/languages/python/query.js +9 -0
  307. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  308. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  309. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  310. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  311. package/dist/core/ingestion/languages/python.js +13 -0
  312. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  313. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  314. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  315. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  316. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  318. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  319. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  320. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  321. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  322. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  324. package/dist/core/ingestion/languages/rust/query.js +39 -6
  325. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  326. package/dist/core/ingestion/languages/rust.js +17 -0
  327. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  328. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  330. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  331. package/dist/core/ingestion/languages/swift/query.js +17 -0
  332. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  334. package/dist/core/ingestion/languages/swift.js +2 -0
  335. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  336. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  337. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  341. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  343. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  345. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  347. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  348. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  349. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  350. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  351. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  352. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  353. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  354. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  355. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  357. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  358. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  360. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  361. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  362. package/dist/core/ingestion/languages/typescript.js +93 -2
  363. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  364. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  365. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  366. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  367. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  368. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  369. package/dist/core/ingestion/method-types.d.ts +16 -0
  370. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  371. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  372. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  373. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  374. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  376. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  377. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  378. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  379. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  380. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  384. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  385. package/dist/core/ingestion/pipeline.d.ts +26 -2
  386. package/dist/core/ingestion/pipeline.js +60 -11
  387. package/dist/core/ingestion/process-processor.d.ts +109 -2
  388. package/dist/core/ingestion/process-processor.js +464 -52
  389. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  390. package/dist/core/ingestion/resolve-references.js +66 -6
  391. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  392. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  393. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  394. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  395. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  397. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  399. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  401. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  402. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  403. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  405. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  406. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  407. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  408. package/dist/core/ingestion/scope-extractor.js +309 -15
  409. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  411. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  421. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  423. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  425. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  427. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  429. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  431. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  433. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  435. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  437. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  441. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  443. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  445. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  447. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  448. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  449. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  451. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  453. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  455. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  457. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  460. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  461. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  462. package/dist/core/ingestion/type-env.js +11 -7
  463. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  464. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  465. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  466. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  467. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  468. package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
  469. package/dist/core/ingestion/utils/ast-helpers.js +578 -46
  470. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  471. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  472. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  473. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  474. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  475. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  476. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  477. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  478. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  479. package/dist/core/ingestion/utils/line-base.js +14 -0
  480. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  481. package/dist/core/ingestion/utils/method-props.js +29 -4
  482. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  483. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  484. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  485. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  486. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  487. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  488. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  489. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  490. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  491. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  492. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  493. package/dist/core/ingestion/workers/callable-id.js +125 -0
  494. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  495. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  496. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  497. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  498. package/dist/core/lbug/csv-generator.d.ts +27 -0
  499. package/dist/core/lbug/csv-generator.js +72 -17
  500. package/dist/core/lbug/extension-load-error.js +13 -2
  501. package/dist/core/lbug/extension-loader.d.ts +29 -0
  502. package/dist/core/lbug/extension-loader.js +31 -6
  503. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  504. package/dist/core/lbug/graph-emit-sink.js +581 -0
  505. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  506. package/dist/core/lbug/lbug-adapter.js +652 -69
  507. package/dist/core/lbug/native-check.d.ts +21 -0
  508. package/dist/core/lbug/native-check.js +248 -32
  509. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  510. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  511. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  512. package/dist/core/lbug/pool-adapter.js +164 -14
  513. package/dist/core/lbug/query-batch.d.ts +75 -0
  514. package/dist/core/lbug/query-batch.js +102 -0
  515. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  516. package/dist/core/lbug/rel-pair-routing.js +228 -10
  517. package/dist/core/lbug/schema.d.ts +163 -4
  518. package/dist/core/lbug/schema.js +404 -159
  519. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  520. package/dist/core/lbug/sync-csv-writer.js +108 -0
  521. package/dist/core/run-analyze.d.ts +147 -0
  522. package/dist/core/run-analyze.js +1215 -179
  523. package/dist/core/search/bm25-index.d.ts +11 -0
  524. package/dist/core/search/bm25-index.js +60 -26
  525. package/dist/core/search/fts-indexes.d.ts +150 -9
  526. package/dist/core/search/fts-indexes.js +241 -23
  527. package/dist/core/wiki/graph-queries.js +145 -112
  528. package/dist/core/wiki/llm-client.d.ts +29 -3
  529. package/dist/core/wiki/llm-client.js +47 -12
  530. package/dist/core/wiki/prompts.d.ts +19 -0
  531. package/dist/core/wiki/prompts.js +20 -1
  532. package/dist/lib/utils.d.ts +113 -0
  533. package/dist/lib/utils.js +185 -0
  534. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  535. package/dist/mcp/local/aop-metadata.js +227 -0
  536. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  537. package/dist/mcp/local/bean-metadata.js +22 -1
  538. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  539. package/dist/mcp/local/convex-metadata.js +45 -0
  540. package/dist/mcp/local/local-backend.d.ts +174 -11
  541. package/dist/mcp/local/local-backend.js +1678 -331
  542. package/dist/mcp/local/path-predicate.d.ts +19 -0
  543. package/dist/mcp/local/path-predicate.js +21 -0
  544. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  545. package/dist/mcp/local/pdg-impact.js +391 -98
  546. package/dist/mcp/repository-policy.d.ts +1 -0
  547. package/dist/mcp/repository-policy.js +5 -0
  548. package/dist/mcp/resources.js +26 -4
  549. package/dist/mcp/server.js +23 -13
  550. package/dist/mcp/tools.d.ts +8 -0
  551. package/dist/mcp/tools.js +76 -23
  552. package/dist/server/analyze-job.d.ts +37 -2
  553. package/dist/server/analyze-job.js +13 -2
  554. package/dist/server/analyze-launch.d.ts +1 -1
  555. package/dist/server/analyze-launch.js +79 -10
  556. package/dist/server/analyze-worker-core.d.ts +1 -1
  557. package/dist/server/analyze-worker-core.js +10 -1
  558. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  559. package/dist/server/analyze-worker-ipc.js +4 -0
  560. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  561. package/dist/server/analyze-worker-protocol.js +1 -0
  562. package/dist/server/analyze-worker.d.ts +1 -17
  563. package/dist/server/api.d.ts +2 -11
  564. package/dist/server/api.js +164 -163
  565. package/dist/server/embed-run-outcome.d.ts +89 -0
  566. package/dist/server/embed-run-outcome.js +88 -0
  567. package/dist/server/git-clone.js +6 -2
  568. package/dist/server/middleware.d.ts +116 -9
  569. package/dist/server/middleware.js +291 -22
  570. package/dist/server/sse-progress.d.ts +41 -0
  571. package/dist/server/sse-progress.js +125 -0
  572. package/dist/storage/branch-index.d.ts +11 -6
  573. package/dist/storage/branch-index.js +15 -7
  574. package/dist/storage/file-hash.js +2 -2
  575. package/dist/storage/fs-atomic.d.ts +25 -0
  576. package/dist/storage/fs-atomic.js +42 -0
  577. package/dist/storage/git.d.ts +131 -0
  578. package/dist/storage/git.js +236 -2
  579. package/dist/storage/index-lock.d.ts +102 -0
  580. package/dist/storage/index-lock.js +660 -0
  581. package/dist/storage/parse-cache.js +588 -6
  582. package/dist/storage/parsedfile-store.js +76 -6
  583. package/dist/storage/repo-manager.d.ts +54 -441
  584. package/dist/storage/repo-manager.js +312 -221
  585. package/dist/storage/repo-meta.d.ts +530 -0
  586. package/dist/storage/repo-meta.js +100 -0
  587. package/dist/types/pipeline.d.ts +37 -0
  588. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  589. package/hooks/claude/gitnexus-hook.cjs +1 -1
  590. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  591. package/package.json +11 -2
  592. package/scripts/cross-platform-shard.ts +153 -0
  593. package/scripts/cross-platform-tests.ts +122 -0
  594. package/scripts/run-cross-platform.ts +16 -5
  595. package/skills/gitnexus-cli.md +3 -3
  596. package/skills/gitnexus-debugging.md +37 -7
  597. package/skills/gitnexus-exploring.md +26 -4
  598. package/skills/gitnexus-impact-analysis.md +71 -10
  599. package/skills/gitnexus-plan/README.md +11 -6
  600. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  601. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  602. package/skills/gitnexus-refactoring.md +48 -5
  603. package/skills/gitnexus-review/SKILL.md +12 -6
  604. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  605. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  606. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  610. package/skills/gitnexus-taint-analysis.md +13 -7
  611. package/skills/gitnexus-work/SKILL.md +4 -1
  612. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  613. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  614. package/vendor/leiden/utils.cjs +28 -1
  615. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  616. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  617. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  618. package/web/assets/agent-Dr4l5EOp.js +662 -0
  619. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  620. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  621. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  622. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  623. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  624. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  625. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  626. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  627. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  628. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  629. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  630. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  631. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  632. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  633. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  634. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  635. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  636. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  637. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  638. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  639. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  640. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  641. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  642. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  643. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  644. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  645. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  646. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  647. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  648. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  649. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  650. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  651. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  652. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  653. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  654. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  655. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  656. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  657. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  658. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  659. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  660. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  661. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  662. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  663. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  664. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  665. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  666. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  667. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  668. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  669. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  670. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  671. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  672. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  673. package/web/assets/error-D9MtuG9s.js +1 -0
  674. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  675. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  676. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  677. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  678. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  679. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  680. package/web/assets/index-CJDpyH-n.css +2 -0
  681. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  682. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  683. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  684. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  685. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  686. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  687. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  688. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  689. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  690. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  691. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  692. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  693. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  694. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  695. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  696. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  697. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  698. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  699. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  700. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  701. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  702. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  703. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  704. package/web/assets/src-C5sx_gMp.js +1 -0
  705. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  706. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  707. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  708. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  709. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  710. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  711. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  712. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  713. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  714. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  715. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  716. package/web/index.html +16 -15
  717. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  718. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  719. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  720. package/web/assets/agent-Ds-lkZjX.js +0 -626
  721. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  722. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  723. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  724. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  725. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  726. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  727. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  728. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  729. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  730. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  731. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  732. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  733. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  734. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  735. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  736. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  737. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  738. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  739. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  740. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  741. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  742. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  743. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  744. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  745. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  746. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  747. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  748. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  749. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  750. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  751. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  752. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  753. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  754. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  755. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  756. package/web/assets/index-CX_fADmQ.css +0 -2
  757. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  758. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  759. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  760. package/web/assets/node-Ct_zna8U.js +0 -8
  761. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  762. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  763. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  764. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  765. package/web/assets/sdk-CzHHH8tD.js +0 -37
  766. package/web/assets/src-Cv1eWg0o.js +0 -1
  767. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  768. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  769. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  770. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  771. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  772. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  773. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  774. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  775. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -0,0 +1,131 @@
1
+ /**
2
+ * CLI-facing `analyze` option shape.
3
+ *
4
+ * This is the *flag* shape: it mirrors what Commander parses off the command
5
+ * line and what `.gitnexusrc` may set, before `analyze` translates it into the
6
+ * core orchestrator's own `AnalyzeOptions` (`core/run-analyze.ts`) — a
7
+ * different, deliberately separate interface (`stats` here vs `noStats`
8
+ * there, `embeddings?: boolean | string` here vs a resolved
9
+ * `embeddingsNodeLimit` there).
10
+ *
11
+ * It lives in this leaf module because both `analyze.ts` (which consumes the
12
+ * flags) and `analyze-config.ts` (which maps `.gitnexusrc` keys onto them)
13
+ * need it, and `analyze.ts` already imports the config loader — a type import
14
+ * back the other way put the two files, plus `core/run-analyze.ts`, in an
15
+ * import cycle. `analyze.ts` re-exports the type for existing importers.
16
+ */
17
+ export interface AnalyzeOptions {
18
+ force?: boolean;
19
+ repairFts?: boolean;
20
+ /**
21
+ * Embedding generation toggle. Commander parses `--embeddings [limit]` as:
22
+ * - `undefined` when the flag is omitted
23
+ * - `true` when passed without an argument (use default 50K node cap)
24
+ * - a string when passed with an argument (`--embeddings 0` disables the
25
+ * cap, `--embeddings <n>` uses `<n>` as the cap)
26
+ */
27
+ embeddings?: boolean | string;
28
+ /**
29
+ * Explicitly drop existing embeddings on rebuild instead of preserving
30
+ * them. Without this flag, a routine `analyze` keeps any embeddings
31
+ * already present in the index even when `--embeddings` is omitted.
32
+ */
33
+ dropEmbeddings?: boolean;
34
+ skills?: boolean;
35
+ verbose?: boolean;
36
+ /** Skip AGENTS.md and CLAUDE.md gitnexus block updates. */
37
+ skipAgentsMd?: boolean;
38
+ /**
39
+ * Build the control-flow-graph / PDG substrate (#2081 M1). Opt-in; off by
40
+ * default. Threaded to both the worker (CFG build) and scope-resolution
41
+ * (BasicBlock/CFG emit).
42
+ */
43
+ pdg?: boolean;
44
+ /**
45
+ * Stats inclusion in AGENTS.md and CLAUDE.md.
46
+ *
47
+ * Commander.js represents `--no-stats` as `stats: boolean` (default
48
+ * `true`; `false` when the user passes `--no-stats`), NOT as
49
+ * `noStats: boolean`. Reading the negated form would always be
50
+ * `undefined` and the flag would silently no-op (#1477). Consumers
51
+ * that want "did the user request --no-stats?" should compare with
52
+ * `=== false` to distinguish the explicit-off case from the
53
+ * default-on case.
54
+ */
55
+ stats?: boolean;
56
+ /**
57
+ * Opt-in auto-commit of any AGENTS.md/CLAUDE.md changes this `analyze` run
58
+ * makes. Scoped to only those two files (never `git add -A`); no-ops
59
+ * silently if neither exists, neither changed, or the commit step itself
60
+ * fails (e.g. no git identity configured). See #2639.
61
+ */
62
+ selfCommit?: boolean;
63
+ /** Skip installing standard GitNexus skill files directly under .claude/skills/. */
64
+ skipSkills?: boolean;
65
+ /**
66
+ * Default branch for the generated regression-compare example (#243). From
67
+ * `--default-branch`; may also be supplied via `.gitnexusrc`. Resolved to a
68
+ * concrete branch (CLI > `.gitnexusrc` > auto-detected origin/HEAD > "main")
69
+ * before being threaded into the generated AGENTS.md / CLAUDE.md content.
70
+ */
71
+ defaultBranch?: string;
72
+ /**
73
+ * Index-branch selector (#2106). From `--branch`. Distinct from
74
+ * `defaultBranch` (cosmetic base_ref): this routes the index to a per-branch
75
+ * slot. NOT sourced from `.gitnexusrc` — the `.gitnexusrc` `branch` key is an
76
+ * alias for `defaultBranch` and must not change index placement. Defaults to
77
+ * the checked-out branch inside `runFullAnalysis` when omitted.
78
+ */
79
+ branch?: string;
80
+ /** Pure index mode: skip all file injection (AGENTS.md, CLAUDE.md, skills). */
81
+ indexOnly?: boolean;
82
+ /** Index the folder even when no .git directory is present. */
83
+ skipGit?: boolean;
84
+ /**
85
+ * Override the default basename-derived registry `name` with a
86
+ * user-supplied alias (#829). Disambiguates repos whose paths share a
87
+ * basename. Persisted — subsequent re-analyses of the same path without
88
+ * `--name` preserve the alias.
89
+ */
90
+ name?: string;
91
+ /**
92
+ * Allow registration even when another path already uses the same
93
+ * `--name` alias (#829). Intentionally a distinct flag from `--force`
94
+ * because the user may want to coexist under the same name WITHOUT
95
+ * paying the cost of a pipeline re-index. Maps to registerRepo's
96
+ * `allowDuplicateName` option end-to-end.
97
+ */
98
+ allowDuplicateName?: boolean;
99
+ /**
100
+ * Override the walker's large-file skip threshold (#991). Value in KB;
101
+ * clamped downstream to the tree-sitter 32 MB ceiling. Sets
102
+ * `GITNEXUS_MAX_FILE_SIZE` for the rest of the pipeline.
103
+ */
104
+ maxFileSize?: string;
105
+ /** Override worker sub-batch idle timeout in seconds. */
106
+ workerTimeout?: string;
107
+ /** Control LadybugDB WAL auto-checkpoint threshold during analyze. */
108
+ walCheckpointThreshold?: string;
109
+ /** Parse worker pool size (>=1); 0 is rejected (no sequential mode). */
110
+ workers?: string;
111
+ embeddingThreads?: string;
112
+ embeddingBatchSize?: string;
113
+ embeddingSubBatchSize?: string;
114
+ embeddingDevice?: string;
115
+ /**
116
+ * Extra fetch-wrapper function names to treat as HTTP consumers (#1589/#1852
117
+ * residual). Supplied via `.gitnexusrc` `fetchWrappers: [...]`. Threaded into
118
+ * the routes phase, where the cross-file consumer scan unions them with the
119
+ * auto-detected `fetch()` wrappers so a custom/axios-based wrapper named
120
+ * outside the built-in convention still produces `route_map` consumers.
121
+ */
122
+ fetchWrappers?: string[];
123
+ /** OpenAI-compatible embeddings base URL (incl. /v1). Overrides GITNEXUS_EMBEDDING_URL. */
124
+ embeddingBaseUrl?: string;
125
+ /** Embedding model name. Overrides GITNEXUS_EMBEDDING_MODEL. */
126
+ embeddingModel?: string;
127
+ /** Bearer token for the embeddings endpoint. Overrides GITNEXUS_EMBEDDING_API_KEY. Never logged. */
128
+ embeddingAuthToken?: string;
129
+ /** Embedding vector dimensions (positive integer string). Overrides GITNEXUS_EMBEDDING_DIMS. */
130
+ embeddingDims?: string;
131
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -8,123 +8,31 @@
8
8
  * skill generation (--skills), summary output, and process.exit().
9
9
  */
10
10
  import { type AnalyzerRunnerIdentity } from '../storage/repo-manager.js';
11
+ import type { AnalyzeOptions } from './analyze-options.js';
11
12
  /**
12
- * RAM-aware re-exec heap cap (MB): `0.75 × effective RAM`, clamped to
13
- * `>= DEFAULT_HEAP_MB`. Kept BELOW physical RAM on purpose — a cap `>=` RAM makes
14
- * V8 collect lazily and inflate the heap into swap-thrash (observed analyzing the
15
- * Linux kernel at a 30GB cap on a 31GB box). `constrainedBytes` is the cgroup
16
- * limit or `null`; it is honored only as a real, smaller-than-physical cap, because
13
+ * RAM-aware re-exec heap cap (MB) — the formula itself is single-sourced in
14
+ * `core/ingestion/utils/effective-ram.ts` (`heapCapMbFor`), shared with the
15
+ * server's analyze fork. `constrainedBytes` is the cgroup limit or `null`;
16
+ * it is honored only as a real, smaller-than-physical cap, because
17
17
  * `process.constrainedMemory()` returns a huge sentinel when UNCONSTRAINED.
18
+ * (Observed rationale: a cap ≥ RAM made V8 collect lazily and swap-thrash —
19
+ * the #2649 worker-timeout cascade on 16 GB boxes.)
18
20
  */
19
21
  export declare function computeHeapCapMb(totalBytes: number, constrainedBytes: number | null): number;
20
- export interface AnalyzeOptions {
21
- force?: boolean;
22
- repairFts?: boolean;
23
- /**
24
- * Embedding generation toggle. Commander parses `--embeddings [limit]` as:
25
- * - `undefined` when the flag is omitted
26
- * - `true` when passed without an argument (use default 50K node cap)
27
- * - a string when passed with an argument (`--embeddings 0` disables the
28
- * cap, `--embeddings <n>` uses `<n>` as the cap)
29
- */
30
- embeddings?: boolean | string;
31
- /**
32
- * Explicitly drop existing embeddings on rebuild instead of preserving
33
- * them. Without this flag, a routine `analyze` keeps any embeddings
34
- * already present in the index even when `--embeddings` is omitted.
35
- */
36
- dropEmbeddings?: boolean;
37
- skills?: boolean;
38
- verbose?: boolean;
39
- /** Skip AGENTS.md and CLAUDE.md gitnexus block updates. */
40
- skipAgentsMd?: boolean;
41
- /**
42
- * Build the control-flow-graph / PDG substrate (#2081 M1). Opt-in; off by
43
- * default. Threaded to both the worker (CFG build) and scope-resolution
44
- * (BasicBlock/CFG emit).
45
- */
46
- pdg?: boolean;
47
- /**
48
- * Stats inclusion in AGENTS.md and CLAUDE.md.
49
- *
50
- * Commander.js represents `--no-stats` as `stats: boolean` (default
51
- * `true`; `false` when the user passes `--no-stats`), NOT as
52
- * `noStats: boolean`. Reading the negated form would always be
53
- * `undefined` and the flag would silently no-op (#1477). Consumers
54
- * that want "did the user request --no-stats?" should compare with
55
- * `=== false` to distinguish the explicit-off case from the
56
- * default-on case.
57
- */
58
- stats?: boolean;
59
- /** Skip installing standard GitNexus skill files directly under .claude/skills/. */
60
- skipSkills?: boolean;
61
- /**
62
- * Default branch for the generated regression-compare example (#243). From
63
- * `--default-branch`; may also be supplied via `.gitnexusrc`. Resolved to a
64
- * concrete branch (CLI > `.gitnexusrc` > auto-detected origin/HEAD > "main")
65
- * before being threaded into the generated AGENTS.md / CLAUDE.md content.
66
- */
67
- defaultBranch?: string;
68
- /**
69
- * Index-branch selector (#2106). From `--branch`. Distinct from
70
- * `defaultBranch` (cosmetic base_ref): this routes the index to a per-branch
71
- * slot. NOT sourced from `.gitnexusrc` — the `.gitnexusrc` `branch` key is an
72
- * alias for `defaultBranch` and must not change index placement. Defaults to
73
- * the checked-out branch inside `runFullAnalysis` when omitted.
74
- */
75
- branch?: string;
76
- /** Pure index mode: skip all file injection (AGENTS.md, CLAUDE.md, skills). */
77
- indexOnly?: boolean;
78
- /** Index the folder even when no .git directory is present. */
79
- skipGit?: boolean;
80
- /**
81
- * Override the default basename-derived registry `name` with a
82
- * user-supplied alias (#829). Disambiguates repos whose paths share a
83
- * basename. Persisted — subsequent re-analyses of the same path without
84
- * `--name` preserve the alias.
85
- */
86
- name?: string;
87
- /**
88
- * Allow registration even when another path already uses the same
89
- * `--name` alias (#829). Intentionally a distinct flag from `--force`
90
- * because the user may want to coexist under the same name WITHOUT
91
- * paying the cost of a pipeline re-index. Maps to registerRepo's
92
- * `allowDuplicateName` option end-to-end.
93
- */
94
- allowDuplicateName?: boolean;
95
- /**
96
- * Override the walker's large-file skip threshold (#991). Value in KB;
97
- * clamped downstream to the tree-sitter 32 MB ceiling. Sets
98
- * `GITNEXUS_MAX_FILE_SIZE` for the rest of the pipeline.
99
- */
100
- maxFileSize?: string;
101
- /** Override worker sub-batch idle timeout in seconds. */
102
- workerTimeout?: string;
103
- /** Control LadybugDB WAL auto-checkpoint threshold during analyze. */
104
- walCheckpointThreshold?: string;
105
- /** Parse worker pool size (>=1); 0 is rejected (no sequential mode). */
106
- workers?: string;
107
- embeddingThreads?: string;
108
- embeddingBatchSize?: string;
109
- embeddingSubBatchSize?: string;
110
- embeddingDevice?: string;
111
- /**
112
- * Extra fetch-wrapper function names to treat as HTTP consumers (#1589/#1852
113
- * residual). Supplied via `.gitnexusrc` `fetchWrappers: [...]`. Threaded into
114
- * the routes phase, where the cross-file consumer scan unions them with the
115
- * auto-detected `fetch()` wrappers so a custom/axios-based wrapper named
116
- * outside the built-in convention still produces `route_map` consumers.
117
- */
118
- fetchWrappers?: string[];
119
- /** OpenAI-compatible embeddings base URL (incl. /v1). Overrides GITNEXUS_EMBEDDING_URL. */
120
- embeddingBaseUrl?: string;
121
- /** Embedding model name. Overrides GITNEXUS_EMBEDDING_MODEL. */
122
- embeddingModel?: string;
123
- /** Bearer token for the embeddings endpoint. Overrides GITNEXUS_EMBEDDING_API_KEY. Never logged. */
124
- embeddingAuthToken?: string;
125
- /** Embedding vector dimensions (positive integer string). Overrides GITNEXUS_EMBEDDING_DIMS. */
126
- embeddingDims?: string;
127
- }
22
+ /**
23
+ * Last `--max-old-space-size` value (MB) in a NODE_OPTIONS string, or `null`
24
+ * when absent/unparseable. Last occurrence wins, matching V8's own
25
+ * later-flag-wins semantics when NODE_OPTIONS repeats a flag.
26
+ */
27
+ export declare function parseMaxOldSpaceMb(nodeOptions: string): number | null;
28
+ /**
29
+ * CLI `analyze` flag shape. Defined in `./analyze-options.js` so
30
+ * `analyze-config.ts` can reference it without importing this module back —
31
+ * that type import closed a cycle over `analyze` → `analyze-config` and
32
+ * `analyze` → `run-analyze` → `analyze-config`. Re-exported here because this
33
+ * is where callers have always imported it from.
34
+ */
35
+ export type { AnalyzeOptions };
128
36
  /**
129
37
  * Whether the post-index skill step should run.
130
38
  *
@@ -14,9 +14,12 @@ import v8 from 'v8';
14
14
  import cliProgress from 'cli-progress';
15
15
  import { isLbugReady, LbugWipeError } from '../core/lbug/lbug-adapter.js';
16
16
  import { boundedCheckpointBeforeExit } from '../core/lbug/shutdown-helpers.js';
17
+ import { findUndeclaredRelationPairError } from '../core/lbug/rel-pair-routing.js';
18
+ import { causeChain } from '../lib/utils.js';
17
19
  import { getOsPageSize, isLbugCheckpointIoError, isLbugCheckpointBusyError, isLbugPageSizeFrameError, isPageSizeAwareLadybug, isWalCorruptionError, parseWalCheckpointThreshold, WAL_RECOVERY_SUGGESTION, } from '../core/lbug/lbug-config.js';
18
20
  import { getStoragePaths, getGlobalRegistryPath, RegistryNameCollisionError, AnalysisNotFinalizedError, assertAnalysisFinalized, } from '../storage/repo-manager.js';
19
- import { getGitRoot, hasGitDir, getDefaultBranch } from '../storage/git.js';
21
+ import { getGitRoot, hasGitDir, getDefaultBranch, selfCommitContextFiles, snapshotSelfCommitSafety, } from '../storage/git.js';
22
+ import { IndexLockTimeoutError } from '../storage/index-lock.js';
20
23
  import { loadAnalyzeConfig, mergeAnalyzeOptions, resolveDefaultBranch, validateBranchName, GitNexusRcError, } from './analyze-config.js';
21
24
  import { runFullAnalysis } from '../core/run-analyze.js';
22
25
  import { getRuntimeFingerprint } from '../core/platform/capabilities.js';
@@ -24,7 +27,8 @@ import { getMaxFileSizeBannerMessage } from '../core/ingestion/utils/max-file-si
24
27
  import { warnMissingOptionalGrammars, getOptionalGrammarExtensions } from './optional-grammars.js';
25
28
  import { glob } from 'glob';
26
29
  import fs from 'fs/promises';
27
- import { cliError } from './cli-message.js';
30
+ import { cliError, cliWarn } from './cli-message.js';
31
+ import { heapCapMbFor, memoryAutopilotDisabled } from '../core/ingestion/utils/effective-ram.js';
28
32
  import { EMBEDDING_DIMS_ERROR, normalizeEmbeddingDims } from './embedding-dims.js';
29
33
  import { formatElapsed } from './format-elapsed.js';
30
34
  import { isHfDownloadFailure } from '../core/embeddings/hf-env.js';
@@ -52,15 +56,13 @@ const writeFatalToStderr = (label, err) => {
52
56
  // #2068) is only reachable via `.cause`. Without this the user sees the
53
57
  // wrapper's main-thread stack and never the real frame. `cause.stack` already
54
58
  // begins with the cause's message, so we print the stack alone (not message +
55
- // stack) to avoid repeating it. Depth-bounded so a cyclic `cause` can't loop
56
- // (the phase runner wraps one level; the bound leaves headroom for future
57
- // nesting); uses realStderrWrite so the redirected console.error's ANSI
58
- // clear-line wrapping can't erase it (#1169).
59
- const MAX_CAUSE_DEPTH = 5;
60
- let cause = isErr ? err.cause : undefined;
61
- for (let depth = 0; depth < MAX_CAUSE_DEPTH && cause instanceof Error; depth++) {
59
+ // stack) to avoid repeating it. `causeChain` owns the traversal and the depth
60
+ // bound that stops a cyclic `cause` looping — this used to be one of four
61
+ // hand-rolled copies that had already drifted apart on both. Uses
62
+ // realStderrWrite so the redirected console.error's ANSI clear-line wrapping
63
+ // can't erase it (#1169). The head is skipped: it was just printed above.
64
+ for (const cause of causeChain(isErr ? err.cause : undefined)) {
62
65
  realStderrWrite(`\n Caused by: ${cause.stack ?? cause.message}\n`);
63
- cause = cause.cause;
64
66
  }
65
67
  };
66
68
  let fatalHandlersInstalled = false;
@@ -85,23 +87,20 @@ const installFatalHandlers = () => {
85
87
  process.exit(1);
86
88
  });
87
89
  };
88
- /** Historical floor for the re-exec heap cap — the auto-sizer never goes below
89
- * this, so small boxes / CI never regress. */
90
- const DEFAULT_HEAP_MB = 16384;
91
90
  /**
92
- * RAM-aware re-exec heap cap (MB): `0.75 × effective RAM`, clamped to
93
- * `>= DEFAULT_HEAP_MB`. Kept BELOW physical RAM on purpose — a cap `>=` RAM makes
94
- * V8 collect lazily and inflate the heap into swap-thrash (observed analyzing the
95
- * Linux kernel at a 30GB cap on a 31GB box). `constrainedBytes` is the cgroup
96
- * limit or `null`; it is honored only as a real, smaller-than-physical cap, because
91
+ * RAM-aware re-exec heap cap (MB) — the formula itself is single-sourced in
92
+ * `core/ingestion/utils/effective-ram.ts` (`heapCapMbFor`), shared with the
93
+ * server's analyze fork. `constrainedBytes` is the cgroup limit or `null`;
94
+ * it is honored only as a real, smaller-than-physical cap, because
97
95
  * `process.constrainedMemory()` returns a huge sentinel when UNCONSTRAINED.
96
+ * (Observed rationale: a cap ≥ RAM made V8 collect lazily and swap-thrash —
97
+ * the #2649 worker-timeout cascade on 16 GB boxes.)
98
98
  */
99
99
  export function computeHeapCapMb(totalBytes, constrainedBytes) {
100
100
  const effectiveBytes = constrainedBytes !== null && constrainedBytes > 0 && constrainedBytes < totalBytes
101
101
  ? constrainedBytes
102
102
  : totalBytes;
103
- const effectiveMb = Math.floor(effectiveBytes / (1024 * 1024));
104
- return Math.max(DEFAULT_HEAP_MB, Math.floor(0.75 * effectiveMb));
103
+ return heapCapMbFor(effectiveBytes);
105
104
  }
106
105
  function readConstrainedBytes() {
107
106
  if (typeof process.constrainedMemory !== 'function')
@@ -386,21 +385,70 @@ const forceHeapOOMForTestIfEnabled = () => {
386
385
  // the `DEFAULT_WAL_CHECKPOINT_THRESHOLD` constant in
387
386
  // `gitnexus/src/core/lbug/lbug-config.ts` in sync with this value.
388
387
  const RECOMMENDED_WAL_CHECKPOINT_THRESHOLD = 64 * 1024 * 1024;
388
+ /**
389
+ * Last `--max-old-space-size` value (MB) in a NODE_OPTIONS string, or `null`
390
+ * when absent/unparseable. Last occurrence wins, matching V8's own
391
+ * later-flag-wins semantics when NODE_OPTIONS repeats a flag.
392
+ */
393
+ export function parseMaxOldSpaceMb(nodeOptions) {
394
+ // V8 accepts `-` and `_` interchangeably in flag names, and Node accepts a
395
+ // space-separated value in NODE_OPTIONS — honor every spelling of the pin
396
+ // instead of silently overriding it (#2649 review).
397
+ const matches = [...nodeOptions.matchAll(/--max[-_]old[-_]space[-_]size(?:=|\s+)(\d+)/g)];
398
+ if (matches.length === 0)
399
+ return null;
400
+ const mb = Number(matches[matches.length - 1][1]);
401
+ return Number.isFinite(mb) && mb > 0 ? mb : null;
402
+ }
389
403
  /** Re-exec the process with the RAM-aware auto heap cap + larger semi-space/stack
390
- * if we're currently below that. A user-supplied NODE_OPTIONS heap wins (no re-exec). */
404
+ * if we're currently below that.
405
+ *
406
+ * Heap-source precedence (#2649):
407
+ * - an explicit per-invocation `--max-old-space-size` (execArgv) always wins;
408
+ * - `GITNEXUS_MEMORY=off` declines the memory autopilot entirely;
409
+ * - an ambient NODE_OPTIONS heap >= the auto cap is honored as-is;
410
+ * - an ambient NODE_OPTIONS heap BELOW the auto cap is treated as an
411
+ * inherited environment default (devcontainers/CI export one for other
412
+ * tooling), not a deliberate per-run choice: warn and respawn with the
413
+ * auto cap. Pre-#2649 this returned early and large repos then OOM'd on
414
+ * whatever heap the environment happened to specify. */
391
415
  async function ensureHeap() {
392
- const nodeOpts = process.env.NODE_OPTIONS || '';
393
- if (nodeOpts.includes('--max-old-space-size'))
416
+ // Explicit opt-out disables auto-sizing ENTIRELY — both the ambient-pin
417
+ // override and the default v8-limit respawn — and is honored SILENTLY:
418
+ // the operator already made the call, and stderr-sensitive consumers
419
+ // (test harnesses, scripts, supervisors that track a single PID) rely on
420
+ // a quiet, single-process run.
421
+ if (memoryAutopilotDisabled())
394
422
  return false;
395
- const v8Heap = v8.getHeapStatistics().heap_size_limit;
396
- if (v8Heap >= HEAP_MB * 1024 * 1024 * 0.9)
423
+ const nodeOpts = process.env.NODE_OPTIONS || '';
424
+ if (process.execArgv.some((a) => a.startsWith('--max-old-space-size')))
397
425
  return false;
426
+ const ambientHeapMb = parseMaxOldSpaceMb(nodeOpts);
427
+ if (ambientHeapMb !== null) {
428
+ if (ambientHeapMb >= RESPAWN_HEAP_MB)
429
+ return false;
430
+ cliWarn(` NODE_OPTIONS pins the heap to ${ambientHeapMb}MB — below the ${RESPAWN_HEAP_MB}MB this machine's RAM supports.\n` +
431
+ ` Re-running analyze with the larger auto-sized cap (set GITNEXUS_MEMORY=off to keep the NODE_OPTIONS value).\n`);
432
+ }
433
+ else {
434
+ const v8Heap = v8.getHeapStatistics().heap_size_limit;
435
+ if (v8Heap >= HEAP_MB * 1024 * 1024 * 0.9)
436
+ return false;
437
+ }
398
438
  // --stack-size is a V8 flag not allowed in NODE_OPTIONS on Node 24+, so pass it
399
439
  // only as a direct CLI argument. --max-semi-space-size IS allowed in NODE_OPTIONS.
400
440
  const cliFlags = [HEAP_FLAG, SEMI_FLAG];
401
441
  if (!nodeOpts.includes('--stack-size'))
402
442
  cliFlags.push(STACK_FLAG);
403
- const childArgs = [...cliFlags, ...process.argv.slice(1)];
443
+ // Preserve the parent's node flags (execArgv) — dropping them breaks any
444
+ // loader-launched CLI: `node --import tsx src/cli/index.ts` respawned
445
+ // without `--import tsx` cannot execute TypeScript and dies with a
446
+ // swallowed exit 1 (#2649 review). Our heap/semi/stack flags come AFTER
447
+ // execArgv so V8's later-flag-wins semantics resolve duplicates our way.
448
+ // Inspector flags are the one exception: replaying `--inspect[-brk]` makes
449
+ // the child fight the parent for the debug port and die with EADDRINUSE.
450
+ const preservedExecArgv = process.execArgv.filter((a) => !a.startsWith('--inspect'));
451
+ const childArgs = [...preservedExecArgv, ...cliFlags, ...process.argv.slice(1)];
404
452
  const childEnv = {
405
453
  ...process.env,
406
454
  NODE_OPTIONS: `${nodeOpts} ${HEAP_FLAG} ${SEMI_FLAG}`.trim(),
@@ -1047,6 +1095,14 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1047
1095
  const bootstrapArgs = runnerIdentityAtBootstrap
1048
1096
  ? [runnerIdentityAtBootstrap]
1049
1097
  : [];
1098
+ // #2639 review round 2: snapshot which of AGENTS.md/CLAUDE.md are safe to
1099
+ // auto-commit BEFORE runFullAnalysis (and the --skills regeneration
1100
+ // further down) writes to them, so selfCommitContextFiles can tell a
1101
+ // pre-existing unstaged user edit apart from this run's stats refresh
1102
+ // and refuse to sweep the former into the latter's commit.
1103
+ const selfCommitSafety = options.selfCommit === true
1104
+ ? snapshotSelfCommitSafety(repoPath, ['AGENTS.md', 'CLAUDE.md'])
1105
+ : undefined;
1050
1106
  const result = await runFullAnalysis(repoPath, runOptions, runCallbacks, ...bootstrapArgs);
1051
1107
  if (result.alreadyUpToDate) {
1052
1108
  // Even the fast path must prove the repo is discoverable. A prior
@@ -1087,6 +1143,11 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1087
1143
  if (baseRefRefreshed.length > 0) {
1088
1144
  console.log(` Updated base_ref to "${resolvedDefaultBranch}" in ${baseRefRefreshed.join(', ')}\n`);
1089
1145
  }
1146
+ // #2639: opt-in self-commit of any AGENTS.md/CLAUDE.md churn from this
1147
+ // fast path (e.g. a base_ref refresh above). Best-effort — never throws.
1148
+ if (options.selfCommit === true && selfCommitSafety) {
1149
+ selfCommitContextFiles(repoPath, ['AGENTS.md', 'CLAUDE.md'], selfCommitSafety);
1150
+ }
1090
1151
  // Safe to return without process.exit(0) — the early-return path in
1091
1152
  // runFullAnalysis never opens LadybugDB, so no native handles prevent exit.
1092
1153
  return;
@@ -1160,6 +1221,13 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1160
1221
  /* best-effort */
1161
1222
  }
1162
1223
  }
1224
+ // #2639: opt-in self-commit of any AGENTS.md/CLAUDE.md churn written by
1225
+ // this run (the primary generateAIContextFiles call inside
1226
+ // runFullAnalysis, and/or the --skills regeneration above). Best-effort
1227
+ // — never throws, so a missing git identity etc. can't fail `analyze`.
1228
+ if (options.selfCommit === true && selfCommitSafety) {
1229
+ selfCommitContextFiles(repoPath, ['AGENTS.md', 'CLAUDE.md'], selfCommitSafety);
1230
+ }
1163
1231
  const totalTime = ((Date.now() - t0) / 1000).toFixed(1);
1164
1232
  clearInterval(elapsedTimer);
1165
1233
  process.removeListener('SIGINT', sigintHandler);
@@ -1172,6 +1240,25 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1172
1240
  bar.stop();
1173
1241
  // ── Summary ────────────────────────────────────────────────────
1174
1242
  const s = result.stats;
1243
+ // A collapsed graph write is NOT a successful index. The other incomplete
1244
+ // reasons (`incremental-in-progress`, `embedding-checkpoint-pending`)
1245
+ // describe a run that did what it said and left work for next time; this
1246
+ // one means most of your edges are gone, so every query answers a confident
1247
+ // empty and the exit code is the only thing automation reads. Printing
1248
+ // "indexed successfully" and exiting 0 here would be the same class of
1249
+ // false certainty the check itself was written to remove.
1250
+ if (result.graphWriteCollapsed) {
1251
+ const { expected, persisted } = result.graphWriteCollapsed;
1252
+ console.log(`\n Repository indexed INCOMPLETELY (${totalTime}s)\n`);
1253
+ console.log(` Graph write collapsed: the pipeline produced ${expected.toLocaleString()} relationships\n` +
1254
+ ` but only ${persisted.toLocaleString()} are readable from the index. Queries will answer\n` +
1255
+ ` with missing edges rather than an error.\n\n` +
1256
+ ` The index is recorded INCOMPLETE (graph-write-collapsed). Re-run\n` +
1257
+ ` \`gitnexus analyze --force\`; if it recurs, check disk space and run \`gitnexus doctor\`.`);
1258
+ console.log(` ${repoPath}`);
1259
+ process.exitCode = 1;
1260
+ return;
1261
+ }
1175
1262
  console.log(`\n Repository indexed successfully (${totalTime}s)\n`);
1176
1263
  console.log(` ${(s.nodes ?? 0).toLocaleString()} nodes | ${(s.edges ?? 0).toLocaleString()} edges | ${s.communities ?? 0} clusters | ${s.processes ?? 0} flows`);
1177
1264
  console.log(` ${repoPath}`);
@@ -1179,9 +1266,24 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1179
1266
  // progress-bar log() that fired mid-run has already scrolled away, so the
1180
1267
  // degraded-search state must also appear in the final summary (#1161).
1181
1268
  if (result.ftsSkipped) {
1182
- console.log(`\n Warning: full-text/BM25 search is disabled — the LadybugDB FTS extension was unavailable.\n` +
1183
- ` Install it once with network access (GITNEXUS_LBUG_EXTENSION_INSTALL=auto) then rerun, or\n` +
1184
- ` run \`gitnexus analyze --repair-fts\` when connected. Run \`gitnexus doctor\` for details.`);
1269
+ // #2658 review L2: a build/verify failure is NOT an extension-unavailable
1270
+ // problem — sending the user to install the extension is the wrong remedy.
1271
+ if (result.ftsSkipReason === 'build-failed') {
1272
+ console.log(`\n Warning: full-text/BM25 search is disabled — the search index build failed this run.\n` +
1273
+ ` The FTS extension is available; rerun \`gitnexus analyze --repair-fts\`. If it persists,\n` +
1274
+ ` check the disk for space or corruption. Run \`gitnexus doctor\` for details.`);
1275
+ }
1276
+ else {
1277
+ console.log(
1278
+ // NOT "then rerun" (#2841 §5.C): this run stamped `lastCommit`, so a
1279
+ // plain rerun on an unchanged tree takes the up-to-date fast path and
1280
+ // returns before Phase 3 could rebuild anything — the advice would be
1281
+ // ineffective exactly when the user follows it. `--repair-fts` is the
1282
+ // verb that rebuilds the search indexes without re-parsing the repo.
1283
+ `\n Warning: full-text/BM25 search is disabled — the LadybugDB FTS extension was unavailable.\n` +
1284
+ ` Install it once with network access (GITNEXUS_LBUG_EXTENSION_INSTALL=auto), then run\n` +
1285
+ ` \`gitnexus analyze --repair-fts\` to build the search indexes. Run \`gitnexus doctor\` for details.`);
1286
+ }
1185
1287
  }
1186
1288
  try {
1187
1289
  await fs.access(getGlobalRegistryPath());
@@ -1212,6 +1314,18 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1212
1314
  process.exitCode = 1;
1213
1315
  return;
1214
1316
  }
1317
+ // Another analyze held the index lock past the configured wait ceiling
1318
+ // (#2658, GITNEXUS_INDEX_LOCK_TIMEOUT_MS). The on-disk index is being
1319
+ // refreshed by the holder — this is a clean, expected condition, not a
1320
+ // crash, so render the message without a stack trace.
1321
+ if (err instanceof IndexLockTimeoutError) {
1322
+ cliError(` Another gitnexus analyze (pid ${err.holder.pid} on ${err.holder.hostname}) is ` +
1323
+ `already refreshing this index and did not finish within the wait window.\n` +
1324
+ ` The on-disk index is being updated by that run. Retry later, or raise\n` +
1325
+ ` GITNEXUS_INDEX_LOCK_TIMEOUT_MS to wait longer.\n`, { recoveryHint: 'index-lock-timeout', holderPid: err.holder.pid });
1326
+ process.exitCode = 1;
1327
+ return;
1328
+ }
1215
1329
  // Finalize invariant failure (#1169) — keep the rich actionable
1216
1330
  // message intact and write through realStderrWrite so it can't be
1217
1331
  // erased by a leftover bar refresh on slow terminals.
@@ -1225,6 +1339,35 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1225
1339
  process.exitCode = 1;
1226
1340
  return;
1227
1341
  }
1342
+ // An extracted edge whose FROM→TO label pair is missing from GitNexus's own
1343
+ // relation DDL (#2789). `assertDeclaredPair` aborts the run rather than let
1344
+ // the bulk COPY fail late and silently drop the edge, so the user sees a
1345
+ // mid-run crash inside GitNexus internals with nothing to act on. Name the
1346
+ // pair, the relationship and the file that produced it, and say plainly that
1347
+ // a re-run cannot help — this is deterministic for the same input.
1348
+ // Checked by TYPE (repo norm, #2385) BEFORE the message-text heuristics
1349
+ // below, and through the `cause` chain because the ingestion phase runner
1350
+ // rewraps every phase failure as `Phase 'X' failed: …`.
1351
+ const undeclaredPair = findUndeclaredRelationPairError(err);
1352
+ if (undeclaredPair !== undefined) {
1353
+ // Render the error's OWN message indented — same idiom as the
1354
+ // `LbugWipeError` and page-size branches below. `UndeclaredRelationPairError`
1355
+ // builds a fully self-contained message (pair, relationship type, both node
1356
+ // ids, source file, issue URL, `.gitnexusignore` workaround) precisely
1357
+ // because `gitnexus serve` forwards only `err.message` over worker IPC.
1358
+ // Re-rendering those fields here would be a second copy of one string, free
1359
+ // to drift from the first — and the actionable half would reach CLI users
1360
+ // only. `undeclaredPair.message`, not the outer `msg`: the real error may be
1361
+ // several `cause` levels below the phase wrapper `msg` came from.
1362
+ cliError(` ${undeclaredPair.message.replace(/\n/g, '\n ')}\n`, {
1363
+ recoveryHint: 'undeclared-relation-pair',
1364
+ labelPair: undeclaredPair.pairKey,
1365
+ relationType: undeclaredPair.relationType,
1366
+ sourceFile: undeclaredPair.sourceFile,
1367
+ });
1368
+ process.exitCode = 1;
1369
+ return;
1370
+ }
1228
1371
  // WAL corruption — the index file is unreadable. Give a clear recovery
1229
1372
  // path without a confusing stack trace (the native error message alone
1230
1373
  // is enough signal).
@@ -12,7 +12,7 @@ import { type CliMessageKey, type CliMessageVars } from './i18n/index.js';
12
12
  * Consumers can import this type to narrow log-record `recoveryHint`
13
13
  * fields without restating the literal list.
14
14
  */
15
- export type RecoveryHint = 'wal-corruption' | 'wal-checkpoint-threshold' | 'lbug-wipe-failed' | 'lbug-page-size' | 'heap-oom-respawn' | 'native-worker-abort' | 'hf-endpoint-unreachable' | 'http-embedding-endpoint-error' | 'embedding-dims-invalid' | 'local-embedding-unsupported' | 'local-embedding-stack-missing' | 'large-repo' | 'npm-resolution' | 'module-not-found' | 'gitnexusrc-invalid' | 'default-branch-invalid';
15
+ export type RecoveryHint = 'wal-corruption' | 'wal-checkpoint-threshold' | 'lbug-wipe-failed' | 'lbug-page-size' | 'heap-oom-respawn' | 'native-worker-abort' | 'hf-endpoint-unreachable' | 'http-embedding-endpoint-error' | 'embedding-dims-invalid' | 'local-embedding-unsupported' | 'local-embedding-stack-missing' | 'large-repo' | 'npm-resolution' | 'module-not-found' | 'gitnexusrc-invalid' | 'default-branch-invalid' | 'index-lock-timeout' | 'undeclared-relation-pair';
16
16
  /**
17
17
  * Common shape for the optional structured-field bag passed to
18
18
  * `cliError`/`cliWarn`/`cliInfo`. Typed so the `recoveryHint` slot is
@@ -1,13 +1,30 @@
1
1
  import { t } from './i18n/index.js';
2
+ import { formatSymbolLine } from './format-symbol.js';
2
3
  export function formatDetectChangesResult(result) {
3
4
  const payload = (result ?? {});
4
5
  if (payload.error)
5
6
  return t('common.error', { message: String(payload.error) });
6
7
  const summary = payload.summary ?? {};
8
+ // A swallowed query failure sets `partial` and leaves the counts at zero
9
+ // (#2283). Printing only "No changes detected." turns a degraded run into a
10
+ // clean bill of health for the pre-commit gate, so say so either way.
11
+ // `truncated` is its sibling flag: the backend caps the changed_symbols
12
+ // LISTING (never the counts), so a short list is not proof of a short diff.
13
+ // Both lead the output — a caveat printed after the summary is read too late.
14
+ const notes = [];
15
+ if (payload.partial)
16
+ notes.push(t('tool.detectChanges.partial'));
17
+ // The plain truncation note reassures that the counts are whole. That is only
18
+ // true when the run did NOT also degrade — `changed_count` sums the batches
19
+ // that succeeded — so the two flags together get a different sentence.
20
+ if (payload.truncated)
21
+ notes.push(t(payload.partial ? 'tool.detectChanges.truncatedDegraded' : 'tool.detectChanges.truncated'));
7
22
  if ((summary.changed_count ?? 0) === 0) {
8
- return t('tool.detectChanges.noChanges');
23
+ return [...notes, t('tool.detectChanges.noChanges')].join('\n');
9
24
  }
10
25
  const lines = [];
26
+ if (notes.length > 0)
27
+ lines.push(...notes, '');
11
28
  lines.push(t('tool.detectChanges.changesSummary', {
12
29
  files: summary.changed_files ?? 0,
13
30
  symbols: summary.changed_count ?? 0,
@@ -22,7 +39,7 @@ export function formatDetectChangesResult(result) {
22
39
  lines.push(t('tool.detectChanges.changedSymbols'));
23
40
  const shown = changed.slice(0, 15);
24
41
  for (const symbol of shown) {
25
- lines.push(` ${symbol.type ?? 'Symbol'} ${symbol.name ?? '?'} → ${symbol.filePath ?? '?'}`);
42
+ lines.push(formatSymbolLine(symbol.type, symbol.name, symbol.filePath));
26
43
  }
27
44
  // Overflow is measured against the TRUE total (summary.changed_count), not
28
45
  // the array length — the array may already be `--limit`-sliced, so using its