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.
Files changed (354) hide show
  1. creature_lab-0.3.0/.claude/settings.json +8 -0
  2. creature_lab-0.3.0/.copier-answers.launcher-kit.yml +3 -0
  3. creature_lab-0.3.0/.dockerignore +9 -0
  4. creature_lab-0.3.0/.gitattributes +51 -0
  5. creature_lab-0.3.0/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
  6. creature_lab-0.3.0/.github/ISSUE_TEMPLATE/creature_submission.md +27 -0
  7. creature_lab-0.3.0/.github/ISSUE_TEMPLATE/docs_improvement.md +16 -0
  8. creature_lab-0.3.0/.github/ISSUE_TEMPLATE/task_proposal.md +26 -0
  9. creature_lab-0.3.0/.github/dependabot.yml +28 -0
  10. creature_lab-0.3.0/.github/workflows/ci.yml +238 -0
  11. creature_lab-0.3.0/.github/workflows/dependabot-automerge.yml +39 -0
  12. creature_lab-0.3.0/.github/workflows/release.yml +70 -0
  13. creature_lab-0.3.0/.github/workflows/scorecard.yml +30 -0
  14. creature_lab-0.3.0/.github/zizmor.yml +14 -0
  15. creature_lab-0.3.0/.gitignore +37 -0
  16. creature_lab-0.3.0/AGENTS.md +155 -0
  17. creature_lab-0.3.0/CHANGELOG.md +416 -0
  18. creature_lab-0.3.0/CITATION.cff +10 -0
  19. creature_lab-0.3.0/CLAUDE.md +9 -0
  20. creature_lab-0.3.0/CONTRIBUTING.md +70 -0
  21. creature_lab-0.3.0/Dockerfile +24 -0
  22. creature_lab-0.3.0/LICENSE +201 -0
  23. creature_lab-0.3.0/PKG-INFO +370 -0
  24. creature_lab-0.3.0/README.md +99 -0
  25. creature_lab-0.3.0/SECURITY.md +61 -0
  26. creature_lab-0.3.0/compose.yaml +17 -0
  27. creature_lab-0.3.0/creature_lab/__init__.py +18 -0
  28. creature_lab-0.3.0/creature_lab/agents/__init__.py +5 -0
  29. creature_lab-0.3.0/creature_lab/agents/baseline.py +53 -0
  30. creature_lab-0.3.0/creature_lab/agents/llm.py +33 -0
  31. creature_lab-0.3.0/creature_lab/agents/loop.py +112 -0
  32. creature_lab-0.3.0/creature_lab/agents/prompts.py +63 -0
  33. creature_lab-0.3.0/creature_lab/agents/tools.py +101 -0
  34. creature_lab-0.3.0/creature_lab/autopsy.py +376 -0
  35. creature_lab-0.3.0/creature_lab/backends/__init__.py +1 -0
  36. creature_lab-0.3.0/creature_lab/backends/base.py +25 -0
  37. creature_lab-0.3.0/creature_lab/backends/mujoco_backend.py +253 -0
  38. creature_lab-0.3.0/creature_lab/backends/pybullet_backend.py +573 -0
  39. creature_lab-0.3.0/creature_lab/cli.py +3317 -0
  40. creature_lab-0.3.0/creature_lab/controllers/__init__.py +1 -0
  41. creature_lab-0.3.0/creature_lab/controllers/cpg.py +83 -0
  42. creature_lab-0.3.0/creature_lab/controllers/factory.py +208 -0
  43. creature_lab-0.3.0/creature_lab/controllers/pid.py +33 -0
  44. creature_lab-0.3.0/creature_lab/controllers/policy.py +91 -0
  45. creature_lab-0.3.0/creature_lab/controllers/pose_seq.py +38 -0
  46. creature_lab-0.3.0/creature_lab/controllers/posture.py +125 -0
  47. creature_lab-0.3.0/creature_lab/controllers/sinusoid.py +20 -0
  48. creature_lab-0.3.0/creature_lab/controllers/target_seek.py +128 -0
  49. creature_lab-0.3.0/creature_lab/diagnosis.py +435 -0
  50. creature_lab-0.3.0/creature_lab/diagnostics.py +261 -0
  51. creature_lab-0.3.0/creature_lab/editor/__init__.py +5 -0
  52. creature_lab-0.3.0/creature_lab/editor/controls.py +2495 -0
  53. creature_lab-0.3.0/creature_lab/editor/history.py +85 -0
  54. creature_lab-0.3.0/creature_lab/editor/jobs.py +176 -0
  55. creature_lab-0.3.0/creature_lab/editor/labels.py +91 -0
  56. creature_lab-0.3.0/creature_lab/editor/live.py +672 -0
  57. creature_lab-0.3.0/creature_lab/editor/playback.py +98 -0
  58. creature_lab-0.3.0/creature_lab/editor/presets.py +282 -0
  59. creature_lab-0.3.0/creature_lab/editor/robot_panel.py +288 -0
  60. creature_lab-0.3.0/creature_lab/editor/robot_stage.py +181 -0
  61. creature_lab-0.3.0/creature_lab/editor/session.py +1413 -0
  62. creature_lab-0.3.0/creature_lab/env.py +274 -0
  63. creature_lab-0.3.0/creature_lab/evolve.py +394 -0
  64. creature_lab-0.3.0/creature_lab/export/__init__.py +9 -0
  65. creature_lab-0.3.0/creature_lab/export/mjcf.py +199 -0
  66. creature_lab-0.3.0/creature_lab/export/urdf.py +152 -0
  67. creature_lab-0.3.0/creature_lab/export/urdf_import.py +142 -0
  68. creature_lab-0.3.0/creature_lab/exporting.py +360 -0
  69. creature_lab-0.3.0/creature_lab/failure_zoo.py +98 -0
  70. creature_lab-0.3.0/creature_lab/hashing.py +19 -0
  71. creature_lab-0.3.0/creature_lab/io_utils.py +37 -0
  72. creature_lab-0.3.0/creature_lab/library.py +311 -0
  73. creature_lab-0.3.0/creature_lab/qualification.py +299 -0
  74. creature_lab-0.3.0/creature_lab/reports.py +428 -0
  75. creature_lab-0.3.0/creature_lab/reports_html.py +549 -0
  76. creature_lab-0.3.0/creature_lab/rl/__init__.py +9 -0
  77. creature_lab-0.3.0/creature_lab/rl/gym_env.py +74 -0
  78. creature_lab-0.3.0/creature_lab/rl/train.py +148 -0
  79. creature_lab-0.3.0/creature_lab/robots/__init__.py +6 -0
  80. creature_lab-0.3.0/creature_lab/robots/actuator.py +115 -0
  81. creature_lab-0.3.0/creature_lab/robots/analysis.py +282 -0
  82. creature_lab-0.3.0/creature_lab/robots/api.py +30 -0
  83. creature_lab-0.3.0/creature_lab/robots/card.py +182 -0
  84. creature_lab-0.3.0/creature_lab/robots/catalog.py +153 -0
  85. creature_lab-0.3.0/creature_lab/robots/checkup.py +216 -0
  86. creature_lab-0.3.0/creature_lab/robots/cli.py +275 -0
  87. creature_lab-0.3.0/creature_lab/robots/compare.py +229 -0
  88. creature_lab-0.3.0/creature_lab/robots/data/UNITREE_RL_GYM_LICENSE.txt +23 -0
  89. creature_lab-0.3.0/creature_lab/robots/data/microduck.json +253 -0
  90. creature_lab-0.3.0/creature_lab/robots/data/unitree_g1.json +174 -0
  91. creature_lab-0.3.0/creature_lab/robots/data/unitree_g1_policy.npz +0 -0
  92. creature_lab-0.3.0/creature_lab/robots/fetch.py +115 -0
  93. creature_lab-0.3.0/creature_lab/robots/film.py +78 -0
  94. creature_lab-0.3.0/creature_lab/robots/g1.py +103 -0
  95. creature_lab-0.3.0/creature_lab/robots/microduck.py +153 -0
  96. creature_lab-0.3.0/creature_lab/robots/overlay.py +384 -0
  97. creature_lab-0.3.0/creature_lab/robots/policies.py +81 -0
  98. creature_lab-0.3.0/creature_lab/robots/render.py +236 -0
  99. creature_lab-0.3.0/creature_lab/robots/report.py +307 -0
  100. creature_lab-0.3.0/creature_lab/robots/rollout.py +185 -0
  101. creature_lab-0.3.0/creature_lab/robots/scene.py +53 -0
  102. creature_lab-0.3.0/creature_lab/robots/story.py +485 -0
  103. creature_lab-0.3.0/creature_lab/robots/types.py +120 -0
  104. creature_lab-0.3.0/creature_lab/robots/video.py +277 -0
  105. creature_lab-0.3.0/creature_lab/robots/visual.py +41 -0
  106. creature_lab-0.3.0/creature_lab/robustness.py +165 -0
  107. creature_lab-0.3.0/creature_lab/runs.py +242 -0
  108. creature_lab-0.3.0/creature_lab/scaffold/__init__.py +29 -0
  109. creature_lab-0.3.0/creature_lab/scaffold/humanoid.py +227 -0
  110. creature_lab-0.3.0/creature_lab/scaffold/legged.py +144 -0
  111. creature_lab-0.3.0/creature_lab/scaffold/mirror.py +90 -0
  112. creature_lab-0.3.0/creature_lab/scaffold/worm.py +80 -0
  113. creature_lab-0.3.0/creature_lab/schema/__init__.py +79 -0
  114. creature_lab-0.3.0/creature_lab/schema/agent.py +28 -0
  115. creature_lab-0.3.0/creature_lab/schema/base.py +33 -0
  116. creature_lab-0.3.0/creature_lab/schema/control.py +49 -0
  117. creature_lab-0.3.0/creature_lab/schema/controller.py +208 -0
  118. creature_lab-0.3.0/creature_lab/schema/creature.py +235 -0
  119. creature_lab-0.3.0/creature_lab/schema/summary.py +30 -0
  120. creature_lab-0.3.0/creature_lab/schema/task.py +137 -0
  121. creature_lab-0.3.0/creature_lab/schema/trace.py +110 -0
  122. creature_lab-0.3.0/creature_lab/scoring.py +56 -0
  123. creature_lab-0.3.0/creature_lab/terrain.py +172 -0
  124. creature_lab-0.3.0/creature_lab/validation.py +103 -0
  125. creature_lab-0.3.0/creature_lab/viewers/__init__.py +1 -0
  126. creature_lab-0.3.0/creature_lab/viewers/overlays.py +71 -0
  127. creature_lab-0.3.0/creature_lab/viewers/plotting.py +43 -0
  128. creature_lab-0.3.0/creature_lab/viewers/video_exporter.py +26 -0
  129. creature_lab-0.3.0/creature_lab/viewers/viser_viewer.py +489 -0
  130. creature_lab-0.3.0/creature_lab/web/__init__.py +6 -0
  131. creature_lab-0.3.0/creature_lab/web/builder.py +91 -0
  132. creature_lab-0.3.0/creature_lab/web/creatures.py +445 -0
  133. creature_lab-0.3.0/creature_lab/web/jobs.py +172 -0
  134. creature_lab-0.3.0/creature_lab/web/library.py +254 -0
  135. creature_lab-0.3.0/creature_lab/web/scene.py +112 -0
  136. creature_lab-0.3.0/creature_lab/web/server.py +394 -0
  137. creature_lab-0.3.0/creature_lab/web/static/assets/index-CVJ_iiu_.css +1 -0
  138. creature_lab-0.3.0/creature_lab/web/static/assets/index-D-2y8anQ.js +4233 -0
  139. creature_lab-0.3.0/creature_lab/web/static/clips/unitree_g1.webp +0 -0
  140. creature_lab-0.3.0/creature_lab/web/static/index.html +16 -0
  141. creature_lab-0.3.0/creature_lab/web/thumbs.py +120 -0
  142. creature_lab-0.3.0/creature_lab/web/whatif.py +149 -0
  143. creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/baselines/recover.json +14 -0
  144. creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/baselines/recover.mujoco.json +14 -0
  145. creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/creature.json +205 -0
  146. creature_lab-0.3.0/creature_lab/zoo/damaged_quadruped/tasks/recover.json +8 -0
  147. creature_lab-0.3.0/creature_lab/zoo/hexapod/baselines/crawl_forward.json +14 -0
  148. creature_lab-0.3.0/creature_lab/zoo/hexapod/baselines/crawl_forward.mujoco.json +14 -0
  149. creature_lab-0.3.0/creature_lab/zoo/hexapod/controller.json +42 -0
  150. creature_lab-0.3.0/creature_lab/zoo/hexapod/creature.json +295 -0
  151. creature_lab-0.3.0/creature_lab/zoo/hexapod/tasks/crawl_forward.json +7 -0
  152. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/reach.json +14 -0
  153. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/reach.mujoco.json +14 -0
  154. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/walk.json +14 -0
  155. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/baselines/walk.mujoco.json +14 -0
  156. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/controller.json +18 -0
  157. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/creature.json +628 -0
  158. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/tasks/reach.json +8 -0
  159. creature_lab-0.3.0/creature_lab/zoo/humanoid_12dof/tasks/walk.json +7 -0
  160. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/balance.json +14 -0
  161. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/balance.mujoco.json +14 -0
  162. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/push_recovery.json +14 -0
  163. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/push_recovery.mujoco.json +14 -0
  164. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/walk.json +14 -0
  165. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/baselines/walk.mujoco.json +14 -0
  166. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/creature.json +434 -0
  167. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/balance.json +7 -0
  168. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/push_recovery.json +8 -0
  169. creature_lab-0.3.0/creature_lab/zoo/humanoid_minimal/tasks/walk.json +7 -0
  170. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/crawl_forward.json +14 -0
  171. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/crawl_forward.mujoco.json +14 -0
  172. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/gap_cross.json +14 -0
  173. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/gap_cross.mujoco.json +14 -0
  174. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/low_friction_crawl.mujoco.json +14 -0
  175. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/push_recovery.mujoco.json +14 -0
  176. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/reach_target.json +14 -0
  177. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/reach_target.mujoco.json +14 -0
  178. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/slope_climb.json +14 -0
  179. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/slope_climb.mujoco.json +14 -0
  180. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/stability_hold.mujoco.json +14 -0
  181. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/step_over.json +14 -0
  182. creature_lab-0.3.0/creature_lab/zoo/quadruped/baselines/step_over.mujoco.json +14 -0
  183. creature_lab-0.3.0/creature_lab/zoo/quadruped/controller.json +30 -0
  184. creature_lab-0.3.0/creature_lab/zoo/quadruped/creature.json +205 -0
  185. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/crawl_forward.json +7 -0
  186. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/gap_cross.json +7 -0
  187. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/low_friction_crawl.json +7 -0
  188. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/push_recovery.json +8 -0
  189. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/reach_target.json +8 -0
  190. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/slope_climb.json +7 -0
  191. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/stability_hold.json +7 -0
  192. creature_lab-0.3.0/creature_lab/zoo/quadruped/tasks/step_over.json +7 -0
  193. creature_lab-0.3.0/creature_lab/zoo/tripod/baselines/crawl_forward.json +14 -0
  194. creature_lab-0.3.0/creature_lab/zoo/tripod/baselines/crawl_forward.mujoco.json +14 -0
  195. creature_lab-0.3.0/creature_lab/zoo/tripod/controller.json +24 -0
  196. creature_lab-0.3.0/creature_lab/zoo/tripod/creature.json +145 -0
  197. creature_lab-0.3.0/creature_lab/zoo/tripod/tasks/crawl_forward.json +7 -0
  198. creature_lab-0.3.0/creature_lab/zoo/worm/baselines/crawl_forward.json +14 -0
  199. creature_lab-0.3.0/creature_lab/zoo/worm/baselines/crawl_forward.mujoco.json +14 -0
  200. creature_lab-0.3.0/creature_lab/zoo/worm/controller.json +36 -0
  201. creature_lab-0.3.0/creature_lab/zoo/worm/creature.json +247 -0
  202. creature_lab-0.3.0/creature_lab/zoo/worm/tasks/crawl_forward.json +7 -0
  203. creature_lab-0.3.0/creature_lab/zoo.py +171 -0
  204. creature_lab-0.3.0/docs/BUILD_EDITOR.md +330 -0
  205. creature_lab-0.3.0/docs/CLI_REFERENCE.md +253 -0
  206. creature_lab-0.3.0/docs/CONCEPTS.md +54 -0
  207. creature_lab-0.3.0/docs/CREATURE_SPEC.md +87 -0
  208. creature_lab-0.3.0/docs/FAILURE_LAB.md +57 -0
  209. creature_lab-0.3.0/docs/GAIT_LESSON.md +36 -0
  210. creature_lab-0.3.0/docs/GETTING_STARTED.md +187 -0
  211. creature_lab-0.3.0/docs/KNOWN_ISSUES.md +44 -0
  212. creature_lab-0.3.0/docs/README.md +30 -0
  213. creature_lab-0.3.0/docs/ROBOT_CHECKUP.md +183 -0
  214. creature_lab-0.3.0/docs/RUN_ARTIFACTS.md +75 -0
  215. creature_lab-0.3.0/docs/TASK_SPEC.md +86 -0
  216. creature_lab-0.3.0/docs/WEB_APP.md +109 -0
  217. creature_lab-0.3.0/docs/ZOO.md +114 -0
  218. creature_lab-0.3.0/docs/archive/ANALYSIS.md +237 -0
  219. creature_lab-0.3.0/docs/archive/IMPROVEMENT_PLAN.md +819 -0
  220. creature_lab-0.3.0/docs/archive/IMPROVEMENT_PLAN_2026.md +363 -0
  221. creature_lab-0.3.0/docs/archive/MVP_PLAN.md +553 -0
  222. creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_FINAL_ROADMAP.md +279 -0
  223. creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_STREAMLINED_CONTROLLER_ROADMAP.md +1539 -0
  224. creature_lab-0.3.0/docs/archive/some-plans/CREATURE_LAB_UI_UX_FINAL_PLAN.md +594 -0
  225. creature_lab-0.3.0/docs/assets/MEDIA_LICENSES.md +37 -0
  226. creature_lab-0.3.0/docs/assets/app-build.webp +0 -0
  227. creature_lab-0.3.0/docs/assets/app-compare.webp +0 -0
  228. creature_lab-0.3.0/docs/assets/app-microduck.webp +0 -0
  229. creature_lab-0.3.0/docs/assets/checkup-microduck.webp +0 -0
  230. creature_lab-0.3.0/docs/assets/checkup-unitree-g1.webp +0 -0
  231. creature_lab-0.3.0/docs/assets/creature-lab-logo.svg +34 -0
  232. creature_lab-0.3.0/docs/assets/quickstart.ipynb +191 -0
  233. creature_lab-0.3.0/docs/assets/social-preview.png +0 -0
  234. creature_lab-0.3.0/docs/project/GRAND_PLAN.md +436 -0
  235. creature_lab-0.3.0/docs/project/RELEASING.md +79 -0
  236. creature_lab-0.3.0/docs/project/ROADMAP.md +27 -0
  237. creature_lab-0.3.0/examples/README.md +43 -0
  238. creature_lab-0.3.0/examples/crawl_forward.json +7 -0
  239. creature_lab-0.3.0/examples/quadruped.json +22 -0
  240. creature_lab-0.3.0/examples/reach_target.json +8 -0
  241. creature_lab-0.3.0/examples/recover_after_damage.json +8 -0
  242. creature_lab-0.3.0/examples/tripod.json +19 -0
  243. creature_lab-0.3.0/examples/worm.json +22 -0
  244. creature_lab-0.3.0/pyproject.toml +143 -0
  245. creature_lab-0.3.0/run.bat +8 -0
  246. creature_lab-0.3.0/run.command +9 -0
  247. creature_lab-0.3.0/run.ps1 +97 -0
  248. creature_lab-0.3.0/run.sh +87 -0
  249. creature_lab-0.3.0/scripts/_process_utils.py +59 -0
  250. creature_lab-0.3.0/scripts/browser_smoke.py +220 -0
  251. creature_lab-0.3.0/scripts/install-utils.ps1 +171 -0
  252. creature_lab-0.3.0/scripts/install-utils.sh +134 -0
  253. creature_lab-0.3.0/scripts/media/compose_app.py +459 -0
  254. creature_lab-0.3.0/scripts/media/record_app.py +337 -0
  255. creature_lab-0.3.0/scripts/start.ps1 +47 -0
  256. creature_lab-0.3.0/scripts/start.py +617 -0
  257. creature_lab-0.3.0/scripts/start.sh +24 -0
  258. creature_lab-0.3.0/scripts/test-launcher-helpers.ps1 +51 -0
  259. creature_lab-0.3.0/tests/robot_helpers.py +150 -0
  260. creature_lab-0.3.0/tests/test_agent_schema.py +31 -0
  261. creature_lab-0.3.0/tests/test_agents.py +186 -0
  262. creature_lab-0.3.0/tests/test_app_command.py +77 -0
  263. creature_lab-0.3.0/tests/test_autopsy.py +169 -0
  264. creature_lab-0.3.0/tests/test_backend_smoke.py +237 -0
  265. creature_lab-0.3.0/tests/test_cli.py +1142 -0
  266. creature_lab-0.3.0/tests/test_controller_factory.py +264 -0
  267. creature_lab-0.3.0/tests/test_controller_policy.py +116 -0
  268. creature_lab-0.3.0/tests/test_controller_schema.py +174 -0
  269. creature_lab-0.3.0/tests/test_controllers.py +235 -0
  270. creature_lab-0.3.0/tests/test_creature_schema.py +185 -0
  271. creature_lab-0.3.0/tests/test_diagnosis.py +238 -0
  272. creature_lab-0.3.0/tests/test_diagnostics.py +227 -0
  273. creature_lab-0.3.0/tests/test_editor.py +339 -0
  274. creature_lab-0.3.0/tests/test_editor_controls.py +1006 -0
  275. creature_lab-0.3.0/tests/test_editor_history.py +291 -0
  276. creature_lab-0.3.0/tests/test_editor_jobs.py +150 -0
  277. creature_lab-0.3.0/tests/test_editor_labels.py +59 -0
  278. creature_lab-0.3.0/tests/test_editor_lessons.py +90 -0
  279. creature_lab-0.3.0/tests/test_editor_playback.py +154 -0
  280. creature_lab-0.3.0/tests/test_editor_session_phase2.py +221 -0
  281. creature_lab-0.3.0/tests/test_end_to_end.py +236 -0
  282. creature_lab-0.3.0/tests/test_env.py +168 -0
  283. creature_lab-0.3.0/tests/test_evolve.py +108 -0
  284. creature_lab-0.3.0/tests/test_evolve_strategies.py +431 -0
  285. creature_lab-0.3.0/tests/test_export.py +206 -0
  286. creature_lab-0.3.0/tests/test_exporting.py +233 -0
  287. creature_lab-0.3.0/tests/test_hashing.py +46 -0
  288. creature_lab-0.3.0/tests/test_humanoid.py +291 -0
  289. creature_lab-0.3.0/tests/test_launcher.py +160 -0
  290. creature_lab-0.3.0/tests/test_library.py +38 -0
  291. creature_lab-0.3.0/tests/test_mjcf_mujoco.py +327 -0
  292. creature_lab-0.3.0/tests/test_network_binding.py +200 -0
  293. creature_lab-0.3.0/tests/test_optional_imports.py +29 -0
  294. creature_lab-0.3.0/tests/test_overlays.py +106 -0
  295. creature_lab-0.3.0/tests/test_posture.py +159 -0
  296. creature_lab-0.3.0/tests/test_productization.py +317 -0
  297. creature_lab-0.3.0/tests/test_qualification.py +259 -0
  298. creature_lab-0.3.0/tests/test_reports.py +202 -0
  299. creature_lab-0.3.0/tests/test_reports_html.py +186 -0
  300. creature_lab-0.3.0/tests/test_rl_gym_env.py +89 -0
  301. creature_lab-0.3.0/tests/test_rl_train.py +90 -0
  302. creature_lab-0.3.0/tests/test_robot_actuator.py +52 -0
  303. creature_lab-0.3.0/tests/test_robot_analysis.py +142 -0
  304. creature_lab-0.3.0/tests/test_robot_catalog.py +67 -0
  305. creature_lab-0.3.0/tests/test_robot_cli.py +43 -0
  306. creature_lab-0.3.0/tests/test_robot_compare.py +219 -0
  307. creature_lab-0.3.0/tests/test_robot_fetch.py +79 -0
  308. creature_lab-0.3.0/tests/test_robot_footprint.py +42 -0
  309. creature_lab-0.3.0/tests/test_robot_media.py +35 -0
  310. creature_lab-0.3.0/tests/test_robot_panel.py +266 -0
  311. creature_lab-0.3.0/tests/test_robot_report.py +51 -0
  312. creature_lab-0.3.0/tests/test_robot_simulation.py +119 -0
  313. creature_lab-0.3.0/tests/test_robot_stage.py +160 -0
  314. creature_lab-0.3.0/tests/test_robustness.py +207 -0
  315. creature_lab-0.3.0/tests/test_runs.py +212 -0
  316. creature_lab-0.3.0/tests/test_scaffold.py +105 -0
  317. creature_lab-0.3.0/tests/test_scoring.py +69 -0
  318. creature_lab-0.3.0/tests/test_task_schema.py +50 -0
  319. creature_lab-0.3.0/tests/test_terrain.py +143 -0
  320. creature_lab-0.3.0/tests/test_trace_schema.py +104 -0
  321. creature_lab-0.3.0/tests/test_urdf_export.py +67 -0
  322. creature_lab-0.3.0/tests/test_validation.py +114 -0
  323. creature_lab-0.3.0/tests/test_viewer.py +282 -0
  324. creature_lab-0.3.0/tests/test_web_creatures.py +120 -0
  325. creature_lab-0.3.0/tests/test_web_server.py +692 -0
  326. creature_lab-0.3.0/tests/test_zoo.py +260 -0
  327. creature_lab-0.3.0/uv.lock +3768 -0
  328. creature_lab-0.3.0/web-ui/README.md +44 -0
  329. creature_lab-0.3.0/web-ui/index.html +15 -0
  330. creature_lab-0.3.0/web-ui/package-lock.json +1179 -0
  331. creature_lab-0.3.0/web-ui/package.json +27 -0
  332. creature_lab-0.3.0/web-ui/public/clips/unitree_g1.webp +0 -0
  333. creature_lab-0.3.0/web-ui/src/App.tsx +639 -0
  334. creature_lab-0.3.0/web-ui/src/api.ts +78 -0
  335. creature_lab-0.3.0/web-ui/src/clip.ts +90 -0
  336. creature_lab-0.3.0/web-ui/src/components/Editor.tsx +249 -0
  337. creature_lab-0.3.0/web-ui/src/components/Inspector.tsx +255 -0
  338. creature_lab-0.3.0/web-ui/src/components/Library.tsx +155 -0
  339. creature_lab-0.3.0/web-ui/src/components/LicenseDialog.tsx +64 -0
  340. creature_lab-0.3.0/web-ui/src/components/Stage.tsx +274 -0
  341. creature_lab-0.3.0/web-ui/src/components/Timeline.tsx +175 -0
  342. creature_lab-0.3.0/web-ui/src/decode.ts +70 -0
  343. creature_lab-0.3.0/web-ui/src/format.ts +157 -0
  344. creature_lab-0.3.0/web-ui/src/geometry.ts +46 -0
  345. creature_lab-0.3.0/web-ui/src/logic.test.ts +346 -0
  346. creature_lab-0.3.0/web-ui/src/main.tsx +10 -0
  347. creature_lab-0.3.0/web-ui/src/playback.ts +117 -0
  348. creature_lab-0.3.0/web-ui/src/prefs.ts +13 -0
  349. creature_lab-0.3.0/web-ui/src/robotView.ts +532 -0
  350. creature_lab-0.3.0/web-ui/src/styles.css +1354 -0
  351. creature_lab-0.3.0/web-ui/src/types.ts +200 -0
  352. creature_lab-0.3.0/web-ui/src/url.ts +40 -0
  353. creature_lab-0.3.0/web-ui/tsconfig.json +18 -0
  354. creature_lab-0.3.0/web-ui/vite.config.ts +19 -0
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "attribution": {
4
+ "commit": "",
5
+ "pr": "",
6
+ "sessionUrl": false
7
+ }
8
+ }
@@ -0,0 +1,3 @@
1
+ # Changes here will be overwritten by Copier; do not edit by hand.
2
+ _commit: v1.1.0
3
+ _src_path: gh:oney-erge/launcher-kit
@@ -0,0 +1,9 @@
1
+ .git
2
+ .github
3
+ .venv
4
+ .env
5
+ .env.*
6
+ runs
7
+ outputs
8
+ __pycache__
9
+ *.pyc
@@ -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/