# Colectivo — task runner # Requires: just, docker, pnpm set dotenv-load := true # Alias: docker compose with correct project root so .env is always found dc_dev := "docker compose --env-file .env -f infra/docker-compose.dev.yml" dc_prod := "docker compose --env-file .env -f infra/docker-compose.prod.yml" # ── Setup ───────────────────────────────────────────────────────────────────── # First-time (and idempotent) local environment setup setup: bash setup.sh # ── Dev ─────────────────────────────────────────────────────────────────────── # Start full local stack (Docker services + SvelteKit dev server) dev: {{dc_dev}} up -d pnpm --filter @colectivo/web dev # Stop all services (Docker stack + SvelteKit dev server) stop: {{dc_dev}} down -pkill -f "vite" 2>/dev/null || true # Stop local Docker stack dev-stop: {{dc_dev}} down # Stop and remove all volumes (full reset) dev-clean: {{dc_dev}} down -v # ── Database ────────────────────────────────────────────────────────────────── # Drop, migrate, and seed the dev database db-reset: supabase db reset # Apply pending migrations db-migrate: supabase db push # Apply dev seed data db-seed: docker exec -i colectivo-dev-db-1 psql -U postgres < supabase/seed.sql # Regenerate TypeScript types from Supabase schema db-types: supabase gen types typescript --local > packages/types/src/database.ts echo "Types written to packages/types/src/database.ts" # Open Supabase Studio db-open: open http://localhost:54323 # ── Keycloak ────────────────────────────────────────────────────────────────── # Export Keycloak realm to keycloak/realm-export.json kc-export: {{dc_dev}} exec keycloak \ /opt/keycloak/bin/kc.sh export \ --realm colectivo \ --users realm_file \ --file /tmp/realm-export.json {{dc_dev}} cp keycloak:/tmp/realm-export.json keycloak/realm-export.json echo "Exported to keycloak/realm-export.json" # Open Keycloak Admin Console kc-open: open http://localhost:8080/admin # ── Build ───────────────────────────────────────────────────────────────────── # Build all packages build: pnpm turbo run build # Run the production build locally against the dev Docker stack (port 3000) serve: build {{dc_dev}} up -d PORT=3000 node apps/web/build/index.js # Type-check all packages check: pnpm turbo run check # Lint all packages lint: pnpm turbo run lint # Run tests test: pnpm turbo run test # ── Testing ─────────────────────────────────────────────────────────────────── # Run every test suite (pgTAP + Vitest integration + Playwright E2E). # Requires `just dev` to already be running — the stack must be healthy. test-all: test-db test-integration test-e2e # Run pgTAP SQL tests directly against the dev database # `set dotenv-load` at the top of this file sources .env so POSTGRES_PASSWORD # is available — we forward it to psql via PGPASSWORD. test-db: #!/usr/bin/env bash set -euo pipefail for f in supabase/tests/*.sql; do PGPASSWORD="$POSTGRES_PASSWORD" psql -U postgres -h localhost -d postgres \ -v ON_ERROR_STOP=1 -f "$f" done # Run Vitest integration tests (RLS + trigger assertions via supabase-js) test-integration: pnpm --filter @colectivo/test-utils test # Run Playwright E2E tests (headless) test-e2e: pnpm --filter @colectivo/web exec playwright test # Run Playwright E2E tests in headed mode (for debugging) test-e2e-headed: pnpm --filter @colectivo/web exec playwright test --headed # ── Backup & Restore ────────────────────────────────────────────────────────── # Take a manual backup of a service (e.g. just backup supabase) backup service: infra/scripts/backup.sh {{service}} # Restore a backup file (e.g. just restore supabase backups/2024-01-01.dump) restore service file: infra/scripts/restore.sh {{service}} {{file}} # ── Production ──────────────────────────────────────────────────────────────── # Deploy to production via SSH deploy: infra/scripts/deploy.sh # Stream production Docker logs logs: {{dc_prod}} logs -f