Skip to content

Updates environment and installation docs#5879

Merged
kellyguo11 merged 10 commits into
isaac-sim:developfrom
kellyguo11:automate-env-docs
May 31, 2026
Merged

Updates environment and installation docs#5879
kellyguo11 merged 10 commits into
isaac-sim:developfrom
kellyguo11:automate-env-docs

Conversation

@kellyguo11
Copy link
Copy Markdown
Contributor

Description

  • Add maintainer tooling (tools/environ_docs.py, tools/update_environments_rst.py) to auto-generate the comprehensive environment list in environments.rst from the Gym registry (RL libraries, presets, workflows, and inference task names), with manual overrides for RLinf-only tasks and camera task notes.
  • Introduce a shared clone snippet (isaaclab_latest_clone.rst) and a Sphinx substitution (|isaaclab_latest_branch|, default release/3.0.0-beta2) used across installation, quickstart, deployment, and policy docs; clone commands use parsed-literal so the branch name renders correctly.
  • Refresh environments.rst to stay in sync with the registry (166 training environments), update README links/version table for release/3.0.0-beta2, and clean up stale develop-branch compatibility warnings and a few doc link fixes.

Type of change

  • Documentation update

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have updated the changelog and the corresponding version in the extension's config/extension.toml file
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team infrastructure labels May 30, 2026
Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

Documentation Update Review

This PR introduces significant improvements to the documentation infrastructure and environment listing. Here's my analysis:

Highlights ✨

1. Auto-generated Environment List

  • New tooling (tools/environ_docs.py, tools/update_environments_rst.py) that generates the comprehensive environment list from the Gym registry
  • This is a great maintainability win - ensures docs stay in sync with actual registered environments
  • Well-structured with proper test coverage in tools/test/test_environ_docs.py

2. Sphinx Extension for Clone Snippets

  • New docs/_extensions/isaaclab_docs.py provides custom directives like isaaclab-clone-commands, isaaclab-clone-https, isaaclab-quickstart-install
  • Uses a configurable isaaclab_latest_branch (default: release/3.0.0-beta2) that's centrally managed
  • Eliminates duplication of clone commands across multiple doc pages

3. Updated References to release/3.0.0-beta2

  • README.md links updated from main to release/3.0.0-beta2
  • Version table updated accordingly

Suggestions & Questions

1. Selective Install Documentation

  • The new include/selective_install.rst provides good coverage of the modular install system
  • Consider adding a brief note about when to use isaacsim vs kit-less mode for users who are unsure

2. Environment Count Validation

  • The generated table shows 166 training environments - is there a CI check to validate this number doesn't decrease unexpectedly?
  • The --check flag in update_environments_rst.py is good for CI, but consider adding it to pre-commit hooks

3. Copy Button CSS

  • The change in custom.css to keep copy button always visible (opacity: 1) is nice for discoverability

4. Removed Compatibility Warning

  • The PR removes the compatibility warning about Isaac Lab develop vs Isaac Sim develop branches
  • Is this intentional because the breaking change was resolved?

5. Minor Observations

  • In docs/conf.py, the new rst_prolog sets the substitution for |isaaclab_latest_branch| - good approach for consistency
  • The isaaclab_docs.py extension is well-documented with proper typing

Code Quality

  • Good separation between generation logic (environ_docs.py) and the CLI script (update_environments_rst.py)
  • Test coverage looks reasonable for the new tooling
  • The RL_LIBRARY_OVERRIDES dict for tasks without cfg entry points is a practical solution

Overall this is a well-structured documentation improvement that will reduce maintenance burden and ensure consistency across the docs.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 30, 2026

Greptile Summary

This PR introduces maintainer tooling to auto-generate the comprehensive environment table in environments.rst from the Gym registry, adds a shared Sphinx extension (isaaclab_docs.py) that embeds a pinned release branch into all clone/install snippets, and refreshes documentation links and the version table to release/3.0.0-beta2.

  • New tooling (tools/environ_docs.py, tools/update_environments_rst.py): collects RL-library entry points, preset selectors, workflow types, and inference-task mappings to keep environments.rst in sync with the registry, with unit tests covering edge cases well.
  • Sphinx extension (docs/_extensions/isaaclab_docs.py): four custom directives render copy-friendly clone and install snippets using the configurable isaaclab_latest_branch value; the Windows quickstart snippets omit the uv installation step that the Linux snippets include, and an unguarded self.options["platform"] access will raise a bare KeyError if a future directive use omits :platform:.
  • Docs refresh: environments.rst is updated to 166 training environments with auto-generation markers, README links point to release/3.0.0-beta2, and stale develop-branch compatibility warnings are removed.

