Skip to content

[Workflow] Fix template generator in uv environments - #7480

Merged
StafaH merged 17 commits into
isaac-sim:developfrom
StafaH:fix/template-generator-uv-pip
Sep 4, 2026
Merged

[Workflow] Fix template generator in uv environments#7480
StafaH merged 17 commits into
isaac-sim:developfrom
StafaH:fix/template-generator-uv-pip

Conversation

@StafaH

@StafaH StafaH commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Description

The template generator attempted to install its dependencies with python -m pip every time it started. Fresh uv environments do not include the pip module, so the install failed and the generator then crashed while importing its prompt dependency.

This change:

  • declares Jinja2 in the root dependency metadata so source and wheel installs provide the renderer
  • removes runtime dependency installation from isaaclab --new
  • replaces InquirerPy with the existing Rich dependency and native numbered multi-selection validation
  • removes the duplicate template requirements file
  • makes generated projects use the kit-less Newton backend by default instead of installing Isaac Sim
  • forwards isaacsim, ov, ovphysx, and ovrtx as optional extras in generated projects
  • documents backend selection in the generated README
  • adds prompt, launcher, generated-metadata, and wheel-metadata regression coverage

No new prompt dependency is introduced: Jinja2 was already present transitively, while removing InquirerPy also removes its otherwise-unused pfzy dependency.

Type of change

  • Bug fix (non-breaking change which fixes an issue)

Release backport

  • Backport this pull request to the active release branch after it merges into develop

Screenshots

Not applicable.

Test plan

  • uv run python -m pytest --confcutdir=tools/template tools/template/test_cli.py -q (4 passed)
  • uv run python -m pytest source/isaaclab/test/cli/test_misc_commands.py source/isaaclab/test/cli/test_wheel_builder_metadata.py -q (18 passed)
  • verified the generated-metadata regression fails against the pre-fix template because isaacsim is a base dependency
  • uv run python tools/changelog/cli.py check develop
  • uv run isaaclab -f
  • generated an external direct single-agent project with RSL-RL in a clean uv environment without InquirerPy or pfzy, then compiled its generated Python and parsed both generated TOML files

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with uv run isaaclab -f
  • I updated the generated project documentation
  • My changes generate no new warnings
  • I have added tests that prove the fix is effective
  • I have added a changelog fragment for the touched isaaclab package
  • My name already exists in CONTRIBUTORS.md

@StafaH
StafaH requested a review from a team September 2, 2026 00:37
@github-actions github-actions Bot added bug Something isn't working isaac-lab Related to Isaac Lab team infrastructure labels Sep 2, 2026
@greptile-apps

greptile-apps Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR removes runtime package installation from the project-template launcher and makes its dependencies available through package metadata.

  • Replaces InquirerPy prompts with Rich-based selection and validation.
  • Declares Jinja2 as a root and wheel dependency.
  • Removes the template-specific requirements file.
  • Adds regression coverage for prompt handling, launcher behavior, and generated wheel metadata.

Confidence Score: 5/5

The PR appears safe to merge, with no concrete changed-code failure established.

The supported uv and wheel paths install the prompt and rendering dependencies through package metadata, and the new prompt implementation preserves validation and retry behavior for the reviewed input paths.

Important Files Changed

Filename Overview
pyproject.toml Declares Jinja2 as a direct project dependency so template rendering no longer relies on runtime installation.
source/isaaclab/isaaclab/cli/commands/misc.py Removes the runtime pip invocation and launches the template generator directly.
tools/template/cli.py Replaces InquirerPy with Rich prompts and implements validated numbered multi-selection.
tools/template/test_cli.py Covers Rich selection, checkbox parsing and retries, instructional text, and text validation.
source/isaaclab/test/cli/test_wheel_builder_metadata.py Verifies generated wheel metadata includes Rich and Jinja2 while excluding InquirerPy.
uv.lock Adds the existing locked Jinja2 package as a direct Isaac Lab dependency without changing its resolved version.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Install[Install Isaac Lab] --> Metadata[Package metadata installs Rich and Jinja2]
  Metadata --> Command[Run isaaclab --new]
  Command --> Generator[Launch template generator directly]
  Generator --> Prompts[Rich interactive prompts]
  Prompts --> Render[Jinja2 renders project templates]
Loading

Reviews (1): Last reviewed commit: "Fix template generator in uv environment..." | Re-trigger Greptile

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isaac Lab Review Bot

