Skip to content

feat(client): implement Phase 2 unified client foundation #687

feat(client): implement Phase 2 unified client foundation

feat(client): implement Phase 2 unified client foundation #687

Workflow file for this run

name: CI
on:
pull_request:
branches: [main]
push:
branches: [main]
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
smoke:
name: Smoke (${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- uses: actions/checkout@v7
- name: Build local client assets
uses: ./.github/actions/build-client
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install uv
run: python -m pip install "uv>=0.7,<1.0"
- name: Install Linux runtime libraries
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends libgl1 libegl1 libglib2.0-0 libxcb-cursor0 libportaudio2
- name: Install macOS runtime libraries
if: runner.os == 'macOS'
run: brew install portaudio
- name: Install Python packages
run: uv sync --locked --all-extras --group test
- name: Verify required runtime dependencies
run: uv run python scripts/verify_runtime_dependencies.py all
- name: Verify packaged client assets
run: uv run python scripts/verify_client_assets.py --root src/row_bot/static/client-v2 --compare frontend/dist --strict
- name: Compile Python files
run: uv run python -m compileall -q -x "(\\.git|\\.venv|dist|build|__pycache__)" src tests scripts app.py debug_tools.py launcher.py
- name: Focused startup hardening tests
run: uv run python -m pytest tests/test_dependency_metadata.py tests/test_optional_dependency_imports.py tests/test_startup_hardening.py tests/test_app_port.py
- name: Focused agent orchestration tests
run: uv run python -m pytest tests/test_agent_profiles.py tests/test_agent_context.py tests/test_agent_tool_catalog.py tests/test_agent_runs.py tests/test_agent_runner.py tests/test_agent_tool.py tests/test_agent_tool_filtering.py tests/test_agent_write_locks.py tests/test_goal_mode.py tests/test_channel_goal_runtime.py tests/test_row_bot_status_agents.py
- name: Focused provider model selection tests
run: uv run python -m pytest tests/test_provider_catalog.py tests/test_provider_selection.py tests/test_provider_runtime.py tests/test_provider_media.py tests/test_row_bot_status_media.py tests/test_provider_subscription_auth.py tests/test_atlascloud_first_class_provider.py tests/test_openai_compatible_transport.py tests/test_claude_subscription_auth.py tests/test_claude_subscription_transport.py tests/test_xai_oauth_provider.py tests/test_xai_oauth_transport.py tests/test_xai_media.py tests/test_model_picker_regressions.py -k "not xai_oauth_loopback"
- name: Changed-test advisory
if: github.event_name == 'pull_request'
run: uv run python scripts/run_test_matrix.py changed --dry-run --base origin/main
- name: Deterministic subsystem and contract tests
run: uv run python scripts/run_test_matrix.py contract-subsystem
- name: Runtime smoke on Linux
if: runner.os == 'Linux'
run: uv run python scripts/smoke_app.py --port 8090 --timeout 120
- name: Validate Linux installer scripts
if: runner.os == 'Linux'
run: bash -n build_linux_app.sh installer/build_linux_app.sh installer/install-linux.sh
full-test:
name: Full regression suite
runs-on: macos-latest
timeout-minutes: 45
needs: smoke
steps:
- uses: actions/checkout@v7
- name: Build local client assets
uses: ./.github/actions/build-client
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install uv
run: python -m pip install "uv>=0.7,<1.0"
- name: Install Ollama
run: |
brew install portaudio
brew install ollama
ollama serve &
sleep 5
ollama pull qwen3:1.7b
- name: Install Python packages
run: uv sync --locked --all-extras --group test
- name: Verify required runtime dependencies
run: uv run python scripts/verify_runtime_dependencies.py all
- name: Verify packaged client assets
run: uv run python scripts/verify_client_assets.py --root src/row_bot/static/client-v2 --compare frontend/dist --strict
- name: Run full PR verification matrix
run: uv run python scripts/run_test_matrix.py pr
- name: Upload migrated subsystem coverage
if: always()
uses: actions/upload-artifact@v7
with:
name: migrated-subsystem-coverage
path: .tmp/coverage/migrated-subsystems.xml
if-no-files-found: warn