#!/usr/bin/env bash # The single pre-merge gate for wiggleverse-ecomm (SD-0001 ยง6.8). Runs, in order: # 1. the import-linter layering contract (main > domains > platform) # 2. the backend test suite (pytest, against Postgres) # 3. the frontend typecheck + production build # CI (.gitea/workflows/ci.yml) calls this exact script, so local and server gates # cannot drift. Exits non-zero on the first failure. # # Requires a reachable Postgres for the backend tests: locally the compose service # (scripts/dev.sh brings it up); in CI a Postgres service container. Override its # admin DSN with ECOMM_TEST_ADMIN_URL. set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # Pick an interpreter: explicit $PYTHON (CI), else the repo venv, else PATH. if [ -n "${PYTHON:-}" ]; then PY="$PYTHON" elif [ -x "$repo_root/.venv/bin/python" ]; then PY="$repo_root/.venv/bin/python" else PY="$(command -v python3 || command -v python)" fi lint="$(dirname "$PY")/lint-imports" [ -x "$lint" ] || lint="lint-imports" echo "==> import boundaries (lint-imports)" ( cd "$repo_root/backend" && "$lint" ) echo "==> backend tests (pytest)" ( cd "$repo_root/backend" && "$PY" -m pytest -q ) echo "==> frontend typecheck + build" ( cd "$repo_root/frontend" && npm run build ) echo "==> frontend unit tests (vitest)" ( cd "$repo_root/frontend" && npm test ) echo "==> all gates green"