Confidence Score: 4/5

Safe to merge — all changes are documentation and maintainer tooling with no impact on runtime code.

The core logic in environ_docs.py is well-tested and correct. The new Sphinx extension works for all current directive uses. The small inconsistencies (Windows missing uv install step, _branch fallback vs registered default, unguarded platform key) are all confined to documentation generation and would surface as doc-build warnings rather than silent data errors.

docs/_extensions/isaaclab_docs.py — the _branch fallback and unguarded :platform: option access; docs/source/setup/quickstart.rst — Windows snippets missing the uv install step.

Important Files Changed

Filename Overview
docs/_extensions/isaaclab_docs.py New Sphinx extension with four custom directives; _branch fallback/default inconsistency and unguarded self.options["platform"] key access
tools/environ_docs.py New registry-to-RST helper module; find_inference_task_name assumes all task IDs end in -v0
tools/update_environments_rst.py Maintainer script wiring environ_docs helpers; straightforward and correct
tools/test/test_environ_docs.py Solid unit-test coverage for all public helpers including edge cases
docs/conf.py Adds isaaclab_docs extension and isaaclab_latest_branch config value
docs/source/overview/environments.rst Refreshed to 166 environments with auto-generation markers
docs/source/setup/quickstart.rst New quickstart page; Windows snippets missing uv install step
README.md Version table and doc links bumped to release/3.0.0-beta2
source/isaaclab/test/install_ci/uv_pip/test_uv_pip_install_isaaclab_rl_tasks_imports_rl_tasks.py New CI test verifying RL imports work without isaacsim

Reviews (1): Last reviewed commit: "Updates environment and installation doc..." | Re-trigger Greptile

Comment on lines +99 to +103
def run(self) -> list[nodes.Node]:
branch = _branch(self.config)
platform = self.options["platform"].strip().lower()
if platform not in {"linux", "windows"}:
raise self.error(f"Unsupported platform '{platform}'. Use 'linux' or 'windows'.")
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.

P2 Missing :platform: silently raises KeyError

self.options["platform"] raises a bare KeyError when the directive author omits :platform:. directives.unchanged_required validates the value only when the option is present; it does not make the option required by the framework. Any .rst file that includes .. isaaclab-quickstart-install:: without :platform: linux/windows will produce a cryptic traceback at doc-build time rather than a helpful directive error.

Comment on lines +16 to +18
def _branch(config) -> str:
"""Return the release branch pinned in installation docs."""
return getattr(config, "isaaclab_latest_branch", "main")
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.

P2 The _branch fallback is "main", but the registered default in setup() is "release/3.0.0-beta2". These two values should agree so that if the extension is ever used outside a fully-configured Sphinx app, the branch embedded in clone snippets does not silently revert to main.

Suggested change
def _branch(config) -> str:
"""Return the release branch pinned in installation docs."""
return getattr(config, "isaaclab_latest_branch", "main")
def _branch(config) -> str:
"""Return the release branch pinned in installation docs."""
return getattr(config, "isaaclab_latest_branch", "release/3.0.0-beta2")

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment thread docs/_extensions/isaaclab_docs.py
Comment thread tools/environ_docs.py
Comment on lines +174 to +181
def find_inference_task_name(task_id: str, registry_ids: set[str]) -> str | None:
"""Return the inference/play task ID paired with *task_id*, if registered."""
base = task_id.rsplit("-", 1)[0]
for suffix in _INFERENCE_TASK_SUFFIXES:
candidate = f"{base}{suffix}"
if candidate in registry_ids:
return candidate
return None
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.

P2 Version suffix stripped unconditionally in inference-task lookup

task_id.rsplit("-", 1)[0] always drops the trailing token (e.g. v0), then appends -Play-v0 / -Eval-v0 to build the candidate. If a future task is registered as -v1 or -v2, the lookup will silently fail to find its matching -Play-v1 or -Eval-v1 inference variant, producing a blank "Inference Task Name" cell.

Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

🔍 Code Review — Updated for Latest Push (cf15634)

This PR makes strong structural improvements to documentation maintainability. I've re-reviewed after the second commit ("allow for kitless pip install") and have some actionable findings:


Finding 1: Algorithm Label Accuracy Loss in Auto-Generated Environment Table

Severity: Medium | tools/environ_docs.py

