EyeCov
Coverage in your editor. Coverage for your AI tools.
EyeCov is built around a shared runtime coverage model. External coverage
artifacts are parsed into normalized per-file records that power both the
editor and MCP tools.
EyeCov reads coverage artifacts (PHPUnit HTML, Cobertura, Clover, LCOV, etc.) and turns them into a runtime coverage model used by:
- the editor
- developer tooling
- AI assistants via MCP
Works in VS Code, Cursor, and Antigravity.
Coverage report CLI
For parser smoke tests and report verification during development:
npm run compile
npm run report -- --path coverage/lcov.info
This CLI is dev-only in v1 and reuses the same parser stack as the extension.
See docs/COVERAGE_REPORT_CLI.md for usage,
flags, exit codes, and verification behavior.
Documentation map
Coverage pipeline
EyeCov turns external coverage artifacts into a normalized runtime model:
coverage artifact
↓ parse
adapter
↓ normalize
coverage record
↓ aggregate / cache
editor + MCP consumers
See docs/COVERAGE_MODEL.md for the canonical model.
Coverage in the editor
Line highlighting (default)
Coverage appears directly in the editor.
- covered lines (when the format supplies it, shaded by test size: small / medium / large)
- uncovered lines
- uncoverable and warning lines

Gutter markers
Enable gutter icons for fast scanning:
- Cmd+Shift+P → EyeCov: Toggle Gutter Coverage, or set
eyecov.showGutterCoverage to true
Track coverage through edits (default on)
When you insert or delete lines, coverage highlighting stays aligned. Turn off with EyeCov: Toggle Track Coverage Through Edits or set eyecov.trackCoverageThroughEdits to false. See docs/COVERAGE_FEATURES.md.
Status bar
The current file coverage is shown in the editor status bar (e.g. 49.0% (25/51)). Click to toggle coverage display.
When background prewarm is enabled, EyeCov also shows a temporary indexing spinner such as $(sync~spin) EyeCov: Indexing (12/240)... while it builds or refreshes the on-disk cache.
Currently supported (resolved in order):
- PHPUnit HTML — default path
coverage-html/
- Cobertura XML — default path
coverage/cobertura-coverage.xml
- Clover XML — default path
coverage/clover.xml
- LCOV — default path
coverage/lcov.info
- Istanbul/NYC JSON — default path
coverage/coverage-final.json
- JaCoCo XML — default paths
target/site/jacoco/jacoco.xml, build/reports/jacoco/test/jacocoTestReport.xml
- Go coverprofile — default path
coverage.out
- coverage.py JSON — default path
coverage.json
- OpenCover XML — supported via config
Example generators:
phpunit --coverage-html coverage-html
phpunit --coverage-cobertura coverage/cobertura-coverage.xml
phpunit --coverage-clover coverage/clover.xml
vitest run --coverage
nyc --reporter=json npm test
go test -coverprofile=coverage.out ./...
coverage json
Use an optional config file to set formats and paths.
AI coverage via MCP
EyeCov exposes coverage through a built-in MCP server. Available tools:
- coverage_file — file-level coverage, uncovered lines
- coverage_line_tests — which tests cover given line(s) (PHPUnit HTML)
- coverage_path — aggregate coverage for a path (optional worstFilesLimit, zeroCoverageFilesLimit, coveredLinesCutoff; can return zeroCoverageFiles)
- coverage_project — project-level coverage (optional same limits; can return zeroCoverageFiles)
- coverage_test_priority — where to add tests first
When the background cache is mid-warm, cache-backed aggregate tools can return cacheState: "partial" instead of pretending the cache is complete.
This lets AI tools answer: Which files need tests most? Which tests cover this line? What has the lowest coverage?
When the extension is installed, EyeCov Built-in MCP Server appears in your editor’s MCP list. Enable it there.
To configure the server manually (e.g. in .cursor/mcp.json):
{
"mcpServers": {
"eyecov": {
"command": "node",
"args": ["/path/to/extension/out/mcp/server.js"]
}
}
}
The extension supplies workspace roots when it runs the server. Optional: add "env": { "EYECOV_WORKSPACE_ROOTS": "/path/to/workspace" } for standalone runs only.
Terminal-style eyecov branding uses this ANSI text logo:
"\033[48;2;0;0;0m\033[38;2;90;12;163m ▮\033[38;2;124;58;237m▮\033[38;2;159;103;255m▮\033[38;2;255;255;255meyecov \033[0m\n"
Configuration file (optional)
Put .eyecov.json or eyecov.json in your workspace root:
{
"formats": [
{ "type": "phpunit-html", "path": "coverage-html" },
{ "type": "cobertura", "path": "coverage/cobertura-coverage.xml" },
{ "type": "clover", "path": "coverage/clover.xml" },
{ "type": "lcov", "path": "coverage/lcov.info" },
{ "type": "istanbul-json", "path": "coverage/coverage-final.json" },
{ "type": "jacoco", "path": "target/site/jacoco/jacoco.xml" },
{
"type": "jacoco",
"path": "build/reports/jacoco/test/jacocoTestReport.xml"
},
{ "type": "go-coverprofile", "path": "coverage.out" },
{ "type": "coveragepy-json", "path": "coverage.json" },
{ "type": "opencover", "path": "TestResults/coverage.xml" }
]
}
Formats are tried in order; the first with coverage for the file is used. Paths are relative to the workspace root.
Extension settings
eyecov.debug — When true, write debug logs to View → Output → EyeCov (including which adapters were detected and which resolved each file). Default: false
eyecov.showCoverageOnOpen — Show coverage when files are opened. Default: true
eyecov.showUncovered — Highlight uncovered lines. Default: true
eyecov.showCovered — Highlight covered lines. Default: true
eyecov.showLineCoverage — Background color on lines. Default: true
eyecov.showGutterCoverage — Gutter icons. Default: true
eyecov.prewarmCoverageCache — Build and reuse .eyecov/coverage-cache.json in the background for faster aggregate MCP queries. Default: true
eyecov.trackCoverageThroughEdits — Keep coverage aligned through simple line insertions/deletions. Default: true
Commands
- EyeCov: Show Coverage — Enable coverage display
- EyeCov: Hide Coverage — Disable coverage display
- EyeCov: Toggle Coverage — Toggle coverage on/off
- EyeCov: Re-read Coverage — Rebuild coverage state and re-apply it to visible editors
- EyeCov: Show Coverage Info — Coverage details for the current file
- EyeCov: Toggle Gutter Coverage — Toggle gutter icons (Cmd+Shift+P)
- EyeCov: Toggle Line Coverage — Toggle line highlighting (Cmd+Shift+P)
Requirements
- VS Code 1.105.0+ or a compatible editor (Cursor, Antigravity)
- Coverage from at least one supported format in the workspace
- Node.js 22+ for building and development (see .nvmrc)
Debugging
- Set
eyecov.debug to true.
- Open View → Output → EyeCov.
- Open a file that has coverage; logs will show adapters detected at startup and, per file, which adapter was tried and which resolved (with artifact path when available).
Installation
From VSIX
npm install
npm run compile
npm run package
# Install the generated .vsix via Extensions → ... → Install from VSIX...
Development
npm install
npm run compile
npm run compile runs ESLint, Prettier check, TypeScript, and the build. Press F5 to launch the Extension Development Host.
Other commands: npm run lint, npm run lint:fix, npm run format, npm run format:check, npm test, npm run test:coverage, npm run test:extension. See CONTRIBUTING.md for the full workflow.
License
MIT