.PHONY: help dev up down migrate seed lint test clean 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}' # ============ Development ============ dev: ## Start all services for development docker compose up -d db redis @echo "⏳ Waiting for services..." @sleep 3 @echo "✅ DB and Redis running" @echo "Run 'make backend' and 'make frontend' in separate terminals" backend: ## Run backend dev server (uv) cd backend && uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 frontend: ## Run frontend dev server cd frontend && pnpm dev worker: ## Run Celery worker (uv) cd backend && uv run celery -A app.worker.celery_config.celery_app worker --loglevel=info beat: ## Run Celery beat scheduler (uv) cd backend && uv run celery -A app.worker.celery_config.celery_app beat --loglevel=info up: ## Start everything with Docker Compose docker compose up -d down: ## Stop all Docker containers docker compose down logs: ## Tail all container logs docker compose logs -f # ============ Database ============ migrate: ## Create a new migration (usage: make migrate msg="add users table") cd backend && uv run alembic revision --autogenerate -m "$(msg)" upgrade: ## Run all pending migrations cd backend && uv run alembic upgrade head downgrade: ## Rollback last migration cd backend && uv run alembic downgrade -1 seed: ## Seed database with sample data cd backend && uv run python -m app.scripts.seed # ============ Quality ============ lint: ## Run linters cd backend && uv run ruff check . && uv run ruff format --check . cd frontend && pnpm lint format: ## Auto-format code cd backend && uv run ruff check --fix . && uv run ruff format . cd frontend && pnpm lint --fix typecheck: ## Run type checking cd backend && uv run mypy app/ cd frontend && pnpm tsc --noEmit test: ## Run all tests cd backend && uv run pytest -v --cov=app cd frontend && pnpm test test-backend: ## Run backend tests only cd backend && uv run pytest -v --cov=app --cov-report=term-missing test-e2e: ## Run end-to-end tests cd frontend && uv run pytest e2e/ --base-url http://localhost:3000 # ============ Setup ============ install: ## Install all dependencies with uv @echo "📦 Installing backend dependencies with uv..." cd backend && uv sync @echo "📦 Installing frontend dependencies with pnpm..." cd frontend && pnpm install @echo "📦 Installing playwright browsers..." cd backend && uv run playwright install chromium @echo "✅ All dependencies installed!" install-dev: ## Install with dev dependencies cd backend && uv sync --all-extras cd frontend && pnpm install setup: ## Full first-time setup @echo "🚀 Setting up JobPortal..." @command -v uv >/dev/null 2>&1 || { echo "Installing uv..."; curl -LsSf https://astral.sh/uv/install.sh | sh; } @command -v pnpm >/dev/null 2>&1 || { echo "Installing pnpm..."; npm install -g pnpm; } cp .env.example .env $(MAKE) install docker compose up -d db redis @sleep 3 $(MAKE) upgrade $(MAKE) seed @echo "" @echo "✅ Setup complete!" @echo " Run 'make dev' to start DB & Redis" @echo " Then 'make backend' and 'make frontend' in separate terminals" @echo "" @echo " Demo login: demo@jobportal.dev / demo123" @echo " Admin login: admin@jobportal.dev / admin123" # ============ uv shortcuts ============ lock: ## Update uv lock file cd backend && uv lock add: ## Add a dependency (usage: make add pkg=fastapi) cd backend && uv add $(pkg) add-dev: ## Add a dev dependency (usage: make add-dev pkg=pytest) cd backend && uv add --dev $(pkg) remove: ## Remove a dependency (usage: make remove pkg=fastapi) cd backend && uv remove $(pkg) # ============ Production ============ build: ## Build production images docker compose -f docker-compose.prod.yml build deploy: ## Deploy to production ./deploy/deploy.sh all deploy-backend: ## Deploy backend only ./deploy/deploy.sh backend deploy-frontend: ## Deploy frontend only ./deploy/deploy.sh frontend # ============ Cleanup ============ clean: ## Remove all generated files and volumes docker compose down -v find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true find . -type d -name .next -exec rm -rf {} + 2>/dev/null || true find . -type d -name node_modules -exec rm -rf {} + 2>/dev/null || true find . -type d -name .venv -exec rm -rf {} + 2>/dev/null || true rm -f backend/uv.lock 2>/dev/null || true