Adds the day-to-day cookbook for the 4-layer coverage architecture
(ADR-020) and threads it into the discovery path:
docs/guides/coverage.md (new):
- 4 layers at a glance + when each fires
- Single-source-of-truth pattern (feature.manifest.ts coverage:
section) and the three readers (vitest, assertFeatureConformance,
coverage:diff)
- Daily workflow: pnpm test --coverage -> aggregate -> diff
- How to read a failure (stderr human + stdout JSON examples)
- How to fix uncovered slices (TDD walkthrough)
- The full allowlist (test files, configs, docs, scripts, dev
tooling, per-feature excludes)
- Adjusting bands (manifest-first, when to override vitest)
- CI behavior (two workflows: validate + coverage-snapshot)
- Reading the committed trend via git log -- coverage/summary.json
- Mutation testing primer (L3, opt-in, scope, lands in next story)
- Troubleshooting
CLAUDE.md Read First gets the new guide pinned between audit and
template-tiers, with the L0-L3 layer summary inline so agents see the
shape at a glance.
Feature generator updates (turbo/generators/templates/feature/):
- feature.manifest.ts.hbs: new `coverage:` block at <gen:coverage>
anchor scaffolded with the documented defaults + mutationTargets
- vitest.config.ts.hbs: now uses vitestThresholdsFromBands(
DEFAULT_COVERAGE_BANDS) instead of the duplicated literal — new
features ship conformance-compliant by default
Next features generated via `pnpm turbo gen feature` are coverage-
aware from the first commit: bands declared in manifest, vitest
config consumes the helper, no duplication to drift.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.2 KiB
Handlebars
33 lines
1.2 KiB
Handlebars
import path from "node:path";
|
|
import { mergeConfig } from "vitest/config";
|
|
import { nodeVitestConfig } from "@repo/core-typescript/vitest.base.node";
|
|
import {
|
|
DEFAULT_COVERAGE_BANDS,
|
|
vitestThresholdsFromBands,
|
|
} from "@repo/core-shared/conformance/coverage";
|
|
|
|
// Coverage thresholds derived from DEFAULT_COVERAGE_BANDS via the shared
|
|
// helper (ADR-020). The feature.manifest.ts `coverage.bands` section
|
|
// declares these for boot-time `assertFeatureConformance`. Edit the
|
|
// manifest when adjusting per-feature bands.
|
|
export default mergeConfig(nodeVitestConfig, {
|
|
test: {
|
|
coverage: {
|
|
exclude: [
|
|
// DI bootstrap — wires InversifyJS at app startup; not unit-testable
|
|
"src/di/bind-production.ts",
|
|
// Pure TypeScript interface files — not executable
|
|
"src/application/repositories/**",
|
|
// Payload CMS templates — declarative data, tested via integration
|
|
"src/integrations/cms/**",
|
|
// React Query option builders — integration-tested in apps
|
|
"src/ui/**",
|
|
],
|
|
thresholds: vitestThresholdsFromBands(DEFAULT_COVERAGE_BANDS),
|
|
},
|
|
},
|
|
resolve: {
|
|
alias: { "@": path.resolve(__dirname, "./src") },
|
|
},
|
|
});
|