gitnexus 1.6.9 → 1.6.10-aptos.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/README.md +211 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +197 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +5 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +28 -0
  294. package/dist/core/move/consistency.js +98 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +49 -0
  310. package/dist/core/move/move-ingest.js +320 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +3 -3
  322. package/dist/core/run-analyze.js +1001 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  374. package/hooks/claude/gitnexus-hook.cjs +59 -9
  375. package/hooks/claude/pre-tool-use.sh +0 -0
  376. package/hooks/claude/session-start.sh +0 -0
  377. package/package.json +21 -15
  378. package/scripts/cross-platform-tests.ts +56 -0
  379. package/scripts/ensure-fts.ts +43 -0
  380. package/scripts/install-duckdb-extension.mjs +85 -24
  381. package/scripts/run-cross-platform.ts +61 -6
  382. package/scripts/shard-arg.ts +30 -0
  383. package/scripts/sync-plugin-manifests.mjs +192 -0
  384. package/skills/gitnexus-lfg/README.md +55 -0
  385. package/skills/gitnexus-lfg/SKILL.md +86 -0
  386. package/skills/gitnexus-plan/README.md +142 -0
  387. package/skills/gitnexus-plan/SKILL.md +348 -0
  388. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  389. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  390. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  391. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  392. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  393. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  394. package/skills/gitnexus-review/SKILL.md +273 -0
  395. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  396. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  397. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  398. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  399. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  400. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  401. package/skills/gitnexus-work/README.md +71 -0
  402. package/skills/gitnexus-work/SKILL.md +269 -0
  403. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  404. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  405. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  406. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  407. package/web/assets/agent-Bqxn-abU.js +626 -0
  408. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  409. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  410. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  411. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  412. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  413. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  414. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  415. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  416. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  417. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  418. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  419. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  420. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  421. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  422. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  423. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  424. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  425. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  426. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  427. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  428. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  429. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  430. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  431. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  432. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  433. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  434. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  435. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  436. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  437. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  438. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  439. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  440. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  441. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  442. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  443. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  444. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  445. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  446. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  447. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  448. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  449. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  450. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  451. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  452. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  453. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  454. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  455. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  456. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  457. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  458. package/web/assets/index-CX_fADmQ.css +2 -0
  459. package/web/assets/index-D1Z3dGGz.js +575 -0
  460. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  461. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  462. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  463. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  464. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  465. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  466. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  467. package/web/assets/node-Ct_zna8U.js +8 -0
  468. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  469. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  470. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  471. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  472. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  473. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  474. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  475. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  476. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  477. package/web/assets/sdk-CzHHH8tD.js +37 -0
  478. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  479. package/web/assets/src-JV30wyV8.js +1 -0
  480. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  481. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  482. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  483. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  484. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  485. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  486. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  487. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  488. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  489. package/web/index.html +18 -10
  490. package/skills/gitnexus-pr-review.md +0 -163
  491. package/web/assets/agent-Dli_x7bU.js +0 -660
  492. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  493. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  494. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  495. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  496. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  497. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  498. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  499. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  500. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  501. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  502. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  503. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  504. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  505. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  506. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  507. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  508. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  509. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  510. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  511. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  512. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  513. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  514. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  515. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  516. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  517. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  518. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  519. package/web/assets/index-KctnI3Vq.js +0 -635
  520. package/web/assets/index-_lgn7hs5.css +0 -2
  521. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  522. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  523. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  524. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  525. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  526. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  527. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  528. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  529. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  530. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  531. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  532. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  533. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  534. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  535. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  536. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  537. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  538. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  539. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -8,6 +8,9 @@
8
8
  */
9
9
  import fs from 'fs/promises';
10
10
  import path from 'path';
11
+ const GENERATED_SKILL_PREFIX = 'gitnexus-area-';
12
+ const MAX_SKILL_NAME_LENGTH = 64;
13
+ const MAX_COMMUNITY_NAME_LENGTH = MAX_SKILL_NAME_LENGTH - GENERATED_SKILL_PREFIX.length;
11
14
  // ============================================================================
12
15
  // MAIN EXPORT
13
16
  // ============================================================================
@@ -20,7 +23,27 @@ import path from 'path';
20
23
  */