Reviewed the removal of runtime pip installation from isaaclab --new, the migration of template dependencies into root and wheel metadata, and the replacement of InquirerPy prompts with Rich-based input. The changed paths are internally consistent, with regression coverage for command dispatch, prompt validation, and generated wheel dependencies.

  • Design and architecture: Dependency ownership now resides in installation metadata rather than runtime environment mutation. The removed tools/template/requirements.txt was tied to the deleted pip-install path, while Jinja2 and the existing Rich dependency are available through source and generated wheel metadata.
  • API: The prompt helper signatures and return types remain compatible, while CLIHandler.__init__ adds an optional console parameter. Selection tokens and separator handling used by the generator remain represented. A residual compatibility consideration is reliance on Rich's case-insensitive choice normalization, but the patch provides no concrete breakage path.
  • Implementation: The implementation validates text and path inputs through re-prompting and validates checkbox entries as bounded, de-duplicated numeric selections. Tests cover direct launcher dispatch, prompt behavior, and wheel metadata. The tool-local prompt test requires its dedicated test invocation, which is a non-blocking test-organization tradeoff.

No blocking issues. No inline issue met the actionable-evidence threshold; the assessment above records the review feedback.

Automated review; human maintainers own approval decisions.

@StafaH StafaH changed the title Fix template generator in uv environments [Workflow] Fix template generator in uv environments Sep 2, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 2, 2026
Comment on lines +7 to +14
The template generator creates a working Cartpole task, its selected agent
configurations, and the packaging needed for the Isaac Lab CLI to discover it.
The quickest path is an external project: choose a name and workflow, run
``uv sync``, and start the generated task with the Newton backend.

The generator runs entirely in the active Isaac Lab environment. It does not
invoke ``pip`` or install a second set of template dependencies, so it works in
the pip-less virtual environments created by ``uv``.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

By reading this, it's not that clear to me what the template generator is used for.
I feel like it's missing the "why?".

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 73db28d. The introduction now leads with why the generator exists: it bootstraps package structure, task registration, and agent configurations for either a standalone project or an upstream task.

Comment thread docs/source/developer-tools/template_generator.rst

@AntoineRichard AntoineRichard left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be accompanied with a skill?

Build your own project or task
==============================

The template generator creates a working Cartpole task, its selected agent

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leading with a "Cartpole task" feels weird too, this is a detail.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 73db28d. Cartpole is now introduced only after the general purpose, as the replaceable working example included by both generator modes.

The quickest path is an external project: choose a name and workflow, run
``uv sync``, and start the generated task with the Newton backend.

The generator runs entirely in the active Isaac Lab environment. It does not

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This reads weird, does it? If we create an external project this is not the case?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarified in 73db28d. This now sits next to the command and explicitly says the generator uses dependencies from the active Isaac Lab environment; it applies while creating an external project as well.

Comment on lines +16 to +75
Create and run a project
------------------------

First, :ref:`install Isaac Lab <isaaclab-installation-root>`. Run the generator
from the Isaac Lab source checkout or from a uv project that contains the
installed Isaac Lab package:

.. code-block:: bash

uv run isaaclab --new

The short form is equivalent:

.. code-block:: bash

uv run isaaclab -n

Select the following options for a small first project:

* **External** project
* A parent directory outside the Isaac Lab repository
* A Python-compatible project name, such as ``my_cartpole``
* **Manager-based | single-agent** workflow
* **rsl_rl** with **PPO**

The prompts display the valid options and accept numbered, comma-separated
selections when more than one choice is allowed. The generator creates the
project under ``<parent-directory>/<project-name>`` and initializes a Git
repository there.

Enter the generated project and create its environment:

.. code-block:: bash

cd <parent-directory>/my_cartpole
uv sync

This default environment includes the selected RL library and the kit-less
Newton backend. It does **not** install Isaac Sim.

List the generated task name and its available presets:

.. code-block:: bash

uv run python scripts/list_envs.py --show_presets

Copy the task name from the output, then run a quick smoke test:

.. code-block:: bash

uv run isaaclab random_agent --task <TASK_NAME> --num_envs 16 --viz newton

If the environment launches and the cart moves, the project is ready to edit.
You can then train and play a policy with the same command surface used by
Isaac Lab itself:

.. code-block:: bash

