Fucini Coverage Studio Pro
Native VS Code coverage for lcov, llvm-cov JSON, Cobertura, JaCoCo,
Istanbul/nyc and SimpleCov. Gutters, the built-in Test Coverage panel,
per-function CodeLens, branch & MC/DC hover, diff coverage, a composite
safety-weighted score, and self-hosted HTML reports — wired straight into VS
Code's own coverage UI. No separate viewer, no webview report to babysit.
By Mario Fucini — Fucini Consulting
Full documentation: User Guide
· Notice
· License
· Contact
Evaluation release. This is a time-limited evaluation build: it runs free
through 2026-12-31. After that, run Fucini Coverage: Show License /
Activation and request a key — it's issued and applied automatically after
a short evaluation questionnaire (just usage/wishes questions on a
renewal) so we can improve the extension. If that ever fails, send the
request code shown there via the
Contact page
or info@fucini.consulting instead.
Requirements
- VS Code ≥ 1.88 (for the native Test Coverage API).
- A coverage tracefile your project already produces — see Supported
formats below.
Quick start
- Generate a coverage tracefile with your normal test workflow.
- Command Palette →
Fucini Coverage: Load Coverage (or leave
fuciniCoverage.watch.enabled on — the default — and it loads automatically
once a matching file appears).
- Open a covered source file: covered lines get a green gutter with an inline
hit count, uncovered lines get red, and the Test Coverage panel opens in
the sidebar.
| Format |
Typical file |
| LCOV |
lcov.info, *.info |
| llvm-cov JSON |
llvm-cov export --format=json output |
| Cobertura XML |
coverage.xml |
| JaCoCo XML |
jacoco.xml |
| Istanbul / nyc |
coverage-final.json |
| SimpleCov (Ruby) |
.resultset.json, coverage.json (simplecov-json gem) |
Multiple tracefiles are merged deterministically into one run with recorded
provenance, regardless of load order.
Features
Core
- Native gutters, overview ruler, and Test Coverage panel — no custom webview.
- Per-line statement, branch, function, region, MC/DC and C++ instantiation
coverage (whatever the tracefile provides).
- Multi-format ingestion and deterministic merge of several runs.
- Path remapping — CI build-machine paths → your local workspace.
- Diff coverage — decorate only lines changed vs a git base ref.
- Explorer badges (line % per file/folder; colour = the composite score)
and a run-wide status-bar item (
$(dashboard) NN%), hover for a full
metrics table.
- Watch mode — auto-reload when a tracefile changes.
Composite score & compliance
- A single Weighted Harmonic Mean score across lines, branches, functions,
regions, MC/DC and instantiations, with weights aligned to IEC 61508 /
ISO 26262 / DO-178C tiers (
fuciniCoverage.whmWeights.*).
- COMPLIANT / NON-COMPLIANT verdict driven by per-metric thresholds and a
configurable
fuciniCoverage.compliance.mode (strict, whm, both,
either).
Excluding non-code lines
- Comment-only and blank lines are auto-excluded from totals (handles a known
llvm-cov/gcov quirk where a stray hit count lands on a comment).
- Honors
LCOV_EXCL_LINE / LCOV_EXCL_START / LCOV_EXCL_STOP markers.
In-editor analysis
- Function CodeLens — per-function coverage %, click to jump to its first
uncovered line.
- Branch & MC/DC hover — per-arm taken/not-taken counts and per-decision
condition/vector breakdowns; optional coloured MC/DC margin gutter.
- Dead-code warnings — Problems-panel warning for functions with measurable
lines and zero coverage.
- Next/Previous Uncovered navigation commands.
- Per-file status bar — the active editor's own coverage percentage.
Finding what to test next
- Show Worst-Covered Files / Functions — Quick Pick ranked
lowest-first.
- Copy Uncovered Lines — Markdown summary of every gap, ready to paste into
a PR description.
History & reporting
- Optional local run history with a coverage trend (▲/▼) in the status
bar, plus Compare Two History Runs and Compare with Last Run.
- Generate Full HTML Report — a self-rendered, multi-page, per-directory
report; Open HTML Report / Open Annotated Source for a single file.
- Export Fucini JSON — the full normalised model.
- Stale-coverage warning when a source file changed after its run.
Commands
Command Palette (Ctrl+Shift+P) → type Fucini Coverage:
| Command |
What it does |
| Load Coverage |
Discover & load coverage for the workspace. |
| Pick Coverage File |
Manually choose a tracefile. |
| Show Loaded Coverage Files |
List the tracefiles in the active run. |
| Toggle Watch |
Turn auto-reload on/off. |
| Next / Previous Uncovered |
Jump between uncovered regions. |
| Open HTML Report |
Open the rendered static report. |
| Generate Full HTML Report |
Build the multi-page report. |
| Open Annotated Source / …to the Side |
Annotated coverage view for a file. |
| Toggle Annotated Source |
Swap between source and annotated view. |
| Show Worst-Covered Files / Functions |
Ranked lowest-first Quick Pick. |
| Copy Uncovered Lines |
Markdown summary of every uncovered range. |
| Compare Two History Runs / Compare with Last Run |
Per-file regression diff. |
| Check Coverage Thresholds |
Evaluate the compliance gates. |
| Export Fucini JSON |
Export the current run as Fucini JSON. |
| Show Status Bar Menu |
Open the quick-action menu. |
CodeLens, branch/MC-DC hover, dead-code warnings, badges and the status-bar
items all work automatically once coverage is loaded.
Settings
Configure in the Settings UI (search Fucini Coverage) or settings.json.
Every option, with its default:
Discovery & loading
| Setting |
Default |
What it does |
fuciniCoverage.coverageFile.defaultLocation |
"" |
Base folder for discovery and file-pick dialogs (${workspaceFolder} supported). |
fuciniCoverage.coverageFile.paths |
[] |
Tracefile(s) to load & merge, relative to the base folder. * globs recurse. |
fuciniCoverage.watch.enabled |
true |
Reload coverage when a tracefile changes. |
Colour scale & badges
| Setting |
Default |
What it does |
fuciniCoverage.colorScale.lowColor |
#8b1a1a |
Low end of the coverage gradient. |
fuciniCoverage.colorScale.midColor |
#b8860b |
Pivot colour of the gradient. |
fuciniCoverage.colorScale.highColor |
#228b22 |
High end (100%) of the gradient. |
fuciniCoverage.colorScale.lowThreshold |
80 |
% at which the badge steps low → mid. |
fuciniCoverage.colorScale.highThreshold |
90 |
% at which the badge steps mid → high (and gradient pivot). |
Composite score (Weighted Harmonic Mean)
| Setting |
Default |
What it does |
fuciniCoverage.whmWeights.lines |
1 |
Weight for line/statement coverage. |
fuciniCoverage.whmWeights.functions |
1 |
Weight for function coverage. |
fuciniCoverage.whmWeights.regions |
1.5 |
Weight for region coverage (llvm-cov). |
fuciniCoverage.whmWeights.branches |
2 |
Weight for branch coverage. |
fuciniCoverage.whmWeights.mcdc |
4 |
Weight for MC/DC coverage. |
fuciniCoverage.whmWeights.instantiations |
0.5 |
Weight for C++ template instantiations (llvm-cov). |
Thresholds & compliance
| Setting |
Default |
What it does |
fuciniCoverage.threshold.statement |
100 |
Minimum statement %. 0 disables the gate. |
fuciniCoverage.threshold.branch |
100 |
Minimum branch %. |
fuciniCoverage.threshold.mcdc |
100 |
Minimum MC/DC %. |
fuciniCoverage.threshold.functions |
100 |
Minimum function %. |
fuciniCoverage.threshold.regions |
100 |
Minimum region % (llvm-cov). |
fuciniCoverage.threshold.instantiations |
100 |
Minimum instantiation % (llvm-cov). |
fuciniCoverage.threshold.weighted |
100 |
Minimum composite score. |
fuciniCoverage.compliance.mode |
strict |
strict | whm | both | either. |
Diff, remap & reports
| Setting |
Default |
What it does |
fuciniCoverage.pathRemap |
[] |
Ordered {from,to} path rewrites. |
fuciniCoverage.gitDiff.enabled |
false |
Restrict coverage to lines changed vs a base ref. |
fuciniCoverage.gitDiff.baseRef |
origin/master |
Git base ref for diff coverage. |
fuciniCoverage.externalHtmlReport.dir |
"" |
Read a pre-built llvm-cov show HTML dir for Annotated Source. |
fuciniCoverage.htmlReport.outputDir |
"" |
Output dir for Generate Full HTML Report. |
Display & analysis
| Setting |
Default |
What it does |
fuciniCoverage.mcdcGutter.enabled |
false |
Coloured MC/DC margin gutter. |
fuciniCoverage.statusBar.enabled |
true |
Show run-wide & per-file status-bar items. |
fuciniCoverage.statusBar.showLauncher |
true |
Always-available quick-menu launcher. |
fuciniCoverage.codeLens.enabled |
true |
Per-function coverage CodeLens. |
fuciniCoverage.deadCode.enabled |
true |
Warn on zero-coverage functions. |
fuciniCoverage.staleWarning.enabled |
true |
Warn when a file changed after its run. |
fuciniCoverage.excludeComments |
true |
Exclude comment/blank & LCOV_EXCL_* lines. |
fuciniCoverage.excluded.includeInTotals |
false |
Count excluded lines toward totals. |
History
| Setting |
Default |
What it does |
fuciniCoverage.history.enabled |
false |
Store runs locally for trend & comparison. |
fuciniCoverage.history.retention |
20 |
Max stored runs to keep. |
Status-bar quick actions
All default false; enable to add the matching action to the quick menu:
quickActions.compareWithLastRun, openAnnotatedSource,
openAnnotatedSourceToSide, toggleAnnotatedSource, toggleWatch,
worstCoveredFiles, worstCoveredFunctions, nextUncovered,
previousUncovered, checkThresholds, copyUncoveredLines,
compareHistoryRuns, exportJson.
Telemetry
| Setting |
Default |
What it does |
fuciniCoverage.telemetry.enabled |
true |
Anonymous usage telemetry, on by default for the evaluation trial — turn off at any time. Also gated by VS Code's own telemetry.telemetryLevel. |
Updates
| Setting |
Default |
What it does |
fuciniCoverage.update.checkForUpdates |
true |
Periodically check both fucini.software and the VS Code Marketplace for a newer release, and offer to install whichever is newer. |
Licensing
| Setting |
Default |
What it does |
fuciniCoverage.license.key |
"" |
Activation key for the evaluation pre-release. Paste the FCK1.… key you receive (see the evaluation note at the top). Bound to this machine/user. |
See the User Guide
for worked examples, path-remapping recipes, CI/CMake integration, and the
full FUCINI_* error-code reference.
Privacy
Telemetry is controlled by the telemetry.enabled setting above. It defaults
on for the evaluation trial and can be turned off at any time. See
its package.json description and
NOTICE.
Questions, bug reports, or alternate licensing terms — contact Fucini
Consulting via the
contact page
or by email at info@fucini.consulting.
License
MIT with an attribution-in-release-notes condition — see
LICENSE
and NOTICE.