Lands L1 of the agent-first coverage architecture (ADR-020) — the
cover-the-diff gate. Reads a merged lcov + git diff against a base
ref, asserts every changed *executable* line was exercised.
Script: scripts/coverage/diff.mjs (zero-dep Node ESM)
- parseLcov: SF -> Map<line, count>; only DA records read
- parseGitDiff: parses --unified=0 output into Map<file, Set<line>>
- computeDiffCoverage: cross-references both, emits result tree
- Allowlist of paths that don't gate (tests, configs, docs, .sh,
DI bootstrap, interfaces, CMS, factories, contracts, UI)
- Path matching handles three lcov path conventions: absolute,
repo-relative, and per-package relative
- CLI flags: --base (default origin/main), --lcov (default
coverage/lcov.info), --json (suppress stderr summary)
- stdout: machine-readable JSON for the dispatch loop
- stderr: human summary
- Exit 0 on pass, 1 on fail or error
Test surface: scripts/coverage/diff.test.mjs (14 tests, all green)
- Fixtures at scripts/coverage/__fixtures__/{sample.lcov,sample-diff.patch}
- Covers: lcov parsing, diff parsing, pass path, uncovered lines,
non-executable line skipping, no-coverage-data detection,
allowlist filtering, end-to-end mixed case, path matching
Wired:
- root package.json adds "coverage:diff" script
- .gitignore anchored so per-package coverage/ stays ignored but
scripts/coverage/ stays tracked
Smoke-tested end-to-end against packages/auth/coverage/lcov.info —
correctly skips shell scripts + manifest files (via allowlist + path
suffix match), correctly flags files not present in the per-package
lcov (which is expected; full repo coverage needs the L2 aggregate
that the next story lands).
CI integration deferred to the L2 aggregate story (the merged
coverage/lcov.info this script reads doesn't exist yet — pnpm
coverage:aggregate produces it).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
738 B
Plaintext
52 lines
738 B
Plaintext
# Dependencies
|
|
node_modules
|
|
|
|
# Turbo
|
|
.turbo
|
|
|
|
# Build outputs
|
|
dist
|
|
build
|
|
.next
|
|
out
|
|
storybook-static
|
|
|
|
# Environment
|
|
.env
|
|
.env.local
|
|
.env.*.local
|
|
|
|
# Per-user local overrides (never commit — .claude/settings.local.json, etc.)
|
|
*.local
|
|
*.local.*
|
|
**/settings.local.json
|
|
|
|
# Testing — per-package and aggregated coverage output (vitest + coverage:aggregate)
|
|
/coverage/
|
|
packages/*/coverage/
|
|
apps/*/coverage/
|
|
# But keep the source scripts at scripts/coverage/ tracked
|
|
!/scripts/coverage/
|
|
|
|
# OS
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# IDE
|
|
.vscode
|
|
.idea
|
|
*.swp
|
|
|
|
# Debug
|
|
npm-debug.log*
|
|
pnpm-debug.log*
|
|
|
|
# Superpowers brainstorm sessions
|
|
.superpowers/
|
|
|
|
# Git worktrees
|
|
.worktrees/
|
|
|
|
# Template setup history — preserved locally, invisible to fresh clones.
|
|
.archive/
|