uv run isaaclab train --rl_library rsl_rl --task <TASK_NAME>
uv run isaaclab play --rl_library rsl_rl --task <TASK_NAME> --checkpoint latest --viz newton

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like this split. I think the original doc did it better. Here we tell the user what to do without telling them why they are doing it. Leading with a: "Let's with creating an external project." would go be good. Even more if we explain the two options before!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 73db28d. The External/Internal comparison and workflow choices now come first, followed by an explicitly named external-project walkthrough.

Comment on lines +123 to +161
Choose a simulation backend
---------------------------

Generated projects follow the same optional-extra model as Isaac Lab. Newton is
available after the default ``uv sync``; heavier simulator runtimes are only
installed when a command requests their extra.

.. list-table::
:widths: 29 23 48
:header-rows: 1

* - Backend selector
- Required extra
- Example
* - ``physics=newton_mjwarp``
- None
- ``uv run isaaclab random_agent --task <TASK_NAME> physics=newton_mjwarp``
* - ``physics=newton_kamino``
- None
- ``uv run isaaclab random_agent --task <TASK_NAME> physics=newton_kamino``
* - ``physics=ovphysx``
- ``ovphysx`` or ``ov``
- ``uv run --extra ovphysx isaaclab random_agent --task <TASK_NAME> physics=ovphysx``
* - ``physics=isaacsim_physx``
- ``isaacsim``
- ``uv run --extra isaacsim isaaclab random_agent --task <TASK_NAME> physics=isaacsim_physx``

The ``ov`` extra installs both the OV PhysX and OVRTX runtimes. To combine
Newton physics with OVRTX rendering, request only the ``ovrtx`` extra:

.. code-block:: bash

uv run --extra ovrtx isaaclab random_agent --task <TASK_NAME> \
physics=newton_mjwarp renderer=ovrtx

Place ``--extra`` before ``isaaclab``. Keep it on every command that needs the
optional runtime; this lets ``uv`` reproduce the intended environment without a
separate installation step. See :ref:`isaac-lab-quickstart` for all physics,
renderer, and visualizer combinations.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it make sense to have this here? Can't we just link the users to the different backends doc directly with a short note?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 73db28d. I replaced the backend matrix with a short note about the generated extras, one example, and links to Backends and Presets plus the quickstart combinations.

Comment thread docs/source/developer-tools/template_generator.rst
@AntoineRichard

Copy link
Copy Markdown
Collaborator

The ASCII tree in "Understand the generated project" is abbreviated in a way that hides the module layer, so a reader can't match it against what the generator actually writes.

The doc shows:

└── source/
    └── my_cartpole/
        ├── pyproject.toml
        ├── config/
        │   └── extension.toml
        └── my_cartpole/
            └── tasks/

I ran generate() for an external, manager-based single-agent project with rsl_rl/PPO (name = "microduck_lab") and it wrote:

source/microduck_lab/docs/CHANGELOG.rst
source/microduck_lab/microduck_lab/ui_extension_example.py
source/microduck_lab/microduck_lab/tasks/__init__.py
source/microduck_lab/microduck_lab/tasks/microduck_lab/mdp/
source/microduck_lab/microduck_lab/tasks/microduck_lab/config/cartpole/microduck_lab_env_cfg.py
source/microduck_lab/microduck_lab/tasks/microduck_lab/config/cartpole/agents/rsl_rl_ppo_cfg.py

Two things the tree stops short of: there's a task-family directory named after the project inside tasks/, and there's a ui_extension_example.py stub at the module root (plus the second [[python.module]] entry it needs in extension.toml), neither of which is mentioned anywhere in the doc. I only found out where to put things by reading generator.py.

Suggest expanding the tree two levels so it matches the generator's output, and adding a line about the UI stub — it's the file people will most want to delete first.

@AntoineRichard

Copy link
Copy Markdown
Collaborator

Small wording suggestion rather than a restructure: the Task layer currently reads as prescriptive —

The Task defines an environment and its agent configurations. Shared logic lives in the task-family directory, while robot-specific environment and agent configurations live under config/<robot>.

That's a good description of one common shape, but it reads as the required one. I hit two cases where it doesn't fit while porting a 14-task locomotion family (MicroDuck) into a generated project:

  • The variation axis is behaviour, not robot: 11 behaviour families (velocity, standup, sitstand, roulade, ballkick, velstand, groundpick, rollercrouch, rollerstandup, spin, rollerslope) across 3 robot variants, with the robot picked per family. Following the letter would have produced eleven single-child config/microduck/ directories.
  • There's one mdp/ package shared by all 11 families (actions, commands, curriculums, events, observations, rewards, symmetry, terminations — the substantial part of the port). The template's mdp/ is per task family, and the four-layer model has no slot for cross-family shared code.

