# Go coverage — Makefile fragment + setup recommendation # # This file is owned by the project, not the rulesets bundle. The bundle never # edits your Makefile. Copy the two targets below into your own Makefile (and # adjust the variables at the top), then delete this file or keep it as a note. # # What you get: # make coverage runs the suite with a coverage profile and prints # `go tool cover -func`'s own per-function table # make coverage-summary prints a file-weighted project number and every # source file on disk absent from the profile, at 0%. # # Why the summary matters: it weights by file and counts a file absent from the # profile as 0%, so an untested file stays visible instead of being averaged # away. Note that modern `go test ./...` already lists every module package in # the profile (at 0% when untested), so for in-module code the missing-file list # is usually empty; it earns its keep on files outside the test compilation # (build-tagged files, a dir not covered by ./...). The summary does not # reimplement the per-function table — `go tool cover -func` already prints it. # # --------------------------------------------------------------------------- # Prerequisite: none beyond the Go toolchain. `go test -coverprofile` and # `go tool cover` ship with Go; the summary script is pure standard library. # --------------------------------------------------------------------------- # Variables — adjust to your layout. GO ?= go SOURCE_DIR ?= . COVERAGE_FILE ?= cover.out # The summary script ships with the bundle under .claude/scripts/ (gitignored). COVERAGE_SUMMARY ?= .claude/scripts/coverage-summary.go coverage: @$(GO) test ./... -coverprofile=$(COVERAGE_FILE) @$(GO) tool cover -func=$(COVERAGE_FILE) @$(MAKE) coverage-summary coverage-summary: @if [ ! -f $(COVERAGE_FILE) ]; then \ echo "[!] No coverage file at $(COVERAGE_FILE). Run 'make coverage' first."; \ exit 1; \ fi @$(GO) run $(COVERAGE_SUMMARY) $(COVERAGE_FILE) $(SOURCE_DIR) .