feat: extract coverage-gate action from Cue for reuse across projects
- Move coveragegate tool from cue/tools to vociferate/coverage-gate - Create composite action with JSON metrics output for CI - Update tool to export passes/total_coverage/packages_checked/packages_failed - Support per-package threshold policy via JSON configuration - Change module path to git.hrafn.xyz/aether/vociferate/coverage-gate
This commit is contained in:
85
coverage-gate/README.md
Normal file
85
coverage-gate/README.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# coveragegate
|
||||
|
||||
Standalone coverage-threshold enforcement tool for this repository.
|
||||
|
||||
This tool is a quality gate. It is not part of Cue runtime orchestration.
|
||||
|
||||
## What it does
|
||||
|
||||
- Reads a Go coverage profile (for example `_build/coverage.out`).
|
||||
- Loads package coverage policy from JSON.
|
||||
- Discovers packages under a source root using `go list ./...`.
|
||||
- Evaluates per-package statement coverage against policy thresholds.
|
||||
- Prints a package table and returns a non-zero exit code when any package fails.
|
||||
|
||||
## Repository integration
|
||||
|
||||
Primary repository flow:
|
||||
|
||||
1. `just test-coverage` runs tests in `src/` and writes `_build/coverage.out`.
|
||||
2. `scripts/check-core-coverage.sh` runs this tool from `tools/coveragegate/`.
|
||||
3. The script currently passes:
|
||||
- `--profile $ROOT_DIR/_build/coverage.out`
|
||||
- `--policy $ROOT_DIR/docs/coverage-thresholds.json`
|
||||
- `--src-root $ROOT_DIR/src`
|
||||
|
||||
## Usage
|
||||
|
||||
From repository root:
|
||||
|
||||
```bash
|
||||
cd tools/coveragegate
|
||||
go run . \
|
||||
--profile ../../_build/coverage.out \
|
||||
--policy ../../docs/coverage-thresholds.json \
|
||||
--src-root ../../src
|
||||
```
|
||||
|
||||
Or use the repository wrapper:
|
||||
|
||||
```bash
|
||||
bash scripts/check-core-coverage.sh
|
||||
```
|
||||
|
||||
## Flags
|
||||
|
||||
- `--profile`: Path to Go coverage profile.
|
||||
- `--policy`: Path to JSON policy file.
|
||||
- `--src-root`: Directory where packages are discovered with `go list ./...`.
|
||||
|
||||
## Exit codes
|
||||
|
||||
- `0`: All in-scope packages meet threshold.
|
||||
- `1`: Policy/profile/load failure or one or more packages below threshold.
|
||||
- `2`: Invalid CLI arguments.
|
||||
|
||||
## Policy model (current)
|
||||
|
||||
The tool expects a JSON object with at least:
|
||||
|
||||
- `minimum_statement_coverage` (number)
|
||||
- `critical_packages` (array)
|
||||
|
||||
Each critical package may include:
|
||||
|
||||
- `package` (string)
|
||||
- `minimum_statement_coverage` (number)
|
||||
- `include` (boolean)
|
||||
- `exclusions` (array of strings)
|
||||
|
||||
Behavior notes:
|
||||
|
||||
- If a package has no policy override, the global minimum is used.
|
||||
- Generated/composition files are excluded by built-in rules.
|
||||
- Packages with no statements are treated as passing.
|
||||
|
||||
## Development
|
||||
|
||||
Run tests:
|
||||
|
||||
```bash
|
||||
cd tools/coveragegate
|
||||
go test ./...
|
||||
```
|
||||
|
||||
Keep code `gofmt` and `go vet` clean.
|
||||
Reference in New Issue
Block a user