@opencodehub/ingestion 0.1.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/LICENSE +202 -0
- package/README.md +69 -0
- package/dist/extract/index.d.ts +8 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +6 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/extract/orm-detector.d.ts +19 -0
- package/dist/extract/orm-detector.d.ts.map +1 -0
- package/dist/extract/orm-detector.js +209 -0
- package/dist/extract/orm-detector.js.map +1 -0
- package/dist/extract/property-access.d.ts +76 -0
- package/dist/extract/property-access.d.ts.map +1 -0
- package/dist/extract/property-access.js +260 -0
- package/dist/extract/property-access.js.map +1 -0
- package/dist/extract/receiver-resolver.d.ts +86 -0
- package/dist/extract/receiver-resolver.d.ts.map +1 -0
- package/dist/extract/receiver-resolver.js +77 -0
- package/dist/extract/receiver-resolver.js.map +1 -0
- package/dist/extract/route-detector-java.d.ts +29 -0
- package/dist/extract/route-detector-java.d.ts.map +1 -0
- package/dist/extract/route-detector-java.js +190 -0
- package/dist/extract/route-detector-java.js.map +1 -0
- package/dist/extract/route-detector-nestjs.d.ts +30 -0
- package/dist/extract/route-detector-nestjs.d.ts.map +1 -0
- package/dist/extract/route-detector-nestjs.js +134 -0
- package/dist/extract/route-detector-nestjs.js.map +1 -0
- package/dist/extract/route-detector-python.d.ts +28 -0
- package/dist/extract/route-detector-python.d.ts.map +1 -0
- package/dist/extract/route-detector-python.js +100 -0
- package/dist/extract/route-detector-python.js.map +1 -0
- package/dist/extract/route-detector-rails.d.ts +28 -0
- package/dist/extract/route-detector-rails.d.ts.map +1 -0
- package/dist/extract/route-detector-rails.js +162 -0
- package/dist/extract/route-detector-rails.js.map +1 -0
- package/dist/extract/route-detector.d.ts +45 -0
- package/dist/extract/route-detector.d.ts.map +1 -0
- package/dist/extract/route-detector.js +467 -0
- package/dist/extract/route-detector.js.map +1 -0
- package/dist/extract/tool-detector.d.ts +26 -0
- package/dist/extract/tool-detector.d.ts.map +1 -0
- package/dist/extract/tool-detector.js +364 -0
- package/dist/extract/tool-detector.js.map +1 -0
- package/dist/extract/types.d.ts +89 -0
- package/dist/extract/types.d.ts.map +1 -0
- package/dist/extract/types.js +11 -0
- package/dist/extract/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parse/cobol-regex.d.ts +85 -0
- package/dist/parse/cobol-regex.d.ts.map +1 -0
- package/dist/parse/cobol-regex.js +355 -0
- package/dist/parse/cobol-regex.js.map +1 -0
- package/dist/parse/grammar-registry.d.ts +115 -0
- package/dist/parse/grammar-registry.d.ts.map +1 -0
- package/dist/parse/grammar-registry.js +278 -0
- package/dist/parse/grammar-registry.js.map +1 -0
- package/dist/parse/index.d.ts +14 -0
- package/dist/parse/index.d.ts.map +1 -0
- package/dist/parse/index.js +10 -0
- package/dist/parse/index.js.map +1 -0
- package/dist/parse/language-detector.d.ts +17 -0
- package/dist/parse/language-detector.d.ts.map +1 -0
- package/dist/parse/language-detector.js +104 -0
- package/dist/parse/language-detector.js.map +1 -0
- package/dist/parse/parse-worker.d.ts +24 -0
- package/dist/parse/parse-worker.d.ts.map +1 -0
- package/dist/parse/parse-worker.js +230 -0
- package/dist/parse/parse-worker.js.map +1 -0
- package/dist/parse/types.d.ts +49 -0
- package/dist/parse/types.d.ts.map +1 -0
- package/dist/parse/types.js +11 -0
- package/dist/parse/types.js.map +1 -0
- package/dist/parse/unified-queries.d.ts +37 -0
- package/dist/parse/unified-queries.d.ts.map +1 -0
- package/dist/parse/unified-queries.js +623 -0
- package/dist/parse/unified-queries.js.map +1 -0
- package/dist/parse/wasm-fallback.d.ts +88 -0
- package/dist/parse/wasm-fallback.d.ts.map +1 -0
- package/dist/parse/wasm-fallback.js +258 -0
- package/dist/parse/wasm-fallback.js.map +1 -0
- package/dist/parse/worker-pool.d.ts +48 -0
- package/dist/parse/worker-pool.d.ts.map +1 -0
- package/dist/parse/worker-pool.js +97 -0
- package/dist/parse/worker-pool.js.map +1 -0
- package/dist/pipeline/dep-parsers/go.d.ts +25 -0
- package/dist/pipeline/dep-parsers/go.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/go.js +146 -0
- package/dist/pipeline/dep-parsers/go.js.map +1 -0
- package/dist/pipeline/dep-parsers/index.d.ts +17 -0
- package/dist/pipeline/dep-parsers/index.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/index.js +16 -0
- package/dist/pipeline/dep-parsers/index.js.map +1 -0
- package/dist/pipeline/dep-parsers/maven.d.ts +24 -0
- package/dist/pipeline/dep-parsers/maven.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/maven.js +131 -0
- package/dist/pipeline/dep-parsers/maven.js.map +1 -0
- package/dist/pipeline/dep-parsers/npm.d.ts +30 -0
- package/dist/pipeline/dep-parsers/npm.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/npm.js +309 -0
- package/dist/pipeline/dep-parsers/npm.js.map +1 -0
- package/dist/pipeline/dep-parsers/nuget.d.ts +24 -0
- package/dist/pipeline/dep-parsers/nuget.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/nuget.js +178 -0
- package/dist/pipeline/dep-parsers/nuget.js.map +1 -0
- package/dist/pipeline/dep-parsers/python.d.ts +21 -0
- package/dist/pipeline/dep-parsers/python.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/python.js +369 -0
- package/dist/pipeline/dep-parsers/python.js.map +1 -0
- package/dist/pipeline/dep-parsers/rust.d.ts +18 -0
- package/dist/pipeline/dep-parsers/rust.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/rust.js +134 -0
- package/dist/pipeline/dep-parsers/rust.js.map +1 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.d.ts +15 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.js +31 -0
- package/dist/pipeline/dep-parsers/spdx-normalize.js.map +1 -0
- package/dist/pipeline/dep-parsers/types.d.ts +63 -0
- package/dist/pipeline/dep-parsers/types.d.ts.map +1 -0
- package/dist/pipeline/dep-parsers/types.js +56 -0
- package/dist/pipeline/dep-parsers/types.js.map +1 -0
- package/dist/pipeline/gitignore-stack.d.ts +44 -0
- package/dist/pipeline/gitignore-stack.d.ts.map +1 -0
- package/dist/pipeline/gitignore-stack.js +69 -0
- package/dist/pipeline/gitignore-stack.js.map +1 -0
- package/dist/pipeline/gitignore.d.ts +67 -0
- package/dist/pipeline/gitignore.d.ts.map +1 -0
- package/dist/pipeline/gitignore.js +210 -0
- package/dist/pipeline/gitignore.js.map +1 -0
- package/dist/pipeline/index.d.ts +53 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +29 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +105 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +175 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/ownership-helpers/drift.d.ts +41 -0
- package/dist/pipeline/ownership-helpers/drift.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/drift.js +122 -0
- package/dist/pipeline/ownership-helpers/drift.js.map +1 -0
- package/dist/pipeline/ownership-helpers/gini-community.d.ts +24 -0
- package/dist/pipeline/ownership-helpers/gini-community.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/gini-community.js +32 -0
- package/dist/pipeline/ownership-helpers/gini-community.js.map +1 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts +71 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.js +178 -0
- package/dist/pipeline/ownership-helpers/git-blame-batcher.js.map +1 -0
- package/dist/pipeline/ownership-helpers/line-overlap.d.ts +35 -0
- package/dist/pipeline/ownership-helpers/line-overlap.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/line-overlap.js +62 -0
- package/dist/pipeline/ownership-helpers/line-overlap.js.map +1 -0
- package/dist/pipeline/ownership-helpers/orphan.d.ts +73 -0
- package/dist/pipeline/ownership-helpers/orphan.d.ts.map +1 -0
- package/dist/pipeline/ownership-helpers/orphan.js +117 -0
- package/dist/pipeline/ownership-helpers/orphan.js.map +1 -0
- package/dist/pipeline/phases/accesses.d.ts +44 -0
- package/dist/pipeline/phases/accesses.d.ts.map +1 -0
- package/dist/pipeline/phases/accesses.js +194 -0
- package/dist/pipeline/phases/accesses.js.map +1 -0
- package/dist/pipeline/phases/annotate.d.ts +28 -0
- package/dist/pipeline/phases/annotate.d.ts.map +1 -0
- package/dist/pipeline/phases/annotate.js +60 -0
- package/dist/pipeline/phases/annotate.js.map +1 -0
- package/dist/pipeline/phases/cochange.d.ts +42 -0
- package/dist/pipeline/phases/cochange.d.ts.map +1 -0
- package/dist/pipeline/phases/cochange.js +0 -0
- package/dist/pipeline/phases/cochange.js.map +1 -0
- package/dist/pipeline/phases/communities.d.ts +34 -0
- package/dist/pipeline/phases/communities.d.ts.map +1 -0
- package/dist/pipeline/phases/communities.js +412 -0
- package/dist/pipeline/phases/communities.js.map +1 -0
- package/dist/pipeline/phases/complexity.d.ts +50 -0
- package/dist/pipeline/phases/complexity.d.ts.map +1 -0
- package/dist/pipeline/phases/complexity.js +794 -0
- package/dist/pipeline/phases/complexity.js.map +1 -0
- package/dist/pipeline/phases/confidence-demote.d.ts +23 -0
- package/dist/pipeline/phases/confidence-demote.d.ts.map +1 -0
- package/dist/pipeline/phases/confidence-demote.js +113 -0
- package/dist/pipeline/phases/confidence-demote.js.map +1 -0
- package/dist/pipeline/phases/content-cache.d.ts +166 -0
- package/dist/pipeline/phases/content-cache.d.ts.map +1 -0
- package/dist/pipeline/phases/content-cache.js +323 -0
- package/dist/pipeline/phases/content-cache.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts +25 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.js +139 -0
- package/dist/pipeline/phases/coverage-parsers/cobertura.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts +25 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.js +51 -0
- package/dist/pipeline/phases/coverage-parsers/coverage-py.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts +32 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.js +98 -0
- package/dist/pipeline/phases/coverage-parsers/jacoco.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.d.ts +21 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.js +104 -0
- package/dist/pipeline/phases/coverage-parsers/lcov.js.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/types.d.ts +27 -0
- package/dist/pipeline/phases/coverage-parsers/types.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage-parsers/types.js +39 -0
- package/dist/pipeline/phases/coverage-parsers/types.js.map +1 -0
- package/dist/pipeline/phases/coverage.d.ts +39 -0
- package/dist/pipeline/phases/coverage.d.ts.map +1 -0
- package/dist/pipeline/phases/coverage.js +154 -0
- package/dist/pipeline/phases/coverage.js.map +1 -0
- package/dist/pipeline/phases/cross-file.d.ts +40 -0
- package/dist/pipeline/phases/cross-file.d.ts.map +1 -0
- package/dist/pipeline/phases/cross-file.js +411 -0
- package/dist/pipeline/phases/cross-file.js.map +1 -0
- package/dist/pipeline/phases/dead-code.d.ts +28 -0
- package/dist/pipeline/phases/dead-code.d.ts.map +1 -0
- package/dist/pipeline/phases/dead-code.js +157 -0
- package/dist/pipeline/phases/dead-code.js.map +1 -0
- package/dist/pipeline/phases/default-set.d.ts +24 -0
- package/dist/pipeline/phases/default-set.d.ts.map +1 -0
- package/dist/pipeline/phases/default-set.js +133 -0
- package/dist/pipeline/phases/default-set.js.map +1 -0
- package/dist/pipeline/phases/dependencies.d.ts +59 -0
- package/dist/pipeline/phases/dependencies.d.ts.map +1 -0
- package/dist/pipeline/phases/dependencies.js +281 -0
- package/dist/pipeline/phases/dependencies.js.map +1 -0
- package/dist/pipeline/phases/embedder-pool.d.ts +31 -0
- package/dist/pipeline/phases/embedder-pool.d.ts.map +1 -0
- package/dist/pipeline/phases/embedder-pool.js +79 -0
- package/dist/pipeline/phases/embedder-pool.js.map +1 -0
- package/dist/pipeline/phases/embedder-worker.d.ts +28 -0
- package/dist/pipeline/phases/embedder-worker.d.ts.map +1 -0
- package/dist/pipeline/phases/embedder-worker.js +43 -0
- package/dist/pipeline/phases/embedder-worker.js.map +1 -0
- package/dist/pipeline/phases/embeddings.d.ts +117 -0
- package/dist/pipeline/phases/embeddings.d.ts.map +1 -0
- package/dist/pipeline/phases/embeddings.js +697 -0
- package/dist/pipeline/phases/embeddings.js.map +1 -0
- package/dist/pipeline/phases/fetches.d.ts +47 -0
- package/dist/pipeline/phases/fetches.d.ts.map +1 -0
- package/dist/pipeline/phases/fetches.js +207 -0
- package/dist/pipeline/phases/fetches.js.map +1 -0
- package/dist/pipeline/phases/incremental-helper.d.ts +96 -0
- package/dist/pipeline/phases/incremental-helper.d.ts.map +1 -0
- package/dist/pipeline/phases/incremental-helper.js +125 -0
- package/dist/pipeline/phases/incremental-helper.js.map +1 -0
- package/dist/pipeline/phases/incremental-scope.d.ts +67 -0
- package/dist/pipeline/phases/incremental-scope.d.ts.map +1 -0
- package/dist/pipeline/phases/incremental-scope.js +225 -0
- package/dist/pipeline/phases/incremental-scope.js.map +1 -0
- package/dist/pipeline/phases/markdown.d.ts +29 -0
- package/dist/pipeline/phases/markdown.d.ts.map +1 -0
- package/dist/pipeline/phases/markdown.js +298 -0
- package/dist/pipeline/phases/markdown.js.map +1 -0
- package/dist/pipeline/phases/mro.d.ts +24 -0
- package/dist/pipeline/phases/mro.d.ts.map +1 -0
- package/dist/pipeline/phases/mro.js +303 -0
- package/dist/pipeline/phases/mro.js.map +1 -0
- package/dist/pipeline/phases/openapi.d.ts +52 -0
- package/dist/pipeline/phases/openapi.d.ts.map +1 -0
- package/dist/pipeline/phases/openapi.js +285 -0
- package/dist/pipeline/phases/openapi.js.map +1 -0
- package/dist/pipeline/phases/orm.d.ts +26 -0
- package/dist/pipeline/phases/orm.d.ts.map +1 -0
- package/dist/pipeline/phases/orm.js +183 -0
- package/dist/pipeline/phases/orm.js.map +1 -0
- package/dist/pipeline/phases/ownership.d.ts +88 -0
- package/dist/pipeline/phases/ownership.d.ts.map +1 -0
- package/dist/pipeline/phases/ownership.js +479 -0
- package/dist/pipeline/phases/ownership.js.map +1 -0
- package/dist/pipeline/phases/parse.d.ts +63 -0
- package/dist/pipeline/phases/parse.d.ts.map +1 -0
- package/dist/pipeline/phases/parse.js +994 -0
- package/dist/pipeline/phases/parse.js.map +1 -0
- package/dist/pipeline/phases/processes.d.ts +47 -0
- package/dist/pipeline/phases/processes.d.ts.map +1 -0
- package/dist/pipeline/phases/processes.js +620 -0
- package/dist/pipeline/phases/processes.js.map +1 -0
- package/dist/pipeline/phases/profile.d.ts +33 -0
- package/dist/pipeline/phases/profile.d.ts.map +1 -0
- package/dist/pipeline/phases/profile.js +91 -0
- package/dist/pipeline/phases/profile.js.map +1 -0
- package/dist/pipeline/phases/repo-node.d.ts +112 -0
- package/dist/pipeline/phases/repo-node.d.ts.map +1 -0
- package/dist/pipeline/phases/repo-node.js +272 -0
- package/dist/pipeline/phases/repo-node.js.map +1 -0
- package/dist/pipeline/phases/risk-snapshot.d.ts +34 -0
- package/dist/pipeline/phases/risk-snapshot.d.ts.map +1 -0
- package/dist/pipeline/phases/risk-snapshot.js +63 -0
- package/dist/pipeline/phases/risk-snapshot.js.map +1 -0
- package/dist/pipeline/phases/routes.d.ts +31 -0
- package/dist/pipeline/phases/routes.d.ts.map +1 -0
- package/dist/pipeline/phases/routes.js +262 -0
- package/dist/pipeline/phases/routes.js.map +1 -0
- package/dist/pipeline/phases/sbom.d.ts +45 -0
- package/dist/pipeline/phases/sbom.d.ts.map +1 -0
- package/dist/pipeline/phases/sbom.js +289 -0
- package/dist/pipeline/phases/sbom.js.map +1 -0
- package/dist/pipeline/phases/scan.d.ts +54 -0
- package/dist/pipeline/phases/scan.d.ts.map +1 -0
- package/dist/pipeline/phases/scan.js +340 -0
- package/dist/pipeline/phases/scan.js.map +1 -0
- package/dist/pipeline/phases/scip-index.d.ts +54 -0
- package/dist/pipeline/phases/scip-index.d.ts.map +1 -0
- package/dist/pipeline/phases/scip-index.js +469 -0
- package/dist/pipeline/phases/scip-index.js.map +1 -0
- package/dist/pipeline/phases/structure.d.ts +21 -0
- package/dist/pipeline/phases/structure.d.ts.map +1 -0
- package/dist/pipeline/phases/structure.js +115 -0
- package/dist/pipeline/phases/structure.js.map +1 -0
- package/dist/pipeline/phases/summarize.d.ts +126 -0
- package/dist/pipeline/phases/summarize.d.ts.map +1 -0
- package/dist/pipeline/phases/summarize.js +401 -0
- package/dist/pipeline/phases/summarize.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts +42 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.js +96 -0
- package/dist/pipeline/phases/temporal-helpers/branch-divergence.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts +22 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.js +32 -0
- package/dist/pipeline/phases/temporal-helpers/churn-decay.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts +21 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.js +37 -0
- package/dist/pipeline/phases/temporal-helpers/conventional-commits.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/gini.d.ts +32 -0
- package/dist/pipeline/phases/temporal-helpers/gini.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/gini.js +78 -0
- package/dist/pipeline/phases/temporal-helpers/gini.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts +14 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.js +25 -0
- package/dist/pipeline/phases/temporal-helpers/revert-detect.js.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts +18 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.js +119 -0
- package/dist/pipeline/phases/temporal-helpers/test-pair.js.map +1 -0
- package/dist/pipeline/phases/temporal.d.ts +65 -0
- package/dist/pipeline/phases/temporal.d.ts.map +1 -0
- package/dist/pipeline/phases/temporal.js +621 -0
- package/dist/pipeline/phases/temporal.js.map +1 -0
- package/dist/pipeline/phases/tools.d.ts +21 -0
- package/dist/pipeline/phases/tools.d.ts.map +1 -0
- package/dist/pipeline/phases/tools.js +118 -0
- package/dist/pipeline/phases/tools.js.map +1 -0
- package/dist/pipeline/profile-detectors/api-contracts.d.ts +18 -0
- package/dist/pipeline/profile-detectors/api-contracts.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/api-contracts.js +78 -0
- package/dist/pipeline/profile-detectors/api-contracts.js.map +1 -0
- package/dist/pipeline/profile-detectors/framework-detector.d.ts +11 -0
- package/dist/pipeline/profile-detectors/framework-detector.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/framework-detector.js +11 -0
- package/dist/pipeline/profile-detectors/framework-detector.js.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts +7 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.js +7 -0
- package/dist/pipeline/profile-detectors/frameworks-catalog.js.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks.d.ts +7 -0
- package/dist/pipeline/profile-detectors/frameworks.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/frameworks.js +7 -0
- package/dist/pipeline/profile-detectors/frameworks.js.map +1 -0
- package/dist/pipeline/profile-detectors/iac.d.ts +22 -0
- package/dist/pipeline/profile-detectors/iac.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/iac.js +97 -0
- package/dist/pipeline/profile-detectors/iac.js.map +1 -0
- package/dist/pipeline/profile-detectors/languages.d.ts +18 -0
- package/dist/pipeline/profile-detectors/languages.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/languages.js +60 -0
- package/dist/pipeline/profile-detectors/languages.js.map +1 -0
- package/dist/pipeline/profile-detectors/manifests.d.ts +7 -0
- package/dist/pipeline/profile-detectors/manifests.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/manifests.js +7 -0
- package/dist/pipeline/profile-detectors/manifests.js.map +1 -0
- package/dist/pipeline/profile-detectors/src-dirs.d.ts +17 -0
- package/dist/pipeline/profile-detectors/src-dirs.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/src-dirs.js +89 -0
- package/dist/pipeline/profile-detectors/src-dirs.js.map +1 -0
- package/dist/pipeline/profile-detectors/variant-detectors.d.ts +7 -0
- package/dist/pipeline/profile-detectors/variant-detectors.d.ts.map +1 -0
- package/dist/pipeline/profile-detectors/variant-detectors.js +7 -0
- package/dist/pipeline/profile-detectors/variant-detectors.js.map +1 -0
- package/dist/pipeline/runner.d.ts +54 -0
- package/dist/pipeline/runner.d.ts.map +1 -0
- package/dist/pipeline/runner.js +247 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pipeline/types.d.ts +235 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +15 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/providers/c.d.ts +3 -0
- package/dist/providers/c.d.ts.map +1 -0
- package/dist/providers/c.js +162 -0
- package/dist/providers/c.js.map +1 -0
- package/dist/providers/cobol.d.ts +19 -0
- package/dist/providers/cobol.d.ts.map +1 -0
- package/dist/providers/cobol.js +44 -0
- package/dist/providers/cobol.js.map +1 -0
- package/dist/providers/cpp.d.ts +3 -0
- package/dist/providers/cpp.d.ts.map +1 -0
- package/dist/providers/cpp.js +200 -0
- package/dist/providers/cpp.js.map +1 -0
- package/dist/providers/csharp.d.ts +3 -0
- package/dist/providers/csharp.d.ts.map +1 -0
- package/dist/providers/csharp.js +292 -0
- package/dist/providers/csharp.js.map +1 -0
- package/dist/providers/dart.d.ts +3 -0
- package/dist/providers/dart.d.ts.map +1 -0
- package/dist/providers/dart.js +214 -0
- package/dist/providers/dart.js.map +1 -0
- package/dist/providers/definition-ids.d.ts +18 -0
- package/dist/providers/definition-ids.d.ts.map +1 -0
- package/dist/providers/definition-ids.js +23 -0
- package/dist/providers/definition-ids.js.map +1 -0
- package/dist/providers/extract-helpers.d.ts +60 -0
- package/dist/providers/extract-helpers.d.ts.map +1 -0
- package/dist/providers/extract-helpers.js +296 -0
- package/dist/providers/extract-helpers.js.map +1 -0
- package/dist/providers/extraction-types.d.ts +85 -0
- package/dist/providers/extraction-types.d.ts.map +1 -0
- package/dist/providers/extraction-types.js +13 -0
- package/dist/providers/extraction-types.js.map +1 -0
- package/dist/providers/go.d.ts +3 -0
- package/dist/providers/go.d.ts.map +1 -0
- package/dist/providers/go.js +359 -0
- package/dist/providers/go.js.map +1 -0
- package/dist/providers/http-detect.d.ts +44 -0
- package/dist/providers/http-detect.d.ts.map +1 -0
- package/dist/providers/http-detect.js +307 -0
- package/dist/providers/http-detect.js.map +1 -0
- package/dist/providers/index.d.ts +38 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +33 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/java.d.ts +3 -0
- package/dist/providers/java.d.ts.map +1 -0
- package/dist/providers/java.js +259 -0
- package/dist/providers/java.js.map +1 -0
- package/dist/providers/javascript.d.ts +3 -0
- package/dist/providers/javascript.d.ts.map +1 -0
- package/dist/providers/javascript.js +139 -0
- package/dist/providers/javascript.js.map +1 -0
- package/dist/providers/kotlin.d.ts +3 -0
- package/dist/providers/kotlin.d.ts.map +1 -0
- package/dist/providers/kotlin.js +175 -0
- package/dist/providers/kotlin.js.map +1 -0
- package/dist/providers/php.d.ts +3 -0
- package/dist/providers/php.d.ts.map +1 -0
- package/dist/providers/php.js +218 -0
- package/dist/providers/php.js.map +1 -0
- package/dist/providers/python-accesses.d.ts +9 -0
- package/dist/providers/python-accesses.d.ts.map +1 -0
- package/dist/providers/python-accesses.js +22 -0
- package/dist/providers/python-accesses.js.map +1 -0
- package/dist/providers/python.d.ts +3 -0
- package/dist/providers/python.d.ts.map +1 -0
- package/dist/providers/python.js +323 -0
- package/dist/providers/python.js.map +1 -0
- package/dist/providers/registry.d.ts +4 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +46 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resolution/c3.d.ts +6 -0
- package/dist/providers/resolution/c3.d.ts.map +1 -0
- package/dist/providers/resolution/c3.js +76 -0
- package/dist/providers/resolution/c3.js.map +1 -0
- package/dist/providers/resolution/context.d.ts +38 -0
- package/dist/providers/resolution/context.d.ts.map +1 -0
- package/dist/providers/resolution/context.js +45 -0
- package/dist/providers/resolution/context.js.map +1 -0
- package/dist/providers/resolution/first-wins.d.ts +3 -0
- package/dist/providers/resolution/first-wins.d.ts.map +1 -0
- package/dist/providers/resolution/first-wins.js +27 -0
- package/dist/providers/resolution/first-wins.js.map +1 -0
- package/dist/providers/resolution/mro.d.ts +16 -0
- package/dist/providers/resolution/mro.d.ts.map +1 -0
- package/dist/providers/resolution/mro.js +14 -0
- package/dist/providers/resolution/mro.js.map +1 -0
- package/dist/providers/resolution/none.d.ts +3 -0
- package/dist/providers/resolution/none.d.ts.map +1 -0
- package/dist/providers/resolution/none.js +11 -0
- package/dist/providers/resolution/none.js.map +1 -0
- package/dist/providers/resolution/python-all-filter.d.ts +25 -0
- package/dist/providers/resolution/python-all-filter.d.ts.map +1 -0
- package/dist/providers/resolution/python-all-filter.js +64 -0
- package/dist/providers/resolution/python-all-filter.js.map +1 -0
- package/dist/providers/resolution/resolver-strategy.d.ts +42 -0
- package/dist/providers/resolution/resolver-strategy.d.ts.map +1 -0
- package/dist/providers/resolution/resolver-strategy.js +50 -0
- package/dist/providers/resolution/resolver-strategy.js.map +1 -0
- package/dist/providers/resolution/single-inheritance.d.ts +3 -0
- package/dist/providers/resolution/single-inheritance.d.ts.map +1 -0
- package/dist/providers/resolution/single-inheritance.js +21 -0
- package/dist/providers/resolution/single-inheritance.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts +16 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js +50 -0
- package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/glue.d.ts +15 -0
- package/dist/providers/resolution/stack-graphs/glue.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/glue.js +44 -0
- package/dist/providers/resolution/stack-graphs/glue.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts +30 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.js +366 -0
- package/dist/providers/resolution/stack-graphs/node-edge-builder.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts +9 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.js +152 -0
- package/dist/providers/resolution/stack-graphs/partial-path-engine.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.d.ts +11 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.js +247 -0
- package/dist/providers/resolution/stack-graphs/rule-parser.js.map +1 -0
- package/dist/providers/resolution/stack-graphs/types.d.ts +93 -0
- package/dist/providers/resolution/stack-graphs/types.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs/types.js +11 -0
- package/dist/providers/resolution/stack-graphs/types.js.map +1 -0
- package/dist/providers/resolution/stack-graphs-python.d.ts +27 -0
- package/dist/providers/resolution/stack-graphs-python.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs-python.js +104 -0
- package/dist/providers/resolution/stack-graphs-python.js.map +1 -0
- package/dist/providers/resolution/stack-graphs-ts.d.ts +134 -0
- package/dist/providers/resolution/stack-graphs-ts.d.ts.map +1 -0
- package/dist/providers/resolution/stack-graphs-ts.js +372 -0
- package/dist/providers/resolution/stack-graphs-ts.js.map +1 -0
- package/dist/providers/ruby.d.ts +3 -0
- package/dist/providers/ruby.d.ts.map +1 -0
- package/dist/providers/ruby.js +259 -0
- package/dist/providers/ruby.js.map +1 -0
- package/dist/providers/rust.d.ts +3 -0
- package/dist/providers/rust.d.ts.map +1 -0
- package/dist/providers/rust.js +318 -0
- package/dist/providers/rust.js.map +1 -0
- package/dist/providers/swift.d.ts +3 -0
- package/dist/providers/swift.d.ts.map +1 -0
- package/dist/providers/swift.js +177 -0
- package/dist/providers/swift.js.map +1 -0
- package/dist/providers/test-helpers.d.ts +24 -0
- package/dist/providers/test-helpers.d.ts.map +1 -0
- package/dist/providers/test-helpers.js +33 -0
- package/dist/providers/test-helpers.js.map +1 -0
- package/dist/providers/ts-shared.d.ts +30 -0
- package/dist/providers/ts-shared.d.ts.map +1 -0
- package/dist/providers/ts-shared.js +328 -0
- package/dist/providers/ts-shared.js.map +1 -0
- package/dist/providers/tsx.d.ts +7 -0
- package/dist/providers/tsx.d.ts.map +1 -0
- package/dist/providers/tsx.js +79 -0
- package/dist/providers/tsx.js.map +1 -0
- package/dist/providers/types.d.ts +166 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +7 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/typescript-family-accesses.d.ts +14 -0
- package/dist/providers/typescript-family-accesses.d.ts.map +1 -0
- package/dist/providers/typescript-family-accesses.js +27 -0
- package/dist/providers/typescript-family-accesses.js.map +1 -0
- package/dist/providers/typescript.d.ts +9 -0
- package/dist/providers/typescript.d.ts.map +1 -0
- package/dist/providers/typescript.js +84 -0
- package/dist/providers/typescript.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-file phase — upgrade low-confidence CALLS edges after every file
|
|
3
|
+
* has contributed its exports.
|
|
4
|
+
*
|
|
5
|
+
* At parse time every call site is resolved through the three-tier
|
|
6
|
+
* {@link resolve} helper (same-file → import-scoped → global). A call that
|
|
7
|
+
* only matches at the global tier is emitted with confidence 0.5 because we
|
|
8
|
+
* cannot prove which declaration the call targets. Once the whole repo has
|
|
9
|
+
* been parsed we can do better: if the caller file imports a module that
|
|
10
|
+
* now exports a matching identifier, the call is *import-scoped* in
|
|
11
|
+
* hindsight and deserves confidence 0.9.
|
|
12
|
+
*
|
|
13
|
+
* Strategy:
|
|
14
|
+
* 1. Build a directed import graph of repository files (skip external npm
|
|
15
|
+
* specifiers — they were already dropped at parse time).
|
|
16
|
+
* 2. Run Tarjan's SCC algorithm on that graph. Circular imports collapse
|
|
17
|
+
* into a single component; we still visit every file in a component.
|
|
18
|
+
* 3. Topologically sort the condensation so dependencies of file F are
|
|
19
|
+
* processed before F. Inside a component, order by filename for
|
|
20
|
+
* determinism.
|
|
21
|
+
* 4. For each file, walk every low-confidence (0.5) CALLS edge. Re-run
|
|
22
|
+
* the resolution strategy with the symbol index. If it now produces a
|
|
23
|
+
* higher-tier candidate, re-add the edge with the better confidence;
|
|
24
|
+
* the graph's dedupe keeps the stronger edge.
|
|
25
|
+
*
|
|
26
|
+
* Determinism: SCC discovery order is driven by sorted file iteration, and
|
|
27
|
+
* condensation order is produced by Kahn's algorithm with a lexical tie
|
|
28
|
+
* break. Two runs on the same repo produce identical edge upgrades.
|
|
29
|
+
*/
|
|
30
|
+
import { makeNodeId } from "@opencodehub/core-types";
|
|
31
|
+
import { getProvider } from "../../providers/registry.js";
|
|
32
|
+
import { CONFIDENCE_BY_TIER, resolve, } from "../../providers/resolution/context.js";
|
|
33
|
+
import { buildFilePathLookup, partitionPriorEdges, resolveIncrementalView, } from "./incremental-helper.js";
|
|
34
|
+
import { INCREMENTAL_SCOPE_PHASE_NAME } from "./incremental-scope.js";
|
|
35
|
+
import { ORM_PHASE_NAME } from "./orm.js";
|
|
36
|
+
import { PARSE_PHASE_NAME } from "./parse.js";
|
|
37
|
+
import { ROUTES_PHASE_NAME } from "./routes.js";
|
|
38
|
+
import { TOOLS_PHASE_NAME } from "./tools.js";
|
|
39
|
+
export const CROSS_FILE_PHASE_NAME = "crossFile";
|
|
40
|
+
export const crossFilePhase = {
|
|
41
|
+
name: CROSS_FILE_PHASE_NAME,
|
|
42
|
+
deps: [
|
|
43
|
+
PARSE_PHASE_NAME,
|
|
44
|
+
ROUTES_PHASE_NAME,
|
|
45
|
+
TOOLS_PHASE_NAME,
|
|
46
|
+
ORM_PHASE_NAME,
|
|
47
|
+
INCREMENTAL_SCOPE_PHASE_NAME,
|
|
48
|
+
],
|
|
49
|
+
async run(ctx, deps) {
|
|
50
|
+
const parse = deps.get(PARSE_PHASE_NAME);
|
|
51
|
+
if (parse === undefined) {
|
|
52
|
+
throw new Error("crossFile: parse output missing from dependency map");
|
|
53
|
+
}
|
|
54
|
+
return runCrossFile(ctx, parse);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
function runCrossFile(ctx, parse) {
|
|
58
|
+
// ---- 0. : incremental-scope carry-forward. --------------------
|
|
59
|
+
//
|
|
60
|
+
// When the incremental view is active we first splat every prior-graph
|
|
61
|
+
// CALLS upgrade whose endpoints both live OUTSIDE the current closure
|
|
62
|
+
// into `ctx.graph`. The post-parse graph already carries the 0.5-tier
|
|
63
|
+
// CALLS; replaying the prior cross-file upgrades lets us skip work for
|
|
64
|
+
// non-closure files while keeping the final edge set byte-identical to
|
|
65
|
+
// a full run at the same commit. Determinism gate: see
|
|
66
|
+
// `packages/ingestion/src/pipeline/incremental-determinism.test.ts`.
|
|
67
|
+
const view = resolveIncrementalView(ctx);
|
|
68
|
+
if (view.active &&
|
|
69
|
+
view.previousGraph?.edges !== undefined &&
|
|
70
|
+
view.previousGraph.nodes !== undefined) {
|
|
71
|
+
const filePathByNodeId = buildFilePathLookup(view.previousGraph.nodes);
|
|
72
|
+
const carried = partitionPriorEdges(view.previousGraph.edges, filePathByNodeId, view.closure, new Set(["CALLS"]));
|
|
73
|
+
for (const e of carried) {
|
|
74
|
+
if (e.confidence <= CONFIDENCE_BY_TIER.global)
|
|
75
|
+
continue;
|
|
76
|
+
ctx.graph.addEdge({
|
|
77
|
+
from: e.from,
|
|
78
|
+
to: e.to,
|
|
79
|
+
type: e.type,
|
|
80
|
+
confidence: e.confidence,
|
|
81
|
+
...(e.reason !== undefined ? { reason: e.reason } : {}),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ---- 1. Build the import graph restricted to files we actually parsed. -
|
|
86
|
+
// In incremental mode we narrow the SCC+upgrade walk to closure files;
|
|
87
|
+
// the carry-forward above covers the non-closure tail.
|
|
88
|
+
const parsedFiles = view.active
|
|
89
|
+
? [...parse.definitionsByFile.keys()].filter((f) => view.closure.has(f)).sort()
|
|
90
|
+
: [...parse.definitionsByFile.keys()].sort();
|
|
91
|
+
const parsedSet = new Set(parsedFiles);
|
|
92
|
+
const adjacency = new Map();
|
|
93
|
+
for (const f of parsedFiles)
|
|
94
|
+
adjacency.set(f, []);
|
|
95
|
+
// Walk the graph's IMPORTS edges — they were already resolved to in-repo
|
|
96
|
+
// File nodes at parse time, so we get the import graph for free without
|
|
97
|
+
// re-running path resolution.
|
|
98
|
+
for (const edge of ctx.graph.edges()) {
|
|
99
|
+
if (edge.type !== "IMPORTS")
|
|
100
|
+
continue;
|
|
101
|
+
const from = nodeIdToFilePath(edge.from);
|
|
102
|
+
const to = nodeIdToFilePath(edge.to);
|
|
103
|
+
if (from === undefined || to === undefined)
|
|
104
|
+
continue;
|
|
105
|
+
if (!parsedSet.has(from) || !parsedSet.has(to))
|
|
106
|
+
continue;
|
|
107
|
+
const list = adjacency.get(from);
|
|
108
|
+
if (list !== undefined && !list.includes(to))
|
|
109
|
+
list.push(to);
|
|
110
|
+
}
|
|
111
|
+
for (const [n, list] of adjacency) {
|
|
112
|
+
list.sort();
|
|
113
|
+
adjacency.set(n, list);
|
|
114
|
+
}
|
|
115
|
+
// ---- 2. Tarjan SCC on the import graph. -------------------------------
|
|
116
|
+
const sccs = tarjanScc(parsedFiles, adjacency);
|
|
117
|
+
const sccIndex = new Map();
|
|
118
|
+
sccs.forEach((members, i) => {
|
|
119
|
+
for (const m of members)
|
|
120
|
+
sccIndex.set(m, i);
|
|
121
|
+
});
|
|
122
|
+
// ---- 3. Kahn topo-sort over the condensation. -------------------------
|
|
123
|
+
const condensationAdj = new Map();
|
|
124
|
+
for (let i = 0; i < sccs.length; i++)
|
|
125
|
+
condensationAdj.set(i, new Set());
|
|
126
|
+
for (const [from, neighbors] of adjacency) {
|
|
127
|
+
const fi = sccIndex.get(from);
|
|
128
|
+
if (fi === undefined)
|
|
129
|
+
continue;
|
|
130
|
+
for (const to of neighbors) {
|
|
131
|
+
const ti = sccIndex.get(to);
|
|
132
|
+
if (ti === undefined || ti === fi)
|
|
133
|
+
continue;
|
|
134
|
+
condensationAdj.get(fi)?.add(ti);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const condensationOrder = kahnCondensation(condensationAdj);
|
|
138
|
+
// ---- 4. Process files in SCC-topo order; inside a component, by name. -
|
|
139
|
+
let upgradedCallsCount = 0;
|
|
140
|
+
let unresolvedRemaining = 0;
|
|
141
|
+
const largeSccs = [];
|
|
142
|
+
for (const idx of condensationOrder) {
|
|
143
|
+
const members = sccs[idx];
|
|
144
|
+
if (members === undefined)
|
|
145
|
+
continue;
|
|
146
|
+
if (members.length > 5) {
|
|
147
|
+
// Name the component by its lexicographically smallest member for a
|
|
148
|
+
// stable identifier across runs.
|
|
149
|
+
const smallest = [...members].sort()[0];
|
|
150
|
+
if (smallest !== undefined)
|
|
151
|
+
largeSccs.push(smallest);
|
|
152
|
+
}
|
|
153
|
+
const sortedMembers = [...members].sort();
|
|
154
|
+
for (const filePath of sortedMembers) {
|
|
155
|
+
const upgraded = reresolveCallsForFile(ctx, parse.symbolIndex, parse, filePath);
|
|
156
|
+
upgradedCallsCount += upgraded.upgraded;
|
|
157
|
+
unresolvedRemaining += upgraded.stillUnresolved;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
upgradedCallsCount,
|
|
162
|
+
unresolvedRemaining,
|
|
163
|
+
sccCount: sccs.length,
|
|
164
|
+
largeSccs,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function reresolveCallsForFile(ctx, symbolIndex, parse, filePath) {
|
|
168
|
+
// We compare against the edges already emitted at parse time: pick only
|
|
169
|
+
// CALLS edges whose source file matches `filePath` and whose confidence
|
|
170
|
+
// is capped at the global tier (0.5). Anything higher is already as
|
|
171
|
+
// strong as we can make it.
|
|
172
|
+
const defs = parse.definitionsByFile.get(filePath) ?? [];
|
|
173
|
+
const calls = parse.callsByFile.get(filePath) ?? [];
|
|
174
|
+
if (calls.length === 0)
|
|
175
|
+
return { upgraded: 0, stillUnresolved: 0 };
|
|
176
|
+
// Build a quick lookup from qualified name → current definition's id so we
|
|
177
|
+
// can re-derive the caller id without walking the whole graph per call.
|
|
178
|
+
const callerIdByQualifiedName = new Map();
|
|
179
|
+
for (const d of defs) {
|
|
180
|
+
const id = makeNodeId(d.kind, d.filePath, d.qualifiedName, {
|
|
181
|
+
...(d.parameterCount !== undefined ? { parameterCount: d.parameterCount } : {}),
|
|
182
|
+
...(d.parameterTypes !== undefined ? { parameterTypes: d.parameterTypes } : {}),
|
|
183
|
+
...(d.isConst !== undefined ? { isConst: d.isConst } : {}),
|
|
184
|
+
});
|
|
185
|
+
callerIdByQualifiedName.set(d.qualifiedName, id);
|
|
186
|
+
}
|
|
187
|
+
const fileNodeId = makeNodeId("File", filePath, filePath);
|
|
188
|
+
const language = parse.definitionsByFile.has(filePath)
|
|
189
|
+
? inferLanguageFromFile(filePath)
|
|
190
|
+
: undefined;
|
|
191
|
+
if (language === undefined)
|
|
192
|
+
return { upgraded: 0, stillUnresolved: 0 };
|
|
193
|
+
const provider = getProvider(language);
|
|
194
|
+
let upgraded = 0;
|
|
195
|
+
let stillUnresolved = 0;
|
|
196
|
+
for (const call of calls) {
|
|
197
|
+
const callerId = call.callerQualifiedName === "<module>"
|
|
198
|
+
? fileNodeId
|
|
199
|
+
: callerIdByQualifiedName.get(call.callerQualifiedName);
|
|
200
|
+
if (callerId === undefined)
|
|
201
|
+
continue;
|
|
202
|
+
const candidates = resolve({ callerFile: filePath, calleeName: call.calleeName, provider }, symbolIndex);
|
|
203
|
+
const first = candidates[0];
|
|
204
|
+
if (first === undefined) {
|
|
205
|
+
stillUnresolved += 1;
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
// Only upgrade when the resolved tier is above the global floor.
|
|
209
|
+
if (first.confidence > CONFIDENCE_BY_TIER.global) {
|
|
210
|
+
ctx.graph.addEdge({
|
|
211
|
+
from: callerId,
|
|
212
|
+
to: first.targetId,
|
|
213
|
+
type: "CALLS",
|
|
214
|
+
confidence: first.confidence,
|
|
215
|
+
reason: `cross-file-${first.tier}`,
|
|
216
|
+
});
|
|
217
|
+
upgraded += 1;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return { upgraded, stillUnresolved };
|
|
221
|
+
}
|
|
222
|
+
function inferLanguageFromFile(filePath) {
|
|
223
|
+
const idx = filePath.lastIndexOf(".");
|
|
224
|
+
if (idx < 0)
|
|
225
|
+
return undefined;
|
|
226
|
+
const ext = filePath.slice(idx).toLowerCase();
|
|
227
|
+
switch (ext) {
|
|
228
|
+
case ".ts":
|
|
229
|
+
case ".mts":
|
|
230
|
+
case ".cts":
|
|
231
|
+
return "typescript";
|
|
232
|
+
case ".tsx":
|
|
233
|
+
return "tsx";
|
|
234
|
+
case ".js":
|
|
235
|
+
case ".mjs":
|
|
236
|
+
case ".cjs":
|
|
237
|
+
case ".jsx":
|
|
238
|
+
return "javascript";
|
|
239
|
+
case ".py":
|
|
240
|
+
case ".pyi":
|
|
241
|
+
return "python";
|
|
242
|
+
case ".go":
|
|
243
|
+
return "go";
|
|
244
|
+
case ".rs":
|
|
245
|
+
return "rust";
|
|
246
|
+
case ".java":
|
|
247
|
+
return "java";
|
|
248
|
+
case ".cs":
|
|
249
|
+
return "csharp";
|
|
250
|
+
case ".c":
|
|
251
|
+
case ".h":
|
|
252
|
+
// .h is ambiguous between C/C++; default to C. A dedicated C++ header
|
|
253
|
+
// detector can upgrade the classification later.
|
|
254
|
+
return "c";
|
|
255
|
+
case ".cpp":
|
|
256
|
+
case ".cc":
|
|
257
|
+
case ".cxx":
|
|
258
|
+
case ".hpp":
|
|
259
|
+
case ".hh":
|
|
260
|
+
case ".hxx":
|
|
261
|
+
return "cpp";
|
|
262
|
+
case ".rb":
|
|
263
|
+
return "ruby";
|
|
264
|
+
case ".kt":
|
|
265
|
+
case ".kts":
|
|
266
|
+
return "kotlin";
|
|
267
|
+
case ".swift":
|
|
268
|
+
return "swift";
|
|
269
|
+
case ".php":
|
|
270
|
+
case ".php3":
|
|
271
|
+
case ".php4":
|
|
272
|
+
case ".php5":
|
|
273
|
+
case ".php7":
|
|
274
|
+
case ".phtml":
|
|
275
|
+
return "php";
|
|
276
|
+
case ".dart":
|
|
277
|
+
return "dart";
|
|
278
|
+
default:
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Recover a File's relative path from a `File:<path>:<qn>` node id. Returns
|
|
284
|
+
* undefined for non-file ids.
|
|
285
|
+
*/
|
|
286
|
+
function nodeIdToFilePath(id) {
|
|
287
|
+
if (!id.startsWith("File:"))
|
|
288
|
+
return undefined;
|
|
289
|
+
const after = id.slice("File:".length);
|
|
290
|
+
// File ids are `File:<path>:<path>` — the qualifiedName equals the path.
|
|
291
|
+
// Splitting on the middle colon is robust even when the path contains
|
|
292
|
+
// colons on Windows (we normalize to POSIX at scan time).
|
|
293
|
+
const colonIdx = after.indexOf(":");
|
|
294
|
+
if (colonIdx < 0)
|
|
295
|
+
return after;
|
|
296
|
+
return after.slice(0, colonIdx);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Iterative Tarjan strongly-connected-components.
|
|
300
|
+
* Input: sorted `nodes` list + adjacency map with sorted neighbor lists.
|
|
301
|
+
* Output: array of SCCs; each SCC is the sorted list of its members.
|
|
302
|
+
* Components are emitted in the order Tarjan discovers them, which — given
|
|
303
|
+
* pre-sorted inputs — is deterministic.
|
|
304
|
+
*/
|
|
305
|
+
function tarjanScc(nodes, adjacency) {
|
|
306
|
+
const index = new Map();
|
|
307
|
+
const lowlink = new Map();
|
|
308
|
+
const onStack = new Set();
|
|
309
|
+
const stack = [];
|
|
310
|
+
let counter = 0;
|
|
311
|
+
const result = [];
|
|
312
|
+
// Iterative simulation so deep call chains don't blow the stack.
|
|
313
|
+
function strongConnect(start) {
|
|
314
|
+
const dfsStack = [{ node: start, it: 0 }];
|
|
315
|
+
index.set(start, counter);
|
|
316
|
+
lowlink.set(start, counter);
|
|
317
|
+
counter += 1;
|
|
318
|
+
stack.push(start);
|
|
319
|
+
onStack.add(start);
|
|
320
|
+
while (dfsStack.length > 0) {
|
|
321
|
+
const frame = dfsStack[dfsStack.length - 1];
|
|
322
|
+
if (frame === undefined)
|
|
323
|
+
break;
|
|
324
|
+
const neighbors = adjacency.get(frame.node) ?? [];
|
|
325
|
+
if (frame.it < neighbors.length) {
|
|
326
|
+
const next = neighbors[frame.it];
|
|
327
|
+
frame.it += 1;
|
|
328
|
+
if (!index.has(next)) {
|
|
329
|
+
index.set(next, counter);
|
|
330
|
+
lowlink.set(next, counter);
|
|
331
|
+
counter += 1;
|
|
332
|
+
stack.push(next);
|
|
333
|
+
onStack.add(next);
|
|
334
|
+
dfsStack.push({ node: next, it: 0 });
|
|
335
|
+
}
|
|
336
|
+
else if (onStack.has(next)) {
|
|
337
|
+
const cur = lowlink.get(frame.node) ?? 0;
|
|
338
|
+
const nxt = index.get(next) ?? 0;
|
|
339
|
+
lowlink.set(frame.node, Math.min(cur, nxt));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// Finished `frame.node`: propagate to parent and maybe emit a SCC.
|
|
344
|
+
const low = lowlink.get(frame.node) ?? 0;
|
|
345
|
+
const idx = index.get(frame.node) ?? 0;
|
|
346
|
+
if (low === idx) {
|
|
347
|
+
const component = [];
|
|
348
|
+
while (stack.length > 0) {
|
|
349
|
+
const w = stack.pop();
|
|
350
|
+
onStack.delete(w);
|
|
351
|
+
component.push(w);
|
|
352
|
+
if (w === frame.node)
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
component.sort();
|
|
356
|
+
result.push(component);
|
|
357
|
+
}
|
|
358
|
+
dfsStack.pop();
|
|
359
|
+
const parent = dfsStack[dfsStack.length - 1];
|
|
360
|
+
if (parent !== undefined) {
|
|
361
|
+
const parentLow = lowlink.get(parent.node) ?? 0;
|
|
362
|
+
const childLow = lowlink.get(frame.node) ?? 0;
|
|
363
|
+
lowlink.set(parent.node, Math.min(parentLow, childLow));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
for (const n of nodes) {
|
|
369
|
+
if (!index.has(n))
|
|
370
|
+
strongConnect(n);
|
|
371
|
+
}
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Kahn's algorithm on a condensation (DAG over SCC indices). Returns an
|
|
376
|
+
* ordering of SCC indices such that each component is emitted before any
|
|
377
|
+
* component that depends on it. Tiebreak: smaller index first (the index
|
|
378
|
+
* already corresponds to SCC discovery order, which is deterministic).
|
|
379
|
+
*/
|
|
380
|
+
function kahnCondensation(adj) {
|
|
381
|
+
const indeg = new Map();
|
|
382
|
+
for (const i of adj.keys())
|
|
383
|
+
indeg.set(i, 0);
|
|
384
|
+
for (const [, outs] of adj) {
|
|
385
|
+
for (const o of outs)
|
|
386
|
+
indeg.set(o, (indeg.get(o) ?? 0) + 1);
|
|
387
|
+
}
|
|
388
|
+
const ready = [];
|
|
389
|
+
for (const [i, d] of indeg)
|
|
390
|
+
if (d === 0)
|
|
391
|
+
ready.push(i);
|
|
392
|
+
ready.sort((a, b) => a - b);
|
|
393
|
+
const out = [];
|
|
394
|
+
while (ready.length > 0) {
|
|
395
|
+
const n = ready.shift();
|
|
396
|
+
out.push(n);
|
|
397
|
+
const outs = adj.get(n) ?? new Set();
|
|
398
|
+
for (const next of outs) {
|
|
399
|
+
const d = (indeg.get(next) ?? 1) - 1;
|
|
400
|
+
indeg.set(next, d);
|
|
401
|
+
if (d === 0) {
|
|
402
|
+
let i = 0;
|
|
403
|
+
while (i < ready.length && (ready[i] ?? 0) < next)
|
|
404
|
+
i += 1;
|
|
405
|
+
ready.splice(i, 0, next);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return out;
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=cross-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-file.js","sourceRoot":"","sources":["../../../src/pipeline/phases/cross-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead-code phase.
|
|
3
|
+
*
|
|
4
|
+
* Runs after cross-file resolution, MRO, and community clustering so every
|
|
5
|
+
* referrer edge and community membership is available. For each classifiable
|
|
6
|
+
* Symbol in the in-memory graph we compute one of three verdicts via
|
|
7
|
+
* `@opencodehub/analysis::classifyDeadnessInMemory`:
|
|
8
|
+
*
|
|
9
|
+
* - `live` — at least one inbound referrer exists.
|
|
10
|
+
* - `dead` — non-exported, no inbound referrers.
|
|
11
|
+
* - `unreachable-export` — exported but no cross-module referrer.
|
|
12
|
+
*
|
|
13
|
+
* The phase denormalises the verdict onto each callable / type node so the
|
|
14
|
+
* downstream persistence layer writes it to the `deadness` column, and
|
|
15
|
+
* emits a warning log for every community whose entire membership is
|
|
16
|
+
* non-live (a "ghost community").
|
|
17
|
+
*/
|
|
18
|
+
import type { PipelinePhase } from "../types.js";
|
|
19
|
+
export declare const DEAD_CODE_PHASE_NAME = "dead-code";
|
|
20
|
+
export interface DeadCodeOutput {
|
|
21
|
+
readonly classifiedCount: number;
|
|
22
|
+
readonly deadCount: number;
|
|
23
|
+
readonly unreachableExportCount: number;
|
|
24
|
+
readonly ghostCommunityCount: number;
|
|
25
|
+
readonly ghostCommunities: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
export declare const deadCodePhase: PipelinePhase<DeadCodeOutput>;
|
|
28
|
+
//# sourceMappingURL=dead-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/dead-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAElE,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAShD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,cAAc,CAMvD,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead-code phase.
|
|
3
|
+
*
|
|
4
|
+
* Runs after cross-file resolution, MRO, and community clustering so every
|
|
5
|
+
* referrer edge and community membership is available. For each classifiable
|
|
6
|
+
* Symbol in the in-memory graph we compute one of three verdicts via
|
|
7
|
+
* `@opencodehub/analysis::classifyDeadnessInMemory`:
|
|
8
|
+
*
|
|
9
|
+
* - `live` — at least one inbound referrer exists.
|
|
10
|
+
* - `dead` — non-exported, no inbound referrers.
|
|
11
|
+
* - `unreachable-export` — exported but no cross-module referrer.
|
|
12
|
+
*
|
|
13
|
+
* The phase denormalises the verdict onto each callable / type node so the
|
|
14
|
+
* downstream persistence layer writes it to the `deadness` column, and
|
|
15
|
+
* emits a warning log for every community whose entire membership is
|
|
16
|
+
* non-live (a "ghost community").
|
|
17
|
+
*/
|
|
18
|
+
import { classifyDeadnessInMemory, deadCodeReferrerRelations, deadCodeSymbolKinds, } from "@opencodehub/analysis";
|
|
19
|
+
export const DEAD_CODE_PHASE_NAME = "dead-code";
|
|
20
|
+
// Inline phase-name constants so this module stays independent of other
|
|
21
|
+
// phases' source files — keeps the DAG declaration self-contained and avoids
|
|
22
|
+
// dragging in unrelated modules when the phase is imported in isolation.
|
|
23
|
+
const CROSS_FILE_PHASE_NAME = "crossFile";
|
|
24
|
+
const MRO_PHASE_NAME = "mro";
|
|
25
|
+
const COMMUNITIES_PHASE_NAME = "communities";
|
|
26
|
+
export const deadCodePhase = {
|
|
27
|
+
name: DEAD_CODE_PHASE_NAME,
|
|
28
|
+
deps: [CROSS_FILE_PHASE_NAME, MRO_PHASE_NAME, COMMUNITIES_PHASE_NAME],
|
|
29
|
+
async run(ctx) {
|
|
30
|
+
return runDeadCode(ctx);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
function runDeadCode(ctx) {
|
|
34
|
+
const symbolKinds = deadCodeSymbolKinds();
|
|
35
|
+
const referrerTypes = new Set(deadCodeReferrerRelations());
|
|
36
|
+
// ---- 1. Project the in-memory graph into the analyzer's row shapes. ----
|
|
37
|
+
const symbols = [];
|
|
38
|
+
const filePathById = new Map();
|
|
39
|
+
for (const node of ctx.graph.nodes()) {
|
|
40
|
+
filePathById.set(node.id, node.filePath);
|
|
41
|
+
if (!symbolKinds.has(node.kind))
|
|
42
|
+
continue;
|
|
43
|
+
const located = node;
|
|
44
|
+
symbols.push({
|
|
45
|
+
id: node.id,
|
|
46
|
+
name: node.name,
|
|
47
|
+
kind: node.kind,
|
|
48
|
+
filePath: node.filePath,
|
|
49
|
+
startLine: typeof located.startLine === "number" ? located.startLine : 0,
|
|
50
|
+
isExported: located.isExported === true,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (symbols.length === 0) {
|
|
54
|
+
return {
|
|
55
|
+
classifiedCount: 0,
|
|
56
|
+
deadCount: 0,
|
|
57
|
+
unreachableExportCount: 0,
|
|
58
|
+
ghostCommunityCount: 0,
|
|
59
|
+
ghostCommunities: [],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const symbolIdSet = new Set(symbols.map((s) => s.id));
|
|
63
|
+
const referrers = [];
|
|
64
|
+
const memberships = [];
|
|
65
|
+
for (const edge of ctx.graph.edges()) {
|
|
66
|
+
const fromId = edge.from;
|
|
67
|
+
const toId = edge.to;
|
|
68
|
+
if (edge.type === "MEMBER_OF" && symbolIdSet.has(fromId)) {
|
|
69
|
+
memberships.push({ symbolId: fromId, communityId: toId });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!referrerTypes.has(edge.type))
|
|
73
|
+
continue;
|
|
74
|
+
if (!symbolIdSet.has(toId))
|
|
75
|
+
continue;
|
|
76
|
+
referrers.push({
|
|
77
|
+
targetId: toId,
|
|
78
|
+
sourceFile: filePathById.get(fromId) ?? "",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// ---- 2. Classify + denormalise onto each touched Symbol node. ----------
|
|
82
|
+
const result = classifyDeadnessInMemory(symbols, referrers, memberships);
|
|
83
|
+
for (const node of ctx.graph.nodes()) {
|
|
84
|
+
if (!symbolKinds.has(node.kind))
|
|
85
|
+
continue;
|
|
86
|
+
const verdict = result.symbols[node.id];
|
|
87
|
+
if (verdict === undefined)
|
|
88
|
+
continue;
|
|
89
|
+
ctx.graph.addNode(withDeadness(node, verdict));
|
|
90
|
+
}
|
|
91
|
+
// ---- 3. Emit a warning for each ghost community. -----------------------
|
|
92
|
+
//
|
|
93
|
+
// `result.ghostCommunities` catches two very different situations:
|
|
94
|
+
//
|
|
95
|
+
// (a) every member is truly `dead` — actual leaked code in an
|
|
96
|
+
// application. Worth surfacing.
|
|
97
|
+
// (b) every member is `unreachable-export` — a library's public surface.
|
|
98
|
+
// From this graph's internal view no local caller reaches them,
|
|
99
|
+
// but the whole point of an exported symbol is that *external*
|
|
100
|
+
// consumers do. On sdk-python this fired 110 times; on any
|
|
101
|
+
// library it is pure noise.
|
|
102
|
+
//
|
|
103
|
+
// We keep the classification on each node unchanged (so `deadness` still
|
|
104
|
+
// rides along), but only warn on (a). We also skip tiny singleton
|
|
105
|
+
// communities because a lone unreferenced symbol rarely rewards the
|
|
106
|
+
// reader's attention at ingest time — it will show up via `codehub
|
|
107
|
+
// verdict` or a targeted `impact` call instead.
|
|
108
|
+
const MIN_COMMUNITY_MEMBERS_FOR_WARNING = 2;
|
|
109
|
+
const membersByCommunity = new Map();
|
|
110
|
+
for (const m of memberships) {
|
|
111
|
+
const bucket = membersByCommunity.get(m.communityId);
|
|
112
|
+
if (bucket !== undefined)
|
|
113
|
+
bucket.push(m.symbolId);
|
|
114
|
+
else
|
|
115
|
+
membersByCommunity.set(m.communityId, [m.symbolId]);
|
|
116
|
+
}
|
|
117
|
+
for (const communityId of result.ghostCommunities) {
|
|
118
|
+
const members = membersByCommunity.get(communityId) ?? [];
|
|
119
|
+
if (members.length < MIN_COMMUNITY_MEMBERS_FOR_WARNING)
|
|
120
|
+
continue;
|
|
121
|
+
let allDead = true;
|
|
122
|
+
for (const memberId of members) {
|
|
123
|
+
if (result.symbols[memberId] !== "dead") {
|
|
124
|
+
allDead = false;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (!allDead)
|
|
129
|
+
continue;
|
|
130
|
+
ctx.onProgress?.({
|
|
131
|
+
phase: DEAD_CODE_PHASE_NAME,
|
|
132
|
+
kind: "warn",
|
|
133
|
+
message: `dead-code: ghost community detected (${communityId}) — ${members.length} members, all dead`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
classifiedCount: symbols.length,
|
|
138
|
+
deadCount: result.dead.length,
|
|
139
|
+
unreachableExportCount: result.unreachableExports.length,
|
|
140
|
+
ghostCommunityCount: result.ghostCommunities.length,
|
|
141
|
+
ghostCommunities: result.ghostCommunities,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Return a copy of `node` with `deadness` populated. Only callable / type
|
|
146
|
+
* kinds carry the field in the schema — the caller is responsible for
|
|
147
|
+
* filtering to those kinds. Retains every other field via spread so the
|
|
148
|
+
* graph's "most-defined-wins" deduplication keeps the new node. We round-trip
|
|
149
|
+
* through `unknown` because `GraphNode` is a tagged union and not every
|
|
150
|
+
* variant declares a `deadness` key — TypeScript rejects the literal spread
|
|
151
|
+
* otherwise.
|
|
152
|
+
*/
|
|
153
|
+
function withDeadness(node, deadness) {
|
|
154
|
+
const extended = { ...node, deadness };
|
|
155
|
+
return extended;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=dead-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-code.js","sourceRoot":"","sources":["../../../src/pipeline/phases/dead-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default pipeline phase set — full 14-phase DAG.
|
|
3
|
+
*
|
|
4
|
+
* The runner treats this array as the canonical ordering source. Adding or
|
|
5
|
+
* removing a phase is a one-line change here; the DAG validator catches
|
|
6
|
+
* missing dependencies and cycles on the next run.
|
|
7
|
+
*
|
|
8
|
+
* Phase ordering (topologically):
|
|
9
|
+
* scan → profile
|
|
10
|
+
* → structure → markdown → parse → complexity → routes → tools →
|
|
11
|
+
* orm → crossFile → mro →
|
|
12
|
+
* communities → dead-code →
|
|
13
|
+
* processes → temporal → annotate
|
|
14
|
+
*
|
|
15
|
+
* `markdown` depends on `structure` and could run alongside `parse`; the
|
|
16
|
+
* runner serialises everything since determinism dominates the latency
|
|
17
|
+
* win at MVP scale. `profile` and `temporal` are pure leaves on `scan`
|
|
18
|
+
* and could run in parallel with any post-scan phase once the runner
|
|
19
|
+
* learns to fan out. `profile` emits a single ProjectProfile node that
|
|
20
|
+
* scanner phases will consult to decide which scanners to invoke.
|
|
21
|
+
*/
|
|
22
|
+
import type { PipelinePhase } from "../types.js";
|
|
23
|
+
export declare const DEFAULT_PHASES: readonly PipelinePhase[];
|
|
24
|
+
//# sourceMappingURL=default-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-set.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/default-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgCjD,eAAO,MAAM,cAAc,EAAE,SAAS,aAAa,EAgFlD,CAAC"}
|