.PHONY: dev daemon build test migrate-up migrate-down sqlc seed clean setup start stop check worktree-env setup-main start-main stop-main check-main setup-worktree start-worktree stop-worktree check-worktree MAIN_ENV_FILE ?= .env WORKTREE_ENV_FILE ?= .env.worktree ENV_FILE ?= $(if $(wildcard $(MAIN_ENV_FILE)),$(MAIN_ENV_FILE),$(if $(wildcard $(WORKTREE_ENV_FILE)),$(WORKTREE_ENV_FILE),$(MAIN_ENV_FILE))) ifneq ($(wildcard $(ENV_FILE)),) include $(ENV_FILE) endif POSTGRES_DB ?= multica POSTGRES_USER ?= multica POSTGRES_PASSWORD ?= multica POSTGRES_PORT ?= 5432 PORT ?= 8080 FRONTEND_PORT ?= 3000 FRONTEND_ORIGIN ?= http://localhost:$(FRONTEND_PORT) DATABASE_URL ?= postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable NEXT_PUBLIC_API_URL ?= http://localhost:$(PORT) NEXT_PUBLIC_WS_URL ?= ws://localhost:$(PORT)/ws GOOGLE_REDIRECT_URI ?= $(FRONTEND_ORIGIN)/auth/callback MULTICA_SERVER_URL ?= ws://localhost:$(PORT)/ws COMPOSE_PROJECT_NAME ?= super_multica export COMPOSE := docker compose --env-file $(ENV_FILE) # ---------- One-click commands ---------- # First-time setup: install deps, start DB, run migrations, seed data setup: @echo "==> Using env file: $(ENV_FILE)" @echo "==> Installing dependencies..." pnpm install @echo "==> Starting PostgreSQL..." @if pg_isready -h localhost -p $(POSTGRES_PORT) -U $(POSTGRES_USER) -d $(POSTGRES_DB) > /dev/null 2>&1; then \ echo " PostgreSQL already running, skipping docker compose up."; \ else \ $(COMPOSE) up -d; \ echo "==> Waiting for PostgreSQL to be ready..."; \ until $(COMPOSE) exec -T postgres pg_isready -U $(POSTGRES_USER) -d $(POSTGRES_DB) > /dev/null 2>&1; do \ sleep 1; \ done; \ fi @echo "==> Running migrations..." cd server && go run ./cmd/migrate up @echo "==> Seeding data..." cd server && go run ./cmd/seed @echo "" @echo "✓ Setup complete! Run 'make start' to launch the app." # Start all services (backend + frontend) start: @echo "Using env file: $(ENV_FILE)" @echo "Backend: http://localhost:$(PORT)" @echo "Frontend: http://localhost:$(FRONTEND_PORT)" @if pg_isready -h localhost -p $(POSTGRES_PORT) -U $(POSTGRES_USER) -d $(POSTGRES_DB) > /dev/null 2>&1; then \ echo "PostgreSQL already running, skipping docker compose up."; \ else \ $(COMPOSE) up -d; \ until $(COMPOSE) exec -T postgres pg_isready -U $(POSTGRES_USER) -d $(POSTGRES_DB) > /dev/null 2>&1; do \ sleep 1; \ done; \ fi @echo "Starting backend and frontend..." @trap 'kill 0' EXIT; \ (cd server && go run ./cmd/server) & \ pnpm dev:web & \ wait # Stop all services stop: @echo "Stopping services..." @-lsof -ti:$(PORT) | xargs kill -9 2>/dev/null @-lsof -ti:$(FRONTEND_PORT) | xargs kill -9 2>/dev/null $(COMPOSE) down @echo "✓ All services stopped." # Full verification: typecheck + unit tests + Go tests + E2E check: @bash scripts/check.sh worktree-env: @bash scripts/init-worktree-env.sh .env.worktree setup-main: @$(MAKE) setup ENV_FILE=$(MAIN_ENV_FILE) start-main: @$(MAKE) start ENV_FILE=$(MAIN_ENV_FILE) stop-main: @$(MAKE) stop ENV_FILE=$(MAIN_ENV_FILE) check-main: @ENV_FILE=$(MAIN_ENV_FILE) bash scripts/check.sh setup-worktree: @$(MAKE) setup ENV_FILE=$(WORKTREE_ENV_FILE) start-worktree: @$(MAKE) start ENV_FILE=$(WORKTREE_ENV_FILE) stop-worktree: @$(MAKE) stop ENV_FILE=$(WORKTREE_ENV_FILE) check-worktree: @ENV_FILE=$(WORKTREE_ENV_FILE) bash scripts/check.sh # ---------- Individual commands ---------- # Go server dev: cd server && go run ./cmd/server daemon: cd server && go run ./cmd/daemon build: cd server && go build -o bin/server ./cmd/server cd server && go build -o bin/daemon ./cmd/daemon test: cd server && go test ./... # Database migrate-up: cd server && go run ./cmd/migrate up migrate-down: cd server && go run ./cmd/migrate down sqlc: cd server && sqlc generate seed: cd server && go run ./cmd/seed # Cleanup clean: rm -rf server/bin server/tmp