The _infer_algorithm() function defaults to "PPO" when there's no suffix on the entry-point key. This causes information loss for tasks that previously had distinct algorithm labels:

  • Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0: was rl_games (FF) → now rl_games (PPO)
  • Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0: was rl_games (LSTM) → now rl_games (PPO)

The issue is at line ~277 in environ_docs.py:

def _infer_algorithm(algo_suffix: str, entry_value: object, library: str) -> str:
    if not algo_suffix:
        if library == "rl_games" and isinstance(entry_value, str) and "vision" in entry_value.lower():
            return "VISION"
        return "PPO"  # ← loses FF/LSTM distinction

Suggested fix: Extend the heuristic to check for "lstm" or "ff" in the entry-point value string, similar to the existing "vision" check. Alternatively, add these to RL_LIBRARY_OVERRIDES.


Finding 2: --enable_cameras Annotation Dropped Without Replacement

Severity: Medium | docs/source/overview/environments.rst

The old table included (Requires running with --enable_cameras) annotations on camera-based environments (e.g., Isaac-Cartpole-Camera-Showcase-*, Isaac-Repose-Cube-Shadow-Vision-Direct-v0). The auto-generated table removes these entirely without any alternative indication.

Users running these tasks without --enable_cameras will get non-obvious failures. Consider adding a footnote or a "Camera" workflow tag, or noting the requirement in the environ_docs.py row generation (perhaps from a special entry-point kwarg).


Finding 3: [kitless] Extra Includes PyOpenGL-accelerate — Platform Compatibility

Severity: Low | tools/wheel_builder/res/python_packages.toml

The new [kitless] extra pins PyOpenGL-accelerate==3.1.10. This package requires compilation (C extension) and can fail on systems without appropriate build tools. On Windows especially, pre-built wheels may not be available for all Python versions.

{ "kitless" = [
    ...
    "PyOpenGL-accelerate==3.1.10",
    ...
] }

Consider adding a note in the pip installation docs that this may require build tools, or make this optional (e.g., platform-specific markers).


Finding 4: selective_install.rst Is an Include Fragment — Verify .. _installation-selective-install: Label Placement

Severity: Low | docs/source/setup/installation/kitless_installation.rst

The cross-reference label .. _installation-selective-install: is defined in kitless_installation.rst just before the .. include:: include/selective_install.rst directive. Since the label lives outside the included content, it correctly anchors to the section. However, selective_install.rst starts with a ~~~~~~~~ heading (subtitle level). If it's ever included from a different context with different heading hierarchy, the heading levels could conflict.

This is fine for now but worth noting for future includes.


Finding 5: isaaclab_pip_installation.rst[all] Extra Description Ambiguity

Severity: Low | docs/source/setup/installation/isaaclab_pip_installation.rst

The extras table states:

all — RL frameworks only (SB3, SKRL, RSL-RL). Combine with isaacsim for a full install

But the source code in python_packages.toml shows [all] also includes onnxscript, tqdm, and rich — not just RL frameworks. The description "RL frameworks only" is slightly misleading. Consider: "RL frameworks and common training utilities."


Finding 6: Windows Quickstart Snippet Missing uv Install Step

Severity: Low | docs/_extensions/isaaclab_docs.py

The _quickstart_kitless function includes a curl ... | sh uv installation step for Linux but the Windows variant assumes uv is already installed. While uv installation differs by platform, new users on Windows may not have uv. A comment pointing to uv's install docs (e.g., :: Install uv: https://docs.astral.sh/uv/getting-started/installation/) would help.


Overall Assessment

This is a well-structured PR that significantly improves documentation maintainability:

  • ✅ Centralized branch management via Sphinx config
  • ✅ Auto-generated environment table with proper CI check flag (--check)
  • ✅ Good test coverage for the new tooling
  • ✅ Clean removal of stale compatibility warnings
  • ✅ New [kitless] pip extra properly separates Newton-only installs

The most impactful findings are #1 (algorithm labels) and #2 (camera annotations), which represent information loss in the migration from manual to auto-generated docs.

Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

📋 Code Review — PR #5879 (Updated for Latest Commit 7f50812)

This PR delivers substantial documentation infrastructure improvements: auto-generated environment tables, shared Sphinx directives for clone/install commands, and a new kitless pip extra. The third commit corrects the default branch from release/3.0.0-beta2 to develop and adds a README compatibility warning.


