# Development convenience targets. This repo is exempt from the standard # policy scaffold (no CI config, no REPO_POLICIES.md, no application # Dockerfile) except for the lint container: per sneak's 2026-08-09 # ruling, linting runs in docker only, so Dockerfile.lint and script/lint # are part of this repo. This Makefile is otherwise only a thin wrapper # around the Go toolchain and prettier so `make fmt` / `make check` behave # the same as in sneak's other repos. GO_PKGS := ./... MD_FILES := $(shell git ls-files '*.md') PRETTIER := prettier --tab-width 4 --prose-wrap always .PHONY: check fmt fmt-check lint test # Format, lint, and test — the full local pre-commit gate. check: fmt-check lint test # Format Go and Markdown in place. fmt: gofmt -w . $(PRETTIER) --write $(MD_FILES) # Fail if any Go or Markdown file is not formatted. fmt-check: @unformatted="$$(gofmt -l .)"; \ if [ -n "$$unformatted" ]; then \ echo "gofmt needed on:"; echo "$$unformatted"; exit 1; \ fi $(PRETTIER) --check $(MD_FILES) # Run the house linter. golangci-lint is never installed on the host: the # work happens inside the pinned container built by Dockerfile.lint, and # this target is a thin shim over the script that builds it. lint: ./script/lint # Run the test suite. Quiet on success; on failure, rerun verbosely for the # full output and still fail the target (the first run already proved the # tests are broken, so a flaky pass on the rerun must not rescue the build). test: @go test -timeout 30s -race -cover $(GO_PKGS) || \ { echo "--- Rerunning with -v for details ---"; \ go test -timeout 30s -race -v $(GO_PKGS); exit 1; }