.PHONY: test lint fmt fmt-check check build dev clean docker hooks

# Use `timeout` (GNU coreutils) when available so `make test` is hard-capped.
# On macOS without coreutils this is empty and the cap is skipped.
TIMEOUT := $(shell command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null)

YARN := yarn run

test:
	@$(TIMEOUT) $(if $(TIMEOUT),30s,) $(YARN) vitest run --reporter=dot || \
		{ echo "--- Rerunning with verbose for details ---"; \
		  $(YARN) vitest run --reporter=verbose; exit 1; }

lint:
	@$(YARN) eslint .
	@$(YARN) prettier --check .

fmt:
	@$(YARN) prettier --write .

fmt-check:
	@$(YARN) prettier --check .

check: test lint fmt-check

build:
	@$(YARN) tsc

dev:
	@$(YARN) tsc --watch

clean:
	@rm -rf dist coverage .vitest-cache *.tsbuildinfo

docker:
	docker build -t quak .

hooks:
	@printf '#!/bin/sh\nset -e\nmake lint\nmake fmt-check\n' > .git/hooks/pre-commit
	@chmod +x .git/hooks/pre-commit
	@echo "Installed pre-commit hook (runs make lint && make fmt-check)."
	@echo "Note: tests are deliberately not in the pre-commit hook so the"
	@echo "TDD red-phase commit (failing tests, no implementation yet)"
	@echo "can land. CI runs make check via docker build, which catches"
	@echo "any branch that ships red."