The mechanism handles both fine — I put the shared package at tasks/mdp/ and the template's own _BLACKLIST_PKGS = ["utils", ".mdp"] already keeps it out of registration. It's only the prose that doesn't describe it.

Suggest saying config/<robot> is one common shape rather than the shape, plus one sentence on where cross-family shared code goes. Two sentences would have saved me a ruling.

@AntoineRichard

Copy link
Copy Markdown
Collaborator

The doc and the generator are both silent on tests, and generated projects ship no pytest configuration. Two things bit me carrying an existing suite (19 files, 598 tests) into a generated project:

  • Every marked test warns: PytestUnknownMarkWarning: Unknown pytest.mark.unit. Isaac Lab's marker vocabulary is declared in the monorepo root pyproject.toml and isn't part of any distribution, so it doesn't travel. I added a [tool.pytest.ini_options] block with unit, integration, smoke, kitless by hand.
  • All 14 environment smoke tests died on ModuleNotFoundError: No module named 'env_test_utils'. _run_environments lives in source/isaaclab_tasks/test/env_test_utils.py, which isn't packaged and isn't importable from an installed isaaclab. I vendored a copy — it only depends on isaaclab and isaaclab_tasks, so it works, but it's now a fork that will drift.

Suggest the template gain a [tool.pytest.ini_options] marker block (cheap, and it makes the markers discoverable), and that the doc say a sentence about tests either way. The env_test_utils one is a bigger call — either promote it to a real module like isaaclab_tasks.test_utils, or say plainly that external projects are expected to write their own environment harness.

Unrelated to tests but in the same file, one more per-file-ignore would help: the template sets select = ["E", "F", "I", "UP", "W"] and ignores **/__init__.py but not **/__init__.pyi, so Isaac Lab's own lazy-export idiom (lazy_export() + a .pyi listing __all__) fails F403 in a generated project out of the box.

@AntoineRichard

Copy link
Copy Markdown
Collaborator

Splitting this out of my testing comment above, because it's the one thing in that bundle the doc can't fix on its own.

External projects can't import the environment-test helpers. source/isaaclab_tasks/test/ is a sibling of the package directory, and packaging includes only ["isaaclab_tasks", "isaaclab_tasks.*"] — correct for test files, nobody wants the suite in the wheel, but it takes the reusable helpers down with it. In-tree the gap is bridged by a sys.path.insert in test/conftest.py, which of course doesn't travel.

Lived consequence in the port: all 14 environment smoke tests in my generated project failed at collection with ModuleNotFoundError: No module named 'env_test_utils'. I vendored a copy of the 429-line file — it only needs isaaclab and isaaclab_tasks, so it works — and that copy is now a fork that will drift.

I've opened #7488 proposing the helpers move to an installed path (e.g. isaaclab_tasks.testing), with test files themselves staying unshipped.

For this PR, either resolution seems fine: point the doc at a packaged home if #7488 lands, or say plainly that projects are expected to vendor env_test_utils.py and own the drift. Both are a sentence — what's costly is the current silence, which leaves people to discover it at collection time.

@StafaH

StafaH commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 3, 2026
@StafaH

StafaH commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Updated the template generator so our flagship choices are always option 1 when applicable:

  • Manager-based | single-agent is the first workflow.
  • rsl_rl is the first single-agent RL library.
  • PPO is the first algorithm for every library that supports it.
  • The workflow and RL-library comparison tables now use the same ordering as the prompts.
  • Added an interactive-flow regression test that selects each first option and verifies all three choices.

Validated with uv run python -m pytest --confcutdir=tools/template tools/template/test_cli.py -q (5 passed) and the full formatting/lint suite (with only the known stale-baseline changelog hook skipped). The branch also includes the latest develop (d2a630628).

Implemented in 52e1a434e.

@StafaH

