dancerudiments 0.2.4__tar.gz → 0.4.1__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.
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.gitattributes +12 -0
- dancerudiments-0.4.1/.github/workflows/demo-release.yml +319 -0
- dancerudiments-0.4.1/.github/workflows/recordings.yml +55 -0
- dancerudiments-0.4.1/.github/workflows/rig-motion.yml +68 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/visualizer.yml +2 -21
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.gitignore +8 -0
- dancerudiments-0.4.1/AGENTS.md +83 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/CMakeLists.txt +6 -1
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/CONTRIBUTING.md +8 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/PKG-INFO +277 -46
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/README.md +274 -45
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/DanceRudiments.csproj +1 -1
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/python/module.cpp +11 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/typescript/index.ts +7 -0
- dancerudiments-0.4.1/bindings/typescript/motion-packages.ts +604 -0
- dancerudiments-0.4.1/docs/ECOSYSTEM.md +32 -0
- dancerudiments-0.4.1/docs/blender-motion-import.md +228 -0
- dancerudiments-0.4.1/docs/mesh-demos.md +163 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/midi-harness.md +18 -7
- dancerudiments-0.4.1/docs/motion-packages.md +324 -0
- dancerudiments-0.4.1/docs/motion-sources.md +122 -0
- dancerudiments-0.4.1/docs/recordings.md +196 -0
- dancerudiments-0.4.1/docs/release-demo.md +232 -0
- dancerudiments-0.4.1/docs/released-viewers.md +221 -0
- dancerudiments-0.4.1/docs/rig-motion.md +285 -0
- dancerudiments-0.4.1/docs/rigify-catalogue.md +246 -0
- dancerudiments-0.4.1/examples/motion-packages/inspect_package.py +21 -0
- dancerudiments-0.4.1/examples/motion-packages/page-motion.mjs +168 -0
- dancerudiments-0.4.1/examples/rig-motion/README.md +93 -0
- dancerudiments-0.4.1/examples/rig-motion/beat-map-variable.json +16 -0
- dancerudiments-0.4.1/examples/rig-motion/quickstart.py +85 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/index.html +1 -1
- dancerudiments-0.4.1/include/dancerudiments/recording.hpp +54 -0
- dancerudiments-0.4.1/include/dancerudiments/recording_view.hpp +19 -0
- dancerudiments-0.4.1/motion-packages/README.md +49 -0
- dancerudiments-0.4.1/motion-packages/cmu-dance-sources.json +5283 -0
- dancerudiments-0.4.1/motion-packages/licenses/CC-BY-3.0.txt +319 -0
- dancerudiments-0.4.1/motion-packages/licenses/CC-BY-4.0.txt +396 -0
- dancerudiments-0.4.1/motion-packages/licenses/CC-BY-SA-4.0.txt +428 -0
- dancerudiments-0.4.1/motion-packages/licenses/CMU-Mocap.txt +318 -0
- dancerudiments-0.4.1/motion-packages/sources.json +5881 -0
- dancerudiments-0.4.1/motion-packages/space-xr-sources.json +495 -0
- dancerudiments-0.4.1/package-lock.json +524 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/package.json +25 -4
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/pyproject.toml +12 -4
- dancerudiments-0.4.1/python/dancerudiments_authoring/__init__.py +23 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/blender_bridge.py +627 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/blender_import.py +973 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/bvh_import.py +724 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/harness.py +128 -0
- {dancerudiments-0.2.4/tools/release_demo_assets → dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets}/app.js +173 -29
- dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets/recording.wasm.b64 +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets/recording.wasm.json +5 -0
- {dancerudiments-0.2.4/tools/release_demo_assets → dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets}/style.css +13 -0
- {dancerudiments-0.2.4/tools/release_demo_assets → dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets}/template.html +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/harness_checks.py +70 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion.py +125 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_cli.py +150 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_clock.py +157 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_import.py +242 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_package_cli.py +67 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_packages.py +522 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/motion_sources/manifest.json +372 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/recording.py +184 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/catalogue.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_copy_chain.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_pivot.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_raw_copy.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_super_copy.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_experimental_super_chain.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_basic_tongue.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_skin_eye.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_skin_jaw.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_faces_super_face.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_arm.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_front_paw.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_leg.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_paw.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_rear_paw.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_simple_tentacle.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_spline_tentacle.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_finger.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_limb.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_palm.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_anchor.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_basic_chain.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_glue.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_stretchy_chain.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_transform_basic.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_basic_spine.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_basic_tail.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_super_head.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_super_spine.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_bird.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_cat.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_horse.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_shark.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_wolf.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_basic_basic_human.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_basic_basic_quadruped.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_human.json +1 -0
- dancerudiments-0.4.1/python/dancerudiments_authoring/rigs.py +353 -0
- dancerudiments-0.4.1/tests/cpp/test_recording.cpp +26 -0
- dancerudiments-0.4.1/tests/python/test_acquire_cmu_dance.py +125 -0
- dancerudiments-0.4.1/tests/python/test_acquire_space_xr.py +133 -0
- dancerudiments-0.4.1/tests/python/test_bvh_import.py +396 -0
- dancerudiments-0.4.1/tests/python/test_harness_display.py +38 -0
- dancerudiments-0.4.1/tests/python/test_mesh_demo_assets.py +243 -0
- dancerudiments-0.4.1/tests/python/test_motion_clock.py +81 -0
- dancerudiments-0.4.1/tests/python/test_motion_collection.py +59 -0
- dancerudiments-0.4.1/tests/python/test_motion_import.py +173 -0
- dancerudiments-0.4.1/tests/python/test_motion_package_transactions.py +304 -0
- dancerudiments-0.4.1/tests/python/test_motion_package_verifier.py +71 -0
- dancerudiments-0.4.1/tests/python/test_motion_packages.py +193 -0
- dancerudiments-0.4.1/tests/python/test_motion_source_profiles.py +76 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_package_docs.py +67 -0
- dancerudiments-0.4.1/tests/python/test_recording.py +126 -0
- dancerudiments-0.4.1/tests/python/test_recording_source_eol.py +39 -0
- dancerudiments-0.4.1/tests/python/test_release_pages.py +165 -0
- dancerudiments-0.4.1/tests/python/test_rig_motion.py +114 -0
- dancerudiments-0.4.1/tests/python/test_rig_motion_cli.py +86 -0
- dancerudiments-0.4.1/tests/python/test_rigs.py +148 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/beat-player.test.js +1 -1
- dancerudiments-0.4.1/tests/typescript/mesh-demo.test.js +94 -0
- dancerudiments-0.4.1/tests/typescript/motion-package-fixtures.js +104 -0
- dancerudiments-0.4.1/tests/typescript/motion-packages.test.js +375 -0
- dancerudiments-0.4.1/tests/typescript/motion-page.test.js +87 -0
- dancerudiments-0.4.1/tools/acquire_cmu_dance.py +198 -0
- dancerudiments-0.4.1/tools/acquire_space_xr.py +261 -0
- dancerudiments-0.4.1/tools/blender_motion_import.py +11 -0
- dancerudiments-0.4.1/tools/blender_rigify_bridge.py +11 -0
- dancerudiments-0.4.1/tools/build_mesh_demo.mjs +193 -0
- dancerudiments-0.4.1/tools/build_mesh_demo_assets.py +397 -0
- dancerudiments-0.4.1/tools/build_recording_wasm.py +29 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/check_package_docs.py +25 -4
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/export_harness_midi.mjs +1 -1
- dancerudiments-0.4.1/tools/import_motion_collection.py +293 -0
- dancerudiments-0.4.1/tools/import_quaternius_robot.py +216 -0
- dancerudiments-0.4.1/tools/mesh_demo_assets/app.js +344 -0
- dancerudiments-0.4.1/tools/mesh_demo_assets/character.js +183 -0
- dancerudiments-0.4.1/tools/mesh_demo_assets/index.html +55 -0
- dancerudiments-0.4.1/tools/mesh_demo_assets/style.css +2 -0
- dancerudiments-0.4.1/tools/mesh_demo_assets/transport.js +28 -0
- dancerudiments-0.4.1/tools/mesh_demo_sources.json +417 -0
- dancerudiments-0.4.1/tools/motion_package.py +7 -0
- dancerudiments-0.4.1/tools/package_recording_runtime.mjs +23 -0
- dancerudiments-0.4.1/tools/package_release_pages.py +291 -0
- dancerudiments-0.4.1/tools/recording_wasm.cpp +8 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/release_demo.py +7 -15
- dancerudiments-0.4.1/tools/rig_motion.py +10 -0
- dancerudiments-0.4.1/tools/test_blender_motion_batch.py +313 -0
- dancerudiments-0.4.1/tools/test_blender_motion_imports.py +206 -0
- dancerudiments-0.4.1/tools/test_blender_rigify_bridge.py +249 -0
- dancerudiments-0.4.1/tools/test_mesh_demo_browser.py +327 -0
- dancerudiments-0.4.1/tools/test_recording_harness.py +157 -0
- dancerudiments-0.4.1/tools/verify_motion_package.py +190 -0
- dancerudiments-0.2.4/.github/workflows/demo-release.yml +0 -104
- dancerudiments-0.2.4/AGENTS.md +0 -9
- dancerudiments-0.2.4/docs/release-demo.md +0 -116
- dancerudiments-0.2.4/package-lock.json +0 -31
- dancerudiments-0.2.4/python/dancerudiments_authoring/__init__.py +0 -8
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/ci.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/csharp.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/initial-collection.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/nuget-verify.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/patterns.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/release-tag.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/.github/workflows/release.yml +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/AUTHORS.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/CHANGELOG.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/LICENSE +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/.gitignore +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/NativeMethods.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/Offset3.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/PatternDefinition.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/PatternLibrary.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/Rudiments.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/native/CMakeLists.txt +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/native/c_api.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/csharp/platforms.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/typescript/defaults.ts +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/bindings/typescript/wasm.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/cmake/DanceRudimentsConfig.cmake.in +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/atlas/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/atlas/atlas.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/atlas/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/atlas/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/club.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/rhythms.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/club/sources.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/continuum/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/continuum/continuum.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/continuum/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/continuum/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/recipes.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/rhythms.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/dancefloor/sources.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/defaults.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/expansion/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/expansion/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/expansion/expansion.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/expansion/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/THIRD_PARTY_NOTICES.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/definitions.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/initial.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/manifest.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/preview_data.inc +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/preview_sampler.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/preview_wasm.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_0001_256.h +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_0010_256.h +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_R_asym_saw_05_256.h +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_R_asym_saw_15_256.h +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/d3-ease/LICENSE +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/collections/initial/sources/groove/1_funk_80_beat_4-4.mid.b64 +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/conanfile.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/authoring.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/bindings.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/branding/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/branding/logo-monochrome.svg +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/branding/logo.png +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/branding/logo.svg +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/ci-reproducibility.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/csharp.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/dancefloor.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/default-library.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/images/capture.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/images/visualizer-amen-desktop.png +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/images/visualizer-midi-score.png +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/images/visualizer-mobile.png +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/docs/troubleshooting.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/cpp/CMakeLists.txt +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/cpp/main.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/csharp/.gitignore +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/csharp/Program.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/csharp/Quickstart.csproj +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/javascript/node.mjs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/pulse.score.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/python/quickstart.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/python/sample_motion.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/typescript/.gitignore +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/typescript/app.ts +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/typescript/index.html +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/typescript/tsconfig.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/bindings/typescript/wasm.d.ts +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/examples/patterns/starter.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/app.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/beats.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/dancerudiments.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/index.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/initial/app.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/initial/style.css +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/initial/template.html +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/initial-collection.html +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/harness/style.css +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/c_api.h +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/atlas.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/club.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/continuum.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/dancefloor.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/expansion.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/collections/initial.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/dance_rudiments.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/detail/default_includes.inc +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/detail/default_registry.inc +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/include/dancerudiments/sampled_pattern.hpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/packaging/CPP_BINARY_README.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/__main__.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/_reproducibility.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/_validation.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/cli.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/collections.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/compiler.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/curves.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/events.py +0 -0
- {dancerudiments-0.2.4/tools/release_demo_assets → dancerudiments-0.4.1/python/dancerudiments_authoring/harness_assets}/beat_player.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/initial_sources.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/io.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/model.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/THIRD_PARTY_NOTICES.md +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/atlas.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/club.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/continuum.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/dancefloor.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/expansion.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/initial.json +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/release_version-v3.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/src/dance_rudiments.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/src/sampled_pattern.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/browser/test_initial_gallery.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/consumer/CMakeLists.txt +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/consumer/main.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_c_api.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_club.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_continuum.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_dancefloor.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_default_registration.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_initial_collection.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_main.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/cpp/test_sampled_pattern.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/csharp/.gitignore +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/csharp/DanceRudiments.Tests.csproj +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/csharp/Program.cs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/csharp/packaging/test_packaging.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/csharp/packaging/test_publish_verification.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_atlas.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_authoring.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_club.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_continuum.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_dancefloor.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_defaults.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_expansion.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_harness_beats.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_initial_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_native.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_release_demo_compact.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_release_version.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/python/test_reproducibility.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/defaults.test.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/initial-wasm.test.mjs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/patterns.test.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/runtime.test.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tests/typescript/wasm-smoke.mjs +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_atlas_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_club_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_club_demo.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_continuum_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_dancefloor_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_dancefloor_demo.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_default_catalogue.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_expansion_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_harness.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/build_initial_collection.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/capture_readme_screenshots.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/check_release_version.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/club_demo_assets/app.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/club_demo_assets/style.css +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/club_demo_assets/template.html +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/compile_patterns.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/csharp_package.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/app.js +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/style.css +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/template.html +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/export_default_catalogue.cpp +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/harness_beats.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/release_version.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/render_club_demo.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/render_dancefloor_demo.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/render_release_demo.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tools/test_midi_harness.py +0 -0
- {dancerudiments-0.2.4 → dancerudiments-0.4.1}/tsconfig.json +0 -0
|
@@ -30,3 +30,15 @@ harness/beats.json text eol=lf
|
|
|
30
30
|
# Keep original DanceFlow artwork byte-identical across platform packages.
|
|
31
31
|
**/branding/*.svg text eol=lf
|
|
32
32
|
**/branding/*.png binary
|
|
33
|
+
|
|
34
|
+
# Recording WASM provenance hashes the actual C++ source bytes. Do not let
|
|
35
|
+
# core.autocrlf turn these into CRLF on Windows; do not weaken the SHA tests.
|
|
36
|
+
tools/recording_wasm.cpp text eol=lf
|
|
37
|
+
include/dancerudiments/recording_view.hpp text eol=lf
|
|
38
|
+
python/dancerudiments_authoring/harness_assets/recording.wasm.json text eol=lf
|
|
39
|
+
python/dancerudiments_authoring/harness_assets/recording.wasm.b64 text eol=lf
|
|
40
|
+
|
|
41
|
+
# Numbered rig profiles and source provenance remain reproducible on Windows.
|
|
42
|
+
python/dancerudiments_authoring/rig_profiles/** text eol=lf
|
|
43
|
+
python/dancerudiments_authoring/motion_sources/** text eol=lf
|
|
44
|
+
examples/rig-motion/** text eol=lf
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
name: Release demo
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags:
|
|
5
|
+
- 'v*.*.*'
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
release_tag:
|
|
9
|
+
description: 'Published release tag containing the complete demo tools (vMAJOR.MINOR.PATCH)'
|
|
10
|
+
required: true
|
|
11
|
+
type: string
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
concurrency:
|
|
15
|
+
group: release-demo-${{ github.event_name == 'push' && github.ref_name || inputs.release_tag }}
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
jobs:
|
|
18
|
+
render:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
timeout-minutes: 40
|
|
21
|
+
outputs:
|
|
22
|
+
version: ${{ steps.identity.outputs.version }}
|
|
23
|
+
commit: ${{ steps.identity.outputs.commit }}
|
|
24
|
+
tag: ${{ steps.identity.outputs.tag }}
|
|
25
|
+
env:
|
|
26
|
+
RELEASE_TAG: ${{ github.event_name == 'push' && github.ref_name || inputs.release_tag }}
|
|
27
|
+
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.cache/release-demo/browsers
|
|
28
|
+
PYTHONUNBUFFERED: '1'
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v6
|
|
31
|
+
with:
|
|
32
|
+
ref: refs/tags/${{ github.event_name == 'push' && github.ref_name || inputs.release_tag }}
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
persist-credentials: false
|
|
35
|
+
- uses: actions/setup-python@v6
|
|
36
|
+
with:
|
|
37
|
+
python-version: '3.13'
|
|
38
|
+
- uses: actions/setup-node@v6
|
|
39
|
+
with:
|
|
40
|
+
node-version: '24'
|
|
41
|
+
cache: npm
|
|
42
|
+
- name: Validate the tag and source version
|
|
43
|
+
id: identity
|
|
44
|
+
env:
|
|
45
|
+
GH_TOKEN: ${{ github.token }}
|
|
46
|
+
run: |
|
|
47
|
+
python - <<'PY'
|
|
48
|
+
import json, os, re, subprocess
|
|
49
|
+
from pathlib import Path
|
|
50
|
+
tag = os.environ['RELEASE_TAG']
|
|
51
|
+
if not re.fullmatch(r'v[0-9]+\.[0-9]+\.[0-9]+', tag):
|
|
52
|
+
raise SystemExit('release_tag must be vMAJOR.MINOR.PATCH')
|
|
53
|
+
def git(*args):
|
|
54
|
+
return subprocess.check_output(['git', *args], text=True).strip()
|
|
55
|
+
commit = git('rev-parse', 'HEAD')
|
|
56
|
+
if commit != git('rev-parse', '--verify', f'refs/tags/{tag}^{{commit}}'):
|
|
57
|
+
raise SystemExit('Checkout differs from the requested tag commit')
|
|
58
|
+
if os.environ['GITHUB_EVENT_NAME'] == 'push':
|
|
59
|
+
if commit != git('rev-parse', '--verify', os.environ['GITHUB_SHA'] + '^{commit}'):
|
|
60
|
+
raise SystemExit('Tag changed after the triggering push')
|
|
61
|
+
else:
|
|
62
|
+
release = json.loads(subprocess.check_output([
|
|
63
|
+
'gh', 'release', 'view', tag, '--repo', os.environ['GITHUB_REPOSITORY'],
|
|
64
|
+
'--json', 'tagName,isDraft'], text=True))
|
|
65
|
+
if release['tagName'] != tag or release['isDraft']:
|
|
66
|
+
raise SystemExit('Manual builds require an existing published release')
|
|
67
|
+
with Path(os.environ['GITHUB_ENV']).open('a') as stream:
|
|
68
|
+
stream.write(f'DEMO_VERSION={tag[1:]}\nDEMO_COMMIT={commit}\n')
|
|
69
|
+
with Path(os.environ['GITHUB_OUTPUT']).open('a') as stream:
|
|
70
|
+
stream.write(f'version={tag[1:]}\ncommit={commit}\ntag={tag}\n')
|
|
71
|
+
PY
|
|
72
|
+
python tools/release_version.py verify-tag "$RELEASE_TAG"
|
|
73
|
+
- name: Preflight project-local temporary and output directories
|
|
74
|
+
run: |
|
|
75
|
+
python - <<'PY'
|
|
76
|
+
import os, tempfile
|
|
77
|
+
from pathlib import Path
|
|
78
|
+
temporary_root = Path('.cache/release-demo/tmp').resolve()
|
|
79
|
+
for parent in (temporary_root, Path('dist/demo'), Path('dist/pages')):
|
|
80
|
+
parent.mkdir(parents=True, exist_ok=True)
|
|
81
|
+
with tempfile.TemporaryDirectory(prefix='preflight-', dir=parent) as name:
|
|
82
|
+
p = Path(name) / 'probe'
|
|
83
|
+
p.write_bytes(b'ready')
|
|
84
|
+
assert p.read_bytes() == b'ready'
|
|
85
|
+
p.rename(p.with_name('renamed'))
|
|
86
|
+
p.with_name('renamed').unlink()
|
|
87
|
+
with Path(os.environ['GITHUB_ENV']).open('a') as stream:
|
|
88
|
+
stream.write(f'TMPDIR={temporary_root}\n')
|
|
89
|
+
PY
|
|
90
|
+
node --input-type=module - <<'JS'
|
|
91
|
+
import {mkdtemp, writeFile, readFile, rename, rm} from 'node:fs/promises';
|
|
92
|
+
const dir = await mkdtemp('.cache/release-demo/tmp/node-preflight-');
|
|
93
|
+
await writeFile(dir + '/probe', 'ready');
|
|
94
|
+
if (await readFile(dir + '/probe', 'utf8') !== 'ready') throw Error('Temporary readback failed');
|
|
95
|
+
await rename(dir + '/probe', dir + '/renamed');
|
|
96
|
+
await rm(dir, {recursive: true});
|
|
97
|
+
JS
|
|
98
|
+
- name: Verify generated packs and default registration
|
|
99
|
+
run: |
|
|
100
|
+
python tools/build_initial_collection.py --check
|
|
101
|
+
python tools/build_expansion_collection.py --check
|
|
102
|
+
python tools/build_atlas_collection.py --check
|
|
103
|
+
python tools/build_continuum_collection.py --check
|
|
104
|
+
python tools/build_club_collection.py --check
|
|
105
|
+
python tools/build_dancefloor_collection.py --check
|
|
106
|
+
python tools/build_default_catalogue.py --check
|
|
107
|
+
- name: Install build-only tools and this checkout's native library
|
|
108
|
+
run: |
|
|
109
|
+
sudo apt-get update
|
|
110
|
+
sudo apt-get install --yes clang lld
|
|
111
|
+
python -m pip install '.[motion-import]' playwright==1.64.0
|
|
112
|
+
python -m playwright install --with-deps chromium
|
|
113
|
+
npm ci
|
|
114
|
+
- name: Test the package loader, mesh assets and site packaging
|
|
115
|
+
run: |
|
|
116
|
+
npm test
|
|
117
|
+
python -m unittest discover -s tests/python -p test_mesh_demo_assets.py -v
|
|
118
|
+
python -m unittest discover -s tests/python -p test_release_pages.py -v
|
|
119
|
+
- name: Generate the exact tagged native catalogue
|
|
120
|
+
run: python tools/release_demo.py --version "$DEMO_VERSION" --commit "$DEMO_COMMIT" --output-dir dist/demo
|
|
121
|
+
- name: Verify the full visualizer's MIDI transport
|
|
122
|
+
run: python tools/test_midi_harness.py "dist/demo/DanceRudiments-demo-v$DEMO_VERSION.html"
|
|
123
|
+
- name: Render, test, and package
|
|
124
|
+
run: python tools/render_release_demo.py "dist/demo/DanceRudiments-demo-v$DEMO_VERSION.html"
|
|
125
|
+
- name: Build and render the rhythm-and-audio audition page
|
|
126
|
+
run: |
|
|
127
|
+
python tools/build_club_demo.py --version "$DEMO_VERSION" --commit "$DEMO_COMMIT" --output "dist/demo/DanceRudiments-demo-club-v$DEMO_VERSION.html"
|
|
128
|
+
python tools/render_club_demo.py "dist/demo/DanceRudiments-demo-club-v$DEMO_VERSION.html"
|
|
129
|
+
- name: Build and render all beat mappings
|
|
130
|
+
run: |
|
|
131
|
+
python tools/build_dancefloor_demo.py --version "$DEMO_VERSION" --commit "$DEMO_COMMIT" --output "dist/demo/DanceRudiments-demo-dancefloor-v$DEMO_VERSION.html"
|
|
132
|
+
python tools/render_dancefloor_demo.py "dist/demo/DanceRudiments-demo-dancefloor-v$DEMO_VERSION.html"
|
|
133
|
+
- name: Stable self-contained visualizer download aliases
|
|
134
|
+
run: |
|
|
135
|
+
cp "dist/demo/DanceRudiments-demo-v$DEMO_VERSION.html" dist/demo/DanceRudiments-visualizer.html
|
|
136
|
+
cp "dist/demo/DanceRudiments-demo-v$DEMO_VERSION.json" dist/demo/DanceRudiments-visualizer.json
|
|
137
|
+
(cd dist/demo && sha256sum DanceRudiments-visualizer.html DanceRudiments-visualizer.json > DanceRudiments-visualizer.sha256)
|
|
138
|
+
- name: Build two pinned, independently loaded mesh dances
|
|
139
|
+
run: |
|
|
140
|
+
python tools/build_mesh_demo_assets.py --output-dir generated/mesh-demo-assets --cache-root .cache/motion-sources/cmu-dance --download
|
|
141
|
+
node tools/build_mesh_demo.mjs --assets-dir generated/mesh-demo-assets --output-dir dist/pages/meshes --version "$DEMO_VERSION" --commit "$DEMO_COMMIT"
|
|
142
|
+
python tools/package_release_pages.py prepare --pages-dir dist/pages --visualizer "dist/demo/DanceRudiments-demo-v$DEMO_VERSION.html" --version "$DEMO_VERSION" --commit "$DEMO_COMMIT"
|
|
143
|
+
- name: Verify actual skinned mesh playback in desktop and mobile Chromium
|
|
144
|
+
run: |
|
|
145
|
+
python tools/test_mesh_demo_browser.py --site-dir dist/pages --output-dir dist/demo --prefix "DanceRudiments-mesh-demos-v$DEMO_VERSION"
|
|
146
|
+
- name: Seal the complete tested site and distinct release downloads
|
|
147
|
+
run: |
|
|
148
|
+
python tools/package_release_pages.py seal --pages-dir dist/pages --output-dir dist/demo --qa-report "dist/demo/DanceRudiments-mesh-demos-v$DEMO_VERSION-browser.json" --version "$DEMO_VERSION" --commit "$DEMO_COMMIT"
|
|
149
|
+
(cd dist/demo && sha256sum --check ./*.sha256)
|
|
150
|
+
- uses: actions/upload-artifact@v6
|
|
151
|
+
with:
|
|
152
|
+
name: release-demo
|
|
153
|
+
path: dist/demo/*
|
|
154
|
+
if-no-files-found: error
|
|
155
|
+
- uses: actions/upload-artifact@v6
|
|
156
|
+
if: vars.DANCERUDIMENTS_PAGES_ENABLED == 'true'
|
|
157
|
+
with:
|
|
158
|
+
name: release-pages-manifest
|
|
159
|
+
path: dist/pages/site-manifest.json
|
|
160
|
+
if-no-files-found: error
|
|
161
|
+
- uses: actions/upload-pages-artifact@v4
|
|
162
|
+
if: vars.DANCERUDIMENTS_PAGES_ENABLED == 'true'
|
|
163
|
+
with:
|
|
164
|
+
path: dist/pages
|
|
165
|
+
- uses: actions/upload-artifact@v6
|
|
166
|
+
if: failure()
|
|
167
|
+
with:
|
|
168
|
+
name: release-demo-failure-evidence
|
|
169
|
+
path: dist/demo/*
|
|
170
|
+
if-no-files-found: warn
|
|
171
|
+
attach:
|
|
172
|
+
needs: render
|
|
173
|
+
runs-on: ubuntu-latest
|
|
174
|
+
timeout-minutes: 10
|
|
175
|
+
permissions:
|
|
176
|
+
contents: write
|
|
177
|
+
steps:
|
|
178
|
+
- uses: actions/download-artifact@v6
|
|
179
|
+
with:
|
|
180
|
+
name: release-demo
|
|
181
|
+
path: demo
|
|
182
|
+
- name: Attach to the existing release and verify uploaded bytes
|
|
183
|
+
env:
|
|
184
|
+
GH_TOKEN: ${{ github.token }}
|
|
185
|
+
RELEASE_TAG: ${{ needs.render.outputs.tag }}
|
|
186
|
+
DEMO_COMMIT: ${{ needs.render.outputs.commit }}
|
|
187
|
+
shell: bash
|
|
188
|
+
run: |
|
|
189
|
+
set -euo pipefail
|
|
190
|
+
for attempt in {1..60}; do
|
|
191
|
+
gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1 && break
|
|
192
|
+
if [ "$attempt" = 60 ]; then
|
|
193
|
+
echo "::error::GitHub Release $RELEASE_TAG was not created by release-tag.yml"
|
|
194
|
+
exit 1
|
|
195
|
+
fi
|
|
196
|
+
sleep 2
|
|
197
|
+
done
|
|
198
|
+
(cd demo && sha256sum --check ./*.sha256)
|
|
199
|
+
python - <<'PY'
|
|
200
|
+
import json, os, re, subprocess
|
|
201
|
+
from pathlib import Path
|
|
202
|
+
repo, tag = os.environ['GITHUB_REPOSITORY'], os.environ['RELEASE_TAG']
|
|
203
|
+
def gh(*args):
|
|
204
|
+
return subprocess.check_output(['gh', *args], text=True)
|
|
205
|
+
release = json.loads(gh('release', 'view', tag, '--repo', repo, '--json', 'tagName,isDraft,assets'))
|
|
206
|
+
if release['tagName'] != tag or release['isDraft']:
|
|
207
|
+
raise SystemExit('Expected the published release for the validated tag')
|
|
208
|
+
obj = json.loads(gh('api', f'repos/{repo}/git/ref/tags/{tag}'))['object']
|
|
209
|
+
for _ in range(8):
|
|
210
|
+
if obj['type'] != 'tag':
|
|
211
|
+
break
|
|
212
|
+
obj = json.loads(gh('api', f'repos/{repo}/git/tags/{obj["sha"]}'))['object']
|
|
213
|
+
if obj['type'] != 'commit' or obj['sha'] != os.environ['DEMO_COMMIT']:
|
|
214
|
+
raise SystemExit('Remote tag no longer matches the tested commit')
|
|
215
|
+
existing = {asset['name'] for asset in release['assets']}
|
|
216
|
+
files = sorted(Path('demo').iterdir())
|
|
217
|
+
verified = Path('verified'); verified.mkdir()
|
|
218
|
+
for path in files:
|
|
219
|
+
if not path.is_file() or not re.fullmatch(r'DanceRudiments-[A-Za-z0-9_.-]+', path.name):
|
|
220
|
+
raise SystemExit(f'Unexpected release attachment: {path.name}')
|
|
221
|
+
if path.name in existing:
|
|
222
|
+
gh('release', 'download', tag, '--repo', repo, '--pattern', path.name, '--dir', str(verified))
|
|
223
|
+
if (verified / path.name).read_bytes() != path.read_bytes():
|
|
224
|
+
raise SystemExit(f'Existing release asset differs; refusing to overwrite {path.name}')
|
|
225
|
+
# Check every collision before uploading any missing attachment.
|
|
226
|
+
for path in files:
|
|
227
|
+
if path.name not in existing:
|
|
228
|
+
gh('release', 'upload', tag, str(path), '--repo', repo)
|
|
229
|
+
gh('release', 'download', tag, '--repo', repo, '--pattern', path.name, '--dir', str(verified))
|
|
230
|
+
if (verified / path.name).read_bytes() != path.read_bytes():
|
|
231
|
+
raise SystemExit(f'Uploaded release asset differs: {path.name}')
|
|
232
|
+
PY
|
|
233
|
+
(cd verified && sha256sum --check ./*.sha256)
|
|
234
|
+
pages-target:
|
|
235
|
+
if: vars.DANCERUDIMENTS_PAGES_ENABLED == 'true'
|
|
236
|
+
needs: [render, attach]
|
|
237
|
+
runs-on: ubuntu-latest
|
|
238
|
+
outputs:
|
|
239
|
+
deploy: ${{ steps.latest.outputs.deploy }}
|
|
240
|
+
steps:
|
|
241
|
+
- name: Publish Pages only for the latest stable release
|
|
242
|
+
id: latest
|
|
243
|
+
env:
|
|
244
|
+
GH_TOKEN: ${{ github.token }}
|
|
245
|
+
RELEASE_TAG: ${{ needs.render.outputs.tag }}
|
|
246
|
+
run: |
|
|
247
|
+
latest_tag=$(gh api "repos/$GITHUB_REPOSITORY/releases/latest" --jq '.tag_name')
|
|
248
|
+
if [ "$latest_tag" = "$RELEASE_TAG" ]; then
|
|
249
|
+
echo 'deploy=true' >> "$GITHUB_OUTPUT"
|
|
250
|
+
else
|
|
251
|
+
echo 'deploy=false' >> "$GITHUB_OUTPUT"
|
|
252
|
+
echo "::notice::Release downloads verified; Pages skipped because $RELEASE_TAG is not the latest stable release ($latest_tag)."
|
|
253
|
+
echo "Pages was not deployed: $RELEASE_TAG is not the latest stable release ($latest_tag)." >> "$GITHUB_STEP_SUMMARY"
|
|
254
|
+
fi
|
|
255
|
+
deploy:
|
|
256
|
+
if: vars.DANCERUDIMENTS_PAGES_ENABLED == 'true' && needs.pages-target.outputs.deploy == 'true'
|
|
257
|
+
needs: [render, attach, pages-target]
|
|
258
|
+
runs-on: ubuntu-latest
|
|
259
|
+
timeout-minutes: 15
|
|
260
|
+
permissions:
|
|
261
|
+
contents: read
|
|
262
|
+
pages: write
|
|
263
|
+
id-token: write
|
|
264
|
+
concurrency:
|
|
265
|
+
group: dancerudiments-pages
|
|
266
|
+
cancel-in-progress: false
|
|
267
|
+
environment:
|
|
268
|
+
name: github-pages
|
|
269
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
270
|
+
steps:
|
|
271
|
+
- name: Recheck the latest release after waiting for deployment concurrency
|
|
272
|
+
id: current
|
|
273
|
+
env:
|
|
274
|
+
GH_TOKEN: ${{ github.token }}
|
|
275
|
+
RELEASE_TAG: ${{ needs.render.outputs.tag }}
|
|
276
|
+
run: |
|
|
277
|
+
latest_tag=$(gh api "repos/$GITHUB_REPOSITORY/releases/latest" --jq '.tag_name')
|
|
278
|
+
if [ "$latest_tag" = "$RELEASE_TAG" ]; then
|
|
279
|
+
echo 'deploy=true' >> "$GITHUB_OUTPUT"
|
|
280
|
+
else
|
|
281
|
+
echo 'deploy=false' >> "$GITHUB_OUTPUT"
|
|
282
|
+
echo "::notice::Pages skipped: $latest_tag became the latest stable release while $RELEASE_TAG waited."
|
|
283
|
+
echo "Pages was not deployed: a newer stable release is now current ($latest_tag)." >> "$GITHUB_STEP_SUMMARY"
|
|
284
|
+
fi
|
|
285
|
+
- uses: actions/checkout@v6
|
|
286
|
+
if: steps.current.outputs.deploy == 'true'
|
|
287
|
+
with:
|
|
288
|
+
ref: ${{ needs.render.outputs.commit }}
|
|
289
|
+
persist-credentials: false
|
|
290
|
+
- uses: actions/setup-python@v6
|
|
291
|
+
if: steps.current.outputs.deploy == 'true'
|
|
292
|
+
with:
|
|
293
|
+
python-version: '3.13'
|
|
294
|
+
- uses: actions/download-artifact@v6
|
|
295
|
+
if: steps.current.outputs.deploy == 'true'
|
|
296
|
+
with:
|
|
297
|
+
name: release-pages-manifest
|
|
298
|
+
path: expected-pages
|
|
299
|
+
- name: Read existing Pages configuration
|
|
300
|
+
if: steps.current.outputs.deploy == 'true'
|
|
301
|
+
uses: actions/configure-pages@v5
|
|
302
|
+
with:
|
|
303
|
+
enablement: false
|
|
304
|
+
- name: Deploy the complete tagged visualizer and mesh gallery
|
|
305
|
+
id: deployment
|
|
306
|
+
if: steps.current.outputs.deploy == 'true'
|
|
307
|
+
uses: actions/deploy-pages@v4
|
|
308
|
+
- name: Verify the live routes and every public asset against the tested artifact
|
|
309
|
+
if: steps.current.outputs.deploy == 'true'
|
|
310
|
+
env:
|
|
311
|
+
PAGE_URL: ${{ steps.deployment.outputs.page_url }}
|
|
312
|
+
run: |
|
|
313
|
+
python tools/package_release_pages.py verify --url "$PAGE_URL" --manifest expected-pages/site-manifest.json --report deployed-pages-verification.json --attempts 12 --retry-seconds 5
|
|
314
|
+
- uses: actions/upload-artifact@v6
|
|
315
|
+
if: steps.current.outputs.deploy == 'true'
|
|
316
|
+
with:
|
|
317
|
+
name: deployed-pages-verification
|
|
318
|
+
path: deployed-pages-verification.json
|
|
319
|
+
if-no-files-found: error
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: Recording harness and native compatibility
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
jobs:
|
|
10
|
+
recording-harness:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
timeout-minutes: 25
|
|
13
|
+
env:
|
|
14
|
+
DANCERUDIMENTS_REQUIRE_NATIVE: '1'
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v6
|
|
17
|
+
- uses: actions/setup-python@v6
|
|
18
|
+
with:
|
|
19
|
+
python-version: '3.13'
|
|
20
|
+
- uses: actions/setup-node@v6
|
|
21
|
+
with:
|
|
22
|
+
node-version: 22
|
|
23
|
+
- name: Build and install actual native/authoring package
|
|
24
|
+
run: |
|
|
25
|
+
python -m pip install . playwright
|
|
26
|
+
python -m playwright install --with-deps chromium
|
|
27
|
+
- name: Check committed sampler/source hashes and shared package APIs
|
|
28
|
+
run: |
|
|
29
|
+
python -m unittest discover -s tests/python -p test_recording.py -v
|
|
30
|
+
python -m unittest discover -s tests/python -p test_harness_display.py -v
|
|
31
|
+
- name: Check unchanged beat-player contracts after moving shared assets
|
|
32
|
+
run: node --test tests/typescript/beat-player.test.js
|
|
33
|
+
- name: Rebuild the generic native recording accessor
|
|
34
|
+
run: |
|
|
35
|
+
sudo apt-get update
|
|
36
|
+
sudo apt-get install -y clang lld
|
|
37
|
+
python tools/build_recording_wasm.py
|
|
38
|
+
- name: Native C++ recording and existing-pattern regressions
|
|
39
|
+
run: |
|
|
40
|
+
cmake -S . -B build-recordings -DCMAKE_BUILD_TYPE=Release
|
|
41
|
+
cmake --build build-recordings --parallel 2
|
|
42
|
+
ctest --test-dir build-recordings --output-on-failure
|
|
43
|
+
- name: Verify a freshly built recording page with real local-file loading
|
|
44
|
+
env:
|
|
45
|
+
PYTHONPATH: python
|
|
46
|
+
run: python tools/test_recording_harness.py recording-harness/index.html --make-fixture --screenshot recording-comparison.png
|
|
47
|
+
- uses: actions/upload-artifact@v6
|
|
48
|
+
if: always()
|
|
49
|
+
with:
|
|
50
|
+
name: native-recording-harness
|
|
51
|
+
path: |
|
|
52
|
+
recording-harness/
|
|
53
|
+
recording-comparison.png
|
|
54
|
+
recording-comparison-bars.png
|
|
55
|
+
if-no-files-found: warn
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Rigify motion
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
blender-native:
|
|
14
|
+
name: Blender 5.2.2 and native motion
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
timeout-minutes: 30
|
|
17
|
+
env:
|
|
18
|
+
DANCERUDIMENTS_REQUIRE_NATIVE: '1'
|
|
19
|
+
PIP_CACHE_DIR: ${{ github.workspace }}/.cache/pip
|
|
20
|
+
TMPDIR: ${{ github.workspace }}/.cache/tmp
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v6
|
|
23
|
+
with:
|
|
24
|
+
persist-credentials: false
|
|
25
|
+
- uses: actions/setup-python@v6
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.13'
|
|
28
|
+
- name: Probe project-local temporary output
|
|
29
|
+
run: |
|
|
30
|
+
python - <<'PY'
|
|
31
|
+
import os
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
import tempfile
|
|
34
|
+
parent = Path(os.environ['TMPDIR'])
|
|
35
|
+
parent.mkdir(parents=True, exist_ok=True)
|
|
36
|
+
with tempfile.TemporaryDirectory(dir=parent) as directory:
|
|
37
|
+
path = Path(directory) / 'probe'
|
|
38
|
+
path.write_bytes(b'rig-motion')
|
|
39
|
+
assert path.read_bytes() == b'rig-motion'
|
|
40
|
+
renamed = path.with_name('renamed')
|
|
41
|
+
path.rename(renamed)
|
|
42
|
+
assert renamed.read_bytes() == b'rig-motion'
|
|
43
|
+
renamed.unlink()
|
|
44
|
+
PY
|
|
45
|
+
- name: Install Blender runtime libraries
|
|
46
|
+
run: |
|
|
47
|
+
sudo apt-get update
|
|
48
|
+
sudo apt-get install -y libx11-6 libxxf86vm1 libxi6 libxfixes3 libxrender1 libsm6 libgl1 libegl1
|
|
49
|
+
- name: Install this native package and the pinned official bpy runtime
|
|
50
|
+
run: python -m pip install '.[motion-import]' bpy==5.2.2
|
|
51
|
+
- name: Validate profiles, interchange, clock and native playback
|
|
52
|
+
run: |
|
|
53
|
+
python -m unittest discover -s tests/python -p 'test_motion*.py' -v
|
|
54
|
+
python -m unittest discover -s tests/python -p 'test_rig*.py' -v
|
|
55
|
+
python -m unittest discover -s tests/python -p 'test_bvh_import.py' -v
|
|
56
|
+
python -m unittest discover -s tests/python -p 'test_acquire*.py' -v
|
|
57
|
+
- name: Exercise the installed CLI and synthetic timed motion
|
|
58
|
+
run: |
|
|
59
|
+
dancerudiments-rig profile human --output generated/human.profile.json
|
|
60
|
+
dancerudiments-rig channels generated/human.profile.json --output generated/human.channels.csv
|
|
61
|
+
python examples/rig-motion/quickstart.py --output generated/rig-motion --native
|
|
62
|
+
dancerudiments-rig inspect generated/rig-motion/synthetic.motion.json
|
|
63
|
+
- name: Verify generated rig, capture, native samples and actual skin deformation
|
|
64
|
+
run: python tools/test_blender_rigify_bridge.py --output-dir .cache/rigify-bridge-smoke
|
|
65
|
+
- name: Verify real BVH, FBX and glTF imports and capture timing
|
|
66
|
+
run: python tools/test_blender_motion_imports.py --output-dir .cache/blender-imports
|
|
67
|
+
- name: Verify multi-action extraction, source carriers and explicit Rigify mapping
|
|
68
|
+
run: python tools/test_blender_motion_batch.py --output-dir .cache/blender-batch
|
|
@@ -44,24 +44,5 @@ jobs:
|
|
|
44
44
|
name: standalone-pattern-visualizer
|
|
45
45
|
path: dist/visualizer/
|
|
46
46
|
if-no-files-found: error
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
with:
|
|
50
|
-
path: dist/visualizer
|
|
51
|
-
deploy:
|
|
52
|
-
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && vars.DANCERUDIMENTS_PAGES_ENABLED == 'true'
|
|
53
|
-
needs: build
|
|
54
|
-
runs-on: ubuntu-latest
|
|
55
|
-
permissions:
|
|
56
|
-
contents: read
|
|
57
|
-
pages: write
|
|
58
|
-
id-token: write
|
|
59
|
-
environment:
|
|
60
|
-
name: github-pages
|
|
61
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
62
|
-
steps:
|
|
63
|
-
- name: Configure Pages
|
|
64
|
-
uses: actions/configure-pages@v5
|
|
65
|
-
- name: Deploy visualizer only
|
|
66
|
-
id: deployment
|
|
67
|
-
uses: actions/deploy-pages@v4
|
|
47
|
+
# Main/PR previews remain artifacts. Only demo-release.yml publishes the
|
|
48
|
+
# complete tagged site, so this preview cannot erase its /meshes/ gallery.
|
|
@@ -15,6 +15,7 @@ CMakeUserPresets.json
|
|
|
15
15
|
/.npm-cache/
|
|
16
16
|
/venv/
|
|
17
17
|
/.venv/
|
|
18
|
+
/.cache/
|
|
18
19
|
__pycache__/
|
|
19
20
|
*.py[cod]
|
|
20
21
|
|
|
@@ -26,3 +27,10 @@ Thumbs.db
|
|
|
26
27
|
|
|
27
28
|
# Locally compiled authoring outputs
|
|
28
29
|
/generated/
|
|
30
|
+
|
|
31
|
+
# Optional rig motion datasets are independent downloads, never base-package assets.
|
|
32
|
+
/motion-packs/
|
|
33
|
+
/optional-motion-packs/
|
|
34
|
+
|
|
35
|
+
# Project-local model weights and caches
|
|
36
|
+
models/
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Agent instructions for DanceRudiments
|
|
2
|
+
|
|
3
|
+
- Read README.md, docs/ and the binding examples. Check the native catalogue, integer-pip timing, compositions and the C++, Python, WASM and C# bindings before adding a pattern or adapter.
|
|
4
|
+
- Use the relevant existing capabilities as fully as the task warrants. Always look for a useful improvement to this tool. Fix a reusable gap here rather than copying its engine or carrying a private workaround; record why no change is justified when that is the result.
|
|
5
|
+
- Submit improvements as PRs to https://github.com/kieransimkin/DanceRudiments/pulls. Never leave a completed reusable improvement only in a local fork. Keep changes focused and preserve the tool's identity and compatibility contracts.
|
|
6
|
+
- Add relevant regression coverage, documentation and a reproducible example when behaviour changes. Use tools/release_version.py and tools/check_release_version.py. Run the native and relevant binding tests from .github/workflows/ before packaging.
|
|
7
|
+
- Run `python tools/check_package_docs.py` before packaging; every nested first-party `README.md` in the package input trees must retain the canonical author music link. Preserve third-party `sources/` attribution and keep the actual archive checks enabled.
|
|
8
|
+
- Keep credentials, account data, private media and rights records out of source, fixtures, logs and packages. Use synthetic fixtures or explicitly authorised public examples and preserve their provenance/licences.
|
|
9
|
+
- Use [CONTRIBUTING.md](CONTRIBUTING.md) for review. Maintainers publish accepted, validated improvements as a fresh matching GitHub release and verify configured registry destinations. Preserve existing tags and release assets; publication and deployment remain subject to applicable authorisation.
|
|
10
|
+
- Website: https://kieransimkin.co.uk/danceflow/
|
|
11
|
+
|
|
12
|
+
## Keep README documentation current
|
|
13
|
+
|
|
14
|
+
- Whenever a feature is added or changed, update the relevant README.md in the same change to reflect the resulting behaviour. This applies to every feature addition or modification, including APIs, commands, configuration, defaults, integrations and removals.
|
|
15
|
+
- Update affected feature descriptions, usage instructions, options, examples and limitations. For tools or packages with their own README.md, update that README as well as the repository README when its overview or usage is affected.
|
|
16
|
+
- Check the README against the implemented and verified behaviour before committing, opening or merging a PR, publishing a release or handing off the work. A feature change is incomplete until its README documentation is current; a changelog or other documentation does not replace this requirement.
|
|
17
|
+
|
|
18
|
+
## Released viewers and coordinated CI/CD
|
|
19
|
+
|
|
20
|
+
- Read [docs/released-viewers.md](docs/released-viewers.md) before changing dependency, build or release behaviour. The sibling layout is `DanceRudiments/`, `react-timeline-sequence/`, and `stemlab/` under one parent.
|
|
21
|
+
- Release the two companions first (React Timeline Sequence, then DanceRudiments), verify their configured publication workflows and public registries, then synchronize/rebuild/test/release StemLab. A merge or tag alone is not a verified release.
|
|
22
|
+
- StemLab must target the **latest stable official releases**. No unreleased main commit, mutable development override, local `file:` archive or vendor package may substitute for a missing release. Latest is resolved before the build and locked to exact published versions, release commits and registry hashes for that run; fail visibly on stale or incompatible dependencies rather than falling back silently.
|
|
23
|
+
- Use the canonical `stemlab/scripts/Release-DanceFlow.ps1` coordinator from the shared parent directory. Preview first; `-Execute` explicitly performs scoped commits, normal pushes and fresh tags; `-Resume` must preserve source identities and existing tags/assets. Never force-push, move release tags, commit unrelated work, bypass failed checks or change approvals/protections/credentials to manufacture a pass.
|
|
24
|
+
- Update this repository's README.md and AGENTS.md in the same change whenever release policy, dependency rules, automation, commands, controls or validation change. Keep relevant package/feature READMEs current too. A separate guide or changelog does not replace the root README update.
|
|
25
|
+
- Preserve the master-plus-drums/percussion beat-routing contract, 64-pips-per-beat native recording clock, per-dimension bars and combined waveform/spectrogram lanes. New UI features must be supplied by released shared APIs and genuinely rebuilt frontend assets, not copied engines or marker strings.
|
|
26
|
+
- Distinguish source CI, package publication, full-song inference, browser/audio QA, artifact packaging, actual Pages deployment and live URL/audio verification. Keep all four Arcadians pages together; do not report unexecuted, skipped or older-commit checks as success. CI playback evidence is not subjective listening QA.
|
|
27
|
+
|
|
28
|
+
## Full ecosystem and release preflight
|
|
29
|
+
|
|
30
|
+
Before every new workflow run, check the latest stable official release and observe the actual runtime used by the job. Follow [the shared preflight](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/release-preflight.md) and this project's [people-and-agent guide](docs/ECOSYSTEM.md). Review the complete relevant capability inventory rather than only a familiar command. Consider every DanceFlow component against the actual task; use and compose all applicable supported capabilities, and improve a concrete reusable gap in its canonical repository. Record why existing capabilities suffice when no change is justified. No catalogue checklist expands the task, authorises model downloads/training, or proves integration. Preserve exact source/package identity, clocks, model-local storage, privacy, costs, immutable releases and separate deployment gates.
|
|
31
|
+
|
|
32
|
+
## Release mesh demos and Pages
|
|
33
|
+
|
|
34
|
+
- Read `docs/release-demo.md` and `docs/mesh-demos.md` before changing demo builds or deployment. Keep the root native visualizer and `meshes/` gallery together in `dist/pages`. `demo-release.yml` is the sole Pages publisher; main/PR `visualizer.yml` runs remain artifact-only and must not erase a released mesh route.
|
|
35
|
+
- Build from the exact validated tag and commit. Use tag pushes or manual dispatch for an existing compatible published tag; do not depend on a `release.published` event created with `GITHUB_TOKEN`. Old tags without the gallery cannot be retrofitted, moved or overwritten.
|
|
36
|
+
- Retain the `DANCERUDIMENTS_PAGES_ENABLED == 'true'` guard, `github-pages` environment, approvals and protections. Read Pages configuration without enabling or changing it. Only the latest stable official release may deploy, with a second latest-release check after waiting for the shared deployment concurrency slot. Older-tag attachment builds must report a Pages skip accurately.
|
|
37
|
+
- A `main` branch deployment rule does not authorize version tags. If the environment rejects a tag, report the exact annotation and request the maintainer's explicit tag-rule authorization; do not bypass it. Once authorized, retry the failed deployment from the same run while its artifact remains available. Do not rebuild or overwrite completed release attachments to recover a deployment-only failure.
|
|
38
|
+
- Keep original mesh geometry separate from captured source motion. The selected two-source builder may download only its explicitly requested, pinned files and must retain CMU/converter terms, hashes, units, axes and unverified musical timing. Optional motion files must remain outside the default catalogue and base package artifacts.
|
|
39
|
+
- Run `npm test`, `test_mesh_demo_assets.py`, `test_release_pages.py`, the existing native visualizer/MIDI browser gates, and `tools/test_mesh_demo_browser.py` for the complete site before sealing release assets. Preserve the shared native 64-pip sampler, exact profile bindings, lazy scene loading and resource disposal. A `--gallery-only` receipt is local evidence and cannot seal a complete release site.
|
|
40
|
+
- Bind browser evidence to every packaged site file and the exact release identity. Keep archives outside the Pages tree. Existing release assets are immutable: compare every collision before upload, retain identical bytes and refuse changed assets; never use `--clobber` for demo releases.
|
|
41
|
+
- Distinguish source tests, browser QA, sealed artifacts, attachment verification, actual Pages deployment and live route/asset verification. Check hosted precompressed motion bytes without HTTP content decoding. Do not report a successful main preview or older-commit deployment as a verified mesh release.
|
|
42
|
+
|
|
43
|
+
## Rigify motion validation
|
|
44
|
+
|
|
45
|
+
For rig-motion changes, read `docs/rig-motion.md`, `docs/rigify-catalogue.md` and
|
|
46
|
+
`docs/motion-sources.md`. Keep native 64-pip playback and the existing normalized
|
|
47
|
+
Recording contract; do not introduce another live sampler. Preserve each saved
|
|
48
|
+
profile's numbered channels and fingerprint. Regenerate built-in profiles only
|
|
49
|
+
with the explicitly pinned Blender/Rigify source, and label contextual components
|
|
50
|
+
and custom rigs accurately. Run the `test_motion*.py` and `test_rig*.py` suites
|
|
51
|
+
and `tools/test_blender_rigify_bridge.py` in the pinned `bpy` environment for
|
|
52
|
+
Blender-facing changes. For interchange changes, also run
|
|
53
|
+
`tools/test_blender_motion_imports.py --output-dir .cache/blender-imports`.
|
|
54
|
+
The `Rigify motion` workflow supplies that optional
|
|
55
|
+
integration gate. Use synthetic fixtures; research catalogue entries do not
|
|
56
|
+
authorize downloading or bundling third-party motion, models or media.
|
|
57
|
+
|
|
58
|
+
## Optional motion packages
|
|
59
|
+
|
|
60
|
+
Read `docs/motion-packages.md` and `docs/blender-motion-import.md` for changes to
|
|
61
|
+
optional model recordings. Keep motion payloads in ignored `motion-packs/`,
|
|
62
|
+
outside base npm/Python/native artifacts and the default catalogue. Do not add
|
|
63
|
+
automatic downloads, global data registration or a second live sampler.
|
|
64
|
+
Source-package downloads require task authorization and source-specific rights;
|
|
65
|
+
retain licence, attribution, source hash and conversion changes with every pack.
|
|
66
|
+
Never label a source skeleton as a Rigify retarget or time-only data as musical
|
|
67
|
+
beat alignment. Preserve complete-action pip bounds and distinguish action counts
|
|
68
|
+
from chunk counts.
|
|
69
|
+
|
|
70
|
+
Run `test_motion_packages.py`, `test_bvh_import.py`, the TypeScript package/page
|
|
71
|
+
tests via `npm test`, and the existing rig/recording tests. Blender import changes
|
|
72
|
+
also require `tools/test_blender_motion_batch.py` in the pinned runtime. The
|
|
73
|
+
`motion-import` extra supplies NumPy only for offline BVH conversion. Verify
|
|
74
|
+
base-package file lists exclude generated motion data before packaging; npm's
|
|
75
|
+
separate recording WASM asset must match its checked-in source hashes.
|
|
76
|
+
|
|
77
|
+
## Preflight temporary-directory access
|
|
78
|
+
|
|
79
|
+
Before any long, costly, model-backed, media-rendering, build, test, packaging or release command that creates private or atomic temporary directories, run a disposable preflight with the exact runtime, user or sandbox, and intended output parent. The probe must create a unique directory, write and read a file, atomically rename it, then remove the file and directory.
|
|
80
|
+
|
|
81
|
+
Keep temporary data and caches under the owning project on `Z:`; model weights and model-specific caches remain under that project's ignored `models/`. If the probe returns `WinError 5`, access denied, a rename failure or a cleanup failure, stop before the expensive command. Preserve the exact error and use the documented narrowly approved unrestricted recovery from the outset only when the task requires it. Use a fresh output directory and do not repeat the already-failing full job in the restricted shell.
|
|
82
|
+
|
|
83
|
+
After any unrestricted recovery, verify that the final output is readable and writable from the normal managed environment. If it is not, copy the completed bytes into a pre-created project-local directory that passed the probe, verify hashes, and retain the original failure and recovery evidence. Do not edit global ACLs, switch caches to `C:`, terminate unrelated processes or claim the underlying permission problem is fixed. Repositories that own temporary-directory creation should provide and test a reusable preflight helper rather than relying only on this instruction.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
cmake_minimum_required(VERSION 3.20)
|
|
2
|
-
project(DanceRudiments VERSION 0.
|
|
2
|
+
project(DanceRudiments VERSION 0.4.1
|
|
3
3
|
DESCRIPTION "Deterministic rhythmic position functions for DanceFlow. Music: https://kieransimkin.co.uk/my-songs/"
|
|
4
4
|
HOMEPAGE_URL "https://kieransimkin.co.uk/my-songs/"
|
|
5
5
|
LANGUAGES CXX)
|
|
@@ -59,6 +59,9 @@ endif()
|
|
|
59
59
|
|
|
60
60
|
if(DANCERUDIMENTS_BUILD_TESTS)
|
|
61
61
|
enable_testing()
|
|
62
|
+
add_executable(dancerudiments_recording_tests tests/cpp/test_recording.cpp)
|
|
63
|
+
target_link_libraries(dancerudiments_recording_tests PRIVATE DanceRudiments::DanceRudiments)
|
|
64
|
+
add_test(NAME dancerudiments_recordings COMMAND dancerudiments_recording_tests)
|
|
62
65
|
add_executable(dancerudiments_tests tests/cpp/test_main.cpp)
|
|
63
66
|
target_link_libraries(dancerudiments_tests PRIVATE DanceRudiments::DanceRudiments)
|
|
64
67
|
add_test(NAME dancerudiments_cpp COMMAND dancerudiments_tests)
|
|
@@ -117,6 +120,8 @@ install(DIRECTORY docs/ DESTINATION "${DANCERUDIMENTS_DOC_DIR}/docs"
|
|
|
117
120
|
FILES_MATCHING PATTERN "*.md" PATTERN "*.png" PATTERN "*.svg" PATTERN "capture.json")
|
|
118
121
|
install(DIRECTORY examples/bindings/ DESTINATION "${DANCERUDIMENTS_DOC_DIR}/examples/bindings"
|
|
119
122
|
PATTERN "dist" EXCLUDE PATTERN "bin" EXCLUDE PATTERN "obj" EXCLUDE PATTERN "__pycache__" EXCLUDE)
|
|
123
|
+
install(DIRECTORY examples/rig-motion/ DESTINATION "${DANCERUDIMENTS_DOC_DIR}/examples/rig-motion"
|
|
124
|
+
PATTERN "__pycache__" EXCLUDE)
|
|
120
125
|
|
|
121
126
|
|
|
122
127
|
# .NET is built by dotnet, not by CMake. Only the optional native bridge is built here.
|
|
@@ -10,3 +10,11 @@ Agents and people are welcome to improve DanceRudiments. Review its current capa
|
|
|
10
10
|
Maintainers review accepted changes, reserve a fresh version and publish a matching GitHub release from the validated source. They verify installable assets, checksums and each configured registry separately. Existing tags and release assets remain immutable. A submitted PR is a contribution awaiting review, not a published release or permission for unrelated deployment.
|
|
11
11
|
|
|
12
12
|
Website: [https://kieransimkin.co.uk/danceflow/](https://kieransimkin.co.uk/danceflow/).
|
|
13
|
+
|
|
14
|
+
## Before every new workflow
|
|
15
|
+
|
|
16
|
+
Check the latest stable official release and the actual installed/imported version before starting; do not infer currency from a directory name or a development checkout. Read the current release notes, tagged capability documentation and relevant Potential problems. Use the [DanceFlow release preflight](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/release-preflight.md) and [complete capability references](https://github.com/kieransimkin/DanceFlow/blob/main/docs/capabilities/index.md).
|
|
17
|
+
|
|
18
|
+
People and agents should consider the full ecosystem, use all capabilities that materially serve the task, compose supported files/APIs, and improve a demonstrated reusable gap in its canonical tool. Record why no worthwhile change is justified when that is the result. Keep independent tool identities, compatibility, source clocks, privacy, model/download costs and publication/deployment permissions intact. Store weights and model-specific caches in the owning project's ignored `models/`.
|
|
19
|
+
|
|
20
|
+
Read [the people-and-agent ecosystem guide](docs/ECOSYSTEM.md) before selecting or extending a tool.
|