gitnexus 1.6.9 → 1.6.10-aptos.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +197 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- 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.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +5 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +28 -0
- package/dist/core/move/consistency.js +98 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +49 -0
- package/dist/core/move/move-ingest.js +320 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +3 -3
- package/dist/core/run-analyze.js +1001 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -14,6 +14,7 @@ import Graph from 'graphology';
|
|
|
14
14
|
import { createRequire } from 'node:module';
|
|
15
15
|
import { fileURLToPath } from 'node:url';
|
|
16
16
|
import { dirname, resolve } from 'node:path';
|
|
17
|
+
import { Worker } from 'node:worker_threads';
|
|
17
18
|
const __filename = fileURLToPath(import.meta.url);
|
|
18
19
|
const __dirname = dirname(__filename);
|
|
19
20
|
// Navigate to package root (works from both src/ and dist/)
|
|
@@ -37,6 +38,20 @@ function createSeededRng(seed) {
|
|
|
37
38
|
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
38
39
|
};
|
|
39
40
|
}
|
|
41
|
+
const COMMUNITY_ENGINE_ENV = 'GITNEXUS_COMMUNITY_ENGINE';
|
|
42
|
+
const DEFAULT_COMMUNITY_ENGINE = 'graphology';
|
|
43
|
+
const LEIDEN_TIMEOUT_MS = 60_000;
|
|
44
|
+
const ICEBUG_TIMEOUT_MS = 60_000;
|
|
45
|
+
const MIN_CONFIDENCE_LARGE = 0.5;
|
|
46
|
+
export const resolveCommunityDetectionEngine = (raw = process.env[COMMUNITY_ENGINE_ENV]) => {
|
|
47
|
+
if (raw === undefined || raw.trim() === '')
|
|
48
|
+
return DEFAULT_COMMUNITY_ENGINE;
|
|
49
|
+
const normalized = raw.trim().toLowerCase();
|
|
50
|
+
if (normalized === 'graphology' || normalized === 'icebug' || normalized === 'auto') {
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
return DEFAULT_COMMUNITY_ENGINE;
|
|
54
|
+
};
|
|
40
55
|
// ============================================================================
|
|
41
56
|
// COMMUNITY COLORS (for visualization)
|
|
42
57
|
// ============================================================================
|
|
@@ -66,59 +81,28 @@ export const getCommunityColor = (communityIndex) => {
|
|
|
66
81
|
* This runs AFTER all relationships (CALLS, IMPORTS, etc.) have been built.
|
|
67
82
|
* It uses primarily CALLS edges to cluster code that works together.
|
|
68
83
|
*/
|
|
69
|
-
export const processCommunities = async (knowledgeGraph, onProgress) => {
|
|
84
|
+
export const processCommunities = async (knowledgeGraph, onProgress, options = {}) => {
|
|
70
85
|
onProgress?.('Building graph for community detection...', 0);
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (node.label === 'Function' ||
|
|
75
|
-
node.label === 'Class' ||
|
|
76
|
-
node.label === 'Method' ||
|
|
77
|
-
node.label === 'Interface') {
|
|
78
|
-
symbolCount++;
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
const isLarge = symbolCount > 10_000;
|
|
82
|
-
const graph = buildGraphologyGraph(knowledgeGraph, isLarge);
|
|
86
|
+
const engineRequested = options.engine ?? resolveCommunityDetectionEngine();
|
|
87
|
+
const projection = buildCommunityProjection(knowledgeGraph);
|
|
88
|
+
const graph = buildGraphologyGraph(projection);
|
|
83
89
|
if (graph.order === 0) {
|
|
84
90
|
return {
|
|
85
91
|
communities: [],
|
|
86
92
|
memberships: [],
|
|
87
|
-
stats: {
|
|
93
|
+
stats: {
|
|
94
|
+
totalCommunities: 0,
|
|
95
|
+
modularity: 0,
|
|
96
|
+
nodesProcessed: 0,
|
|
97
|
+
engine: DEFAULT_COMMUNITY_ENGINE,
|
|
98
|
+
engineRequested,
|
|
99
|
+
},
|
|
88
100
|
};
|
|
89
101
|
}
|
|
90
102
|
const nodeCount = graph.order;
|
|
91
103
|
const edgeCount = graph.size;
|
|
92
|
-
onProgress?.(`Running Leiden on ${nodeCount} nodes, ${edgeCount} edges${isLarge ? ` (filtered from ${symbolCount} symbols)` : ''}...`, 30);
|
|
93
|
-
|
|
94
|
-
// The first 2 iterations capture ~95%+ of modularity; additional iterations have diminishing returns.
|
|
95
|
-
// Timeout: abort after 60s for pathological graph structures.
|
|
96
|
-
const LEIDEN_TIMEOUT_MS = 60_000;
|
|
97
|
-
let details;
|
|
98
|
-
try {
|
|
99
|
-
details = await Promise.race([
|
|
100
|
-
Promise.resolve(leiden.detailed(graph, {
|
|
101
|
-
resolution: isLarge ? 2.0 : 1.0,
|
|
102
|
-
maxIterations: isLarge ? 3 : 0,
|
|
103
|
-
rng: createSeededRng(LEIDEN_SEED),
|
|
104
|
-
})),
|
|
105
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Leiden timeout')), LEIDEN_TIMEOUT_MS)),
|
|
106
|
-
]);
|
|
107
|
-
}
|
|
108
|
-
catch (e) {
|
|
109
|
-
if (e.message === 'Leiden timeout') {
|
|
110
|
-
onProgress?.('Community detection timed out, using fallback...', 60);
|
|
111
|
-
// Fallback: assign all nodes to community 0
|
|
112
|
-
const communities = {};
|
|
113
|
-
graph.forEachNode((node) => {
|
|
114
|
-
communities[node] = 0;
|
|
115
|
-
});
|
|
116
|
-
details = { communities, count: 1, modularity: 0 };
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
throw e;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
104
|
+
onProgress?.(`Running Leiden on ${nodeCount} nodes, ${edgeCount} edges${projection.isLarge ? ` (filtered from ${projection.symbolCount} symbols)` : ''}...`, 30);
|
|
105
|
+
const details = await runCommunityEngine(graph, projection, engineRequested, options, onProgress);
|
|
122
106
|
onProgress?.(`Found ${details.count} communities...`, 60);
|
|
123
107
|
// Step 3: Create community nodes with heuristic labels
|
|
124
108
|
const communityNodes = createCommunityNodes(details.communities, details.count, graph, knowledgeGraph);
|
|
@@ -139,27 +123,32 @@ export const processCommunities = async (knowledgeGraph, onProgress) => {
|
|
|
139
123
|
totalCommunities: details.count,
|
|
140
124
|
modularity: details.modularity,
|
|
141
125
|
nodesProcessed: graph.order,
|
|
126
|
+
engine: details.engine,
|
|
127
|
+
engineRequested: details.engineRequested,
|
|
128
|
+
fallbackReason: details.fallbackReason,
|
|
142
129
|
},
|
|
143
130
|
};
|
|
144
131
|
};
|
|
145
132
|
// ============================================================================
|
|
146
|
-
// HELPER: Build
|
|
133
|
+
// HELPER: Build community projection from knowledge graph
|
|
147
134
|
// ============================================================================
|
|
148
135
|
/**
|
|
149
|
-
* Build a
|
|
136
|
+
* Build a community projection containing only symbol nodes and clustering edges.
|
|
150
137
|
* For large graphs (>10K symbols), filter out low-confidence fuzzy-global edges
|
|
151
138
|
* and degree-1 nodes that add noise and massively increase Leiden runtime.
|
|
152
139
|
*/
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
140
|
+
export const buildCommunityProjection = (knowledgeGraph) => {
|
|
141
|
+
let symbolCount = 0;
|
|
142
|
+
knowledgeGraph.forEachNode((node) => {
|
|
143
|
+
if (isCommunitySymbol(node)) {
|
|
144
|
+
symbolCount++;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
const isLarge = symbolCount > 10_000;
|
|
159
148
|
const connectedNodes = new Set();
|
|
160
149
|
const nodeDegree = new Map();
|
|
161
150
|
knowledgeGraph.forEachRelationship((rel) => {
|
|
162
|
-
if (!
|
|
151
|
+
if (!isClusteringRelationship(rel.type) || rel.sourceId === rel.targetId)
|
|
163
152
|
return;
|
|
164
153
|
if (isLarge && rel.confidence < MIN_CONFIDENCE_LARGE)
|
|
165
154
|
return;
|
|
@@ -168,34 +157,304 @@ const buildGraphologyGraph = (knowledgeGraph, isLarge) => {
|
|
|
168
157
|
nodeDegree.set(rel.sourceId, (nodeDegree.get(rel.sourceId) || 0) + 1);
|
|
169
158
|
nodeDegree.set(rel.targetId, (nodeDegree.get(rel.targetId) || 0) + 1);
|
|
170
159
|
});
|
|
160
|
+
const nodes = [];
|
|
161
|
+
const nodeIndexById = new Map();
|
|
162
|
+
const eligibleNodes = [];
|
|
171
163
|
knowledgeGraph.forEachNode((node) => {
|
|
172
|
-
if (!
|
|
164
|
+
if (!isCommunitySymbol(node) || !connectedNodes.has(node.id))
|
|
173
165
|
return;
|
|
174
166
|
// For large graphs, skip degree-1 nodes — they just become singletons or
|
|
175
167
|
// get absorbed into their single neighbor's community, but cost iteration time.
|
|
176
168
|
if (isLarge && (nodeDegree.get(node.id) || 0) < 2)
|
|
177
169
|
return;
|
|
178
|
-
|
|
170
|
+
eligibleNodes.push(node);
|
|
171
|
+
});
|
|
172
|
+
eligibleNodes.sort((left, right) => (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
|
|
173
|
+
for (const node of eligibleNodes) {
|
|
174
|
+
nodeIndexById.set(node.id, nodes.length);
|
|
175
|
+
nodes.push({
|
|
176
|
+
id: node.id,
|
|
179
177
|
name: node.properties.name,
|
|
180
178
|
filePath: node.properties.filePath,
|
|
181
179
|
type: node.label,
|
|
182
180
|
});
|
|
183
|
-
}
|
|
181
|
+
}
|
|
182
|
+
const seenEdges = new Set();
|
|
183
|
+
const edges = [];
|
|
184
184
|
knowledgeGraph.forEachRelationship((rel) => {
|
|
185
|
-
if (!
|
|
185
|
+
if (!isClusteringRelationship(rel.type) || rel.sourceId === rel.targetId)
|
|
186
186
|
return;
|
|
187
187
|
if (isLarge && rel.confidence < MIN_CONFIDENCE_LARGE)
|
|
188
188
|
return;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
189
|
+
const sourceIndex = nodeIndexById.get(rel.sourceId);
|
|
190
|
+
const targetIndex = nodeIndexById.get(rel.targetId);
|
|
191
|
+
if (sourceIndex === undefined || targetIndex === undefined || sourceIndex === targetIndex)
|
|
192
|
+
return;
|
|
193
|
+
const [a, b] = sourceIndex < targetIndex ? [sourceIndex, targetIndex] : [targetIndex, sourceIndex];
|
|
194
|
+
const edgeKey = `${a}:${b}`;
|
|
195
|
+
if (seenEdges.has(edgeKey))
|
|
196
|
+
return;
|
|
197
|
+
seenEdges.add(edgeKey);
|
|
198
|
+
edges.push([a, b]);
|
|
196
199
|
});
|
|
200
|
+
edges.sort(([leftA, leftB], [rightA, rightB]) => leftA - rightA || leftB - rightB);
|
|
201
|
+
return { nodes, edges, symbolCount, isLarge };
|
|
202
|
+
};
|
|
203
|
+
export const buildCommunityCsr = (projection) => {
|
|
204
|
+
const adjacency = Array.from({ length: projection.nodes.length }, () => new Set());
|
|
205
|
+
for (const [sourceIndex, targetIndex] of projection.edges) {
|
|
206
|
+
adjacency[sourceIndex].add(targetIndex);
|
|
207
|
+
adjacency[targetIndex].add(sourceIndex);
|
|
208
|
+
}
|
|
209
|
+
const edgeTraversalCount = adjacency.reduce((count, neighbors) => count + neighbors.size, 0);
|
|
210
|
+
const indptr = new BigUint64Array(projection.nodes.length + 1);
|
|
211
|
+
const indices = new BigUint64Array(edgeTraversalCount);
|
|
212
|
+
let cursor = 0;
|
|
213
|
+
for (let nodeIndex = 0; nodeIndex < adjacency.length; nodeIndex++) {
|
|
214
|
+
indptr[nodeIndex] = BigInt(cursor);
|
|
215
|
+
const neighbors = [...adjacency[nodeIndex]].sort((a, b) => a - b);
|
|
216
|
+
for (const neighbor of neighbors) {
|
|
217
|
+
indices[cursor++] = BigInt(neighbor);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
indptr[projection.nodes.length] = BigInt(cursor);
|
|
221
|
+
return { indptr, indices };
|
|
222
|
+
};
|
|
223
|
+
export const buildGraphologyGraph = (projection) => {
|
|
224
|
+
const GraphCtor = Graph;
|
|
225
|
+
const graph = new GraphCtor({ type: 'undirected', allowSelfLoops: false });
|
|
226
|
+
for (const node of projection.nodes) {
|
|
227
|
+
graph.addNode(node.id, {
|
|
228
|
+
name: node.name,
|
|
229
|
+
filePath: node.filePath,
|
|
230
|
+
type: node.type,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
for (const [sourceIndex, targetIndex] of projection.edges) {
|
|
234
|
+
graph.addEdge(projection.nodes[sourceIndex].id, projection.nodes[targetIndex].id);
|
|
235
|
+
}
|
|
197
236
|
return graph;
|
|
198
237
|
};
|
|
238
|
+
const isCommunitySymbol = (node) => node.label === 'Function' ||
|
|
239
|
+
node.label === 'Class' ||
|
|
240
|
+
node.label === 'Method' ||
|
|
241
|
+
node.label === 'Interface';
|
|
242
|
+
const isClusteringRelationship = (type) => type === 'CALLS' || type === 'EXTENDS' || type === 'IMPLEMENTS';
|
|
243
|
+
const runCommunityEngine = async (graph, projection, engineRequested, options, onProgress) => {
|
|
244
|
+
if (engineRequested === 'graphology') {
|
|
245
|
+
return runGraphologyLeiden(graph, projection.isLarge, engineRequested);
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
return await runIcebugLeiden(projection, engineRequested, options);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
const fallbackReason = error instanceof Error ? error.message : String(error);
|
|
252
|
+
onProgress?.(`Icebug community engine unavailable, falling back to Graphology: ${fallbackReason}`, 35);
|
|
253
|
+
const fallback = await runGraphologyLeiden(graph, projection.isLarge, engineRequested);
|
|
254
|
+
return { ...fallback, fallbackReason };
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const runGraphologyLeiden = async (graph, isLarge, engineRequested) => {
|
|
258
|
+
try {
|
|
259
|
+
const details = await Promise.race([
|
|
260
|
+
Promise.resolve(leiden.detailed(graph, {
|
|
261
|
+
resolution: isLarge ? 2.0 : 1.0,
|
|
262
|
+
maxIterations: isLarge ? 3 : 0,
|
|
263
|
+
rng: createSeededRng(LEIDEN_SEED),
|
|
264
|
+
})),
|
|
265
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Leiden timeout')), LEIDEN_TIMEOUT_MS)),
|
|
266
|
+
]);
|
|
267
|
+
return { ...details, engine: 'graphology', engineRequested };
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
if (e.message !== 'Leiden timeout') {
|
|
271
|
+
throw e;
|
|
272
|
+
}
|
|
273
|
+
// Fallback: assign all nodes to community 0
|
|
274
|
+
const communities = {};
|
|
275
|
+
graph.forEachNode((node) => {
|
|
276
|
+
communities[node] = 0;
|
|
277
|
+
});
|
|
278
|
+
return {
|
|
279
|
+
communities,
|
|
280
|
+
count: 1,
|
|
281
|
+
modularity: 0,
|
|
282
|
+
engine: 'graphology',
|
|
283
|
+
engineRequested,
|
|
284
|
+
fallbackReason: 'Graphology Leiden timeout',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const runIcebugLeiden = async (projection, engineRequested, options) => {
|
|
289
|
+
const csr = buildCommunityCsr(projection);
|
|
290
|
+
const nativeResult = await runIcebugWorker(projection.nodes.length, csr, options);
|
|
291
|
+
const partition = nativeResult.partition;
|
|
292
|
+
if (!Number.isFinite(nativeResult.modularity)) {
|
|
293
|
+
throw new Error('optional icebug modularity was not finite');
|
|
294
|
+
}
|
|
295
|
+
if (partition.length !== projection.nodes.length ||
|
|
296
|
+
partition.some((community) => !Number.isSafeInteger(community))) {
|
|
297
|
+
throw new Error(`optional icebug partition was malformed for ${projection.nodes.length} projected nodes`);
|
|
298
|
+
}
|
|
299
|
+
const communities = normalizePartition(projection, partition);
|
|
300
|
+
return {
|
|
301
|
+
communities,
|
|
302
|
+
count: new Set(Object.values(communities)).size,
|
|
303
|
+
modularity: nativeResult.modularity,
|
|
304
|
+
engine: 'icebug',
|
|
305
|
+
engineRequested,
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
const runIcebugWorker = (nodeCount, csr, options) => {
|
|
309
|
+
const threads = options.icebug?.threads ?? 1;
|
|
310
|
+
if (!Number.isSafeInteger(threads) || threads !== 1) {
|
|
311
|
+
throw new Error('optional icebug engine currently requires deterministic threads=1');
|
|
312
|
+
}
|
|
313
|
+
if (options.icebug?.randomize === true) {
|
|
314
|
+
throw new Error('optional icebug engine currently requires randomize=false');
|
|
315
|
+
}
|
|
316
|
+
const worker = new Worker(ICEBUG_WORKER_SOURCE, {
|
|
317
|
+
eval: true,
|
|
318
|
+
workerData: {
|
|
319
|
+
nodeCount,
|
|
320
|
+
indices: csr.indices,
|
|
321
|
+
indptr: csr.indptr,
|
|
322
|
+
threads,
|
|
323
|
+
seed: options.icebug?.seed ?? LEIDEN_SEED,
|
|
324
|
+
iterations: options.icebug?.iterations ?? 4,
|
|
325
|
+
gamma: options.icebug?.gamma ?? 1.0,
|
|
326
|
+
randomize: options.icebug?.randomize ?? false,
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
let settled = false;
|
|
331
|
+
const timeout = setTimeout(() => {
|
|
332
|
+
settled = true;
|
|
333
|
+
void worker.terminate();
|
|
334
|
+
reject(new Error(`optional icebug community engine timed out after ${ICEBUG_TIMEOUT_MS}ms`));
|
|
335
|
+
}, ICEBUG_TIMEOUT_MS);
|
|
336
|
+
worker.once('message', (message) => {
|
|
337
|
+
settled = true;
|
|
338
|
+
clearTimeout(timeout);
|
|
339
|
+
void worker.terminate();
|
|
340
|
+
if (message.ok === true) {
|
|
341
|
+
resolve(message);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
reject(new Error(message.error));
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
worker.once('error', (error) => {
|
|
348
|
+
settled = true;
|
|
349
|
+
clearTimeout(timeout);
|
|
350
|
+
void worker.terminate();
|
|
351
|
+
reject(error);
|
|
352
|
+
});
|
|
353
|
+
worker.once('exit', (code) => {
|
|
354
|
+
if (settled)
|
|
355
|
+
return;
|
|
356
|
+
clearTimeout(timeout);
|
|
357
|
+
if (code === 0) {
|
|
358
|
+
reject(new Error('optional icebug worker exited before returning a partition'));
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
reject(new Error(`optional icebug worker exited with code ${code}`));
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
};
|
|
365
|
+
const ICEBUG_WORKER_SOURCE = `
|
|
366
|
+
const { parentPort, workerData } = require('node:worker_threads');
|
|
367
|
+
|
|
368
|
+
const isNumericArrayLike = (value) =>
|
|
369
|
+
typeof value === 'object' &&
|
|
370
|
+
value !== null &&
|
|
371
|
+
'length' in value &&
|
|
372
|
+
typeof value.length === 'number';
|
|
373
|
+
|
|
374
|
+
const readPartition = (runner) => {
|
|
375
|
+
const candidates = [
|
|
376
|
+
typeof runner.getPartition === 'function' ? runner.getPartition() : runner.partition,
|
|
377
|
+
typeof runner.getCommunities === 'function' ? runner.getCommunities() : undefined,
|
|
378
|
+
typeof runner.getMembership === 'function' ? runner.getMembership() : undefined,
|
|
379
|
+
typeof runner.getMemberships === 'function' ? runner.getMemberships() : undefined,
|
|
380
|
+
];
|
|
381
|
+
|
|
382
|
+
for (const candidate of candidates) {
|
|
383
|
+
if (isNumericArrayLike(candidate)) {
|
|
384
|
+
return Array.from(candidate, Number);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
throw new Error('optional icebug ParallelLeidenView did not expose a partition array');
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
const readModularity = (runner) => {
|
|
392
|
+
if (typeof runner.getModularity === 'function') return runner.getModularity();
|
|
393
|
+
if (typeof runner.modularity === 'function') return runner.modularity();
|
|
394
|
+
if (typeof runner.modularity === 'number') return runner.modularity;
|
|
395
|
+
return 0;
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
(async () => {
|
|
399
|
+
const imported = await import('icebug');
|
|
400
|
+
const icebug = imported.default ?? imported;
|
|
401
|
+
const fromCSR = icebug.Graph?.fromCSR;
|
|
402
|
+
const ParallelLeidenView = icebug.community?.ParallelLeidenView;
|
|
403
|
+
if (!fromCSR || !ParallelLeidenView) {
|
|
404
|
+
throw new Error('optional icebug module does not expose Graph.fromCSR/ParallelLeidenView');
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (typeof icebug.setNumberOfThreads !== 'function' || typeof icebug.setSeed !== 'function') {
|
|
408
|
+
throw new Error('optional icebug module does not expose deterministic thread/seed controls');
|
|
409
|
+
}
|
|
410
|
+
icebug.setNumberOfThreads(workerData.threads);
|
|
411
|
+
icebug.setSeed(workerData.seed, false);
|
|
412
|
+
|
|
413
|
+
const nativeGraph = fromCSR(workerData.nodeCount, false, workerData.indices, workerData.indptr);
|
|
414
|
+
let runner;
|
|
415
|
+
try {
|
|
416
|
+
runner = new ParallelLeidenView(nativeGraph, {
|
|
417
|
+
iterations: workerData.iterations,
|
|
418
|
+
gamma: workerData.gamma,
|
|
419
|
+
randomize: workerData.randomize,
|
|
420
|
+
});
|
|
421
|
+
} catch {
|
|
422
|
+
runner = new ParallelLeidenView(
|
|
423
|
+
nativeGraph,
|
|
424
|
+
workerData.iterations,
|
|
425
|
+
workerData.gamma,
|
|
426
|
+
workerData.randomize,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (typeof runner.run !== 'function') {
|
|
431
|
+
throw new Error('optional icebug ParallelLeidenView does not expose run()');
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
runner.run();
|
|
435
|
+
parentPort.postMessage({
|
|
436
|
+
ok: true,
|
|
437
|
+
partition: readPartition(runner),
|
|
438
|
+
modularity: readModularity(runner),
|
|
439
|
+
});
|
|
440
|
+
})().catch((error) => {
|
|
441
|
+
parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });
|
|
442
|
+
});
|
|
443
|
+
`;
|
|
444
|
+
const normalizePartition = (projection, partition) => {
|
|
445
|
+
const remap = new Map();
|
|
446
|
+
const communities = {};
|
|
447
|
+
for (let index = 0; index < projection.nodes.length; index++) {
|
|
448
|
+
const rawCommunity = String(partition[index]);
|
|
449
|
+
let communityId = remap.get(rawCommunity);
|
|
450
|
+
if (communityId === undefined) {
|
|
451
|
+
communityId = remap.size;
|
|
452
|
+
remap.set(rawCommunity, communityId);
|
|
453
|
+
}
|
|
454
|
+
communities[projection.nodes[index].id] = communityId;
|
|
455
|
+
}
|
|
456
|
+
return communities;
|
|
457
|
+
};
|
|
199
458
|
// ============================================================================
|
|
200
459
|
// HELPER: Create community nodes with heuristic labels
|
|
201
460
|
// ============================================================================
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
* ancestor scope, and if THAT produces nothing either the edge is
|
|
45
45
|
* skipped (with a count returned in `EmitStats.skippedNoCaller`).
|
|
46
46
|
*/
|
|
47
|
+
import { toZeroBasedLine } from './utils/line-base.js';
|
|
47
48
|
/**
|
|
48
49
|
* Drain `referenceIndex.bySourceScope` into graph edges.
|
|
49
50
|
*
|
|
@@ -95,8 +96,8 @@ export function emitScopeGraph(input) {
|
|
|
95
96
|
properties: {
|
|
96
97
|
name: scope.kind,
|
|
97
98
|
filePath: scope.filePath,
|
|
98
|
-
startLine: scope.range.startLine,
|
|
99
|
-
endLine: scope.range.endLine,
|
|
99
|
+
startLine: toZeroBasedLine(scope.range.startLine),
|
|
100
|
+
endLine: toZeroBasedLine(scope.range.endLine),
|
|
100
101
|
description: `Scope: ${scope.kind}`,
|
|
101
102
|
},
|
|
102
103
|
});
|
|
@@ -223,6 +224,10 @@ function mapKindToType(kind) {
|
|
|
223
224
|
case 'type-reference':
|
|
224
225
|
case 'import-use':
|
|
225
226
|
case 'macro':
|
|
227
|
+
// value-ref: function registered as an object-literal property value —
|
|
228
|
+
// a reference, not an invocation; CALLS are synthesized separately by
|
|
229
|
+
// the property-dispatch pass (#2437).
|
|
230
|
+
case 'value-ref':
|
|
226
231
|
return 'USES';
|
|
227
232
|
}
|
|
228
233
|
}
|
|
@@ -60,6 +60,10 @@ export const walkRepositoryPaths = async (repoPath, onProgress) => {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
+
// Filesystem/glob traversal order is not stable across filesystems or repeated
|
|
64
|
+
// scans. Canonicalize once at the scan boundary so every downstream phase sees
|
|
65
|
+
// the same repository order.
|
|
66
|
+
entries.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
|
|
63
67
|
if (skippedLarge > 0) {
|
|
64
68
|
const isDefault = maxFileSizeBytes === DEFAULT_MAX_FILE_SIZE_BYTES;
|
|
65
69
|
const isOverrideUnset = !process.env.GITNEXUS_MAX_FILE_SIZE;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { isSpringBeanCandidateSourceFile } from './bean-catalog.js';
|
|
2
|
+
/** Durable completeness contract for Java/Kotlin Spring Bean evidence. */
|
|
3
|
+
export const SPRING_BEAN_INVENTORY_FEATURE = {
|
|
4
|
+
id: 'spring.bean-inventory',
|
|
5
|
+
version: 1,
|
|
6
|
+
appliesTo: (filePaths) => filePaths.some(isSpringBeanCandidateSourceFile),
|
|
7
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Capture, ParsedFile, ScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
3
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
4
|
+
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
5
|
+
export interface ClassAnnotationFact {
|
|
6
|
+
readonly classScopeId: ScopeId;
|
|
7
|
+
readonly annotationNames: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface ClassAnnotationFactStore {
|
|
10
|
+
clear(): void;
|
|
11
|
+
set(filePath: string, facts: readonly ClassAnnotationFact[]): void;
|
|
12
|
+
get(filePath: string): readonly ClassAnnotationFact[];
|
|
13
|
+
}
|
|
14
|
+
/** Per-language store for capture facts that cross the worker boundary. */
|
|
15
|
+
export declare function createClassAnnotationFactStore(): ClassAnnotationFactStore;
|
|
16
|
+
/** Record one annotation from the language's existing scope-query traversal. */
|
|
17
|
+
export declare function recordClassAnnotationCapture(facts: Map<ScopeId, Set<string>>, filePath: string, classCapture: Pick<Capture, 'range'>, annotationName: string): void;
|
|
18
|
+
export declare function materializeClassAnnotationFacts(facts: ReadonlyMap<ScopeId, ReadonlySet<string>>): readonly ClassAnnotationFact[];
|
|
19
|
+
export interface SpringBeanCandidateAdapter {
|
|
20
|
+
getClassAnnotationFacts(filePath: string): readonly ClassAnnotationFact[];
|
|
21
|
+
isPackageVisibilityIncomplete(filePath: string): boolean;
|
|
22
|
+
}
|
|
23
|
+
type RecognizedAnnotationNames = {
|
|
24
|
+
readonly has: (value: string) => boolean;
|
|
25
|
+
};
|
|
26
|
+
/** Build a scope-aware Spring annotation resolver shared by framework hooks. */
|
|
27
|
+
export declare function createSpringAnnotationNameResolver(indexes: ScopeResolutionIndexes): (rawName: string, parsed: ParsedFile, enclosingScope: ScopeId | null, recognizedAnnotations: RecognizedAnnotationNames, isPackageVisibilityIncomplete: boolean) => string | undefined;
|
|
28
|
+
/** Build a language hook that enriches Class nodes after scope resolution. */
|
|
29
|
+
export declare function createSpringBeanCandidateAttacher(adapter: SpringBeanCandidateAdapter): (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes) => void;
|
|
30
|
+
export {};
|