Imported from cmjang/mjlab-skillkit (
SKILL.md). Install upstream withnpx skills add cmjang/mjlab-skillkit. Copyright stays with the author.
mjlab-skillkit
Skill Suite
- IsaacLab Migration Skill (
migrate)- Use when there is an IsaacLab source project to port into mjlab-native code.
- Priority: preserve task behavior while translating APIs, config structure, and registration.
- mjlab Native Skill (
author)- Use when writing new mjlab-native tasks, configs, managers, sensors, terrain, RL wiring, or mesh workflows directly.
- Priority: follow mjlab public APIs, existing task patterns, and bundled references.
Previously branded as
isaaclab-to-mjlab.
Official Repositories
- Migration pattern (official):
https://github.com/mujocolab/anymal_c_velocity - mjlab repository (read-only reference):
https://github.com/mujocolab/mjlab - IsaacLab repository (source behavior reference):
https://github.com/isaac-sim/IsaacLab
Documentation Priority
- Use local
docs/in the target workspace as source of truth first (for examplemjlab/docsandIsaacLab/docs). - Read
references/docs-interface-diff.mdbefore implementation and follow the listed API differences. - Read
references/mjlab-api-pack.mdfor the quick API shortlist. - Read
references/mjlab-api-index.mdto choose the exact mjlab API domain files you need. - When writing new mjlab-native code, also read
references/mjlab-authoring-workflow.md. - For common coding requests, read
references/mjlab-authoring-recipes.mdand follow the matching minimal recipe instead of exploring broadly. - Then load only the matching
references/mjlab-api-*.mdandreferences/mjlab-mdp-builtins.mdfiles instead of reading the whole API surface at once. - Do not bulk-ingest the whole
mjlab/docstree or crawl large raw upstream doc sets into context; read only the exact page/signature/example you still need after using the bundled references. - Fall back to online docs only when local docs are missing or incomplete.
Reference Resolution Order
- Treat raw paths such as
mjlab/docs/source/...andmjlab/src/mjlab/...as preferred lookup targets only when a localmjlab/checkout exists. - If there is no local
mjlab/checkout, use this skill's bundled references first:references/mjlab-api-*.mdreferences/mjlab-mdp-builtins.mdreferences/mjlab-authoring-workflow.mdreferences/mjlab-authoring-recipes.md
- If the user provides another local mjlab repo path, use that path as the upstream reference root instead of assuming
./mjlab. - Use online docs / GitHub only as a last resort for exact upstream signatures or examples missing from both the local checkout and bundled references.
- Do not block
authormode just because the current workspace has nomjlab/directory.
Working Modes
migrate- Use when there is an IsaacLab source task/project to port.
- Goal: preserve behavior while converting to mjlab-native code.
author- Use when writing new mjlab-native code directly.
- Goal: build tasks/components/configs/scripts that already follow mjlab docs and examples.
If the user does not specify a mode, infer it from the request:
- mentions IsaacLab/source parity/porting ->
migrate - mentions write/build/create mjlab task/config/component ->
author
Layout Mode (migration only)
preserve-layout:- Keep original repository structure and module paths.
- Only migrate API/config semantics to mjlab.
mjlab-layout:- Reorganize into
anymal_c_velocitystyle task package layout (for examplesrc/<task_pkg>/...). - Use
mjlab.tasksentry points andregister_mjlab_task(...)for registration.
- Reorganize into
- If user does not specify, ask first:
Do you want to keep the original project layout, or convert directly to mjlab layout?
Shared Workflow
- Confirm whether the task is
migrateorauthor. - Resolve references in this order: target repo -> local
mjlab/checkout if present -> bundled skill references -> online docs only if still blocked. - Read
references/mjlab-api-pack.mdand lock target APIs. - Read
references/mjlab-api-index.md, then load only the relevant module references:references/mjlab-api-envs.mdreferences/mjlab-api-scene.mdreferences/mjlab-api-sim.mdreferences/mjlab-api-entity.mdreferences/mjlab-api-actuator.mdreferences/mjlab-api-sensor.mdreferences/mjlab-api-managers.mdreferences/mjlab-mdp-builtins.mdreferences/mjlab-api-terrains.mdreferences/mjlab-api-rl.mdreferences/mjlab-api-viewer.mdreferences/mjlab-api-tasks.md
- If the request involves importing STL / OBJ / other mesh assets, also read
references/mjlab-mesh-import-guidelines.md. - Reuse native mjlab patterns from existing tasks in the target repo first, then from a local
mjlab/checkout if present, then from bundled references.
Migration Workflow
- Confirm migration scope, source path, and target path before editing.
- Confirm layout mode:
preserve-layoutormjlab-layout. - Read
references/migration-rules.mdand enforce all hard constraints. - Read
references/docs-interface-diff.mdfor API differences from local docs. - Read
references/official-migrating-from-isaaclab.mdfor boundary notes. - Read
references/migration-gotchas.mdfor the compressed high-value pitfalls list. - If the task is multi-variant / command-heavy / play-eval sensitive, first read
references/complex-task-migration-playbook.md. - If the task is motion tracking / whole-body tracking / reference-motion tracking, then read
references/tracking-case-study.mdas a concrete example, not as the only migration pattern. - If the target task family has adjacent tests or registry files, treat them as invariants before editing (for example task
__init__.pyregistration files and same-family tests). - For complex tasks, first write a variant matrix for base / play / eval / no-state-estimation / low-freq / robot-specific style variants before migrating code.
- For
mjlab-layout, align project packaging/registration withanymal_c_velocity. - Read
references/mapping.mdwhile replacing imports/fields/term APIs. - Read
references/patterns.mdwhile implementing EnvCfg/SceneCfg/manager structures. - If importing STL / OBJ / mesh assets, read
references/mjlab-mesh-import-guidelines.mdand explicitly separate visual mesh from collision representation. - Run
references/checklist.mdvalidation before completion.
Authoring Workflow
- Read
references/mjlab-authoring-workflow.md. - Read
references/mjlab-authoring-recipes.md. - Identify the artifact type:
- new task package
- new
EnvCfgor scene - new manager terms / MDP helpers
- new sensors / terrain / RL config / registration
- Choose the closest example before writing:
- target-repo example first
- then local
mjlab/example if available - then bundled skill references if no local
mjlab/checkout exists - velocity-style ->
mjlab/src/mjlab/tasks/velocity/ - tracking-style ->
mjlab/src/mjlab/tasks/tracking/
- Build the config in mjlab-native order:
- scene / sensors
- observations
- actions
- commands
- events
- rewards
- terminations
- curriculum / metrics
- simulation / viewer / episode settings
- Prefer existing
mjlab.envs.mdphelpers before adding custom terms. - Prefer the smallest edit surface that satisfies the request:
- add a term before creating a new subsystem
- modify robot-specific cfg before cloning a base factory
- reuse an existing command/reward/event helper before inventing a new class
- If creating a new task, add RL config plus
register_mjlab_task(...). - Validate syntax and config wiring before completion.
Authoring Request Routing
- “Add a reward / penalty” ->
references/mjlab-authoring-recipes.md+references/mjlab-mdp-builtins.md - “Add an observation / actor-critic input” ->
references/mjlab-authoring-recipes.md+references/mjlab-api-managers.md - “Add contact / raycast / camera” ->
references/mjlab-authoring-recipes.md+references/mjlab-api-sensor.md - “Add command / curriculum / reset / DR” ->
references/mjlab-authoring-recipes.md+references/mjlab-mdp-builtins.md - “Create a new task / new robot env cfg / register a task” ->
references/mjlab-authoring-recipes.md+references/mjlab-api-tasks.md+references/mjlab-api-rl.md - “Import STL / OBJ / mesh assets” ->
references/mjlab-mesh-import-guidelines.md+references/mjlab-api-entity.md - “Unsure which file to edit” -> first read the “file placement” section in
references/mjlab-authoring-recipes.md
Shared Constraints
- Final implementation must be mjlab-native.
- Do not add arbitrary abstractions (extra inheritance/wrappers/major restructuring).
- Do not modify
mujocolab/mjlabsource code. - Manager configuration must be dict-based (
dict[str, XxxTermCfg]), not manager@configclass. - Explicitly ban bridge helpers:
manager_terms_to_dictAttrDictobservation_terms_from_class
- No compatibility layer / adapter shim / transition wrappers.
Migration Constraints
- Preserve behavior equivalence for rewards, observations, actions, commands, reset/events, terminations, and curriculum.
- Keep function boundaries, call order, and config semantics aligned with source unless mjlab API differences require minimal internal changes.
- Prioritize functional/semantic equivalence over literal code-shape equivalence; if mjlab API constraints prevent a one-to-one implementation, use the smallest mjlab-native adaptation that preserves behavior.
- Do not drop source logic steps, config items, or execution order.
- Remove Isaac/IsaacLab API residue (imports, symbols, stale comments, legacy fields).
- Keep source-specific semantic names (for example
hack_generator) unless forced field mapping is required. - Do not keep IsaacLab/Omniverse extension scaffolding by default (
ui_extension_example.py,config/extension.toml,omni.*extension files). - Do not add new
raiseorassertif the source task has none, unless a minimal check is explicitly required by mjlab/target API semantics for correctness. - Do not add fallback logic if the source task has none (no broad
try/except, nohasattr-style fallback branches, no silent degradations), unless a minimal guard is explicitly required by mjlab/target API semantics for correctness. - Keep original comments/TODOs. If wording must change, only do minimal mjlab terminology updates while preserving meaning.
Authoring Constraints
- Prefer public
mjlab.*modules and local task examples before inventing new helper layers. - Prefer task factories such as
make_xxx_env_cfg()when a reusable base pattern is helpful. - Reuse
mjlab.envs.mdphelper functions/configs whenever they already express the needed behavior. - Keep new code consistent with existing mjlab task structure, config naming, and registration style.
Execution Notes
- In
migratemode, prefer one-to-one migration, not refactor-oriented rewrite. - In
authormode, prefer nearest mjlab-native example, not a framework-agnostic rewrite. - For API mismatch, use minimal mjlab-native adaptation instead of bridge code.
- When the question is “which mjlab API should replace this IsaacLab piece?”, choose the target module from
references/mjlab-api-index.mdfirst, then read only the matching reference file. - For
mjlab-layout, preferanymal_c_velocitypackaging pattern: standalone task package +mjlab.tasksentry point +register_mjlab_task. - For
preserve-layout, keep directory structure and only migrate API/config/registration wiring. - Managers should be generated via dict factory functions and initialized with
field(default_factory=make_xxx)when dataclass config style is used. - If inherited config chains are not supported in target style, flatten them via explicit dict merge/override.
- Follow target project registration conventions (prefer project-level registrar; use
gym.registeronly when target project explicitly requires it).