StafaH commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Aligned the external project template with IsaacLabTutorial as the canonical downstream uv project in a6706d31d:

  • Replaced the nested uv workspace/setuptools package with one root uv_build project and src/<package> layout.
  • Separated project, task-family, and robot/config names. Generated task code now lives under tasks/<task-family>/config/<robot> with concise env_cfg.py / env.py filenames.
  • Made the package root passive and kept task discovery on the isaaclab.tasks entry point.
  • Added a generated tests/test_registration.py covering task IDs, environment entry points, and the default agent.
  • Made the Isaac Sim UI extension opt-in (default: no UI), while retaining a working config/extension.toml and UI module when selected.
  • Updated the generated README and Developer Tools guide to document the actual output and removed the obsolete workspace diagram/templates.
  • Kept Manager-based, RSL-RL, and PPO as option 1.

Validation:

  • uv run python -m pytest --confcutdir=tools/template tools/template/test_cli.py -q — 7 passed
  • Generated manager-based and direct/UI projects both passed their registration tests and built wheels successfully.
  • Generated projects passed Ruff check and format validation.
  • uv run --isolated --extra dev -- make -C docs current-docs completed successfully.
  • SKIP=check-changelog-fragments uv run isaaclab -f passed; the skipped local hook compares against the fork's stale origin/develop baseline.

The branch is also merged with the latest upstream develop at 8fbdc3852 (merge commit 1263fefee).

@StafaH

StafaH commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 4, 2026

@AntoineRichard AntoineRichard left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks I think it's great!

@AntoineRichard

Copy link
Copy Markdown
Collaborator

@StafaH do we want to backport this one? I would say yes. But it won't be QA tested?

@AntoineRichard

Copy link
Copy Markdown
Collaborator

run-ci

@StafaH

StafaH commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 4, 2026
StafaH and others added 2 commits September 4, 2026 11:16
@kellyguo11

Copy link
Copy Markdown
Contributor

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 4, 2026
@StafaH
StafaH merged commit 7483997 into isaac-sim:develop Sep 4, 2026
52 checks passed
kellyguo11 pushed a commit that referenced this pull request Sep 5, 2026
…7480) (#7585)

# Description

Backports #7480 to `release/3.0.0` by cherry-picking merged commit
`74839972bd890051f09f9d9535f476d3e532dc27` with `-x` provenance.

The [automatic backport
run](https://github.com/isaac-sim/IsaacLab/actions/runs/33917751795)
encountered conflicts in the wheel-metadata regression test and
`uv.lock`, then stopped because the combined conflict context exceeded
the resolver limit.

This manual backport preserves the release branch's wheel-builder
helpers and installed-wheel compatibility dispatcher while adding the
template dependency regression coverage. The lockfile retains the
release dependency graph and records only the new direct Jinja2
requirement instead of importing `develop`'s unrelated marker
normalization.

| Field | Commit |
|---|---|
| Original merged change | `74839972bd890051f09f9d9535f476d3e532dc27` |
| Release base used | `5c610f076e6e8ba251bd08275d1dbbc3f1353597` |
| Proposed backport | `9d0b45f46d089854ee5e487e0931adce63276250` |

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Documentation update

## Release backport

- [ ] <!-- backport-active-release --> This PR already targets the
active release branch; do not backport it again.

## Validation

- Repository backport candidate validation passed with every source path
preserved and no extra paths changed.
- `uv lock --check` passed with the release-specific lockfile
resolution.
- `uv run python -m pytest --confcutdir=tools/template
tools/template/test_cli.py -q` — 7 passed.
- `uv run python -m pytest
source/isaaclab/test/cli/test_misc_commands.py
source/isaaclab/test/cli/test_wheel_builder_metadata.py -q` — 18 passed.
- `uv run python -m pytest
source/isaaclab_rl/test/test_template_generator.py -q` — 20 passed.
- `uv run isaaclab -f` passed.
- `uv run --isolated --extra test -- make -C docs current-docs` passed
without warnings.
- `git diff --check upstream/release/3.0.0...HEAD` passed.

## Checklist

- [x] I have read and understood the contribution guidelines.
- [x] I have run the pre-commit checks.
- [x] I have preserved the corresponding documentation changes.
- [x] My changes generate no new warnings.
- [x] I have preserved and run the regression tests.
- [x] The original changelog fragments are preserved for both touched
packages.
- [x] The original contributors already exist in `CONTRIBUTORS.md`.

Co-authored-by: Antoine Richard <antoiner@nvidia.com>
@hujc7

hujc7 commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

The uv lock seems to be geneated by an older version. @StafaH

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants