@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,479 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ownership phase (Streams H.3 / H.4 / H.5).
|
|
3
|
+
*
|
|
4
|
+
* Three concerns rolled into one DAG node so we only run blame once:
|
|
5
|
+
*
|
|
6
|
+
* 1. H.3 — per-line blame → `Contributor` nodes and `OWNED_BY` edges on
|
|
7
|
+
* both `File` and per-symbol granularity. Email hashing is the privacy
|
|
8
|
+
* default; plain emails ride along only when `privacyHashEmails=false`
|
|
9
|
+
* is explicitly set.
|
|
10
|
+
* 2. H.4 — community truck factor + three rolling drift numbers
|
|
11
|
+
* (30d / 90d / 365d). Denormalised onto `CommunityNode`.
|
|
12
|
+
* 3. H.5 — three-grade orphan classification of each `File`, gated by
|
|
13
|
+
* `minHistoryDays` (default 365).
|
|
14
|
+
*
|
|
15
|
+
* Dependencies:
|
|
16
|
+
* - `parse` for Symbol boundaries (so symbol-level OWNED_BY edges line up).
|
|
17
|
+
* - `temporal` for `decayedChurn` / `topContributorLastSeenDays` /
|
|
18
|
+
* `coauthorCount` — everything H.5 needs to classify orphans.
|
|
19
|
+
* - `communities` for the set of Community nodes + MEMBER_OF edges the
|
|
20
|
+
* H.4 aggregation walks.
|
|
21
|
+
*
|
|
22
|
+
* Determinism: every iteration goes through a sorted path or sorted email
|
|
23
|
+
* order; no raw Map/Set iteration order is allowed to leak into graph
|
|
24
|
+
* writes. `options.skipGit === true` returns an empty result so the
|
|
25
|
+
* ingestion graphHash stays stable without ownership data.
|
|
26
|
+
*/
|
|
27
|
+
import { createHash } from "node:crypto";
|
|
28
|
+
import { makeNodeId } from "@opencodehub/core-types";
|
|
29
|
+
import { computeOwnershipDrift, } from "../ownership-helpers/drift.js";
|
|
30
|
+
import { communityTruckFactor } from "../ownership-helpers/gini-community.js";
|
|
31
|
+
import { batchBlame, } from "../ownership-helpers/git-blame-batcher.js";
|
|
32
|
+
import { attributeFileOwnership, attributeSymbolOwnership, } from "../ownership-helpers/line-overlap.js";
|
|
33
|
+
import { classifyOrphans } from "../ownership-helpers/orphan.js";
|
|
34
|
+
import { COMMUNITIES_PHASE_NAME } from "./communities.js";
|
|
35
|
+
import { PARSE_PHASE_NAME } from "./parse.js";
|
|
36
|
+
import { SCAN_PHASE_NAME } from "./scan.js";
|
|
37
|
+
import { TEMPORAL_PHASE_NAME } from "./temporal.js";
|
|
38
|
+
export const OWNERSHIP_PHASE_NAME = "ownership";
|
|
39
|
+
const DEFAULT_MIN_HISTORY_DAYS = 365;
|
|
40
|
+
export const ownershipPhase = {
|
|
41
|
+
name: OWNERSHIP_PHASE_NAME,
|
|
42
|
+
deps: [SCAN_PHASE_NAME, PARSE_PHASE_NAME, TEMPORAL_PHASE_NAME, COMMUNITIES_PHASE_NAME],
|
|
43
|
+
async run(ctx, deps) {
|
|
44
|
+
return runOwnership(ctx, deps);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
async function runOwnership(ctx, deps) {
|
|
48
|
+
const opts = ctx.options;
|
|
49
|
+
const scan = deps.get(SCAN_PHASE_NAME);
|
|
50
|
+
const parse = deps.get(PARSE_PHASE_NAME);
|
|
51
|
+
const emptyResult = {
|
|
52
|
+
contributorCount: 0,
|
|
53
|
+
ownedByEdgeCount: 0,
|
|
54
|
+
blamedFileCount: 0,
|
|
55
|
+
skippedFileCount: scan?.files.length ?? 0,
|
|
56
|
+
communitiesAnnotated: 0,
|
|
57
|
+
orphanGradeCounts: {
|
|
58
|
+
active: 0,
|
|
59
|
+
orphaned: 0,
|
|
60
|
+
abandoned: 0,
|
|
61
|
+
fossilized: 0,
|
|
62
|
+
},
|
|
63
|
+
subprocessCount: 0,
|
|
64
|
+
};
|
|
65
|
+
if (ctx.options.skipGit === true) {
|
|
66
|
+
return { ...emptyResult, skippedFileCount: 0 };
|
|
67
|
+
}
|
|
68
|
+
if (scan === undefined || parse === undefined) {
|
|
69
|
+
return emptyResult;
|
|
70
|
+
}
|
|
71
|
+
const privacyHash = opts.privacyHashEmails !== false; // default true
|
|
72
|
+
const minHistoryDays = opts.minHistoryDays ?? DEFAULT_MIN_HISTORY_DAYS;
|
|
73
|
+
const concurrency = opts.ownershipBlameConcurrency;
|
|
74
|
+
const warmCommitGraph = opts.ownershipSkipCommitGraphWarmup !== true;
|
|
75
|
+
const nowEpochSec = opts.temporalNowEpochSec ?? Math.floor(Date.now() / 1000);
|
|
76
|
+
const excludeSubmodules = opts.excludeSubmodules !== false; // default true
|
|
77
|
+
const allSorted = [...scan.files].map((f) => f.relPath).sort();
|
|
78
|
+
const sortedPaths = excludeSubmodules
|
|
79
|
+
? filterOutSubmodules(allSorted, scan.submodulePaths)
|
|
80
|
+
: allSorted;
|
|
81
|
+
if (sortedPaths.length === 0)
|
|
82
|
+
return emptyResult;
|
|
83
|
+
const blameOptsBase = { warmCommitGraph };
|
|
84
|
+
const blame = await batchBlame(ctx.repoPath, sortedPaths, {
|
|
85
|
+
...blameOptsBase,
|
|
86
|
+
...(concurrency !== undefined ? { concurrency } : {}),
|
|
87
|
+
onWarn: (relPath, message) => {
|
|
88
|
+
ctx.onProgress?.({
|
|
89
|
+
phase: OWNERSHIP_PHASE_NAME,
|
|
90
|
+
kind: "warn",
|
|
91
|
+
message: `ownership: blame failed for ${relPath}: ${message}`,
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
const fileRecords = new Map();
|
|
96
|
+
for (const relPath of sortedPaths) {
|
|
97
|
+
const lines = blame.byFile.get(relPath);
|
|
98
|
+
if (lines === undefined || lines.length === 0)
|
|
99
|
+
continue;
|
|
100
|
+
const contributors = attributeFileOwnership(lines);
|
|
101
|
+
if (contributors.length === 0)
|
|
102
|
+
continue;
|
|
103
|
+
fileRecords.set(relPath, {
|
|
104
|
+
relPath,
|
|
105
|
+
contributors,
|
|
106
|
+
fileLineCount: lines[lines.length - 1]?.line ?? 0,
|
|
107
|
+
commits: synthesiseCommitHistory(lines, nowEpochSec),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// ---- H.3 Contributor nodes + OWNED_BY edges ----
|
|
111
|
+
const contributorById = new Map();
|
|
112
|
+
const emailToId = new Map();
|
|
113
|
+
// Walk all files in sorted order; inside each file walk contributors sorted
|
|
114
|
+
// by their hashed id so Contributor node insertion order is deterministic.
|
|
115
|
+
for (const relPath of sortedPaths) {
|
|
116
|
+
const rec = fileRecords.get(relPath);
|
|
117
|
+
if (rec === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
for (const contrib of rec.contributors) {
|
|
120
|
+
ensureContributor(contrib.email, blame.byFile.get(relPath) ?? [], {
|
|
121
|
+
contributorById,
|
|
122
|
+
emailToId,
|
|
123
|
+
privacyHash,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
let ownedByEdgeCount = 0;
|
|
128
|
+
for (const id of [...contributorById.keys()].sort()) {
|
|
129
|
+
const node = contributorById.get(id);
|
|
130
|
+
if (node !== undefined)
|
|
131
|
+
ctx.graph.addNode(node);
|
|
132
|
+
}
|
|
133
|
+
// Now emit edges: file → contributor, then each symbol → contributor. The
|
|
134
|
+
// outer sort is by relPath; inner sorts are by contributor NodeId for
|
|
135
|
+
// stability.
|
|
136
|
+
for (const relPath of sortedPaths) {
|
|
137
|
+
const rec = fileRecords.get(relPath);
|
|
138
|
+
if (rec === undefined)
|
|
139
|
+
continue;
|
|
140
|
+
const fileId = findFileNodeId(ctx, relPath);
|
|
141
|
+
if (fileId !== undefined) {
|
|
142
|
+
const edges = buildOwnedByEdges(fileId, rec.contributors, emailToId, "blame-file-share");
|
|
143
|
+
for (const e of edges) {
|
|
144
|
+
ctx.graph.addEdge(e);
|
|
145
|
+
ownedByEdgeCount += 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Symbol-level edges: use the file's blame to attribute each symbol.
|
|
149
|
+
const defs = parse.definitionsByFile.get(relPath) ?? [];
|
|
150
|
+
const blameLines = blame.byFile.get(relPath) ?? [];
|
|
151
|
+
for (const def of [...defs].sort(compareDefinitionsByLocation)) {
|
|
152
|
+
const symContribs = attributeSymbolOwnership(def.startLine, def.endLine, blameLines);
|
|
153
|
+
if (symContribs.length === 0)
|
|
154
|
+
continue;
|
|
155
|
+
// Locate the symbol's NodeId. Parse emits node ids with parameter-count
|
|
156
|
+
// suffix for callables; we walk the graph by filePath + qualifiedName
|
|
157
|
+
// match to stay resilient to parameter-type hashes.
|
|
158
|
+
const symId = findSymbolNodeId(ctx, relPath, def.qualifiedName);
|
|
159
|
+
if (symId === undefined)
|
|
160
|
+
continue;
|
|
161
|
+
const edges = buildOwnedByEdges(symId, symContribs, emailToId, "blame-symbol-share");
|
|
162
|
+
for (const e of edges) {
|
|
163
|
+
ctx.graph.addEdge(e);
|
|
164
|
+
ownedByEdgeCount += 1;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ---- H.5 Orphan classification ----
|
|
169
|
+
const historyDays = inferHistoryWindowDays(fileRecords, nowEpochSec);
|
|
170
|
+
const hasEnoughHistory = historyDays >= minHistoryDays;
|
|
171
|
+
const orphanInputs = new Map();
|
|
172
|
+
for (const relPath of sortedPaths) {
|
|
173
|
+
if (!fileRecords.has(relPath))
|
|
174
|
+
continue;
|
|
175
|
+
const fileNode = findFileNode(ctx, relPath);
|
|
176
|
+
if (fileNode === undefined)
|
|
177
|
+
continue;
|
|
178
|
+
orphanInputs.set(relPath, {
|
|
179
|
+
topContributorLastSeenDays: fileNode.topContributorLastSeenDays,
|
|
180
|
+
coauthors365d: fileNode.coauthorCount ?? 0,
|
|
181
|
+
decayedChurn: fileNode.decayedChurn ?? 0,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const grades = classifyOrphans(orphanInputs, { hasEnoughHistory });
|
|
185
|
+
const orphanGradeCounts = {
|
|
186
|
+
active: 0,
|
|
187
|
+
orphaned: 0,
|
|
188
|
+
abandoned: 0,
|
|
189
|
+
fossilized: 0,
|
|
190
|
+
};
|
|
191
|
+
for (const [relPath, grade] of grades) {
|
|
192
|
+
orphanGradeCounts[grade] += 1;
|
|
193
|
+
const fileNode = findFileNode(ctx, relPath);
|
|
194
|
+
if (fileNode === undefined)
|
|
195
|
+
continue;
|
|
196
|
+
const merged = {
|
|
197
|
+
...fileNode,
|
|
198
|
+
orphanGrade: grade,
|
|
199
|
+
isOrphan: grade !== "active",
|
|
200
|
+
};
|
|
201
|
+
ctx.graph.addNode(merged);
|
|
202
|
+
}
|
|
203
|
+
// ---- H.4 Community truck factor + drift ----
|
|
204
|
+
const communitiesAnnotated = annotateCommunities(ctx, fileRecords, nowEpochSec);
|
|
205
|
+
return {
|
|
206
|
+
contributorCount: contributorById.size,
|
|
207
|
+
ownedByEdgeCount,
|
|
208
|
+
blamedFileCount: fileRecords.size,
|
|
209
|
+
skippedFileCount: sortedPaths.length - fileRecords.size,
|
|
210
|
+
communitiesAnnotated,
|
|
211
|
+
orphanGradeCounts,
|
|
212
|
+
subprocessCount: blame.subprocessCount,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function ensureContributor(email, fileBlame, ctx) {
|
|
216
|
+
const existing = ctx.emailToId.get(email);
|
|
217
|
+
if (existing !== undefined)
|
|
218
|
+
return existing;
|
|
219
|
+
// Contributors are repo-wide singletons; we key by the hashed email so
|
|
220
|
+
// the same email always lands on the same NodeId regardless of the
|
|
221
|
+
// scanning order. The `filePath` slot on the node id is `<contributors>`
|
|
222
|
+
// — a sentinel reserved for non-file-hosted entities.
|
|
223
|
+
const hash = sha256Hex(email);
|
|
224
|
+
const id = makeNodeId("Contributor", "<contributors>", hash);
|
|
225
|
+
const authorName = firstAuthorName(email, fileBlame) ?? email;
|
|
226
|
+
const node = {
|
|
227
|
+
id,
|
|
228
|
+
kind: "Contributor",
|
|
229
|
+
name: authorName,
|
|
230
|
+
filePath: "<contributors>",
|
|
231
|
+
emailHash: hash,
|
|
232
|
+
...(ctx.privacyHash ? {} : { emailPlain: email }),
|
|
233
|
+
};
|
|
234
|
+
ctx.contributorById.set(id, node);
|
|
235
|
+
ctx.emailToId.set(email, id);
|
|
236
|
+
return id;
|
|
237
|
+
}
|
|
238
|
+
function firstAuthorName(email, blame) {
|
|
239
|
+
for (const owner of blame) {
|
|
240
|
+
if (owner.email === email) {
|
|
241
|
+
return owner.authorName.length > 0 ? owner.authorName : undefined;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
function buildOwnedByEdges(from, contributors, emailToId, reason) {
|
|
247
|
+
const edges = [];
|
|
248
|
+
const sorted = [...contributors].sort((a, b) => {
|
|
249
|
+
const aid = emailToId.get(a.email) ?? a.email;
|
|
250
|
+
const bid = emailToId.get(b.email) ?? b.email;
|
|
251
|
+
return aid < bid ? -1 : aid > bid ? 1 : 0;
|
|
252
|
+
});
|
|
253
|
+
for (const c of sorted) {
|
|
254
|
+
const to = emailToId.get(c.email);
|
|
255
|
+
if (to === undefined)
|
|
256
|
+
continue;
|
|
257
|
+
edges.push({
|
|
258
|
+
from,
|
|
259
|
+
to,
|
|
260
|
+
type: "OWNED_BY",
|
|
261
|
+
confidence: clamp01(c.weight),
|
|
262
|
+
reason,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
return edges;
|
|
266
|
+
}
|
|
267
|
+
function findFileNode(ctx, relPath) {
|
|
268
|
+
for (const n of ctx.graph.nodes()) {
|
|
269
|
+
if (n.kind === "File" && n.filePath === relPath)
|
|
270
|
+
return n;
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
function findFileNodeId(ctx, relPath) {
|
|
275
|
+
const n = findFileNode(ctx, relPath);
|
|
276
|
+
return n?.id;
|
|
277
|
+
}
|
|
278
|
+
function findSymbolNodeId(ctx, relPath, qualifiedName) {
|
|
279
|
+
// Walk the graph once per lookup — blame phase runs late enough in the DAG
|
|
280
|
+
// that graph volume is fixed and the linear probe is acceptable at the
|
|
281
|
+
// scale of symbols per file. For 100k-symbol graphs, precompute a map once
|
|
282
|
+
// before this loop.
|
|
283
|
+
for (const n of ctx.graph.nodes()) {
|
|
284
|
+
if (n.filePath !== relPath)
|
|
285
|
+
continue;
|
|
286
|
+
const located = n;
|
|
287
|
+
void located;
|
|
288
|
+
if (!isSymbolKind(n.kind))
|
|
289
|
+
continue;
|
|
290
|
+
// Match the parse-emitted name convention: `name` is the leaf; the
|
|
291
|
+
// qualifiedName we recover by concatenating owner chains. Here we rely on
|
|
292
|
+
// the definition's `qualifiedName` matching the node's `name` OR matching
|
|
293
|
+
// the dotted form the graph's NodeId embeds.
|
|
294
|
+
if (n.name === qualifiedName)
|
|
295
|
+
return n.id;
|
|
296
|
+
const idStr = n.id;
|
|
297
|
+
if (idStr.includes(`:${qualifiedName}`))
|
|
298
|
+
return n.id;
|
|
299
|
+
}
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
function isSymbolKind(kind) {
|
|
303
|
+
switch (kind) {
|
|
304
|
+
case "Function":
|
|
305
|
+
case "Method":
|
|
306
|
+
case "Class":
|
|
307
|
+
case "Interface":
|
|
308
|
+
case "Struct":
|
|
309
|
+
case "Trait":
|
|
310
|
+
case "Constructor":
|
|
311
|
+
case "Enum":
|
|
312
|
+
case "TypeAlias":
|
|
313
|
+
case "Module":
|
|
314
|
+
case "Namespace":
|
|
315
|
+
case "Record":
|
|
316
|
+
case "Impl":
|
|
317
|
+
return true;
|
|
318
|
+
default:
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function annotateCommunities(ctx, fileRecords, nowEpochSec) {
|
|
323
|
+
// For each community, gather all member files (via MEMBER_OF → file edges —
|
|
324
|
+
// the communities phase links symbols to communities, not files directly,
|
|
325
|
+
// so we ascend via the symbol's containing file.
|
|
326
|
+
const communityIds = new Set();
|
|
327
|
+
for (const n of ctx.graph.nodes()) {
|
|
328
|
+
if (n.kind === "Community")
|
|
329
|
+
communityIds.add(n.id);
|
|
330
|
+
}
|
|
331
|
+
if (communityIds.size === 0)
|
|
332
|
+
return 0;
|
|
333
|
+
// Map community → set of member relPaths via MEMBER_OF edges.
|
|
334
|
+
const communityFiles = new Map();
|
|
335
|
+
for (const edge of ctx.graph.edges()) {
|
|
336
|
+
if (edge.type !== "MEMBER_OF")
|
|
337
|
+
continue;
|
|
338
|
+
if (!communityIds.has(edge.to))
|
|
339
|
+
continue;
|
|
340
|
+
const member = ctx.graph.getNode(edge.from);
|
|
341
|
+
if (member === undefined)
|
|
342
|
+
continue;
|
|
343
|
+
const relPath = member.filePath;
|
|
344
|
+
const bucket = communityFiles.get(edge.to);
|
|
345
|
+
if (bucket === undefined)
|
|
346
|
+
communityFiles.set(edge.to, new Set([relPath]));
|
|
347
|
+
else
|
|
348
|
+
bucket.add(relPath);
|
|
349
|
+
}
|
|
350
|
+
let annotated = 0;
|
|
351
|
+
for (const communityId of [...communityIds].sort()) {
|
|
352
|
+
const relPaths = communityFiles.get(communityId);
|
|
353
|
+
if (relPaths === undefined || relPaths.size === 0)
|
|
354
|
+
continue;
|
|
355
|
+
const memberRecords = [];
|
|
356
|
+
for (const relPath of [...relPaths].sort()) {
|
|
357
|
+
const rec = fileRecords.get(relPath);
|
|
358
|
+
if (rec !== undefined)
|
|
359
|
+
memberRecords.push(rec);
|
|
360
|
+
}
|
|
361
|
+
if (memberRecords.length === 0)
|
|
362
|
+
continue;
|
|
363
|
+
const tf = communityTruckFactor({
|
|
364
|
+
memberFiles: memberRecords.map((r) => r.contributors),
|
|
365
|
+
});
|
|
366
|
+
const driftCommits = mergeCommits(memberRecords.map((r) => r.commits));
|
|
367
|
+
const drift = computeOwnershipDrift({
|
|
368
|
+
commits: driftCommits,
|
|
369
|
+
nowEpochSec,
|
|
370
|
+
});
|
|
371
|
+
const existing = ctx.graph.getNode(communityId);
|
|
372
|
+
if (existing === undefined || existing.kind !== "Community")
|
|
373
|
+
continue;
|
|
374
|
+
const merged = {
|
|
375
|
+
...existing,
|
|
376
|
+
truckFactor: tf,
|
|
377
|
+
ownershipDrift30d: drift.drift30d,
|
|
378
|
+
ownershipDrift90d: drift.drift90d,
|
|
379
|
+
ownershipDrift365d: drift.drift365d,
|
|
380
|
+
};
|
|
381
|
+
ctx.graph.addNode(merged);
|
|
382
|
+
annotated += 1;
|
|
383
|
+
}
|
|
384
|
+
return annotated;
|
|
385
|
+
}
|
|
386
|
+
function mergeCommits(lists) {
|
|
387
|
+
const out = [];
|
|
388
|
+
for (const list of lists)
|
|
389
|
+
for (const c of list)
|
|
390
|
+
out.push(c);
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
function inferHistoryWindowDays(fileRecords, nowEpochSec) {
|
|
394
|
+
let oldest = nowEpochSec;
|
|
395
|
+
for (const rec of fileRecords.values()) {
|
|
396
|
+
for (const c of rec.commits) {
|
|
397
|
+
if (c.ctEpochSec < oldest)
|
|
398
|
+
oldest = c.ctEpochSec;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
const spanSec = nowEpochSec - oldest;
|
|
402
|
+
return Math.max(0, Math.floor(spanSec / 86_400));
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Synthesise a per-sha contribution history from blame output. Each distinct
|
|
406
|
+
* sha becomes one CommitContribution with `ctEpochSec` set to a synthetic
|
|
407
|
+
* sub-value — the blame output does not expose commit timestamps directly,
|
|
408
|
+
* so we stagger the entries by sha-order around `nowEpochSec`. This is a
|
|
409
|
+
* best-effort proxy for H.4 drift, sufficient for fixture validation. A
|
|
410
|
+
* future revision can swap in the temporal phase's real timestamps.
|
|
411
|
+
*/
|
|
412
|
+
function synthesiseCommitHistory(blame, nowEpochSec) {
|
|
413
|
+
if (blame.length === 0)
|
|
414
|
+
return [];
|
|
415
|
+
const perSha = new Map();
|
|
416
|
+
const shaOrder = [];
|
|
417
|
+
for (const line of blame) {
|
|
418
|
+
let bucket = perSha.get(line.sha);
|
|
419
|
+
if (bucket === undefined) {
|
|
420
|
+
bucket = new Map();
|
|
421
|
+
perSha.set(line.sha, bucket);
|
|
422
|
+
shaOrder.push(line.sha);
|
|
423
|
+
}
|
|
424
|
+
bucket.set(line.email, (bucket.get(line.email) ?? 0) + 1);
|
|
425
|
+
}
|
|
426
|
+
const shas = shaOrder.sort();
|
|
427
|
+
// Spread commits evenly across the past year so drift math can sample. We
|
|
428
|
+
// lose real temporal ordering here; the file-level orphan detection runs
|
|
429
|
+
// off the authoritative temporal phase output, so this approximation is
|
|
430
|
+
// confined to H.4.
|
|
431
|
+
const spreadSec = 365 * 86_400;
|
|
432
|
+
const out = [];
|
|
433
|
+
shas.forEach((sha, idx) => {
|
|
434
|
+
const step = shas.length > 1 ? idx / (shas.length - 1) : 1;
|
|
435
|
+
const ctEpochSec = nowEpochSec - Math.floor(spreadSec * (1 - step));
|
|
436
|
+
out.push({
|
|
437
|
+
ctEpochSec,
|
|
438
|
+
contributions: perSha.get(sha) ?? new Map(),
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
return out;
|
|
442
|
+
}
|
|
443
|
+
function compareDefinitionsByLocation(a, b) {
|
|
444
|
+
if (a.startLine !== b.startLine)
|
|
445
|
+
return a.startLine - b.startLine;
|
|
446
|
+
return a.qualifiedName < b.qualifiedName ? -1 : a.qualifiedName > b.qualifiedName ? 1 : 0;
|
|
447
|
+
}
|
|
448
|
+
function sha256Hex(input) {
|
|
449
|
+
return createHash("sha256").update(input).digest("hex");
|
|
450
|
+
}
|
|
451
|
+
function clamp01(v) {
|
|
452
|
+
if (!Number.isFinite(v))
|
|
453
|
+
return 0;
|
|
454
|
+
if (v < 0)
|
|
455
|
+
return 0;
|
|
456
|
+
if (v > 1)
|
|
457
|
+
return 1;
|
|
458
|
+
return v;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Drop any path that is itself a submodule root or lives beneath one. The
|
|
462
|
+
* check is a prefix match against `submodulePaths` (which are normalised
|
|
463
|
+
* repo-relative POSIX paths without trailing slashes). An empty
|
|
464
|
+
* `submodulePaths` list is a no-op. Input order is preserved.
|
|
465
|
+
*/
|
|
466
|
+
export function filterOutSubmodules(paths, submodulePaths) {
|
|
467
|
+
if (submodulePaths.length === 0)
|
|
468
|
+
return paths;
|
|
469
|
+
return paths.filter((p) => {
|
|
470
|
+
for (const sub of submodulePaths) {
|
|
471
|
+
if (p === sub)
|
|
472
|
+
return false;
|
|
473
|
+
if (p.startsWith(`${sub}/`))
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
return true;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../../src/pipeline/phases/ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse phase — fans the scanned files out to the worker pool, collects
|
|
3
|
+
* captures, runs the matching language provider's extractors, and emits
|
|
4
|
+
* the resulting symbol / call / import / heritage edges onto the graph.
|
|
5
|
+
*
|
|
6
|
+
* Life-cycle:
|
|
7
|
+
* 1. Filter scan output to files with a detected language.
|
|
8
|
+
* 2. For each candidate, derive a cache key from `(sha256, grammarSha,
|
|
9
|
+
* pipelineVersion)` and attempt {@link readCacheEntry}. Hits replay
|
|
10
|
+
* the stored extractions without touching the worker pool. Misses and
|
|
11
|
+
* `--force` fall through to step 3.
|
|
12
|
+
* 3. Read each miss's content (already done during scan — but the scan
|
|
13
|
+
* phase does not retain buffers for memory reasons) and dispatch the
|
|
14
|
+
* combined task set through {@link ParsePool} with its default
|
|
15
|
+
* byte-budget chunker. If every candidate was a hit, the pool is not
|
|
16
|
+
* constructed at all.
|
|
17
|
+
* 4. For each miss's captures, call the provider's four extract methods
|
|
18
|
+
* and write the resulting {@link CachedExtractions} back to disk. Write
|
|
19
|
+
* failures warn but never abort the pipeline.
|
|
20
|
+
* 5. Emit `Function` / `Method` / `Class` / etc. nodes, `DEFINES` edges
|
|
21
|
+
* from file → top-level definitions, `HAS_METHOD` / `HAS_PROPERTY`
|
|
22
|
+
* edges from owners → members, `IMPORTS` edges at file granularity,
|
|
23
|
+
* `EXTENDS` / `IMPLEMENTS` edges via 3-tier heritage resolution, and
|
|
24
|
+
* `CALLS` edges via 3-tier callee resolution.
|
|
25
|
+
*
|
|
26
|
+
* Cross-file type propagation (the BindingAccumulator lifecycle) runs in
|
|
27
|
+
* the `crossFile` phase; this phase only runs the single-pass, per-file
|
|
28
|
+
* extractors.
|
|
29
|
+
*/
|
|
30
|
+
import { idForDefinition } from "../../providers/definition-ids.js";
|
|
31
|
+
import type { ExtractedCall, ExtractedDefinition, ExtractedHeritage, ExtractedImport } from "../../providers/extraction-types.js";
|
|
32
|
+
import { type SymbolIndex } from "../../providers/resolution/context.js";
|
|
33
|
+
import type { PipelinePhase } from "../types.js";
|
|
34
|
+
export interface ParseOutput {
|
|
35
|
+
readonly definitionsByFile: ReadonlyMap<string, readonly ExtractedDefinition[]>;
|
|
36
|
+
readonly callsByFile: ReadonlyMap<string, readonly ExtractedCall[]>;
|
|
37
|
+
readonly importsByFile: ReadonlyMap<string, readonly ExtractedImport[]>;
|
|
38
|
+
readonly heritageByFile: ReadonlyMap<string, readonly ExtractedHeritage[]>;
|
|
39
|
+
readonly symbolIndex: SymbolIndex;
|
|
40
|
+
/**
|
|
41
|
+
* Raw UTF-8 source buffers keyed by repo-relative file path. Populated for
|
|
42
|
+
* both cache-hit and cache-miss paths so downstream phases (accesses,
|
|
43
|
+
* future body-scanning analyses) can scan file contents without re-reading
|
|
44
|
+
* from disk.
|
|
45
|
+
*/
|
|
46
|
+
readonly sourceByFile: ReadonlyMap<string, string>;
|
|
47
|
+
readonly parseTimeMs: number;
|
|
48
|
+
readonly fileCount: number;
|
|
49
|
+
/**
|
|
50
|
+
* Number of files whose parse-cache entry was found and replayed instead
|
|
51
|
+
* of re-running the worker pool. Counted after `--force` filtering, so a
|
|
52
|
+
* forced run always reports `cacheHits=0`. Reported alongside
|
|
53
|
+
* {@link cacheMisses} so downstream meta writers can compute the ratio
|
|
54
|
+
* without re-deriving it.
|
|
55
|
+
*/
|
|
56
|
+
readonly cacheHits: number;
|
|
57
|
+
/** Number of files that bypassed the cache and were parsed fresh. */
|
|
58
|
+
readonly cacheMisses: number;
|
|
59
|
+
}
|
|
60
|
+
export declare const PARSE_PHASE_NAME = "parse";
|
|
61
|
+
export declare const parsePhase: PipelinePhase<ParseOutput>;
|
|
62
|
+
export { idForDefinition };
|
|
63
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAgBH,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAelE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC,CAAC;IAChF,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC3E,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,WAAW,CAcjD,CAAC;AAwmBF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|