@monoes/monograph 1.2.0 → 1.2.2
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/.monomind/loops/mastermind-review-1782162423447.json +16 -0
- package/__tests__/mcp-tools/cypher.test.ts +10 -6
- package/__tests__/mcp-tools/detect-changes.test.ts +14 -11
- package/__tests__/pipeline/phases/wildcard-synthesis.test.ts +4 -4
- package/__tests__/search/embed-batch-config.test.ts +7 -7
- package/__tests__/search/hybrid-query.test.ts +3 -1
- package/__tests__/web/api.test.ts +1 -1
- package/dist/src/analysis/churn-cache.d.ts.map +1 -1
- package/dist/src/analysis/churn-cache.js +19 -6
- package/dist/src/analysis/churn-cache.js.map +1 -1
- package/dist/src/analysis/churn-trend.d.ts.map +1 -1
- package/dist/src/analysis/churn-trend.js +50 -6
- package/dist/src/analysis/churn-trend.js.map +1 -1
- package/dist/src/analysis/cluster-quality.d.ts +3 -0
- package/dist/src/analysis/cluster-quality.d.ts.map +1 -1
- package/dist/src/analysis/cluster-quality.js +18 -12
- package/dist/src/analysis/cluster-quality.js.map +1 -1
- package/dist/src/analysis/coverage-gaps.d.ts +3 -0
- package/dist/src/analysis/coverage-gaps.d.ts.map +1 -1
- package/dist/src/analysis/coverage-gaps.js +40 -1
- package/dist/src/analysis/coverage-gaps.js.map +1 -1
- package/dist/src/analysis/dep-classification.d.ts +2 -0
- package/dist/src/analysis/dep-classification.d.ts.map +1 -1
- package/dist/src/analysis/dep-classification.js +30 -0
- package/dist/src/analysis/dep-classification.js.map +1 -1
- package/dist/src/analysis/dependency-health.d.ts +4 -0
- package/dist/src/analysis/dependency-health.d.ts.map +1 -1
- package/dist/src/analysis/dependency-health.js +28 -0
- package/dist/src/analysis/dependency-health.js.map +1 -1
- package/dist/src/analysis/duplicate-exports.d.ts +9 -5
- package/dist/src/analysis/duplicate-exports.d.ts.map +1 -1
- package/dist/src/analysis/duplicate-exports.js +26 -2
- package/dist/src/analysis/duplicate-exports.js.map +1 -1
- package/dist/src/analysis/feature-flags.d.ts.map +1 -1
- package/dist/src/analysis/feature-flags.js +36 -17
- package/dist/src/analysis/feature-flags.js.map +1 -1
- package/dist/src/analysis/node-similarity.d.ts +19 -0
- package/dist/src/analysis/node-similarity.d.ts.map +1 -1
- package/dist/src/analysis/node-similarity.js +34 -3
- package/dist/src/analysis/node-similarity.js.map +1 -1
- package/dist/src/analysis/private-type-leaks.d.ts +4 -0
- package/dist/src/analysis/private-type-leaks.d.ts.map +1 -1
- package/dist/src/analysis/private-type-leaks.js +43 -2
- package/dist/src/analysis/private-type-leaks.js.map +1 -1
- package/dist/src/analysis/project-state.d.ts +2 -0
- package/dist/src/analysis/project-state.d.ts.map +1 -1
- package/dist/src/analysis/project-state.js +18 -7
- package/dist/src/analysis/project-state.js.map +1 -1
- package/dist/src/analysis/suppressions.d.ts.map +1 -1
- package/dist/src/analysis/suppressions.js +3 -1
- package/dist/src/analysis/suppressions.js.map +1 -1
- package/dist/src/analysis/trace.d.ts +5 -3
- package/dist/src/analysis/trace.d.ts.map +1 -1
- package/dist/src/analysis/trace.js +59 -53
- package/dist/src/analysis/trace.js.map +1 -1
- package/dist/src/analysis/unused-class-members.d.ts.map +1 -1
- package/dist/src/analysis/unused-class-members.js +7 -1
- package/dist/src/analysis/unused-class-members.js.map +1 -1
- package/dist/src/analysis/worker-pool.d.ts +3 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -1
- package/dist/src/analysis/worker-pool.js +30 -8
- package/dist/src/analysis/worker-pool.js.map +1 -1
- package/dist/src/cli/augment.d.ts.map +1 -1
- package/dist/src/cli/augment.js +10 -3
- package/dist/src/cli/augment.js.map +1 -1
- package/dist/src/cli/skill-gen.js +3 -0
- package/dist/src/cli/skill-gen.js.map +1 -1
- package/dist/src/export/sarif.js +5 -5
- package/dist/src/export/sarif.js.map +1 -1
- package/dist/src/graph/analyzer.d.ts.map +1 -1
- package/dist/src/graph/analyzer.js +17 -2
- package/dist/src/graph/analyzer.js.map +1 -1
- package/dist/src/graph/author-analytics.d.ts +2 -0
- package/dist/src/graph/author-analytics.d.ts.map +1 -1
- package/dist/src/graph/author-analytics.js +39 -5
- package/dist/src/graph/author-analytics.js.map +1 -1
- package/dist/src/graph/baseline.d.ts +5 -0
- package/dist/src/graph/baseline.d.ts.map +1 -1
- package/dist/src/graph/baseline.js +65 -18
- package/dist/src/graph/baseline.js.map +1 -1
- package/dist/src/graph/clone-detector.d.ts.map +1 -1
- package/dist/src/graph/clone-detector.js +19 -33
- package/dist/src/graph/clone-detector.js.map +1 -1
- package/dist/src/graph/clone-families.d.ts +2 -0
- package/dist/src/graph/clone-families.d.ts.map +1 -1
- package/dist/src/graph/clone-families.js +38 -10
- package/dist/src/graph/clone-families.js.map +1 -1
- package/dist/src/graph/codeowners-extended.d.ts +17 -0
- package/dist/src/graph/codeowners-extended.d.ts.map +1 -1
- package/dist/src/graph/codeowners-extended.js +42 -0
- package/dist/src/graph/codeowners-extended.js.map +1 -1
- package/dist/src/graph/codeowners-gitlab.d.ts +21 -0
- package/dist/src/graph/codeowners-gitlab.d.ts.map +1 -1
- package/dist/src/graph/codeowners-gitlab.js +37 -0
- package/dist/src/graph/codeowners-gitlab.js.map +1 -1
- package/dist/src/graph/codeowners.d.ts +10 -0
- package/dist/src/graph/codeowners.d.ts.map +1 -1
- package/dist/src/graph/codeowners.js +24 -2
- package/dist/src/graph/codeowners.js.map +1 -1
- package/dist/src/graph/complexity.d.ts +10 -0
- package/dist/src/graph/complexity.d.ts.map +1 -1
- package/dist/src/graph/complexity.js +93 -43
- package/dist/src/graph/complexity.js.map +1 -1
- package/dist/src/graph/cross-reference-findings.d.ts.map +1 -1
- package/dist/src/graph/cross-reference-findings.js +19 -2
- package/dist/src/graph/cross-reference-findings.js.map +1 -1
- package/dist/src/graph/cross-reference.d.ts +4 -0
- package/dist/src/graph/cross-reference.d.ts.map +1 -1
- package/dist/src/graph/cross-reference.js +23 -0
- package/dist/src/graph/cross-reference.js.map +1 -1
- package/dist/src/graph/cycle-detection.d.ts +2 -0
- package/dist/src/graph/cycle-detection.d.ts.map +1 -1
- package/dist/src/graph/cycle-detection.js +26 -3
- package/dist/src/graph/cycle-detection.js.map +1 -1
- package/dist/src/graph/cycles.d.ts +11 -3
- package/dist/src/graph/cycles.d.ts.map +1 -1
- package/dist/src/graph/cycles.js +121 -83
- package/dist/src/graph/cycles.js.map +1 -1
- package/dist/src/graph/dead-code.d.ts +23 -0
- package/dist/src/graph/dead-code.d.ts.map +1 -1
- package/dist/src/graph/dead-code.js +53 -13
- package/dist/src/graph/dead-code.js.map +1 -1
- package/dist/src/graph/dependency-closure.d.ts.map +1 -1
- package/dist/src/graph/dependency-closure.js +20 -4
- package/dist/src/graph/dependency-closure.js.map +1 -1
- package/dist/src/graph/dfs.d.ts +14 -0
- package/dist/src/graph/dfs.d.ts.map +1 -1
- package/dist/src/graph/dfs.js +61 -0
- package/dist/src/graph/dfs.js.map +1 -1
- package/dist/src/graph/duplication-stats.d.ts.map +1 -1
- package/dist/src/graph/duplication-stats.js +19 -3
- package/dist/src/graph/duplication-stats.js.map +1 -1
- package/dist/src/graph/edge-filter.d.ts +2 -0
- package/dist/src/graph/edge-filter.d.ts.map +1 -1
- package/dist/src/graph/edge-filter.js +26 -12
- package/dist/src/graph/edge-filter.js.map +1 -1
- package/dist/src/graph/health-score.d.ts +8 -0
- package/dist/src/graph/health-score.d.ts.map +1 -1
- package/dist/src/graph/health-score.js +48 -17
- package/dist/src/graph/health-score.js.map +1 -1
- package/dist/src/graph/hotspots.d.ts +7 -0
- package/dist/src/graph/hotspots.d.ts.map +1 -1
- package/dist/src/graph/hotspots.js +50 -5
- package/dist/src/graph/hotspots.js.map +1 -1
- package/dist/src/graph/import-chain.d.ts +17 -1
- package/dist/src/graph/import-chain.d.ts.map +1 -1
- package/dist/src/graph/import-chain.js +68 -19
- package/dist/src/graph/import-chain.js.map +1 -1
- package/dist/src/graph/loader.d.ts.map +1 -1
- package/dist/src/graph/loader.js +9 -10
- package/dist/src/graph/loader.js.map +1 -1
- package/dist/src/graph/maintainability.d.ts +8 -0
- package/dist/src/graph/maintainability.d.ts.map +1 -1
- package/dist/src/graph/maintainability.js +65 -10
- package/dist/src/graph/maintainability.js.map +1 -1
- package/dist/src/graph/mirrored-dirs.d.ts +4 -0
- package/dist/src/graph/mirrored-dirs.d.ts.map +1 -1
- package/dist/src/graph/mirrored-dirs.js +48 -13
- package/dist/src/graph/mirrored-dirs.js.map +1 -1
- package/dist/src/graph/narrowing.d.ts +15 -0
- package/dist/src/graph/narrowing.d.ts.map +1 -1
- package/dist/src/graph/narrowing.js +33 -0
- package/dist/src/graph/narrowing.js.map +1 -1
- package/dist/src/graph/node-search.d.ts +3 -0
- package/dist/src/graph/node-search.d.ts.map +1 -1
- package/dist/src/graph/node-search.js +37 -4
- package/dist/src/graph/node-search.js.map +1 -1
- package/dist/src/graph/normalize-id.d.ts +4 -0
- package/dist/src/graph/normalize-id.d.ts.map +1 -1
- package/dist/src/graph/normalize-id.js +25 -2
- package/dist/src/graph/normalize-id.js.map +1 -1
- package/dist/src/graph/pagerank.d.ts +7 -0
- package/dist/src/graph/pagerank.d.ts.map +1 -1
- package/dist/src/graph/pagerank.js +49 -2
- package/dist/src/graph/pagerank.js.map +1 -1
- package/dist/src/graph/prune.d.ts +31 -0
- package/dist/src/graph/prune.d.ts.map +1 -1
- package/dist/src/graph/prune.js +65 -0
- package/dist/src/graph/prune.js.map +1 -1
- package/dist/src/graph/regex-search.d.ts +10 -2
- package/dist/src/graph/regex-search.d.ts.map +1 -1
- package/dist/src/graph/regex-search.js +33 -4
- package/dist/src/graph/regex-search.js.map +1 -1
- package/dist/src/graph/regression.d.ts +5 -0
- package/dist/src/graph/regression.d.ts.map +1 -1
- package/dist/src/graph/regression.js +45 -23
- package/dist/src/graph/regression.js.map +1 -1
- package/dist/src/graph/ripple-impact.d.ts +27 -0
- package/dist/src/graph/ripple-impact.d.ts.map +1 -1
- package/dist/src/graph/ripple-impact.js +55 -7
- package/dist/src/graph/ripple-impact.js.map +1 -1
- package/dist/src/graph/risk-profile.d.ts +7 -0
- package/dist/src/graph/risk-profile.d.ts.map +1 -1
- package/dist/src/graph/risk-profile.js +82 -48
- package/dist/src/graph/risk-profile.js.map +1 -1
- package/dist/src/graph/shingle-filter.d.ts.map +1 -1
- package/dist/src/graph/shingle-filter.js +25 -26
- package/dist/src/graph/shingle-filter.js.map +1 -1
- package/dist/src/graph/statistics.d.ts +19 -0
- package/dist/src/graph/statistics.d.ts.map +1 -1
- package/dist/src/graph/statistics.js +53 -40
- package/dist/src/graph/statistics.js.map +1 -1
- package/dist/src/graph/stats.d.ts +2 -0
- package/dist/src/graph/stats.d.ts.map +1 -1
- package/dist/src/graph/stats.js +54 -8
- package/dist/src/graph/stats.js.map +1 -1
- package/dist/src/graph/subgraph.d.ts +5 -0
- package/dist/src/graph/subgraph.d.ts.map +1 -1
- package/dist/src/graph/subgraph.js +73 -9
- package/dist/src/graph/subgraph.js.map +1 -1
- package/dist/src/graph/topo-sort.d.ts +15 -0
- package/dist/src/graph/topo-sort.d.ts.map +1 -1
- package/dist/src/graph/topo-sort.js +83 -10
- package/dist/src/graph/topo-sort.js.map +1 -1
- package/dist/src/graph/wcc.d.ts +29 -0
- package/dist/src/graph/wcc.d.ts.map +1 -1
- package/dist/src/graph/wcc.js +122 -39
- package/dist/src/graph/wcc.js.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-tools/api-impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/api-impact.js +13 -6
- package/dist/src/mcp-tools/api-impact.js.map +1 -1
- package/dist/src/mcp-tools/context.d.ts.map +1 -1
- package/dist/src/mcp-tools/context.js +19 -29
- package/dist/src/mcp-tools/context.js.map +1 -1
- package/dist/src/mcp-tools/cypher.d.ts +11 -0
- package/dist/src/mcp-tools/cypher.d.ts.map +1 -1
- package/dist/src/mcp-tools/cypher.js +13 -1
- package/dist/src/mcp-tools/cypher.js.map +1 -1
- package/dist/src/mcp-tools/detect-changes.d.ts.map +1 -1
- package/dist/src/mcp-tools/detect-changes.js +35 -20
- package/dist/src/mcp-tools/detect-changes.js.map +1 -1
- package/dist/src/mcp-tools/explain.d.ts.map +1 -1
- package/dist/src/mcp-tools/explain.js +4 -1
- package/dist/src/mcp-tools/explain.js.map +1 -1
- package/dist/src/mcp-tools/graph-query.d.ts +2 -0
- package/dist/src/mcp-tools/graph-query.d.ts.map +1 -1
- package/dist/src/mcp-tools/graph-query.js +20 -3
- package/dist/src/mcp-tools/graph-query.js.map +1 -1
- package/dist/src/mcp-tools/group-list.d.ts +1 -0
- package/dist/src/mcp-tools/group-list.d.ts.map +1 -1
- package/dist/src/mcp-tools/group-list.js +7 -9
- package/dist/src/mcp-tools/group-list.js.map +1 -1
- package/dist/src/mcp-tools/impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/impact.js +20 -59
- package/dist/src/mcp-tools/impact.js.map +1 -1
- package/dist/src/mcp-tools/neighbors.d.ts.map +1 -1
- package/dist/src/mcp-tools/neighbors.js +24 -33
- package/dist/src/mcp-tools/neighbors.js.map +1 -1
- package/dist/src/mcp-tools/query.d.ts +2 -0
- package/dist/src/mcp-tools/query.d.ts.map +1 -1
- package/dist/src/mcp-tools/query.js +1 -0
- package/dist/src/mcp-tools/query.js.map +1 -1
- package/dist/src/mcp-tools/rename.d.ts.map +1 -1
- package/dist/src/mcp-tools/rename.js +12 -7
- package/dist/src/mcp-tools/rename.js.map +1 -1
- package/dist/src/mcp-tools/route-map.d.ts.map +1 -1
- package/dist/src/mcp-tools/route-map.js +19 -23
- package/dist/src/mcp-tools/route-map.js.map +1 -1
- package/dist/src/mcp-tools/shape-check.d.ts.map +1 -1
- package/dist/src/mcp-tools/shape-check.js +17 -13
- package/dist/src/mcp-tools/shape-check.js.map +1 -1
- package/dist/src/parsers/loader.js +6 -5
- package/dist/src/parsers/loader.js.map +1 -1
- package/dist/src/pipeline/cluster-only.d.ts.map +1 -1
- package/dist/src/pipeline/cluster-only.js +8 -4
- package/dist/src/pipeline/cluster-only.js.map +1 -1
- package/dist/src/pipeline/orchestrator.d.ts +2 -0
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/src/pipeline/orchestrator.js +19 -0
- package/dist/src/pipeline/orchestrator.js.map +1 -1
- package/dist/src/pipeline/phases/boundary.d.ts +2 -0
- package/dist/src/pipeline/phases/boundary.d.ts.map +1 -1
- package/dist/src/pipeline/phases/boundary.js +31 -2
- package/dist/src/pipeline/phases/boundary.js.map +1 -1
- package/dist/src/pipeline/phases/communities.d.ts +14 -0
- package/dist/src/pipeline/phases/communities.d.ts.map +1 -1
- package/dist/src/pipeline/phases/communities.js +58 -5
- package/dist/src/pipeline/phases/communities.js.map +1 -1
- package/dist/src/pipeline/phases/contextual-proximity.d.ts.map +1 -1
- package/dist/src/pipeline/phases/contextual-proximity.js +21 -14
- package/dist/src/pipeline/phases/contextual-proximity.js.map +1 -1
- package/dist/src/pipeline/phases/cross-file.d.ts.map +1 -1
- package/dist/src/pipeline/phases/cross-file.js +35 -14
- package/dist/src/pipeline/phases/cross-file.js.map +1 -1
- package/dist/src/pipeline/phases/field-access.d.ts.map +1 -1
- package/dist/src/pipeline/phases/field-access.js +9 -4
- package/dist/src/pipeline/phases/field-access.js.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.d.ts +4 -0
- package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -1
- package/dist/src/pipeline/phases/god-nodes.js +43 -9
- package/dist/src/pipeline/phases/god-nodes.js.map +1 -1
- package/dist/src/pipeline/phases/import-resolver.d.ts +11 -0
- package/dist/src/pipeline/phases/import-resolver.d.ts.map +1 -1
- package/dist/src/pipeline/phases/import-resolver.js +34 -7
- package/dist/src/pipeline/phases/import-resolver.js.map +1 -1
- package/dist/src/pipeline/phases/leiden.d.ts.map +1 -1
- package/dist/src/pipeline/phases/leiden.js +27 -19
- package/dist/src/pipeline/phases/leiden.js.map +1 -1
- package/dist/src/pipeline/phases/markdown.d.ts.map +1 -1
- package/dist/src/pipeline/phases/markdown.js +10 -5
- package/dist/src/pipeline/phases/markdown.js.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.d.ts.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.js +18 -3
- package/dist/src/pipeline/phases/pdf-parse.js.map +1 -1
- package/dist/src/pipeline/phases/processes.d.ts.map +1 -1
- package/dist/src/pipeline/phases/processes.js +26 -9
- package/dist/src/pipeline/phases/processes.js.map +1 -1
- package/dist/src/pipeline/phases/re-export-propagation.d.ts.map +1 -1
- package/dist/src/pipeline/phases/re-export-propagation.js +33 -14
- package/dist/src/pipeline/phases/re-export-propagation.js.map +1 -1
- package/dist/src/pipeline/phases/reachability.d.ts.map +1 -1
- package/dist/src/pipeline/phases/reachability.js +42 -26
- package/dist/src/pipeline/phases/reachability.js.map +1 -1
- package/dist/src/pipeline/phases/routes.d.ts.map +1 -1
- package/dist/src/pipeline/phases/routes.js +30 -21
- package/dist/src/pipeline/phases/routes.js.map +1 -1
- package/dist/src/pipeline/phases/scope-resolution.d.ts.map +1 -1
- package/dist/src/pipeline/phases/scope-resolution.js +93 -63
- package/dist/src/pipeline/phases/scope-resolution.js.map +1 -1
- package/dist/src/pipeline/runner.d.ts +4 -0
- package/dist/src/pipeline/runner.d.ts.map +1 -1
- package/dist/src/pipeline/runner.js +30 -11
- package/dist/src/pipeline/runner.js.map +1 -1
- package/dist/src/query/cypher-parser.d.ts +20 -0
- package/dist/src/query/cypher-parser.d.ts.map +1 -1
- package/dist/src/query/cypher-parser.js +73 -0
- package/dist/src/query/cypher-parser.js.map +1 -1
- package/dist/src/search/embed-batch.d.ts.map +1 -1
- package/dist/src/search/embed-batch.js +4 -1
- package/dist/src/search/embed-batch.js.map +1 -1
- package/dist/src/search/hybrid-query.d.ts +4 -0
- package/dist/src/search/hybrid-query.d.ts.map +1 -1
- package/dist/src/search/hybrid-query.js +5 -1
- package/dist/src/search/hybrid-query.js.map +1 -1
- package/dist/src/staleness/git-staleness.js +3 -3
- package/dist/src/staleness/git-staleness.js.map +1 -1
- package/dist/src/storage/db.d.ts.map +1 -1
- package/dist/src/storage/db.js +12 -0
- package/dist/src/storage/db.js.map +1 -1
- package/dist/src/storage/edge-store.d.ts +2 -0
- package/dist/src/storage/edge-store.d.ts.map +1 -1
- package/dist/src/storage/edge-store.js +26 -1
- package/dist/src/storage/edge-store.js.map +1 -1
- package/dist/src/storage/embedding-store.d.ts +16 -0
- package/dist/src/storage/embedding-store.d.ts.map +1 -1
- package/dist/src/storage/embedding-store.js +26 -2
- package/dist/src/storage/embedding-store.js.map +1 -1
- package/dist/src/storage/file-cache.d.ts +5 -0
- package/dist/src/storage/file-cache.d.ts.map +1 -1
- package/dist/src/storage/file-cache.js +35 -9
- package/dist/src/storage/file-cache.js.map +1 -1
- package/dist/src/storage/fts-store.d.ts +4 -0
- package/dist/src/storage/fts-store.d.ts.map +1 -1
- package/dist/src/storage/fts-store.js +8 -3
- package/dist/src/storage/fts-store.js.map +1 -1
- package/dist/src/storage/node-store.d.ts +2 -0
- package/dist/src/storage/node-store.d.ts.map +1 -1
- package/dist/src/storage/node-store.js +28 -1
- package/dist/src/storage/node-store.js.map +1 -1
- package/dist/src/wiki/wiki-generator.d.ts.map +1 -1
- package/dist/src/wiki/wiki-generator.js +5 -1
- package/dist/src/wiki/wiki-generator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/__tests__/pipeline/runner.parallel.test.ts +2 -2
- package/src/analysis/churn-cache.ts +18 -7
- package/src/analysis/churn-trend.ts +35 -6
- package/src/analysis/cluster-quality.ts +20 -11
- package/src/analysis/coverage-gaps.ts +44 -1
- package/src/analysis/dep-classification.ts +34 -0
- package/src/analysis/dependency-health.ts +25 -0
- package/src/analysis/duplicate-exports.ts +40 -4
- package/src/analysis/feature-flags.ts +37 -17
- package/src/analysis/node-similarity.ts +45 -4
- package/src/analysis/private-type-leaks.ts +49 -2
- package/src/analysis/project-state.ts +19 -9
- package/src/analysis/suppressions.ts +4 -1
- package/src/analysis/trace.ts +73 -54
- package/src/analysis/unused-class-members.ts +8 -1
- package/src/analysis/worker-pool.ts +40 -8
- package/src/cli/augment.ts +10 -3
- package/src/cli/skill-gen.ts +3 -0
- package/src/export/sarif.ts +5 -5
- package/src/graph/analyzer.ts +26 -2
- package/src/graph/author-analytics.ts +45 -5
- package/src/graph/baseline.ts +78 -24
- package/src/graph/clone-detector.ts +22 -36
- package/src/graph/clone-families.ts +34 -10
- package/src/graph/codeowners-extended.ts +54 -0
- package/src/graph/codeowners-gitlab.ts +46 -0
- package/src/graph/codeowners.ts +33 -2
- package/src/graph/complexity.ts +102 -47
- package/src/graph/cross-reference-findings.ts +23 -2
- package/src/graph/cross-reference.ts +26 -0
- package/src/graph/cycle-detection.ts +22 -3
- package/src/graph/cycles.ts +155 -96
- package/src/graph/dead-code.ts +76 -17
- package/src/graph/dependency-closure.ts +24 -7
- package/src/graph/dfs.ts +78 -0
- package/src/graph/duplication-stats.ts +17 -6
- package/src/graph/edge-filter.ts +26 -12
- package/src/graph/health-score.ts +47 -17
- package/src/graph/hotspots.ts +57 -8
- package/src/graph/import-chain.ts +89 -19
- package/src/graph/loader.ts +10 -7
- package/src/graph/maintainability.ts +72 -22
- package/src/graph/mirrored-dirs.ts +45 -14
- package/src/graph/narrowing.ts +44 -0
- package/src/graph/node-search.ts +50 -4
- package/src/graph/normalize-id.ts +26 -2
- package/src/graph/pagerank.ts +70 -2
- package/src/graph/prune.ts +76 -0
- package/src/graph/regex-search.ts +38 -4
- package/src/graph/regression.ts +48 -23
- package/src/graph/ripple-impact.ts +71 -11
- package/src/graph/risk-profile.ts +98 -53
- package/src/graph/shingle-filter.ts +33 -27
- package/src/graph/statistics.ts +73 -45
- package/src/graph/stats.ts +50 -16
- package/src/graph/subgraph.ts +97 -25
- package/src/graph/topo-sort.ts +101 -16
- package/src/graph/wcc.ts +146 -37
- package/src/index.ts +1 -1
- package/src/mcp-tools/api-impact.ts +13 -6
- package/src/mcp-tools/context.ts +31 -40
- package/src/mcp-tools/cypher.ts +14 -1
- package/src/mcp-tools/detect-changes.ts +38 -23
- package/src/mcp-tools/explain.ts +4 -1
- package/src/mcp-tools/graph-query.ts +24 -3
- package/src/mcp-tools/group-list.ts +9 -11
- package/src/mcp-tools/impact.ts +26 -66
- package/src/mcp-tools/neighbors.ts +34 -39
- package/src/mcp-tools/query.ts +3 -0
- package/src/mcp-tools/rename.ts +9 -8
- package/src/mcp-tools/route-map.ts +21 -23
- package/src/mcp-tools/shape-check.ts +18 -14
- package/src/parsers/loader.ts +5 -5
- package/src/pipeline/cluster-only.ts +8 -4
- package/src/pipeline/orchestrator.ts +22 -0
- package/src/pipeline/phases/boundary.ts +40 -2
- package/src/pipeline/phases/communities.ts +66 -5
- package/src/pipeline/phases/contextual-proximity.ts +15 -14
- package/src/pipeline/phases/cross-file.ts +35 -14
- package/src/pipeline/phases/field-access.ts +11 -4
- package/src/pipeline/phases/god-nodes.ts +47 -10
- package/src/pipeline/phases/import-resolver.ts +37 -5
- package/src/pipeline/phases/leiden.ts +25 -18
- package/src/pipeline/phases/markdown.ts +12 -7
- package/src/pipeline/phases/pdf-parse.ts +19 -2
- package/src/pipeline/phases/processes.ts +27 -15
- package/src/pipeline/phases/re-export-propagation.ts +40 -18
- package/src/pipeline/phases/reachability.ts +39 -24
- package/src/pipeline/phases/routes.ts +32 -21
- package/src/pipeline/phases/scope-resolution.ts +110 -71
- package/src/pipeline/runner.ts +28 -11
- package/src/query/cypher-parser.ts +83 -0
- package/src/search/embed-batch.ts +4 -1
- package/src/search/hybrid-query.ts +11 -1
- package/src/staleness/git-staleness.ts +3 -3
- package/src/storage/db.ts +11 -0
- package/src/storage/edge-store.ts +34 -1
- package/src/storage/embedding-store.ts +38 -6
- package/src/storage/file-cache.ts +35 -21
- package/src/storage/fts-store.ts +12 -3
- package/src/storage/node-store.ts +39 -1
- package/src/wiki/wiki-generator.ts +5 -1
- package/src/coverage/runtime.ts +0 -249
|
@@ -40,4 +40,9 @@ export interface RegressionOutcome {
|
|
|
40
40
|
* @param metricTolerances - per-metric tolerance overrides, e.g. { godNodeCount: "2", surpriseCount: "10%" }
|
|
41
41
|
*/
|
|
42
42
|
export declare function checkRegression(db: Database.Database, baselinePath: string, toleranceSpec: string, metricTolerances?: Record<string, string>): RegressionOutcome;
|
|
43
|
+
/**
|
|
44
|
+
* Format a RegressionOutcome as structured text for LLM consumption.
|
|
45
|
+
* Shows pass/fail status, per-metric results, and actionable violation details.
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatRegressionOutcome(outcome: RegressionOutcome): string;
|
|
43
48
|
//# sourceMappingURL=regression.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO;IAKP;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAoBrC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAWpD,QAAQ,IAAI,MAAM;CAGnB;AAID,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO;IAKP;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAoBrC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAWpD,QAAQ,IAAI,MAAM;CAGnB;AAID,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AA0BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,iBAAiB,CA0DnB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAmB1E"}
|
|
@@ -60,6 +60,19 @@ const FINDING_TYPE_TO_METRIC = {
|
|
|
60
60
|
unreachable_export: 'unreachableExportCount',
|
|
61
61
|
ambiguous_edge: 'ambiguousEdgeCount',
|
|
62
62
|
};
|
|
63
|
+
/** Canonical metric names — defined once to avoid duplicating the same literal Set/Object. */
|
|
64
|
+
const METRIC_NAMES = Object.values(FINDING_TYPE_TO_METRIC);
|
|
65
|
+
const METRIC_NAME_SET = new Set(METRIC_NAMES);
|
|
66
|
+
/** Module-level cache for parsed Tolerance objects — avoids re-parsing identical specs. */
|
|
67
|
+
const toleranceCache = new Map();
|
|
68
|
+
function parseTolerance(spec) {
|
|
69
|
+
let t = toleranceCache.get(spec);
|
|
70
|
+
if (!t) {
|
|
71
|
+
t = Tolerance.parse(spec);
|
|
72
|
+
toleranceCache.set(spec, t);
|
|
73
|
+
}
|
|
74
|
+
return t;
|
|
75
|
+
}
|
|
63
76
|
// ── checkRegression ───────────────────────────────────────────────────────────
|
|
64
77
|
/**
|
|
65
78
|
* Compare current DB state against a named baseline.
|
|
@@ -71,47 +84,35 @@ const FINDING_TYPE_TO_METRIC = {
|
|
|
71
84
|
*/
|
|
72
85
|
export function checkRegression(db, baselinePath, toleranceSpec, metricTolerances) {
|
|
73
86
|
const baseline = loadBaseline(baselinePath);
|
|
74
|
-
// Compute current counts from DB
|
|
87
|
+
// Compute current counts from DB using shared METRIC_NAMES init
|
|
75
88
|
const currentFindings = extractFindingsFromDb(db, '');
|
|
76
|
-
const currentCounts =
|
|
77
|
-
godNodeCount: 0,
|
|
78
|
-
surpriseCount: 0,
|
|
79
|
-
bridgeNodeCount: 0,
|
|
80
|
-
unreachableExportCount: 0,
|
|
81
|
-
ambiguousEdgeCount: 0,
|
|
82
|
-
};
|
|
89
|
+
const currentCounts = Object.fromEntries(METRIC_NAMES.map(m => [m, 0]));
|
|
83
90
|
for (const f of currentFindings) {
|
|
84
91
|
const metricName = FINDING_TYPE_TO_METRIC[f.type];
|
|
85
|
-
if (metricName && metricName
|
|
92
|
+
if (metricName && METRIC_NAME_SET.has(metricName)) {
|
|
86
93
|
currentCounts[metricName]++;
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
|
-
// Compute baseline counts
|
|
90
|
-
const baselineCounts =
|
|
91
|
-
godNodeCount: 0,
|
|
92
|
-
surpriseCount: 0,
|
|
93
|
-
bridgeNodeCount: 0,
|
|
94
|
-
unreachableExportCount: 0,
|
|
95
|
-
ambiguousEdgeCount: 0,
|
|
96
|
-
};
|
|
96
|
+
// Compute baseline counts using shared METRIC_NAMES init
|
|
97
|
+
const baselineCounts = Object.fromEntries(METRIC_NAMES.map(m => [m, 0]));
|
|
97
98
|
if (baseline) {
|
|
98
99
|
for (const f of baseline.findings) {
|
|
99
100
|
const metricName = FINDING_TYPE_TO_METRIC[f.type];
|
|
100
|
-
if (metricName && metricName
|
|
101
|
+
if (metricName && METRIC_NAME_SET.has(metricName)) {
|
|
101
102
|
baselineCounts[metricName]++;
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
|
-
// Default tolerance
|
|
106
|
-
const defaultTolerance =
|
|
107
|
-
// Check each metric
|
|
106
|
+
// Default tolerance — use cached parse to avoid rebuilding on repeated calls with same spec
|
|
107
|
+
const defaultTolerance = parseTolerance(toleranceSpec);
|
|
108
|
+
// Check each metric — per-metric tolerances also cached
|
|
108
109
|
const checkedMetrics = [];
|
|
109
|
-
for (const metric of
|
|
110
|
+
for (const metric of METRIC_NAMES) {
|
|
110
111
|
const baselineVal = baselineCounts[metric] ?? 0;
|
|
111
112
|
const currentVal = currentCounts[metric] ?? 0;
|
|
112
113
|
const delta = currentVal - baselineVal;
|
|
113
114
|
const metricSpec = metricTolerances?.[metric];
|
|
114
|
-
const tol = metricSpec ?
|
|
115
|
+
const tol = metricSpec ? parseTolerance(metricSpec) : defaultTolerance;
|
|
115
116
|
const tolStr = tol.toString();
|
|
116
117
|
const violated = tol.exceeded(baselineVal, currentVal);
|
|
117
118
|
checkedMetrics.push({
|
|
@@ -131,4 +132,25 @@ export function checkRegression(db, baselinePath, toleranceSpec, metricTolerance
|
|
|
131
132
|
: `Regression check FAILED — ${violations.length} violation(s) against baseline "${baselineName}" (tolerance: ${toleranceSpec})`;
|
|
132
133
|
return { passed, violations, checkedMetrics, summary };
|
|
133
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Format a RegressionOutcome as structured text for LLM consumption.
|
|
137
|
+
* Shows pass/fail status, per-metric results, and actionable violation details.
|
|
138
|
+
*/
|
|
139
|
+
export function formatRegressionOutcome(outcome) {
|
|
140
|
+
const lines = [outcome.summary];
|
|
141
|
+
lines.push('\nMetrics:');
|
|
142
|
+
for (const m of outcome.checkedMetrics) {
|
|
143
|
+
const sign = m.delta > 0 ? `+${m.delta}` : String(m.delta);
|
|
144
|
+
const status = m.violated ? 'VIOLATED' : 'ok';
|
|
145
|
+
lines.push(` ${m.metric}: baseline=${m.baseline} current=${m.current} delta=${sign} tolerance=${m.tolerance} [${status}]`);
|
|
146
|
+
}
|
|
147
|
+
if (outcome.violations.length > 0) {
|
|
148
|
+
lines.push('\nViolations requiring attention:');
|
|
149
|
+
for (const v of outcome.violations) {
|
|
150
|
+
const sign = v.delta > 0 ? `+${v.delta}` : String(v.delta);
|
|
151
|
+
lines.push(` ${v.metric} exceeded tolerance ${v.tolerance} (delta ${sign}): investigate new ${v.metric.replace(/Count$/, '')} introductions`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
134
156
|
//# sourceMappingURL=regression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regression.js","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAqB,MAAM,eAAe,CAAC;AAEvF,iFAAiF;AAEjF,MAAM,OAAO,SAAS;IACH,GAAG,CAAU;IACb,KAAK,CAAS;IAE/B,YAAoB,GAAY,EAAE,KAAa;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAY;QACvB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,QAAgB,EAAE,OAAe;QACxC,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;QACjC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,yCAAyC;QACvE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,sDAAsD;YACvF,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;YAC3C,OAAO,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;CACF;AAoBD,iFAAiF;AAEjF,MAAM,sBAAsB,GAA2B;IACrD,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,iBAAiB;IAC9B,kBAAkB,EAAE,wBAAwB;IAC5C,cAAc,EAAE,oBAAoB;CACrC,CAAC;AAEF,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,YAAoB,EACpB,aAAqB,EACrB,gBAAyC;IAEzC,MAAM,QAAQ,GAAwB,YAAY,CAAC,YAAY,CAAC,CAAC;IAEjE,
|
|
1
|
+
{"version":3,"file":"regression.js","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,13 +18,40 @@ export interface RippleResult {
|
|
|
18
18
|
/** Weighted sum: Σ(count_at_depth * decay^depth). */
|
|
19
19
|
totalScore: number;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a directed outgoing adjacency map from an edge list.
|
|
23
|
+
*
|
|
24
|
+
* Callers that run rippleImpact for multiple starting nodes on the same edge set
|
|
25
|
+
* should build once and pass the map directly to `rippleImpactFromMap`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildOutgoingMap(edges: RippleEdge[]): Map<string, string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Compute the ripple impact of changing `startNodeId` using a pre-built
|
|
30
|
+
* outgoing adjacency map.
|
|
31
|
+
*
|
|
32
|
+
* Use this variant when querying multiple start nodes on the same edge set —
|
|
33
|
+
* build the map once with `buildOutgoingMap` and reuse it across calls.
|
|
34
|
+
*
|
|
35
|
+
* @param startNodeId The node whose change we are propagating.
|
|
36
|
+
* @param outgoing Pre-built directed adjacency map (source → targets).
|
|
37
|
+
* @param maxDepth Maximum BFS depth (default 3).
|
|
38
|
+
* @param decayFactor Weight multiplier per depth level (default 0.5).
|
|
39
|
+
*/
|
|
40
|
+
export declare function rippleImpactFromMap(startNodeId: string, outgoing: Map<string, string[]>, maxDepth?: number, decayFactor?: number): RippleResult;
|
|
21
41
|
/**
|
|
22
42
|
* Compute the ripple impact of changing `startNodeId`.
|
|
23
43
|
*
|
|
44
|
+
* Builds the adjacency map from `edges` on each call. For repeated queries
|
|
45
|
+
* over the same edge set, prefer `buildOutgoingMap` + `rippleImpactFromMap`.
|
|
46
|
+
*
|
|
24
47
|
* @param startNodeId The node whose change we are propagating.
|
|
25
48
|
* @param edges Directed edges in the graph.
|
|
26
49
|
* @param maxDepth Maximum BFS depth (default 3).
|
|
27
50
|
* @param decayFactor Weight multiplier per depth level (default 0.5).
|
|
28
51
|
*/
|
|
29
52
|
export declare function rippleImpact(startNodeId: string, edges: RippleEdge[], maxDepth?: number, decayFactor?: number): RippleResult;
|
|
53
|
+
/**
|
|
54
|
+
* Format ripple impact results as structured text for LLM consumption.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatRippleImpact(startNodeId: string, result: RippleResult, nodeLabels?: Map<string, string>): string;
|
|
30
57
|
//# sourceMappingURL=ripple-impact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple-impact.d.ts","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED
|
|
1
|
+
{"version":3,"file":"ripple-impact.d.ts","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAO3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,QAAQ,SAAI,EACZ,WAAW,SAAM,GAChB,YAAY,CA2Bd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,QAAQ,SAAI,EACZ,WAAW,SAAM,GAChB,YAAY,CAEd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAmBR"}
|
|
@@ -9,21 +9,33 @@
|
|
|
9
9
|
* Default decay factor: 0.5 per hop (configurable).
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Build a directed outgoing adjacency map from an edge list.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @param maxDepth Maximum BFS depth (default 3).
|
|
17
|
-
* @param decayFactor Weight multiplier per depth level (default 0.5).
|
|
14
|
+
* Callers that run rippleImpact for multiple starting nodes on the same edge set
|
|
15
|
+
* should build once and pass the map directly to `rippleImpactFromMap`.
|
|
18
16
|
*/
|
|
19
|
-
export function
|
|
20
|
-
// Build directed adjacency (source → targets)
|
|
17
|
+
export function buildOutgoingMap(edges) {
|
|
21
18
|
const outgoing = new Map();
|
|
22
19
|
for (const { sourceId, targetId } of edges) {
|
|
23
20
|
if (!outgoing.has(sourceId))
|
|
24
21
|
outgoing.set(sourceId, []);
|
|
25
22
|
outgoing.get(sourceId).push(targetId);
|
|
26
23
|
}
|
|
24
|
+
return outgoing;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Compute the ripple impact of changing `startNodeId` using a pre-built
|
|
28
|
+
* outgoing adjacency map.
|
|
29
|
+
*
|
|
30
|
+
* Use this variant when querying multiple start nodes on the same edge set —
|
|
31
|
+
* build the map once with `buildOutgoingMap` and reuse it across calls.
|
|
32
|
+
*
|
|
33
|
+
* @param startNodeId The node whose change we are propagating.
|
|
34
|
+
* @param outgoing Pre-built directed adjacency map (source → targets).
|
|
35
|
+
* @param maxDepth Maximum BFS depth (default 3).
|
|
36
|
+
* @param decayFactor Weight multiplier per depth level (default 0.5).
|
|
37
|
+
*/
|
|
38
|
+
export function rippleImpactFromMap(startNodeId, outgoing, maxDepth = 3, decayFactor = 0.5) {
|
|
27
39
|
if (!outgoing.has(startNodeId)) {
|
|
28
40
|
return { byDepth: {}, totalScore: 0 };
|
|
29
41
|
}
|
|
@@ -49,4 +61,40 @@ export function rippleImpact(startNodeId, edges, maxDepth = 3, decayFactor = 0.5
|
|
|
49
61
|
}
|
|
50
62
|
return { byDepth, totalScore };
|
|
51
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Compute the ripple impact of changing `startNodeId`.
|
|
66
|
+
*
|
|
67
|
+
* Builds the adjacency map from `edges` on each call. For repeated queries
|
|
68
|
+
* over the same edge set, prefer `buildOutgoingMap` + `rippleImpactFromMap`.
|
|
69
|
+
*
|
|
70
|
+
* @param startNodeId The node whose change we are propagating.
|
|
71
|
+
* @param edges Directed edges in the graph.
|
|
72
|
+
* @param maxDepth Maximum BFS depth (default 3).
|
|
73
|
+
* @param decayFactor Weight multiplier per depth level (default 0.5).
|
|
74
|
+
*/
|
|
75
|
+
export function rippleImpact(startNodeId, edges, maxDepth = 3, decayFactor = 0.5) {
|
|
76
|
+
return rippleImpactFromMap(startNodeId, buildOutgoingMap(edges), maxDepth, decayFactor);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Format ripple impact results as structured text for LLM consumption.
|
|
80
|
+
*/
|
|
81
|
+
export function formatRippleImpact(startNodeId, result, nodeLabels) {
|
|
82
|
+
const depths = Object.keys(result.byDepth).map(Number).sort((a, b) => a - b);
|
|
83
|
+
if (depths.length === 0) {
|
|
84
|
+
return `No ripple impact found for: ${startNodeId} (isolated or leaf node)`;
|
|
85
|
+
}
|
|
86
|
+
const lines = [
|
|
87
|
+
`Ripple impact of changing: ${startNodeId}`,
|
|
88
|
+
` Total score: ${result.totalScore.toFixed(3)} (weighted cascade depth)`,
|
|
89
|
+
];
|
|
90
|
+
for (const depth of depths) {
|
|
91
|
+
const nodes = result.byDepth[depth];
|
|
92
|
+
lines.push(` Depth ${depth} (${nodes.length} node${nodes.length === 1 ? '' : 's'}):`);
|
|
93
|
+
for (const id of nodes) {
|
|
94
|
+
const label = nodeLabels?.get(id);
|
|
95
|
+
lines.push(` - ${id}${label ? ` [${label}]` : ''}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return lines.join('\n');
|
|
99
|
+
}
|
|
52
100
|
//# sourceMappingURL=ripple-impact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripple-impact.js","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH
|
|
1
|
+
{"version":3,"file":"ripple-impact.js","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,QAA+B,EAC/B,QAAQ,GAAG,CAAC,EACZ,WAAW,GAAG,GAAG;IAEjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,IAAI,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACtB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;QAC9B,UAAU,IAAI,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjE,QAAQ,GAAG,YAAY,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAmB,EACnB,KAAmB,EACnB,QAAQ,GAAG,CAAC,EACZ,WAAW,GAAG,GAAG;IAEjB,OAAO,mBAAmB,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,MAAoB,EACpB,UAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,+BAA+B,WAAW,0BAA0B,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,8BAA8B,WAAW,EAAE;QAC3C,kBAAkB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;KAC1E,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvF,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -19,4 +19,11 @@ export interface RiskProfileReport {
|
|
|
19
19
|
p95loc: number;
|
|
20
20
|
}
|
|
21
21
|
export declare function computeRiskProfile(db: MonographDb): RiskProfileReport;
|
|
22
|
+
/**
|
|
23
|
+
* Format a RiskProfileReport as structured text with distribution tables for LLM navigation.
|
|
24
|
+
*
|
|
25
|
+
* @param report - RiskProfileReport from computeRiskProfile()
|
|
26
|
+
* @returns structured text suitable for LLM consumption
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatRiskProfile(report: RiskProfileReport): string;
|
|
22
29
|
//# sourceMappingURL=risk-profile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-profile.d.ts","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACpC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"risk-profile.d.ts","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACpC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,iBAAiB,CAqFrE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAkCnE"}
|
|
@@ -19,64 +19,47 @@ function percentile(sorted, p) {
|
|
|
19
19
|
return sorted[Math.min(idx, sorted.length - 1)];
|
|
20
20
|
}
|
|
21
21
|
export function computeRiskProfile(db) {
|
|
22
|
+
// Push paramCount extraction to SQL with json_extract to avoid per-row JSON.parse
|
|
22
23
|
const rows = db.prepare(`
|
|
23
|
-
SELECT
|
|
24
|
+
SELECT
|
|
25
|
+
start_line,
|
|
26
|
+
end_line,
|
|
27
|
+
CAST(json_extract(properties, '$.paramCount') AS INTEGER) AS param_count
|
|
24
28
|
FROM nodes
|
|
25
29
|
WHERE label IN ('Function', 'Method')
|
|
30
|
+
AND start_line IS NOT NULL
|
|
31
|
+
AND end_line IS NOT NULL
|
|
26
32
|
`).all();
|
|
27
|
-
|
|
28
|
-
const
|
|
33
|
+
// ── Single-pass: compute LOC, assign to bins, accumulate risk summary ─────
|
|
34
|
+
const locBinCounts = new Array(LOC_BINS.length).fill(0);
|
|
35
|
+
const paramBinCounts = new Array(PARAM_BINS.length).fill(0);
|
|
36
|
+
const sortedLocs = [];
|
|
37
|
+
let largeFunction = 0;
|
|
38
|
+
let longParamList = 0;
|
|
39
|
+
let highRisk = 0;
|
|
29
40
|
for (const row of rows) {
|
|
30
|
-
if (row.start_line === null || row.end_line === null)
|
|
31
|
-
continue;
|
|
32
41
|
const loc = row.end_line - row.start_line + 1;
|
|
33
42
|
if (loc < 1)
|
|
34
43
|
continue;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
44
|
+
sortedLocs.push(loc);
|
|
45
|
+
// Assign to LOC bin in O(bins) rather than O(N×bins) via filter
|
|
46
|
+
for (let i = 0; i < LOC_BINS.length; i++) {
|
|
47
|
+
const bin = LOC_BINS[i];
|
|
48
|
+
if (loc >= bin.min && loc <= bin.max) {
|
|
49
|
+
locBinCounts[i]++;
|
|
50
|
+
break;
|
|
43
51
|
}
|
|
44
|
-
|
|
45
|
-
|
|
52
|
+
}
|
|
53
|
+
const pc = row.param_count ?? 0;
|
|
54
|
+
for (let i = 0; i < PARAM_BINS.length; i++) {
|
|
55
|
+
const bin = PARAM_BINS[i];
|
|
56
|
+
if (pc >= bin.min && pc <= bin.max) {
|
|
57
|
+
paramBinCounts[i]++;
|
|
58
|
+
break;
|
|
46
59
|
}
|
|
47
60
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const total = locs.length;
|
|
51
|
-
// ── LOC distribution ───────────────────────────────────────────────────────
|
|
52
|
-
const functionSizeDistribution = LOC_BINS.map(bin => {
|
|
53
|
-
const count = locs.filter(l => l >= bin.min && l <= bin.max).length;
|
|
54
|
-
return {
|
|
55
|
-
label: bin.label,
|
|
56
|
-
min: bin.min,
|
|
57
|
-
max: bin.max === Infinity ? 999999 : bin.max,
|
|
58
|
-
count,
|
|
59
|
-
percentage: total > 0 ? Math.round((count / total) * 1000) / 10 : 0,
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
|
-
// ── Param distribution ─────────────────────────────────────────────────────
|
|
63
|
-
const paramCountDistribution = PARAM_BINS.map(bin => {
|
|
64
|
-
const count = params.filter(p => p >= bin.min && p <= bin.max).length;
|
|
65
|
-
return {
|
|
66
|
-
label: bin.label,
|
|
67
|
-
min: bin.min,
|
|
68
|
-
max: bin.max === Infinity ? 999999 : bin.max,
|
|
69
|
-
count,
|
|
70
|
-
percentage: total > 0 ? Math.round((count / total) * 1000) / 10 : 0,
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
// ── Risk summary ───────────────────────────────────────────────────────────
|
|
74
|
-
let largeFunction = 0;
|
|
75
|
-
let longParamList = 0;
|
|
76
|
-
let highRisk = 0;
|
|
77
|
-
for (let i = 0; i < locs.length; i++) {
|
|
78
|
-
const large = locs[i] > 100;
|
|
79
|
-
const longParam = (params[i] ?? 0) > 5;
|
|
61
|
+
const large = loc > 100;
|
|
62
|
+
const longParam = pc > 5;
|
|
80
63
|
if (large)
|
|
81
64
|
largeFunction++;
|
|
82
65
|
if (longParam)
|
|
@@ -84,8 +67,24 @@ export function computeRiskProfile(db) {
|
|
|
84
67
|
if (large && longParam)
|
|
85
68
|
highRisk++;
|
|
86
69
|
}
|
|
70
|
+
const total = sortedLocs.length;
|
|
71
|
+
// ── Build bin result arrays ───────────────────────────────────────────────
|
|
72
|
+
const functionSizeDistribution = LOC_BINS.map((bin, i) => ({
|
|
73
|
+
label: bin.label,
|
|
74
|
+
min: bin.min,
|
|
75
|
+
max: bin.max === Infinity ? 999999 : bin.max,
|
|
76
|
+
count: locBinCounts[i],
|
|
77
|
+
percentage: total > 0 ? Math.round((locBinCounts[i] / total) * 1000) / 10 : 0,
|
|
78
|
+
}));
|
|
79
|
+
const paramCountDistribution = PARAM_BINS.map((bin, i) => ({
|
|
80
|
+
label: bin.label,
|
|
81
|
+
min: bin.min,
|
|
82
|
+
max: bin.max === Infinity ? 999999 : bin.max,
|
|
83
|
+
count: paramBinCounts[i],
|
|
84
|
+
percentage: total > 0 ? Math.round((paramBinCounts[i] / total) * 1000) / 10 : 0,
|
|
85
|
+
}));
|
|
87
86
|
// ── Percentiles ────────────────────────────────────────────────────────────
|
|
88
|
-
|
|
87
|
+
sortedLocs.sort((a, b) => a - b);
|
|
89
88
|
const p50loc = percentile(sortedLocs, 0.50);
|
|
90
89
|
const p90loc = percentile(sortedLocs, 0.90);
|
|
91
90
|
const p95loc = percentile(sortedLocs, 0.95);
|
|
@@ -98,4 +97,39 @@ export function computeRiskProfile(db) {
|
|
|
98
97
|
p95loc,
|
|
99
98
|
};
|
|
100
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Format a RiskProfileReport as structured text with distribution tables for LLM navigation.
|
|
102
|
+
*
|
|
103
|
+
* @param report - RiskProfileReport from computeRiskProfile()
|
|
104
|
+
* @returns structured text suitable for LLM consumption
|
|
105
|
+
*/
|
|
106
|
+
export function formatRiskProfile(report) {
|
|
107
|
+
const { functionSizeDistribution, paramCountDistribution, riskSummary, p50loc, p90loc, p95loc } = report;
|
|
108
|
+
const total = functionSizeDistribution.reduce((s, b) => s + b.count, 0);
|
|
109
|
+
if (total === 0) {
|
|
110
|
+
return 'risk_profile: no Function/Method nodes with line info found\n';
|
|
111
|
+
}
|
|
112
|
+
const lines = [
|
|
113
|
+
`risk_profile: ${total} functions analysed`,
|
|
114
|
+
` p50_loc: ${p50loc} p90_loc: ${p90loc} p95_loc: ${p95loc}`,
|
|
115
|
+
` large_functions(loc>100): ${riskSummary.largeFunction} long_param_list(params>5): ${riskSummary.longParamList} high_risk(both): ${riskSummary.highRisk}`,
|
|
116
|
+
'',
|
|
117
|
+
'function_size_distribution:',
|
|
118
|
+
];
|
|
119
|
+
for (const bin of functionSizeDistribution) {
|
|
120
|
+
const bar = '#'.repeat(Math.round(bin.percentage / 5)); // 1 char per 5%
|
|
121
|
+
lines.push(` ${bin.label.padEnd(15)} ${String(bin.count).padStart(5)} (${String(bin.percentage).padStart(5)}%) ${bar}`);
|
|
122
|
+
}
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push('param_count_distribution:');
|
|
125
|
+
for (const bin of paramCountDistribution) {
|
|
126
|
+
const bar = '#'.repeat(Math.round(bin.percentage / 5));
|
|
127
|
+
lines.push(` ${bin.label.padEnd(15)} ${String(bin.count).padStart(5)} (${String(bin.percentage).padStart(5)}%) ${bar}`);
|
|
128
|
+
}
|
|
129
|
+
if (riskSummary.highRisk > 0) {
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push(`high_risk_note: ${riskSummary.highRisk} function(s) have both loc>100 AND params>5 — prime refactor candidates`);
|
|
132
|
+
}
|
|
133
|
+
return lines.join('\n');
|
|
134
|
+
}
|
|
101
135
|
//# sourceMappingURL=risk-profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-profile.js","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AA6BA,MAAM,QAAQ,GAAuD;IACnE,EAAE,KAAK,EAAE,YAAY,EAAI,GAAG,EAAE,CAAC,EAAI,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,aAAa,EAAG,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,aAAa,EAAG,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,GAAG,EAAE;IAC7C,EAAE,KAAK,EAAE,eAAe,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAC7C,EAAE,KAAK,EAAE,YAAY,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE;CACnD,CAAC;AAEF,MAAM,UAAU,GAAuD;IACrE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,WAAW,EAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE;CAC/C,CAAC;AAEF,SAAS,UAAU,CAAC,MAAgB,EAAE,CAAS;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAe;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"risk-profile.js","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shingle-filter.d.ts","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvD;
|
|
1
|
+
{"version":3,"file":"shingle-filter.d.ts","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvD;AAwDD,wBAAgB,mBAAmB,CAAC,CAAC,SAAI,EAAE,SAAS,SAAM,GAAG,aAAa,CAyFzE"}
|
|
@@ -23,25 +23,23 @@ function hashString(s) {
|
|
|
23
23
|
}
|
|
24
24
|
return h;
|
|
25
25
|
}
|
|
26
|
+
const MINHASH_PRIME = BigInt(4294967311); // first prime > 2^32
|
|
26
27
|
/**
|
|
27
28
|
* Compute a MinHash signature for a set of shingles using
|
|
28
|
-
* numHashes linear hash functions: h_i(x) = (a_i * x + b_i) % prime
|
|
29
|
+
* numHashes linear hash functions: h_i(x) = (a_i * x + b_i) % prime.
|
|
30
|
+
*
|
|
31
|
+
* @param seedsA Precomputed BigInt a-coefficients (length numHashes)
|
|
32
|
+
* @param seedsB Precomputed BigInt b-constants (length numHashes)
|
|
29
33
|
*/
|
|
30
|
-
function minHashSignature(shingles, numHashes) {
|
|
31
|
-
const PRIME = 4294967311; // first prime > 2^32
|
|
34
|
+
function minHashSignature(shingles, numHashes, seedsA, seedsB) {
|
|
32
35
|
const sig = new Uint32Array(numHashes).fill(0xffffffff);
|
|
33
|
-
// Deterministic seeds derived from hash index
|
|
34
36
|
for (const shingle of shingles) {
|
|
35
|
-
const x = hashString(shingle);
|
|
37
|
+
const x = BigInt(hashString(shingle));
|
|
36
38
|
for (let i = 0; i < numHashes; i++) {
|
|
37
|
-
//
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
// Linear hash modulo prime (BigInt for correctness)
|
|
41
|
-
const hashVal = Number((BigInt(a) * BigInt(x) + BigInt(b)) % BigInt(PRIME)) >>> 0;
|
|
42
|
-
if (hashVal < sig[i]) {
|
|
39
|
+
// Precomputed seeds avoid recomputing the same (a, b) per shingle per call.
|
|
40
|
+
const hashVal = Number((seedsA[i] * x + seedsB[i]) % MINHASH_PRIME) >>> 0;
|
|
41
|
+
if (hashVal < sig[i])
|
|
43
42
|
sig[i] = hashVal;
|
|
44
|
-
}
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
45
|
return sig;
|
|
@@ -55,7 +53,15 @@ export function createShingleFilter(k = 5, numHashes = 128) {
|
|
|
55
53
|
// A reasonable split is sqrt(numHashes) bands of sqrt(numHashes) rows each.
|
|
56
54
|
const numBands = Math.round(Math.sqrt(numHashes));
|
|
57
55
|
const numRows = Math.floor(numHashes / numBands);
|
|
58
|
-
|
|
56
|
+
// Precompute MinHash seeds once per filter instance to avoid recomputing
|
|
57
|
+
// (a, b) inside the hot inner loop of minHashSignature().
|
|
58
|
+
const seedsA = new BigInt64Array(numHashes);
|
|
59
|
+
const seedsB = new BigInt64Array(numHashes);
|
|
60
|
+
for (let i = 0; i < numHashes; i++) {
|
|
61
|
+
seedsA[i] = BigInt(((i * 2654435761 + 0x9e3779b9) >>> 0));
|
|
62
|
+
seedsB[i] = BigInt(((i * 2246822519 + 0x85ebca6b) >>> 0));
|
|
63
|
+
}
|
|
64
|
+
function getBandKey(band, sig) {
|
|
59
65
|
const parts = [];
|
|
60
66
|
for (let r = 0; r < numRows; r++) {
|
|
61
67
|
const idx = band * numRows + r;
|
|
@@ -69,11 +75,11 @@ export function createShingleFilter(k = 5, numHashes = 128) {
|
|
|
69
75
|
return {
|
|
70
76
|
add(id, tokens) {
|
|
71
77
|
const shingles = kShingles(tokens, k);
|
|
72
|
-
const sig = minHashSignature(shingles, numHashes);
|
|
78
|
+
const sig = minHashSignature(shingles, numHashes, seedsA, seedsB);
|
|
73
79
|
index.set(id, sig);
|
|
74
80
|
// Insert into LSH band buckets
|
|
75
81
|
for (let band = 0; band < numBands; band++) {
|
|
76
|
-
const key = getBandKey(
|
|
82
|
+
const key = getBandKey(band, sig);
|
|
77
83
|
const bucket = bandBuckets.get(key);
|
|
78
84
|
if (bucket) {
|
|
79
85
|
bucket.push(id);
|
|
@@ -85,19 +91,12 @@ export function createShingleFilter(k = 5, numHashes = 128) {
|
|
|
85
91
|
},
|
|
86
92
|
candidates(tokens, topK = 10) {
|
|
87
93
|
const shingles = kShingles(tokens, k);
|
|
88
|
-
const querySig = minHashSignature(shingles, numHashes);
|
|
89
|
-
// Collect candidate IDs via LSH band matching
|
|
94
|
+
const querySig = minHashSignature(shingles, numHashes, seedsA, seedsB);
|
|
95
|
+
// Collect candidate IDs via LSH band matching.
|
|
96
|
+
// Use getBandKey() consistently — eliminates the duplicate inline computation.
|
|
90
97
|
const candidateScores = new Map();
|
|
91
98
|
for (let band = 0; band < numBands; band++) {
|
|
92
|
-
const
|
|
93
|
-
// Manually compute the key for the query signature
|
|
94
|
-
const parts = [];
|
|
95
|
-
for (let r = 0; r < numRows; r++) {
|
|
96
|
-
const idx = band * numRows + r;
|
|
97
|
-
if (idx < numHashes)
|
|
98
|
-
parts.push(querySig[idx]);
|
|
99
|
-
}
|
|
100
|
-
const queryKey = `b${band}:${parts.join(',')}`;
|
|
99
|
+
const queryKey = getBandKey(band, querySig);
|
|
101
100
|
const bucket = bandBuckets.get(queryKey);
|
|
102
101
|
if (bucket) {
|
|
103
102
|
for (const id of bucket) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shingle-filter.js","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,SAAS,SAAS,CAAC,MAAgB,EAAE,CAAS;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"shingle-filter.js","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"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"}
|