From 7621af5acdad69d173a10c0a6513f0a538b05e56 Mon Sep 17 00:00:00 2001 From: Steven Palma Date: Wed, 17 Dec 2025 17:10:04 +0100 Subject: [PATCH 1/3] chore(ci): update PR template (#2665) * chore: update code of conduct to transformers one * chore: update PR template --- .github/PULL_REQUEST_TEMPLATE.md | 67 +++++++++++++++++++------------- CODE_OF_CONDUCT.md | 4 +- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d37b1a92f..ec5ac4372 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,41 +1,54 @@ -## What this does +## Title -Explain what this PR does. Feel free to tag your PR with the appropriate label(s). +Short, imperative summary (e.g., "fix(robots): handle None in sensor parser"). See [CONTRIBUTING.md](../CONTRIBUTING.md) for PR conventions. -Examples: -| Title | Label | -|----------------------|-----------------| -| Fixes #[issue] | (๐Ÿ› Bug) | -| Adds new dataset | (๐Ÿ—ƒ๏ธ Dataset) | -| Optimizes something | (โšก๏ธ Performance) | +## Type / Scope -## How it was tested +- **Type**: (Bug | Feature | Docs | Performance | Test | CI | Chore) +- **Scope**: (optional โ€” name of module or package affected) -Explain/show how you tested your changes. +## Summary / Motivation -Examples: +- One-paragraph description of what changes and why. +- Why this change is needed and any trade-offs or design notes. -- Added `test_something` in `tests/test_stuff.py`. -- Added `new_feature` and checked that training converges with policy X on dataset/environment Y. -- Optimized `some_function`, it now runs X times faster than previously. +## Related issues -## How to checkout & try? (for the reviewer) +- Fixes / Closes: # (if any) +- Related: # (if any) -Provide a simple way for the reviewer to try out your changes. +## What changed -Examples: +- Short, concrete bullets of the modifications (files/behaviour). +- Short note if this introduces breaking changes and migration steps. -```bash -pytest -sx tests/test_stuff.py::test_something -``` +## How was this tested -```bash -lerobot-train --some.option=true -``` +- Tests added: list new tests or test files. +- Manual checks / dataset runs performed. -## SECTION TO REMOVE BEFORE SUBMITTING YOUR PR +## How to run locally (reviewer) -**Note**: Anyone in the community is free to review the PR once the tests have passed. Feel free to tag -members/contributors who may be interested in your PR. Try to avoid tagging more than 3 people. +- Run the relevant tests: -**Note**: Before submitting this PR, please read the [contributor guideline](https://github.com/huggingface/lerobot/blob/main/CONTRIBUTING.md#submitting-a-pull-request-pr). + ```bash + pytest -q tests/ -k + ``` + +- Run a quick example or CLI (if applicable): + + ```bash + lerobot-train --some.option=true + ``` + +## Checklist (required before merge) + +- [ ] Linting/formatting run (`pre-commit run -a`) +- [ ] All tests pass locally (`pytest`) +- [ ] Documentation updated +- [ ] CI is green + +## Reviewer notes + +- Anything the reviewer should focus on (performance, edge-cases, specific files) or general notes. +- Anyone in the community is free to review the PR. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index c0fdac843..305ffa276 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -52,7 +52,7 @@ decisions when appropriate. This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. -Examples of representing our community include using an official email address, +Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -[feedback@huggingface.co](mailto:feedback@huggingface.co). +feedback@huggingface.co. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the From f0c98e23f17456b9b0bd68ae0fa651c5ad496968 Mon Sep 17 00:00:00 2001 From: Steven Palma Date: Wed, 17 Dec 2025 17:52:45 +0100 Subject: [PATCH 2/3] feat(ci): simple automatic labelling (#2667) * ci: add pr labeler * ci: add issue labeler * ci: minor fixes for labelers * fix(ci): add explicit path for pr labeler --- .github/workflows/issue_labeler.yml | 105 ++++++++++++++++++++++++++++ .github/workflows/labeler.yml | 68 ++++++++++++++++++ .github/workflows/pr_labeler.yml | 39 +++++++++++ 3 files changed, 212 insertions(+) create mode 100644 .github/workflows/issue_labeler.yml create mode 100644 .github/workflows/labeler.yml create mode 100644 .github/workflows/pr_labeler.yml diff --git a/.github/workflows/issue_labeler.yml b/.github/workflows/issue_labeler.yml new file mode 100644 index 000000000..352819db1 --- /dev/null +++ b/.github/workflows/issue_labeler.yml @@ -0,0 +1,105 @@ +# Copyright 2025 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 automatically labels issues based on their content. +name: Issue Labeler +on: + # Trigger on new issues and edits to existing issues + issues: + types: [opened, edited] + +permissions: + contents: read + issues: write + +jobs: + label-issue: + name: Auto Label Issue + runs-on: ubuntu-latest + if: github.repository == 'huggingface/lerobot' + steps: + - uses: actions/github-script@v8 + with: + script: | + // Setup Input Text (Unified Title + Body) + const body = (context.payload.issue.body || ''); + const title = (context.payload.issue.title || ''); + + // We keep a lowercased version for keyword matching + const text = `${title}\n${body}`.toLowerCase(); + + const labelsToAdd = new Set(); + + // Helper: Simple regex test + const matches = (re) => re.test(text); + + // Issue Type Detection (Dropdowns & Explicit Headers) + if (text.includes('bug report') || /\bissue type:.*bug/.test(text)) { + labelsToAdd.add('bug'); + } + if (text.includes('feature request') || /\bissue type:.*feature/.test(text)) { + labelsToAdd.add('enhancement'); + } + if (text.includes('technical question') || /\bissue type:.*question/.test(text)) { + labelsToAdd.add('question'); + } + if (text.includes('maintenance') || /\bissue type:.*maintenance/.test(text)) { + labelsToAdd.add('documentation'); + } + + // Keyword Heuristic + + // Domain Specific + if (matches(/example(s)?\b|script(s)?\b|sample(s)?\b|demo(s)?\b|notebook(s)?\b/i)) labelsToAdd.add('examples'); + if (matches(/dataset(s)?\b|data loader|data augmentation|data preprocessing/i)) labelsToAdd.add('dataset'); + if (matches(/mujoco|isaac|\bsimulation\b|\bsim /i)) labelsToAdd.add('simulation'); + if (matches(/train|loss|optimizer|backward|gradient|wandb|sac\b/i)) labelsToAdd.add('training'); + if (matches(/rerun|plot|video|render|visualiz|gif/i)) labelsToAdd.add('visualization'); + if (matches(/camera|realsense|lidar|depth|sensor|imu|microphone|rgbd/i)) labelsToAdd.add('sensors'); + if (matches(/aloha|koch|so-100|so100|mobile|teleop|manipulator|robot(s)?\b/i)) labelsToAdd.add('robots'); + if (matches(/teleop|teleoperator|controller|leader|follower|joystick|gamepad/i)) labelsToAdd.add('teleoperators'); + if (matches(/policy|policies|p0licy/i)) labelsToAdd.add('policies'); + if (matches(/processor(s)?\b|implement.*processor|processor pipeline/i)) labelsToAdd.add('processor'); + if (matches(/eval|evaluate|evaluation|metric(s)?\b|score|benchmark/i)) labelsToAdd.add('evaluation'); + + // Infrastructure & Code Quality + if (matches(/test|pytest|unittest|failing test/i)) labelsToAdd.add('tests'); + if (matches(/ci|github actions|workflow|gha|action(s)?\b|pipeline/i)) { + labelsToAdd.add('CI'); + labelsToAdd.add('github_actions'); + } + if (matches(/perf|latency|benchmark|throughput|fps|speed|performance|benchmarking/i)) labelsToAdd.add('performance'); + if (matches(/dependency|requirements|pip|conda|install error|importerror|package not found/i)) labelsToAdd.add('dependencies'); + if (matches(/python\b|pyproject|requirements(\.txt)?|pip install|typing error/i)) labelsToAdd.add('python'); + + // Documentation & Meta + if (matches(/doc|documentation|docs|readme|typo|how to/i)) labelsToAdd.add('documentation'); + if (matches(/refactor|cleanup|restructure|rename|modernize code/i)) labelsToAdd.add('refactor'); + if (matches(/release|changelog|version bump|cut a release|tag v/i)) labelsToAdd.add('release'); + + // Fixed: "BREAKING CHANGE" must be lowercase in regex because 'text' is lowercase + if (matches(/breaking change|breaking:|major change/i)) labelsToAdd.add('breaking change'); + + // Apply Labels + const labels = Array.from(labelsToAdd).filter(Boolean); + + if (labels.length > 0) { + console.log(`Adding labels: ${labels.join(', ')}`); + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels, + }); + } diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 000000000..1ff046882 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,68 @@ +# Copyright 2025 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. + +CI: + - changed-files: + - any-glob-to-any-file: + - '.github/**' + - 'docker/**' + +github_actions: + - changed-files: + - any-glob-to-any-file: '.github/**' + +documentation: + - changed-files: + - any-glob-to-any-file: + - '**/*.md' + - 'docs/**' + +examples: + - changed-files: + - any-glob-to-any-file: 'examples/**' + +tests: + - changed-files: + - any-glob-to-any-file: 'tests/**' + +sensors: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/cameras/**' + +configuration: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/configs/**' + +dataset: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/datasets/**' + +evaluation: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/envs/**' + +robots: + - changed-files: + - any-glob-to-any-file: + - 'src/lerobot/teleoperators/**' + - 'src/lerobot/robots/**' + - 'src/lerobot/motors/**' + +policies: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/policies/**' + +processor: + - changed-files: + - any-glob-to-any-file: 'src/lerobot/processor/**' diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml new file mode 100644 index 000000000..70338e221 --- /dev/null +++ b/.github/workflows/pr_labeler.yml @@ -0,0 +1,39 @@ +# Copyright 2025 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 labels pull requests based on the files that were changed. +name: Pull Request Labeler + +on: + # Allows labeling pull requests when they are opened or updated + pull_request: + branches: + - main + types: [opened, synchronize, reopened, ready_for_review] + +permissions: + contents: read + pull-requests: write + +jobs: + triage: + name: Label PR + runs-on: ubuntu-latest + if: github.repository == 'huggingface/lerobot' + steps: + - uses: actions/labeler@v6 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + sync-labels: true # Removes labels if files are removed from the PR + configuration-path: '.github/workflows/labeler.yml' From 292333cafcbddf7c77aaed0bc5569ba37083ac7f Mon Sep 17 00:00:00 2001 From: Steven Palma Date: Wed, 17 Dec 2025 18:02:20 +0100 Subject: [PATCH 3/3] chore(ci): update issue template (#2666) --- .github/ISSUE_TEMPLATE/bug-report.yml | 101 +++++++++++++++++--------- 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 7423495de..b46ed0cca 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -12,57 +12,92 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: "\U0001F41B Bug Report" -description: Submit a bug report to help us improve LeRobot +name: "๐Ÿš€ Issue / Bug / Request" +description: Report a bug, suggest an improvement, or ask a technical question. body: - type: markdown attributes: value: | - Thanks for taking the time to submit a bug report! ๐Ÿ› - If this is not a bug related to the LeRobot library directly, but instead a general question about your code or the library specifically please use our [discord](https://discord.gg/s3KuuzsPFb). + ### Thanks for contributing to LeRobot! ๐Ÿ™Œ + Please choose the most relevant sections below. If this is a general "how-to" question, consider our [Discord](https://discord.gg/s3KuuzsPFb) for faster community support. + + - type: dropdown + id: issue-type + attributes: + label: Issue Type + description: What kind of ticket are you opening? + options: + - label: "๐Ÿ› Bug Report (Something isn't working)" + - label: "๐Ÿ’ก Feature Request / Improvement" + - label: "โ“ Technical Question" + - label: "๐Ÿงน Maintenance / Documentation" + validations: + required: true - type: textarea id: system-info attributes: - label: System Info - description: Please share your LeRobot configuration by running `lerobot-info` (if installed) or `python -m lerobot.scripts.display_sys_info` (if not installed) and pasting the output below. + label: Environment & System Info + description: | + For bugs or technical questions, please run `lerobot-info` and paste the output. + (Optional for feature requests). render: Shell - placeholder: lerobot version, OS, python version, numpy version, torch version, and lerobot's configuration - validations: - required: true - - - type: checkboxes - id: information-scripts-examples - attributes: - label: Information - description: 'The problem arises when using:' - options: - - label: "One of the scripts in the examples/ folder of LeRobot" - - label: "My own task or dataset (give details below)" + placeholder: lerobot version, OS, python version, etc. - type: textarea - id: reproduction + id: description validations: required: true attributes: - label: Reproduction + label: Description description: | - If needed, provide a simple code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. - Sharing error messages or stack traces could be useful as well! - Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting - Try to avoid screenshots, as they are hard to read and don't allow copy-and-pasting. - + Provide a clear summary of the issue or your proposal. + - **Bugs:** What is happening? + - **Features:** What is the goal/use case? + - **Questions:** What are you trying to achieve? placeholder: | - Steps to reproduce the behavior: + A clear and concise description of the issue or suggestion. - 1. - 2. - 3. + - type: textarea + id: context-repro + validations: + required: true + attributes: + label: Context & Reproduction + description: | + Provide a code snippet, steps to reproduce a bug, or technical details about your proposal. + Please use code blocks for logs and scripts. + placeholder: | + Steps to reproduce / Usage example: + 1. + 2. + 3. - type: textarea id: expected-behavior - validations: - required: true attributes: - label: Expected behavior - description: "A clear and concise description of what you would expect to happen." + label: Expected Behavior / Desired Outcome + description: "Describe what you expected to happen or what the ideal solution looks like." + placeholder: "e.g. The script should finish without OOM, or I would like a new flag --fast-mode." + + - type: textarea + id: logs + attributes: + label: Relevant logs or stack trace + description: If applicable, paste relevant error logs here. + render: Shell + + - type: checkboxes + id: extras + attributes: + label: Checklist + options: + - label: I have searched existing issues to ensure this isn't a duplicate. + - label: I am using the latest version of the `main` branch. + - label: (For bugs) I have verified this is not an environment-specific issue. + + - type: textarea + id: workaround + attributes: + label: Additional Info / Workarounds + description: Anything else we should know? If you have a workaround, please share it!