name: CI on: push: branches: [main] pull_request: jobs: test: name: py${{ matrix.python-version }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Validate trove classifiers run: | python -m pip install trove-classifiers tomli python scripts/check_classifiers.py - name: Install run: python -m pip install -e '.[serve]' - name: JSON schemas up to date run: python scripts/export_json_schemas.py --check - name: Unit tests run: python -m unittest discover -s tests - name: SafetyGate coverage gate (ohho/safety.py >= 95% line+branch) shell: bash run: | python -m pip install "coverage>=7" python -m coverage run --branch --include=ohho/safety.py -m unittest tests.test_safety python -m coverage report -m --include=ohho/safety.py --fail-under=95 - name: CLI smoke (doctor) run: ohho doctor - name: CLI smoke (sim) run: ohho sim --robot omnibot --seconds 2 - name: CLI smoke (sim unitree-go2) run: ohho sim --robot unitree-go2 --seconds 2 - name: CLI smoke (selftest sim) run: | ohho selftest --sim ohho selftest --sim --robot unitree-go2 - name: CLI smoke (documented commands, sim/mock only) run: python -m unittest discover -s tests/cli_smoke -v