21
24
  export const generateSkillFiles = async (repoPath, projectName, pipelineResult) => {
22
25
  const { communityResult, processResult, graph } = pipelineResult;
23
- const outputDir = path.join(repoPath, '.claude', 'skills', 'generated');
26
+ const outputDir = path.join(repoPath, '.claude', 'skills');
27
+ const legacyOutputDir = path.join(outputDir, 'generated');
28
+ // Community skills used to live under an undiscoverable `generated/`
29
+ // grouping directory. Clear that GitNexus-owned legacy output and
30
+ // stale direct outputs in the reserved namespace, while preserving every
31
+ // unrelated project skill under .claude/skills/.
32
+ try {
33
+ const entries = await fs.readdir(outputDir, { withFileTypes: true });
34
+ await Promise.all(entries
35
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith(GENERATED_SKILL_PREFIX))
36
+ .map((entry) => fs.rm(path.join(outputDir, entry.name), { recursive: true, force: true })));
37
+ }
38
+ catch {
39
+ /* output root may not exist yet */
40
+ }
41
+ try {
42
+ await fs.rm(legacyOutputDir, { recursive: true, force: true });
43
+ }
44
+ catch {
45
+ /* legacy output may not exist */
46
+ }
24
47
  if (!communityResult || !communityResult.memberships.length) {
25
48
  console.log('\n Skills: no communities detected, skipping skill generation');
26
49
  return { skills: [], outputPath: outputDir };
@@ -47,13 +70,8 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
47
70
  // Step 3: Build lookup maps
48
71
  const membershipsByComm = buildMembershipMap(communityResult.memberships);
49
72
  const nodeIdToCommunityLabel = buildNodeCommunityLabelMap(communityResult.memberships, communities);
50
- // Step 4: Clear and recreate output directory
51
- try {
52
- await fs.rm(outputDir, { recursive: true, force: true });
53
- }
54
- catch {
55
- /* may not exist */
56
- }
73
+ // Step 4: Ensure the shared project-skill root exists. Never clear it: it
74
+ // also contains user-authored and standard GitNexus skills.
57
75
  await fs.mkdir(outputDir, { recursive: true });
58
76
  // Step 5: Generate skill files
59
77
  const skills = [];
@@ -74,14 +92,15 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
74
92
  // Generate kebab name
75
93
  const kebabName = toKebabName(community.label, usedNames);
76
94
  usedNames.add(kebabName);
95
+ const skillName = `${GENERATED_SKILL_PREFIX}${kebabName}`;
77
96
  // Generate SKILL.md content
78
- const content = renderSkillMarkdown(community, projectName, members, files, entryPoints, flows, connections, kebabName);
97
+ const content = renderSkillMarkdown(community, projectName, members, files, entryPoints, flows, connections, skillName);
79
98
  // Write file
80
- const skillDir = path.join(outputDir, kebabName);
99
+ const skillDir = path.join(outputDir, skillName);
81
100
  await fs.mkdir(skillDir, { recursive: true });
82
101
  await fs.writeFile(path.join(skillDir, 'SKILL.md'), content, 'utf-8');
83
102
  const info = {
84
- name: kebabName,
103
+ name: skillName,
85
104
  label: community.label,
86
105
  symbolCount: community.symbolCount,
87
106
  fileCount: files.length,
@@ -89,7 +108,7 @@ export const generateSkillFiles = async (repoPath, projectName, pipelineResult)
89
108
  skills.push(info);
90
109
  console.log(` \u2713 ${community.label} (${community.symbolCount} symbols, ${files.length} files)`);
91
110
  }
92
- console.log(`\n ${skills.length} skills generated \u2192 .claude/skills/generated/`);
111
+ console.log(`\n ${skills.length} skills generated \u2192 .claude/skills/${GENERATED_SKILL_PREFIX}*/`);
93
112
  return { skills, outputPath: outputDir };
94
113
  };
95
114
  // ============================================================================
