.PHONY: train test lint data-gen export format type-check install dev clean help PYTHON ?= python PYTEST ?= pytest RUFF ?= ruff MYPY ?= mypy help: ## Show this help @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' install: ## Install core dependencies pip install -e . dev: ## Install all dependencies including dev tools pip install -e ".[train,dev]" pre-commit install pre-commit install --hook-type commit-msg train: ## Run training (pass CONFIG=path/to/config.yaml) $(PYTHON) -m solver.training.train $(if $(CONFIG),--config-path $(CONFIG)) test: ## Run test suite $(PYTEST) tests/ freecad/tests/ -v --tb=short lint: ## Run ruff linter $(RUFF) check solver/ freecad/ tests/ scripts/ format: ## Format code with ruff $(RUFF) format solver/ freecad/ tests/ scripts/ $(RUFF) check --fix solver/ freecad/ tests/ scripts/ type-check: ## Run mypy type checker $(MYPY) solver/ freecad/ data-gen: ## Generate synthetic dataset (pass CONFIG=path/to/config.yaml) $(PYTHON) scripts/generate_synthetic.py $(if $(CONFIG),--config-path $(CONFIG)) export: ## Export trained model for deployment $(PYTHON) export/package_model.py $(if $(MODEL),--model $(MODEL)) clean: ## Remove build artifacts and caches rm -rf build/ dist/ *.egg-info/ rm -rf .mypy_cache/ .pytest_cache/ .ruff_cache/ find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true find . -type f -name "*.pyc" -delete 2>/dev/null || true check: lint type-check test ## Run all checks (lint, type-check, test)