--- name: robot-python-projects description: Guidelines for robot Python projects — api/, robot-server/, hardware/, auth-server/, shared-data/, server-utils/, system-server/, update-server/, usb-bridge/. Use when working with Python files in these directories or their pyproject.toml files. --- # Robot Python Projects The following directories contain the robot Python projects — packages that run on or support Opentrons robots: | Project | Directory | Description | | ----------------------- | ---------------- | ---------------------------------------------------- | | `opentrons` | `api/` | Core Opentrons Python API for protocol execution | | `robot-server` | `robot-server/` | HTTP API server that runs on the robot | | `opentrons-hardware` | `hardware/` | Low-level hardware control and CAN bus communication | | `auth-server` | `auth-server/` | Authentication server for Flex | | `opentrons-shared-data` | `shared-data/` | Shared data definitions (labware, pipettes, modules) | | `server-utils` | `server-utils/` | Common utilities for Python servers | | `system-server` | `system-server/` | System-level server for robot management | | `otupdate` | `update-server/` | Server for software and firmware updates | | `ot3usb` | `usb-bridge/` | USB bridge daemon for Flex | ## Common Patterns - **Build system**: `pyproject.toml` with **hatchling** (`hatchling==1.27.0`) - **Dependency management**: **uv** with `uv.lock` files (not pipenv or poetry) - **Python version**: 3.12 (set via `UV_PYTHON = 3.12` in `scripts/python-uv.mk`) - **Testing**: pytest 9+ with config in `[tool.pytest]` section of `pyproject.toml` - **Linting**: ruff (replaces flake8 + isort) with config in `[tool.ruff]` sections of `pyproject.toml` - **Type checking**: mypy with config in `[tool.mypy]` section of `pyproject.toml` (not `mypy.ini`) - **Shared Make includes**: all Makefiles include `../scripts/python-uv.mk` which provides common targets ## Running Tests Prefer running tests scoped to the project where your changes are: ```bash # From the project directory cd api && make test # Or from the monorepo root make -C api test ``` Each project has a Makefile with a `test` target. The exception is `shared-data`, which uses `test-py`: ```bash make -C shared-data test-py ``` ## Checking Types and Linting Each project has a Makefile with a `lint` target (runs ruff check + mypy). `shared-data` uses `lint-py`: ```bash make -C api lint make -C shared-data lint-py ``` ## Formatting Each project has a Makefile with a `format` target (runs ruff format + isort fix). `shared-data` uses `format-py`: ```bash make -C api format make -C shared-data format-py ``` ## Setup and Teardown Each project has `setup` and `teardown` targets. Setup runs `uv sync --frozen --group dev --python 3.12`. `shared-data` uses `setup-py` and `teardown-py`: ```bash make -C api setup make -C shared-data setup-py ``` Or from the monorepo root for all robot Python projects at once: ```bash make setup-py # setup all make teardown-py # teardown all ``` ## Dependency Management ```bash cd api # or any robot Python project uv add # add production dependency uv add --group dev # add dev dependency uv remove # remove dependency uv lock # re-resolve after manual pyproject.toml edits ``` After changing dependencies, **commit both** `pyproject.toml` and `uv.lock`.