@vyuhlabs/dxkit 2.4.6 → 2.4.8
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/CHANGELOG.md +1076 -0
- package/README.md +132 -27
- package/dist/analysis-result.d.ts +112 -0
- package/dist/analysis-result.d.ts.map +1 -0
- package/dist/analysis-result.js +52 -0
- package/dist/analysis-result.js.map +1 -0
- package/dist/analyzers/bom/detailed.d.ts.map +1 -1
- package/dist/analyzers/bom/detailed.js +19 -0
- package/dist/analyzers/bom/detailed.js.map +1 -1
- package/dist/analyzers/bom/gather.d.ts +27 -26
- package/dist/analyzers/bom/gather.d.ts.map +1 -1
- package/dist/analyzers/bom/gather.js +26 -87
- package/dist/analyzers/bom/gather.js.map +1 -1
- package/dist/analyzers/bom/index.d.ts +0 -7
- package/dist/analyzers/bom/index.d.ts.map +1 -1
- package/dist/analyzers/bom/index.js +98 -48
- package/dist/analyzers/bom/index.js.map +1 -1
- package/dist/analyzers/bom/types.d.ts +11 -13
- package/dist/analyzers/bom/types.d.ts.map +1 -1
- package/dist/analyzers/cache.d.ts +95 -0
- package/dist/analyzers/cache.d.ts.map +1 -0
- package/dist/analyzers/cache.js +309 -0
- package/dist/analyzers/cache.js.map +1 -0
- package/dist/analyzers/coverage-runner.d.ts +56 -0
- package/dist/analyzers/coverage-runner.d.ts.map +1 -0
- package/dist/analyzers/coverage-runner.js +72 -0
- package/dist/analyzers/coverage-runner.js.map +1 -0
- package/dist/analyzers/dashboard/index.d.ts +24 -0
- package/dist/analyzers/dashboard/index.d.ts.map +1 -0
- package/dist/analyzers/dashboard/index.js +667 -0
- package/dist/analyzers/dashboard/index.js.map +1 -0
- package/dist/analyzers/developer/gather.d.ts.map +1 -1
- package/dist/analyzers/developer/gather.js +205 -37
- package/dist/analyzers/developer/gather.js.map +1 -1
- package/dist/analyzers/developer/index.d.ts +1 -1
- package/dist/analyzers/developer/index.d.ts.map +1 -1
- package/dist/analyzers/developer/index.js +21 -9
- package/dist/analyzers/developer/index.js.map +1 -1
- package/dist/analyzers/dispatcher.d.ts +52 -0
- package/dist/analyzers/dispatcher.d.ts.map +1 -1
- package/dist/analyzers/dispatcher.js +92 -9
- package/dist/analyzers/dispatcher.js.map +1 -1
- package/dist/analyzers/docs/shallow.d.ts +17 -5
- package/dist/analyzers/docs/shallow.d.ts.map +1 -1
- package/dist/analyzers/docs/shallow.js +65 -2
- package/dist/analyzers/docs/shallow.js.map +1 -1
- package/dist/analyzers/dx/shallow.d.ts +17 -5
- package/dist/analyzers/dx/shallow.d.ts.map +1 -1
- package/dist/analyzers/dx/shallow.js +66 -2
- package/dist/analyzers/dx/shallow.js.map +1 -1
- package/dist/analyzers/health/actions.d.ts +1 -1
- package/dist/analyzers/health/actions.d.ts.map +1 -1
- package/dist/analyzers/health/actions.js +27 -9
- package/dist/analyzers/health/actions.js.map +1 -1
- package/dist/analyzers/health/detailed.d.ts +2 -1
- package/dist/analyzers/health/detailed.d.ts.map +1 -1
- package/dist/analyzers/health/detailed.js +11 -7
- package/dist/analyzers/health/detailed.js.map +1 -1
- package/dist/analyzers/health.d.ts +27 -0
- package/dist/analyzers/health.d.ts.map +1 -1
- package/dist/analyzers/health.js +282 -34
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/licenses/gather.d.ts +35 -8
- package/dist/analyzers/licenses/gather.d.ts.map +1 -1
- package/dist/analyzers/licenses/gather.js +86 -13
- package/dist/analyzers/licenses/gather.js.map +1 -1
- package/dist/analyzers/licenses/index.d.ts +1 -1
- package/dist/analyzers/licenses/index.d.ts.map +1 -1
- package/dist/analyzers/licenses/index.js +52 -11
- package/dist/analyzers/licenses/index.js.map +1 -1
- package/dist/analyzers/licenses/types.d.ts +15 -0
- package/dist/analyzers/licenses/types.d.ts.map +1 -1
- package/dist/analyzers/maintainability/shallow.d.ts +17 -5
- package/dist/analyzers/maintainability/shallow.d.ts.map +1 -1
- package/dist/analyzers/maintainability/shallow.js +80 -2
- package/dist/analyzers/maintainability/shallow.js.map +1 -1
- package/dist/analyzers/quality/detailed.d.ts.map +1 -1
- package/dist/analyzers/quality/detailed.js +4 -6
- package/dist/analyzers/quality/detailed.js.map +1 -1
- package/dist/analyzers/quality/gather.d.ts +1 -14
- package/dist/analyzers/quality/gather.d.ts.map +1 -1
- package/dist/analyzers/quality/gather.js +48 -137
- package/dist/analyzers/quality/gather.js.map +1 -1
- package/dist/analyzers/quality/index.d.ts +9 -2
- package/dist/analyzers/quality/index.d.ts.map +1 -1
- package/dist/analyzers/quality/index.js +197 -117
- package/dist/analyzers/quality/index.js.map +1 -1
- package/dist/analyzers/quality/shallow.d.ts +50 -5
- package/dist/analyzers/quality/shallow.d.ts.map +1 -1
- package/dist/analyzers/quality/shallow.js +155 -2
- package/dist/analyzers/quality/shallow.js.map +1 -1
- package/dist/analyzers/quality/types.d.ts +14 -0
- package/dist/analyzers/quality/types.d.ts.map +1 -1
- package/dist/analyzers/security/actions.d.ts +11 -4
- package/dist/analyzers/security/actions.d.ts.map +1 -1
- package/dist/analyzers/security/actions.js +87 -37
- package/dist/analyzers/security/actions.js.map +1 -1
- package/dist/analyzers/security/aggregator.d.ts +236 -0
- package/dist/analyzers/security/aggregator.d.ts.map +1 -0
- package/dist/analyzers/security/aggregator.js +349 -0
- package/dist/analyzers/security/aggregator.js.map +1 -0
- package/dist/analyzers/security/detailed.d.ts +2 -2
- package/dist/analyzers/security/detailed.d.ts.map +1 -1
- package/dist/analyzers/security/detailed.js +10 -9
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts +104 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +299 -9
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts +15 -0
- package/dist/analyzers/security/index.d.ts.map +1 -1
- package/dist/analyzers/security/index.js +463 -50
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/security/shallow.d.ts +50 -6
- package/dist/analyzers/security/shallow.d.ts.map +1 -1
- package/dist/analyzers/security/shallow.js +154 -2
- package/dist/analyzers/security/shallow.js.map +1 -1
- package/dist/analyzers/security/types.d.ts +51 -0
- package/dist/analyzers/security/types.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.js +2 -3
- package/dist/analyzers/tests/detailed.js.map +1 -1
- package/dist/analyzers/tests/gather.d.ts +2 -1
- package/dist/analyzers/tests/gather.d.ts.map +1 -1
- package/dist/analyzers/tests/gather.js +98 -69
- package/dist/analyzers/tests/gather.js.map +1 -1
- package/dist/analyzers/tests/index.d.ts +11 -2
- package/dist/analyzers/tests/index.d.ts.map +1 -1
- package/dist/analyzers/tests/index.js +83 -18
- package/dist/analyzers/tests/index.js.map +1 -1
- package/dist/analyzers/tests/shallow.d.ts +19 -5
- package/dist/analyzers/tests/shallow.d.ts.map +1 -1
- package/dist/analyzers/tests/shallow.js +89 -2
- package/dist/analyzers/tests/shallow.js.map +1 -1
- package/dist/analyzers/tests/types.d.ts +41 -1
- package/dist/analyzers/tests/types.d.ts.map +1 -1
- package/dist/analyzers/tools/autogen-header.d.ts +8 -0
- package/dist/analyzers/tools/autogen-header.d.ts.map +1 -0
- package/dist/analyzers/tools/autogen-header.js +107 -0
- package/dist/analyzers/tools/autogen-header.js.map +1 -0
- package/dist/analyzers/tools/cloc.d.ts.map +1 -1
- package/dist/analyzers/tools/cloc.js +36 -5
- package/dist/analyzers/tools/cloc.js.map +1 -1
- package/dist/analyzers/tools/deadline.d.ts +67 -0
- package/dist/analyzers/tools/deadline.d.ts.map +1 -0
- package/dist/analyzers/tools/deadline.js +81 -0
- package/dist/analyzers/tools/deadline.js.map +1 -0
- package/dist/analyzers/tools/debug-statements.d.ts +17 -0
- package/dist/analyzers/tools/debug-statements.d.ts.map +1 -0
- package/dist/analyzers/tools/debug-statements.js +58 -0
- package/dist/analyzers/tools/debug-statements.js.map +1 -0
- package/dist/analyzers/tools/default-exclusions.gitignore +28 -0
- package/dist/analyzers/tools/exclusions.d.ts +33 -6
- package/dist/analyzers/tools/exclusions.d.ts.map +1 -1
- package/dist/analyzers/tools/exclusions.js +95 -26
- package/dist/analyzers/tools/exclusions.js.map +1 -1
- package/dist/analyzers/tools/generic.d.ts +17 -2
- package/dist/analyzers/tools/generic.d.ts.map +1 -1
- package/dist/analyzers/tools/generic.js +206 -109
- package/dist/analyzers/tools/generic.js.map +1 -1
- package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
- package/dist/analyzers/tools/gitleaks.js +48 -1
- package/dist/analyzers/tools/gitleaks.js.map +1 -1
- package/dist/analyzers/tools/graphify.d.ts +30 -2
- package/dist/analyzers/tools/graphify.d.ts.map +1 -1
- package/dist/analyzers/tools/graphify.js +131 -15
- package/dist/analyzers/tools/graphify.js.map +1 -1
- package/dist/analyzers/tools/jscpd.d.ts +12 -2
- package/dist/analyzers/tools/jscpd.d.ts.map +1 -1
- package/dist/analyzers/tools/jscpd.js +129 -6
- package/dist/analyzers/tools/jscpd.js.map +1 -1
- package/dist/analyzers/tools/lint-label.d.ts +29 -0
- package/dist/analyzers/tools/lint-label.d.ts.map +1 -0
- package/dist/analyzers/tools/lint-label.js +23 -0
- package/dist/analyzers/tools/lint-label.js.map +1 -0
- package/dist/analyzers/tools/minified-detection.d.ts +9 -0
- package/dist/analyzers/tools/minified-detection.d.ts.map +1 -0
- package/dist/analyzers/tools/minified-detection.js +147 -0
- package/dist/analyzers/tools/minified-detection.js.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts +133 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.js +177 -0
- package/dist/analyzers/tools/nuget-package-reference.js.map +1 -0
- package/dist/analyzers/tools/osv-scanner-deps.d.ts +3 -2
- package/dist/analyzers/tools/osv-scanner-deps.d.ts.map +1 -1
- package/dist/analyzers/tools/osv-scanner-deps.js +32 -14
- package/dist/analyzers/tools/osv-scanner-deps.js.map +1 -1
- package/dist/analyzers/tools/osv.d.ts +36 -0
- package/dist/analyzers/tools/osv.d.ts.map +1 -1
- package/dist/analyzers/tools/osv.js +26 -0
- package/dist/analyzers/tools/osv.js.map +1 -1
- package/dist/analyzers/tools/parallel.d.ts +1 -1
- package/dist/analyzers/tools/parallel.d.ts.map +1 -1
- package/dist/analyzers/tools/parallel.js +2 -2
- package/dist/analyzers/tools/parallel.js.map +1 -1
- package/dist/analyzers/tools/report-date.d.ts +17 -0
- package/dist/analyzers/tools/report-date.d.ts.map +1 -0
- package/dist/analyzers/tools/report-date.js +26 -0
- package/dist/analyzers/tools/report-date.js.map +1 -0
- package/dist/analyzers/tools/risk-score.d.ts +7 -0
- package/dist/analyzers/tools/risk-score.d.ts.map +1 -1
- package/dist/analyzers/tools/risk-score.js +9 -2
- package/dist/analyzers/tools/risk-score.js.map +1 -1
- package/dist/analyzers/tools/run-tests-helper.d.ts +43 -0
- package/dist/analyzers/tools/run-tests-helper.d.ts.map +1 -0
- package/dist/analyzers/tools/run-tests-helper.js +156 -0
- package/dist/analyzers/tools/run-tests-helper.js.map +1 -0
- package/dist/analyzers/tools/runner.d.ts.map +1 -1
- package/dist/analyzers/tools/runner.js +75 -12
- package/dist/analyzers/tools/runner.js.map +1 -1
- package/dist/analyzers/tools/semgrep.d.ts +39 -2
- package/dist/analyzers/tools/semgrep.d.ts.map +1 -1
- package/dist/analyzers/tools/semgrep.js +131 -9
- package/dist/analyzers/tools/semgrep.js.map +1 -1
- package/dist/analyzers/tools/timing.d.ts +17 -3
- package/dist/analyzers/tools/timing.d.ts.map +1 -1
- package/dist/analyzers/tools/timing.js +36 -14
- package/dist/analyzers/tools/timing.js.map +1 -1
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
- package/dist/analyzers/tools/tool-registry.js +11 -1
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/analyzers/tools/tools-unavailable-prose.d.ts +18 -0
- package/dist/analyzers/tools/tools-unavailable-prose.d.ts.map +1 -0
- package/dist/analyzers/tools/tools-unavailable-prose.js +69 -0
- package/dist/analyzers/tools/tools-unavailable-prose.js.map +1 -0
- package/dist/analyzers/tools/upgrade-plan-resolver.d.ts.map +1 -1
- package/dist/analyzers/tools/upgrade-plan-resolver.js +7 -0
- package/dist/analyzers/tools/upgrade-plan-resolver.js.map +1 -1
- package/dist/analyzers/tools/vendored-advisor.d.ts +43 -0
- package/dist/analyzers/tools/vendored-advisor.d.ts.map +1 -0
- package/dist/analyzers/tools/vendored-advisor.js +107 -0
- package/dist/analyzers/tools/vendored-advisor.js.map +1 -0
- package/dist/analyzers/tools/walk-paths.d.ts +78 -0
- package/dist/analyzers/tools/walk-paths.d.ts.map +1 -0
- package/dist/analyzers/tools/walk-paths.js +150 -0
- package/dist/analyzers/tools/walk-paths.js.map +1 -0
- package/dist/analyzers/tools/walk-source-files.d.ts +70 -0
- package/dist/analyzers/tools/walk-source-files.d.ts.map +1 -0
- package/dist/analyzers/tools/walk-source-files.js +369 -0
- package/dist/analyzers/tools/walk-source-files.js.map +1 -0
- package/dist/analyzers/types.d.ts +204 -4
- package/dist/analyzers/types.d.ts.map +1 -1
- package/dist/analyzers/xlsx/bom.d.ts.map +1 -1
- package/dist/analyzers/xlsx/bom.js +8 -1
- package/dist/analyzers/xlsx/bom.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +581 -189
- package/dist/cli.js.map +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +24 -7
- package/dist/detect.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +103 -53
- package/dist/doctor.js.map +1 -1
- package/dist/languages/capabilities/provider.d.ts +130 -1
- package/dist/languages/capabilities/provider.d.ts.map +1 -1
- package/dist/languages/capabilities/types.d.ts +68 -7
- package/dist/languages/capabilities/types.d.ts.map +1 -1
- package/dist/languages/csharp.d.ts +15 -1
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +624 -146
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +89 -11
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/index.d.ts +132 -2
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +207 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/java.d.ts.map +1 -1
- package/dist/languages/java.js +113 -26
- package/dist/languages/java.js.map +1 -1
- package/dist/languages/kotlin.d.ts.map +1 -1
- package/dist/languages/kotlin.js +132 -26
- package/dist/languages/kotlin.js.map +1 -1
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +149 -44
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/ruby.d.ts +39 -1
- package/dist/languages/ruby.d.ts.map +1 -1
- package/dist/languages/ruby.js +178 -44
- package/dist/languages/ruby.js.map +1 -1
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +103 -16
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/types.d.ts +228 -5
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +201 -14
- package/dist/languages/typescript.js.map +1 -1
- package/dist/scoring/dimensions/documentation.d.ts +53 -0
- package/dist/scoring/dimensions/documentation.d.ts.map +1 -0
- package/dist/scoring/dimensions/documentation.js +106 -0
- package/dist/scoring/dimensions/documentation.js.map +1 -0
- package/dist/scoring/dimensions/dx.d.ts +53 -0
- package/dist/scoring/dimensions/dx.d.ts.map +1 -0
- package/dist/scoring/dimensions/dx.js +105 -0
- package/dist/scoring/dimensions/dx.js.map +1 -0
- package/dist/scoring/dimensions/maintainability.d.ts +53 -0
- package/dist/scoring/dimensions/maintainability.d.ts.map +1 -0
- package/dist/scoring/dimensions/maintainability.js +101 -0
- package/dist/scoring/dimensions/maintainability.js.map +1 -0
- package/dist/scoring/dimensions/quality.d.ts +108 -0
- package/dist/scoring/dimensions/quality.d.ts.map +1 -0
- package/dist/scoring/dimensions/quality.js +174 -0
- package/dist/scoring/dimensions/quality.js.map +1 -0
- package/dist/scoring/dimensions/security.d.ts +84 -0
- package/dist/scoring/dimensions/security.d.ts.map +1 -0
- package/dist/scoring/dimensions/security.js +135 -0
- package/dist/scoring/dimensions/security.js.map +1 -0
- package/dist/scoring/dimensions/testing.d.ts +56 -0
- package/dist/scoring/dimensions/testing.d.ts.map +1 -0
- package/dist/scoring/dimensions/testing.js +98 -0
- package/dist/scoring/dimensions/testing.js.map +1 -0
- package/dist/scoring/evaluator.d.ts +27 -0
- package/dist/scoring/evaluator.d.ts.map +1 -0
- package/dist/scoring/evaluator.js +124 -0
- package/dist/scoring/evaluator.js.map +1 -0
- package/dist/scoring/format.d.ts +34 -0
- package/dist/scoring/format.d.ts.map +1 -0
- package/dist/scoring/format.js +63 -0
- package/dist/scoring/format.js.map +1 -0
- package/dist/scoring/index.d.ts +37 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +57 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/overall.d.ts +54 -0
- package/dist/scoring/overall.d.ts.map +1 -0
- package/dist/scoring/overall.js +76 -0
- package/dist/scoring/overall.js.map +1 -0
- package/dist/scoring/result.d.ts +111 -0
- package/dist/scoring/result.d.ts.map +1 -0
- package/dist/scoring/result.js +14 -0
- package/dist/scoring/result.js.map +1 -0
- package/dist/scoring/spec.d.ts +76 -0
- package/dist/scoring/spec.d.ts.map +1 -0
- package/dist/scoring/spec.js +22 -0
- package/dist/scoring/spec.js.map +1 -0
- package/dist/scoring/thresholds.d.ts +56 -0
- package/dist/scoring/thresholds.d.ts.map +1 -0
- package/dist/scoring/thresholds.js +75 -0
- package/dist/scoring/thresholds.js.map +1 -0
- package/dist/tools-cli.d.ts.map +1 -1
- package/dist/tools-cli.js +21 -2
- package/dist/tools-cli.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/.claude/commands/dashboard.md +17 -9
- package/dist/analyzers/scoring.d.ts +0 -49
- package/dist/analyzers/scoring.d.ts.map +0 -1
- package/dist/analyzers/scoring.js +0 -422
- package/dist/analyzers/scoring.js.map +0 -1
- package/dist/analyzers/security/scoring.d.ts +0 -29
- package/dist/analyzers/security/scoring.d.ts.map +0 -1
- package/dist/analyzers/security/scoring.js +0 -40
- package/dist/analyzers/security/scoring.js.map +0 -1
|
@@ -1,8 +1,161 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toQualityScoreInput = toQualityScoreInput;
|
|
4
|
+
exports.scoreQualityFromScoreInput = scoreQualityFromScoreInput;
|
|
3
5
|
exports.scoreQualityDimension = scoreQualityDimension;
|
|
4
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Code Quality dimension — health-side adapter over the canonical
|
|
8
|
+
* quality scorer.
|
|
9
|
+
*
|
|
10
|
+
* Translates `ScoreInput { metrics, capabilities }` into the
|
|
11
|
+
* `QualityScoreInput` partition consumed by `scoreQualityFromInput`,
|
|
12
|
+
* then wraps the resulting score in a full `DimensionScore` (status +
|
|
13
|
+
* details + metrics envelope) for the health audit rollup.
|
|
14
|
+
*
|
|
15
|
+
* D123 closure: this file used to delegate to a separate
|
|
16
|
+
* `scoreQuality` in `analyzers/scoring.ts` while the standalone
|
|
17
|
+
* quality report computed `computeSlopScore` from a different signal
|
|
18
|
+
* set. Same repo could surface as health.CodeQuality 22/100 and
|
|
19
|
+
* quality-review.SlopScore 45/100 — customer-visible contradiction.
|
|
20
|
+
* The canonical formula now lives in `quality/scoring.ts`; both
|
|
21
|
+
* surfaces compute the same number from the same partitioned inputs.
|
|
22
|
+
*/
|
|
23
|
+
const scoring_1 = require("../../scoring");
|
|
24
|
+
/**
|
|
25
|
+
* Build the canonical `QualityScoreInput` from the health-side
|
|
26
|
+
* `ScoreInput`. Each field maps to its data source:
|
|
27
|
+
*
|
|
28
|
+
* - Lint counts ← `capabilities.lint.counts`
|
|
29
|
+
* (critical + high → errors). Availability is "did any pack
|
|
30
|
+
* produce a `LintResult`" — i.e. `c.lint !== undefined`.
|
|
31
|
+
* - Hygiene markers + stale files + mixed-language flag +
|
|
32
|
+
* comment ratio ← `metrics.*`. Plumbed into HealthMetrics by
|
|
33
|
+
* the cache builder so both consumer paths land on the same
|
|
34
|
+
* values (the standalone Quality report reads them off the
|
|
35
|
+
* same cached envelope).
|
|
36
|
+
* - File-size + filesystem-walked + density-source metrics
|
|
37
|
+
* ← `metrics.*`.
|
|
38
|
+
* - Duplication, structural ← `capabilities.{duplication,
|
|
39
|
+
* structural}`. Availability is "did the capability dispatch
|
|
40
|
+
* return an envelope" — same shape as lint.
|
|
41
|
+
*/
|
|
42
|
+
function toQualityScoreInput(input) {
|
|
43
|
+
const m = input.metrics;
|
|
44
|
+
const c = input.capabilities;
|
|
45
|
+
const lintErrors = (c.lint?.counts.critical ?? 0) + (c.lint?.counts.high ?? 0);
|
|
46
|
+
return {
|
|
47
|
+
sourceFiles: m.sourceFiles,
|
|
48
|
+
lintErrors,
|
|
49
|
+
lintAvailable: c.lint !== undefined,
|
|
50
|
+
consoleLogCount: m.consoleLogCount,
|
|
51
|
+
todoCount: m.todoCount,
|
|
52
|
+
fixmeCount: m.fixmeCount,
|
|
53
|
+
hackCount: m.hackCount,
|
|
54
|
+
staleFiles: m.staleFiles,
|
|
55
|
+
mixedLanguages: m.mixedLanguages,
|
|
56
|
+
filesOver500Lines: m.filesOver500Lines,
|
|
57
|
+
largestFileLines: m.largestFileLines,
|
|
58
|
+
anyTypeCount: m.anyTypeCount,
|
|
59
|
+
typeErrors: m.typeErrors,
|
|
60
|
+
duplicationPercentage: c.duplication?.percentage ?? null,
|
|
61
|
+
duplicationAvailable: c.duplication !== undefined,
|
|
62
|
+
maxFunctionsInFile: c.structural?.maxFunctionsInFile ?? null,
|
|
63
|
+
deadImportCount: c.structural?.deadImportCount ?? null,
|
|
64
|
+
orphanModuleCount: c.structural?.orphanModuleCount ?? null,
|
|
65
|
+
structuralAvailable: c.structural !== undefined,
|
|
66
|
+
commentRatio: m.commentRatio,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Score-only adapter for action ranking. The health remediation
|
|
71
|
+
* planner builds `RemediationAction<ScoreInput>` patches and calls
|
|
72
|
+
* `rank()` with a per-dimension scorer that maps `ScoreInput` to
|
|
73
|
+
* `{ score }`. Mirrors the `scoreSecurityFromScoreInput` shim so
|
|
74
|
+
* `health/actions.ts` stays symmetric across dimensions.
|
|
75
|
+
*/
|
|
76
|
+
function scoreQualityFromScoreInput(input) {
|
|
77
|
+
return (0, scoring_1.evaluateSpec)(scoring_1.QUALITY_SCORING_SPEC, toQualityScoreInput(input));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Health audit's Code Quality dimension entry point. Produces the
|
|
81
|
+
* `DimensionScore` consumed by `health.ts:analyzeHealthInternal` for
|
|
82
|
+
* the dimension rollup, the dashboard summary, and the agent report.
|
|
83
|
+
*/
|
|
5
84
|
function scoreQualityDimension(input) {
|
|
6
|
-
|
|
85
|
+
const m = input.metrics;
|
|
86
|
+
const c = input.capabilities;
|
|
87
|
+
const scoreInput = toQualityScoreInput(input);
|
|
88
|
+
const result = (0, scoring_1.evaluateSpec)(scoring_1.QUALITY_SCORING_SPEC, scoreInput);
|
|
89
|
+
const score = result.score;
|
|
90
|
+
const lintToolFromCache = c.lint?.tool ?? null;
|
|
91
|
+
const lintWarnings = (c.lint?.counts.medium ?? 0) + (c.lint?.counts.low ?? 0);
|
|
92
|
+
// When the cache says lint was attempted but every provider
|
|
93
|
+
// returned null, surface the honesty notice in the prose so the
|
|
94
|
+
// health-dim row reads consistently with the standalone Quality
|
|
95
|
+
// table. Same shape both consumers see.
|
|
96
|
+
const lintTool = lintToolFromCache ??
|
|
97
|
+
(c.lintAvailability && !c.lintAvailability.available
|
|
98
|
+
? `not run — ${c.lintAvailability.unavailableReason}`
|
|
99
|
+
: null);
|
|
100
|
+
return {
|
|
101
|
+
score,
|
|
102
|
+
maxScore: 100,
|
|
103
|
+
rating: (0, scoring_1.ratingFromScore)(score),
|
|
104
|
+
rawScore: result.rawScore,
|
|
105
|
+
rawPenalty: result.rawPenalty,
|
|
106
|
+
methodology: result.methodology,
|
|
107
|
+
deductions: result.deductions,
|
|
108
|
+
capsApplied: result.capsApplied,
|
|
109
|
+
topActions: result.topActions,
|
|
110
|
+
// Schema v11: `metrics` surfaces only the non-capability signals.
|
|
111
|
+
// Lint counts + tool live in `report.capabilities.lint`; god-file +
|
|
112
|
+
// dead-import stats live in `report.capabilities.structural`.
|
|
113
|
+
metrics: {
|
|
114
|
+
filesOver500Lines: m.filesOver500Lines,
|
|
115
|
+
largestFileLines: m.largestFileLines,
|
|
116
|
+
largestFilePath: m.largestFilePath,
|
|
117
|
+
consoleLogCount: m.consoleLogCount,
|
|
118
|
+
anyTypeCount: m.anyTypeCount,
|
|
119
|
+
typeErrors: m.typeErrors,
|
|
120
|
+
},
|
|
121
|
+
details:
|
|
122
|
+
// Split the lint label into its successful-run name plus a separate
|
|
123
|
+
// "Linter coverage gap" sentence when packs were attempted but
|
|
124
|
+
// returned null silently. The parenthetical "(ruff (not run: ts))"
|
|
125
|
+
// shape was easy to miss in the rendered prose.
|
|
126
|
+
(() => {
|
|
127
|
+
if (!lintTool)
|
|
128
|
+
return `${scoreInput.lintErrors} lint errors, ${lintWarnings} warnings`;
|
|
129
|
+
const notRunMatch = /\(not run: ([^)]+)\)/.exec(lintTool);
|
|
130
|
+
if (!notRunMatch) {
|
|
131
|
+
return `${scoreInput.lintErrors} lint errors, ${lintWarnings} warnings (${lintTool})`;
|
|
132
|
+
}
|
|
133
|
+
const cleanTool = lintTool.replace(/\s*\(not run: [^)]+\)/, '').trim();
|
|
134
|
+
// Per-pack annotation shape: `typescript — reason` (em-dash
|
|
135
|
+
// separator added by `health.ts` when `gatherOutcome` supplied a
|
|
136
|
+
// reason). Re-render in grammatical form: "typescript not run
|
|
137
|
+
// (reason)" instead of awkward "typescript — reason not run".
|
|
138
|
+
const annotated = notRunMatch[1]
|
|
139
|
+
.split(',')
|
|
140
|
+
.map((entry) => {
|
|
141
|
+
const trimmed = entry.trim();
|
|
142
|
+
const reasonMatch = /^(.+?)\s+—\s+(.+)$/.exec(trimmed);
|
|
143
|
+
return reasonMatch
|
|
144
|
+
? `${reasonMatch[1]} not run (${reasonMatch[2]})`
|
|
145
|
+
: `${trimmed} not run`;
|
|
146
|
+
})
|
|
147
|
+
.join('; ');
|
|
148
|
+
return (`${scoreInput.lintErrors} lint errors, ${lintWarnings} warnings (${cleanTool})` +
|
|
149
|
+
`. ⚠ Linter coverage gap: ${annotated}`);
|
|
150
|
+
})() +
|
|
151
|
+
`. ${m.filesOver500Lines} files exceed 500 lines` +
|
|
152
|
+
`. Largest file: ${m.largestFilePath} (${m.largestFileLines} lines)` +
|
|
153
|
+
`. ${m.consoleLogCount} console/debug statements` +
|
|
154
|
+
(m.anyTypeCount > 0 ? `. ${m.anyTypeCount} loose type annotations` : '') +
|
|
155
|
+
(scoreInput.maxFunctionsInFile !== null
|
|
156
|
+
? `. Densest file: ${scoreInput.maxFunctionsInFile} functions`
|
|
157
|
+
: '') +
|
|
158
|
+
'.',
|
|
159
|
+
};
|
|
7
160
|
}
|
|
8
161
|
//# sourceMappingURL=shallow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shallow.js","sourceRoot":"","sources":["../../../src/analyzers/quality/shallow.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"shallow.js","sourceRoot":"","sources":["../../../src/analyzers/quality/shallow.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,11 @@ export interface DuplicationStats {
|
|
|
29
29
|
topClones?: CloneGroup[];
|
|
30
30
|
}
|
|
31
31
|
export interface QualityMetrics {
|
|
32
|
+
sourceFiles: number;
|
|
33
|
+
filesOver500Lines: number;
|
|
34
|
+
largestFileLines: number;
|
|
35
|
+
anyTypeCount: number;
|
|
36
|
+
typeErrors: number | null;
|
|
32
37
|
lintErrors: number;
|
|
33
38
|
lintWarnings: number;
|
|
34
39
|
lintTool: string | null;
|
|
@@ -62,5 +67,14 @@ export interface QualityReport {
|
|
|
62
67
|
slopScore: number;
|
|
63
68
|
toolsUsed: string[];
|
|
64
69
|
toolsUnavailable: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Pack ids of every active language pack at scan time (derived from
|
|
72
|
+
* the cached DetectedStack). The renderer reads this to decide
|
|
73
|
+
* whether structural-graph signals like `orphanModuleCount` need an
|
|
74
|
+
* informational qualifier — graphify can't follow C# `using`
|
|
75
|
+
* directives across assemblies, so on csharp-dominant repos every
|
|
76
|
+
* .cs file looks orphaned and the raw count misleads.
|
|
77
|
+
*/
|
|
78
|
+
activeLanguages?: string[];
|
|
65
79
|
}
|
|
66
80
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/quality/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,SAAS,CAAC;IACb,CAAC,EAAE,SAAS,CAAC;CACd;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/quality/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,SAAS,CAAC;IACb,CAAC,EAAE,SAAS,CAAC;CACd;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAM7B,WAAW,EAAE,MAAM,CAAC;IAOpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxB,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAGrC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAG7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IAGxB,SAAS,EAAE,MAAM,CAAC;IAGlB,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { RemediationAction } from '../remediation';
|
|
2
2
|
import { SecurityReport } from './types';
|
|
3
|
-
import {
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import { SecurityScoreInput } from '../../scoring';
|
|
4
|
+
/**
|
|
5
|
+
* Project a SecurityReport into the canonical scoring input shape.
|
|
6
|
+
*
|
|
7
|
+
* Partitions findings by rule + category so each one contributes to
|
|
8
|
+
* exactly one field — no double-counting. Rule strings are stable
|
|
9
|
+
* contracts owned by the gather code (`gather.ts`); changes there
|
|
10
|
+
* must keep these names in sync.
|
|
11
|
+
*/
|
|
12
|
+
export declare function countsFromReport(report: SecurityReport): SecurityScoreInput;
|
|
13
|
+
export declare function buildSecurityActions(report: SecurityReport): RemediationAction<SecurityScoreInput>[];
|
|
7
14
|
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,CA2C3E;AAoED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,GACrB,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAuCzC"}
|
|
@@ -2,28 +2,59 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.countsFromReport = countsFromReport;
|
|
4
4
|
exports.buildSecurityActions = buildSecurityActions;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Project a SecurityReport into the canonical scoring input shape.
|
|
7
|
+
*
|
|
8
|
+
* Partitions findings by rule + category so each one contributes to
|
|
9
|
+
* exactly one field — no double-counting. Rule strings are stable
|
|
10
|
+
* contracts owned by the gather code (`gather.ts`); changes there
|
|
11
|
+
* must keep these names in sync.
|
|
12
|
+
*/
|
|
6
13
|
function countsFromReport(report) {
|
|
7
|
-
|
|
14
|
+
let secretFindings = 0;
|
|
15
|
+
let privateKeyFiles = 0;
|
|
16
|
+
let envFilesInGit = 0;
|
|
17
|
+
const codeFindings = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
18
|
+
for (const f of report.findings) {
|
|
19
|
+
if (f.rule === 'private-key-file') {
|
|
20
|
+
privateKeyFiles++;
|
|
21
|
+
}
|
|
22
|
+
else if (f.rule === 'env-in-git') {
|
|
23
|
+
envFilesInGit++;
|
|
24
|
+
}
|
|
25
|
+
else if (f.category === 'secret') {
|
|
26
|
+
secretFindings++;
|
|
27
|
+
}
|
|
28
|
+
else if (f.category === 'code') {
|
|
29
|
+
codeFindings[f.severity]++; // aggregator-ok: rebuilding SecurityScoreInput partitions from SecurityReport (rehydration), not user-facing aggregation
|
|
30
|
+
}
|
|
31
|
+
// Other categories are intentionally ignored by the scorer; the
|
|
32
|
+
// partition above covers every category the gather code emits today
|
|
33
|
+
// ('secret', 'code', 'config' — config is private-key-file/env-in-git
|
|
34
|
+
// which are named above). Adding a new category requires a scoring
|
|
35
|
+
// decision; silently bucketing into "other" would be the wrong default.
|
|
36
|
+
}
|
|
8
37
|
const d = report.summary.dependencies;
|
|
9
38
|
return {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
39
|
+
secretFindings,
|
|
40
|
+
privateKeyFiles,
|
|
41
|
+
envFilesInGit,
|
|
42
|
+
codeFindings,
|
|
43
|
+
depVulns: {
|
|
44
|
+
critical: d.critical,
|
|
45
|
+
high: d.high,
|
|
46
|
+
medium: d.medium,
|
|
47
|
+
low: d.low,
|
|
48
|
+
},
|
|
49
|
+
// D025b/D025d: read directly from DepVulnSummary.available. Both
|
|
50
|
+
// health side (via toSecurityScoreInput) and standalone side
|
|
51
|
+
// (countsFromReport here) now plumb the same boolean into the
|
|
52
|
+
// unified scorer — drift parity closes automatically. Default
|
|
53
|
+
// `true` for fixtures that pre-date the field (legacy report JSONs
|
|
54
|
+
// saved before 2.4.7).
|
|
55
|
+
depVulnsAvailable: d.available ?? true,
|
|
18
56
|
};
|
|
19
57
|
}
|
|
20
|
-
/** Deduct N findings of the given severity from counts, clamped to 0. */
|
|
21
|
-
function deductSeverity(counts, severity, n, depsOnly = false) {
|
|
22
|
-
const key = depsOnly
|
|
23
|
-
? ('dep' + severity[0].toUpperCase() + severity.slice(1))
|
|
24
|
-
: severity;
|
|
25
|
-
return { ...counts, [key]: Math.max(0, counts[key] - n) };
|
|
26
|
-
}
|
|
27
58
|
/** Convert a finding into generic evidence. */
|
|
28
59
|
function findingToEvidence(f) {
|
|
29
60
|
return {
|
|
@@ -48,31 +79,53 @@ function groupByRule(findings) {
|
|
|
48
79
|
}
|
|
49
80
|
return groups;
|
|
50
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Build a patch that reduces the appropriate `SecurityScoreInput` field
|
|
84
|
+
* for a group of findings sharing one rule. The unified scorer fields
|
|
85
|
+
* map back to the gather-code categories:
|
|
86
|
+
* - rule === 'private-key-file' → privateKeyFiles
|
|
87
|
+
* - rule === 'env-in-git' → envFilesInGit
|
|
88
|
+
* - category === 'secret' → secretFindings
|
|
89
|
+
* - category === 'code' → codeFindings[severity]
|
|
90
|
+
*/
|
|
91
|
+
function patchForRuleGroup(rule, findings) {
|
|
92
|
+
if (rule === 'private-key-file') {
|
|
93
|
+
return (cur) => ({ ...cur, privateKeyFiles: 0 });
|
|
94
|
+
}
|
|
95
|
+
if (rule === 'env-in-git') {
|
|
96
|
+
return (cur) => ({ ...cur, envFilesInGit: 0 });
|
|
97
|
+
}
|
|
98
|
+
const category = findings[0]?.category;
|
|
99
|
+
if (category === 'secret') {
|
|
100
|
+
const n = findings.length;
|
|
101
|
+
return (cur) => ({ ...cur, secretFindings: Math.max(0, cur.secretFindings - n) });
|
|
102
|
+
}
|
|
103
|
+
// Code findings: partition the group by severity, deduct each bucket.
|
|
104
|
+
const bySeverity = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
105
|
+
for (const f of findings)
|
|
106
|
+
bySeverity[f.severity]++; // aggregator-ok: partition-for-deduction in remediation action planner, not user-facing aggregation
|
|
107
|
+
return (cur) => ({
|
|
108
|
+
...cur,
|
|
109
|
+
codeFindings: {
|
|
110
|
+
critical: Math.max(0, cur.codeFindings.critical - bySeverity.critical),
|
|
111
|
+
high: Math.max(0, cur.codeFindings.high - bySeverity.high),
|
|
112
|
+
medium: Math.max(0, cur.codeFindings.medium - bySeverity.medium),
|
|
113
|
+
low: Math.max(0, cur.codeFindings.low - bySeverity.low),
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
51
117
|
function buildSecurityActions(report) {
|
|
52
118
|
const actions = [];
|
|
53
119
|
const groups = groupByRule(report.findings);
|
|
54
120
|
// One action per rule group — fix ALL findings matching that rule.
|
|
55
121
|
for (const [rule, findings] of groups) {
|
|
56
122
|
const topSeverity = findings[0].severity;
|
|
57
|
-
const counts = {
|
|
58
|
-
critical: findings.filter((f) => f.severity === 'critical').length,
|
|
59
|
-
high: findings.filter((f) => f.severity === 'high').length,
|
|
60
|
-
medium: findings.filter((f) => f.severity === 'medium').length,
|
|
61
|
-
low: findings.filter((f) => f.severity === 'low').length,
|
|
62
|
-
};
|
|
63
123
|
actions.push({
|
|
64
124
|
id: `security.fix-${rule}`,
|
|
65
125
|
title: `Fix ${findings.length} ${rule} finding${findings.length === 1 ? '' : 's'} (${topSeverity.toUpperCase()})`,
|
|
66
126
|
rationale: `Rule ${rule} (${findings[0].tool}). ${findings[0].cwe || 'No CWE tag'}.`,
|
|
67
127
|
evidence: findings.slice(0, 50).map(findingToEvidence),
|
|
68
|
-
patch: (
|
|
69
|
-
let next = c;
|
|
70
|
-
next = deductSeverity(next, 'critical', counts.critical);
|
|
71
|
-
next = deductSeverity(next, 'high', counts.high);
|
|
72
|
-
next = deductSeverity(next, 'medium', counts.medium);
|
|
73
|
-
next = deductSeverity(next, 'low', counts.low);
|
|
74
|
-
return next;
|
|
75
|
-
},
|
|
128
|
+
patch: patchForRuleGroup(rule, findings),
|
|
76
129
|
});
|
|
77
130
|
}
|
|
78
131
|
// Dependency updates — one action covering all dep vulns.
|
|
@@ -90,12 +143,9 @@ function buildSecurityActions(report) {
|
|
|
90
143
|
message: `${d.total} vulnerable dependencies`,
|
|
91
144
|
},
|
|
92
145
|
],
|
|
93
|
-
patch: (
|
|
94
|
-
...
|
|
95
|
-
|
|
96
|
-
depHigh: 0,
|
|
97
|
-
depMedium: 0,
|
|
98
|
-
depLow: 0,
|
|
146
|
+
patch: (cur) => ({
|
|
147
|
+
...cur,
|
|
148
|
+
depVulns: { critical: 0, high: 0, medium: 0, low: 0 },
|
|
99
149
|
}),
|
|
100
150
|
});
|
|
101
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":"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"}
|