✅ What Works Well

  1. DRY documentation via Sphinx directivesisaaclab_docs.py eliminates copy-paste of clone/install commands across 6+ pages. Branch updates now happen in one place.
  2. Auto-generated environment tabletools/environ_docs.py with START-AUTO-GENERATED / END-AUTO-GENERATED markers makes the comprehensive table maintainable. The --check flag enables CI enforcement.
  3. Strong test coveragetools/test/test_environ_docs.py (246 lines) covers parsing, rendering, and patching logic.
  4. Changelog entry — Breaking changes to pip extras are clearly documented.
  5. Modular install documentation — Refactoring the selective install section into a standalone include (selective_install.rst) improves reusability.

🔍 Findings

Finding 1: Default Branch Inconsistency Between conf.py and README

Severity: Low | README.md + docs/conf.py

The README references release/3.0.0-beta2 in the version table while conf.py now defaults isaaclab_latest_branch to develop. This is intentional (the table tracks Isaac Sim compatibility) but could confuse contributors about which branch to clone.

Suggestion: Add a brief comment in the README version table clarifying that clone commands use develop (via Sphinx) while the table maps stable releases.


Finding 2: Algorithm Label Fallback in _infer_algorithm() May Lose Precision

Severity: Medium | tools/environ_docs.py

def _infer_algorithm(algo_suffix: str, entry_value: object, library: str) -> str:
    if not algo_suffix:
        if library == "rl_games" and isinstance(entry_value, str) and "vision" in entry_value.lower():
            return "VISION"
        return "PPO"

Tasks using LSTM or FF-specific configs (e.g., Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0 which previously listed rl_games (FF)) now show rl_games (PPO) because the algorithm suffix is empty and the entry-point string does not contain "vision". Similarly, Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0 previously listed rl_games (LSTM).

Suggestion: Extend the heuristic to detect "lstm" and "ff" in entry_value strings, or introduce a manual override map similar to RL_LIBRARY_OVERRIDES.


Finding 3: _domain_presets_for_docs Filtering Logic

Severity: Low | tools/environ_docs.py

The function filters domain presets that duplicate physics/renderer names, which is sensible. However, this means if a task has domain presets named identically to physics backends (but with different semantics), they would be silently omitted. The test test_format_presets_rst_hides_domain_names_duplicated_by_physics validates this is intentional, but a code comment explaining the rationale would help future maintainers.


Finding 4: Deleted pip_extras_note.rst Without Migration Note

Severity: Low | docs/source/setup/installation/include/pip_extras_note.rst

The old note explaining that [all] extras were needed for training scripts is deleted. The new documentation explains [kitless] and [isaacsim,all] well, but users who relied on the [rl,tasks] extras pattern from external links/bookmarks will get 404s. Consider adding a brief mention in the changelog or migration section.


Finding 5: rl_games Excluded from [kitless] and [all] Extras

Severity: Low | tools/wheel_builder/res/python_packages.toml

Both all and kitless extras have a commented-out rl-games entry with a TODO note about Python 3.11+ support. The pip installation docs correctly document this and direct users to install the fork manually. This is fine, but the TODO should track which upstream issue to watch.


