gitnexus 1.6.8-rc.9 → 1.6.8
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 +31 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +11 -1
- package/dist/_shared/language-detection.js.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 +6 -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 +18 -16
- package/dist/cli/analyze-config.js +11 -0
- package/dist/cli/analyze.d.ts +14 -0
- package/dist/cli/analyze.js +98 -0
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.d.ts +8 -0
- package/dist/cli/eval-server.js +242 -2
- package/dist/cli/help-i18n.js +19 -0
- package/dist/cli/i18n/en.d.ts +15 -1
- package/dist/cli/i18n/en.js +15 -1
- package/dist/cli/i18n/resources.d.ts +29 -1
- package/dist/cli/i18n/zh-CN.d.ts +14 -0
- package/dist/cli/i18n/zh-CN.js +15 -1
- package/dist/cli/index.js +89 -1
- 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/tool.d.ts +19 -1
- package/dist/cli/tool.js +96 -3
- 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/server-mapping.d.ts +1 -1
- package/dist/core/embeddings/server-mapping.js +7 -3
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/cross-impact.d.ts +2 -1
- package/dist/core/group/cross-impact.js +5 -1
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
- package/dist/core/group/extractors/http-route-extractor.js +22 -4
- package/dist/core/group/extractors/include-extractor.js +22 -13
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +18 -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 +293 -0
- package/dist/core/ingestion/cfg/emit.js +646 -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-def-reason-codec.d.ts +106 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -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 +162 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +785 -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 +274 -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 +541 -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 +195 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -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 +278 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -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 +621 -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 +513 -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 +253 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -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 +626 -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 +212 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -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 +223 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -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 +324 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -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 +255 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -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 +149 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -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/import-resolvers/utils.js +2 -0
- package/dist/core/ingestion/language-provider.d.ts +11 -0
- package/dist/core/ingestion/languages/c-cpp.js +6 -1
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
- package/dist/core/ingestion/languages/cpp/captures.js +50 -1
- package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
- package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
- package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
- package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
- 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 +3 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +3 -0
- 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 +23 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -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.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
- 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 +92 -10
- package/dist/core/ingestion/pipeline.js +11 -2
- package/dist/core/ingestion/scope-extractor.js +12 -2
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
- package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
- package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
- package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
- package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
- package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
- package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
- package/dist/core/ingestion/taint/call-summary-model.js +25 -0
- package/dist/core/ingestion/taint/emit.d.ts +125 -0
- package/dist/core/ingestion/taint/emit.js +208 -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 +80 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -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/type-extractors/c-cpp.js +21 -0
- package/dist/core/ingestion/utils/env.d.ts +7 -0
- package/dist/core/ingestion/utils/env.js +12 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +13 -0
- package/dist/core/ingestion/workers/parse-worker.js +76 -17
- package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
- package/dist/core/ingestion/workers/worker-pool.js +15 -2
- package/dist/core/lbug/csv-generator.d.ts +51 -3
- package/dist/core/lbug/csv-generator.js +369 -255
- package/dist/core/lbug/lbug-adapter.d.ts +58 -18
- package/dist/core/lbug/lbug-adapter.js +346 -84
- package/dist/core/lbug/lbug-config.d.ts +19 -0
- package/dist/core/lbug/lbug-config.js +29 -0
- package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
- package/dist/core/lbug/pdg-emit-sink.js +358 -0
- 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/lbug/schema.d.ts +2 -2
- package/dist/core/lbug/schema.js +3 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +96 -0
- package/dist/core/run-analyze.js +207 -3
- 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/core/wiki/generator.js +3 -1
- package/dist/core/wiki/graph-queries.d.ts +6 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- 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 +110 -24
- package/dist/mcp/local/local-backend.js +1225 -19
- package/dist/mcp/local/pdg-impact.d.ts +384 -0
- package/dist/mcp/local/pdg-impact.js +1972 -0
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.js +214 -7
- 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.d.ts +17 -1
- package/dist/server/api.d.ts +17 -0
- package/dist/server/api.js +132 -168
- package/dist/server/git-clone.d.ts +43 -2
- package/dist/server/git-clone.js +211 -16
- 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 +37 -0
- package/dist/server/upload-paths.js +57 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/git.js +5 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +41 -10
- package/dist/storage/repo-manager.d.ts +121 -10
- package/dist/storage/repo-manager.js +43 -5
- package/dist/types/pipeline.d.ts +9 -0
- 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 +513 -26
- package/package.json +8 -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-D3Xd7zZE.js} +123 -123
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
- package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
- package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
- package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
- package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
- package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
- package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
- package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
- package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
- package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
- package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
- package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
- package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
- package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
- package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
- package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
- package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
- package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
- package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
- package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
- package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
- package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
- package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
- package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
- package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
- package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
- package/web/assets/index-BvYev1UJ.js +635 -0
- package/web/assets/index-_lgn7hs5.css +2 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
- package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
- package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
- package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
- package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
- package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
- package/web/index.html +13 -15
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
- package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
- package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
- package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
- package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
- package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
- package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
- package/web/assets/chunk-CilyBKbf.js +0 -1
- package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
- package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
- package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
- package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
- package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
- package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
- package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
- package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
- package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
- package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
- package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
- package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
- package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
- package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
- /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gitnexus",
|
|
3
|
-
"version": "1.6.8
|
|
3
|
+
"version": "1.6.8",
|
|
4
4
|
"description": "Graph-powered code intelligence for AI agents. Index any codebase, query via MCP or CLI.",
|
|
5
5
|
"author": "Abhigyan Patwari",
|
|
6
6
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"test:watch": "vitest",
|
|
50
50
|
"test:coverage": "vitest run --coverage",
|
|
51
51
|
"test:cross-platform": "tsx scripts/run-cross-platform.ts",
|
|
52
|
-
"postinstall": "node scripts/
|
|
52
|
+
"postinstall": "node scripts/build-tree-sitter-grammars.cjs",
|
|
53
53
|
"assert-publish-coverage": "node scripts/assert-publish-grammar-coverage.cjs",
|
|
54
54
|
"prepare": "node scripts/build.js",
|
|
55
55
|
"prepack": "node scripts/assert-publish-grammar-coverage.cjs && node scripts/build.js"
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
"@ladybugdb/core": "^0.17.0",
|
|
60
60
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
61
61
|
"@scarf/scarf": "^1.4.0",
|
|
62
|
+
"busboy": "^1.6.0",
|
|
62
63
|
"cli-progress": "^3.12.0",
|
|
63
64
|
"commander": "^14.0.3",
|
|
64
65
|
"cors": "^2.8.5",
|
|
@@ -93,6 +94,11 @@
|
|
|
93
94
|
"uuid": "^14.0.0"
|
|
94
95
|
},
|
|
95
96
|
"devDependencies": {
|
|
97
|
+
"@babel/generator": "^7.29.7",
|
|
98
|
+
"@babel/parser": "^7.29.7",
|
|
99
|
+
"@babel/traverse": "^7.29.7",
|
|
100
|
+
"@babel/types": "^7.29.7",
|
|
101
|
+
"@types/busboy": "^1.5.4",
|
|
96
102
|
"@types/cli-progress": "^3.11.6",
|
|
97
103
|
"@types/cors": "^2.8.17",
|
|
98
104
|
"@types/express": "^5.0.6",
|
|
@@ -112,6 +112,24 @@ function findCoverageProblems({ grammars }) {
|
|
|
112
112
|
return problems;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
/**
|
|
116
|
+
* Stray local source-build outputs under `vendor/<name>/build/`. These would
|
|
117
|
+
* ship in the tarball (`files: ["vendor"]` overrides .gitignore/.npmignore) AND
|
|
118
|
+
* shadow the committed prebuilds — `node-gyp-build` resolves `build/Release`
|
|
119
|
+
* BEFORE `prebuilds/`, so a consumer on the publisher's platform would load the
|
|
120
|
+
* stray (possibly stale/wrong) binding instead of the curated prebuild. The
|
|
121
|
+
* build dir is gitignored and only appears if a maintainer source-built locally
|
|
122
|
+
* (e.g. on a no-prebuild platform); refuse to publish it. (#2144 review.)
|
|
123
|
+
*/
|
|
124
|
+
function findStrayBuildArtifacts(vendorDir) {
|
|
125
|
+
if (!fs.existsSync(vendorDir)) return [];
|
|
126
|
+
return fs
|
|
127
|
+
.readdirSync(vendorDir)
|
|
128
|
+
.filter((d) => /^tree-sitter-/.test(d))
|
|
129
|
+
.filter((d) => fs.existsSync(path.join(vendorDir, d, 'build')))
|
|
130
|
+
.map((d) => `vendor/${d}/build`);
|
|
131
|
+
}
|
|
132
|
+
|
|
115
133
|
function collectGrammars(vendorDir, shipsVendorSource) {
|
|
116
134
|
if (!fs.existsSync(vendorDir)) return [];
|
|
117
135
|
return fs
|
|
@@ -141,6 +159,18 @@ function main() {
|
|
|
141
159
|
process.exit(1);
|
|
142
160
|
}
|
|
143
161
|
|
|
162
|
+
const stray = findStrayBuildArtifacts(vendorDir);
|
|
163
|
+
if (stray.length > 0) {
|
|
164
|
+
console.error(
|
|
165
|
+
'[publish-guard] Refusing to publish — stray source-build output under vendor/ would\n' +
|
|
166
|
+
'ship and shadow the committed prebuilds (node-gyp-build loads build/Release before\n' +
|
|
167
|
+
'prebuilds/):',
|
|
168
|
+
);
|
|
169
|
+
for (const s of stray) console.error(` - ${s}`);
|
|
170
|
+
console.error('\nFix: remove it before packing, e.g. `rm -rf gitnexus/vendor/*/build`.');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
|
|
144
174
|
const problems = findCoverageProblems({ grammars });
|
|
145
175
|
if (problems.length > 0) {
|
|
146
176
|
console.error('[publish-guard] Refusing to publish — a vendored grammar would ship unusable:');
|
|
@@ -163,6 +193,7 @@ if (require.main === module) main();
|
|
|
163
193
|
|
|
164
194
|
module.exports = {
|
|
165
195
|
findCoverageProblems,
|
|
196
|
+
findStrayBuildArtifacts,
|
|
166
197
|
filesShipsVendorSource,
|
|
167
198
|
isBuildableFromSource,
|
|
168
199
|
sourceBuildSet,
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Activate the vendored tree-sitter native bindings
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Activate the vendored tree-sitter native bindings IN PLACE under `vendor/`.
|
|
4
|
+
* One registry-driven script replaces the former per-grammar
|
|
5
|
+
* build-tree-sitter-<name>.cjs files (they were ~95% identical).
|
|
6
|
+
*
|
|
7
|
+
* The grammars (tree-sitter-c/dart/proto/swift/kotlin) are loaded from
|
|
8
|
+
* `vendor/<name>/` by absolute path at runtime (see
|
|
9
|
+
* src/core/tree-sitter/vendored-grammars.ts) and are NEVER copied into
|
|
10
|
+
* node_modules — an undeclared package under node_modules is "extraneous" to
|
|
11
|
+
* every subsequent npm/npx reify, which prunes/relocates it (Windows
|
|
12
|
+
* `EPERM: …, symlink` + a silent grammar deletion on the 2nd run; #2111/#1728).
|
|
7
13
|
*
|
|
8
14
|
* For each grammar the resolution order is identical:
|
|
9
|
-
* 1. If the
|
|
15
|
+
* 1. If the vendored source is absent (no binding.gyp) or the binding is
|
|
10
16
|
* already built, do nothing.
|
|
11
17
|
* 2. Prefer a committed prebuild for this platform-arch (toolchain-free) via
|
|
12
|
-
* node-gyp-build —
|
|
13
|
-
*
|
|
18
|
+
* node-gyp-build — `vendor/<name>/prebuilds/` ships all six tuples, so on a
|
|
19
|
+
* supported platform this returns immediately and writes nothing.
|
|
14
20
|
* 3. Otherwise source-build from the vendored grammar source (binding.gyp +
|
|
15
|
-
* src/) so parsing still works on
|
|
16
|
-
*
|
|
21
|
+
* src/) into `vendor/<name>/build/` (gitignored) so parsing still works on
|
|
22
|
+
* a toolchain host that lacks a matching prebuild.
|
|
17
23
|
*
|
|
18
24
|
* HARD INVARIANT: this runs in `gitnexus`'s postinstall, so it MUST NEVER throw
|
|
19
25
|
* or exit non-zero — a failure for any single grammar must not break the install.
|
|
@@ -53,7 +59,7 @@ function buildGrammar(short) {
|
|
|
53
59
|
return;
|
|
54
60
|
}
|
|
55
61
|
|
|
56
|
-
const dir = path.join(__dirname, '..', '
|
|
62
|
+
const dir = path.join(__dirname, '..', 'vendor', `tree-sitter-${short}`);
|
|
57
63
|
const bindingGyp = path.join(dir, 'binding.gyp');
|
|
58
64
|
const bindingNode = path.join(dir, 'build', 'Release', `tree_sitter_${short}_binding.node`);
|
|
59
65
|
|
|
@@ -37,6 +37,7 @@ const PLATFORM_LOGIC = [
|
|
|
37
37
|
'test/unit/repo-manager.test.ts',
|
|
38
38
|
'test/unit/repo-manager-finalize-invariant.test.ts',
|
|
39
39
|
'test/unit/hooks.test.ts',
|
|
40
|
+
'test/unit/hook-db-lock-probe.test.ts',
|
|
40
41
|
'test/unit/cursor-hook.test.ts',
|
|
41
42
|
'test/unit/sidecar-recovery.test.ts',
|
|
42
43
|
'test/unit/pool-wal-recovery.test.ts',
|
|
@@ -16,10 +16,10 @@ description: "Use when the user is debugging a bug, tracing an error, or asking
|
|
|
16
16
|
## Workflow
|
|
17
17
|
|
|
18
18
|
```
|
|
19
|
-
1. query({
|
|
19
|
+
1. query({search_query: "<error or symptom>"}) → Find related execution flows
|
|
20
20
|
2. context({name: "<suspect>"}) → See callers/callees/processes
|
|
21
21
|
3. READ gitnexus://repo/{name}/process/{name} → Trace execution flow
|
|
22
|
-
4. cypher({
|
|
22
|
+
4. cypher({statement: "MATCH path..."}) → Custom traces if needed
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
> If "Index is stale" → run `node .gitnexus/run.cjs analyze` in terminal.
|
|
@@ -45,13 +45,14 @@ description: "Use when the user is debugging a bug, tracing an error, or asking
|
|
|
45
45
|
| Intermittent failure | `context` → look for external calls, async deps |
|
|
46
46
|
| Performance issue | `context` → find symbols with many callers (hot paths) |
|
|
47
47
|
| Recent regression | `detect_changes` to see what your changes affect |
|
|
48
|
+
| "How does A reach B?" | `trace` between the two symbols — shortest call chain in one call |
|
|
48
49
|
|
|
49
50
|
## Tools
|
|
50
51
|
|
|
51
52
|
**query** — find code related to error:
|
|
52
53
|
|
|
53
54
|
```
|
|
54
|
-
query({
|
|
55
|
+
query({search_query: "payment validation error"})
|
|
55
56
|
→ Processes: CheckoutFlow, ErrorHandling
|
|
56
57
|
→ Symbols: validatePayment, handlePaymentError, PaymentException
|
|
57
58
|
```
|
|
@@ -72,10 +73,21 @@ MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "valid
|
|
|
72
73
|
RETURN [n IN nodes(path) | n.name] AS chain
|
|
73
74
|
```
|
|
74
75
|
|
|
76
|
+
**trace** — shortest call chain between two symbols ("how does A reach B?"), one call instead of chaining `context` hops:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
trace({ from: "processCheckout", to: "fetchRates" })
|
|
80
|
+
→ status: ok, hopCount: 3
|
|
81
|
+
→ hops: processCheckout → validatePayment → verifyCard → fetchRates
|
|
82
|
+
→ edges: CALLS (1.0), CALLS (0.95), CALLS (1.0)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
When no path exists, `trace` reports the furthest reachable node — exactly where the chain breaks (dynamic dispatch, reflection, or an external boundary).
|
|
86
|
+
|
|
75
87
|
## Example: "Payment endpoint returns 500 intermittently"
|
|
76
88
|
|
|
77
89
|
```
|
|
78
|
-
1. query({
|
|
90
|
+
1. query({search_query: "payment error handling"})
|
|
79
91
|
→ Processes: CheckoutFlow, ErrorHandling
|
|
80
92
|
→ Symbols: validatePayment, handlePaymentError
|
|
81
93
|
|
|
@@ -18,7 +18,7 @@ description: "Use when the user asks how code works, wants to understand archite
|
|
|
18
18
|
```
|
|
19
19
|
1. READ gitnexus://repos → Discover indexed repos
|
|
20
20
|
2. READ gitnexus://repo/{name}/context → Codebase overview, check staleness
|
|
21
|
-
3. query({
|
|
21
|
+
3. query({search_query: "<what you want to understand>"}) → Find related execution flows
|
|
22
22
|
4. context({name: "<symbol>"}) → Deep dive on specific symbol
|
|
23
23
|
5. READ gitnexus://repo/{name}/process/{name} → Trace full execution flow
|
|
24
24
|
```
|
|
@@ -50,7 +50,7 @@ description: "Use when the user asks how code works, wants to understand archite
|
|
|
50
50
|
**query** — find execution flows related to a concept:
|
|
51
51
|
|
|
52
52
|
```
|
|
53
|
-
query({
|
|
53
|
+
query({search_query: "payment processing"})
|
|
54
54
|
→ Processes: CheckoutFlow, RefundFlow, WebhookHandler
|
|
55
55
|
→ Symbols grouped by flow with file locations
|
|
56
56
|
```
|
|
@@ -68,7 +68,7 @@ context({name: "validateUser"})
|
|
|
68
68
|
|
|
69
69
|
```
|
|
70
70
|
1. READ gitnexus://repo/my-app/context → 918 symbols, 45 processes
|
|
71
|
-
2. query({
|
|
71
|
+
2. query({search_query: "payment processing"})
|
|
72
72
|
→ CheckoutFlow: processPayment → validateCard → chargeStripe
|
|
73
73
|
→ RefundFlow: initiateRefund → calculateRefund → processRefund
|
|
74
74
|
3. context({name: "processPayment"})
|
package/skills/gitnexus-guide.md
CHANGED
|
@@ -35,9 +35,13 @@ For any task involving code understanding, debugging, impact analysis, or refact
|
|
|
35
35
|
| `query` | Process-grouped code intelligence — execution flows related to a concept |
|
|
36
36
|
| `context` | 360-degree symbol view — categorized refs, processes it participates in |
|
|
37
37
|
| `impact` | Symbol blast radius — what breaks at depth 1/2/3 with confidence |
|
|
38
|
+
| `trace` | Shortest path between two symbols — "how does A reach B?" in one call |
|
|
38
39
|
| `detect_changes` | Git-diff impact — what do your current changes affect |
|
|
39
40
|
| `rename` | Multi-file coordinated rename with confidence-tagged edits |
|
|
40
41
|
| `cypher` | Raw graph queries (read `gitnexus://repo/{name}/schema` first) |
|
|
42
|
+
| `explain` | Persisted taint findings — source→sink data flows (needs `analyze --pdg`) |
|
|
43
|
+
| `pdg_query` | Control/data dependence — what gates X (CDG) / where Y flows (REACHING_DEF); needs `analyze --pdg` |
|
|
44
|
+
| `check` | Check graph invariants such as circular imports |
|
|
41
45
|
| `list_repos` | Discover indexed repos (paginated — `limit`/`offset`) |
|
|
42
46
|
|
|
43
47
|
### Paginating `list_repos`
|
|
@@ -71,6 +75,35 @@ list_repos { offset: 400 } → repos 401–437, hasMore false
|
|
|
71
75
|
|
|
72
76
|
Notes: `offset` ≥ `total` returns an empty page (with `total` still reported). Out-of-range or malformed `limit`/`offset` (non-integer, `limit` outside `[1, 200]`, `offset < 0`) are rejected with a clear error — `limit` above the max is rejected, not silently capped. The order is deterministic (lower-cased name, then path), so paging never skips or duplicates an entry while the registry is unchanged.
|
|
73
77
|
|
|
78
|
+
### Taint findings (`explain`)
|
|
79
|
+
|
|
80
|
+
`explain` returns intra-procedural taint findings (`TAINTED` edges) recorded by `gitnexus analyze --pdg` — each with a sink category (command-injection, code-injection, path-traversal, sql-injection, xss), source/sink lines, and the ordered hop path with the variable carried on each hop.
|
|
81
|
+
|
|
82
|
+
- `explain {}` — enumerate all findings for the repo (bounded by `limit`, deterministic order)
|
|
83
|
+
- `explain { target: "src/vuln.ts" }` — findings in a file (suffix path match accepted)
|
|
84
|
+
- `explain { target: "runUserCommand" }` — findings in a function (resolved like `context`; ambiguous names return ranked candidates)
|
|
85
|
+
|
|
86
|
+
A repo indexed without `--pdg` returns a clear "no taint layer" note. Caveats: findings are intra-procedural only — cross-function, closure/callback, property/field, and implicit flows are not modeled, so the absence of a finding is **not** proof of safety. `SANITIZES` (sanitizer-kill) edges are queryable via `cypher`.
|
|
87
|
+
|
|
88
|
+
### Control & data dependence (`pdg_query`)
|
|
89
|
+
|
|
90
|
+
`pdg_query` reads the control/data-dependence layers `gitnexus analyze --pdg` records (CDG + REACHING_DEF, basic-block granular) — the control/data analog of `explain`. It is **always anchored** (a `target` file path or symbol, resolved like `context`) and has two modes:
|
|
91
|
+
|
|
92
|
+
- `pdg_query { mode: "controls", target: "..." }` — CDG: "under what condition does X run?". Each edge is a controlling predicate block → dependent block with the branch sense (`'T'`/`'F'`) in `reason`; an edge into an early `return`/`throw` is flagged `guard: true` (guard-clause discovery — the sense depends on the predicate, so don't filter guards by a fixed label).
|
|
93
|
+
- `pdg_query { mode: "flows", target: "...", variable?: "..." }` — REACHING_DEF def→use edges within the function; pass `variable` to trace one binding.
|
|
94
|
+
|
|
95
|
+
A repo indexed without `--pdg` returns a "no PDG layer" note (or "status unknown" when the layer can't be confirmed). Intra-procedural only — cross-function flow is taint's domain (`explain`). The raw CDG/REACHING_DEF edges are also queryable via `cypher`. See the `gitnexus-pdg-query` skill for the full query surface.
|
|
96
|
+
|
|
97
|
+
### Shortest path between two symbols (`trace`)
|
|
98
|
+
|
|
99
|
+
`trace` answers "how does A reach B?" in one call — the shortest directed path over `CALLS` (plus `HAS_METHOD`, so a class-rooted trace descends into its methods) instead of chaining 3–8 `context`/`impact` hops by hand.
|
|
100
|
+
|
|
101
|
+
- `trace { from: "validateUser", to: "executeQuery" }` — shortest path between two symbols.
|
|
102
|
+
- Disambiguate common names with `from_uid`/`to_uid` (zero-ambiguity) or `from_file`/`to_file`; an ambiguous name returns ranked candidates.
|
|
103
|
+
- `maxDepth` (default 10, max 30) bounds the search; `includeTests` (default false) lets the traversal pass through test-file symbols.
|
|
104
|
+
|
|
105
|
+
Returns ordered `hops` (each `{ name, filePath, startLine }`) and an aligned `edges[]` of `{ relType, confidence }`, so call hops and containment (`HAS_METHOD`) hops stay distinguishable. When no path exists it reports the **furthest** reachable node (where the chain breaks) and sets `truncated: true` if a traversal cap was hit first. Every result carries a `status`: `ok` / `no_path` / `ambiguous` / `not_found` / `error`.
|
|
106
|
+
|
|
74
107
|
## Resources Reference
|
|
75
108
|
|
|
76
109
|
Lightweight reads (~100-500 tokens) for navigation:
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gitnexus-pdg-query
|
|
3
|
+
description: "Use when querying or extending GitNexus's PDG control/data-dependence surface (the `pdg_query` MCP tool, CDG/REACHING_DEF edges), or reasoning about \"what controls X\" / \"where does Y flow\" / guard clauses. Examples: \"what guards this statement?\", \"trace this variable within the function\", \"why is the pdg_query result empty?\", \"add a CDG query\"."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PDG query surface with GitNexus
|
|
7
|
+
|
|
8
|
+
Expert knowledge for the `pdg_query` MCP tool and the control/data-dependence
|
|
9
|
+
edges it reads — the opt-in `--pdg` program-dependence layers. Read this before
|
|
10
|
+
touching `gitnexus/src/mcp/local/local-backend.ts` (`_pdgQueryImpl`) or the
|
|
11
|
+
`pdg_query` tool def, or when explaining a `pdg_query` result.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- "Under what condition does this statement run?" (guarding predicates).
|
|
16
|
+
- "Where does this variable flow inside the function?" (def→use).
|
|
17
|
+
- Guard-clause discovery (early-return guards — subsumes the #559 heuristic).
|
|
18
|
+
- Extending or reviewing `pdg_query` / the CDG / REACHING_DEF read path.
|
|
19
|
+
- Debugging an empty or surprising `pdg_query` result.
|
|
20
|
+
|
|
21
|
+
## The layered substrate (build order)
|
|
22
|
+
|
|
23
|
+
`pdg_query` runs **on** the same graph taint runs on. Each layer is opt-in
|
|
24
|
+
behind `--pdg`; a default `analyze` run records none of them (byte-identical).
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
L1 CFG per-function basic blocks + control-flow edges (M1 #2081)
|
|
28
|
+
L2 REACHING_DEF GEN/KILL def→use data dependence (pure solver) (M2 #2082)
|
|
29
|
+
L5 CDG Ferrante control dependence (post-dominators) (M5 #2085)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
All three are `BasicBlock → BasicBlock` edges in the single `CodeRelation` table
|
|
33
|
+
(keyed by the `type` property). There is **no** `Function → BasicBlock` edge.
|
|
34
|
+
|
|
35
|
+
## The two modes
|
|
36
|
+
|
|
37
|
+
- `pdg_query({ mode: 'controls', target })` — CDG. For the anchored function,
|
|
38
|
+
each edge: controlling predicate block → dependent block + branch sense in
|
|
39
|
+
`label` (`'T'` = predicate's true/taken arm, `'F'` = false/fall-through). An
|
|
40
|
+
edge into an early-return/throw block is flagged `guard: true`.
|
|
41
|
+
- `pdg_query({ mode: 'flows', target, variable? })` — REACHING_DEF def→use
|
|
42
|
+
edges; `variable` filters to one binding.
|
|
43
|
+
|
|
44
|
+
`target` is **required** — a file path or a symbol/function name (resolved like
|
|
45
|
+
`context()`). There is no anchorless mode (see below).
|
|
46
|
+
|
|
47
|
+
## The corrected guard-clause Cypher
|
|
48
|
+
|
|
49
|
+
The RFC #567 §2 form (`[:CDG {label:'F'}]`) does **not** run as written. Edges
|
|
50
|
+
are values of the single `CodeRelation` table's `type` property, and the branch
|
|
51
|
+
sense is in `reason`, NOT a `label` column:
|
|
52
|
+
|
|
53
|
+
```cypher
|
|
54
|
+
MATCH (pred:BasicBlock)-[r:CodeRelation {type: 'CDG'}]->(dep:BasicBlock)
|
|
55
|
+
WHERE dep.text STARTS WITH 'return' OR dep.text STARTS WITH 'throw'
|
|
56
|
+
RETURN pred.startLine, r.reason AS branch, dep.startLine, dep.text
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`r.reason` is the sense the predicate took to reach the early exit. For
|
|
60
|
+
`if (!ok) return;` the return rides the predicate's **true** arm (`'T'`) and the
|
|
61
|
+
protected body rides the **false** arm (`'F'`) — polarity depends on the guard,
|
|
62
|
+
so don't hard-code one sense.
|
|
63
|
+
|
|
64
|
+
## Gotchas (the load-bearing ones)
|
|
65
|
+
|
|
66
|
+
- **Always anchored + LIMIT-bounded.** LadybugDB has no rel-property index, so
|
|
67
|
+
an unanchored `[:CDG*]`/`[:REACHING_DEF*]` path scan is unbounded. `pdg_query`
|
|
68
|
+
requires `target` and bounds the page; raw `cypher` callers must anchor on a
|
|
69
|
+
file id-prefix or symbol span themselves.
|
|
70
|
+
- **BasicBlock↔symbol join is reconstructed.** No `Function→BasicBlock` edge:
|
|
71
|
+
the block is matched by its id-prefix (`BasicBlock:<file>:<fnStartLine>:…`)
|
|
72
|
+
plus `startLine` within the symbol's span. BasicBlock `startLine` is **1-based**
|
|
73
|
+
while the symbol node's `startLine`/`endLine` are **0-based**, so **both** bounds
|
|
74
|
+
are shifted `+1` (`[symStart+1, symEnd+1]`): the upper `+1` keeps a guard/def/use
|
|
75
|
+
on the function's **final line**, the lower `+1` excludes an adjacent function's
|
|
76
|
+
block on the line directly **above**. Same-line / nested functions anchor coarsely.
|
|
77
|
+
- **No PDG layer ⇒ a note, not an error.** If the repo wasn't indexed with
|
|
78
|
+
`--pdg` the tool returns `{ results: [], note: "no PDG layer …" }` (cheap meta
|
|
79
|
+
probe on `RepoMeta.pdg.maxCdgEdgesPerFunction` / `maxReachingDefEdgesPerFunction`).
|
|
80
|
+
- **CDG labels are binary in M5/M6.** Every `switch`-case arm is `'T'`; per-case
|
|
81
|
+
conditions are not yet distinguished.
|
|
82
|
+
- **Intra-procedural only.** Cross-function flow is taint's domain (`explain`).
|
|
83
|
+
|
|
84
|
+
## Mirror, don't fork
|
|
85
|
+
|
|
86
|
+
`_pdgQueryImpl` is the front half of `_explainImpl` (WAL wrapper, meta no-layer
|
|
87
|
+
probe, limit validation, `resolveSymbolCandidates` anchoring) with CDG/
|
|
88
|
+
REACHING_DEF instead of TAINTED — and none of taint's path-codec / interproc
|
|
89
|
+
`TAINT_PATH` machinery. Reuse those shared helpers; do not re-implement them.
|
|
@@ -17,7 +17,7 @@ description: "Use when the user wants to rename, extract, split, move, or restru
|
|
|
17
17
|
|
|
18
18
|
```
|
|
19
19
|
1. impact({target: "X", direction: "upstream"}) → Map all dependents
|
|
20
|
-
2. query({
|
|
20
|
+
2. query({search_query: "X"}) → Find execution flows involving X
|
|
21
21
|
3. context({name: "X"}) → See all incoming/outgoing refs
|
|
22
22
|
4. Plan update order: interfaces → implementations → callers → tests
|
|
23
23
|
```
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gitnexus-taint-analysis
|
|
3
|
+
description: "Use when working on, reviewing, or extending GitNexus's CFG/taint/PDG subsystem (the `--pdg` layers), or when reasoning about source→sink data-flow findings. Examples: \"How does taint analysis work here?\", \"Why didn't explain find this flow?\", \"Add a new sink/source\", \"Review the interprocedural taint code\"."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CFG & Taint Analysis with GitNexus
|
|
7
|
+
|
|
8
|
+
Expert knowledge for the opt-in `--pdg` program-analysis subsystem: control-flow
|
|
9
|
+
graphs, reaching definitions, and intra- + inter-procedural taint. Read this
|
|
10
|
+
before touching `gitnexus/src/core/ingestion/cfg/**` or
|
|
11
|
+
`gitnexus/src/core/ingestion/taint/**`, or when explaining a finding.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- "How does the taint engine work / why is this flow (not) reported?"
|
|
16
|
+
- Adding a source, sink, or sanitizer to the model.
|
|
17
|
+
- Extending or reviewing the CFG / reaching-defs / taint / summary code.
|
|
18
|
+
- Understanding the `explain` MCP tool's findings (intra- vs inter-procedural).
|
|
19
|
+
- Debugging a false positive or false negative in `--pdg` output.
|
|
20
|
+
|
|
21
|
+
## The layered substrate (build order)
|
|
22
|
+
|
|
23
|
+
Taint runs **on** the graph, not beside it. Each layer is opt-in behind `--pdg`
|
|
24
|
+
and a default `analyze` run is **byte-identical** (the golden parity gate is the
|
|
25
|
+
hard floor for every change here).
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
L1 CFG per-function basic blocks + control-flow edges (M1 #2081)
|
|
29
|
+
L2 REACHING_DEF GEN/KILL def→use data dependence (pure solver) (M2 #2082)
|
|
30
|
+
L3 Taint (intra) source→sink over RD facts, minus sanitizers (M3 #2083)
|
|
31
|
+
L4 Taint (inter) per-function summaries composed over CALLS (M4 #2084)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- **Worker-built, main-thread-solved.** The parse worker builds each function's
|
|
35
|
+
CFG + harvests def/use + call-site facts onto `ParsedFile.cfgSideChannel`
|
|
36
|
+
(plain, structured-clone-safe data — never AST nodes). The main thread runs
|
|
37
|
+
the pure solvers. NEVER re-parse on the main thread (re-introduces the #1983
|
|
38
|
+
OOM).
|
|
39
|
+
- **In-phase emit (KTD1).** L1–L4-harvest all run INSIDE the scope-resolution
|
|
40
|
+
pdg window (`scope-resolution/pipeline/run.ts`, gated `input.pdg === true`),
|
|
41
|
+
because the disk-backed ParsedFile store is cleared when that phase ends — a
|
|
42
|
+
standalone post-`mro` phase would read empty data. The cross-function fixpoint
|
|
43
|
+
(L4) is the exception: it runs in its OWN registered phase (`taintSummaries`)
|
|
44
|
+
AFTER scope-resolution, because it needs the COMPLETE call graph, and consumes
|
|
45
|
+
small plain summary data threaded out via `ScopeResolutionOutput`.
|
|
46
|
+
- **Pure-solver contract.** `computeReachingDefs`, `computeTaintFlows`,
|
|
47
|
+
`harvestFunctionSummary`, and `solveInterprocTaint` are pure and deterministic
|
|
48
|
+
(no graph, no I/O, no logger; sorted outputs). Snapshot tests and
|
|
49
|
+
content-derived edge ids depend on it.
|
|
50
|
+
|
|
51
|
+
## Intra-procedural taint (L3)
|
|
52
|
+
|
|
53
|
+
Forward reachability over RD facts from matched **sources** to matched **sinks**,
|
|
54
|
+
killed by **sanitizers**. Key design points worth internalizing:
|
|
55
|
+
|
|
56
|
+
- **Occurrence-tagged sites.** A flat per-arg binding set cannot tell
|
|
57
|
+
`exec(escape(x))` (safe) from `exec(x)` (finding); the harvest records nested
|
|
58
|
+
call structure (`SiteRecord.parent`/via-tags) so sanitizer interposition is
|
|
59
|
+
precise.
|
|
60
|
+
- **Kind-set sanitizer model.** A taint carries a set of *neutralized*
|
|
61
|
+
`SinkKind`s; a sink fires unless its kind is in the set. So `escape(req.body)`
|
|
62
|
+
suppresses `res.send` (xss) but STILL fires `db.query` (sql) — a kind-blind
|
|
63
|
+
kill would be a suppressed live injection (the forbidden FN direction).
|
|
64
|
+
`path.basename(t)` neutralizes path-traversal only, not command-injection.
|
|
65
|
+
- **Statement-level finding identity.** NOT block-pair (block conflation drops
|
|
66
|
+
distinct findings; `exec(req.body, req.query)` is two findings).
|
|
67
|
+
- Persisted as `TAINTED` edges (BasicBlock→BasicBlock); the path rides the
|
|
68
|
+
`reason` column via the shared versioned codec (`taint/path-codec.ts`).
|
|
69
|
+
|
|
70
|
+
## Interprocedural taint (L4) — the functional/summary method
|
|
71
|
+
|
|
72
|
+
The production approach (Sharir-Pnueli 1981; the same shape as Meta's Pysa and
|
|
73
|
+
Mariana Trench, and FB Infer) — NOT full IFDS tabulation. Each function is
|
|
74
|
+
reduced to a compact **summary**, and summaries are composed over the already-
|
|
75
|
+
resolved `CALLS` graph.
|
|
76
|
+
|
|
77
|
+
**Summary shape** (`taint/summary-model.ts`, whole-parameter granularity):
|
|
78
|
+
|
|
79
|
+
| Edge | Meaning | Analogue |
|
|
80
|
+
|------|---------|----------|
|
|
81
|
+
| `param→return` | a param flows to the return value | TITO — **reserved** (the floor already covers its recall; precision pass deferred) |
|
|
82
|
+
| `param→callee-arg` | a param flows into arg *j* of a call (carries the path's neutralized sink kinds) | TITO into callee |
|
|
83
|
+
| `param→sink` | a param reaches a modelled sink | partial/triggered sink |
|
|
84
|
+
| `source→return` | the function generates+returns a source | generative — **composed** via the caller's `callResults` |
|
|
85
|
+
| `source→callee-arg` | a generated source flows into a call | fixpoint SEED |
|
|
86
|
+
| `callResults` | a user-function call's result flows to a sink/return/callee-arg in the caller | composes with callee `source→return` |
|
|
87
|
+
|
|
88
|
+
**The fixpoint** (`taint/interproc-solver.ts`): the unit is `(function,
|
|
89
|
+
parameter, source)`. Seed from `source→callee-arg`, propagate via
|
|
90
|
+
`param→callee-arg`, fire a finding when a tainted param meets `param→sink`.
|
|
91
|
+
|
|
92
|
+
- **Cycle-safe by monotonicity.** The tainted-set is monotone over a finite
|
|
93
|
+
lattice (`fn × param × source`), so the worklist converges — a recursive call
|
|
94
|
+
just re-proposes an already-visited entry. SCC condensation would only refine
|
|
95
|
+
processing order; correctness/termination don't require it.
|
|
96
|
+
- **Source-discriminated state (load-bearing).** Key the state by the SOURCE
|
|
97
|
+
too. Keying only by `(fn, param)` collapses multi-source flows: a sink param
|
|
98
|
+
tainted by source A is marked visited and a later flow from source B is dropped
|
|
99
|
+
before firing — the recurring multi-source bug class. (Bit M3; bit M4 U9.)
|
|
100
|
+
- **Name-based call join.** Match a summary's call-arg edge to a `CALLS` edge by
|
|
101
|
+
CALLEE NAME, not call-site line — line-base parity (CFG 1-based vs reference
|
|
102
|
+
site) is fragile; the callee identity is exact and context-insensitivity
|
|
103
|
+
taints the callee's param identically at every call site.
|
|
104
|
+
- Persisted as `TAINT_PATH` edges (Function→Function), function-level hop chain
|
|
105
|
+
in `reason` via the same codec; confidence < the intra-procedural 1.0.
|
|
106
|
+
|
|
107
|
+
**Context-insensitivity** is the accepted trade-off at this tier: one summary
|
|
108
|
+
per function, return/call-site merging accepted (security-conservative). Expect
|
|
109
|
+
some FP from merging; the bigger FN sources are unmodeled features (below).
|
|
110
|
+
|
|
111
|
+
## Known false-negative classes (documented, deferred)
|
|
112
|
+
|
|
113
|
+
The largest is **closures/callbacks** (`arr.forEach(() => sink(y))`) — taint
|
|
114
|
+
into a callback is dropped without per-library models (true of CodeQL's JS libs
|
|
115
|
+
too). Also deferred: field/property flows (`obj.x = taint; sink(obj.y)`),
|
|
116
|
+
field-sensitive access paths, guard-style sanitizers, implicit/control-dependence
|
|
117
|
+
flows, promise/async-await threading, and **destructured/rest params before a
|
|
118
|
+
tainted simple param** (the summary port index is the binding ordinal, not the
|
|
119
|
+
formal arg position — needs a formal-param index threaded from the worker
|
|
120
|
+
`BindingEntry`). The interprocedural join is also context-insensitive: when one
|
|
121
|
+
caller invokes two distinct **same-named callees**, a flow into one
|
|
122
|
+
over-attributes to both (sound — over-report, never a missed flow). Absence of a
|
|
123
|
+
finding is NOT proof of safety.
|
|
124
|
+
|
|
125
|
+
## GitNexus-specific gotchas
|
|
126
|
+
|
|
127
|
+
- **Function↔CFG join.** `FunctionCfg.functionStartLine` is 1-based; `Function`/
|
|
128
|
+
`Method` node `startLine` is 0-based — join at `startLine - 1`. Function nodes
|
|
129
|
+
have no column, so same-line functions (`{a:()=>x(), b:()=>y()}`) are
|
|
130
|
+
ambiguous → drop (the summary driver counts `unresolved`) rather than
|
|
131
|
+
cross-wire.
|
|
132
|
+
- **No rel-property index (S1).** Kuzu has no secondary index on relationship
|
|
133
|
+
properties, and unanchored `[:TAINTED*]`/`[:TAINT_PATH*]` queries explode.
|
|
134
|
+
TAINT_PATH is therefore MATERIALIZED + anchored at analyze time, never
|
|
135
|
+
traversed live; `explain` reads it source-anchored + LIMIT-guarded.
|
|
136
|
+
- **`explain` is the only discovery surface.** `TAINTED`/`TAINT_PATH` are
|
|
137
|
+
deliberately OUT of `VALID_RELATION_TYPES` (impact's allow-list) and the web
|
|
138
|
+
schema (pinned in `security.test.ts`). `explain` enumerates both layers
|
|
139
|
+
(cross-function findings carry `interprocedural: true`).
|
|
140
|
+
- **One shared codec.** Both the emit path and `explain` import
|
|
141
|
+
`taint/path-codec.ts`. Two hand-rolled copies of a wire format drift — never
|
|
142
|
+
fork it. New metadata extends the format WITHIN the version when writer +
|
|
143
|
+
reader ship together.
|
|
144
|
+
- **Cache versioning.** A worker-harvest shape change bumps the parse-cache pdg
|
|
145
|
+
NAMESPACE (`pdg:N`), NOT `SCHEMA_BUMP` (which cold-invalidates every user).
|
|
146
|
+
Persisted-graph/config changes ride `RepoMeta.pdg`'s key-union mismatch →
|
|
147
|
+
full writeback. Model content rides `taintModelVersion`.
|
|
148
|
+
|
|
149
|
+
## Adding a source / sink / sanitizer
|
|
150
|
+
|
|
151
|
+
Edit the language model in `taint/typescript-model.ts` (registered via the
|
|
152
|
+
explicit `registerBuiltinTaintModels` seam, keyed by `SupportedLanguages`). The
|
|
153
|
+
spec is hashable data (no functions). A sanitizer's `neutralizes` lists the
|
|
154
|
+
EXACT sink kinds it defends — never a blanket kill. Add a fixture + assert the
|
|
155
|
+
finding (or its absence) in `test/unit/taint/` (real-source harness:
|
|
156
|
+
`test/helpers/ts-cfg-harness.ts`); the end-to-end proof is
|
|
157
|
+
`test/integration/cfg/`.
|
|
158
|
+
|
|
159
|
+
## Validation checklist for any `--pdg` change
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
1. tsc clean (schema additions are exhaustiveness-checked; watch the
|
|
163
|
+
api.ts getNodeQuery runtime read-path if a node label is added).
|
|
164
|
+
2. Targeted vitest by directory (test/unit/taint, test/unit/cfg,
|
|
165
|
+
test/integration/cfg) — verify by ISOLATION, not full-suite exit
|
|
166
|
+
(known load-flakes). `node scripts/build.js` before worker/integration runs.
|
|
167
|
+
3. Flag-off golden byte-identical (pipeline-graph-golden.test.ts).
|
|
168
|
+
4. bench/cfg/measure.mjs --check (no fingerprint drift / budget regression).
|
|
169
|
+
5. detect_changes() before commit; impact({direction:'upstream'}) before
|
|
170
|
+
editing shared symbols (KnowledgeGraph, RepoMeta, RelationshipType, codec).
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Prior art (for deeper design questions)
|
|
174
|
+
|
|
175
|
+
Sharir & Pnueli 1981 (functional approach); Reps-Horwitz-Sagiv IFDS (POPL 1995);
|
|
176
|
+
FlowDroid/StubDroid (access-path summaries); Pysa & Mariana Trench (TITO /
|
|
177
|
+
propagations, parallel SCC fixpoint); CodeQL Models-as-Data (the richest port
|
|
178
|
+
notation, incl. callback ports); Infer (content-keyed incremental summaries).
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "bindings/node/index.js",
|
|
8
8
|
"types": "bindings/node/index.d.ts",
|
|
9
|
-
"_vendoredBy": "gitnexus - runtime package derived from tree-sitter-c@0.21.4 (tree-sitter/tree-sitter-c). HELD at 0.21.4 for ABI compatibility with the bundled tree-sitter@0.21.1 runtime (#1242/#858) — do not bump without the runtime upgrade. Vendored because upstream ships native prebuilds for only 4 of 6 platforms (no linux-arm64/win32-arm64, #2116), and tree-sitter-c is a REQUIRED grammar whose source build hard-fails `npm install` on a toolchain-less ARM host. GitNexus cross-builds all six prebuilds via .github/workflows/build-tree-sitter-prebuilds.yml; the C source (binding.gyp + src/) is ALSO vendored so build-tree-sitter-
|
|
9
|
+
"_vendoredBy": "gitnexus - runtime package derived from tree-sitter-c@0.21.4 (tree-sitter/tree-sitter-c). HELD at 0.21.4 for ABI compatibility with the bundled tree-sitter@0.21.1 runtime (#1242/#858) — do not bump without the runtime upgrade. Vendored because upstream ships native prebuilds for only 4 of 6 platforms (no linux-arm64/win32-arm64, #2116), and tree-sitter-c is a REQUIRED grammar whose source build hard-fails `npm install` on a toolchain-less ARM host. GitNexus cross-builds all six prebuilds via .github/workflows/build-tree-sitter-prebuilds.yml; the C source (binding.gyp + src/) is ALSO vendored so build-tree-sitter-grammars.cjs can source-build the binding on a toolchain host when no prebuild matches (e.g. CI before prebuilds land). Loaded from vendor/ by absolute path at runtime (vendored-grammars.ts) — NEVER copied to node_modules (#2111) (no scripts.install here — #836/#1728).",
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"tree-sitter": "^0.21.0"
|
|
12
12
|
},
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"license": "ISC",
|
|
7
7
|
"main": "bindings/node",
|
|
8
8
|
"types": "bindings/node",
|
|
9
|
-
"_vendoredBy": "gitnexus - pinned to UserNobody14/tree-sitter-dart commit 80e23c07b64494f7e21090bb3450223ef0b192f4.
|
|
9
|
+
"_vendoredBy": "gitnexus - pinned to UserNobody14/tree-sitter-dart commit 80e23c07b64494f7e21090bb3450223ef0b192f4. Loaded from vendor/ by absolute path at runtime (vendored-grammars.ts) — NEVER copied to node_modules (#2111); native build via build-tree-sitter-grammars.cjs (#1728, #836).",
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"tree-sitter": "^0.21.0"
|
|
12
12
|
},
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "bindings/node/index.js",
|
|
8
8
|
"types": "bindings/node/index.d.ts",
|
|
9
|
-
"_vendoredBy": "gitnexus - runtime package derived from tree-sitter-kotlin@0.3.8 (fwcd). Unlike Swift's upstream-shipped prebuilds, upstream tree-sitter-kotlin ships SOURCE ONLY (no prebuilds/); the native prebuilds/ here are GitNexus-cross-built by .github/workflows/build-tree-sitter-prebuilds.yml. The grammar source (parser.c/scanner.c/binding.gyp + src/) is ALSO vendored so build-tree-sitter-
|
|
9
|
+
"_vendoredBy": "gitnexus - runtime package derived from tree-sitter-kotlin@0.3.8 (fwcd). Unlike Swift's upstream-shipped prebuilds, upstream tree-sitter-kotlin ships SOURCE ONLY (no prebuilds/); the native prebuilds/ here are GitNexus-cross-built by .github/workflows/build-tree-sitter-prebuilds.yml. The grammar source (parser.c/scanner.c/binding.gyp + src/) is ALSO vendored so build-tree-sitter-grammars.cjs can source-build the binding on a toolchain host when no prebuild matches (e.g. CI before prebuilds land). The generated parser.c is large (~23 MB on disk; it compresses heavily in git); once the prebuilds cover every platform-arch the source serves only as the fallback. Loaded from vendor/ by absolute path at runtime (vendored-grammars.ts) — NEVER copied to node_modules (#2111) (no scripts.install here — #836/#1728).",
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"tree-sitter": "^0.21.0"
|
|
12
12
|
},
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"repository": "https://github.com/coder3101/tree-sitter-proto",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "bindings/node",
|
|
8
|
-
"_vendoredBy": "gitnexus —
|
|
8
|
+
"_vendoredBy": "gitnexus — loaded from vendor/ by absolute path at runtime (vendored-grammars.ts) — NEVER copied to node_modules (#2111); native build via build-tree-sitter-grammars.cjs. Do NOT re-add dependencies or an install script (#836, #1728).",
|
|
9
9
|
"peerDependencies": {
|
|
10
10
|
"tree-sitter": ">=0.21.0"
|
|
11
11
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/alex-pinkus/tree-sitter-swift.git"
|
|
11
11
|
},
|
|
12
|
-
"_vendoredBy": "gitnexus - runtime package derived from official tree-sitter-swift@0.7.1 (gitHead 88bfd19a89be9d0481b14566fb6160cccea2fe0a). Unified with Dart/Proto/Kotlin/C: the grammar source (parser.c/scanner.c/binding.gyp + src/) is ALSO vendored so build-tree-sitter-grammars.cjs can source-build the binding on a toolchain host when no prebuild matches (e.g. CI before prebuilds land); src/parser.c is the ABI-14 default (~18 MB on disk, compresses heavily in git — the upstream parser_abi13.c alternate is not vendored). The native prebuilds/ are GitNexus-cross-built by .github/workflows/build-tree-sitter-prebuilds.yml (originally upstream-shipped). Build activation runs via gitnexus/scripts/build-tree-sitter-grammars.cjs
|
|
12
|
+
"_vendoredBy": "gitnexus - runtime package derived from official tree-sitter-swift@0.7.1 (gitHead 88bfd19a89be9d0481b14566fb6160cccea2fe0a). Unified with Dart/Proto/Kotlin/C: the grammar source (parser.c/scanner.c/binding.gyp + src/) is ALSO vendored so build-tree-sitter-grammars.cjs can source-build the binding on a toolchain host when no prebuild matches (e.g. CI before prebuilds land); src/parser.c is the ABI-14 default (~18 MB on disk, compresses heavily in git — the upstream parser_abi13.c alternate is not vendored). The native prebuilds/ are GitNexus-cross-built by .github/workflows/build-tree-sitter-prebuilds.yml (originally upstream-shipped). Build activation runs via gitnexus/scripts/build-tree-sitter-grammars.cjs (no scripts.install here — avoids #836 / #1728).",
|
|
13
13
|
"peerDependencies": {
|
|
14
14
|
"tree-sitter": "^0.21.1 || ^0.22.1"
|
|
15
15
|
},
|