@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,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level orchestrator that constructs a `PipelineContext`, runs the
|
|
3
|
+
* configured phase set, and returns a summary plus the hashed graph.
|
|
4
|
+
*
|
|
5
|
+
* The orchestrator does not touch storage — the returned
|
|
6
|
+
* `KnowledgeGraph` is in-memory only. Persisting it (DuckDB / embeddings)
|
|
7
|
+
* is a CLI concern (see `codehub analyze`, which opens a writable store
|
|
8
|
+
* and calls `bulkLoad`).
|
|
9
|
+
*/
|
|
10
|
+
import { KnowledgeGraph } from "@opencodehub/core-types";
|
|
11
|
+
import { type CochangeOutput } from "./phases/cochange.js";
|
|
12
|
+
import { type EmbedderPhaseOutput, type EmbeddingHashCacheAdapter } from "./phases/embeddings.js";
|
|
13
|
+
import { type IncrementalScopeOutput } from "./phases/incremental-scope.js";
|
|
14
|
+
import { type ScanOutput } from "./phases/scan.js";
|
|
15
|
+
import { type SummarizePhaseOutput, type SummaryCacheAdapter } from "./phases/summarize.js";
|
|
16
|
+
import type { PipelineOptions, PipelinePhase, ProgressEvent } from "./types.js";
|
|
17
|
+
export interface RunPipelineResult {
|
|
18
|
+
readonly graph: KnowledgeGraph;
|
|
19
|
+
readonly graphHash: string;
|
|
20
|
+
readonly stats: {
|
|
21
|
+
readonly totalMs: number;
|
|
22
|
+
readonly phases: readonly {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly durationMs: number;
|
|
25
|
+
}[];
|
|
26
|
+
readonly nodeCount: number;
|
|
27
|
+
readonly edgeCount: number;
|
|
28
|
+
readonly byKind?: Record<string, number>;
|
|
29
|
+
readonly byRelation?: Record<string, number>;
|
|
30
|
+
readonly schemaVersion?: string;
|
|
31
|
+
readonly currentCommit?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Cache hit / miss counts from the parse phase. Populated on every run
|
|
34
|
+
* because `parsePhase` tracks them unconditionally; a fully-cold run
|
|
35
|
+
* reports `{hits: 0, misses: N}` which produces `cacheHitRatio === 0`.
|
|
36
|
+
*/
|
|
37
|
+
readonly parseCache?: {
|
|
38
|
+
readonly hits: number;
|
|
39
|
+
readonly misses: number;
|
|
40
|
+
readonly ratio: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
readonly warnings: readonly string[];
|
|
44
|
+
/**
|
|
45
|
+
* Output of the `embeddings` phase when present. `undefined` only in the
|
|
46
|
+
* pathological case of a custom phase set that omits it entirely. When
|
|
47
|
+
* embeddings were disabled the phase still ran and returned a zero-ed
|
|
48
|
+
* output so this field remains defined.
|
|
49
|
+
*/
|
|
50
|
+
readonly embeddings?: EmbedderPhaseOutput;
|
|
51
|
+
/**
|
|
52
|
+
* Output of the `incremental-scope` phase when it ran. Absent when the
|
|
53
|
+
* operator supplied a custom phase set that excluded it. Downstream code
|
|
54
|
+
* (analyze CLI, doctor) reads `mode` and `closureRatio` for reporting.
|
|
55
|
+
*/
|
|
56
|
+
readonly incrementalScope?: IncrementalScopeOutput;
|
|
57
|
+
/**
|
|
58
|
+
* Output of the `scan` phase. Exposed so CLIs can persist the post-scan
|
|
59
|
+
* state (content hashes per file) for the next run's incremental pass.
|
|
60
|
+
* Always present under the default phase set; absent only when a custom
|
|
61
|
+
* set omits scan entirely (which would fail validation anyway).
|
|
62
|
+
*/
|
|
63
|
+
readonly scan?: ScanOutput;
|
|
64
|
+
/**
|
|
65
|
+
* Output of the `cochange` phase. Carries the file×file association-rule
|
|
66
|
+
* rows that the CLI persists into the dedicated `cochanges` storage table
|
|
67
|
+
* after `bulkLoad`. Absent only when a custom phase set omits cochange.
|
|
68
|
+
*/
|
|
69
|
+
readonly cochange?: CochangeOutput;
|
|
70
|
+
/**
|
|
71
|
+
* Output of the `summarize` phase. Carries any fresh `SymbolSummaryRow`
|
|
72
|
+
* entries the CLI persists into the `symbol_summaries` table. Absent only
|
|
73
|
+
* when a custom phase set omits summarize; the default phase set always
|
|
74
|
+
* runs it (the phase internally short-circuits when gated off).
|
|
75
|
+
*/
|
|
76
|
+
readonly summarize?: SummarizePhaseOutput;
|
|
77
|
+
}
|
|
78
|
+
export interface RunIngestionOptions extends PipelineOptions {
|
|
79
|
+
readonly phases?: readonly PipelinePhase[];
|
|
80
|
+
readonly onProgress?: (ev: ProgressEvent) => void;
|
|
81
|
+
/**
|
|
82
|
+
* Optional adapter the summarize phase probes before issuing work.
|
|
83
|
+
* Production wires this to the DuckDB store's `lookupSymbolSummary`
|
|
84
|
+
* implementation so re-indexes become free when source hasn't drifted.
|
|
85
|
+
* Tests inject an in-memory fake. Absent by default — the phase degrades
|
|
86
|
+
* to "every candidate is a miss" which is still correct, just more
|
|
87
|
+
* expensive.
|
|
88
|
+
*/
|
|
89
|
+
readonly summaryCacheAdapter?: SummaryCacheAdapter;
|
|
90
|
+
/**
|
|
91
|
+
* Optional adapter the embeddings phase probes before issuing embedder
|
|
92
|
+
* calls. Production wires this to the DuckDB store's
|
|
93
|
+
* `listEmbeddingHashes` implementation so re-analyze runs skip chunks
|
|
94
|
+
* whose `content_hash` matches a prior row. Absent by default —
|
|
95
|
+
* the phase degrades to "every chunk is new" which is still correct,
|
|
96
|
+
* just more expensive. Ignored when `options.force === true`.
|
|
97
|
+
*/
|
|
98
|
+
readonly embeddingHashCacheAdapter?: EmbeddingHashCacheAdapter;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Kick off an end-to-end pipeline run. When `options.phases` is omitted
|
|
102
|
+
* the default phase set is used.
|
|
103
|
+
*/
|
|
104
|
+
export declare function runIngestion(repoPath: string, options?: RunIngestionOptions): Promise<RunPipelineResult>;
|
|
105
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAa,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAGV,eAAe,EACf,aAAa,EAEb,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,SAAS;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC;;;;WAIG;QACH,QAAQ,CAAC,UAAU,CAAC,EAAE;YACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;YACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IACnD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAC3C;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,CAAC;IAClD;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IACnD;;;;;;;OAOG;IACH,QAAQ,CAAC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CA4H5B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level orchestrator that constructs a `PipelineContext`, runs the
|
|
3
|
+
* configured phase set, and returns a summary plus the hashed graph.
|
|
4
|
+
*
|
|
5
|
+
* The orchestrator does not touch storage — the returned
|
|
6
|
+
* `KnowledgeGraph` is in-memory only. Persisting it (DuckDB / embeddings)
|
|
7
|
+
* is a CLI concern (see `codehub analyze`, which opens a writable store
|
|
8
|
+
* and calls `bulkLoad`).
|
|
9
|
+
*/
|
|
10
|
+
import { graphHash, KnowledgeGraph } from "@opencodehub/core-types";
|
|
11
|
+
import { ANNOTATE_PHASE_NAME } from "./phases/annotate.js";
|
|
12
|
+
import { COCHANGE_PHASE_NAME } from "./phases/cochange.js";
|
|
13
|
+
import { DEFAULT_PHASES } from "./phases/default-set.js";
|
|
14
|
+
import { EMBEDDER_PHASE_NAME, EMBEDDING_HASH_CACHE_OPTIONS_KEY, } from "./phases/embeddings.js";
|
|
15
|
+
import { INCREMENTAL_SCOPE_PHASE_NAME, } from "./phases/incremental-scope.js";
|
|
16
|
+
import { PARSE_PHASE_NAME } from "./phases/parse.js";
|
|
17
|
+
import { SCAN_PHASE_NAME } from "./phases/scan.js";
|
|
18
|
+
import { SUMMARIZE_PHASE_NAME, SUMMARY_CACHE_OPTIONS_KEY, } from "./phases/summarize.js";
|
|
19
|
+
import { runPipeline } from "./runner.js";
|
|
20
|
+
/**
|
|
21
|
+
* Kick off an end-to-end pipeline run. When `options.phases` is omitted
|
|
22
|
+
* the default phase set is used.
|
|
23
|
+
*/
|
|
24
|
+
export async function runIngestion(repoPath, options = {}) {
|
|
25
|
+
const phases = options.phases ?? DEFAULT_PHASES;
|
|
26
|
+
const normalizedOptions = stripPhaseKeys(options);
|
|
27
|
+
// Attach the optional summary-cache adapter onto the options bag via a
|
|
28
|
+
// well-known key. The `summarize` phase reads it back via an unchecked
|
|
29
|
+
// cast; keeping the attach-point here (rather than inside stripPhaseKeys)
|
|
30
|
+
// keeps the typed fields in stripPhaseKeys honest.
|
|
31
|
+
if (options.summaryCacheAdapter !== undefined) {
|
|
32
|
+
normalizedOptions[SUMMARY_CACHE_OPTIONS_KEY] =
|
|
33
|
+
options.summaryCacheAdapter;
|
|
34
|
+
}
|
|
35
|
+
// Same trick for the embeddings phase's content-hash cache.
|
|
36
|
+
// Attached here (not in stripPhaseKeys) so the typed option shape stays
|
|
37
|
+
// minimal — this is a well-known extension point, not a first-class
|
|
38
|
+
// `PipelineOptions` field.
|
|
39
|
+
if (options.embeddingHashCacheAdapter !== undefined) {
|
|
40
|
+
normalizedOptions[EMBEDDING_HASH_CACHE_OPTIONS_KEY] =
|
|
41
|
+
options.embeddingHashCacheAdapter;
|
|
42
|
+
}
|
|
43
|
+
const graph = new KnowledgeGraph();
|
|
44
|
+
const warnings = [];
|
|
45
|
+
const ctx = {
|
|
46
|
+
repoPath,
|
|
47
|
+
options: normalizedOptions,
|
|
48
|
+
graph,
|
|
49
|
+
phaseOutputs: new Map(),
|
|
50
|
+
...(options.onProgress !== undefined
|
|
51
|
+
? {
|
|
52
|
+
onProgress: (ev) => {
|
|
53
|
+
if (ev.kind === "warn" && ev.message !== undefined) {
|
|
54
|
+
warnings.push(ev.message);
|
|
55
|
+
}
|
|
56
|
+
options.onProgress?.(ev);
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
: {
|
|
60
|
+
onProgress: (ev) => {
|
|
61
|
+
if (ev.kind === "warn" && ev.message !== undefined) {
|
|
62
|
+
warnings.push(ev.message);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
const started = Date.now();
|
|
68
|
+
const results = await runPipeline(phases, ctx);
|
|
69
|
+
const totalMs = Date.now() - started;
|
|
70
|
+
// If `annotate` ran, pull the richer stats and schema metadata out onto
|
|
71
|
+
// the orchestrator-level result so the CLI can surface them without
|
|
72
|
+
// reaching into the phase-output map.
|
|
73
|
+
const annotate = results.find((r) => r.name === ANNOTATE_PHASE_NAME)?.output;
|
|
74
|
+
const embeddings = results.find((r) => r.name === EMBEDDER_PHASE_NAME)?.output;
|
|
75
|
+
const incrementalScope = results.find((r) => r.name === INCREMENTAL_SCOPE_PHASE_NAME)?.output;
|
|
76
|
+
const parse = results.find((r) => r.name === PARSE_PHASE_NAME)?.output;
|
|
77
|
+
const scan = results.find((r) => r.name === SCAN_PHASE_NAME)?.output;
|
|
78
|
+
const cochange = results.find((r) => r.name === COCHANGE_PHASE_NAME)?.output;
|
|
79
|
+
const summarize = results.find((r) => r.name === SUMMARIZE_PHASE_NAME)?.output;
|
|
80
|
+
const parseCache = parse !== undefined
|
|
81
|
+
? {
|
|
82
|
+
hits: parse.cacheHits,
|
|
83
|
+
misses: parse.cacheMisses,
|
|
84
|
+
ratio: parse.cacheHits + parse.cacheMisses === 0
|
|
85
|
+
? 0
|
|
86
|
+
: parse.cacheHits / (parse.cacheHits + parse.cacheMisses),
|
|
87
|
+
}
|
|
88
|
+
: undefined;
|
|
89
|
+
// DEBUG_PHASE_MEM=1 brackets the graphHash call so large monorepos (where
|
|
90
|
+
// the hash can take several seconds) don't look like a hang relative to
|
|
91
|
+
// the per-phase telemetry emitted by the runner. Entirely gated — safe to
|
|
92
|
+
// leave in; costs are two stderr writes + one Date.now() sample.
|
|
93
|
+
const phaseMemDebug = process.env["DEBUG_PHASE_MEM"] === "1";
|
|
94
|
+
if (phaseMemDebug) {
|
|
95
|
+
process.stderr.write(`[phase-telemetry] graphHash-start nodes=${graph.nodeCount()} edges=${graph.edgeCount()}\n`);
|
|
96
|
+
}
|
|
97
|
+
const hashStart = Date.now();
|
|
98
|
+
const hashed = graphHash(graph);
|
|
99
|
+
if (phaseMemDebug) {
|
|
100
|
+
process.stderr.write(`[phase-telemetry] graphHash-end dur=${Date.now() - hashStart}ms\n`);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
graph,
|
|
104
|
+
graphHash: hashed,
|
|
105
|
+
stats: {
|
|
106
|
+
totalMs,
|
|
107
|
+
phases: results.map(summarizePhase),
|
|
108
|
+
nodeCount: graph.nodeCount(),
|
|
109
|
+
edgeCount: graph.edgeCount(),
|
|
110
|
+
...(annotate !== undefined
|
|
111
|
+
? {
|
|
112
|
+
byKind: annotate.stats.byKind,
|
|
113
|
+
byRelation: annotate.stats.byRelation,
|
|
114
|
+
schemaVersion: annotate.schemaVersion,
|
|
115
|
+
...(annotate.currentCommit !== undefined
|
|
116
|
+
? { currentCommit: annotate.currentCommit }
|
|
117
|
+
: {}),
|
|
118
|
+
}
|
|
119
|
+
: {}),
|
|
120
|
+
...(parseCache !== undefined ? { parseCache } : {}),
|
|
121
|
+
},
|
|
122
|
+
warnings,
|
|
123
|
+
...(embeddings !== undefined ? { embeddings } : {}),
|
|
124
|
+
...(incrementalScope !== undefined ? { incrementalScope } : {}),
|
|
125
|
+
...(scan !== undefined ? { scan } : {}),
|
|
126
|
+
...(cochange !== undefined ? { cochange } : {}),
|
|
127
|
+
...(summarize !== undefined ? { summarize } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function summarizePhase(r) {
|
|
131
|
+
return { name: r.name, durationMs: r.durationMs };
|
|
132
|
+
}
|
|
133
|
+
function stripPhaseKeys(options) {
|
|
134
|
+
// Copy only the fields PipelineOptions declares — phase overrides and
|
|
135
|
+
// progress callbacks are orchestrator-level concerns and must not leak
|
|
136
|
+
// into the normalized per-phase options.
|
|
137
|
+
const typed = {};
|
|
138
|
+
if (options.force !== undefined)
|
|
139
|
+
typed.force = options.force;
|
|
140
|
+
if (options.offline !== undefined)
|
|
141
|
+
typed.offline = options.offline;
|
|
142
|
+
if (options.verbose !== undefined)
|
|
143
|
+
typed.verbose = options.verbose;
|
|
144
|
+
if (options.skipGit !== undefined)
|
|
145
|
+
typed.skipGit = options.skipGit;
|
|
146
|
+
if (options.byteCapPerFile !== undefined)
|
|
147
|
+
typed.byteCapPerFile = options.byteCapPerFile;
|
|
148
|
+
if (options.maxTotalFiles !== undefined)
|
|
149
|
+
typed.maxTotalFiles = options.maxTotalFiles;
|
|
150
|
+
if (options.embeddings !== undefined)
|
|
151
|
+
typed.embeddings = options.embeddings;
|
|
152
|
+
if (options.embeddingsVariant !== undefined)
|
|
153
|
+
typed.embeddingsVariant = options.embeddingsVariant;
|
|
154
|
+
if (options.sbom !== undefined)
|
|
155
|
+
typed.sbom = options.sbom;
|
|
156
|
+
if (options.reproducibleSbom !== undefined)
|
|
157
|
+
typed.reproducibleSbom = options.reproducibleSbom;
|
|
158
|
+
if (options.embeddingsModelDir !== undefined) {
|
|
159
|
+
typed.embeddingsModelDir = options.embeddingsModelDir;
|
|
160
|
+
}
|
|
161
|
+
if (options.embeddingsGranularity !== undefined) {
|
|
162
|
+
typed.embeddingsGranularity = options.embeddingsGranularity;
|
|
163
|
+
}
|
|
164
|
+
if (options.incrementalFrom !== undefined)
|
|
165
|
+
typed.incrementalFrom = options.incrementalFrom;
|
|
166
|
+
if (options.summaries !== undefined)
|
|
167
|
+
typed.summaries = options.summaries;
|
|
168
|
+
if (options.maxSummariesPerRun !== undefined) {
|
|
169
|
+
typed.maxSummariesPerRun = options.maxSummariesPerRun;
|
|
170
|
+
}
|
|
171
|
+
if (options.summaryModel !== undefined)
|
|
172
|
+
typed.summaryModel = options.summaryModel;
|
|
173
|
+
return typed;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ownership drift helpers.
|
|
3
|
+
*
|
|
4
|
+
* For each of three rolling windows (30, 90, 365 days) we compute the stddev
|
|
5
|
+
* of the top-3 contributors' line share across the window. A high stddev
|
|
6
|
+
* implies ownership changed hands inside the window; a low stddev implies
|
|
7
|
+
* steady ownership.
|
|
8
|
+
*
|
|
9
|
+
* Sampling plan (see research notes §9):
|
|
10
|
+
* - 30d window: 4 weekly samples.
|
|
11
|
+
* - 90d window: 13 weekly samples.
|
|
12
|
+
* - 365d window: 52 weekly samples.
|
|
13
|
+
*
|
|
14
|
+
* Samples are anchored to `nowEpochSec`. At each sample tick we project the
|
|
15
|
+
* set of commits whose `ct <= tick` down onto each contributor's cumulative
|
|
16
|
+
* line share and record the top-3 contributors' shares. Stddev is taken over
|
|
17
|
+
* the concatenation of the three contributors' share vectors across ticks.
|
|
18
|
+
*/
|
|
19
|
+
export interface CommitContribution {
|
|
20
|
+
/** Epoch seconds of the committer timestamp. */
|
|
21
|
+
readonly ctEpochSec: number;
|
|
22
|
+
/** Per-contributor line counts this commit applied. */
|
|
23
|
+
readonly contributions: ReadonlyMap<string, number>;
|
|
24
|
+
}
|
|
25
|
+
export interface OwnershipDriftInput {
|
|
26
|
+
/** History of per-commit contribution events across the target (file or community). */
|
|
27
|
+
readonly commits: readonly CommitContribution[];
|
|
28
|
+
/** Reference "now" in epoch seconds. */
|
|
29
|
+
readonly nowEpochSec: number;
|
|
30
|
+
}
|
|
31
|
+
export interface OwnershipDriftResult {
|
|
32
|
+
readonly drift30d: number;
|
|
33
|
+
readonly drift90d: number;
|
|
34
|
+
readonly drift365d: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compute the three rolling drift values. Windows with fewer than two samples
|
|
38
|
+
* yield drift = 0 (no variation detectable).
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeOwnershipDrift(input: OwnershipDriftInput): OwnershipDriftResult;
|
|
41
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../../src/pipeline/ownership-helpers/drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,wCAAwC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAMtF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ownership drift helpers.
|
|
3
|
+
*
|
|
4
|
+
* For each of three rolling windows (30, 90, 365 days) we compute the stddev
|
|
5
|
+
* of the top-3 contributors' line share across the window. A high stddev
|
|
6
|
+
* implies ownership changed hands inside the window; a low stddev implies
|
|
7
|
+
* steady ownership.
|
|
8
|
+
*
|
|
9
|
+
* Sampling plan (see research notes §9):
|
|
10
|
+
* - 30d window: 4 weekly samples.
|
|
11
|
+
* - 90d window: 13 weekly samples.
|
|
12
|
+
* - 365d window: 52 weekly samples.
|
|
13
|
+
*
|
|
14
|
+
* Samples are anchored to `nowEpochSec`. At each sample tick we project the
|
|
15
|
+
* set of commits whose `ct <= tick` down onto each contributor's cumulative
|
|
16
|
+
* line share and record the top-3 contributors' shares. Stddev is taken over
|
|
17
|
+
* the concatenation of the three contributors' share vectors across ticks.
|
|
18
|
+
*/
|
|
19
|
+
const DAY_SEC = 86_400;
|
|
20
|
+
const WEEK_SEC = 7 * DAY_SEC;
|
|
21
|
+
/**
|
|
22
|
+
* Compute the three rolling drift values. Windows with fewer than two samples
|
|
23
|
+
* yield drift = 0 (no variation detectable).
|
|
24
|
+
*/
|
|
25
|
+
export function computeOwnershipDrift(input) {
|
|
26
|
+
return {
|
|
27
|
+
drift30d: driftForWindow(input, 30 * DAY_SEC, 4),
|
|
28
|
+
drift90d: driftForWindow(input, 90 * DAY_SEC, 13),
|
|
29
|
+
drift365d: driftForWindow(input, 365 * DAY_SEC, 52),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function driftForWindow(input, windowSec, sampleCount) {
|
|
33
|
+
if (sampleCount < 2)
|
|
34
|
+
return 0;
|
|
35
|
+
const windowStart = input.nowEpochSec - windowSec;
|
|
36
|
+
// Filter commits inside the window; we still want older commits for the
|
|
37
|
+
// "prior share" baseline but they don't contribute new line-share movement
|
|
38
|
+
// within the window.
|
|
39
|
+
const relevantCommits = input.commits.filter((c) => c.ctEpochSec >= windowStart);
|
|
40
|
+
if (relevantCommits.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
const sortedCommits = [...input.commits].sort((a, b) => a.ctEpochSec - b.ctEpochSec);
|
|
43
|
+
const sampleTicks = [];
|
|
44
|
+
// Tick spacing: one per week, capped at `sampleCount` ticks, newest last.
|
|
45
|
+
for (let i = sampleCount - 1; i >= 0; i -= 1) {
|
|
46
|
+
const tickSec = input.nowEpochSec - i * WEEK_SEC;
|
|
47
|
+
if (tickSec < windowStart)
|
|
48
|
+
continue;
|
|
49
|
+
sampleTicks.push(tickSec);
|
|
50
|
+
}
|
|
51
|
+
if (sampleTicks.length < 2)
|
|
52
|
+
return 0;
|
|
53
|
+
// For each tick, compute cumulative shares and pick top-3 by cumulative
|
|
54
|
+
// lines. Track each selected contributor's share at the tick.
|
|
55
|
+
const perContributorShares = new Map();
|
|
56
|
+
const cumulative = new Map();
|
|
57
|
+
let sortedIdx = 0;
|
|
58
|
+
for (const tickSec of sampleTicks) {
|
|
59
|
+
while (sortedIdx < sortedCommits.length) {
|
|
60
|
+
const commit = sortedCommits[sortedIdx];
|
|
61
|
+
if (commit === undefined)
|
|
62
|
+
break;
|
|
63
|
+
if (commit.ctEpochSec > tickSec)
|
|
64
|
+
break;
|
|
65
|
+
for (const [email, lines] of commit.contributions) {
|
|
66
|
+
cumulative.set(email, (cumulative.get(email) ?? 0) + lines);
|
|
67
|
+
}
|
|
68
|
+
sortedIdx += 1;
|
|
69
|
+
}
|
|
70
|
+
let total = 0;
|
|
71
|
+
for (const v of cumulative.values())
|
|
72
|
+
total += v;
|
|
73
|
+
if (total === 0)
|
|
74
|
+
continue;
|
|
75
|
+
const top3 = [...cumulative.entries()]
|
|
76
|
+
.sort((a, b) => {
|
|
77
|
+
if (a[1] !== b[1])
|
|
78
|
+
return b[1] - a[1];
|
|
79
|
+
return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;
|
|
80
|
+
})
|
|
81
|
+
.slice(0, 3);
|
|
82
|
+
for (const [email, lines] of top3) {
|
|
83
|
+
const share = lines / total;
|
|
84
|
+
const arr = perContributorShares.get(email);
|
|
85
|
+
if (arr === undefined)
|
|
86
|
+
perContributorShares.set(email, [share]);
|
|
87
|
+
else
|
|
88
|
+
arr.push(share);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Flatten shares across top-3 contributors and compute stddev.
|
|
92
|
+
const flat = [];
|
|
93
|
+
for (const arr of perContributorShares.values()) {
|
|
94
|
+
for (const v of arr)
|
|
95
|
+
flat.push(v);
|
|
96
|
+
}
|
|
97
|
+
if (flat.length < 2)
|
|
98
|
+
return 0;
|
|
99
|
+
return round4(stddev(flat));
|
|
100
|
+
}
|
|
101
|
+
function stddev(values) {
|
|
102
|
+
const n = values.length;
|
|
103
|
+
if (n < 2)
|
|
104
|
+
return 0;
|
|
105
|
+
let mean = 0;
|
|
106
|
+
for (const v of values)
|
|
107
|
+
mean += v;
|
|
108
|
+
mean /= n;
|
|
109
|
+
let variance = 0;
|
|
110
|
+
for (const v of values) {
|
|
111
|
+
const d = v - mean;
|
|
112
|
+
variance += d * d;
|
|
113
|
+
}
|
|
114
|
+
variance /= n; // population stddev — fixture tests prefer this form.
|
|
115
|
+
return Math.sqrt(variance);
|
|
116
|
+
}
|
|
117
|
+
function round4(n) {
|
|
118
|
+
if (!Number.isFinite(n))
|
|
119
|
+
return 0;
|
|
120
|
+
return Math.round(n * 10_000) / 10_000;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../../src/pipeline/ownership-helpers/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community-level truck-factor aggregation.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: union every member File's per-contributor line count into a single
|
|
5
|
+
* vector, then compute the corrected Gini → bus-factor mapping the temporal
|
|
6
|
+
* phase already uses for File nodes. This collapses "how many people does the
|
|
7
|
+
* community depend on" into a single integer without the simple-min failure
|
|
8
|
+
* mode (one single-owner test file would otherwise tank an entire community).
|
|
9
|
+
*
|
|
10
|
+
* The vector is the sum of each contributor's lines across all member files,
|
|
11
|
+
* so a contributor who owns 50 lines in file A and 30 lines in file B
|
|
12
|
+
* contributes 80 lines to the community vector.
|
|
13
|
+
*/
|
|
14
|
+
import type { ContributorWeight } from "./line-overlap.js";
|
|
15
|
+
export interface CommunityTruckFactorInput {
|
|
16
|
+
/** One entry per member File — the contributor line-share vector for that file. */
|
|
17
|
+
readonly memberFiles: ReadonlyArray<readonly ContributorWeight[]>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compute the community truck factor. Empty input → 1 (a community with no
|
|
21
|
+
* ownership signals is maximally concentrated by default).
|
|
22
|
+
*/
|
|
23
|
+
export declare function communityTruckFactor(input: CommunityTruckFactorInput): number;
|
|
24
|
+
//# sourceMappingURL=gini-community.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gini-community.d.ts","sourceRoot":"","sources":["../../../src/pipeline/ownership-helpers/gini-community.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,yBAAyB;IACxC,mFAAmF;IACnF,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,MAAM,CAU7E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community-level truck-factor aggregation.
|
|
3
|
+
*
|
|
4
|
+
* Strategy: union every member File's per-contributor line count into a single
|
|
5
|
+
* vector, then compute the corrected Gini → bus-factor mapping the temporal
|
|
6
|
+
* phase already uses for File nodes. This collapses "how many people does the
|
|
7
|
+
* community depend on" into a single integer without the simple-min failure
|
|
8
|
+
* mode (one single-owner test file would otherwise tank an entire community).
|
|
9
|
+
*
|
|
10
|
+
* The vector is the sum of each contributor's lines across all member files,
|
|
11
|
+
* so a contributor who owns 50 lines in file A and 30 lines in file B
|
|
12
|
+
* contributes 80 lines to the community vector.
|
|
13
|
+
*/
|
|
14
|
+
import { busFactor } from "../phases/temporal-helpers/gini.js";
|
|
15
|
+
/**
|
|
16
|
+
* Compute the community truck factor. Empty input → 1 (a community with no
|
|
17
|
+
* ownership signals is maximally concentrated by default).
|
|
18
|
+
*/
|
|
19
|
+
export function communityTruckFactor(input) {
|
|
20
|
+
const totals = new Map();
|
|
21
|
+
for (const fileContribs of input.memberFiles) {
|
|
22
|
+
for (const contrib of fileContribs) {
|
|
23
|
+
if (contrib.lines <= 0)
|
|
24
|
+
continue;
|
|
25
|
+
totals.set(contrib.email, (totals.get(contrib.email) ?? 0) + contrib.lines);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (totals.size === 0)
|
|
29
|
+
return 1;
|
|
30
|
+
return busFactor([...totals.values()]);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=gini-community.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gini-community.js","sourceRoot":"","sources":["../../../src/pipeline/ownership-helpers/gini-community.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAQ/D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAgC;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC;gBAAE,SAAS;YACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch-blame helper for the ownership phase.
|
|
3
|
+
*
|
|
4
|
+
* `git` exposes no native multi-file blame command, so we parallelise per-file
|
|
5
|
+
* `git blame --porcelain` invocations behind a bounded concurrency pool. Two
|
|
6
|
+
* one-time set-up steps precede the fleet to minimise per-file cost:
|
|
7
|
+
* 1. `git commit-graph write --reachable --changed-paths` materialises Bloom
|
|
8
|
+
* filters the blame engine uses to skip unrelated commits (2-6× speedup).
|
|
9
|
+
* 2. We resolve parallelism to `max(2, availableParallelism - 2)` capped at
|
|
10
|
+
* 32 — past that, I/O contention dominates.
|
|
11
|
+
*
|
|
12
|
+
* The porcelain format is deterministic line-by-line:
|
|
13
|
+
* <commit-sha> <orig-line> <final-line> [<group-size>]
|
|
14
|
+
* author <name>
|
|
15
|
+
* author-mail <<email>>
|
|
16
|
+
* ... other headers, terminated by a `\t<literal source line>` marker.
|
|
17
|
+
*
|
|
18
|
+
* A commit-sha repeats its headers only on the first line of each group, so a
|
|
19
|
+
* cache of sha → author metadata short-circuits repeat headers. Output is a
|
|
20
|
+
* deterministic `Map<relPath, LineOwner[]>`; the map preserves caller-provided
|
|
21
|
+
* insertion order but each `LineOwner[]` is ordered by line number.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Per-line attribution emitted by `git blame --porcelain`. The email is
|
|
25
|
+
* lowercased at parse time for consistent hashing downstream.
|
|
26
|
+
*/
|
|
27
|
+
export interface LineOwner {
|
|
28
|
+
readonly line: number;
|
|
29
|
+
readonly email: string;
|
|
30
|
+
readonly authorName: string;
|
|
31
|
+
readonly sha: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BatchBlameResult {
|
|
34
|
+
/** Per-file line-by-line attribution map. */
|
|
35
|
+
readonly byFile: ReadonlyMap<string, readonly LineOwner[]>;
|
|
36
|
+
/** Number of `git blame` subprocesses spawned (excludes the commit-graph warm-up). */
|
|
37
|
+
readonly subprocessCount: number;
|
|
38
|
+
/** Number of files skipped because blame failed (never-committed, binary, etc). */
|
|
39
|
+
readonly skippedCount: number;
|
|
40
|
+
}
|
|
41
|
+
export interface BatchBlameOptions {
|
|
42
|
+
/** Override concurrency; defaults to `max(2, availableParallelism - 2)` capped at 32. */
|
|
43
|
+
readonly concurrency?: number;
|
|
44
|
+
/**
|
|
45
|
+
* If `false`, skip the `git commit-graph write` warm-up. Useful when callers
|
|
46
|
+
* know the graph is already current or when running against a shallow clone
|
|
47
|
+
* where `--reachable` would fail.
|
|
48
|
+
*/
|
|
49
|
+
readonly warmCommitGraph?: boolean;
|
|
50
|
+
/** Optional sink for per-file warnings. */
|
|
51
|
+
readonly onWarn?: (relPath: string, message: string) => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Run `git blame --porcelain` against each `relPaths` entry in parallel and
|
|
55
|
+
* return the aggregated attribution map.
|
|
56
|
+
*
|
|
57
|
+
* Determinism: outputs are inserted into the map in sorted `relPath` order
|
|
58
|
+
* regardless of completion order, and each per-file `LineOwner[]` is sorted
|
|
59
|
+
* by line number.
|
|
60
|
+
*/
|
|
61
|
+
export declare function batchBlame(repoPath: string, relPaths: readonly string[], opts?: BatchBlameOptions): Promise<BatchBlameResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Parse `git blame --porcelain` output into per-line owners.
|
|
64
|
+
*
|
|
65
|
+
* The format groups consecutive lines attributed to the same commit; only the
|
|
66
|
+
* first line of each group includes the `author` / `author-mail` headers. We
|
|
67
|
+
* cache per-sha author metadata across groups so later groups can reuse the
|
|
68
|
+
* first group's headers.
|
|
69
|
+
*/
|
|
70
|
+
export declare function parsePorcelainBlame(stdout: string): LineOwner[];
|
|
71
|
+
//# sourceMappingURL=git-blame-batcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-blame-batcher.d.ts","sourceRoot":"","sources":["../../../src/pipeline/ownership-helpers/git-blame-batcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAWH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC,CAAC;IAC3D,sFAAsF;IACtF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA8D3B;AAYD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAiD/D"}
|