Finding 6: exclude_patterns in conf.py Now Hides include/*

Severity: Low | docs/conf.py

"source/setup/installation/include/*",

This ensures include fragments are not built as standalone pages, which is correct. However, if a new fragment is added to include/ and the developer forgets to use .. include::, it will silently vanish from the build rather than raising an error.


Finding 7: Hardcoded Isaac Sim Version in Directives

Severity: Low | docs/_extensions/isaaclab_docs.py

The _quickstart_isaacsim function hardcodes isaacsim[all,extscache]==6.0.0 and torch==2.10.0. When Isaac Sim 6.1 releases, these will need manual updates. Consider extracting version pins to conf.py config values (similar to isaaclab_latest_branch) for single-source-of-truth versioning.


Summary

Category Count
Strengths noted 5
Medium severity 1
Low severity 6

Overall this is a well-structured documentation infrastructure PR that significantly reduces maintenance burden. The primary actionable item is the algorithm label precision loss (Finding 2) — it causes a regression in information accuracy for ~2-3 environment entries in the generated table compared to the previous hand-maintained version. The remaining findings are minor improvements for future maintainability.

CI checks are currently pending on the latest push.

Update (commit 3a75af7): Reviewed incremental changes since 7f50812.

Previous findings status:

  • Finding 3 (_domain_presets_for_docs filtering logic): Addressed — new _PHYSICS_BACKEND_MIRROR_NAMES frozenset makes the filtering explicit with clear documentation, and _physics_names_for_docs adds implicit PhysX detection. Well-tested with 3 new test cases.
  • Inline comment on isaaclab_docs.py:145 (Windows missing uv install): Partially addressed — both Windows snippets now include a :: Install uv: comment with a link to the uv installation docs. This is a batch comment (not executable), but it clearly guides users to install uv first.
  • Remaining findings (1, 2, 4–7 and inline comments on lines 103, 18, 245) were not addressed in this push — original comments still stand.

New changes reviewed (no new issues found):

  • _infer_implicit_physics_names() correctly detects implicit PhysX from default = PhysxCfg(...) fields
  • _physics_names_for_docs() integration into collect_environment_doc_rows is clean
  • Environment table updates in environments.rst (adding (direct only) qualifiers, newton_mjwarp for Digit, removing stale presets= entries) look accurate
  • New tests provide good coverage of the preset filtering edge cases

Update (commit 2b8740e): Formatting-only changes. No new issues.

Changes reviewed:

  • Import reordering in tools/environ_docs.py and tools/test/test_environ_docs.py
  • Refactored try/except to contextlib.suppress() pattern
  • Line wrapping adjustments

All previous findings remain unchanged — see above.

Update (commit 8e69441): Reviewed incremental changes since 2b8740e.

Previous findings status:

  • Finding 5 (rl_games excluded from extras): Fully addressed — rl-games is now included in [all], [kitless], and [rl-games] extras via the Python 3.11+ compatible fork. The manual install note in docs is correctly removed, and the kitless/all descriptions now list RL-Games. Test coverage added in test_wheel_builder_metadata.py.
  • Remaining findings (1, 2, 4, 6, 7 and inline comments on lines 103, 18, 245) were not addressed in this push — original comments still stand.

New changes reviewed (no new issues):

  • Digit environments correctly updated to remove newton_mjwarp physics support (closed-loop articulation incompatibility)
  • New .. note:: with cross-reference anchor known-issues-closed-loop-newton in environments.rst and matching label in issues.rst — clean Sphinx cross-referencing
  • python_packages.toml properly declares transitive dependencies (aiohttp, gym, standard-distutils) alongside the rl-games fork in all three aggregate extras (rl-games, all, kitless)
  • Changelog entry (rl-games-wheel-extra.rst) is well-formatted
  • Test refactor extracting _isaaclab_rl_optional_dependencies() helper is clean; new test_wheel_builder_rl_games_extra_matches_source_package validates consistency

Update (commit 6a30379): Reviewed incremental changes since 8e69441.

Previous findings status:

  • ⚠️ Finding 5 (rl_games in extras): Previously marked as fixed, but this commit intentionally reverts it — rl-games is now commented out from [all] extras with a TODO for when the upstream package supports Python 3.11. Docs correctly direct users to install the fork manually. This is a deliberate simplification, not a regression.
  • kitless extra removed entirely — All references to [kitless] have been removed from docs, tests, and python_packages.toml. The [all] extra now serves the "RL frameworks without Isaac Sim" use case. This is a clean simplification that reduces the install matrix.
  • Remaining findings (1, 2, 4, 6, 7 and inline comments on lines 103, 18, 245) were not addressed in this push — original comments still stand.

New changes reviewed (no new issues):

  • pip_extras_note.rst added as a reusable include — clean 4-line note
  • Docs now describe only two extras (isaacsim and all) — consistent throughout
  • rl_games manual install instructions added with correct fork URL and branch
  • Changelog entry (rl-games-wheel-extra.rst) correctly removed since the feature was reverted
  • CI install test updated from [kitless] to [all] — correct since [all] installs RL frameworks without requiring Isaac Sim
  • Test cleanup in test_wheel_builder_metadata.py removes kitless references and the rl-games test — consistent with the package changes

Comment thread docs/source/setup/installation/isaaclab_pip_installation.rst Outdated
Comment thread docs/source/setup/installation/isaaclab_pip_installation.rst Outdated
Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Signed-off-by: Kelly Guo <kellyg@nvidia.com>
@kellyguo11 kellyguo11 merged commit 4727a6b into isaac-sim:develop May 31, 2026
37 checks passed
kellyguo11 added a commit that referenced this pull request May 31, 2026
…nvs, shutdown error, mjcf fix (#5888)

# Description

Cherry-pick PRs from develop:

- #5866 
- #5879 
- #5882 
- #5884
- #5889

---------

Signed-off-by: Yize Wang <yizew@nvidia.com>
Signed-off-by: Kelly Guo <kellyg@nvidia.com>
Co-authored-by: YizeWang <37894497+YizeWang@users.noreply.github.com>
Co-authored-by: Yize Wang <yizew@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

1 participant