gitnexus 1.6.8-rc.4 → 1.6.8-rc.40
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.
- package/README.md +3 -3
- package/dist/_shared/graph/types.d.ts +15 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +6 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +4 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +31 -1
- package/dist/cli/ai-context.js +15 -15
- package/dist/cli/analyze-config.js +50 -0
- package/dist/cli/analyze.d.ts +30 -0
- package/dist/cli/analyze.js +132 -6
- package/dist/cli/clean.d.ts +1 -0
- package/dist/cli/clean.js +43 -1
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.js +43 -0
- package/dist/cli/help-i18n.js +25 -0
- package/dist/cli/i18n/en.d.ts +26 -1
- package/dist/cli/i18n/en.js +26 -1
- package/dist/cli/i18n/resources.d.ts +51 -1
- package/dist/cli/i18n/zh-CN.d.ts +25 -0
- package/dist/cli/i18n/zh-CN.js +26 -1
- package/dist/cli/index.js +96 -1
- package/dist/cli/list.js +12 -0
- package/dist/cli/mcp.d.ts +6 -1
- package/dist/cli/mcp.js +26 -1
- package/dist/cli/optional-grammars.d.ts +6 -8
- package/dist/cli/optional-grammars.js +8 -11
- package/dist/cli/setup.d.ts +3 -1
- package/dist/cli/setup.js +67 -17
- package/dist/cli/skill-gen.js +2 -1
- package/dist/cli/status.js +26 -5
- package/dist/cli/tool.d.ts +22 -1
- package/dist/cli/tool.js +90 -3
- package/dist/core/embeddings/embedder.js +4 -0
- package/dist/core/embeddings/hf-env.d.ts +0 -66
- package/dist/core/embeddings/http-client.d.ts +7 -0
- package/dist/core/embeddings/http-client.js +5 -3
- package/dist/core/embeddings/onnxruntime-common-resolver.d.ts +6 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +130 -0
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/java.js +3 -50
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/include-extractor.js +7 -7
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +12 -1
- package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
- package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
- package/dist/core/ingestion/cfg/collect.d.ts +51 -0
- package/dist/core/ingestion/cfg/collect.js +77 -0
- package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
- package/dist/core/ingestion/cfg/control-dependence.js +182 -0
- package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
- package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
- package/dist/core/ingestion/cfg/emit.d.ts +228 -0
- package/dist/core/ingestion/cfg/emit.js +486 -0
- package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
- package/dist/core/ingestion/cfg/post-dominators.js +176 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
- package/dist/core/ingestion/cfg/reaching-defs.d.ts +148 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +757 -0
- package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
- package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
- package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
- package/dist/core/ingestion/cfg/traversal-result.js +2 -0
- package/dist/core/ingestion/cfg/types.d.ts +231 -0
- package/dist/core/ingestion/cfg/types.js +13 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +539 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +152 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +304 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +587 -0
- package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +168 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +499 -0
- package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
- package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.js +629 -0
- package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/go.js +638 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.js +503 -0
- package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
- package/dist/core/ingestion/cfg/visitors/java.js +812 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +170 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +505 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.js +616 -0
- package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
- package/dist/core/ingestion/cfg/visitors/php.js +721 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +175 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +601 -0
- package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
- package/dist/core/ingestion/cfg/visitors/python.js +558 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +144 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +419 -0
- package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
- package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +165 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +547 -0
- package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
- package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +169 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +505 -0
- package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
- package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +144 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1032 -0
- package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
- package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
- package/dist/core/ingestion/language-provider.d.ts +36 -2
- package/dist/core/ingestion/languages/c-cpp.js +14 -4
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +6 -2
- package/dist/core/ingestion/languages/cpp/captures.js +24 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/csharp.js +2 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go.js +2 -0
- package/dist/core/ingestion/languages/java.js +6 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +8 -1
- package/dist/core/ingestion/languages/php.js +2 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/ruby.js +2 -0
- package/dist/core/ingestion/languages/rust.js +2 -0
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript.js +5 -0
- package/dist/core/ingestion/languages/vue.js +6 -0
- package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +2 -0
- package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
- package/dist/core/ingestion/model/symbol-table.js +1 -0
- package/dist/core/ingestion/mro-processor.js +109 -0
- package/dist/core/ingestion/parsing-processor.js +44 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
- package/dist/core/ingestion/pipeline-phases/routes.js +64 -14
- package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
- package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
- package/dist/core/ingestion/pipeline.d.ts +79 -10
- package/dist/core/ingestion/pipeline.js +5 -1
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +50 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +80 -0
- package/dist/core/ingestion/route-extractors/spring.d.ts +35 -0
- package/dist/core/ingestion/route-extractors/spring.js +136 -0
- package/dist/core/ingestion/scope-extractor.js +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +12 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +145 -24
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +7 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +22 -0
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +41 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +275 -0
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/emit.d.ts +124 -0
- package/dist/core/ingestion/taint/emit.js +204 -0
- package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
- package/dist/core/ingestion/taint/interproc-emit.js +88 -0
- package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
- package/dist/core/ingestion/taint/interproc-solver.js +312 -0
- package/dist/core/ingestion/taint/match.d.ts +153 -0
- package/dist/core/ingestion/taint/match.js +278 -0
- package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
- package/dist/core/ingestion/taint/path-codec.js +190 -0
- package/dist/core/ingestion/taint/propagate.d.ts +216 -0
- package/dist/core/ingestion/taint/propagate.js +659 -0
- package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
- package/dist/core/ingestion/taint/site-safety.js +98 -0
- package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
- package/dist/core/ingestion/taint/source-sink-config.js +35 -12
- package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
- package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
- package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +56 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +118 -0
- package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
- package/dist/core/ingestion/taint/summary-harvest.js +537 -0
- package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
- package/dist/core/ingestion/taint/summary-model.js +86 -0
- package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
- package/dist/core/ingestion/taint/typescript-model.js +102 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/clone-safety.d.ts +109 -0
- package/dist/core/ingestion/workers/clone-safety.js +465 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
- package/dist/core/ingestion/workers/parse-worker.js +91 -53
- package/dist/core/ingestion/workers/post-result.d.ts +22 -0
- package/dist/core/ingestion/workers/post-result.js +87 -0
- package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
- package/dist/core/ingestion/workers/result-merge.js +43 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
- package/dist/core/ingestion/workers/worker-pool.js +43 -16
- package/dist/core/lbug/csv-generator.d.ts +19 -2
- package/dist/core/lbug/csv-generator.js +316 -254
- package/dist/core/lbug/lbug-adapter.d.ts +18 -17
- package/dist/core/lbug/lbug-adapter.js +101 -25
- package/dist/core/lbug/pool-adapter.d.ts +35 -0
- package/dist/core/lbug/pool-adapter.js +90 -1
- package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
- package/dist/core/lbug/rel-pair-routing.js +140 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +97 -0
- package/dist/core/run-analyze.js +316 -26
- package/dist/core/tree-sitter/parser-loader.js +5 -4
- package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
- package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
- package/dist/core/tree-sitter/vendored-grammars.js +57 -0
- package/dist/mcp/core/embedder.js +4 -0
- package/dist/mcp/http-transport.d.ts +134 -0
- package/dist/mcp/http-transport.js +503 -0
- package/dist/mcp/local/local-backend.d.ts +130 -26
- package/dist/mcp/local/local-backend.js +1191 -33
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +224 -5
- package/dist/server/analyze-launch.d.ts +29 -0
- package/dist/server/analyze-launch.js +137 -0
- package/dist/server/analyze-upload.d.ts +33 -0
- package/dist/server/analyze-upload.js +123 -0
- package/dist/server/analyze-worker-ipc.d.ts +58 -0
- package/dist/server/analyze-worker-ipc.js +16 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/analyze-worker.js +7 -1
- package/dist/server/api.js +71 -163
- package/dist/server/git-clone.d.ts +1 -0
- package/dist/server/git-clone.js +1 -1
- package/dist/server/mcp-http.d.ts +5 -6
- package/dist/server/mcp-http.js +9 -82
- package/dist/server/middleware.d.ts +40 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/private-ip.d.ts +1 -0
- package/dist/server/private-ip.js +15 -0
- package/dist/server/upload-ingest.d.ts +56 -0
- package/dist/server/upload-ingest.js +276 -0
- package/dist/server/upload-paths.d.ts +31 -0
- package/dist/server/upload-paths.js +51 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/branch-index.d.ts +52 -0
- package/dist/storage/branch-index.js +65 -0
- package/dist/storage/git.d.ts +11 -0
- package/dist/storage/git.js +33 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +32 -10
- package/dist/storage/repo-manager.d.ts +153 -10
- package/dist/storage/repo-manager.js +162 -21
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
- package/hooks/claude/gitnexus-hook.cjs +110 -13
- package/hooks/claude/hook-db-lock-probe.cjs +496 -26
- package/package.json +4 -2
- package/scripts/assert-publish-grammar-coverage.cjs +31 -0
- package/scripts/build-tree-sitter-grammars.cjs +16 -10
- package/scripts/cross-platform-tests.ts +1 -0
- package/skills/gitnexus-debugging.md +16 -4
- package/skills/gitnexus-exploring.md +3 -3
- package/skills/gitnexus-guide.md +33 -0
- package/skills/gitnexus-pdg-query.md +89 -0
- package/skills/gitnexus-refactoring.md +1 -1
- package/skills/gitnexus-taint-analysis.md +178 -0
- package/vendor/tree-sitter-c/package.json +1 -1
- package/vendor/tree-sitter-dart/package.json +1 -1
- package/vendor/tree-sitter-kotlin/package.json +1 -1
- package/vendor/tree-sitter-proto/package.json +1 -1
- package/vendor/tree-sitter-swift/package.json +1 -1
- package/web/assets/{agent-CKPMqImC.js → agent-lSrfPH05.js} +91 -91
- package/web/assets/{architectureDiagram-UL44E2DR-D1EXI0zA.js → architectureDiagram-UL44E2DR-CgHRMZJ8.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-03IqIAdZ.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DLFjj1rt.js} +1 -1
- package/web/assets/{classDiagram-KGZ6W3CR-Bv93af_b.js → classDiagram-KGZ6W3CR-BTr7xsR8.js} +1 -1
- package/web/assets/{classDiagram-v2-72OJOZXJ-CLfEqHUa.js → classDiagram-v2-72OJOZXJ-CakV709X.js} +1 -1
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-C6wAZwss.js} +10 -2
- package/web/assets/{diagram-3NCE3AQN-BqAtKUpW.js → diagram-3NCE3AQN-BW6iSZhw.js} +1 -1
- package/web/assets/{diagram-GF46GFSD-CaBG6n6o.js → diagram-GF46GFSD-5IsY7kfK.js} +1 -1
- package/web/assets/{diagram-QXG6HAR7-CZ-O3rcV.js → diagram-QXG6HAR7-Cia81gsm.js} +1 -1
- package/web/assets/{diagram-WEQXMOUZ-P4lSL4GH.js → diagram-WEQXMOUZ-CLfT1sdo.js} +1 -1
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-DqEAcwC_.js} +1 -1
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-BUEpeW9m.js} +1 -1
- package/web/assets/index-64YMDMOE.js +626 -0
- package/web/assets/index-DeuHlyzm.css +2 -0
- package/web/assets/{infoDiagram-3YFTVSEB-DmLICZx1.js → infoDiagram-3YFTVSEB-hHbd_QCD.js} +1 -1
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-XxO6eDu4.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-DeSVq5eO.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-CgEl9e61.js} +1 -1
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-E3RA4hXq.js} +1 -1
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-B70bTqxy.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-CLt7nidU.js} +1 -1
- package/web/assets/{stateDiagram-7D4R322I-CB2nABwH.js → stateDiagram-7D4R322I-DfdeOa9A.js} +1 -1
- package/web/assets/{stateDiagram-v2-36443NZ5-COBGd2RL.js → stateDiagram-v2-36443NZ5-C-c52-8M.js} +1 -1
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-8DBKNdJr.js} +1 -1
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-DhqnfFx6.js} +1 -1
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-DcliVPWw.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-CYmW296g.js} +1 -1
- package/web/index.html +2 -2
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ That's it. This indexes the codebase, installs agent skills, registers Claude Co
|
|
|
34
34
|
|
|
35
35
|
To configure MCP for your editor, run `npx gitnexus setup` once — or set it up manually below.
|
|
36
36
|
|
|
37
|
-
`gitnexus setup` auto-detects your editors and writes the correct global MCP config. You only need to run it once.
|
|
37
|
+
`gitnexus setup` auto-detects your editors and writes the correct global MCP config. You only need to run it once. To configure only selected integrations, pass `--coding-agent`/`-c` with a comma-separated list or repeat the option, for example `gitnexus setup -c cursor,codex`.
|
|
38
38
|
|
|
39
39
|
### Editor Support
|
|
40
40
|
|
|
@@ -134,7 +134,7 @@ Your AI agent gets these tools automatically:
|
|
|
134
134
|
| `rename` | Multi-file coordinated rename with graph + text search | Optional |
|
|
135
135
|
| `cypher` | Raw Cypher graph queries | Optional |
|
|
136
136
|
|
|
137
|
-
> With one indexed repo, the `repo` param is optional. With multiple, specify which: `query({
|
|
137
|
+
> With one indexed repo, the `repo` param is optional. With multiple, specify which: `query({search_query: "auth", repo: "my-app"})`.
|
|
138
138
|
|
|
139
139
|
## MCP Resources
|
|
140
140
|
|
|
@@ -158,7 +158,7 @@ Your AI agent gets these tools automatically:
|
|
|
158
158
|
## CLI Commands
|
|
159
159
|
|
|
160
160
|
```bash
|
|
161
|
-
gitnexus setup # Configure MCP for
|
|
161
|
+
gitnexus setup # Configure MCP for detected editors (one-time; use -c to select)
|
|
162
162
|
gitnexus uninstall # Preview removal of GitNexus MCP/skills/hooks (add --force to apply)
|
|
163
163
|
gitnexus analyze [path] # Index a repository (or update stale index)
|
|
164
164
|
gitnexus analyze --repair-fts # Fast path: rebuild/verify only FTS indexes on existing index data
|
|
@@ -79,7 +79,21 @@ export type RelationshipType = 'CONTAINS' | 'CALLS' | 'INHERITS' | 'METHOD_OVERR
|
|
|
79
79
|
| 'SANITIZES'
|
|
80
80
|
/** Materialized source→sink taint path. Working name — final name/representation
|
|
81
81
|
* is confirmed when M3/M4 emits it; no persisted edge exists before then. */
|
|
82
|
-
| 'TAINT_PATH'
|
|
82
|
+
| 'TAINT_PATH'
|
|
83
|
+
/** Control-dependence edge (PDG, issue #2085 M5): block `dependent` (target)
|
|
84
|
+
* executes only because the branch at block `controller` (source) took a
|
|
85
|
+
* given side. The branch sense (`'T'` | `'F'`) rides the relation's existing
|
|
86
|
+
* `reason` column — mirroring how `CFG` stores its edge kind there — since
|
|
87
|
+
* the single `CodeRelation` table has no dedicated label column. */
|
|
88
|
+
| 'CDG'
|
|
89
|
+
/** Debug-only post-dominator-tree edge (#2085 M5): a block → its immediate
|
|
90
|
+
* post-dominator, emitted behind the `GITNEXUS_PDG_EMIT_POST_DOMINATE` env
|
|
91
|
+
* flag for inspection. Never emitted in a normal `--pdg` run. Note: as a
|
|
92
|
+
* member of this exported union it is a forward-compatibility commitment —
|
|
93
|
+
* removing it later is a breaking schema change — and it is deliberately
|
|
94
|
+
* excluded from `VALID_RELATION_TYPES` so it never enters impact-style
|
|
95
|
+
* symbol-space traversal (same posture as the taint substrate edges). */
|
|
96
|
+
| 'POST_DOMINATE';
|
|
83
97
|
export interface GraphNode {
|
|
84
98
|
id: string;
|
|
85
99
|
label: NodeLabel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
export declare const NODE_TABLES: readonly ["File", "Folder", "Function", "Class", "Interface", "Method", "CodeElement", "Community", "Process", "Section", "Struct", "Enum", "Macro", "Typedef", "Union", "Namespace", "Trait", "Impl", "TypeAlias", "Const", "Static", "Variable", "Property", "Record", "Delegate", "Annotation", "Constructor", "Template", "Module", "Route", "Tool", "BasicBlock"];
|
|
11
11
|
export type NodeTableName = (typeof NODE_TABLES)[number];
|
|
12
12
|
export declare const REL_TABLE_NAME = "CodeRelation";
|
|
13
|
-
export declare const REL_TYPES: readonly ["CONTAINS", "DEFINES", "IMPORTS", "CALLS", "EXTENDS", "IMPLEMENTS", "HAS_METHOD", "HAS_PROPERTY", "ACCESSES", "METHOD_OVERRIDES", "OVERRIDES", "METHOD_IMPLEMENTS", "MEMBER_OF", "STEP_IN_PROCESS", "HANDLES_ROUTE", "FETCHES", "HANDLES_TOOL", "ENTRY_POINT_OF", "WRAPS", "QUERIES", "CFG", "REACHING_DEF", "TAINTED", "SANITIZES", "TAINT_PATH"];
|
|
13
|
+
export declare const REL_TYPES: readonly ["CONTAINS", "DEFINES", "IMPORTS", "CALLS", "EXTENDS", "IMPLEMENTS", "HAS_METHOD", "HAS_PROPERTY", "ACCESSES", "METHOD_OVERRIDES", "OVERRIDES", "METHOD_IMPLEMENTS", "MEMBER_OF", "STEP_IN_PROCESS", "HANDLES_ROUTE", "FETCHES", "HANDLES_TOOL", "ENTRY_POINT_OF", "WRAPS", "QUERIES", "CFG", "REACHING_DEF", "TAINTED", "SANITIZES", "TAINT_PATH", "CDG", "POST_DOMINATE"];
|
|
14
14
|
export type RelType = (typeof REL_TYPES)[number];
|
|
15
15
|
export declare const EMBEDDING_TABLE_NAME = "CodeEmbedding";
|
|
16
16
|
//# sourceMappingURL=schema-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-constants.d.ts","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,WAAW,wWAkCd,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"schema-constants.d.ts","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,WAAW,wWAkCd,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,eAAO,MAAM,SAAS,sXAmCZ,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,eAAO,MAAM,oBAAoB,kBAAkB,CAAC"}
|
|
@@ -72,6 +72,12 @@ export const REL_TYPES = [
|
|
|
72
72
|
'TAINTED',
|
|
73
73
|
'SANITIZES',
|
|
74
74
|
'TAINT_PATH',
|
|
75
|
+
// Control dependence (PDG, issue #2085 M5) — CDG carries its 'T'|'F' branch
|
|
76
|
+
// label in the relation's `reason` column; POST_DOMINATE is debug-only
|
|
77
|
+
// (behind GITNEXUS_PDG_EMIT_POST_DOMINATE). Both are BasicBlock→BasicBlock,
|
|
78
|
+
// reusing the existing FROM BasicBlock TO BasicBlock pair in RELATION_SCHEMA.
|
|
79
|
+
'CDG',
|
|
80
|
+
'POST_DOMINATE',
|
|
75
81
|
];
|
|
76
82
|
export const EMBEDDING_TABLE_NAME = 'CodeEmbedding';
|
|
77
83
|
//# sourceMappingURL=schema-constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-constants.js","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,QAAQ;IACR,aAAa;IACb,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,UAAU;IACV,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,aAAa;IACb,UAAU;IACV,QAAQ;IACR,OAAO;IACP,MAAM;IACN,2EAA2E;IAC3E,YAAY;CACJ,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,WAAW,EAAE,mEAAmE;IAChF,mBAAmB;IACnB,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,KAAK;IACL,cAAc;IACd,SAAS;IACT,WAAW;IACX,YAAY;
|
|
1
|
+
{"version":3,"file":"schema-constants.js","sourceRoot":"","sources":["../../src/lbug/schema-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,QAAQ;IACR,aAAa;IACb,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,UAAU;IACV,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,aAAa;IACb,UAAU;IACV,QAAQ;IACR,OAAO;IACP,MAAM;IACN,2EAA2E;IAC3E,YAAY;CACJ,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IACV,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,WAAW,EAAE,mEAAmE;IAChF,mBAAmB;IACnB,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,yEAAyE;IACzE,yEAAyE;IACzE,6EAA6E;IAC7E,KAAK;IACL,cAAc;IACd,SAAS;IACT,WAAW;IACX,YAAY;IACZ,4EAA4E;IAC5E,uEAAuE;IACvE,4EAA4E;IAC5E,8EAA8E;IAC9E,KAAK;IACL,eAAe;CACP,CAAC;AAIX,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC"}
|
|
@@ -96,5 +96,26 @@ export interface ParsedFile {
|
|
|
96
96
|
* side effects — the contract default) leave this undefined.
|
|
97
97
|
*/
|
|
98
98
|
readonly captureSideChannel?: unknown;
|
|
99
|
+
/**
|
|
100
|
+
* Per-function control-flow graphs for this file (#2081 M1, PDG/taint
|
|
101
|
+
* substrate). A DISTINCT field from {@link captureSideChannel} — different
|
|
102
|
+
* producer, consumer, and lifecycle: the worker builds it from the
|
|
103
|
+
* tree-sitter AST via `LanguageProvider.cfgVisitor` (only on a `--pdg` run),
|
|
104
|
+
* and scope-resolution emits BasicBlock nodes + CFG edges from it while the
|
|
105
|
+
* disk-backed ParsedFile store is still live (it is NOT a capture-time
|
|
106
|
+
* marker the resolver restores into module maps). Kept separate so a future
|
|
107
|
+
* change to either channel's shape invalidates independently.
|
|
108
|
+
*
|
|
109
|
+
* Shared / ingestion code treats this as opaque (`unknown`) per AGENTS.md.
|
|
110
|
+
* Concretely it is a `readonly FunctionCfg[]` (see
|
|
111
|
+
* `core/ingestion/cfg/types.ts`) — plain JSON-serializable data (no AST
|
|
112
|
+
* refs, no class instances) so it round-trips through the parse cache and
|
|
113
|
+
* the `parsedfile-store` (whose interning reviver keys on `nodeId`, which
|
|
114
|
+
* these blocks/edges deliberately lack).
|
|
115
|
+
*
|
|
116
|
+
* Optional: `undefined` on non-`--pdg` runs and for languages with no
|
|
117
|
+
* `cfgVisitor` — the default for every run today.
|
|
118
|
+
*/
|
|
119
|
+
readonly cfgSideChannel?: unknown;
|
|
99
120
|
}
|
|
100
121
|
//# sourceMappingURL=parsed-file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsed-file.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/parsed-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"parsed-file.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/parsed-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAEtC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC"}
|
|
@@ -54,6 +54,10 @@ export interface SymbolDefinition {
|
|
|
54
54
|
* Currently used by C++ overload ranking to exclude explicit constructors
|
|
55
55
|
* from implicit user-defined conversion candidates. */
|
|
56
56
|
isExplicit?: boolean;
|
|
57
|
+
/** True when the callable is declared unavailable (for example C++ `= delete`).
|
|
58
|
+
* Unavailable callables still participate in overload selection, but a
|
|
59
|
+
* selected unavailable target must suppress edge emission. */
|
|
60
|
+
isDeleted?: boolean;
|
|
57
61
|
/** Links Method/Constructor/Property to owning Class/Struct/Trait nodeId */
|
|
58
62
|
ownerId?: string;
|
|
59
63
|
/** #1982/#1993: bridge-held enclosing-namespace path (e.g. `NS1`, `Outer.Inner`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-definition.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/symbol-definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACjE,4CAA4C;IAC5C,WAAW,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3E,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB;;+FAE2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;iHAC6G;IAC7G,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;uFACmF;IACnF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;4FACwF;IACxF,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5C,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;yEAKqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;4DAEwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;iEAO6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"symbol-definition.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/symbol-definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACjE,4CAA4C;IAC5C,WAAW,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3E,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB;;+FAE2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;iHAC6G;IAC7G,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;uFACmF;IACnF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;4FACwF;IACxF,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5C,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;yEAKqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;4DAEwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;mEAE+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;iEAO6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
package/dist/cli/ai-context.d.ts
CHANGED
|
@@ -24,6 +24,12 @@ export interface AIContextOptions {
|
|
|
24
24
|
* plain caller that omits it gets "main", preserving prior behavior.
|
|
25
25
|
*/
|
|
26
26
|
defaultBranch?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the index was built with `--pdg` (#2086 M6). Gates the `pdg_query`
|
|
29
|
+
* line in the generated block — without the PDG layer the tool only returns a
|
|
30
|
+
* "no PDG layer" note, so advertising it on a non-`--pdg` index is noise.
|
|
31
|
+
*/
|
|
32
|
+
hasPdg?: boolean;
|
|
27
33
|
}
|
|
28
34
|
/**
|
|
29
35
|
* Strip backticks from a branch name before it is embedded in a Markdown
|
|
@@ -32,7 +38,31 @@ export interface AIContextOptions {
|
|
|
32
38
|
* the generation sink so the embedding is provably safe regardless of caller.
|
|
33
39
|
*/
|
|
34
40
|
export declare function markdownSafeBranch(branch: string): string;
|
|
35
|
-
|
|
41
|
+
/** Options for {@link generateGitNexusContent} (collapsed from positional
|
|
42
|
+
* params, #2188 review — six `undefined`s to reach `hasPdg` was the smell). */
|
|
43
|
+
export interface GitNexusContentOptions {
|
|
44
|
+
generatedSkills?: GeneratedSkillInfo[];
|
|
45
|
+
groupNames?: string[];
|
|
46
|
+
noStats?: boolean;
|
|
47
|
+
skipSkills?: boolean;
|
|
48
|
+
/** Project-relative path to the runner `gitnexus analyze` drops next to the
|
|
49
|
+
* index (#1945). Referenced by docs so a single CLI-neutral command resolves
|
|
50
|
+
* the available runner (global `gitnexus` → `pnpm dlx` → `npx`) at call time. */
|
|
51
|
+
runnerPath?: string;
|
|
52
|
+
/** Default branch for the regression-compare example (#243). Configurable so
|
|
53
|
+
* projects on `develop`/`master`/etc. don't get `base_ref: "main"` rewritten
|
|
54
|
+
* back over their fix on every analyze. The value is embedded inside a
|
|
55
|
+
* Markdown inline-code span: validateBranchName rejects backticks upstream,
|
|
56
|
+
* and `markdownSafeBranch` strips any remaining backtick here as defense in
|
|
57
|
+
* depth, so JSON.stringify's quote/escape handling is sufficient and the
|
|
58
|
+
* branch cannot break out of the span (#1996 tri-review P1). */
|
|
59
|
+
defaultBranch?: string;
|
|
60
|
+
/** Whether the index was built with `--pdg` (#2086 M6). Gates the pdg_query
|
|
61
|
+
* line below — false (default) omits it, so a non-pdg index doesn't advertise
|
|
62
|
+
* a tool that only returns a "no PDG layer" note. */
|
|
63
|
+
hasPdg?: boolean;
|
|
64
|
+
}
|
|
65
|
+
export declare function generateGitNexusContent(projectName: string, stats: RepoStats, opts?: GitNexusContentOptions): string;
|
|
36
66
|
/**
|
|
37
67
|
* Generate AI context files after indexing
|
|
38
68
|
*/
|
package/dist/cli/ai-context.js
CHANGED
|
@@ -77,19 +77,8 @@ async function findGroupsContainingRegistryName(registryName) {
|
|
|
77
77
|
export function markdownSafeBranch(branch) {
|
|
78
78
|
return branch.replace(/`/g, '');
|
|
79
79
|
}
|
|
80
|
-
export function generateGitNexusContent(projectName, stats,
|
|
81
|
-
|
|
82
|
-
// index (#1945). Referenced by docs so a single CLI-neutral command resolves
|
|
83
|
-
// the available runner (global `gitnexus` → `pnpm dlx` → `npx`) at call time.
|
|
84
|
-
runnerPath = '.gitnexus/run.cjs',
|
|
85
|
-
// Default branch for the regression-compare example (#243). Configurable so
|
|
86
|
-
// projects on `develop`/`master`/etc. don't get `base_ref: "main"` rewritten
|
|
87
|
-
// back over their fix on every analyze. The value is embedded inside a
|
|
88
|
-
// Markdown inline-code span: validateBranchName rejects backticks upstream,
|
|
89
|
-
// and `markdownSafeBranch` strips any remaining backtick here as defense in
|
|
90
|
-
// depth, so JSON.stringify's quote/escape handling is sufficient and the
|
|
91
|
-
// branch cannot break out of the span (#1996 tri-review P1).
|
|
92
|
-
defaultBranch = 'main') {
|
|
80
|
+
export function generateGitNexusContent(projectName, stats, opts = {}) {
|
|
81
|
+
const { generatedSkills, groupNames, noStats, skipSkills, runnerPath = '.gitnexus/run.cjs', defaultBranch = 'main', hasPdg = false, } = opts;
|
|
93
82
|
const generatedRows = generatedSkills && generatedSkills.length > 0
|
|
94
83
|
? generatedSkills
|
|
95
84
|
.map((s) => `| Work in the ${s.label} area (${s.symbolCount} symbols) | \`.claude/skills/generated/${s.name}/SKILL.md\` |`)
|
|
@@ -134,8 +123,11 @@ This project is indexed by GitNexus as **${projectName}**${noStats ? '' : ` (${s
|
|
|
134
123
|
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run \`impact({target: "symbolName", direction: "upstream"})\` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
|
135
124
|
- **MUST run \`detect_changes()\` before committing** to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch: \`detect_changes({scope: "compare", base_ref: ${JSON.stringify(markdownSafeBranch(defaultBranch))}})\`.
|
|
136
125
|
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
|
137
|
-
- When exploring unfamiliar code, use \`query({
|
|
126
|
+
- When exploring unfamiliar code, use \`query({search_query: "concept"})\` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
|
138
127
|
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use \`context({name: "symbolName"})\`.
|
|
128
|
+
- For security review, \`explain({target: "fileOrSymbol"})\` lists taint findings (source→sink flows; needs \`analyze --pdg\`).${hasPdg
|
|
129
|
+
? `\n- For control/data dependence, \`pdg_query({mode: "controls", target: "fileOrSymbol"})\` answers "under what condition does X run?" (CDG, incl. guard clauses) and \`pdg_query({mode: "flows", target, variable})\` traces "where does variable Y flow?" (REACHING_DEF). \`--pdg\` layer.`
|
|
130
|
+
: ''}
|
|
139
131
|
|
|
140
132
|
## Never Do
|
|
141
133
|
|
|
@@ -348,7 +340,15 @@ export async function generateAIContextFiles(repoPath, storagePath, projectName,
|
|
|
348
340
|
catch (err) {
|
|
349
341
|
logger.warn(`Could not write GitNexus runner to ${runnerPath}: ${String(err)}`);
|
|
350
342
|
}
|
|
351
|
-
const content = generateGitNexusContent(projectName, stats,
|
|
343
|
+
const content = generateGitNexusContent(projectName, stats, {
|
|
344
|
+
generatedSkills,
|
|
345
|
+
groupNames,
|
|
346
|
+
noStats: options?.noStats,
|
|
347
|
+
skipSkills: options?.skipSkills,
|
|
348
|
+
runnerPath,
|
|
349
|
+
defaultBranch: options?.defaultBranch ?? 'main',
|
|
350
|
+
hasPdg: options?.hasPdg ?? false,
|
|
351
|
+
});
|
|
352
352
|
const createdFiles = [];
|
|
353
353
|
if (!options?.skipAgentsMd) {
|
|
354
354
|
// Create AGENTS.md (standard for Cursor, Windsurf, OpenCode, Cline, etc.)
|
|
@@ -63,6 +63,7 @@ const KEY_SPECS = {
|
|
|
63
63
|
skipContextFiles: { target: 'skipAgentsMd', kind: 'boolean' },
|
|
64
64
|
skipAiContext: { target: 'skipAgentsMd', kind: 'boolean' },
|
|
65
65
|
skipSkills: { target: 'skipSkills', kind: 'boolean' },
|
|
66
|
+
pdg: { target: 'pdg', kind: 'boolean' },
|
|
66
67
|
indexOnly: { target: 'indexOnly', kind: 'boolean' },
|
|
67
68
|
stats: { target: 'stats', kind: 'boolean' },
|
|
68
69
|
noStats: { target: 'stats', kind: 'boolean-negate' },
|
|
@@ -78,6 +79,22 @@ const KEY_SPECS = {
|
|
|
78
79
|
embeddingBatchSize: { target: 'embeddingBatchSize', kind: 'numeric-string' },
|
|
79
80
|
embeddingSubBatchSize: { target: 'embeddingSubBatchSize', kind: 'numeric-string' },
|
|
80
81
|
embeddingDevice: { target: 'embeddingDevice', kind: 'string' },
|
|
82
|
+
// #1589/#1852 residual — extra fetch-wrapper function names to treat as HTTP
|
|
83
|
+
// consumers. The auto-detector only flags functions that call the bare global
|
|
84
|
+
// `fetch()`; a wrapper built on axios / a custom client, or named outside the
|
|
85
|
+
// built-in convention set, is otherwise invisible to route_map consumers.
|
|
86
|
+
// Listing it here adds it to the cross-file consumer scan.
|
|
87
|
+
fetchWrappers: { target: 'fetchWrappers', kind: 'string-array' },
|
|
88
|
+
// Auth token AND dims are intentionally CLI/env-only — no embeddingAuthToken
|
|
89
|
+
// or embeddingDims key here:
|
|
90
|
+
// - the token keeps secrets out of a committed .gitnexusrc;
|
|
91
|
+
// - dims cannot take effect from .gitnexusrc anyway — schema.ts reads
|
|
92
|
+
// GITNEXUS_EMBEDDING_DIMS at module-load (before .gitnexusrc is loaded in
|
|
93
|
+
// analyzeCommandImpl), so a config value would size nothing and silently
|
|
94
|
+
// mismatch the vector column. Use --embedding-dims or GITNEXUS_EMBEDDING_DIMS.
|
|
95
|
+
// (URL/MODEL are safe as config keys: they are read lazily at runtime, not at module-load.)
|
|
96
|
+
embeddingBaseUrl: { target: 'embeddingBaseUrl', kind: 'string' },
|
|
97
|
+
embeddingModel: { target: 'embeddingModel', kind: 'string' },
|
|
81
98
|
};
|
|
82
99
|
/** Top-level container key for the nested form; not itself an `AnalyzeOptions` field. */
|
|
83
100
|
const NESTED_KEY = 'analyze';
|
|
@@ -195,6 +212,39 @@ const normalizeValue = (kind, value, key) => {
|
|
|
195
212
|
}
|
|
196
213
|
return trimmed;
|
|
197
214
|
}
|
|
215
|
+
case 'string-array': {
|
|
216
|
+
// Generic shared validator — `source` already names the config key, so
|
|
217
|
+
// messages here stay key-agnostic (no fetch-wrapper coupling in the
|
|
218
|
+
// shared normalizer; #1589/#1852 review F7).
|
|
219
|
+
if (!Array.isArray(value)) {
|
|
220
|
+
throw new GitNexusRcError(`${source} must be an array of strings.`);
|
|
221
|
+
}
|
|
222
|
+
const names = [];
|
|
223
|
+
for (const item of value) {
|
|
224
|
+
if (typeof item !== 'string') {
|
|
225
|
+
throw new GitNexusRcError(`${source} entries must all be strings.`);
|
|
226
|
+
}
|
|
227
|
+
const trimmed = item.trim();
|
|
228
|
+
if (!trimmed) {
|
|
229
|
+
throw new GitNexusRcError(`${source} entries must not be empty.`);
|
|
230
|
+
}
|
|
231
|
+
assertNoHiddenChars(trimmed, source);
|
|
232
|
+
// Values may be interpolated into a RegExp downstream. Restrict to
|
|
233
|
+
// identifier / member-access shapes so a config value can never smuggle
|
|
234
|
+
// regex metacharacters into a consumer.
|
|
235
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$.]*$/.test(trimmed)) {
|
|
236
|
+
throw new GitNexusRcError(`${source} entry "${trimmed}" must be an identifier or member name ` +
|
|
237
|
+
`(letters, digits, _, $, . — e.g. "client.get").`);
|
|
238
|
+
}
|
|
239
|
+
names.push(trimmed);
|
|
240
|
+
}
|
|
241
|
+
if (names.length === 0) {
|
|
242
|
+
throw new GitNexusRcError(`${source} must list at least one string.`);
|
|
243
|
+
}
|
|
244
|
+
// De-duplicate and cap to a sane bound so a pathological config cannot
|
|
245
|
+
// blow up the consumer scan's alternation.
|
|
246
|
+
return Array.from(new Set(names)).slice(0, 100);
|
|
247
|
+
}
|
|
198
248
|
case 'numeric-string': {
|
|
199
249
|
// Mirror Commander's contract: these options reach the existing CLI
|
|
200
250
|
// validation as strings. Accept a JSON number or a string; normalize to a
|
package/dist/cli/analyze.d.ts
CHANGED
|
@@ -37,6 +37,12 @@ export interface AnalyzeOptions {
|
|
|
37
37
|
verbose?: boolean;
|
|
38
38
|
/** Skip AGENTS.md and CLAUDE.md gitnexus block updates. */
|
|
39
39
|
skipAgentsMd?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Build the control-flow-graph / PDG substrate (#2081 M1). Opt-in; off by
|
|
42
|
+
* default. Threaded to both the worker (CFG build) and scope-resolution
|
|
43
|
+
* (BasicBlock/CFG emit).
|
|
44
|
+
*/
|
|
45
|
+
pdg?: boolean;
|
|
40
46
|
/**
|
|
41
47
|
* Stats inclusion in AGENTS.md and CLAUDE.md.
|
|
42
48
|
*
|
|
@@ -58,6 +64,14 @@ export interface AnalyzeOptions {
|
|
|
58
64
|
* before being threaded into the generated AGENTS.md / CLAUDE.md content.
|
|
59
65
|
*/
|
|
60
66
|
defaultBranch?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Index-branch selector (#2106). From `--branch`. Distinct from
|
|
69
|
+
* `defaultBranch` (cosmetic base_ref): this routes the index to a per-branch
|
|
70
|
+
* slot. NOT sourced from `.gitnexusrc` — the `.gitnexusrc` `branch` key is an
|
|
71
|
+
* alias for `defaultBranch` and must not change index placement. Defaults to
|
|
72
|
+
* the checked-out branch inside `runFullAnalysis` when omitted.
|
|
73
|
+
*/
|
|
74
|
+
branch?: string;
|
|
61
75
|
/** Pure index mode: skip all file injection (AGENTS.md, CLAUDE.md, skills). */
|
|
62
76
|
indexOnly?: boolean;
|
|
63
77
|
/** Index the folder even when no .git directory is present. */
|
|
@@ -93,6 +107,22 @@ export interface AnalyzeOptions {
|
|
|
93
107
|
embeddingBatchSize?: string;
|
|
94
108
|
embeddingSubBatchSize?: string;
|
|
95
109
|
embeddingDevice?: string;
|
|
110
|
+
/**
|
|
111
|
+
* Extra fetch-wrapper function names to treat as HTTP consumers (#1589/#1852
|
|
112
|
+
* residual). Supplied via `.gitnexusrc` `fetchWrappers: [...]`. Threaded into
|
|
113
|
+
* the routes phase, where the cross-file consumer scan unions them with the
|
|
114
|
+
* auto-detected `fetch()` wrappers so a custom/axios-based wrapper named
|
|
115
|
+
* outside the built-in convention still produces `route_map` consumers.
|
|
116
|
+
*/
|
|
117
|
+
fetchWrappers?: string[];
|
|
118
|
+
/** OpenAI-compatible embeddings base URL (incl. /v1). Overrides GITNEXUS_EMBEDDING_URL. */
|
|
119
|
+
embeddingBaseUrl?: string;
|
|
120
|
+
/** Embedding model name. Overrides GITNEXUS_EMBEDDING_MODEL. */
|
|
121
|
+
embeddingModel?: string;
|
|
122
|
+
/** Bearer token for the embeddings endpoint. Overrides GITNEXUS_EMBEDDING_API_KEY. Never logged. */
|
|
123
|
+
embeddingAuthToken?: string;
|
|
124
|
+
/** Embedding vector dimensions (positive integer string). Overrides GITNEXUS_EMBEDDING_DIMS. */
|
|
125
|
+
embeddingDims?: string;
|
|
96
126
|
}
|
|
97
127
|
/**
|
|
98
128
|
* Whether the post-index skill step should run.
|
package/dist/cli/analyze.js
CHANGED
|
@@ -23,8 +23,10 @@ import { warnMissingOptionalGrammars, getOptionalGrammarExtensions } from './opt
|
|
|
23
23
|
import { glob } from 'glob';
|
|
24
24
|
import fs from 'fs/promises';
|
|
25
25
|
import { cliError } from './cli-message.js';
|
|
26
|
+
import { EMBEDDING_DIMS_ERROR, normalizeEmbeddingDims } from './embedding-dims.js';
|
|
26
27
|
import { formatElapsed } from './format-elapsed.js';
|
|
27
28
|
import { isHfDownloadFailure } from '../core/embeddings/hf-env.js';
|
|
29
|
+
import { safeUrl } from '../core/embeddings/http-client.js';
|
|
28
30
|
import { isLocalEmbeddingRuntimeBlockerMessage } from '../core/embeddings/runtime-support.js';
|
|
29
31
|
import { warnIfNpm11NpxRisk } from './resolve-invocation.js';
|
|
30
32
|
// Capture stderr.write at module load BEFORE anything (LadybugDB native
|
|
@@ -446,6 +448,10 @@ const ANALYZE_CLI_ENV_KEYS = [
|
|
|
446
448
|
'GITNEXUS_EMBEDDING_SUB_BATCH_SIZE',
|
|
447
449
|
'GITNEXUS_EMBEDDING_DEVICE',
|
|
448
450
|
'GITNEXUS_ANALYZE_PROGRESS_ACTIVE',
|
|
451
|
+
'GITNEXUS_EMBEDDING_URL',
|
|
452
|
+
'GITNEXUS_EMBEDDING_MODEL',
|
|
453
|
+
'GITNEXUS_EMBEDDING_API_KEY',
|
|
454
|
+
'GITNEXUS_EMBEDDING_DIMS',
|
|
449
455
|
];
|
|
450
456
|
const snapshotAnalyzeEnv = () => {
|
|
451
457
|
const snap = {};
|
|
@@ -551,6 +557,21 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
551
557
|
return;
|
|
552
558
|
}
|
|
553
559
|
}
|
|
560
|
+
// Validate the index-branch selector (#2106) the same way, so a malformed
|
|
561
|
+
// `--branch` exits before any expensive analysis starts. Capture the TRIMMED
|
|
562
|
+
// return so a whitespace-padded value (e.g. " feature" from shell completion)
|
|
563
|
+
// normalizes before the checked-out-branch mismatch guard and slug — otherwise
|
|
564
|
+
// it would false-reject on-branch or create a ghost index when detached.
|
|
565
|
+
if (cliOptions?.branch !== undefined) {
|
|
566
|
+
try {
|
|
567
|
+
cliOptions.branch = validateBranchName(cliOptions.branch, '--branch');
|
|
568
|
+
}
|
|
569
|
+
catch (err) {
|
|
570
|
+
cliError(` ${err instanceof Error ? err.message : String(err)}\n`);
|
|
571
|
+
process.exitCode = 1;
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
554
575
|
// ── Load .gitnexusrc and merge: CLI flags override config (#243) ───
|
|
555
576
|
// Parse/validate before the progress bar so a malformed config produces an
|
|
556
577
|
// actionable error and exits before any expensive analysis starts.
|
|
@@ -675,6 +696,95 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
675
696
|
}
|
|
676
697
|
process.env.GITNEXUS_EMBEDDING_DEVICE = options.embeddingDevice;
|
|
677
698
|
}
|
|
699
|
+
// --- Custom HTTP embedding endpoint flags (override GITNEXUS_EMBEDDING_* env vars) ---
|
|
700
|
+
const anyHttpEmbedFlag = options.embeddingBaseUrl !== undefined ||
|
|
701
|
+
options.embeddingModel !== undefined ||
|
|
702
|
+
options.embeddingAuthToken !== undefined ||
|
|
703
|
+
options.embeddingDims !== undefined;
|
|
704
|
+
if (options.embeddingBaseUrl !== undefined) {
|
|
705
|
+
const url = options.embeddingBaseUrl.trim();
|
|
706
|
+
if (url.length === 0) {
|
|
707
|
+
cliError(' --embedding-base-url must not be empty.\n');
|
|
708
|
+
process.exitCode = 1;
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
let parsed;
|
|
712
|
+
try {
|
|
713
|
+
parsed = new URL(url);
|
|
714
|
+
}
|
|
715
|
+
catch {
|
|
716
|
+
cliError(` --embedding-base-url is not a valid URL: "${url}".\n`);
|
|
717
|
+
process.exitCode = 1;
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
721
|
+
cliError(' --embedding-base-url must use http:// or https://.\n');
|
|
722
|
+
process.exitCode = 1;
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
// http-client strips trailing slashes; store as given (trimmed).
|
|
726
|
+
process.env.GITNEXUS_EMBEDDING_URL = url;
|
|
727
|
+
}
|
|
728
|
+
if (options.embeddingModel !== undefined) {
|
|
729
|
+
const model = options.embeddingModel.trim();
|
|
730
|
+
if (model.length === 0) {
|
|
731
|
+
cliError(' --embedding-model must not be empty.\n');
|
|
732
|
+
process.exitCode = 1;
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
process.env.GITNEXUS_EMBEDDING_MODEL = model;
|
|
736
|
+
}
|
|
737
|
+
if (options.embeddingAuthToken !== undefined) {
|
|
738
|
+
const token = options.embeddingAuthToken.trim();
|
|
739
|
+
if (token.length === 0) {
|
|
740
|
+
cliError(' --embedding-auth-token must not be empty.\n');
|
|
741
|
+
process.exitCode = 1;
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
// Never log the token value.
|
|
745
|
+
process.env.GITNEXUS_EMBEDDING_API_KEY = token;
|
|
746
|
+
}
|
|
747
|
+
// Validate + normalize dims through the same shared helper the preAction
|
|
748
|
+
// hook uses, so the CLI path, this direct/programmatic-call path, schema.ts
|
|
749
|
+
// (parseInt) and http-client (/^\d+$/) all agree on one canonical value.
|
|
750
|
+
if (options.embeddingDims !== undefined) {
|
|
751
|
+
const dims = normalizeEmbeddingDims(options.embeddingDims);
|
|
752
|
+
if (dims === null) {
|
|
753
|
+
cliError(` ${EMBEDDING_DIMS_ERROR}\n`);
|
|
754
|
+
process.exitCode = 1;
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
process.env.GITNEXUS_EMBEDDING_DIMS = dims;
|
|
758
|
+
}
|
|
759
|
+
// Custom-endpoint UX, emitting at most ONE message that reflects THIS run's
|
|
760
|
+
// intent (not ambient env). Order matters — the first matching branch wins:
|
|
761
|
+
// 1. flags given but --embeddings absent: the endpoint won't be used, so
|
|
762
|
+
// say only that (no contradictory "Using…" line).
|
|
763
|
+
// 2. embeddings enabled + a complete endpoint (flags or env): confirm it,
|
|
764
|
+
// masking the URL via safeUrl() since a base URL may carry credentials
|
|
765
|
+
// in userinfo (http://user:pass@host) or a query token (?api_key=…)
|
|
766
|
+
// that must not land in stdout/CI logs. The auth token is never printed.
|
|
767
|
+
// 3. embeddings enabled but only one of URL/MODEL supplied via flags:
|
|
768
|
+
// http-client.isHttpMode() needs BOTH, so warn about the fallback.
|
|
769
|
+
// Gating on embeddingsEnabled also stops the old behaviour of printing
|
|
770
|
+
// "Using custom embedding endpoint" on every analyze run whenever the env
|
|
771
|
+
// vars happened to be set.
|
|
772
|
+
if (anyHttpEmbedFlag && !embeddingsEnabled) {
|
|
773
|
+
console.log(' Note: --embedding-* flags only apply when --embeddings is also passed; ' +
|
|
774
|
+
'no embeddings will be generated this run.\n');
|
|
775
|
+
}
|
|
776
|
+
else if (embeddingsEnabled &&
|
|
777
|
+
process.env.GITNEXUS_EMBEDDING_URL &&
|
|
778
|
+
process.env.GITNEXUS_EMBEDDING_MODEL) {
|
|
779
|
+
console.log(` Using custom embedding endpoint: ${safeUrl(process.env.GITNEXUS_EMBEDDING_URL)} ` +
|
|
780
|
+
`(model: ${process.env.GITNEXUS_EMBEDDING_MODEL})\n`);
|
|
781
|
+
}
|
|
782
|
+
else if (embeddingsEnabled &&
|
|
783
|
+
anyHttpEmbedFlag &&
|
|
784
|
+
(process.env.GITNEXUS_EMBEDDING_URL || process.env.GITNEXUS_EMBEDDING_MODEL)) {
|
|
785
|
+
console.log(' Note: custom HTTP embeddings require BOTH --embedding-base-url and --embedding-model ' +
|
|
786
|
+
'(or the matching env vars). Falling back to local ONNX embeddings.\n');
|
|
787
|
+
}
|
|
678
788
|
if (options.repairFts && options.force) {
|
|
679
789
|
cliError(' Cannot combine `--repair-fts` with `--force`. ' +
|
|
680
790
|
'Use `--repair-fts` for fast FTS-only repair, or `--force` for a full rebuild.\n');
|
|
@@ -826,9 +936,15 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
826
936
|
skipGit: options.skipGit,
|
|
827
937
|
skipAgentsMd,
|
|
828
938
|
skipSkills,
|
|
939
|
+
// CFG/PDG substrate opt-in (#2081 M1) — threaded to both sinks downstream.
|
|
940
|
+
pdg: options.pdg === true,
|
|
829
941
|
// Resolved default branch (CLI > .gitnexusrc > auto-detect > "main")
|
|
830
942
|
// threaded into the generated regression-compare example (#243).
|
|
831
943
|
defaultBranch: resolvedDefaultBranch,
|
|
944
|
+
// Index-branch selector (#2106). Read straight from the CLI flag (not
|
|
945
|
+
// the .gitnexusrc-merged options) so the cosmetic defaultBranch config
|
|
946
|
+
// can never change index placement. Undefined → auto-detect in pipeline.
|
|
947
|
+
branch: cliOptions?.branch,
|
|
832
948
|
// commander.js `.option('--no-stats', …)` registers the flag as
|
|
833
949
|
// `options.stats` (boolean, default true; `false` when the user
|
|
834
950
|
// passed --no-stats). Reading `options.noStats` here returns
|
|
@@ -845,6 +961,9 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
845
961
|
// GITNEXUS_WORKER_POOL_SIZE env mutation. `undefined` defers to the
|
|
846
962
|
// env / auto-formula fallback inside the pipeline.
|
|
847
963
|
workerPoolSize,
|
|
964
|
+
// Extra fetch-wrapper names from `.gitnexusrc` (#1589/#1852 residual);
|
|
965
|
+
// forwarded to the routes phase consumer scan.
|
|
966
|
+
fetchWrappers: options.fetchWrappers,
|
|
848
967
|
}, {
|
|
849
968
|
onProgress: (_phase, percent, message) => {
|
|
850
969
|
updateBar(percent, message);
|
|
@@ -863,13 +982,19 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
863
982
|
// preserving the rest of the block (incl. --skills community rows). No-op
|
|
864
983
|
// when the value already matches, so a routine up-to-date run is silent
|
|
865
984
|
// (#1996 tri-review P2).
|
|
985
|
+
// Only refresh the repo-root AGENTS.md/CLAUDE.md base_ref for the
|
|
986
|
+
// PRIMARY/flat index (#2106 R2). A non-primary branch's up-to-date
|
|
987
|
+
// analyze must not churn the committed AGENTS.md — this mirrors the
|
|
988
|
+
// in-pipeline `if (!placement.branch)` gate around generateAIContextFiles.
|
|
866
989
|
let baseRefRefreshed = [];
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
990
|
+
if (result.isPrimaryBranch !== false) {
|
|
991
|
+
try {
|
|
992
|
+
const { refreshBaseRefLine } = await import('./ai-context.js');
|
|
993
|
+
baseRefRefreshed = (await refreshBaseRefLine(repoPath, resolvedDefaultBranch, { skipAgentsMd })).files;
|
|
994
|
+
}
|
|
995
|
+
catch {
|
|
996
|
+
/* best-effort — never fail the fast path over a context refresh */
|
|
997
|
+
}
|
|
873
998
|
}
|
|
874
999
|
clearInterval(elapsedTimer);
|
|
875
1000
|
process.removeListener('SIGINT', sigintHandler);
|
|
@@ -948,6 +1073,7 @@ const analyzeCommandImpl = async (inputPath, cliOptions) => {
|
|
|
948
1073
|
// Mirror runFullAnalysis `noStats` bridge (#1477) — same expression;
|
|
949
1074
|
// exercised on the `--skills` path by analyze-no-stats-bridge.test.ts.
|
|
950
1075
|
noStats: options.stats === false,
|
|
1076
|
+
hasPdg: options.pdg === true,
|
|
951
1077
|
});
|
|
952
1078
|
}
|
|
953
1079
|
}
|