Continuous integration ====================== Each product repo has its own GitHub Actions workflow on ``push`` / ``pull_request`` to ``main``. **agency-workspace** has no workflow — it records compatible submodule SHAs. Overview -------- .. list-table:: :header-rows: 1 :widths: 22 18 60 * - Repository - Workflow - Jobs * - ``agency-django`` - ``.github/workflows/tests.yml`` - ``pytest``: collect-only sanity → full suite + ``--cov-fail-under=35`` * - ``agency-ui`` - ``.github/workflows/tests.yml`` - ``vitest`` + ``typecheck`` + ``build`` (all required) * - ``agency-server`` - — - Docs built locally via ``./run document``; Compose smoke is manual / todo Backend job (agency-django) --------------------------- 1. ``actions/checkout@v4`` — single repo only 2. Python 3.11, ``pip install -e ".[dev]"`` 3. ``pytest --collect-only -q`` 4. ``pytest -v --cov=agency --cov-report=term-missing --cov-fail-under=35`` No Docker, Ollama, or Tavily in CI. Channels tests use in-memory layer. Standalone pytest wires an in-memory Celery app via ``tests/celery_app.py`` so ``.delay()`` does not require Redis. Frontend job (agency-ui) ------------------------ 1. ``actions/checkout@v4`` 2. Node 22, ``npm ci`` 3. ``npm test`` + ``npm run build`` 4. Separate ``typecheck`` job (``vue-tsc``; required, blocks ``main``) Private repos ------------- ``agency-django`` CI must not checkout sibling private repos. Standalone ``tests/settings.py`` replaces ``server.settings`` for pytest. Publishing UI ------------- Not part of CI today. Manual / umbrella flow: 1. Commit source in **agency-ui** 2. ``npm run build:django`` → commit dist in **agency-django** 3. ``./dev ui`` → collectstatic in running stack Submodule pointers in **agency-workspace** document which commits ship together. Local parity checklist ---------------------- .. code-block:: bash ./dev up ./dev test-all # backend container + frontend ./dev test-docker # optional stack smoke See :doc:`backend` and :doc:`frontend` for details.