COVERAGE_DIR := coverage .PHONY: help fmt fmt-check vet lint test test-race test-coverage check clean help: ## Show available targets @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-15s %s\n", $$1, $$2}' $(MAKEFILE_LIST) fmt: ## Format Go source files gofmt -w . fmt-check: ## Check Go source formatting @test -z "$$(gofmt -l .)" vet: ## Run Go static analysis go vet ./... lint: ## Run golangci-lint golangci-lint run test: ## Run tests go test ./... -count=1 test-race: ## Run tests with the race detector go test -race ./... -count=1 test-coverage: ## Generate an HTML coverage report mkdir -p $(COVERAGE_DIR) go test ./... -count=1 -coverprofile=$(COVERAGE_DIR)/cover.out go tool cover -html=$(COVERAGE_DIR)/cover.out -o $(COVERAGE_DIR)/cover.html check: fmt-check vet test test-race lint ## Run all validation checks clean: ## Remove generated coverage files rm -rf $(COVERAGE_DIR)