creature-lab 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- creature_lab-0.3.0/.claude/settings.json +8 -0
- creature_lab-0.3.0/.copier-answers.launcher-kit.yml +3 -0
- creature_lab-0.3.0/.dockerignore +9 -0
- creature_lab-0.3.0/.gitattributes +51 -0
- creature_lab-0.3.0/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- creature_lab-0.3.0/.github/ISSUE_TEMPLATE/creature_submission.md +27 -0
- creature_lab-0.3.0/.github/ISSUE_TEMPLATE/docs_improvement.md +16 -0
- creature_lab-0.3.0/.github/ISSUE_TEMPLATE/task_proposal.md +26 -0
- creature_lab-0.3.0/.github/dependabot.yml +28 -0
- creature_lab-0.3.0/.github/workflows/ci.yml +238 -0
- creature_lab-0.3.0/.github/workflows/dependabot-automerge.yml +39 -0
- creature_lab-0.3.0/.github/workflows/release.yml +70 -0
- creature_lab-0.3.0/.github/workflows/scorecard.yml +30 -0
- creature_lab-0.3.0/.github/zizmor.yml +14 -0
- creature_lab-0.3.0/.gitignore +37 -0
- creature_lab-0.3.0/AGENTS.md +155 -0
- creature_lab-0.3.0/CHANGELOG.md +416 -0
- creature_lab-0.3.0/CITATION.cff +10 -0
- creature_lab-0.3.0/CLAUDE.md +9 -0
- creature_lab-0.3.0/CONTRIBUTING.md +70 -0
- creature_lab-0.3.0/Dockerfile +24 -0
- creature_lab-0.3.0/LICENSE +201 -0
- creature_lab-0.3.0/PKG-INFO +370 -0
- creature_lab-0.3.0/README.md +99 -0
- creature_lab-0.3.0/SECURITY.md +61 -0
- creature_lab-0.3.0/compose.yaml +17 -0
- creature_lab-0.3.0/creature_lab/__init__.py +18 -0
- creature_lab-0.3.0/creature_lab/agents/__init__.py +5 -0
- creature_lab-0.3.0/creature_lab/agents/baseline.py +53 -0
- creature_lab-0.3.0/creature_lab/agents/llm.py +33 -0
- creature_lab-0.3.0/creature_lab/agents/loop.py +112 -0
- creature_lab-0.3.0/creature_lab/agents/prompts.py +63 -0
- creature_lab-0.3.0/creature_lab/agents/tools.py +101 -0
- creature_lab-0.3.0/creature_lab/autopsy.py +376 -0
- creature_lab-0.3.0/creature_lab/backends/__init__.py +1 -0
- creature_lab-0.3.0/creature_lab/backends/base.py +25 -0
- creature_lab-0.3.0/creature_lab/backends/mujoco_backend.py +253 -0
- creature_lab-0.3.0/creature_lab/backends/pybullet_backend.py +573 -0
- creature_lab-0.3.0/creature_lab/cli.py +3317 -0
- creature_lab-0.3.0/creature_lab/controllers/__init__.py +1 -0
- creature_lab-0.3.0/creature_lab/controllers/cpg.py +83 -0
- creature_lab-0.3.0/creature_lab/controllers/factory.py +208 -0
- creature_lab-0.3.0/creature_lab/controllers/pid.py +33 -0
- creature_lab-0.3.0/creature_lab/controllers/policy.py +91 -0
- creature_lab-0.3.0/creature_lab/controllers/pose_seq.py +38 -0
- creature_lab-0.3.0/creature_lab/controllers/posture.py +125 -0
- creature_lab-0.3.0/creature_lab/controllers/sinusoid.py +20 -0
- creature_lab-0.3.0/creature_lab/controllers/target_seek.py +128 -0
- creature_lab-0.3.0/creature_lab/diagnosis.py +435 -0
- creature_lab-0.3.0/creature_lab/diagnostics.py +261 -0
- creature_lab-0.3.0/creature_lab/editor/__init__.py +5 -0
- creature_lab-0.3.0/creature_lab/editor/controls.py +2495 -0
- creature_lab-0.3.0/creature_lab/editor/history.py +85 -0
- creature_lab-0.3.0/creature_lab/editor/jobs.py +176 -0
- creature_lab-0.3.0/creature_lab/editor/labels.py +91 -0
- creature_lab-0.3.0/creature_lab/editor/live.py +672 -0
- creature_lab-0.3.0/creature_lab/editor/playback.py +98 -0
- creature_lab-0.3.0/creature_lab/editor/presets.py +282 -0
- creature_lab-0.3.0/creature_lab/editor/robot_panel.py +288 -0
- creature_lab-0.3.0/creature_lab/editor/robot_stage.py +181 -0
- creature_lab-0.3.0/creature_lab/editor/session.py +1413 -0
- creature_lab-0.3.0/creature_lab/env.py +274 -0
- creature_lab-0.3.0/creature_lab/evolve.py +394 -0
- creature_lab-0.3.0/creature_lab/export/__init__.py +9 -0
- creature_lab-0.3.0/creature_lab/export/mjcf.py +199 -0
- creature_lab-0.3.0/creature_lab/export/urdf.py +152 -0
- creature_lab-0.3.0/creature_lab/export/urdf_import.py +142 -0
- creature_lab-0.3.0/creature_lab/exporting.py +360 -0
- creature_lab-0.3.0/creature_lab/failure_zoo.py +98 -0
- creature_lab-0.3.0/creature_lab/hashing.py +19 -0
- creature_lab-0.3.0/creature_lab/io_utils.py +37 -0
- creature_lab-0.3.0/creature_lab/library.py +311 -0
- creature_lab-0.3.0/creature_lab/qualification.py +299 -0
- creature_lab-0.3.0/creature_lab/reports.py +428 -0
- creature_lab-0.3.0/creature_lab/reports_html.py +549 -0
- creature_lab-0.3.0/creature_lab/rl/__init__.py +9 -0
- creature_lab-0.3.0/creature_lab/rl/gym_env.py +74 -0
- creature_lab-0.3.0/creature_lab/rl/train.py +148 -0
- creature_lab-0.3.0/creature_lab/robots/__init__.py +6 -0
- creature_lab-0.3.0/creature_lab/robots/actuator.py +115 -0
- creature_lab-0.3.0/creature_lab/robots/analysis.py +282 -0
- creature_lab-0.3.0/creature_lab/robots/api.py +30 -0
- creature_lab-0.3.0/creature_lab/robots/card.py +182 -0
- creature_lab-0.3.0/creature_lab/robots/catalog.py +153 -0
- creature_lab-0.3.0/creature_lab/robots/checkup.py +216 -0
- creature_lab-0.3.0/creature_lab/robots/cli.py +275 -0
- creature_lab-0.3.0/creature_lab/robots/compare.py +229 -0
- creature_lab-0.3.0/creature_lab/robots/data/UNITREE_RL_GYM_LICENSE.txt +23 -0
- creature_lab-0.3.0/creature_lab/robots/data/microduck.json +253 -0
- creature_lab-0.3.0/creature_lab/robots/data/unitree_g1.json +174 -0
- creature_lab-0.3.0/creature_lab/robots/data/unitree_g1_policy.npz +0 -0
- creature_lab-0.3.0/creature_lab/robots/fetch.py +115 -0
- creature_lab-0.3.0/creature_lab/robots/film.py +78 -0
- creature_lab-0.3.0/creature_lab/robots/g1.py +103 -0
- creature_lab-0.3.0/creature_lab/robots/microduck.py +153 -0
- creature_lab-0.3.0/creature_lab/robots/overlay.py +384 -0
- creature_lab-0.3.0/creature_lab/robots/policies.py +81 -0
- creature_lab-0.3.0/creature_lab/robots/render.py +236 -0
- creature_lab-0.3.0/creature_lab/robots/report.py +307 -0
- creature_lab-0.3.0/creature_lab/robots/rollout.py +185 -0
- creature_lab-0.3.0/creature_lab/robots/scene.py +53 -0
- creature_lab-0.3.0/creature_lab/robots/story.py +485 -0
- creature_lab-0.3.0/creature_lab/robots/types.py +120 -0
- creature_lab-0.3.0/creature_lab/robots/video.py +277 -0
- creature_lab-0.3.0/creature_lab/robots/visual.py +41 -0
- creature_lab-0.3.0/creature_lab/robustness.py +165 -0
- creature_lab-0.3.0/creature_lab/runs.py +242 -0
- creature_lab-0.3.0/creature_lab/scaffold/__init__.py +29 -0
- creature_lab-0.3.0/creature_lab/scaffold/humanoid.py +227 -0
- creature_lab-0.3.0/creature_lab/scaffold/legged.py +144 -0
- creature_lab-0.3.0/creature_lab/scaffold/mirror.py +90 -0
- creature_lab-0.3.0/creature_lab/scaffold/worm.py +80 -0
- creature_lab-0.3.0/creature_lab/schema/__init__.py +79 -0
- creature_lab-0.3.0/creature_lab/schema/agent.py +28 -0
- creature_lab-0.3.0/creature_lab/schema/base.py +33 -0
- creature_lab-0.3.0/creature_lab/schema/control.py +49 -0
- creature_lab-0.3.0/creature_lab/schema/controller.py +208 -0
- creature_lab-0.3.0/creature_lab/schema/creature.py +235 -0
- creature_lab-0.3.0/creature_lab/schema/summary.py +30 -0
- creature_lab-0.3.0/creature_lab/schema/task.py +137 -0
- creature_lab-0.3.0/creature_lab/schema/trace.py +110 -0
- creature_lab-0.3.0/creature_lab/scoring.py +56 -0
- creature_lab-0.3.0/creature_lab/terrain.py +172 -0
- creature_lab-0.3.0/creature_lab/validation.py +103 -0
- creature_lab-0.3.0/creature_lab/viewers/__init__.py +1 -0
- creature_lab-0.3.0/creature_lab/viewers/overlays.py +71 -0
- creature_lab-0.3.0/creature_lab/viewers/plotting.py +43 -0
- creature_lab-0.3.0/creature_lab/viewers/video_exporter.py +26 -0
- creature_lab-0.3.0/creature_lab/viewers/viser_viewer.py +489 -0
- creature_lab-0.3.0/creature_lab/web/__init__.py +6 -0
- creature_lab-0.3.0/creature_lab/web/builder.py +91 -0
- creature_lab-0.3.0/creature_lab/web/creatures.py +445 -0
- creature_lab-0.3.0/creature_lab/web/jobs.py +172 -0
- creature_lab-0.3.0/creature_lab/web/library.py +254 -0
- creature_lab-0.3.0/creature_lab/web/scene.py +112 -0
- creature_lab-0.3.0/creature_lab/web/server.py +394 -0
- creature_lab-0.3.0/creature_lab/web/static/assets/index-CVJ_iiu_.css +1 -0
- creature_lab-0.3.0/creature_lab/web/static/assets/index-D-2y8anQ.js +4233 -0
- creature_lab-0.3.0/creature_lab/web/static/clips/unitree_g1.webp +0 -0
- creature_lab-0.3.0/creature_lab/web/static/index.html +16 -0
- creature_lab-0.3.0/creature_lab/web/thumbs.py +120 -0
- creature_lab-0.3.0/creature_lab/web/whatif.py +149 -0
- creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/baselines/recover.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/baselines/recover.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/creature.json +205 -0
- creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/tasks/recover.json +8 -0
- creature_lab-0.3.0/creature_lab/zoo/hexapod/baselines/crawl_forward.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/hexapod/baselines/crawl_forward.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/hexapod/controller.json +42 -0
- creature_lab-0.3.0/creature_lab/zoo/hexapod/creature.json +295 -0
- creature_lab-0.3.0/creature_lab/zoo/hexapod/tasks/crawl_forward.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/reach.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/reach.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/walk.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/walk.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/controller.json +18 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/creature.json +628 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/tasks/reach.json +8 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/tasks/walk.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/balance.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/balance.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/push_recovery.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/push_recovery.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/walk.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/walk.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/creature.json +434 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/balance.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/push_recovery.json +8 -0
- creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/walk.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/crawl_forward.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/crawl_forward.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/gap_cross.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/gap_cross.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/low_friction_crawl.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/push_recovery.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/reach_target.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/reach_target.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/slope_climb.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/slope_climb.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/stability_hold.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/step_over.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/step_over.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/controller.json +30 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/creature.json +205 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/crawl_forward.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/gap_cross.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/low_friction_crawl.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/push_recovery.json +8 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/reach_target.json +8 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/slope_climb.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/stability_hold.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/step_over.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/tripod/baselines/crawl_forward.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/tripod/baselines/crawl_forward.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/tripod/controller.json +24 -0
- creature_lab-0.3.0/creature_lab/zoo/tripod/creature.json +145 -0
- creature_lab-0.3.0/creature_lab/zoo/tripod/tasks/crawl_forward.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo/worm/baselines/crawl_forward.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/worm/baselines/crawl_forward.mujoco.json +14 -0
- creature_lab-0.3.0/creature_lab/zoo/worm/controller.json +36 -0
- creature_lab-0.3.0/creature_lab/zoo/worm/creature.json +247 -0
- creature_lab-0.3.0/creature_lab/zoo/worm/tasks/crawl_forward.json +7 -0
- creature_lab-0.3.0/creature_lab/zoo.py +171 -0
- creature_lab-0.3.0/docs/BUILD_EDITOR.md +330 -0
- creature_lab-0.3.0/docs/CLI_REFERENCE.md +253 -0
- creature_lab-0.3.0/docs/CONCEPTS.md +54 -0
- creature_lab-0.3.0/docs/CREATURE_SPEC.md +87 -0
- creature_lab-0.3.0/docs/FAILURE_LAB.md +57 -0
- creature_lab-0.3.0/docs/GAIT_LESSON.md +36 -0
- creature_lab-0.3.0/docs/GETTING_STARTED.md +187 -0
- creature_lab-0.3.0/docs/KNOWN_ISSUES.md +44 -0
- creature_lab-0.3.0/docs/README.md +30 -0
- creature_lab-0.3.0/docs/ROBOT_CHECKUP.md +183 -0
- creature_lab-0.3.0/docs/RUN_ARTIFACTS.md +75 -0
- creature_lab-0.3.0/docs/TASK_SPEC.md +86 -0
- creature_lab-0.3.0/docs/WEB_APP.md +109 -0
- creature_lab-0.3.0/docs/ZOO.md +114 -0
- creature_lab-0.3.0/docs/archive/ANALYSIS.md +237 -0
- creature_lab-0.3.0/docs/archive/IMPROVEMENT_PLAN.md +819 -0
- creature_lab-0.3.0/docs/archive/IMPROVEMENT_PLAN_2026.md +363 -0
- creature_lab-0.3.0/docs/archive/MVP_PLAN.md +553 -0
- creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_FINAL_ROADMAP.md +279 -0
- creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_STREAMLINED_CONTROLLER_ROADMAP.md +1539 -0
- creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_UI_UX_FINAL_PLAN.md +594 -0
- creature_lab-0.3.0/docs/assets/MEDIA_LICENSES.md +37 -0
- creature_lab-0.3.0/docs/assets/app-build.webp +0 -0
- creature_lab-0.3.0/docs/assets/app-compare.webp +0 -0
- creature_lab-0.3.0/docs/assets/app-microduck.webp +0 -0
- creature_lab-0.3.0/docs/assets/checkup-microduck.webp +0 -0
- creature_lab-0.3.0/docs/assets/checkup-unitree-g1.webp +0 -0
- creature_lab-0.3.0/docs/assets/creature-lab-logo.svg +34 -0
- creature_lab-0.3.0/docs/assets/quickstart.ipynb +191 -0
- creature_lab-0.3.0/docs/assets/social-preview.png +0 -0
- creature_lab-0.3.0/docs/project/GRAND_PLAN.md +436 -0
- creature_lab-0.3.0/docs/project/RELEASING.md +79 -0
- creature_lab-0.3.0/docs/project/ROADMAP.md +27 -0
- creature_lab-0.3.0/examples/README.md +43 -0
- creature_lab-0.3.0/examples/crawl_forward.json +7 -0
- creature_lab-0.3.0/examples/quadruped.json +22 -0
- creature_lab-0.3.0/examples/reach_target.json +8 -0
- creature_lab-0.3.0/examples/recover_after_damage.json +8 -0
- creature_lab-0.3.0/examples/tripod.json +19 -0
- creature_lab-0.3.0/examples/worm.json +22 -0
- creature_lab-0.3.0/pyproject.toml +143 -0
- creature_lab-0.3.0/run.bat +8 -0
- creature_lab-0.3.0/run.command +9 -0
- creature_lab-0.3.0/run.ps1 +97 -0
- creature_lab-0.3.0/run.sh +87 -0
- creature_lab-0.3.0/scripts/_process_utils.py +59 -0
- creature_lab-0.3.0/scripts/browser_smoke.py +220 -0
- creature_lab-0.3.0/scripts/install-utils.ps1 +171 -0
- creature_lab-0.3.0/scripts/install-utils.sh +134 -0
- creature_lab-0.3.0/scripts/media/compose_app.py +459 -0
- creature_lab-0.3.0/scripts/media/record_app.py +337 -0
- creature_lab-0.3.0/scripts/start.ps1 +47 -0
- creature_lab-0.3.0/scripts/start.py +617 -0
- creature_lab-0.3.0/scripts/start.sh +24 -0
- creature_lab-0.3.0/scripts/test-launcher-helpers.ps1 +51 -0
- creature_lab-0.3.0/tests/robot_helpers.py +150 -0
- creature_lab-0.3.0/tests/test_agent_schema.py +31 -0
- creature_lab-0.3.0/tests/test_agents.py +186 -0
- creature_lab-0.3.0/tests/test_app_command.py +77 -0
- creature_lab-0.3.0/tests/test_autopsy.py +169 -0
- creature_lab-0.3.0/tests/test_backend_smoke.py +237 -0
- creature_lab-0.3.0/tests/test_cli.py +1142 -0
- creature_lab-0.3.0/tests/test_controller_factory.py +264 -0
- creature_lab-0.3.0/tests/test_controller_policy.py +116 -0
- creature_lab-0.3.0/tests/test_controller_schema.py +174 -0
- creature_lab-0.3.0/tests/test_controllers.py +235 -0
- creature_lab-0.3.0/tests/test_creature_schema.py +185 -0
- creature_lab-0.3.0/tests/test_diagnosis.py +238 -0
- creature_lab-0.3.0/tests/test_diagnostics.py +227 -0
- creature_lab-0.3.0/tests/test_editor.py +339 -0
- creature_lab-0.3.0/tests/test_editor_controls.py +1006 -0
- creature_lab-0.3.0/tests/test_editor_history.py +291 -0
- creature_lab-0.3.0/tests/test_editor_jobs.py +150 -0
- creature_lab-0.3.0/tests/test_editor_labels.py +59 -0
- creature_lab-0.3.0/tests/test_editor_lessons.py +90 -0
- creature_lab-0.3.0/tests/test_editor_playback.py +154 -0
- creature_lab-0.3.0/tests/test_editor_session_phase2.py +221 -0
- creature_lab-0.3.0/tests/test_end_to_end.py +236 -0
- creature_lab-0.3.0/tests/test_env.py +168 -0
- creature_lab-0.3.0/tests/test_evolve.py +108 -0
- creature_lab-0.3.0/tests/test_evolve_strategies.py +431 -0
- creature_lab-0.3.0/tests/test_export.py +206 -0
- creature_lab-0.3.0/tests/test_exporting.py +233 -0
- creature_lab-0.3.0/tests/test_hashing.py +46 -0
- creature_lab-0.3.0/tests/test_humanoid.py +291 -0
- creature_lab-0.3.0/tests/test_launcher.py +160 -0
- creature_lab-0.3.0/tests/test_library.py +38 -0
- creature_lab-0.3.0/tests/test_mjcf_mujoco.py +327 -0
- creature_lab-0.3.0/tests/test_network_binding.py +200 -0
- creature_lab-0.3.0/tests/test_optional_imports.py +29 -0
- creature_lab-0.3.0/tests/test_overlays.py +106 -0
- creature_lab-0.3.0/tests/test_posture.py +159 -0
- creature_lab-0.3.0/tests/test_productization.py +317 -0
- creature_lab-0.3.0/tests/test_qualification.py +259 -0
- creature_lab-0.3.0/tests/test_reports.py +202 -0
- creature_lab-0.3.0/tests/test_reports_html.py +186 -0
- creature_lab-0.3.0/tests/test_rl_gym_env.py +89 -0
- creature_lab-0.3.0/tests/test_rl_train.py +90 -0
- creature_lab-0.3.0/tests/test_robot_actuator.py +52 -0
- creature_lab-0.3.0/tests/test_robot_analysis.py +142 -0
- creature_lab-0.3.0/tests/test_robot_catalog.py +67 -0
- creature_lab-0.3.0/tests/test_robot_cli.py +43 -0
- creature_lab-0.3.0/tests/test_robot_compare.py +219 -0
- creature_lab-0.3.0/tests/test_robot_fetch.py +79 -0
- creature_lab-0.3.0/tests/test_robot_footprint.py +42 -0
- creature_lab-0.3.0/tests/test_robot_media.py +35 -0
- creature_lab-0.3.0/tests/test_robot_panel.py +266 -0
- creature_lab-0.3.0/tests/test_robot_report.py +51 -0
- creature_lab-0.3.0/tests/test_robot_simulation.py +119 -0
- creature_lab-0.3.0/tests/test_robot_stage.py +160 -0
- creature_lab-0.3.0/tests/test_robustness.py +207 -0
- creature_lab-0.3.0/tests/test_runs.py +212 -0
- creature_lab-0.3.0/tests/test_scaffold.py +105 -0
- creature_lab-0.3.0/tests/test_scoring.py +69 -0
- creature_lab-0.3.0/tests/test_task_schema.py +50 -0
- creature_lab-0.3.0/tests/test_terrain.py +143 -0
- creature_lab-0.3.0/tests/test_trace_schema.py +104 -0
- creature_lab-0.3.0/tests/test_urdf_export.py +67 -0
- creature_lab-0.3.0/tests/test_validation.py +114 -0
- creature_lab-0.3.0/tests/test_viewer.py +282 -0
- creature_lab-0.3.0/tests/test_web_creatures.py +120 -0
- creature_lab-0.3.0/tests/test_web_server.py +692 -0
- creature_lab-0.3.0/tests/test_zoo.py +260 -0
- creature_lab-0.3.0/uv.lock +3768 -0
- creature_lab-0.3.0/web-ui/README.md +44 -0
- creature_lab-0.3.0/web-ui/index.html +15 -0
- creature_lab-0.3.0/web-ui/package-lock.json +1179 -0
- creature_lab-0.3.0/web-ui/package.json +27 -0
- creature_lab-0.3.0/web-ui/public/clips/unitree_g1.webp +0 -0
- creature_lab-0.3.0/web-ui/src/App.tsx +639 -0
- creature_lab-0.3.0/web-ui/src/api.ts +78 -0
- creature_lab-0.3.0/web-ui/src/clip.ts +90 -0
- creature_lab-0.3.0/web-ui/src/components/Editor.tsx +249 -0
- creature_lab-0.3.0/web-ui/src/components/Inspector.tsx +255 -0
- creature_lab-0.3.0/web-ui/src/components/Library.tsx +155 -0
- creature_lab-0.3.0/web-ui/src/components/LicenseDialog.tsx +64 -0
- creature_lab-0.3.0/web-ui/src/components/Stage.tsx +274 -0
- creature_lab-0.3.0/web-ui/src/components/Timeline.tsx +175 -0
- creature_lab-0.3.0/web-ui/src/decode.ts +70 -0
- creature_lab-0.3.0/web-ui/src/format.ts +157 -0
- creature_lab-0.3.0/web-ui/src/geometry.ts +46 -0
- creature_lab-0.3.0/web-ui/src/logic.test.ts +346 -0
- creature_lab-0.3.0/web-ui/src/main.tsx +10 -0
- creature_lab-0.3.0/web-ui/src/playback.ts +117 -0
- creature_lab-0.3.0/web-ui/src/prefs.ts +13 -0
- creature_lab-0.3.0/web-ui/src/robotView.ts +532 -0
- creature_lab-0.3.0/web-ui/src/styles.css +1354 -0
- creature_lab-0.3.0/web-ui/src/types.ts +200 -0
- creature_lab-0.3.0/web-ui/src/url.ts +40 -0
- creature_lab-0.3.0/web-ui/tsconfig.json +18 -0
- creature_lab-0.3.0/web-ui/vite.config.ts +19 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Line endings, pinned per file type rather than left to each contributor's
|
|
2
|
+
# core.autocrlf setting.
|
|
3
|
+
#
|
|
4
|
+
# Nothing is broken today - the blobs in this repository are already LF, and a
|
|
5
|
+
# clone on Linux or macOS gets LF. But nothing enforced that: a contributor on
|
|
6
|
+
# Windows with core.autocrlf=false commits exactly what is in their editor, and
|
|
7
|
+
# a shell script committed with CRLF fails on the first line of real work with
|
|
8
|
+
#
|
|
9
|
+
# set: pipefail: invalid option name
|
|
10
|
+
#
|
|
11
|
+
# which reads as a broken installer rather than a line-ending problem. This file
|
|
12
|
+
# makes the outcome independent of who committed it.
|
|
13
|
+
|
|
14
|
+
# Anything Git decides is text gets LF in the repository.
|
|
15
|
+
* text=auto
|
|
16
|
+
|
|
17
|
+
# Must be LF wherever they are checked out, because they run on Linux even when
|
|
18
|
+
# they were written on Windows.
|
|
19
|
+
*.sh text eol=lf
|
|
20
|
+
*.command text eol=lf
|
|
21
|
+
Dockerfile text eol=lf
|
|
22
|
+
*.yml text eol=lf
|
|
23
|
+
*.yaml text eol=lf
|
|
24
|
+
|
|
25
|
+
# Windows entry points, which cmd.exe and PowerShell expect to find as CRLF.
|
|
26
|
+
*.bat text eol=crlf
|
|
27
|
+
*.cmd text eol=crlf
|
|
28
|
+
*.ps1 text eol=crlf
|
|
29
|
+
|
|
30
|
+
# Never touched: conversion corrupts these.
|
|
31
|
+
*.png binary
|
|
32
|
+
*.gif binary
|
|
33
|
+
*.webp binary
|
|
34
|
+
*.jpg binary
|
|
35
|
+
*.ico binary
|
|
36
|
+
*.woff binary
|
|
37
|
+
*.woff2 binary
|
|
38
|
+
*.ttf binary
|
|
39
|
+
*.msi binary
|
|
40
|
+
*.exe binary
|
|
41
|
+
*.pdf binary
|
|
42
|
+
|
|
43
|
+
# The front end is built into a committed bundle that CI rebuilds on Linux and compares byte for
|
|
44
|
+
# byte. Its sources must be LF on every machine: Vite copies index.html's line endings, so a
|
|
45
|
+
# Windows checkout with CRLF produced a bundle a few bytes different from CI's.
|
|
46
|
+
web-ui/index.html text eol=lf
|
|
47
|
+
web-ui/src/** text eol=lf
|
|
48
|
+
|
|
49
|
+
# The built bundle is generated: never convert its line endings, so a Windows checkout, a Linux
|
|
50
|
+
# checkout and CI's rebuild are the same bytes.
|
|
51
|
+
creature_lab/web/static/** -text
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a crash, incorrect run artifact, or broken CLI workflow
|
|
4
|
+
title: "Bug: "
|
|
5
|
+
labels: bug
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What happened?
|
|
9
|
+
|
|
10
|
+
## Command
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Expected behavior
|
|
17
|
+
|
|
18
|
+
## Environment
|
|
19
|
+
|
|
20
|
+
- OS:
|
|
21
|
+
- Python:
|
|
22
|
+
- Creature Lab version:
|
|
23
|
+
- Backend: pybullet / mujoco / none
|
|
24
|
+
|
|
25
|
+
## Artifacts
|
|
26
|
+
|
|
27
|
+
Prefer a verified design pack—it contains the exact creature, task, controller, trace, and hashes:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
creature-lab export-pack latest --out creature-lab-bug-pack
|
|
31
|
+
creature-lab verify-pack creature-lab-bug-pack
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Attach the pack, or paste `report latest --json` when a pack cannot be shared. Policy packs may
|
|
35
|
+
contain serialized code; do not attach secrets or a policy you are not allowed to redistribute.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Creature submission
|
|
3
|
+
about: Propose a new packaged zoo creature
|
|
4
|
+
title: "Zoo creature: "
|
|
5
|
+
labels: zoo
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Creature name
|
|
9
|
+
|
|
10
|
+
Use lowercase words with underscores.
|
|
11
|
+
|
|
12
|
+
## What should it demonstrate?
|
|
13
|
+
|
|
14
|
+
## Files
|
|
15
|
+
|
|
16
|
+
- `creature.json`:
|
|
17
|
+
- task JSON:
|
|
18
|
+
- baseline JSON, if available:
|
|
19
|
+
- GIF or report, if available:
|
|
20
|
+
|
|
21
|
+
## Validation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
uv run creature-lab validate path/to/creature.json --task path/to/task.json
|
|
25
|
+
uv run creature-lab run path/to/creature.json --task path/to/task.json
|
|
26
|
+
uv run creature-lab report latest
|
|
27
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Docs improvement
|
|
3
|
+
about: Improve onboarding, examples, specs, or CLI reference docs
|
|
4
|
+
title: "Docs: "
|
|
5
|
+
labels: documentation
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Page or command
|
|
9
|
+
|
|
10
|
+
## What is confusing or missing?
|
|
11
|
+
|
|
12
|
+
## Suggested improvement
|
|
13
|
+
|
|
14
|
+
## Verification
|
|
15
|
+
|
|
16
|
+
What command should someone run to confirm the docs are accurate?
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Task proposal
|
|
3
|
+
about: Propose a new local challenge task
|
|
4
|
+
title: "Task: "
|
|
5
|
+
labels: task
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Task goal
|
|
9
|
+
|
|
10
|
+
## Existing schema features used
|
|
11
|
+
|
|
12
|
+
- Terrain friction:
|
|
13
|
+
- Target:
|
|
14
|
+
- Damage event:
|
|
15
|
+
- Impulse event:
|
|
16
|
+
- Reward terms:
|
|
17
|
+
|
|
18
|
+
## Candidate command
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
uv run creature-lab run examples/quadruped.json --task path/to/task.json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Acceptance signal
|
|
25
|
+
|
|
26
|
+
What score, report signal, or diagnosis result should show that the task works?
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: uv
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
groups:
|
|
9
|
+
security-updates:
|
|
10
|
+
applies-to: security-updates
|
|
11
|
+
patterns: ["*"]
|
|
12
|
+
production-dependencies:
|
|
13
|
+
dependency-type: production
|
|
14
|
+
update-types: ["minor", "patch"]
|
|
15
|
+
development-dependencies:
|
|
16
|
+
dependency-type: development
|
|
17
|
+
update-types: ["minor", "patch"]
|
|
18
|
+
- package-ecosystem: github-actions
|
|
19
|
+
directory: /
|
|
20
|
+
schedule:
|
|
21
|
+
interval: weekly
|
|
22
|
+
open-pull-requests-limit: 5
|
|
23
|
+
groups:
|
|
24
|
+
security-updates:
|
|
25
|
+
applies-to: security-updates
|
|
26
|
+
patterns: ["*"]
|
|
27
|
+
actions:
|
|
28
|
+
update-types: ["minor", "patch"]
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
launchers:
|
|
18
|
+
strategy:
|
|
19
|
+
matrix:
|
|
20
|
+
os: [ubuntu-latest, windows-latest]
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- if: runner.os != 'Windows'
|
|
27
|
+
run: bash -n run.sh run.command
|
|
28
|
+
- if: runner.os == 'Windows'
|
|
29
|
+
shell: pwsh
|
|
30
|
+
run: |
|
|
31
|
+
$errors = $null
|
|
32
|
+
[void][System.Management.Automation.Language.Parser]::ParseFile((Resolve-Path run.ps1), [ref]$null, [ref]$errors)
|
|
33
|
+
if ($errors) { $errors | Format-List; exit 1 }
|
|
34
|
+
- if: runner.os == 'Windows'
|
|
35
|
+
name: Launcher helpers under Windows PowerShell 5.1
|
|
36
|
+
shell: powershell
|
|
37
|
+
run: ./scripts/test-launcher-helpers.ps1
|
|
38
|
+
|
|
39
|
+
first-launch:
|
|
40
|
+
name: first launch (${{ matrix.os }})
|
|
41
|
+
strategy:
|
|
42
|
+
fail-fast: false
|
|
43
|
+
matrix:
|
|
44
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
45
|
+
runs-on: ${{ matrix.os }}
|
|
46
|
+
timeout-minutes: 15
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
49
|
+
with:
|
|
50
|
+
persist-credentials: false
|
|
51
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
52
|
+
with:
|
|
53
|
+
cache-suffix: first-launch-${{ matrix.os }}
|
|
54
|
+
- name: Start the app with the real launcher and check it
|
|
55
|
+
shell: bash
|
|
56
|
+
run: |
|
|
57
|
+
# One step on purpose: on Windows a process started in an earlier step is gone by now.
|
|
58
|
+
if [ "$RUNNER_OS" = "Windows" ]; then
|
|
59
|
+
# What run.bat does: Windows PowerShell 5.1.
|
|
60
|
+
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File run.ps1 -NoBrowser > launch.log 2>&1 &
|
|
61
|
+
else
|
|
62
|
+
nohup ./run.sh --no-browser > launch.log 2>&1 &
|
|
63
|
+
fi
|
|
64
|
+
ready=0
|
|
65
|
+
for _ in $(seq 1 180); do
|
|
66
|
+
if curl -fsS http://127.0.0.1:8080/api/health; then ready=1; break; fi
|
|
67
|
+
sleep 2
|
|
68
|
+
done
|
|
69
|
+
if [ "$ready" != 1 ]; then
|
|
70
|
+
echo "The app did not come up within 6 minutes."
|
|
71
|
+
tail -n 120 launch.log || true
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
echo
|
|
75
|
+
# No package was compiled from source: PyBullet must stay optional.
|
|
76
|
+
uv run --no-sync python -c "import importlib.util as u; assert u.find_spec('pybullet') is None, 'PyBullet must stay optional'; import fastapi, mujoco, viser, onnxruntime"
|
|
77
|
+
curl -fsS http://127.0.0.1:8080/api/robots | python -c "import json, sys; keys = [r['key'] for r in json.load(sys.stdin)['robots']]; assert keys == ['microduck', 'unitree_g1'], keys"
|
|
78
|
+
|
|
79
|
+
quality-and-package:
|
|
80
|
+
runs-on: ubuntu-latest
|
|
81
|
+
timeout-minutes: 20
|
|
82
|
+
steps:
|
|
83
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
84
|
+
with:
|
|
85
|
+
persist-credentials: false
|
|
86
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
87
|
+
with:
|
|
88
|
+
cache-suffix: quality-and-package
|
|
89
|
+
- name: Set up Python
|
|
90
|
+
run: uv python install 3.11
|
|
91
|
+
- name: Sync all local/test integrations
|
|
92
|
+
run: uv sync --all-extras
|
|
93
|
+
- name: Ruff
|
|
94
|
+
run: |
|
|
95
|
+
uv run ruff check .
|
|
96
|
+
uv run ruff format --check .
|
|
97
|
+
- name: Full test suite
|
|
98
|
+
run: uv run pytest
|
|
99
|
+
- name: CLI and behavioral contracts
|
|
100
|
+
run: |
|
|
101
|
+
uv run creature-lab doctor
|
|
102
|
+
uv run creature-lab validate examples/tripod.json --task examples/crawl_forward.json
|
|
103
|
+
uv run creature-lab zoo validate-all
|
|
104
|
+
uv run creature-lab zoo check-showcases
|
|
105
|
+
- name: Build wheel and source distribution
|
|
106
|
+
run: uv build
|
|
107
|
+
- name: Smoke-test the installed wheel outside the checkout
|
|
108
|
+
run: |
|
|
109
|
+
python3 -m venv /tmp/wheel-venv
|
|
110
|
+
/tmp/wheel-venv/bin/pip install --quiet "$(ls dist/*.whl)[sim]"
|
|
111
|
+
mkdir -p /tmp/wheel-smoke
|
|
112
|
+
cd /tmp/wheel-smoke
|
|
113
|
+
/tmp/wheel-venv/bin/creature-lab doctor
|
|
114
|
+
/tmp/wheel-venv/bin/creature-lab zoo run quadruped --runs-dir ./runs
|
|
115
|
+
|
|
116
|
+
supported-platforms:
|
|
117
|
+
name: ${{ matrix.os }} / Python ${{ matrix.python }}
|
|
118
|
+
runs-on: ${{ matrix.os }}
|
|
119
|
+
timeout-minutes: 20
|
|
120
|
+
strategy:
|
|
121
|
+
fail-fast: false
|
|
122
|
+
matrix:
|
|
123
|
+
include:
|
|
124
|
+
- os: ubuntu-latest
|
|
125
|
+
python: "3.12"
|
|
126
|
+
physics-extra: sim
|
|
127
|
+
- os: windows-latest
|
|
128
|
+
python: "3.11"
|
|
129
|
+
physics-extra: sim
|
|
130
|
+
- os: windows-latest
|
|
131
|
+
python: "3.12"
|
|
132
|
+
physics-extra: sim
|
|
133
|
+
- os: macos-latest
|
|
134
|
+
python: "3.11"
|
|
135
|
+
physics-extra: mujoco
|
|
136
|
+
steps:
|
|
137
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
138
|
+
with:
|
|
139
|
+
persist-credentials: false
|
|
140
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
141
|
+
with:
|
|
142
|
+
cache-suffix: supported-${{ matrix.os }}-${{ matrix.python }}
|
|
143
|
+
- name: Set up Python
|
|
144
|
+
run: uv python install ${{ matrix.python }}
|
|
145
|
+
- name: Sync runtime and test dependencies
|
|
146
|
+
run: uv sync --extra ${{ matrix.physics-extra }} --extra viz --extra export --extra evolve
|
|
147
|
+
- name: Platform test suite
|
|
148
|
+
run: uv run pytest -m "not optional_backend"
|
|
149
|
+
- name: Launcher and CLI smoke
|
|
150
|
+
run: |
|
|
151
|
+
uv run python scripts/start.py --dry-run
|
|
152
|
+
uv run creature-lab validate examples/tripod.json --task examples/crawl_forward.json
|
|
153
|
+
|
|
154
|
+
browser-smoke:
|
|
155
|
+
runs-on: ubuntu-latest
|
|
156
|
+
timeout-minutes: 15
|
|
157
|
+
steps:
|
|
158
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
159
|
+
with:
|
|
160
|
+
persist-credentials: false
|
|
161
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
162
|
+
with:
|
|
163
|
+
cache-suffix: browser-smoke
|
|
164
|
+
- name: Set up Python
|
|
165
|
+
run: uv python install 3.11
|
|
166
|
+
- name: Install editor and browser dependencies
|
|
167
|
+
run: |
|
|
168
|
+
uv sync --extra sim --extra viz --extra browser
|
|
169
|
+
uv run playwright install --with-deps chromium
|
|
170
|
+
- name: Real first-run browser journey and process cleanup
|
|
171
|
+
run: uv run python scripts/browser_smoke.py
|
|
172
|
+
|
|
173
|
+
frontend:
|
|
174
|
+
# The browser app's source (web-ui/) and the bundle committed in
|
|
175
|
+
# creature_lab/web/static must agree, so users never need Node.
|
|
176
|
+
runs-on: ubuntu-latest
|
|
177
|
+
timeout-minutes: 10
|
|
178
|
+
defaults:
|
|
179
|
+
run:
|
|
180
|
+
working-directory: web-ui
|
|
181
|
+
steps:
|
|
182
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
183
|
+
with:
|
|
184
|
+
persist-credentials: false
|
|
185
|
+
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
|
|
186
|
+
with:
|
|
187
|
+
node-version: 22
|
|
188
|
+
cache: npm
|
|
189
|
+
cache-dependency-path: web-ui/package-lock.json
|
|
190
|
+
- run: npm ci
|
|
191
|
+
- run: npm run typecheck
|
|
192
|
+
- run: npm test
|
|
193
|
+
- run: npm run build
|
|
194
|
+
- name: Committed bundle matches the source
|
|
195
|
+
run: |
|
|
196
|
+
if [ -n "$(git status --porcelain -- ../creature_lab/web/static)" ]; then
|
|
197
|
+
git status --short -- ../creature_lab/web/static
|
|
198
|
+
echo "creature_lab/web/static is stale: run 'npm run build' in web-ui and commit it."
|
|
199
|
+
exit 1
|
|
200
|
+
fi
|
|
201
|
+
|
|
202
|
+
docker-smoke:
|
|
203
|
+
runs-on: ubuntu-latest
|
|
204
|
+
steps:
|
|
205
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
206
|
+
with:
|
|
207
|
+
persist-credentials: false
|
|
208
|
+
- run: docker compose up --detach --build
|
|
209
|
+
- run: |
|
|
210
|
+
for attempt in $(seq 1 60); do
|
|
211
|
+
curl --fail --silent http://127.0.0.1:8080 && exit 0
|
|
212
|
+
sleep 2
|
|
213
|
+
done
|
|
214
|
+
docker compose logs
|
|
215
|
+
exit 1
|
|
216
|
+
- if: always()
|
|
217
|
+
run: docker compose down --volumes
|
|
218
|
+
|
|
219
|
+
lockfile:
|
|
220
|
+
# uv sync --frozen trusts uv.lock as-is; fail when it no longer matches pyproject.toml.
|
|
221
|
+
runs-on: ubuntu-latest
|
|
222
|
+
steps:
|
|
223
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
224
|
+
with:
|
|
225
|
+
persist-credentials: false
|
|
226
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
227
|
+
- run: uv lock --check
|
|
228
|
+
|
|
229
|
+
zizmor:
|
|
230
|
+
# Workflow security audit, pinned and offline so its result changes only
|
|
231
|
+
# with this file or the workflows (settings in .github/zizmor.yml).
|
|
232
|
+
runs-on: ubuntu-latest
|
|
233
|
+
steps:
|
|
234
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
235
|
+
with:
|
|
236
|
+
persist-credentials: false
|
|
237
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
238
|
+
- run: uvx zizmor==1.31.1 --offline --min-severity medium --config .github/zizmor.yml .github/workflows
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Dependabot auto-merge
|
|
2
|
+
|
|
3
|
+
# Merges passing Dependabot pull requests; the logic lives in
|
|
4
|
+
# oney-erge/.github/.github/workflows/dependabot-automerge.yml.
|
|
5
|
+
on:
|
|
6
|
+
workflow_run:
|
|
7
|
+
workflows: ["CI"]
|
|
8
|
+
types: [completed]
|
|
9
|
+
status:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
inputs:
|
|
12
|
+
pr:
|
|
13
|
+
description: Dependabot pull request number to re-evaluate
|
|
14
|
+
required: true
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
pull-requests: write
|
|
19
|
+
actions: write
|
|
20
|
+
checks: read
|
|
21
|
+
statuses: read
|
|
22
|
+
|
|
23
|
+
# One queue per branch: a newer event for the same pull request replaces a pending
|
|
24
|
+
# one, and events on other branches never cancel it.
|
|
25
|
+
concurrency:
|
|
26
|
+
group: dependabot-automerge-${{ inputs.pr || github.event.workflow_run.head_branch || github.event.branches[0].name || github.ref }}
|
|
27
|
+
cancel-in-progress: false
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
merge:
|
|
31
|
+
if: >-
|
|
32
|
+
github.event_name == 'workflow_dispatch'
|
|
33
|
+
|| (github.event_name == 'workflow_run' && startsWith(github.event.workflow_run.head_branch, 'dependabot/'))
|
|
34
|
+
|| (github.event_name == 'status' && github.event.state == 'success'
|
|
35
|
+
&& startsWith(github.event.branches[0].name, 'dependabot/'))
|
|
36
|
+
uses: oney-erge/.github/.github/workflows/dependabot-automerge.yml@main
|
|
37
|
+
with:
|
|
38
|
+
pr: ${{ inputs.pr }}
|
|
39
|
+
sha: ${{ github.event.workflow_run.head_sha || github.event.sha }}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishing a GitHub release (tag vX.Y.Z) builds, tests and smoke-installs the package, attaches
|
|
4
|
+
# the wheel and sdist to the release, then publishes them to PyPI through trusted publishing (the
|
|
5
|
+
# protected `pypi` environment; no token in the repository). Run it by hand to build and check
|
|
6
|
+
# without publishing.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
release:
|
|
11
|
+
types: [published]
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
build-and-verify:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
permissions:
|
|
20
|
+
contents: write # attach the distributions to the GitHub release
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
23
|
+
with:
|
|
24
|
+
persist-credentials: false
|
|
25
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
26
|
+
- run: uv python install 3.11
|
|
27
|
+
- run: uv sync --all-extras
|
|
28
|
+
- run: |
|
|
29
|
+
uv run ruff check .
|
|
30
|
+
uv run ruff format --check .
|
|
31
|
+
uv run pytest
|
|
32
|
+
uv run creature-lab zoo check-showcases
|
|
33
|
+
uv build
|
|
34
|
+
- name: Check the release tag matches the package version
|
|
35
|
+
if: github.event_name == 'release'
|
|
36
|
+
run: |
|
|
37
|
+
version=$(uv run python -c "import creature_lab; print(creature_lab.VERSION)")
|
|
38
|
+
if [ "v$version" != "$GITHUB_REF_NAME" ]; then
|
|
39
|
+
echo "Tag $GITHUB_REF_NAME does not match the package version $version" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
- name: Install the wheel into a clean environment
|
|
43
|
+
run: |
|
|
44
|
+
uv venv --python 3.11 "$RUNNER_TEMP/release-venv"
|
|
45
|
+
uv pip install --python "$RUNNER_TEMP/release-venv" dist/creature_lab-*.whl
|
|
46
|
+
"$RUNNER_TEMP/release-venv/bin/creature-lab" --help > /dev/null
|
|
47
|
+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
48
|
+
with:
|
|
49
|
+
name: creature-lab-distributions
|
|
50
|
+
path: dist/*
|
|
51
|
+
if-no-files-found: error
|
|
52
|
+
- name: Attach the distributions to the release
|
|
53
|
+
if: github.event_name == 'release'
|
|
54
|
+
env:
|
|
55
|
+
GH_TOKEN: ${{ github.token }}
|
|
56
|
+
run: gh release upload "$GITHUB_REF_NAME" dist/* --clobber --repo "$GITHUB_REPOSITORY"
|
|
57
|
+
|
|
58
|
+
publish:
|
|
59
|
+
if: github.event_name == 'release'
|
|
60
|
+
needs: build-and-verify
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
environment: pypi
|
|
63
|
+
permissions:
|
|
64
|
+
id-token: write # OIDC for PyPI trusted publishing
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
67
|
+
with:
|
|
68
|
+
name: creature-lab-distributions
|
|
69
|
+
path: dist/
|
|
70
|
+
- uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Scorecard
|
|
2
|
+
|
|
3
|
+
# Publishes this repository's OpenSSF Scorecard to scorecard.dev:
|
|
4
|
+
# https://scorecard.dev/viewer/?uri=github.com/oney-erge/Creature-Lab
|
|
5
|
+
# Results are not uploaded as code-scanning alerts.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
schedule:
|
|
10
|
+
- cron: "17 6 * * 1"
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
permissions: read-all
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
analysis:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
actions: read
|
|
21
|
+
id-token: write
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
|
|
27
|
+
with:
|
|
28
|
+
results_file: results.sarif
|
|
29
|
+
results_format: sarif
|
|
30
|
+
publish_results: true
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# zizmor (https://docs.zizmor.sh) settings, checked in CI.
|
|
2
|
+
rules:
|
|
3
|
+
# The Dependabot auto-merge caller runs on workflow_run by design: it never
|
|
4
|
+
# checks out or runs pull request code, only calls the GitHub API.
|
|
5
|
+
dangerous-triggers:
|
|
6
|
+
ignore:
|
|
7
|
+
- dependabot-automerge.yml
|
|
8
|
+
unpinned-uses:
|
|
9
|
+
config:
|
|
10
|
+
policies:
|
|
11
|
+
# Shared workflows from the owner's own .github repository track main on
|
|
12
|
+
# purpose, so a fix there applies to every repository at once.
|
|
13
|
+
"oney-erge/*": any
|
|
14
|
+
"*": hash-pin
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
.setup/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.ruff_cache/
|
|
6
|
+
.mypy_cache/
|
|
7
|
+
.pyright/
|
|
8
|
+
.coverage
|
|
9
|
+
htmlcov/
|
|
10
|
+
dist/
|
|
11
|
+
build/
|
|
12
|
+
*.egg-info/
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
CLAUDE.local.md
|
|
16
|
+
runs/
|
|
17
|
+
outputs/
|
|
18
|
+
*.mp4
|
|
19
|
+
*.gif
|
|
20
|
+
!docs/assets/
|
|
21
|
+
!docs/assets/*.gif
|
|
22
|
+
!docs/assets/**/
|
|
23
|
+
!docs/assets/**/*.gif
|
|
24
|
+
!docs/assets/*.mp4
|
|
25
|
+
*.webm
|
|
26
|
+
.DS_Store
|
|
27
|
+
.idea/
|
|
28
|
+
.vscode/
|
|
29
|
+
MUJOCO_LOG.TXT
|
|
30
|
+
*.urdf
|
|
31
|
+
|
|
32
|
+
# Local assistant state
|
|
33
|
+
.claude/settings.local.json
|
|
34
|
+
.claude/scheduled_tasks.lock
|
|
35
|
+
|
|
36
|
+
# Browser app front end (the built bundle in creature_lab/web/static is committed)
|
|
37
|
+
web-ui/node_modules/
|