| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Shortlist β Development & Deployment Commands | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Usage: make <target> | |
| # Run `make help` to see all available commands. | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| .PHONY: help dev dev-backend dev-frontend test lint clean migrate | |
| # ββ Defaults ββ | |
| PYTHON := python | |
| PIP := pip | |
| NPM := npm | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Help | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| help: ## Show this help message | |
| @echo "Shortlist β Available Commands:" | |
| @echo "" | |
| @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \ | |
| awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Development | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| dev: ## Start both backend and frontend in development mode | |
| @echo "Starting Shortlist development servers..." | |
| $(MAKE) -j2 dev-backend dev-frontend | |
| dev-backend: ## Start backend development server | |
| cd backend && $(PYTHON) -m uvicorn app.main:app --reload --port 8000 | |
| dev-frontend: ## Start frontend development server | |
| cd frontend && $(NPM) run dev | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Testing | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| test: ## Run all backend tests | |
| cd backend && $(PYTHON) -m pytest tests/ -v --tb=short | |
| test-cov: ## Run tests with coverage report | |
| cd backend && $(PYTHON) -m pytest tests/ -v --cov=app --cov-report=html --cov-report=term | |
| test-fast: ## Run tests quickly (no verbose) | |
| cd backend && $(PYTHON) -m pytest tests/ -q | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Linting & Type Checking | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| lint: ## Run linters on backend code | |
| cd backend && flake8 app/ --max-line-length=120 --statistics | |
| cd backend && pylint app/ --errors-only --disable=E0401 | |
| lint-frontend: ## Run frontend linter | |
| cd frontend && $(NPM) run lint | |
| typecheck: ## Run TypeScript type checking | |
| cd frontend && npx tsc --noEmit | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Database | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| migrate: ## Apply all database migrations | |
| cd backend && $(PYTHON) apply_migration.py | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Utilities | |
| # ββββββββββββββββββββββββββββββββββββββββββββββ | |
| clean: ## Remove build artifacts, caches, and temp files | |
| find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true | |
| find . -type d -name .pytest_cache -exec rm -rf {} + 2>/dev/null || true | |
| find . -type d -name node_modules -prune -exec rm -rf {} + 2>/dev/null || true | |
| find . -type d -name .next -exec rm -rf {} + 2>/dev/null || true | |
| rm -rf backend/htmlcov backend/coverage.xml | |
| health: ## Check backend health | |
| curl -s http://localhost:8000/health | python -m json.tool | |
| health-deep: ## Deep health check (DB + LLM) | |
| curl -s http://localhost:8000/health/deep | python -m json.tool | |
| metrics: ## View application metrics | |
| curl -s http://localhost:8000/metrics | python -m json.tool | |
| secret: ## Generate a production SECRET_KEY | |
| @$(PYTHON) -c "import secrets; print(secrets.token_urlsafe(64))" | |