From 8645d71e5670d1aea2dde5c7c25ec98ec29d474d Mon Sep 17 00:00:00 2001 From: Steven Palma Date: Thu, 9 Apr 2026 12:06:25 +0200 Subject: [PATCH] feat(ci): add agent assitance workflow (#3332) Co-authored-by: Pepijn <138571049+pkooij@users.noreply.github.com> --- .github/workflows/claude.yml | 63 ++++++++++++++++++++++++++++++++++++ AGENTS.md | 54 +++++++++++++++++++++++++++++++ CLAUDE.md | 1 + 3 files changed, 118 insertions(+) create mode 100644 .github/workflows/claude.yml create mode 100644 AGENTS.md create mode 120000 CLAUDE.md diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml new file mode 100644 index 000000000..55c7d6e7c --- /dev/null +++ b/.github/workflows/claude.yml @@ -0,0 +1,63 @@ +# Copyright 2026 The HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This workflow enables interactive Claude Code reviews on PRs and issues via @claude mentions. +name: Claude Code Assistant + +on: + issue_comment: + types: [created] + pull_request_review_comment: + types: [created] + issues: + types: [opened, assigned] + pull_request_review: + types: [submitted] + +permissions: + contents: read + pull-requests: write + issues: write + id-token: write + actions: read + +# Ensures only one Claude run per issue/PR at a time, canceling older runs. +concurrency: + group: ${{ github.workflow }}-${{ github.event.issue.number || github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + claude: + if: | + github.repository == 'huggingface/lerobot' && + ( + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || + (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + ) + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@26ddc358fe3befff50c5ec2f80304c90c763f6f8 # v1 + with: + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + track_progress: true + claude_args: '--model claude-opus-4-6' diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..c1aba7471 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,54 @@ +This file provides guidance to AI agents when working with code in this repository. + +## Project Overview + +LeRobot is a PyTorch-based library for real-world robotics, providing datasets, pretrained policies, and tools for training, evaluation, data collection, and robot control. It integrates with Hugging Face Hub for model/dataset sharing. + +## Tech Stack + +Python 3.12+ · PyTorch · Hugging Face (datasets, Hub, accelerate) · draccus (config/CLI) · Gymnasium (envs) · uv (package management) + +## Development Setup + +```bash +uv sync --locked # Base dependencies +uv sync --locked --extra test --extra dev # Test + dev tools +uv sync --locked --extra all # Everything +git lfs install && git lfs pull # Test artifacts +``` + +## Key Commands + +```bash +uv run pytest tests -svv --maxfail=10 # All tests +DEVICE=cuda make test-end-to-end # All E2E tests +pre-commit run --all-files # Lint + format (ruff, typos, bandit, etc.) +``` + +## Architecture (`src/lerobot/`) + +- **`scripts/`** — CLI entry points (`lerobot-train`, `lerobot-eval`, `lerobot-record`, etc.), mapped in `pyproject.toml [project.scripts]`. +- **`configs/`** — Dataclass configs parsed by draccus. `train.py` has `TrainPipelineConfig` (top-level). `policies.py` has `PreTrainedConfig` base. Polymorphism via `draccus.ChoiceRegistry` with `@register_subclass("name")` decorators. +- **`policies/`** — Each policy in its own subdir. All inherit `PreTrainedPolicy` (`nn.Module` + `HubMixin`) from `pretrained.py`. Factory with lazy imports in `factory.py`. +- **`processor/`** — Data transformation pipeline. `ProcessorStep` base with registry. `DataProcessorPipeline` / `PolicyProcessorPipeline` chain steps. +- **`datasets/`** — `LeRobotDataset` (episode-aware sampling + video decoding) and `LeRobotDatasetMetadata`. +- **`envs/`** — `EnvConfig` base in `configs.py`, factory in `factory.py`. Each env subclass defines `gym_kwargs` and `create_envs()`. +- **`robots/`, `motors/`, `cameras/`, `teleoperators/`** — Hardware abstraction layers. +- **`types.py`** and **`configs/types.py`** — Core type aliases and feature type definitions. + +## Repository Structure (outside `src/`) + +- **`tests/`** — Pytest suite organized by module. Fixtures in `tests/fixtures/`, mocks in `tests/mocks/`. Hardware tests use skip decorators from `tests/utils.py`. E2E tests via `Makefile` write to `tests/outputs/`. +- **`.github/workflows/`** — CI: `quality.yml` (pre-commit), `fast_tests.yml` (base deps, every PR), `full_tests.yml` (all extras + E2E + GPU, post-approval), `latest_deps_tests.yml` (daily lockfile upgrade), `security.yml` (TruffleHog), `release.yml` (PyPI publish on tags). +- **`docs/source/`** — HF documentation (`.mdx` files). Per-policy READMEs, hardware guides, tutorials. Built separately via `docs-requirements.txt` and CI workflows. +- **`examples/`** — End-user tutorials and scripts organized by use case (dataset creation, training, hardware setup). +- **`docker/`** — Dockerfiles for user (`Dockerfile.user`) and CI (`Dockerfile.internal`). +- **`benchmarks/`** — Performance benchmarking scripts. +- **Root files**: `pyproject.toml` (single source of truth for deps, build, tool config), `Makefile` (E2E test targets), `uv.lock`, `CONTRIBUTING.md` & `README.md` (general information). + +## Notes + +- **Mypy is gradual**: strict only for `lerobot.envs`, `lerobot.configs`, `lerobot.optim`, `lerobot.model`, `lerobot.cameras`, `lerobot.motors`, `lerobot.transport`. Add type annotations when modifying these modules. +- **Optional dependencies**: many policies, envs, and robots are behind extras (e.g., `lerobot[aloha]`). New imports for optional packages must be guarded or lazy. See `pyproject.toml [project.optional-dependencies]`. +- **Video decoding**: datasets can store observations as video files. `LeRobotDataset` handles frame extraction, but tests need ffmpeg installed. +- **Prioritize use of `uv run`** to execute Python commands (not raw `python` or `pip`). diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 000000000..47dc3e3d8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file