@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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnalysisResult cache — the cross-process persistence layer for the
|
|
3
|
+
* canonical analysis envelope.
|
|
4
|
+
*
|
|
5
|
+
* Two layers of caching:
|
|
6
|
+
*
|
|
7
|
+
* 1. **In-memory** (`Map<cacheKey, Promise<AnalysisResult>>`).
|
|
8
|
+
* Dedupes concurrent calls within one process. Survives across
|
|
9
|
+
* subcommands that share a Node process; cleared on process exit.
|
|
10
|
+
*
|
|
11
|
+
* 2. **On-disk JSON** under `<cwd>/.dxkit/cache/`. Persists across
|
|
12
|
+
* processes so a second subcommand minutes later can skip the
|
|
13
|
+
* gather entirely. Keyed by short commit SHA.
|
|
14
|
+
*
|
|
15
|
+
* Invalidation triggers (any one forces a rebuild + overwrites the
|
|
16
|
+
* cached file):
|
|
17
|
+
*
|
|
18
|
+
* - Commit SHA differs from the cached file's `commitSha`.
|
|
19
|
+
* - `.dxkit-ignore` mtime differs (changes affect what gets scanned).
|
|
20
|
+
* - Cached file's `dxkitVersion` differs from the running version
|
|
21
|
+
* (new tools or scoring formulas can change metrics).
|
|
22
|
+
* - Cached file's `schemaVersion` differs from
|
|
23
|
+
* `ANALYSIS_RESULT_SCHEMA_VERSION` (incompatible envelope shape).
|
|
24
|
+
* - Caller passes `rescan: true`.
|
|
25
|
+
*
|
|
26
|
+
* Dirty-tree behavior:
|
|
27
|
+
*
|
|
28
|
+
* Working-tree-dirty results are NEVER persisted to disk and are
|
|
29
|
+
* NOT read back from disk. The commit SHA doesn't reflect the on-
|
|
30
|
+
* disk state, so a disk cache keyed by SHA would alias two genuinely-
|
|
31
|
+
* different states. In-memory caching still applies, so multiple
|
|
32
|
+
* subcommands within one process share the rebuild without thrashing.
|
|
33
|
+
*
|
|
34
|
+
* The cache module never invokes a gather itself. Callers supply a
|
|
35
|
+
* `build` function returning `AnalysisResultBody`; the module stamps
|
|
36
|
+
* provenance and handles persistence. This keeps the gather pipeline
|
|
37
|
+
* decoupled from the cache layer and makes both unit-testable in
|
|
38
|
+
* isolation.
|
|
39
|
+
*/
|
|
40
|
+
import { type AnalysisResult, type AnalysisResultBody } from '../analysis-result';
|
|
41
|
+
/**
|
|
42
|
+
* Provenance fields the cache resolves before deciding hit vs miss.
|
|
43
|
+
* Separate from `AnalysisResult` so the cache can compute it without
|
|
44
|
+
* a build, then compare against the cached file's persisted shape.
|
|
45
|
+
*/
|
|
46
|
+
export interface ResolvedProvenance {
|
|
47
|
+
commitSha: string;
|
|
48
|
+
branch: string;
|
|
49
|
+
cwd: string;
|
|
50
|
+
dxkitVersion: string;
|
|
51
|
+
ignoreFileMtime: number | null;
|
|
52
|
+
workingTreeDirty: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Builder contract. The cache calls this when it needs to (re)build
|
|
56
|
+
* the body. Implementations live alongside the consumers that
|
|
57
|
+
* orchestrate the gather pipeline (`analyzeHealthInternal` and
|
|
58
|
+
* friends).
|
|
59
|
+
*/
|
|
60
|
+
export type AnalysisResultBuilder = (cwd: string) => Promise<AnalysisResultBody>;
|
|
61
|
+
export interface ReadOrBuildOptions {
|
|
62
|
+
/** Force a rebuild even on cache hit. Mirrors the CLI `--rescan` flag. */
|
|
63
|
+
rescan?: boolean;
|
|
64
|
+
/** Override cache directory location. Defaults to `<cwd>/.dxkit/cache`.
|
|
65
|
+
* Tests use this to isolate cache state in a tmpdir; production
|
|
66
|
+
* callers should never set it. */
|
|
67
|
+
cacheDir?: string;
|
|
68
|
+
/** Override the provenance resolver. Tests use this to inject SHA /
|
|
69
|
+
* dirty-flag without spawning git. Production callers should never
|
|
70
|
+
* set it. */
|
|
71
|
+
resolveProvenance?: (cwd: string) => ResolvedProvenance;
|
|
72
|
+
/** Override the wall-clock used for `builtAt`. Tests use this to
|
|
73
|
+
* produce deterministic timestamps. Defaults to `new Date()`. */
|
|
74
|
+
now?: () => Date;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve provenance fields needed to compute the cache key. Reads
|
|
78
|
+
* git state via `git rev-parse` + `git status --porcelain`,
|
|
79
|
+
* `.dxkit-ignore` mtime via `fs.statSync`, and pulls dxkit version
|
|
80
|
+
* from the package constant.
|
|
81
|
+
*/
|
|
82
|
+
export declare function resolveProvenance(cwd: string): ResolvedProvenance;
|
|
83
|
+
/**
|
|
84
|
+
* Main entry. Returns a cached `AnalysisResult` when the cache key
|
|
85
|
+
* still matches, or rebuilds via `build` and persists. Dirty trees
|
|
86
|
+
* bypass disk persistence; the in-memory layer still applies.
|
|
87
|
+
*/
|
|
88
|
+
export declare function readOrBuildAnalysisResult(args: {
|
|
89
|
+
cwd: string;
|
|
90
|
+
build: AnalysisResultBuilder;
|
|
91
|
+
opts?: ReadOrBuildOptions;
|
|
92
|
+
}): Promise<AnalysisResult>;
|
|
93
|
+
/** Test seam — drop in-memory dedup state between test cases. */
|
|
94
|
+
export declare function clearInMemoryCache(): void;
|
|
95
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/analyzers/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAKH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAM5B;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;uCAEmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;kBAEc;IACd,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,kBAAkB,CAAC;IAExD;sEACkE;IAClE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAOD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CASjE;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,qBAAqB,CAAC;IAC7B,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CA+C1B;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AnalysisResult cache — the cross-process persistence layer for the
|
|
4
|
+
* canonical analysis envelope.
|
|
5
|
+
*
|
|
6
|
+
* Two layers of caching:
|
|
7
|
+
*
|
|
8
|
+
* 1. **In-memory** (`Map<cacheKey, Promise<AnalysisResult>>`).
|
|
9
|
+
* Dedupes concurrent calls within one process. Survives across
|
|
10
|
+
* subcommands that share a Node process; cleared on process exit.
|
|
11
|
+
*
|
|
12
|
+
* 2. **On-disk JSON** under `<cwd>/.dxkit/cache/`. Persists across
|
|
13
|
+
* processes so a second subcommand minutes later can skip the
|
|
14
|
+
* gather entirely. Keyed by short commit SHA.
|
|
15
|
+
*
|
|
16
|
+
* Invalidation triggers (any one forces a rebuild + overwrites the
|
|
17
|
+
* cached file):
|
|
18
|
+
*
|
|
19
|
+
* - Commit SHA differs from the cached file's `commitSha`.
|
|
20
|
+
* - `.dxkit-ignore` mtime differs (changes affect what gets scanned).
|
|
21
|
+
* - Cached file's `dxkitVersion` differs from the running version
|
|
22
|
+
* (new tools or scoring formulas can change metrics).
|
|
23
|
+
* - Cached file's `schemaVersion` differs from
|
|
24
|
+
* `ANALYSIS_RESULT_SCHEMA_VERSION` (incompatible envelope shape).
|
|
25
|
+
* - Caller passes `rescan: true`.
|
|
26
|
+
*
|
|
27
|
+
* Dirty-tree behavior:
|
|
28
|
+
*
|
|
29
|
+
* Working-tree-dirty results are NEVER persisted to disk and are
|
|
30
|
+
* NOT read back from disk. The commit SHA doesn't reflect the on-
|
|
31
|
+
* disk state, so a disk cache keyed by SHA would alias two genuinely-
|
|
32
|
+
* different states. In-memory caching still applies, so multiple
|
|
33
|
+
* subcommands within one process share the rebuild without thrashing.
|
|
34
|
+
*
|
|
35
|
+
* The cache module never invokes a gather itself. Callers supply a
|
|
36
|
+
* `build` function returning `AnalysisResultBody`; the module stamps
|
|
37
|
+
* provenance and handles persistence. This keeps the gather pipeline
|
|
38
|
+
* decoupled from the cache layer and makes both unit-testable in
|
|
39
|
+
* isolation.
|
|
40
|
+
*/
|
|
41
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
42
|
+
if (k2 === undefined) k2 = k;
|
|
43
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
44
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
45
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
46
|
+
}
|
|
47
|
+
Object.defineProperty(o, k2, desc);
|
|
48
|
+
}) : (function(o, m, k, k2) {
|
|
49
|
+
if (k2 === undefined) k2 = k;
|
|
50
|
+
o[k2] = m[k];
|
|
51
|
+
}));
|
|
52
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
53
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
54
|
+
}) : function(o, v) {
|
|
55
|
+
o["default"] = v;
|
|
56
|
+
});
|
|
57
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
58
|
+
var ownKeys = function(o) {
|
|
59
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
60
|
+
var ar = [];
|
|
61
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
62
|
+
return ar;
|
|
63
|
+
};
|
|
64
|
+
return ownKeys(o);
|
|
65
|
+
};
|
|
66
|
+
return function (mod) {
|
|
67
|
+
if (mod && mod.__esModule) return mod;
|
|
68
|
+
var result = {};
|
|
69
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
70
|
+
__setModuleDefault(result, mod);
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
})();
|
|
74
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
75
|
+
exports.resolveProvenance = resolveProvenance;
|
|
76
|
+
exports.readOrBuildAnalysisResult = readOrBuildAnalysisResult;
|
|
77
|
+
exports.clearInMemoryCache = clearInMemoryCache;
|
|
78
|
+
const fs = __importStar(require("fs"));
|
|
79
|
+
const path = __importStar(require("path"));
|
|
80
|
+
const child_process_1 = require("child_process");
|
|
81
|
+
const analysis_result_1 = require("../analysis-result");
|
|
82
|
+
const constants_1 = require("../constants");
|
|
83
|
+
const IGNORE_FILE = '.dxkit-ignore';
|
|
84
|
+
const CACHE_SUBDIR = path.join('.dxkit', 'cache');
|
|
85
|
+
// In-memory dedup across subcommands sharing a process. Keyed by the
|
|
86
|
+
// resolved provenance so a SHA change inside one process (rare but
|
|
87
|
+
// possible — e.g. a long-running daemon) correctly misses.
|
|
88
|
+
const inMemoryCache = new Map();
|
|
89
|
+
/**
|
|
90
|
+
* Resolve provenance fields needed to compute the cache key. Reads
|
|
91
|
+
* git state via `git rev-parse` + `git status --porcelain`,
|
|
92
|
+
* `.dxkit-ignore` mtime via `fs.statSync`, and pulls dxkit version
|
|
93
|
+
* from the package constant.
|
|
94
|
+
*/
|
|
95
|
+
function resolveProvenance(cwd) {
|
|
96
|
+
return {
|
|
97
|
+
commitSha: gitRevParse(cwd, '--short', 'HEAD'),
|
|
98
|
+
branch: gitRevParse(cwd, '--abbrev-ref', 'HEAD'),
|
|
99
|
+
cwd: path.resolve(cwd),
|
|
100
|
+
dxkitVersion: constants_1.VERSION,
|
|
101
|
+
ignoreFileMtime: readIgnoreFileMtime(cwd),
|
|
102
|
+
workingTreeDirty: isWorkingTreeDirty(cwd),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Main entry. Returns a cached `AnalysisResult` when the cache key
|
|
107
|
+
* still matches, or rebuilds via `build` and persists. Dirty trees
|
|
108
|
+
* bypass disk persistence; the in-memory layer still applies.
|
|
109
|
+
*/
|
|
110
|
+
async function readOrBuildAnalysisResult(args) {
|
|
111
|
+
const { cwd, build } = args;
|
|
112
|
+
const opts = args.opts ?? {};
|
|
113
|
+
const provenance = (opts.resolveProvenance ?? resolveProvenance)(cwd);
|
|
114
|
+
const cacheDir = opts.cacheDir ?? path.join(provenance.cwd, CACHE_SUBDIR);
|
|
115
|
+
const cacheKey = buildCacheKey(provenance);
|
|
116
|
+
// In-memory short-circuit. Same provenance, same process: one rebuild.
|
|
117
|
+
if (!opts.rescan) {
|
|
118
|
+
const cached = inMemoryCache.get(cacheKey);
|
|
119
|
+
if (cached)
|
|
120
|
+
return cached;
|
|
121
|
+
}
|
|
122
|
+
const promise = (async () => {
|
|
123
|
+
// Disk read — only when the tree is clean (otherwise the cached SHA
|
|
124
|
+
// doesn't represent the gathered state) and the caller didn't ask
|
|
125
|
+
// for a forced rebuild.
|
|
126
|
+
if (!opts.rescan && !provenance.workingTreeDirty) {
|
|
127
|
+
const fromDisk = readDiskCache(cacheDir, provenance);
|
|
128
|
+
if (fromDisk)
|
|
129
|
+
return fromDisk;
|
|
130
|
+
}
|
|
131
|
+
// Build, stamp provenance, persist (when clean).
|
|
132
|
+
const body = await build(cwd);
|
|
133
|
+
const now = (opts.now ?? (() => new Date()))();
|
|
134
|
+
const result = {
|
|
135
|
+
...body,
|
|
136
|
+
commitSha: provenance.commitSha,
|
|
137
|
+
branch: provenance.branch,
|
|
138
|
+
cwd: provenance.cwd,
|
|
139
|
+
builtAt: now.toISOString(),
|
|
140
|
+
dxkitVersion: provenance.dxkitVersion,
|
|
141
|
+
schemaVersion: analysis_result_1.ANALYSIS_RESULT_SCHEMA_VERSION,
|
|
142
|
+
ignoreFileMtime: provenance.ignoreFileMtime,
|
|
143
|
+
workingTreeDirty: provenance.workingTreeDirty,
|
|
144
|
+
};
|
|
145
|
+
if (!provenance.workingTreeDirty) {
|
|
146
|
+
writeDiskCache(cacheDir, result);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
})();
|
|
150
|
+
inMemoryCache.set(cacheKey, promise);
|
|
151
|
+
// Drop the in-memory entry if the build itself threw — keep the cache
|
|
152
|
+
// honest, don't poison subsequent calls with a rejected Promise.
|
|
153
|
+
promise.catch(() => inMemoryCache.delete(cacheKey));
|
|
154
|
+
return promise;
|
|
155
|
+
}
|
|
156
|
+
/** Test seam — drop in-memory dedup state between test cases. */
|
|
157
|
+
function clearInMemoryCache() {
|
|
158
|
+
inMemoryCache.clear();
|
|
159
|
+
}
|
|
160
|
+
// ─── Internals ────────────────────────────────────────────────────────────
|
|
161
|
+
function buildCacheKey(p) {
|
|
162
|
+
// Including dirty-flag means a dirty rebuild doesn't get reused as a
|
|
163
|
+
// clean-tree hit after the user stashes/commits without restarting
|
|
164
|
+
// the process. Including version + schema keeps long-running daemons
|
|
165
|
+
// honest across an in-place dxkit upgrade.
|
|
166
|
+
return [
|
|
167
|
+
p.cwd,
|
|
168
|
+
p.commitSha || 'no-sha',
|
|
169
|
+
p.workingTreeDirty ? 'dirty' : 'clean',
|
|
170
|
+
p.dxkitVersion,
|
|
171
|
+
String(analysis_result_1.ANALYSIS_RESULT_SCHEMA_VERSION),
|
|
172
|
+
p.ignoreFileMtime ?? 'no-ignore',
|
|
173
|
+
].join('::');
|
|
174
|
+
}
|
|
175
|
+
function cacheFilePath(cacheDir, commitSha) {
|
|
176
|
+
const sha = commitSha || 'no-sha';
|
|
177
|
+
return path.join(cacheDir, `analysis-result-${sha}.json`);
|
|
178
|
+
}
|
|
179
|
+
function readDiskCache(cacheDir, expected) {
|
|
180
|
+
const file = cacheFilePath(cacheDir, expected.commitSha);
|
|
181
|
+
if (!fs.existsSync(file))
|
|
182
|
+
return null;
|
|
183
|
+
let parsed;
|
|
184
|
+
try {
|
|
185
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Corrupt cache file — drop it and force a rebuild rather than
|
|
189
|
+
// crashing the caller. Defensive: a partial write or manual edit
|
|
190
|
+
// shouldn't break dxkit.
|
|
191
|
+
safeUnlink(file);
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
if (!isCacheStillValid(parsed, expected)) {
|
|
195
|
+
safeUnlink(file);
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
return parsed;
|
|
199
|
+
}
|
|
200
|
+
function isCacheStillValid(cached, expected) {
|
|
201
|
+
if (cached.schemaVersion !== analysis_result_1.ANALYSIS_RESULT_SCHEMA_VERSION)
|
|
202
|
+
return false;
|
|
203
|
+
if (cached.dxkitVersion !== expected.dxkitVersion)
|
|
204
|
+
return false;
|
|
205
|
+
if (cached.commitSha !== expected.commitSha)
|
|
206
|
+
return false;
|
|
207
|
+
if (cached.ignoreFileMtime !== expected.ignoreFileMtime)
|
|
208
|
+
return false;
|
|
209
|
+
// A persisted result is always clean (we don't write dirty ones).
|
|
210
|
+
// Defensive: refuse to honor any persisted record claiming dirty.
|
|
211
|
+
if (cached.workingTreeDirty)
|
|
212
|
+
return false;
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
function writeDiskCache(cacheDir, result) {
|
|
216
|
+
try {
|
|
217
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
218
|
+
const file = cacheFilePath(cacheDir, result.commitSha);
|
|
219
|
+
fs.writeFileSync(file, JSON.stringify(result, null, 2), 'utf-8');
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Persistence failure is non-fatal — the caller already has a
|
|
223
|
+
// valid in-memory result. Logging is deferred to a future
|
|
224
|
+
// observability pass; silent failure here matches the broader
|
|
225
|
+
// "cache is best-effort" posture.
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function safeUnlink(file) {
|
|
229
|
+
try {
|
|
230
|
+
fs.unlinkSync(file);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
/* file already gone — fine */
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function gitRevParse(cwd, ...args) {
|
|
237
|
+
try {
|
|
238
|
+
return (0, child_process_1.execSync)(`git rev-parse ${args.join(' ')}`, {
|
|
239
|
+
cwd,
|
|
240
|
+
encoding: 'utf-8',
|
|
241
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
242
|
+
timeout: 5000,
|
|
243
|
+
}).trim();
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return '';
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function isWorkingTreeDirty(cwd) {
|
|
250
|
+
try {
|
|
251
|
+
// `--untracked-files=all` expands every untracked file to its own
|
|
252
|
+
// line. The default behavior collapses an untracked directory to
|
|
253
|
+
// a single entry for its parent — which would hide a nested
|
|
254
|
+
// `.dxkit/` under a non-dxkit collapsed parent and leak it past
|
|
255
|
+
// the segment filter below. `=all` is also resilient to git's
|
|
256
|
+
// future grouping rules.
|
|
257
|
+
const out = (0, child_process_1.execSync)('git status --porcelain --untracked-files=all', {
|
|
258
|
+
cwd,
|
|
259
|
+
encoding: 'utf-8',
|
|
260
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
261
|
+
timeout: 5000,
|
|
262
|
+
});
|
|
263
|
+
// `.dxkit/` (analysis reports + this cache file + dashboard
|
|
264
|
+
// renders) and `.dxkit-ignore` (dxkit's own config file) are
|
|
265
|
+
// dxkit-owned paths. Untracked entries for either — at ANY depth
|
|
266
|
+
// in the tree — can't invalidate the cache the cache itself
|
|
267
|
+
// populates. Customer repos that haven't added `.dxkit/` to their
|
|
268
|
+
// `.gitignore` would otherwise always look dirty and the cache
|
|
269
|
+
// would never persist across processes. Nested cases matter too:
|
|
270
|
+
// a monorepo may have analysis state at `Code/Source/.dxkit/`
|
|
271
|
+
// alongside the root `.dxkit/`, and both should be filtered.
|
|
272
|
+
//
|
|
273
|
+
// Narrow exclusion — anything else under the tree (new source
|
|
274
|
+
// files, build artifacts, editor state) still flags dirty
|
|
275
|
+
// because it CAN change gather output. We match exact path
|
|
276
|
+
// segments to avoid masking unrelated names that merely contain
|
|
277
|
+
// the substring (e.g. a hypothetical `my.dxkit.json` file would
|
|
278
|
+
// not match the `.dxkit` segment check).
|
|
279
|
+
const lines = out.split('\n').filter((line) => {
|
|
280
|
+
if (!line.trim())
|
|
281
|
+
return false;
|
|
282
|
+
const m = /^\?\? (.+)$/.exec(line);
|
|
283
|
+
if (!m)
|
|
284
|
+
return true;
|
|
285
|
+
const segments = stripTrailingSlash(m[1]).split('/');
|
|
286
|
+
return !segments.some((seg) => seg === '.dxkit' || seg === '.dxkit-ignore');
|
|
287
|
+
});
|
|
288
|
+
return lines.length > 0;
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Not in a git repo (or git missing) — treat as dirty so we never
|
|
292
|
+
// persist a result we can't invalidate by SHA. Same posture as the
|
|
293
|
+
// dirty-tree path: in-memory cache still applies.
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function stripTrailingSlash(p) {
|
|
298
|
+
return p.endsWith('/') ? p.slice(0, -1) : p;
|
|
299
|
+
}
|
|
300
|
+
function readIgnoreFileMtime(cwd) {
|
|
301
|
+
try {
|
|
302
|
+
const stat = fs.statSync(path.join(cwd, IGNORE_FILE));
|
|
303
|
+
return stat.mtimeMs;
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/analyzers/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run `test-with-coverage` across every active language pack and
|
|
3
|
+
* collect the outcome rows. Single source of truth shared by:
|
|
4
|
+
* - `vyuh-dxkit coverage` command (cli.ts)
|
|
5
|
+
* - `vyuh-dxkit health --with-coverage` (D021 sub-piece 2)
|
|
6
|
+
* - `vyuh-dxkit test-gaps --with-coverage` (D021 sub-piece 2)
|
|
7
|
+
* - `vyuh-dxkit report` orchestrator (D021 sub-piece 3)
|
|
8
|
+
*
|
|
9
|
+
* The function is provider-driven — each pack's
|
|
10
|
+
* `LanguagePackCapabilities.coverage.runTests` produces the artifact
|
|
11
|
+
* its parser reads back later via `loadCoverage()`. Pre-D021 the
|
|
12
|
+
* orchestration lived inline in cli.ts; extracting it here lets
|
|
13
|
+
* `--with-coverage` reuse the exact flow without duplicating the
|
|
14
|
+
* per-pack iteration / fail-fast / row-shape logic.
|
|
15
|
+
*/
|
|
16
|
+
import type { LanguageSupport } from '../languages/types';
|
|
17
|
+
export type CoverageRunStatus = 'success' | 'unavailable' | 'failed' | 'skipped';
|
|
18
|
+
export interface CoverageRunRow {
|
|
19
|
+
pack: string;
|
|
20
|
+
status: CoverageRunStatus;
|
|
21
|
+
durationMs: number;
|
|
22
|
+
artifact: string | null;
|
|
23
|
+
reason: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface CoverageRunOptions {
|
|
26
|
+
/** Restrict to one pack id (matches `vyuh-dxkit coverage --lang <id>`). */
|
|
27
|
+
langFilter?: string;
|
|
28
|
+
/** Stop at the first `failed` row when true (mirrors the CLI default). */
|
|
29
|
+
failFast?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Streaming progress hook. Called once with `start` before each pack
|
|
32
|
+
* runs and once with `done` after, regardless of outcome. CLI hosts
|
|
33
|
+
* use this to print `→ <pack>: running tests with coverage...` lines
|
|
34
|
+
* incrementally — the function itself stays silent.
|
|
35
|
+
*/
|
|
36
|
+
onPackStart?: (packId: string) => void;
|
|
37
|
+
onPackEnd?: (row: CoverageRunRow) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface CoverageRunResult {
|
|
40
|
+
rows: CoverageRunRow[];
|
|
41
|
+
/** Packs that detect-active matched but failed the `langFilter` gate. */
|
|
42
|
+
activePacks: LanguageSupport[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Iterate active packs and invoke each one's
|
|
46
|
+
* `capabilities.coverage.runTests`, returning per-pack outcome rows.
|
|
47
|
+
* Packs without a `runTests` implementation surface as `'skipped'` so
|
|
48
|
+
* the caller can still render the full active-pack matrix.
|
|
49
|
+
*
|
|
50
|
+
* Fail-fast semantics match the legacy `coverage` command: a
|
|
51
|
+
* `failed` outcome stops the iteration (caller handles exit code).
|
|
52
|
+
* `unavailable` and `skipped` keep the loop running because they mean
|
|
53
|
+
* "no artifact this run" rather than "the test run blew up."
|
|
54
|
+
*/
|
|
55
|
+
export declare function runCoverageAcrossPacks(cwd: string, opts?: CoverageRunOptions): Promise<CoverageRunResult>;
|
|
56
|
+
//# sourceMappingURL=coverage-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-runner.d.ts","sourceRoot":"","sources":["../../src/analyzers/coverage-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,yEAAyE;IACzE,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAsD5B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCoverageAcrossPacks = runCoverageAcrossPacks;
|
|
4
|
+
const languages_1 = require("../languages");
|
|
5
|
+
/**
|
|
6
|
+
* Iterate active packs and invoke each one's
|
|
7
|
+
* `capabilities.coverage.runTests`, returning per-pack outcome rows.
|
|
8
|
+
* Packs without a `runTests` implementation surface as `'skipped'` so
|
|
9
|
+
* the caller can still render the full active-pack matrix.
|
|
10
|
+
*
|
|
11
|
+
* Fail-fast semantics match the legacy `coverage` command: a
|
|
12
|
+
* `failed` outcome stops the iteration (caller handles exit code).
|
|
13
|
+
* `unavailable` and `skipped` keep the loop running because they mean
|
|
14
|
+
* "no artifact this run" rather than "the test run blew up."
|
|
15
|
+
*/
|
|
16
|
+
async function runCoverageAcrossPacks(cwd, opts = {}) {
|
|
17
|
+
const failFast = opts.failFast ?? true;
|
|
18
|
+
const active = (0, languages_1.detectActiveLanguages)(cwd);
|
|
19
|
+
const candidates = active.filter((p) => !opts.langFilter || p.id === opts.langFilter);
|
|
20
|
+
const rows = [];
|
|
21
|
+
for (const pack of candidates) {
|
|
22
|
+
const provider = pack.capabilities?.coverage;
|
|
23
|
+
if (!provider?.runTests) {
|
|
24
|
+
const row = {
|
|
25
|
+
pack: pack.id,
|
|
26
|
+
status: 'skipped',
|
|
27
|
+
durationMs: 0,
|
|
28
|
+
artifact: null,
|
|
29
|
+
reason: 'no runTests() implementation yet (pack coverage capability is read-only)',
|
|
30
|
+
};
|
|
31
|
+
rows.push(row);
|
|
32
|
+
opts.onPackEnd?.(row);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
opts.onPackStart?.(pack.id);
|
|
36
|
+
const outcome = await provider.runTests(cwd);
|
|
37
|
+
let row;
|
|
38
|
+
if (outcome.kind === 'success') {
|
|
39
|
+
row = {
|
|
40
|
+
pack: pack.id,
|
|
41
|
+
status: 'success',
|
|
42
|
+
durationMs: outcome.durationMs,
|
|
43
|
+
artifact: outcome.artifact,
|
|
44
|
+
reason: null,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else if (outcome.kind === 'unavailable') {
|
|
48
|
+
row = {
|
|
49
|
+
pack: pack.id,
|
|
50
|
+
status: 'unavailable',
|
|
51
|
+
durationMs: 0,
|
|
52
|
+
artifact: null,
|
|
53
|
+
reason: outcome.reason,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
row = {
|
|
58
|
+
pack: pack.id,
|
|
59
|
+
status: 'failed',
|
|
60
|
+
durationMs: outcome.durationMs,
|
|
61
|
+
artifact: null,
|
|
62
|
+
reason: outcome.reason,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
rows.push(row);
|
|
66
|
+
opts.onPackEnd?.(row);
|
|
67
|
+
if (row.status === 'failed' && failFast)
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
return { rows, activePacks: active };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=coverage-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-runner.js","sourceRoot":"","sources":["../../src/analyzers/coverage-runner.ts"],"names":[],"mappings":";;AA4DA,wDAyDC;AArGD,4CAAqD;AAiCrD;;;;;;;;;;GAUG;AACI,KAAK,UAAU,sBAAsB,CAC1C,GAAW,EACX,OAA2B,EAAE;IAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,IAAA,iCAAqB,EAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC7C,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,GAAmB;gBAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;gBACb,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,0EAA0E;aACnF,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAmB,CAAC;QACxB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,GAAG,GAAG;gBACJ,IAAI,EAAE,IAAI,CAAC,EAAE;gBACb,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC1C,GAAG,GAAG;gBACJ,IAAI,EAAE,IAAI,CAAC,EAAE;gBACb,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,GAAG;gBACJ,IAAI,EAAE,IAAI,CAAC,EAAE;gBACb,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ;YAAE,MAAM;IACjD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface DashboardOptions {
|
|
2
|
+
/** Where to read markdown reports from. Default: `<cwd>/.dxkit/reports`. */
|
|
3
|
+
reportsDir?: string;
|
|
4
|
+
/** Where to read JSON synthesis data from. Default: same as reportsDir. */
|
|
5
|
+
jsonDir?: string;
|
|
6
|
+
/** Project name shown in the header. Default: derived from package.json or basename(cwd). */
|
|
7
|
+
projectName?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DashboardResult {
|
|
10
|
+
html: string;
|
|
11
|
+
reportCount: number;
|
|
12
|
+
criticalIssueCount: number;
|
|
13
|
+
/** Best-effort summary numbers, surfaced to the CLI for stderr logging. */
|
|
14
|
+
summary: {
|
|
15
|
+
healthScore: number | null;
|
|
16
|
+
healthGrade: string | null;
|
|
17
|
+
vulnCount: number;
|
|
18
|
+
gapCount: number;
|
|
19
|
+
advisoryCount: number;
|
|
20
|
+
slopScore: number | null;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function analyzeDashboard(cwd: string, options?: DashboardOptions): DashboardResult;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/dashboard/index.ts"],"names":[],"mappings":"AAwDA,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA8R7F"}
|