From 47ca509e69b6a1472a735a4b9521a952e7434491 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 31 May 2026 13:07:40 -0500 Subject: feat(go): add coverage-summary as a Go bundle coverage slice Third language in the coverage-summary fan-out, after Elisp and Python. Same kernel: count every source file on disk that's absent from the coverage profile as 0% and weight the project number by file, so an untested file stays visible instead of being averaged away. The script at languages/go/claude/scripts/coverage-summary.go parses a cover.out profile, maps each import-path-qualified entry back to an on-disk relative path using the module path from go.mod, and reports a file-weighted number plus the missing files. It's standard library only, so it runs anywhere via go run, and it doesn't reimplement the per-function table that go tool cover -func already prints. I proved it against a real go test -coverprofile run, not just a synthetic fixture, since the Go toolchain is installed here. Two findings to flag. Modern go test ./... already lists every module package in the profile at 0% even when untested, so for in-module code the missing-file list is usually empty. The detection earns its keep on build-tagged files and dirs outside ./.... And this is a coverage-only slice of a Go bundle that doesn't otherwise exist yet: there's no go.md rule file, so sync-language-bundle.sh can't fingerprint it (detection keys on a bundle's own .claude/rules). The script installs via make install-lang LANG=go but won't be sync-maintained until the Go bundle gets real rules and a CLAUDE.md. Building that out is the natural companion task. Tests are black-box: a Go test in its own throwaway module runs the script via go run against temp fixtures and checks output, so the shipped script dir stays test-free. They cover missing-file detection, all-tracked, _test.go exclusion, and the missing-report error. make test gained a go test discovery path for languages/*/tests, guarded so environments without Go skip it cleanly. --- scripts/tests/install-lang.bats | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'scripts/tests') diff --git a/scripts/tests/install-lang.bats b/scripts/tests/install-lang.bats index a523186..a9f3bfe 100644 --- a/scripts/tests/install-lang.bats +++ b/scripts/tests/install-lang.bats @@ -68,3 +68,15 @@ teardown() { grep -qxF ".claude/" "$PROJECT/.gitignore" grep -qxF "coverage.json" "$PROJECT/.gitignore" } + +@test "install-lang go: coverage-only slice lands without a CLAUDE.md" { + run bash "$INSTALL_LANG" go "$PROJECT" + + [ "$status" -eq 0 ] + [ -f "$PROJECT/.claude/scripts/coverage-summary.go" ] + [ -f "$PROJECT/coverage-makefile.txt" ] + grep -qxF ".claude/" "$PROJECT/.gitignore" + grep -qxF "cover.out" "$PROJECT/.gitignore" + # The slice ships no rules of its own, so there is no Go CLAUDE.md to seed. + [ ! -f "$PROJECT/CLAUDE.md" ] +} -- cgit v1.2.3