#!/usr/bin/env bash # # Everything CI gates on, in one place. # # Two workflows call this: deploy-to-s3.yml runs it before shipping, and ci.yml # runs it on branches and pull requests. Keeping the commands here rather than # inline in both YAML files is the only way those two can't drift into # disagreeing about what "passing" means. # # Runnable locally, from the repo root: bash scripts/ci-checks.sh # set -euo pipefail cd "$(dirname "$0")/.." step() { printf '\n\033[1m=== %s ===\033[0m\n' "$1"; } # ---------------------------------------------------------------- frontend # npm ci, not npm install: it installs the lockfile exactly and fails if # package.json and the lock have drifted apart. frontend/Dockerfile already # builds this way, so CI and the production image resolve identical trees. # # It also wipes node_modules first, which matters here because node_modules is # committed to this repo. CI gets a clean tree regardless of what was checked in. step "frontend — build, 31 route renders, token, theme, inbox" ( cd frontend npm ci --no-audit --no-fund npm run verify ) # ---------------------------------------------------------------- bulk-ats # Scoped to `app` and `tests` on purpose. `ruff check .` over the whole repo # reports 926 errors and `ruff format --check .` would rewrite 126 files: the # backend was written to a different style and reformatting it is not CI's job # to demand. These two directories are the bulk-ats package that CLAUDE.md sets # the standard for, and they are clean today, so they can gate. step "bulk-ats package — lint, format, types, tests" ruff check app tests ruff format --check app tests mypy app pytest tests -q # ---------------------------------------------------------------- backend # The rest of backend/tests passes and gates normally. These two files do not, # on main, independently of any change in this repo: # # test_candidate_forms.py 6 failures # test_employment_agent.py 3 failures # # They are named here rather than silently skipped so the exclusion stays # visible and temporary. Fix them and delete these two lines. step "backend suite — minus two files that fail on main today" pytest backend/tests -q \ --ignore=backend/tests/test_candidate_forms.py \ --ignore=backend/tests/test_employment_agent.py printf '\n\033[1mAll CI checks passed\033[0m\n'