name: CI on: push: branches: [main] pull_request: branches: [main] permissions: contents: read jobs: check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v5 - name: Set up Python run: uv python install 3.14 - name: Install dependencies run: | uv venv .venv uv pip install --python .venv/bin/python -e '.[dev]' - name: ruff format run: .venv/bin/ruff format --check . - name: ruff check (ALL rules) run: .venv/bin/ruff check . - name: mypy --strict run: .venv/bin/mypy signal_bot fake_signal - name: shellcheck run: shellcheck run.sh scripts/*.sh - name: pytest (100% branch coverage) run: .venv/bin/python -m pytest -q # The real bot against the fake Signal server. No account, no network. - name: end-to-end run: ./scripts/e2e.sh