@vyuhlabs/dxkit 2.4.4 → 2.4.6

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +339 -0
  2. package/README.md +33 -19
  3. package/dist/analyzers/tests/index.d.ts.map +1 -1
  4. package/dist/analyzers/tests/index.js +2 -0
  5. package/dist/analyzers/tests/index.js.map +1 -1
  6. package/dist/analyzers/tools/coverage.d.ts +1 -1
  7. package/dist/analyzers/tools/coverage.d.ts.map +1 -1
  8. package/dist/analyzers/tools/coverage.js.map +1 -1
  9. package/dist/analyzers/tools/jacoco.d.ts +76 -0
  10. package/dist/analyzers/tools/jacoco.d.ts.map +1 -0
  11. package/dist/analyzers/tools/jacoco.js +228 -0
  12. package/dist/analyzers/tools/jacoco.js.map +1 -0
  13. package/dist/analyzers/tools/osv-scanner-deps.d.ts +47 -0
  14. package/dist/analyzers/tools/osv-scanner-deps.d.ts.map +1 -0
  15. package/dist/analyzers/tools/osv-scanner-deps.js +175 -0
  16. package/dist/analyzers/tools/osv-scanner-deps.js.map +1 -0
  17. package/dist/analyzers/tools/osv-scanner-fix.d.ts +20 -0
  18. package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
  19. package/dist/analyzers/tools/osv-scanner-fix.js +45 -20
  20. package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
  21. package/dist/analyzers/tools/runner.d.ts +47 -0
  22. package/dist/analyzers/tools/runner.d.ts.map +1 -1
  23. package/dist/analyzers/tools/runner.js +79 -0
  24. package/dist/analyzers/tools/runner.js.map +1 -1
  25. package/dist/analyzers/tools/tool-registry.d.ts +10 -0
  26. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  27. package/dist/analyzers/tools/tool-registry.js +131 -0
  28. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +36 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/constants.d.ts +2 -0
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/languages/index.d.ts.map +1 -1
  35. package/dist/languages/index.js +12 -1
  36. package/dist/languages/index.js.map +1 -1
  37. package/dist/languages/java.d.ts +67 -0
  38. package/dist/languages/java.d.ts.map +1 -0
  39. package/dist/languages/java.js +421 -0
  40. package/dist/languages/java.js.map +1 -0
  41. package/dist/languages/kotlin.d.ts +1 -52
  42. package/dist/languages/kotlin.d.ts.map +1 -1
  43. package/dist/languages/kotlin.js +16 -286
  44. package/dist/languages/kotlin.js.map +1 -1
  45. package/dist/languages/ruby.d.ts +77 -0
  46. package/dist/languages/ruby.d.ts.map +1 -0
  47. package/dist/languages/ruby.js +531 -0
  48. package/dist/languages/ruby.js.map +1 -0
  49. package/dist/languages/types.d.ts +9 -1
  50. package/dist/languages/types.d.ts.map +1 -1
  51. package/dist/tools-cli.d.ts +16 -1
  52. package/dist/tools-cli.d.ts.map +1 -1
  53. package/dist/tools-cli.js +69 -6
  54. package/dist/tools-cli.js.map +1 -1
  55. package/dist/types.d.ts +1 -1
  56. package/dist/types.d.ts.map +1 -1
  57. package/package.json +2 -1
  58. package/templates/.claude/rules/java.md +11 -0
  59. package/templates/.claude/rules/ruby.md +11 -0
  60. package/templates/configs/java/README.md +6 -0
  61. package/templates/configs/ruby/README.md +6 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,345 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.6] - 2026-05-07