@@ -380,10 +399,10 @@ const gatherCrossConnections = (rawIds, ownLabel, membershipsByComm, nodeIdToCom
380
399
  * @param {MemberSymbol[]} entryPoints - Exported entry point symbols
381
400
  * @param {ProcessNode[]} flows - Execution flows touching this community
382
401
  * @param {CrossConnection[]} connections - Cross-community connections
383
- * @param {string} kebabName - Kebab-case name for the skill
402
+ * @param {string} skillName - Namespaced kebab-case name for the skill
384
403
  * @returns {string} Full SKILL.md content
385
404
  */
386
- const renderSkillMarkdown = (community, projectName, members, files, entryPoints, flows, connections, kebabName) => {
405
+ const renderSkillMarkdown = (community, projectName, members, files, entryPoints, flows, connections, skillName) => {
387
406
  const cohesionPct = Math.round(community.cohesion * 100);
388
407
  // Dominant directory: most common top-level directory
389
408
  const dominantDir = getDominantDirectory(files);
@@ -396,7 +415,7 @@ const renderSkillMarkdown = (community, projectName, members, files, entryPoints
396
415
  const lines = [];
397
416
  // Frontmatter
398
417
  lines.push('---');
399
- lines.push(`name: ${kebabName}`);
418
+ lines.push(`name: ${skillName}`);
400
419
  lines.push(`description: "Skill for the ${community.label} area of ${projectName}. ${community.symbolCount} symbols across ${files.length} files."`);
401
420
  lines.push('---');
402
421
  lines.push('');
@@ -496,20 +515,21 @@ const renderSkillMarkdown = (community, projectName, members, files, entryPoints
496
515
  * @brief Convert a community label to a kebab-case directory name
497
516
  * @param {string} label - The community label
498
517
  * @param {Set<string>} usedNames - Already-used names for collision detection
499
- * @returns {string} Unique kebab-case name capped at 50 characters
518
+ * @returns {string} Unique kebab-case name that leaves room for the GitNexus prefix
500
519
  */
501
520
  const toKebabName = (label, usedNames) => {
502
521
  let name = label
503
522
  .toLowerCase()
504
523
  .replace(/[^a-z0-9]+/g, '-')
505
524
  .replace(/^-+|-+$/g, '')
506
- .slice(0, 50);
525
+ .slice(0, MAX_COMMUNITY_NAME_LENGTH);
507
526
  if (!name)
508
527
  name = 'skill';
509
528
  let candidate = name;
510
529
  let counter = 2;
511
530
  while (usedNames.has(candidate)) {
512
- candidate = `${name}-${counter}`;
531
+ const suffix = `-${counter}`;
532
+ candidate = `${name.slice(0, MAX_COMMUNITY_NAME_LENGTH - suffix.length)}${suffix}`;
513
533
  counter++;
514
534
  }
515
535
  return candidate;
@@ -0,0 +1,76 @@
1
+ export type StandardSkillDistribution = 'project' | 'npm' | 'claudePlugin' | 'cursor';
2
+ export interface StandardSkillCatalogEntry {
3
+ readonly name: `gitnexus-${string}`;
4
+ readonly agentTableTask: string;
5
+ readonly fallbackDescription: string;
6
+ readonly distributions: Readonly<Record<StandardSkillDistribution, boolean>>;
7
+ }
8
+ /**
9
+ * Canonical metadata for the standard skills installed by `gitnexus analyze`.
10
+ *
11
+ * Keep distribution intent here so generated agent guidance and drift guards
12
+ * cannot disagree about which copies should exist. The ordering intentionally
13
+ * matches the generated AGENTS.md / CLAUDE.md task table.
14
+ */
15
+ export declare const STANDARD_SKILL_CATALOG: readonly [{
16
+ readonly name: "gitnexus-exploring";
17
+ readonly agentTableTask: "Understand architecture / \"How does X work?\"";
18
+ readonly fallbackDescription: "Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: \"How does X work?\", \"What calls this function?\", \"Show me the auth flow\"";
19
+ readonly distributions: {
20
+ readonly project: true;
21
+ readonly npm: true;
22
+ readonly claudePlugin: true;
23
+ readonly cursor: true;
24
+ };
25
+ }, {
26
+ readonly name: "gitnexus-impact-analysis";
27
+ readonly agentTableTask: "Blast radius / \"What breaks if I change X?\"";
28
+ readonly fallbackDescription: "Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: \"Is it safe to change X?\", \"What depends on this?\", \"What will break?\"";
29
+ readonly distributions: {
30
+ readonly project: true;
31
+ readonly npm: true;
32
+ readonly claudePlugin: true;
33
+ readonly cursor: true;
34
+ };
35
+ }, {
36
+ readonly name: "gitnexus-debugging";
37
+ readonly agentTableTask: "Trace bugs / \"Why is X failing?\"";
38
+ readonly fallbackDescription: "Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: \"Why is X failing?\", \"Where does this error come from?\", \"Trace this bug\"";
39
+ readonly distributions: {
40
+ readonly project: true;
41
+ readonly npm: true;
42
+ readonly claudePlugin: true;
43
+ readonly cursor: true;
44
+ };
45
+ }, {
46
+ readonly name: "gitnexus-refactoring";
47
+ readonly agentTableTask: "Rename / extract / split / refactor";
48
+ readonly fallbackDescription: "Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: \"Rename this function\", \"Extract this into a module\", \"Refactor this class\", \"Move this to a separate file\"";
49
+ readonly distributions: {
50
+ readonly project: true;
51
+ readonly npm: true;
52
+ readonly claudePlugin: true;
53
+ readonly cursor: true;
54
+ };
55
+ }, {
56
+ readonly name: "gitnexus-guide";
57
+ readonly agentTableTask: "Tools, resources, schema reference";
58
+ readonly fallbackDescription: "Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: \"What GitNexus tools are available?\", \"How do I use GitNexus?\"";
59
+ readonly distributions: {
60
+ readonly project: true;
61
+ readonly npm: true;
62
+ readonly claudePlugin: true;
63
+ readonly cursor: false;
64
+ };
65
+ }, {
66
+ readonly name: "gitnexus-cli";
67
+ readonly agentTableTask: "Index, status, clean, wiki CLI commands";
68
+ readonly fallbackDescription: "Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: \"Index this repo\", \"Reanalyze the codebase\", \"Generate a wiki\"";
69
+ readonly distributions: {
70
+ readonly project: true;
71
+ readonly npm: true;
72
+ readonly claudePlugin: true;
73
+ readonly cursor: false;
74
+ };
75
+ }];
76
+ export type StandardSkillName = (typeof STANDARD_SKILL_CATALOG)[number]['name'];
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Canonical metadata for the standard skills installed by `gitnexus analyze`.
3
+ *
4
+ * Keep distribution intent here so generated agent guidance and drift guards
5
+ * cannot disagree about which copies should exist. The ordering intentionally
6
+ * matches the generated AGENTS.md / CLAUDE.md task table.
7
+ */
8
+ export const STANDARD_SKILL_CATALOG = [
9
+ {
10
+ name: 'gitnexus-exploring',
11
+ agentTableTask: 'Understand architecture / "How does X work?"',
12
+ fallbackDescription: 'Use when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase. Examples: "How does X work?", "What calls this function?", "Show me the auth flow"',
13
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
14
+ },
15
+ {
16
+ name: 'gitnexus-impact-analysis',
17
+ agentTableTask: 'Blast radius / "What breaks if I change X?"',
18
+ fallbackDescription: 'Use when the user wants to know what will break if they change something, or needs safety analysis before editing code. Examples: "Is it safe to change X?", "What depends on this?", "What will break?"',
19
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
20
+ },
21
+ {
22
+ name: 'gitnexus-debugging',
23
+ agentTableTask: 'Trace bugs / "Why is X failing?"',
24
+ fallbackDescription: 'Use when the user is debugging a bug, tracing an error, or asking why something fails. Examples: "Why is X failing?", "Where does this error come from?", "Trace this bug"',
25
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
26
+ },
27
+ {
28
+ name: 'gitnexus-refactoring',
29
+ agentTableTask: 'Rename / extract / split / refactor',
30
+ fallbackDescription: 'Use when the user wants to rename, extract, split, move, or restructure code safely. Examples: "Rename this function", "Extract this into a module", "Refactor this class", "Move this to a separate file"',
31
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: true },
32
+ },
33
+ {
34
+ name: 'gitnexus-guide',
35
+ agentTableTask: 'Tools, resources, schema reference',
36
+ fallbackDescription: 'Use when the user asks about GitNexus itself — available tools, how to query the knowledge graph, MCP resources, graph schema, or workflow reference. Examples: "What GitNexus tools are available?", "How do I use GitNexus?"',
37
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: false },
38
+ },
39
+ {
40
+ name: 'gitnexus-cli',
41
+ agentTableTask: 'Index, status, clean, wiki CLI commands',
42
+ fallbackDescription: 'Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki, or list indexed repos. Examples: "Index this repo", "Reanalyze the codebase", "Generate a wiki"',
43
+ distributions: { project: true, npm: true, claudePlugin: true, cursor: false },
44
+ },
45
+ ];
@@ -3,4 +3,7 @@
3
3
  *
4
4
  * Shows the indexing status of the current repository.
5
5
  */
6
- export declare const statusCommand: () => Promise<void>;
6
+ export interface StatusOptions {
7
+ json?: boolean;
8
+ }
9
+ export declare const statusCommand: (options?: StatusOptions) => Promise<void>;
@@ -5,11 +5,17 @@
5
5
  */
6
6
  import path from 'path';
7
7
  import { findRepo, getStoragePaths, loadMeta, hasKuzuIndex } from '../storage/repo-manager.js';
8
- import { getCurrentCommit, getCurrentBranch, isGitRepo, getGitRoot } from '../storage/git.js';
8
+ import { getCurrentCommit, getCurrentBranch, isGitRepo, getGitRoot, isWorkingTreeDirty, } from '../storage/git.js';
9
+ import { analyzerRunnerIdentitiesEqual, resolveAnalyzerRunnerIdentity, } from '../core/analyzer-identity.js';
10
+ import { getIndexIncompleteReasons } from '../core/index-freshness.js';
9
11
  import { t } from './i18n/index.js';
10
- export const statusCommand = async () => {
12
+ export const statusCommand = async (options = {}) => {
11
13
  const cwd = process.cwd();
12
14
  if (!isGitRepo(cwd)) {
15
+ if (options.json) {
16
+ console.log(JSON.stringify({ schemaVersion: 1, error: 'not-git-repository' }));
17
+ return;
18
+ }
13
19
  console.log(t('status.notGitRepo'));
14
20
  return;
15
21
  }
@@ -18,7 +24,16 @@ export const statusCommand = async () => {
18
24
  // Check if there's a stale KuzuDB index that needs migration
19
25
  const repoRoot = getGitRoot(cwd) ?? cwd;
20
26
  const { storagePath } = getStoragePaths(repoRoot);
21
- if (await hasKuzuIndex(storagePath)) {
27
+ const staleKuzu = await hasKuzuIndex(storagePath);
28
+ if (options.json) {
29
+ console.log(JSON.stringify({
30
+ schemaVersion: 1,
31
+ repository: repoRoot,
32
+ error: staleKuzu ? 'stale-kuzu-index' : 'not-indexed',
33
+ }));
34
+ return;
35
+ }
36
+ if (staleKuzu) {
22
37
  console.log(t('status.staleKuzu'));
23
38
  console.log(t('status.rebuildLadybug'));
24
39
  }
@@ -45,14 +60,52 @@ export const statusCommand = async () => {
45
60
  else
46
61
  workspaceLagsBranch = true;
47
62
  }
63
+ const currentRunnerIdentity = resolveAnalyzerRunnerIdentity(import.meta.url);
64
+ const runnerIdentityIsCurrent = analyzerRunnerIdentitiesEqual(activeMeta.runnerIdentity, currentRunnerIdentity);
65
+ const incompleteReasons = getIndexIncompleteReasons(activeMeta);
66
+ // A matching HEAD is not enough: `analyze` re-indexes a dirty working tree,
67
+ // so a repo with uncommitted source changes is stale even at the same commit.
68
+ // Skip the check for non-git folders (currentCommit === '') to match analyze.
69
+ const isUpToDate = currentCommit === activeMeta.lastCommit &&
70
+ runnerIdentityIsCurrent &&
71
+ incompleteReasons.length === 0 &&
72
+ (currentCommit === '' || !isWorkingTreeDirty(repo.repoPath));
73
+ if (options.json) {
74
+ console.log(JSON.stringify({
75
+ schemaVersion: 1,
76
+ repository: repo.repoPath,
77
+ branch: currentBranch,
78
+ workspaceIndexBranch: workspaceLagsBranch ? (repo.meta.branch ?? null) : null,
79
+ index: {
80
+ indexedAt: activeMeta.indexedAt,
81
+ commit: activeMeta.lastCommit,
82
+ runnerIdentity: activeMeta.runnerIdentity ?? null,
83
+ runnerIdentityStatus: runnerIdentityIsCurrent ? 'current' : 'stale-or-unknown',
84
+ incompleteReasons,
85
+ },
86
+ current: {
87
+ commit: currentCommit,
88
+ runnerIdentity: currentRunnerIdentity,
89
+ },
90
+ status: isUpToDate ? 'up-to-date' : 'stale',
91
+ }));
92
+ return;
93
+ }
48
94
  console.log(`${t('status.repository')}: ${repo.repoPath}`);
49
95
  console.log(`${t('status.branch')}: ${currentBranch ?? t('status.detached')}`);
50
96
  if (workspaceLagsBranch) {
51
97
  console.log(t('status.workspaceIndexLabel', { primary: repo.meta.branch ?? '' }));
52
98
  }
53
- const isUpToDate = currentCommit === activeMeta.lastCommit;
54
99
  console.log(`${t('status.indexed')}: ${new Date(activeMeta.indexedAt).toLocaleString()}`);
55
100
  console.log(`${t('status.indexedCommit')}: ${activeMeta.lastCommit?.slice(0, 7)}`);
56
101
  console.log(`${t('status.currentCommit')}: ${currentCommit?.slice(0, 7)}`);
102
+ // Emit the complete, versioned receipt as JSON so humans can inspect it and
103
+ // automation can compare it without reverse-engineering a display string.
104
+ // `null` is the backward-compatible signal for pre-receipt metadata.
105
+ console.log(`${t('status.indexRunnerIdentity')}: ${JSON.stringify(activeMeta.runnerIdentity ?? null)}`);
106
+ if (incompleteReasons.length > 0) {
107
+ console.log(`Index incomplete reasons: ${JSON.stringify(incompleteReasons)}`);
108
+ }
109
+ console.log(`${t('status.currentRunnerIdentity')}: ${JSON.stringify(currentRunnerIdentity)}`);
57
110
  console.log(`${t('status.status')}: ${isUpToDate ? t('status.upToDate') : t('status.stale')}`);
58
111
  };
package/dist/cli/tool.js CHANGED
@@ -54,6 +54,17 @@ function output(data) {
54
54
  // Fallback: stderr (previous behavior, works on all platforms)
55
55
  process.stderr.write(text + '\n');
56
56
  }
57
+ // Backend failures come back as `{ error }` payloads rather than throws
58
+ // (#2469). Every tool command routes its result through here, so this is
59
+ // the one place that keeps scripted callers honest: print the payload,
60
+ // then exit non-zero.
61
+ if (data &&
62
+ typeof data === 'object' &&
63
+ 'error' in data &&
64
+ typeof data.error === 'string' &&
65
+ data.error.trim().length > 0) {
66
+ process.exitCode = 1;
67
+ }
57
68
  }
58
69
  /**
59
70
  * Parse a `--limit` CLI option into a positive row cap, or `undefined` when the
@@ -33,7 +33,8 @@ import { execFile } from 'child_process';
33
33
  import { promisify } from 'util';
34
34
  import { fileURLToPath } from 'url';
35
35
  import { parseTree, modify, applyEdits, findNodeAtLocation, parse as parseJsonc, } from 'jsonc-parser';
36
- import { getEditorTargets, detectIndentation } from './editor-targets.js';
36
+ import { getEditorTargets, detectIndentation, isEnoent } from './editor-targets.js';
37
+ import { LEGACY_SKILL_DIR_NAMES } from './setup.js';
37
38
  const __filename = fileURLToPath(import.meta.url);
38
39
  const __dirname = path.dirname(__filename);
39
40
  const execFileAsync = promisify(execFile);
@@ -50,7 +51,13 @@ async function removeJsoncKey(filePath, keyPath, dryRun) {
50
51
  try {
51
52
  raw = await fs.readFile(filePath, 'utf-8');
52
53
  }
53
- catch {
54
+ catch (err) {
55
+ // ENOENT = genuinely not configured. Any other read failure (EACCES,
56
+ // locks) must not report 'missing' — the file may hold a real gitnexus
57
+ // entry the dry-run would then deny exists. Rethrow into the caller's
58
+ // per-file catch.
59
+ if (!isEnoent(err))
60
+ throw err;
54
61
  return 'missing';
55
62
  }
56
63
  if (raw.trim().length === 0)
@@ -88,7 +95,12 @@ async function removeHookEntries(filePath, eventNames, commandNeedle, dryRun) {
88
95
  try {
89
96
  raw = await fs.readFile(filePath, 'utf-8');
90
97
  }
91
- catch {
98
+ catch (err) {
99
+ // Masking a non-ENOENT read failure as 'missing' would also let the
100
+ // caller delete the hook scriptDir while the unreadable settings file
101
+ // still references it. Rethrow into the hook uninstaller's catch.
102
+ if (!isEnoent(err))
103
+ throw err;
92
104
  return { status: 'missing', count: 0 };
93
105
  }
94
106
  if (raw.trim().length === 0)
@@ -166,13 +178,17 @@ async function removeDir(dirPath, dryRun) {
166
178
  /**
167
179
  * The exact set of skill directory names setup installs, derived from the
168
180
  * bundled `skills/` source the same way installSkillsTo does (flat
169
- * `{name}.md` and `{name}/SKILL.md` layouts). Deriving the set — rather
181
+ * `{name}.md` and `{name}/SKILL.md` layouts), plus the legacy names that
182
+ * older setups installed before a shipped rename. Deriving the set — rather
170
183
  * than globbing `gitnexus-*` — ensures we never delete a user's own
171
184
  * similarly-named skill folder.
172
185
  */
173
186
  async function listGitnexusSkillNames() {
174
187
  const skillsRoot = process.env.GITNEXUS_TEST_SKILLS_ROOT ?? path.join(__dirname, '..', '..', 'skills');
175
- const names = new Set();
188
+ // Seed with legacy names superseded by shipped renames: they dropped out of
189
+ // the bundled source, but a pre-rename install left them behind in every
190
+ // target. Setup only warns about them; uninstall removes by name by design.
191
+ const names = new Set(LEGACY_SKILL_DIR_NAMES);
176
192
  try {
177
193
  const entries = await fs.readdir(skillsRoot, { withFileTypes: true });
178
194
  for (const entry of entries) {
@@ -323,8 +339,15 @@ async function uninstallCodex(result, dryRun, configPath, tomlSection) {
323
339
  try {
324
340
  raw = await fs.readFile(configPath, 'utf-8');
325
341
  }
326
- catch {
327
- result.skipped.push('Codex MCP (not configured)');
342
+ catch (err) {
343
+ // Catch locally: this call site has no surrounding try, so a rethrow
344
+ // would abort the hooks/skills cleanup that runs after Codex.
345
+ if (isEnoent(err)) {
346
+ result.skipped.push('Codex MCP (not configured)');
347
+ }
348
+ else {
349
+ result.errors.push(`Codex: ${err instanceof Error ? err.message : String(err)}`);
350
+ }
328
351
  return;
329
352
  }
330
353
  if (!raw.includes(`[${tomlSection}]`)) {
@@ -369,20 +392,50 @@ export const uninstallCommand = async (options) => {
369
392
  console.log(' Dry run — nothing will be changed. Re-run with --force to apply.');
370
393
  console.log('');
371
394
  }
372
- const result = { removed: [], skipped: [], errors: [] };
395
+ const result = { removed: [], skipped: [], errors: [], corruptLegacy: false };
373
396
  // ─── MCP server entries (JSONC editors) ──────────────────────────
397
+ // Sweep legacyFiles too: setup writes into the first existing file of the
398
+ // editor's priority chain, so the gitnexus entry may live in a deprecated
399
+ // location (e.g. CodeBuddy's ~/.codebuddy/mcp.json).
374
400
  for (const target of targets.mcpJsonc) {
375
- try {
376
- const status = await removeJsoncKey(target.file, target.keyPath, dryRun);
377
- if (status === 'removed')
378
- result.removed.push(`${target.label} MCP server — ${target.keyPath.join('.')} in ${target.file}`);
379
- else if (status === 'corrupt')
380
- result.errors.push(`${target.label}: ${path.basename(target.file)} is corrupt — left untouched`);
381
- else
382
- result.skipped.push(`${target.label} MCP (not configured)`);
401
+ let removedAny = false;
402
+ let erroredAny = false;
403
+ let corruptLegacyAny = false;
404
+ for (const file of [target.file, ...(target.legacyFiles ?? [])]) {
405
+ try {
406
+ const status = await removeJsoncKey(file, target.keyPath, dryRun);
407
+ if (status === 'removed') {
408
+ removedAny = true;
409
+ result.removed.push(`${target.label} MCP server — ${target.keyPath.join('.')} in ${file}`);
410
+ }
411
+ else if (status === 'corrupt') {
412
+ if (file === target.file) {
413
+ // The primary path is where gitnexus itself writes — corruption
414
+ // there is an error worth failing the command over.
415
+ erroredAny = true;
416
+ result.errors.push(`${target.label}: ${path.basename(file)} is corrupt — left untouched`);
417
+ }
418
+ else {
419
+ // Legacy chain files are vendor locations gitnexus may never have
420
+ // touched (e.g. a corrupt ~/.codebuddy.json from an old install).
421
+ // Report informationally without failing uninstall. Deliberate
422
+ // asymmetry: an UNREADABLE (non-ENOENT) legacy file still errors —
423
+ // that's an environmental problem worth surfacing, while corrupt-
424
+ // but-readable proves there is no removable gitnexus entry.
425
+ corruptLegacyAny = true;
426
+ result.corruptLegacy = true;
427
+ result.skipped.push(`${target.label} MCP (legacy ${path.basename(file)} is corrupt — left untouched)`);
428
+ }
429
+ }
430
+ }
431
+ catch (err) {
432
+ erroredAny = true;
433
+ result.errors.push(`${target.label}: ${err instanceof Error ? err.message : String(err)}`);
434
+ }
383
435
  }
384
- catch (err) {
385
- result.errors.push(`${target.label}: ${err.message}`);
436
+ // A corrupt legacy file makes "not configured" unknowable — suppress it.
437
+ if (!removedAny && !erroredAny && !corruptLegacyAny) {
438
+ result.skipped.push(`${target.label} MCP (not configured)`);
386
439
  }
387
440
  }
388
441
  await uninstallCodex(result, dryRun, targets.codex.configFile, targets.codex.tomlSection);
@@ -425,6 +478,12 @@ export const uninstallCommand = async (options) => {
425
478
  for (const name of result.removed)
426
479
  console.log(` - ${name}`);
427
480
  }
481
+ else if (result.errors.length > 0 || result.corruptLegacy) {
482
+ // Errors (corrupt primary files, unreadable configs) or corrupt legacy
483
+ // configs make "not configured" unknowable — claiming it right above an
484
+ // Errors block would be a contradiction users learn to distrust.
485
+ console.log(' Nothing removed.');
486
+ }
428
487
  else {
429
488
  console.log(' Nothing to remove — GitNexus is not configured in any detected editor.');
430
489
  }
@@ -20,5 +20,6 @@ export interface WikiCommandOptions {
20
20
  timeout?: string;
21
21
  retries?: string;
22
22
  lang?: string;
23
+ allowInsecureConnection?: string;
23
24
  }
24
25
  export declare const wikiCommand: (inputPath?: string, options?: WikiCommandOptions) => Promise<void>;
package/dist/cli/wiki.js CHANGED
@@ -11,7 +11,7 @@ import cliProgress from 'cli-progress';
11
11
  import { getGitRoot, isGitRepo } from '../storage/git.js';
12
12
  import { getStoragePaths, loadMeta, loadCLIConfig, saveCLIConfig, } from '../storage/repo-manager.js';
13
13
  import { WikiGenerator } from '../core/wiki/generator.js';
14
- import { resolveLLMConfig } from '../core/wiki/llm-client.js';
14
+ import { parseLLMAllowedInsecureHttpHosts, resolveLLMConfig, } from '../core/wiki/llm-client.js';
15
15
  import { detectCursorCLI } from '../core/wiki/cursor-client.js';
16
16
  import { detectLocalCLI } from '../core/wiki/local-cli-client.js';
17
17
  import { logger } from '../core/logger.js';
@@ -152,9 +152,14 @@ const wikiCommandImpl = async (inputPath, options) => {
152
152
  }
153
153
  let timeoutSeconds;
154
154
  let retries;
155
+ let allowedInsecureHttpHosts;
155
156
  try {
156
157
  timeoutSeconds = parsePositiveIntegerOption(options?.timeout, '--timeout', 1000);
157
158
  retries = parsePositiveIntegerOption(options?.retries, '--retries');
159
+ allowedInsecureHttpHosts =
160
+ options?.allowInsecureConnection === undefined
161
+ ? undefined
162
+ : parseLLMAllowedInsecureHttpHosts(options.allowInsecureConnection);
158
163
  }
159
164
  catch (error) {
160
165
  console.log(` Error: ${error.message}\n`);
@@ -210,6 +215,7 @@ const wikiCommandImpl = async (inputPath, options) => {
210
215
  provider: options?.provider,
211
216
  apiVersion: options?.apiVersion,
212
217
  isReasoningModel: options?.reasoningModel,
218
+ allowedInsecureHttpHosts,
213
219
  });
214
220
  // Run interactive setup if no saved config and no CLI flags provided
215
221
  // (even if env vars exist — let user explicitly choose their provider)
@@ -10,6 +10,8 @@ export declare const isHardcodedIgnoredDirectory: (name: string) => boolean;
10
10
  export interface IgnoreOptions {
11
11
  /** Skip .gitignore parsing, only read .gitnexusignore. Defaults to GITNEXUS_NO_GITIGNORE env var. */
12
12
  noGitignore?: boolean;
13
+ /** Skip core.excludesFile and $GIT_COMMON_DIR/info/exclude. Defaults to GITNEXUS_NO_GLOBAL_IGNORE env var. */
14
+ noGlobalIgnore?: boolean;
13
15
  }
14
16
  export declare const loadIgnoreRules: (repoPath: string, options?: IgnoreOptions) => Promise<Ignore | null>;
15
17
  /**
@@ -2,6 +2,7 @@ import ignore from 'ignore';
2
2
  import fs from 'fs/promises';
3
3
  import nodePath from 'path';
4
4
  import { logger } from '../core/logger.js';
5
+ import { getCoreExcludesFilePath, getGitInfoExcludePath } from '../storage/git.js';
5
6
  const DEFAULT_IGNORE_LIST = new Set([
6
7
  // Version Control
7
8
  '.git',
@@ -312,6 +313,32 @@ export const isHardcodedIgnoredDirectory = (name) => {
312
313
  export const loadIgnoreRules = async (repoPath, options) => {
313
314
  const ig = ignore();
314
315
  let hasRules = false;
316
+ // Mirror git's own precedence for ignore sources (gitignore(5)): patterns
317
+ // from core.excludesFile are consulted first (lowest precedence — git's
318
+ // real global, all-repos file), then $GIT_COMMON_DIR/info/exclude
319
+ // (per-repo, untracked — no write access to the repo needed), then
320
+ // .gitignore/.gitnexusignore below. Later ig.add() calls win on
321
+ // conflicting patterns, matching git's own last-match-wins semantics (#2606).
322
+ const skipGlobalIgnore = options?.noGlobalIgnore ?? !!process.env.GITNEXUS_NO_GLOBAL_IGNORE;
323
+ if (!skipGlobalIgnore) {
324
+ const globalSources = [
325
+ getCoreExcludesFilePath(repoPath),
326
+ getGitInfoExcludePath(repoPath),
327
+ ].filter((candidate) => candidate !== null);
328
+ for (const sourcePath of globalSources) {
329
+ try {
330
+ const content = await fs.readFile(sourcePath, 'utf-8');
331
+ ig.add(content);
332
+ hasRules = true;
333
+ }
334
+ catch (err) {
335
+ const code = err.code;
336
+ if (code !== 'ENOENT') {
337
+ logger.warn(` Warning: could not read ${sourcePath}: ${err.message}`);
338
+ }
339
+ }
340
+ }
341
+ }
315
342
  // Allow users to bypass .gitignore parsing (e.g. when .gitignore accidentally excludes source files)
316
343
  const skipGitignore = options?.noGitignore ?? !!process.env.GITNEXUS_NO_GITIGNORE;
317
344
  const filenames = skipGitignore ? ['.gitnexusignore'] : ['.gitignore', '.gitnexusignore'];
@@ -0,0 +1,21 @@
1
+ /** A durable statement that one analysis capability was produced by this build. */
2
+ export interface AnalysisFeatureDescriptor {
3
+ readonly id: string;
4
+ readonly version: number;
5
+ readonly appliesTo: (filePaths: readonly string[]) => boolean;
6
+ }
7
+ export type AnalysisFeatureVersions = Readonly<Record<string, number>>;
8
+ /**
9
+ * The Class table shape is global even when a repository contains no JVM code.
10
+ * Existing v8 indexes predate the frameworkAnnotations column and therefore
11
+ * need one full rebuild before any incremental Class write can be safe.
12
+ */
13
+ export declare const CLASS_FRAMEWORK_ANNOTATIONS_FEATURE: AnalysisFeatureDescriptor;
14
+ /** Resolve the exact feature set this build promises for the supplied files. */
15
+ export declare function resolveAnalysisFeatureVersions(descriptors: readonly AnalysisFeatureDescriptor[], filePaths: readonly string[]): Record<string, number>;
16
+ /**
17
+ * Compare an untrusted metadata value with the exact capabilities produced by
18
+ * this build. Extra keys also mismatch: a rollback must rebuild instead of
19
+ * certifying graph semantics emitted only by a newer binary.
20
+ */
21
+ export declare function findAnalysisFeatureMismatches(actual: unknown, expected: AnalysisFeatureVersions): readonly string[];