11
+
12
+ ### Added — Ruby language pack (Phase 10k.2)
13
+
14
+ 8th language pack, fully dynamic outside the JVM family. Stress-tests
15
+ the LP-recipe (v3) on a paradigm distinct from Java/Kotlin. Detection
16
+ is source-presence-driven (G9 — requires `.rb` files within depth 5,
17
+ not bare `Gemfile`).
18
+
19
+ All 5 capabilities wired:
20
+
21
+ - **imports** — `require` / `require_relative` / `autoload :Sym, 'path'`
22
+ extraction. File-level resolver no-op (Ruby's `$LOAD_PATH` + Zeitwerk
23
+ + metaprogramming make resolution fundamentally best-effort; mirrors
24
+ rust/kotlin/csharp/java pattern). Best-effort contract documented
25
+ in pack source.
26
+ - **testFramework** — Gemfile / Gemfile.lock substring scan with
27
+ precedence rspec → minitest → test-unit. Glob-count fallback
28
+ (`*_spec.rb` vs `*_test.rb` / `test_*.rb`) when no Gemfile exists.
29
+ - **coverage** — SimpleCov via `coverage/.resultset.json` (canonical)
30
+ → `coverage/coverage.json` (simplecov-json formatter) → null.
31
+ Multi-suite resultset handled via per-line max-union (matches
32
+ SimpleCov's own merge semantics).
33
+ - **lint** — RuboCop `--format json`. Severity map: fatal→critical,
34
+ error→high, warning→medium, convention/refactor→low.
35
+ - **depVulns** — osv-scanner against Gemfile.lock with `RubyGems`
36
+ ecosystem filter. Routes through the cross-pack SSOT (see
37
+ Architecture below). bundler-audit deliberately not used — its JSON
38
+ is unstable upstream.
39
+
40
+ `licenses` deliberately omitted — no canonical pure-CLI license tool
41
+ for RubyGems analogous to pip-licenses.
42
+
43
+ Cross-ecosystem matrix wired with the standard 4 benchmark fixtures
44
+ (Secrets/BadLint/Duplications/UntestedModule — G4-scaffolded). New
45
+ `Ruby > osv-scanner surfaces nokogiri@1.10.0 advisories from
46
+ Gemfile.lock` benchmark added with a pinned-vulnerable Gemfile.lock
47
+ (nokogiri 1.10.0 + rack 2.0.1 + loofah 2.2.0). CI gains
48
+ `ruby/setup-ruby@v1` + `gem install rubocop`.
49
+
50
+ ### Architecture
51
+
52
+ - **`gemPackage` registry probe field** — extends `ToolDefinition`
53
+ for library-only Ruby gems (mirrors the existing `nodePackage`
54
+ field). Probes via `gem list -i <name>`; used by SimpleCov which
55
+ is required from `spec_helper.rb` rather than invoked as a CLI
56
+ command. Future ecosystems with library-only tools follow the same
57
+ pattern. Surfaced when `tools install simplecov` falsely reported
58
+ "already installed" because the prior `binaries: ['ruby']`
59
+ workaround couldn't distinguish "ruby present" from "simplecov
60
+ gem installed."
61
+ - **`findInGemBin` registry probe step** — discovers Ruby gem bin
62
+ directories dynamically via `gem env executable_directory` +
63
+ `Gem.user_dir + "/bin"`. Memoized once per process (~150ms one-time
64
+ cost). Handles ruby version differences (3.2.0 vs 3.3.0), install
65
+ modes (system vs `--user-install`), and package managers (apt vs
66
+ brew vs rbenv) with no static probePaths needed.
67
+ - **`osv-scanner-deps.ts` SSOT generalization** (renamed from
68
+ `osv-scanner-maven.ts`). `parseOsvScannerFindings(raw, ecosystem)`
69
+ and `gatherOsvScannerDepVulnsResult(cwd, source, ecosystem,
70
+ manifestCandidates)` now take ecosystem + manifest candidates as
71
+ parameters. Kotlin/Java pass `'Maven'` + Maven manifests; Ruby
72
+ passes `'RubyGems'` + `['Gemfile.lock']`. CLAUDE.md rule #2 —
73
+ fork-and-edit avoided. Same dedup semantics, same CVSS resolution
74
+ path.
75
+
76
+ ### Recipe v3 (final installment) — closed
77
+
78
+ - **G4** — scaffolder writes templated benchmark fixtures with
79
+ per-language syntax tokens (PascalCase vs snake_case filenames,
80
+ comment markers, AKIA constant placement). Saves ~30 min per new
81
+ pack. Languages without a profile fall back to TODO stubs.
82
+ - **G6** — scaffolder appends `[Unreleased]` CHANGELOG stub on
83
+ `npm run new-lang`. Idempotent. Forces release-notes thinking at
84
+ scaffold time, not ship-tag day.
85
+ - **G1** — class-wide gate parser robustness audit. Auto-derived
86
+ language lists in `check-architecture.sh` (LP-A1/A2/A3 patterns no
87
+ longer drift as new packs land). Self-test pattern documented:
88
+ every gate parsing TS declarations exits 1 with explicit failure
89
+ when its parser produces an empty list. Surfaced its own bug —
90
+ the scaffolder's `LANGUAGES` registry update produced a double
91
+ comma under Prettier multi-line shape; fixed in the same series.
92
+
93
+ Three deferred items carried forward to v4 with explicit trigger
94
+ conditions: G2-Opt2 typed-null capability (Swift consumer), G3
95
+ BENCHMARK_LANGUAGES auto-edit (matrix > 8 packs), G7 pre-commit hook
96
+ polish (multi-gate diagnosis cost).
97
+
98
+ ### Recipe v4 (working doc opened)
99
+
100
+ `tmp/recipe-v4-working-doc.md` (gitignored, ephemeral). Surfaced
101
+ during 10k.2:
102
+
103
+ - **G_v4_1** — scaffolder TEST_TEMPLATE conflates source-text vs
104
+ tool-output parsers. Future contributors must re-derive the
105
+ convention by reading existing packs.
106
+ - **G_v4_2** — TOOL_DEFS probe assumed CLI binary; library-only gems
107
+ lacked detection. **DELIVERED in 10k.2.4** via the new `gemPackage`
108
+ field.
109
+ - **G_v4_3** — SimpleCov HTML-only state currently indistinguishable
110
+ from "tool didn't run." Outcome enum extension proposed.
111
+
112
+ Recipe-v4 is paying for itself: G_v4_2 surfaced and shipped in the
113
+ same session; G_v4_1 caught in a meta-conversation about test
114
+ discipline.
115
+
116
+ ### Defects
117
+
118
+ - **D002** (Python subprocess fallback) — Ruby pack has no analog
119
+ (osv-scanner reads Gemfile.lock directly, no `bundle env`/`bundle
120
+ show` introspection ladder). Stays accepted-deferred.
121
+ - **D017** (NEW) — `dxkit bom <large-project> > file.json` produces
122
+ 0-byte output intermittently on vyuhlabs-platform (1700+ deps).
123
+ EXIT=0, no error. Workaround: pipe through `cat`. Hypothesis:
124
+ Node stdout buffer doesn't drain before process exit when output
125
+ is large + stdout is a regular file. NOT a 2.4.6 ship blocker —
126
+ workaround exists, intermittent, doesn't affect interactive use.
127
+ Investigate in a follow-up commit.
128
+
129
+ ### Pre-ship regression — clean
130
+
131
+ Sequential dxkit reports captured against dxkit-on-dxkit and
132
+ vyuhlabs-platform; 12 reports each diffed against the 2.4.5-fixed
133
+ baseline. Zero code regressions detected. All deltas explained:
134
+
135
+ - dxkit/test-gaps 16 → 32 — better data (Istanbul vs import-graph
136
+ fallback in baseline).
137
+ - dxkit/vulnerabilities +3 gitleaks — expected (G4 AKIA placeholder
138
+ strings in scaffolder source).
139
+ - platform/vulnerabilities -3 — platform-side refactor of
140
+ user.controller.ts (not dxkit).
141
+ - BoM advisory deltas — OSV.dev upstream churn (8 days since 2.4.5
142
+ ship).
143
+
144
+ Confidence: high. 1025 tests passing, full suite + all gates green
145
+ at every commit in the 10-commit branch.
146
+
147
+ ## [2.4.5] - 2026-04-29
148
+
149
+ ### Fixed (high-severity, discovered during 2.4.5 pre-ship regression)
150
+
151
+ - **`osv-scanner fix` was THREE bugs in one** (5-month-old bug shipped
152
+ since 2.4.0 / Phase 10h.6). osv-scanner v2's `fix` subcommand invokes
153
+ `npm install` internally to compute upgrade patches. dxkit was
154
+ invoking it in the user's project cwd, which caused all three of the
155
+ following:
156
+
157
+ 1. **Data mutation** — `npm install` wipes / reinstalls the cwd's
158
+ `node_modules` (often with `--legacy-peer-deps` fallback when
159
+ peer-deps don't resolve cleanly). Visible to users running
160
+ back-to-back commands: `dxkit vulnerabilities` followed by `npm
161
+ test` or any other step depending on stable `node_modules` would
162
+ fail cryptically. Discovered when dxkit-on-dxkit crashed mid-run
163
+ with `Cannot find module 'hosted-git-info'`.
164
+
165
+ 2. **Process orphan leak** — osv-scanner's `npm install` grandchildren
166
+ outlived dxkit's 120s `execSync` budget. `execSync(..., {timeout})`
167
+ SIGTERMs only the immediate child; npm install + its node-package
168
+ subprocesses orphaned to PID 1 and kept eating CPU/memory until
169
+ they finished or the shell exited. Each `dxkit vulnerabilities`
170
+ invocation could leak 1-3 orphans; in CI this polluted subsequent
171
+ steps.
172
+
173
+ 3. **Silent BoM under-reporting** — when osv-scanner's npm install
174
+ left a partially-broken `node_modules` (peer-dep mismatches that
175
+ `--legacy-peer-deps` couldn't fully resolve), dxkit's BoM
176
+ aggregator subsequently couldn't enumerate the affected
177
+ dependencies. Root-project deps got silently dropped from the
178
+ BoM. On dxkit-on-dxkit comparison, 2.4.4 reported only 7 BoM
179
+ entries (sub-fixture deps) vs 2.4.5's 24 (sub-fixtures + dxkit's
180
+ own 17 root deps including `hosted-git-info`, `eslint`,
181
+ `typescript`, etc.). `unfilteredTotalPackages` 22 → 353. The
182
+ analyzed project's own deps were missing from BoM whenever the
183
+ bug hit. Most repos that resolve peer-deps cleanly under
184
+ `--legacy-peer-deps` weren't affected (vyuhlabs-platform's BoM
185
+ stayed correct at 145 packages); repos with subtle peer-dep
186
+ issues silently lost root-dep enumeration.
187
+
188
+ **Fix** (split across 10k.1.5b and 10k.1.5c):
189
+
190
+ - **Temp-dir isolation (10k.1.5b)**: stage `package.json` +
191
+ `package-lock.json` in a fresh temp dir before invoking osv-scanner,
192
+ discard the temp dir after parsing JSON output. Project's tree is
193
+ now read-only treatment (the contract dxkit's analyzers always
194
+ claimed). Stops bug #1 (mutation) and #3 (BoM under-reporting,
195
+ since `node_modules` no longer gets clobbered).
196
+
197
+ - **Process-group SIGKILL on timeout (10k.1.5c)**: new
198
+ `runDetached(cmd, args, opts)` helper in `src/analyzers/tools/runner.ts`
199
+ spawns the child in its own process group via
200
+ `spawn({ detached: true })` and `process.kill(-pid, 'SIGKILL')` on
201
+ timeout — kills grandchildren atomically. Stops bug #2 (orphan
202
+ leak). Reusable for any future tool that may fork grandchildren
203
+ (PMD's JVM, mvn, gradle).
204
+
205
+ Regression tests added: `test/osv-scanner-fix.test.ts` for the
206
+ isolation contract; `test/runner.test.ts` for the process-group
207
+ group-kill semantics (sleep-30-grandchild + 200ms timeout asserts
208
+ elapsed < 2s — would block 30s if process-group regressed). Caught
209
+ by the discipline the user pushed for: "never ship broken;
210
+ understand the root cause and fix properly". The discipline was
211
+ validated end-to-end — the same scan that found bug #1 also
212
+ surfaced #2 and #3 once we knew where to look.
213
+
214
+ **Forensic evidence preserved** at
215
+ `tmp/regression/2.4.4/dxkit/bom.json` (gitignored — 2.4.4 baseline
216
+ with under-reported BoM) vs `tmp/regression/2.4.5-fixed/dxkit/bom.json`
217
+ (full enumeration after the fix).
218
+
219
+
220
+
221
+ Phase 10k.1 — Java language pack (recipe stress test #1, JVM-cousin
222
+ shape). 7th language pack lands the cross-ecosystem matrix at
223
+ **8 active language packs** including Java with full capability
224
+ coverage. Recipe v3 makes substantial progress (G2 + G5 + G9
225
+ delivered; G1 partial; G4/G6/G7 deferred). D008 + D011 + a vitest
226
+ hookTimeout flake closed in pre-flight commits.
227
+
228
+ No breaking changes for end users. New depVulns/lint/coverage/
229
+ imports/testFramework data on Java/Maven projects; existing analyzer
230
+ commands produce identical output for non-Java projects.
231
+
232
+ ### Added
233
+
234
+ - **Java language pack** (Phase 10k.1) with five capability providers:
235
+ - **depVulns** via `osv-scanner` against `pom.xml` /
236
+ `gradle.lockfile` / `gradle/verification-metadata.xml`.
237
+ Implementation lives in the new shared
238
+ `src/analyzers/tools/osv-scanner-maven.ts` module that both
239
+ kotlin and java packs delegate to (CLAUDE.md rule #2 SSOT).
240
+ - **lint** via PMD 7.x with `rulesets/java/quickstart.xml`.
241
+ `parsePmdOutput` tiers PMD's 1-5 priority into dxkit's
242
+ critical/high/medium/low scheme via `mapPmdRuleSeverity`.
243
+ Real-fixture-driven parser tests against captured PMD 7.24.0
244
+ output at `test/fixtures/raw/java/pmd-output.json`.
245
+ - **coverage** via JaCoCo XML — reuses the kotlin pack's parser
246
+ unchanged (the parser was source-language-agnostic from day 1
247
+ and is now hosted in `src/analyzers/tools/jacoco.ts`). Path
248
+ candidates extended for Maven (`target/site/jacoco/jacoco.xml`,
249
+ `target/site/jacoco-aggregate/jacoco.xml`) alongside the existing
250
+ Gradle paths.
251
+ - **imports** via regex extraction over `import [static]
252
+ <fqn>(.<Class>|.*)?;` after stripping line + block comments.
253
+ Best-effort resolution (matches kotlin/rust pack semantics —
254
+ Java package paths don't 1:1 map to filesystem paths in all
255
+ build layouts).
256
+ - **testFramework** via build-file substring scan of pom.xml +
257
+ build.gradle{,.kts} for canonical artifact names. Order honors
258
+ mixed-state migration: junit-jupiter > spock > testng > junit4.
259
+ - **PMD (`pmd`) in TOOL_DEFS**. PMD 7.x as the canonical Java linter,
260
+ with brew on macOS / GitHub releases zip on Linux / scoop on
261
+ Windows. CI install step added.
262
+ - **Java cross-ecosystem benchmark fixture**
263
+ (`test/fixtures/benchmarks/java/`) — five files (Secrets.java with
264
+ fake AWS key, BadLint.java with PMD violations, Duplications.java
265
+ with jscpd clone pair, UntestedModule.java for filename-match
266
+ test-gap, pom.xml with `commons-collections:3.2.1` for the original
267
+ "Mad Gadget" CVE-2015-7501 deserialization advisory + log4j-core
268
+ for Log4Shell). Matrix wins on all four dimensions (secret/dup/
269
+ test-gaps run unconditionally; lint matrix activates with
270
+ `requires: 'pmd'`).
271
+ - **`scripts/check-docs-coverage.sh` (Recipe v3 / G5).** Pre-commit +
272
+ CI gate that asserts every `LanguageId` in `src/languages/index.ts`
273
+ appears in canonical doc anchors (CLAUDE.md path glob; README.md
274
+ ecosystem coverage table row count + ID substring mention). Closes
275
+ the kotlin-PR-#23 follow-up class of failure where a pack ships in
276
+ main but docs go stale because nobody remembered to update them.
277
+ - **`vyuh-dxkit tools install <name>` and `--all` (D011).** Single-tool
278
+ install for cross-stack development (e.g. installing `spotbugs` /
279
+ `pmd` on a Node-only repo); `--all` enumerates every TOOL_DEFS
280
+ entry. Unknown names fail loudly with an "Unknown tool" message +
281
+ pointer to `tools list`. Used during this phase's PMD harvest.
282
+ - **CLAUDE.md merge-strategy guidance**. Codifies when PRs should
283
+ squash-merge (single logical unit) vs rebase-merge (multiple
284
+ independently-meaningful commits with prose-quality messages —
285
+ what this PR did to preserve D008/D011/G2/G5/G9 + 5 capability
286
+ commits as discrete history).
287
+
288
+ ### Refactored (architectural improvement)
289
+
290
+ - **`src/analyzers/tools/jacoco.ts`** — extracted from kotlin pack
291
+ in 10k.1.2. Owns `parseJaCoCoXml`, `findJaCoCoReport`,
292
+ `gatherJaCoCoCoverageResult`. Both JVM packs delegate. Parser was
293
+ always source-language-agnostic; just relocating to the right home.
294
+ - **`src/analyzers/tools/osv-scanner-maven.ts`** — extracted from
295
+ kotlin pack in 10k.1.4. Same pattern. Owns
296
+ `parseOsvScannerMavenFindings` + `gatherOsvScannerMavenDepVulnsResult`.
297
+ Both JVM packs delegate. Parser was already ecosystem-filtered to
298
+ Maven (not Kotlin-coupled); just relocating.
299
+ - **Capabilities contract is genuinely optional (Recipe v3 / G2).**
300
+ `capabilities-contract.test.ts:117` previously asserted
301
+ `providers.length === LANGUAGES.length` for the depVulns capability,
302
+ forcing packs without depVulns to register null-stub providers.
303
+ Now: `expect(providers.length).toBe(LANGUAGES.filter((l) =>
304
+ l.capabilities?.depVulns).length)` — precise contract, packs can
305
+ omit. Unblocks Swift's eventual graceful-degradation pattern.
306
+ Java's null-stub from intermediate commits retired.
307
+ - **`detectJava` is source-presence-driven, not manifest-driven
308
+ (Recipe v3 / G9).** Initial detection activated on bare `pom.xml`,
309
+ which broke kotlin's matrix lint test because kotlin's fixture has
310
+ pom.xml (for osv-scanner Maven). Both packs activated → lintTool
311
+ came back as `'detekt, pmd'`. Fix: require either `src/main/java/`
312
+ directory OR actual `.java` source within depth 5. Mixed Kotlin +
313
+ Java projects still activate both packs (correct). G9 noted as a
314
+ scaffolder-template fix candidate — the scaffolded `detect()` stub
315
+ currently suggests "manifest signals" which is the bug we just hit.
316
+
317
+ ### Fixed
318
+
319
+ - **D008 — stale test-fixture types + missing contract test.** 21 type
320
+ errors surfaced when `tsc --noEmit` runs against `src + test`
321
+ together (`DimensionScore.details` / `DuplicationStats.totalLines`
322
+ field drift; `DepVulnFinding.source` → renamed to `.tool`;
323
+ `mapLintSeverity` contract was narrower than every impl reality;
324
+ spread-duplication cleanups). Adds `tsconfig.test.json` +
325
+ `npm run typecheck:test` + wires into `.husky/pre-push` and
326
+ `.github/workflows/ci.yml`. The contract test paid for itself in the
327
+ same session — caught a `Record<LanguageId, boolean>` literal
328
+ regression introduced 30 minutes earlier.
329
+ - **`scripts/check-cross-ecosystem-coverage.sh` Prettier robustness
330
+ (Recipe v3 / G1, partial).** Auto-derive parser assumed single-line
331
+ `LANGUAGES = [...]`. Prettier reformatted to multi-line at the 7th
332
+ entry (line-length budget) and the gate parsed 0 entries silently.
333
+ Switched to awk block extract — robust to both shapes. One
334
+ instance fixed; class-wide audit of similar parsers deferred.
335
+ - **Vitest `hookTimeout` default of 10s caused C# `beforeAll` flakes.**
336
+ `dotnet restore` against a cold NuGet cache routinely takes 18-44s
337
+ on WSL2. Now matches `testTimeout` at 180s.
338
+
339
+ ### Phase 10k roadmap
340
+
341
+ After 10k.1 (Java) ships in 2.4.5, **10k.2 (Ruby) ships in 2.4.6** as
342
+ recipe stress test #2 — fully dynamic language outside the JVM family.
343
+ Then **2.5.0 (Phase 10i — fingerprints + exec summary across 8-language
344
+ matrix)**. Phase 10j.2 (Swift/iOS) is **deferred to post-10rr / pre-3.0.0
345
+ opportunistic slot** because Linux/WSL2 development can't validate the
346
+ xcodeproj-shape majority without macOS access. See
347
+ `tmp/phase-10k-backend-langs-roadmap.md` for the full phase plan.
348
+
10
349
  ## [2.4.4] - 2026-04-27
11
350
 
12
351
  Phase 10j.1 — first mobile language pack (Kotlin/Android), Recipe v2
package/README.md CHANGED
@@ -32,6 +32,14 @@ npx @vyuhlabs/dxkit init --full --yes # everything: DX + quality + hooks
32
32
 
33
33
  The two modes are complementary. The analyzers run anywhere; the scaffolder writes `.claude/` so Claude Code and other agents have project-specific context and slash commands that delegate to the same analyzers.
34
34
 
35
+ > **Already installed dxkit globally? Upgrade explicitly.** `npx @vyuhlabs/dxkit@<version>` resolves the `vyuh-dxkit` binary off PATH first — if you previously ran `npm install -g @vyuhlabs/dxkit`, npx silently uses that older global binary regardless of the `@<version>` you specified. This is npx behavior, not a dxkit bug. To pick up the latest fixes (e.g. the 2.4.5 osv-scanner-fix data-mutation fix), run:
36
+ >
37
+ > ```bash
38
+ > npm install -g @vyuhlabs/dxkit@latest
39
+ > # or, if you don't need a global install, remove the old one and rely on npx:
40
+ > npm uninstall -g @vyuhlabs/dxkit
41
+ > ```
42
+
35
43
  ---
36
44
 
37
45
  ## Analyzer CLI (`vyuh-dxkit <command>`)
@@ -45,7 +53,7 @@ Seven deterministic analyzers. Each emits a markdown report to `.dxkit/reports/`
45
53
  | `test-gaps` | Coverage artifact → import-graph → filename (strongest wins) | <1s | `.dxkit/reports/test-gaps-<date>.md` |
46
54
  | `quality` | Slop score + jscpd duplication + eslint/ruff + hygiene | 5–15s | `.dxkit/reports/quality-review-<date>.md` |
47
55
  | `dev-report` | Commits, contributors, hot files, velocity, conventional % | <1s | `.dxkit/reports/developer-report-<date>.md` |
48
- | `licenses` | Dependency license inventory across every active pack (TS/Python/Go/Rust/C#) | 5–20s | `.dxkit/reports/licenses-<date>.md` |
56
+ | `licenses` | Dependency license inventory across every active pack (TS, Python, Go, Rust, C#; Kotlin + Java omitted — no canonical CLI license tool for Maven/Gradle ecosystems) | 5–20s | `.dxkit/reports/licenses-<date>.md` |
49
57
  | `bom` | **Bill of Materials** — joins licenses + vulns per package, groups by top-level manifest dep (Snyk-style), enriches with CISA KEV + EPSS + reachability, ranks by composite risk score with "This Week's Triage" summary, aggregates nested sub-projects, `--filter=top-level` collapses transitive rows, 15-col XLSX | 10–40s | `.dxkit/reports/bom-<date>.{md,xlsx}` |
50
58
 
51
59
  Plus a converter: `vyuh-dxkit to-xlsx <json-file>` renders any `licenses` or `bom` detailed JSON as the canonical 15-column XLSX.
@@ -77,7 +85,7 @@ Plus a converter: `vyuh-dxkit to-xlsx <json-file>` renders any `licenses` or `bo
77
85
 
78
86
  Three signals, strongest wins for files it covers:
79
87
 
80
- 1. **Coverage artifact** — Istanbul JSON (TS/JS), `coverage.json` (Python), `coverage.out` (Go), cobertura XML (C#/Rust), `lcov.info` (Rust). If the tool measured a file, that decision is authoritative.
88
+ 1. **Coverage artifact** — Istanbul JSON (TS/JS), `coverage.json` (Python), `coverage.out` (Go), cobertura XML (C#/Rust), `lcov.info` (Rust), JaCoCo XML (Kotlin). If the tool measured a file, that decision is authoritative.
81
89
  2. **Import-graph reachability** — files transitively imported from an active test file (up to 3 hops). Rescues integration tests + behavior-named tests the filename matcher misses.
82
90
  3. **Filename match** — last-resort basename similarity.
83
91
 
@@ -97,14 +105,17 @@ vyuh-dxkit tools install # interactive: prompts per tool
97
105
 
98
106
  ### Tools integrated
99
107
 
100
- | Layer | Tools |
101
- | --------- | ------------------------------------------------------------------------- |
102
- | Universal | `cloc`, `gitleaks`, `semgrep`, `jscpd`, `graphify` (AST) |
103
- | Node / TS | `eslint`, `npm audit`, `osv-scanner` (fix planner), `@vitest/coverage-v8` |
104
- | Python | `ruff`, `pip-audit`, `coverage` (coverage.py) |
105
- | Go | `golangci-lint`, `govulncheck` |
106
- | Rust | `clippy`, `cargo-audit`, `cargo-llvm-cov` |
107
- | C# | `dotnet-format` (via SDK — formatter, not a linter) |
108
+ | Layer | Tools |
109
+ | --------- | -------------------------------------------------------------------------- |
110
+ | Universal | `cloc`, `gitleaks`, `semgrep`, `jscpd`, `graphify` (AST) |
111
+ | Node / TS | `eslint`, `npm audit`, `osv-scanner` (fix planner), `@vitest/coverage-v8` |
112
+ | Python | `ruff`, `pip-audit`, `coverage` (coverage.py) |
113
+ | Go | `golangci-lint`, `govulncheck` |
114
+ | Rust | `clippy`, `cargo-audit`, `cargo-llvm-cov` |
115
+ | C# | `dotnet-format` (via SDK — formatter, not a linter) |
116
+ | Kotlin | `detekt` (Checkstyle XML), `osv-scanner` (Maven), JaCoCo XML |
117
+ | Java | `pmd` (PMD 7.x JSON), `osv-scanner` (Maven), JaCoCo XML reuse |
118
+ | Ruby | `rubocop` (JSON), `bundler-audit`, `osv-scanner` (Gemfile.lock), SimpleCov |
108
119
 
109
120
  Install commands are platform-aware (brew on macOS, user-local install on Linux, winget/scoop on Windows). Tools install into `~/.local/bin` or similar user paths — no `sudo` required.
110
121
 
@@ -167,15 +178,18 @@ npm run new-lang kotlin "Kotlin (Android)"
167
178
 
168
179
  This scaffolds the 7 recipe files (pack module, test stub, fixture skeleton, Claude rule file, template-config dir, plus `LanguageId` union extension and `LANGUAGES` registration). See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full walkthrough. Recipe enforcement (architecture greps + contract tests + synthetic 6th-pack playbook) runs in pre-commit so packs that miss required metadata fail CI.
169
180
 
170
- | Language | Detection | Coverage import | Import-graph | Native tools | Lint severity tiers | Vuln severity tiers |
171
- | -------- | ------------------------------------ | ------------------- | -------------------------------------- | ----------------------------------- | ---------------------- | ----------------------------------- |
172
- | TS / JS | `package.json` | ✅ Istanbul | ✅ import/require/re-export | eslint, npm audit, vitest-coverage | ✅ ESLint rule ID | ✅ npm audit native |
173
- | Python | `pyproject.toml`, `setup.py`, `*.py` | ✅ coverage.py | ✅ import/from | ruff, pip-audit, coverage | ✅ ruff code prefix | ✅ pip-audit + OSV.dev (CVSS v3+v4) |
174
- | Go | `go.mod` | ✅ coverprofile | ✅ import blocks | golangci-lint, govulncheck | ✅ `FromLinter` family | ✅ govulncheck embedded + OSV.dev |
175
- | Rust | `Cargo.toml` | ✅ lcov + cobertura | ⚠️ use statements, extracted only¹ | clippy, cargo-audit, cargo-llvm-cov | ✅ clippy group | ✅ cargo-audit native |
176
- | C# | `*.csproj`, `*.sln` | ✅ cobertura XML | ⚠️ using declarations, extracted only¹ | dotnet-format (formatter) | ❌ (no linter yet) | ✅ dotnet list --vulnerable |
177
-
178
- ¹ Rust + C# packs populate `imports.extracted` but the file-level resolver is a no-op — Rust's `use` paths and C#'s `using` namespaces don't map 1:1 to source files. Downstream analyses that need an edge graph (reachability for dep-vulns, import-graph credit for test-gaps) degrade to conservative defaults for these two languages. Resolvers are planned; see Phase 10i-L.2 in the roadmap.
181
+ | Language | Detection | Coverage import | Import-graph | Native tools | Lint severity tiers | Vuln severity tiers |
182
+ | -------- | ------------------------------------- | ------------------- | -------------------------------------------- | ----------------------------------- | ---------------------- | --------------------------------------------- |
183
+ | TS / JS | `package.json` | ✅ Istanbul | ✅ import/require/re-export | eslint, npm audit, vitest-coverage | ✅ ESLint rule ID | ✅ npm audit native |
184
+ | Python | `pyproject.toml`, `setup.py`, `*.py` | ✅ coverage.py | ✅ import/from | ruff, pip-audit, coverage | ✅ ruff code prefix | ✅ pip-audit + OSV.dev (CVSS v3+v4) |
185
+ | Go | `go.mod` | ✅ coverprofile | ✅ import blocks | golangci-lint, govulncheck | ✅ `FromLinter` family | ✅ govulncheck embedded + OSV.dev |
186
+ | Rust | `Cargo.toml` | ✅ lcov + cobertura | ⚠️ use statements, extracted only¹ | clippy, cargo-audit, cargo-llvm-cov | ✅ clippy group | ✅ cargo-audit native |
187
+ | C# | `*.csproj`, `*.sln` | ✅ cobertura XML | ⚠️ using declarations, extracted only¹ | dotnet-format (formatter) | ❌ (no linter yet) | ✅ dotnet list --vulnerable |
188
+ | Kotlin | gradle/`*.gradle{.kts,}`, `*.kt` | ✅ JaCoCo XML | ⚠️ import statements, extracted only¹ | detekt, osv-scanner (Maven) | ✅ detekt severity | ✅ osv-scanner + OSV.dev (Maven) |
189
+ | Java | `pom.xml`, `src/main/java/`, `*.java` | JaCoCo XML | ⚠️ import statements, extracted only¹ | PMD, osv-scanner (Maven) | PMD priority tiers | osv-scanner + OSV.dev (Maven) |
190
+ | Ruby | `*.rb` | ✅ SimpleCov JSON | ⚠️ require/require_relative, extracted only¹ | rubocop, bundler-audit, osv-scanner | ✅ rubocop severity | ✅ bundler-audit + osv-scanner (Gemfile.lock) |
191
+
192
+ ¹ Rust, C#, Kotlin, Java, and Ruby packs populate `imports.extracted` but the file-level resolver is a no-op — Rust's `use` paths, C#'s `using` namespaces, Kotlin's and Java's `import` package paths, and Ruby's dynamic `require` semantics don't map 1:1 to source files. Downstream analyses that need an edge graph (reachability for dep-vulns, import-graph credit for test-gaps) degrade to conservative defaults for these five languages. Resolvers are planned; see Phase 10i-L.2 in the roadmap.
179
193
 
180
194
  ✅ full support. Multi-language repos fully supported — every detected language's tools run, and dep-vuln counts aggregate across all language packs via the `depVulns` capability (pip-audit findings don't silently replace npm-audit ones).
181
195
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AAErE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,cAAc,CAAC,CA0GzB;AAwBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqFpF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AAErE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,cAAc,CAAC,CA0GzB;AA0BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqFpF"}
@@ -164,6 +164,8 @@ function coverageSourceLabel(source, file) {
164
164
  return `from ${file ?? 'lcov.info'}`;
165
165
  case 'jacoco':
166
166
  return `from ${file ?? 'jacocoTestReport.xml'}`;
167
+ case 'simplecov':
168
+ return `from ${file ?? 'coverage/.resultset.json'}`;
167
169
  }
168
170
  }
169
171
  function formatTestGapsReport(report, elapsed) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/tests/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/tests/index.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@
19
19
  * artifact exists or parsing fails; callers (tests analyzer) should
20
20
  * treat a null return as "fall back to filename matching."
21
21
  */
22
- export type CoverageSource = 'istanbul-summary' | 'istanbul-final' | 'coverage-py' | 'go' | 'cobertura' | 'lcov' | 'jacoco';
22
+ export type CoverageSource = 'istanbul-summary' | 'istanbul-final' | 'coverage-py' | 'go' | 'cobertura' | 'lcov' | 'jacoco' | 'simplecov';
23
23
  export interface FileCoverage {
24
24
  /** Project-relative path (normalized to forward slashes). */
25
25
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,IAAI,GACJ,WAAW,GACX,MAAM,GACN,QAAQ,CAAC;AAEb,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQxE;AAUD,8FAA8F;AAC9F,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUzD"}
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,IAAI,GACJ,WAAW,GACX,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQxE;AAUD,8FAA8F;AAC9F,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAiDH,oCAQC;AAWD,wBAEC;AAGD,gCAUC;AAjFD,+CAAwD;AACxD,0EAAoE;AAGpE,8CAAkD;AAiClD;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,SAAS,GAAyC,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,IAAA,iCAAqB,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAQ,EAAE,SAAS,CAAC,CAAC;IAC1E,OAAO,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,EAAE;AACF,8EAA8E;AAC9E,qEAAqE;AACrE,kEAAkE;AAClE,oEAAoE;AACpE,kEAAkE;AAElE,8FAA8F;AAC9F,SAAgB,MAAM,CAAC,CAAS;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,SAAgB,UAAU,CAAC,CAAS,EAAE,GAAW;IAC/C,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QAClC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAkDH,oCAQC;AAWD,wBAEC;AAGD,gCAUC;AAlFD,+CAAwD;AACxD,0EAAoE;AAGpE,8CAAkD;AAkClD;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,SAAS,GAAyC,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,IAAA,iCAAqB,EAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAQ,EAAE,SAAS,CAAC,CAAC;IAC1E,OAAO,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,EAAE;AACF,8EAA8E;AAC9E,qEAAqE;AACrE,kEAAkE;AAClE,oEAAoE;AACpE,kEAAkE;AAElE,8FAA8F;AAC9F,SAAgB,MAAM,CAAC,CAAS;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,SAAgB,UAAU,CAAC,CAAS,EAAE,GAAW;IAC/C,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QAClC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { type Coverage } from './coverage';
2
+ import type { CoverageResult } from '../../languages/capabilities/types';
3
+ /**
4
+ * Pure parser for JaCoCo's XML report (DTD: `report.dtd`). The structure:
5
+ *
6
+ * <report name="...">
7
+ * <package name="com/example">
8
+ * <class name="com/example/Foo" sourcefilename="Foo.kt">...</class>
9
+ * <sourcefile name="Foo.kt">
10
+ * <line nr="N" mi="..." ci="..." mb="..." cb="..."/>
11
+ * <counter type="LINE" missed="X" covered="Y"/>
12
+ * </sourcefile>
13
+ * <counter type="LINE" missed="X" covered="Y"/>
14
+ * </package>
15
+ * <counter type="LINE" missed="X" covered="Y"/>
16
+ * </report>
17
+ *
18
+ * Per-file coverage comes from `<sourcefile>` blocks: their LINE counter
19
+ * holds the file's missed/covered totals. Project-level total comes from
20
+ * the top-level `<counter type="LINE">` (last in the document).
21
+ *
22
+ * Path attribution joins `<package name>` (forward-slashed, JVM-style)
23
+ * with `<sourcefile name>` to produce the canonical relative path the
24
+ * downstream consumers expect (`com/example/Foo.kt` or
25
+ * `com/example/Foo.java`). JVM bytecode namespacing isn't 1:1 with
26
+ * on-disk source paths in multi-module projects — accepted limitation
27
+ * (matches C#'s cobertura attribution).
28
+ *
29
+ * Returns null when no `<counter type="LINE">` exists at the top level
30
+ * — that's JaCoCo's "no coverage data" signal, distinct from "0%
31
+ * coverage" (where the counter exists with covered=0).
32
+ *
33
+ * Language-agnostic: works for Kotlin (.kt), Java (.java), and any
34
+ * other JVM language whose JaCoCo output respects the `<package>` /
35
+ * `<sourcefile>` shape — `<sourcefile name>` carries the on-disk
36
+ * filename verbatim so the parser doesn't need to know the language.
37
+ */
38
+ export declare function parseJaCoCoXml(raw: string, sourceFile: string, _cwd: string): Coverage | null;
39
+ /**
40
+ * Standard JaCoCo report locations across JVM build tools and project
41
+ * layouts:
42
+ *
43
+ * GRADLE (kotlin + java):
44
+ * - app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml
45
+ * (Android default — `app` module, `jacocoTestReport` task)
46
+ * - build/reports/jacoco/test/jacocoTestReport.xml
47
+ * (plain JVM via the `jacoco` plugin's default `test` task)
48
+ * - build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml
49
+ * (multi-module aggregate; many builds rename the task)
50
+ *
51
+ * MAVEN (java):
52
+ * - target/site/jacoco/jacoco.xml
53
+ * (default Maven JaCoCo plugin — single-module Java)
54
+ * - target/site/jacoco-aggregate/jacoco.xml
55
+ * (Maven multi-module aggregate via jacoco-maven-plugin's
56
+ * `report-aggregate` goal)
57
+ *
58
+ * FALLBACKS:
59
+ * - jacocoTestReport.xml (top-level — fixture / direct path)
60
+ * - jacoco.xml (top-level — Maven fixture / direct path)
61
+ *
62
+ * Returns the first existing path, relative to cwd. Conservative
63
+ * priority: most specific build-tool conventions first, root
64
+ * fallbacks last.
65
+ */
66
+ export declare function findJaCoCoReport(cwd: string): string | null;
67
+ /**
68
+ * Locate + parse the JaCoCo XML report under cwd, wrap the result in a
69
+ * `CoverageResult` envelope. Identical glue across JVM packs (kotlin,
70
+ * java) — no language-specific dispatch needed because JaCoCo's
71
+ * `<sourcefile name>` carries the on-disk filename verbatim and the
72
+ * file extension survives intact through the parser. Both packs'
73
+ * `coverageProvider.gather` should delegate here.
74
+ */
75
+ export declare function gatherJaCoCoCoverageResult(cwd: string): CoverageResult | null;
76
+ //# sourceMappingURL=jacoco.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jacoco.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/jacoco.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,QAAQ,EAA6B,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAmE7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB3D;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAY7E"}