dancerudiments 0.3.0__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.
Files changed (360) hide show
  1. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.gitattributes +5 -0
  2. dancerudiments-0.4.1/.github/workflows/demo-release.yml +319 -0
  3. dancerudiments-0.4.1/.github/workflows/rig-motion.yml +68 -0
  4. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/visualizer.yml +2 -21
  5. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.gitignore +8 -0
  6. dancerudiments-0.4.1/AGENTS.md +83 -0
  7. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/CMakeLists.txt +3 -1
  8. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/CONTRIBUTING.md +8 -0
  9. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/PKG-INFO +207 -58
  10. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/README.md +204 -57
  11. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/DanceRudiments.csproj +1 -1
  12. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/typescript/index.ts +7 -0
  13. dancerudiments-0.4.1/bindings/typescript/motion-packages.ts +604 -0
  14. dancerudiments-0.4.1/docs/ECOSYSTEM.md +32 -0
  15. dancerudiments-0.4.1/docs/blender-motion-import.md +228 -0
  16. dancerudiments-0.4.1/docs/mesh-demos.md +163 -0
  17. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/midi-harness.md +18 -7
  18. dancerudiments-0.4.1/docs/motion-packages.md +324 -0
  19. dancerudiments-0.4.1/docs/motion-sources.md +122 -0
  20. dancerudiments-0.4.1/docs/release-demo.md +232 -0
  21. dancerudiments-0.4.1/docs/rig-motion.md +285 -0
  22. dancerudiments-0.4.1/docs/rigify-catalogue.md +246 -0
  23. dancerudiments-0.4.1/examples/motion-packages/inspect_package.py +21 -0
  24. dancerudiments-0.4.1/examples/motion-packages/page-motion.mjs +168 -0
  25. dancerudiments-0.4.1/examples/rig-motion/README.md +93 -0
  26. dancerudiments-0.4.1/examples/rig-motion/beat-map-variable.json +16 -0
  27. dancerudiments-0.4.1/examples/rig-motion/quickstart.py +85 -0
  28. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/index.html +1 -1
  29. dancerudiments-0.4.1/motion-packages/README.md +49 -0
  30. dancerudiments-0.4.1/motion-packages/cmu-dance-sources.json +5283 -0
  31. dancerudiments-0.4.1/motion-packages/licenses/CC-BY-3.0.txt +319 -0
  32. dancerudiments-0.4.1/motion-packages/licenses/CC-BY-4.0.txt +396 -0
  33. dancerudiments-0.4.1/motion-packages/licenses/CC-BY-SA-4.0.txt +428 -0
  34. dancerudiments-0.4.1/motion-packages/licenses/CMU-Mocap.txt +318 -0
  35. dancerudiments-0.4.1/motion-packages/sources.json +5881 -0
  36. dancerudiments-0.4.1/motion-packages/space-xr-sources.json +495 -0
  37. dancerudiments-0.4.1/package-lock.json +524 -0
  38. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/package.json +25 -4
  39. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/pyproject.toml +12 -4
  40. dancerudiments-0.4.1/python/dancerudiments_authoring/__init__.py +23 -0
  41. dancerudiments-0.4.1/python/dancerudiments_authoring/blender_bridge.py +627 -0
  42. dancerudiments-0.4.1/python/dancerudiments_authoring/blender_import.py +973 -0
  43. dancerudiments-0.4.1/python/dancerudiments_authoring/bvh_import.py +724 -0
  44. dancerudiments-0.4.1/python/dancerudiments_authoring/motion.py +125 -0
  45. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_cli.py +150 -0
  46. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_clock.py +157 -0
  47. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_import.py +242 -0
  48. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_package_cli.py +67 -0
  49. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_packages.py +522 -0
  50. dancerudiments-0.4.1/python/dancerudiments_authoring/motion_sources/manifest.json +372 -0
  51. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/recording.py +12 -0
  52. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/catalogue.json +1 -0
  53. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_copy_chain.json +1 -0
  54. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_pivot.json +1 -0
  55. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_raw_copy.json +1 -0
  56. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_basic_super_copy.json +1 -0
  57. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_experimental_super_chain.json +1 -0
  58. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_basic_tongue.json +1 -0
  59. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_skin_eye.json +1 -0
  60. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_face_skin_jaw.json +1 -0
  61. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_faces_super_face.json +1 -0
  62. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_arm.json +1 -0
  63. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_front_paw.json +1 -0
  64. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_leg.json +1 -0
  65. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_paw.json +1 -0
  66. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_rear_paw.json +1 -0
  67. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_simple_tentacle.json +1 -0
  68. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_spline_tentacle.json +1 -0
  69. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_finger.json +1 -0
  70. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_limb.json +1 -0
  71. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_limbs_super_palm.json +1 -0
  72. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_anchor.json +1 -0
  73. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_basic_chain.json +1 -0
  74. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_glue.json +1 -0
  75. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_stretchy_chain.json +1 -0
  76. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_skin_transform_basic.json +1 -0
  77. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_basic_spine.json +1 -0
  78. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_basic_tail.json +1 -0
  79. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_super_head.json +1 -0
  80. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/component_spines_super_spine.json +1 -0
  81. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_bird.json +1 -0
  82. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_cat.json +1 -0
  83. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_horse.json +1 -0
  84. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_shark.json +1 -0
  85. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_animals_wolf.json +1 -0
  86. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_basic_basic_human.json +1 -0
  87. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_basic_basic_quadruped.json +1 -0
  88. dancerudiments-0.4.1/python/dancerudiments_authoring/rig_profiles/metarig_human.json +1 -0
  89. dancerudiments-0.4.1/python/dancerudiments_authoring/rigs.py +353 -0
  90. dancerudiments-0.4.1/tests/python/test_acquire_cmu_dance.py +125 -0
  91. dancerudiments-0.4.1/tests/python/test_acquire_space_xr.py +133 -0
  92. dancerudiments-0.4.1/tests/python/test_bvh_import.py +396 -0
  93. dancerudiments-0.4.1/tests/python/test_mesh_demo_assets.py +243 -0
  94. dancerudiments-0.4.1/tests/python/test_motion_clock.py +81 -0
  95. dancerudiments-0.4.1/tests/python/test_motion_collection.py +59 -0
  96. dancerudiments-0.4.1/tests/python/test_motion_import.py +173 -0
  97. dancerudiments-0.4.1/tests/python/test_motion_package_transactions.py +304 -0
  98. dancerudiments-0.4.1/tests/python/test_motion_package_verifier.py +71 -0
  99. dancerudiments-0.4.1/tests/python/test_motion_packages.py +193 -0
  100. dancerudiments-0.4.1/tests/python/test_motion_source_profiles.py +76 -0
  101. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_package_docs.py +67 -0
  102. dancerudiments-0.4.1/tests/python/test_release_pages.py +165 -0
  103. dancerudiments-0.4.1/tests/python/test_rig_motion.py +114 -0
  104. dancerudiments-0.4.1/tests/python/test_rig_motion_cli.py +86 -0
  105. dancerudiments-0.4.1/tests/python/test_rigs.py +148 -0
  106. dancerudiments-0.4.1/tests/typescript/mesh-demo.test.js +94 -0
  107. dancerudiments-0.4.1/tests/typescript/motion-package-fixtures.js +104 -0
  108. dancerudiments-0.4.1/tests/typescript/motion-packages.test.js +375 -0
  109. dancerudiments-0.4.1/tests/typescript/motion-page.test.js +87 -0
  110. dancerudiments-0.4.1/tools/acquire_cmu_dance.py +198 -0
  111. dancerudiments-0.4.1/tools/acquire_space_xr.py +261 -0
  112. dancerudiments-0.4.1/tools/blender_motion_import.py +11 -0
  113. dancerudiments-0.4.1/tools/blender_rigify_bridge.py +11 -0
  114. dancerudiments-0.4.1/tools/build_mesh_demo.mjs +193 -0
  115. dancerudiments-0.4.1/tools/build_mesh_demo_assets.py +397 -0
  116. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/check_package_docs.py +25 -4
  117. dancerudiments-0.4.1/tools/import_motion_collection.py +293 -0
  118. dancerudiments-0.4.1/tools/import_quaternius_robot.py +216 -0
  119. dancerudiments-0.4.1/tools/mesh_demo_assets/app.js +344 -0
  120. dancerudiments-0.4.1/tools/mesh_demo_assets/character.js +183 -0
  121. dancerudiments-0.4.1/tools/mesh_demo_assets/index.html +55 -0
  122. dancerudiments-0.4.1/tools/mesh_demo_assets/style.css +2 -0
  123. dancerudiments-0.4.1/tools/mesh_demo_assets/transport.js +28 -0
  124. dancerudiments-0.4.1/tools/mesh_demo_sources.json +417 -0
  125. dancerudiments-0.4.1/tools/motion_package.py +7 -0
  126. dancerudiments-0.4.1/tools/package_recording_runtime.mjs +23 -0
  127. dancerudiments-0.4.1/tools/package_release_pages.py +291 -0
  128. dancerudiments-0.4.1/tools/rig_motion.py +10 -0
  129. dancerudiments-0.4.1/tools/test_blender_motion_batch.py +313 -0
  130. dancerudiments-0.4.1/tools/test_blender_motion_imports.py +206 -0
  131. dancerudiments-0.4.1/tools/test_blender_rigify_bridge.py +249 -0
  132. dancerudiments-0.4.1/tools/test_mesh_demo_browser.py +327 -0
  133. dancerudiments-0.4.1/tools/verify_motion_package.py +190 -0
  134. dancerudiments-0.3.0/.github/workflows/demo-release.yml +0 -104
  135. dancerudiments-0.3.0/AGENTS.md +0 -25
  136. dancerudiments-0.3.0/docs/release-demo.md +0 -116
  137. dancerudiments-0.3.0/package-lock.json +0 -31
  138. dancerudiments-0.3.0/python/dancerudiments_authoring/__init__.py +0 -10
  139. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/ci.yml +0 -0
  140. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/csharp.yml +0 -0
  141. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/initial-collection.yml +0 -0
  142. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/nuget-verify.yml +0 -0
  143. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/patterns.yml +0 -0
  144. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/recordings.yml +0 -0
  145. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/release-tag.yml +0 -0
  146. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/.github/workflows/release.yml +0 -0
  147. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/AUTHORS.md +0 -0
  148. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/CHANGELOG.md +0 -0
  149. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/LICENSE +0 -0
  150. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/.gitignore +0 -0
  151. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/NativeMethods.cs +0 -0
  152. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/Offset3.cs +0 -0
  153. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/PatternDefinition.cs +0 -0
  154. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/PatternLibrary.cs +0 -0
  155. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/DanceRudiments/Rudiments.cs +0 -0
  156. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/README.md +0 -0
  157. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/native/CMakeLists.txt +0 -0
  158. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/native/c_api.cpp +0 -0
  159. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/csharp/platforms.json +0 -0
  160. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/python/module.cpp +0 -0
  161. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/typescript/defaults.ts +0 -0
  162. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/bindings/typescript/wasm.cpp +0 -0
  163. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/cmake/DanceRudimentsConfig.cmake.in +0 -0
  164. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/atlas/README.md +0 -0
  165. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/atlas/atlas.score.json +0 -0
  166. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/atlas/definitions.py +0 -0
  167. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/atlas/manifest.json +0 -0
  168. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/README.md +0 -0
  169. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/club.score.json +0 -0
  170. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/definitions.py +0 -0
  171. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/manifest.json +0 -0
  172. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/rhythms.json +0 -0
  173. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/club/sources.json +0 -0
  174. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/continuum/README.md +0 -0
  175. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/continuum/continuum.score.json +0 -0
  176. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/continuum/definitions.py +0 -0
  177. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/continuum/manifest.json +0 -0
  178. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/README.md +0 -0
  179. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/definitions.py +0 -0
  180. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/manifest.json +0 -0
  181. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/recipes.json +0 -0
  182. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/rhythms.json +0 -0
  183. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/dancefloor/sources.json +0 -0
  184. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/defaults.json +0 -0
  185. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/expansion/README.md +0 -0
  186. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/expansion/definitions.py +0 -0
  187. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/expansion/expansion.score.json +0 -0
  188. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/expansion/manifest.json +0 -0
  189. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/README.md +0 -0
  190. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/THIRD_PARTY_NOTICES.md +0 -0
  191. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/definitions.py +0 -0
  192. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/initial.score.json +0 -0
  193. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/manifest.json +0 -0
  194. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/preview_data.inc +0 -0
  195. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/preview_sampler.cpp +0 -0
  196. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/preview_wasm.json +0 -0
  197. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_0001_256.h +0 -0
  198. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_0010_256.h +0 -0
  199. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_R_asym_saw_05_256.h +0 -0
  200. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/akwf/AKWF_R_asym_saw_15_256.h +0 -0
  201. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/d3-ease/LICENSE +0 -0
  202. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/collections/initial/sources/groove/1_funk_80_beat_4-4.mid.b64 +0 -0
  203. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/conanfile.py +0 -0
  204. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/authoring.md +0 -0
  205. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/bindings.md +0 -0
  206. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/branding/README.md +0 -0
  207. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/branding/logo-monochrome.svg +0 -0
  208. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/branding/logo.png +0 -0
  209. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/branding/logo.svg +0 -0
  210. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/ci-reproducibility.md +0 -0
  211. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/csharp.md +0 -0
  212. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/dancefloor.md +0 -0
  213. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/default-library.md +0 -0
  214. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/images/capture.json +0 -0
  215. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/images/visualizer-amen-desktop.png +0 -0
  216. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/images/visualizer-midi-score.png +0 -0
  217. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/images/visualizer-mobile.png +0 -0
  218. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/recordings.md +0 -0
  219. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/released-viewers.md +0 -0
  220. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/docs/troubleshooting.md +0 -0
  221. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/README.md +0 -0
  222. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/cpp/CMakeLists.txt +0 -0
  223. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/cpp/main.cpp +0 -0
  224. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/csharp/.gitignore +0 -0
  225. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/csharp/Program.cs +0 -0
  226. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/csharp/Quickstart.csproj +0 -0
  227. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/javascript/node.mjs +0 -0
  228. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/pulse.score.json +0 -0
  229. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/python/quickstart.py +0 -0
  230. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/python/sample_motion.py +0 -0
  231. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/typescript/.gitignore +0 -0
  232. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/typescript/app.ts +0 -0
  233. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/typescript/index.html +0 -0
  234. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/typescript/tsconfig.json +0 -0
  235. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/bindings/typescript/wasm.d.ts +0 -0
  236. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/examples/patterns/starter.json +0 -0
  237. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/app.js +0 -0
  238. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/beats.json +0 -0
  239. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/dancerudiments.js +0 -0
  240. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/index.json +0 -0
  241. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/initial/app.js +0 -0
  242. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/initial/style.css +0 -0
  243. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/initial/template.html +0 -0
  244. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/initial-collection.html +0 -0
  245. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/harness/style.css +0 -0
  246. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/c_api.h +0 -0
  247. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/atlas.hpp +0 -0
  248. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/club.hpp +0 -0
  249. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/continuum.hpp +0 -0
  250. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/dancefloor.hpp +0 -0
  251. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/expansion.hpp +0 -0
  252. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/collections/initial.hpp +0 -0
  253. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/dance_rudiments.hpp +0 -0
  254. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/detail/default_includes.inc +0 -0
  255. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/detail/default_registry.inc +0 -0
  256. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/recording.hpp +0 -0
  257. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/recording_view.hpp +0 -0
  258. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/include/dancerudiments/sampled_pattern.hpp +0 -0
  259. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/packaging/CPP_BINARY_README.md +0 -0
  260. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/__main__.py +0 -0
  261. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/_reproducibility.py +0 -0
  262. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/_validation.py +0 -0
  263. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/cli.py +0 -0
  264. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/collections.py +0 -0
  265. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/compiler.py +0 -0
  266. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/curves.py +0 -0
  267. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/events.py +0 -0
  268. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness.py +0 -0
  269. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/app.js +0 -0
  270. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/beat_player.js +0 -0
  271. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/recording.wasm.b64 +0 -0
  272. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/recording.wasm.json +0 -0
  273. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/style.css +0 -0
  274. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_assets/template.html +0 -0
  275. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/harness_checks.py +0 -0
  276. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/initial_sources.py +0 -0
  277. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/io.py +0 -0
  278. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/model.py +0 -0
  279. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/THIRD_PARTY_NOTICES.md +0 -0
  280. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/atlas.json +0 -0
  281. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/club.json +0 -0
  282. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/continuum.json +0 -0
  283. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/dancefloor.json +0 -0
  284. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/expansion.json +0 -0
  285. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/python/dancerudiments_authoring/packs/initial.json +0 -0
  286. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/release_version-v3.py +0 -0
  287. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/src/dance_rudiments.cpp +0 -0
  288. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/src/sampled_pattern.cpp +0 -0
  289. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/browser/test_initial_gallery.py +0 -0
  290. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/consumer/CMakeLists.txt +0 -0
  291. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/consumer/main.cpp +0 -0
  292. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_c_api.cpp +0 -0
  293. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_club.cpp +0 -0
  294. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_continuum.cpp +0 -0
  295. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_dancefloor.cpp +0 -0
  296. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_default_registration.cpp +0 -0
  297. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_initial_collection.cpp +0 -0
  298. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_main.cpp +0 -0
  299. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_recording.cpp +0 -0
  300. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/cpp/test_sampled_pattern.cpp +0 -0
  301. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/csharp/.gitignore +0 -0
  302. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/csharp/DanceRudiments.Tests.csproj +0 -0
  303. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/csharp/Program.cs +0 -0
  304. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/csharp/packaging/test_packaging.py +0 -0
  305. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/csharp/packaging/test_publish_verification.py +0 -0
  306. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_atlas.py +0 -0
  307. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_authoring.py +0 -0
  308. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_club.py +0 -0
  309. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_continuum.py +0 -0
  310. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_dancefloor.py +0 -0
  311. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_defaults.py +0 -0
  312. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_expansion.py +0 -0
  313. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_harness_beats.py +0 -0
  314. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_harness_display.py +0 -0
  315. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_initial_collection.py +0 -0
  316. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_native.py +0 -0
  317. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_recording.py +0 -0
  318. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_recording_source_eol.py +0 -0
  319. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_release_demo_compact.py +0 -0
  320. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_release_version.py +0 -0
  321. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/python/test_reproducibility.py +0 -0
  322. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/beat-player.test.js +0 -0
  323. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/defaults.test.js +0 -0
  324. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/initial-wasm.test.mjs +0 -0
  325. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/patterns.test.js +0 -0
  326. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/runtime.test.js +0 -0
  327. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tests/typescript/wasm-smoke.mjs +0 -0
  328. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_atlas_collection.py +0 -0
  329. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_club_collection.py +0 -0
  330. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_club_demo.py +0 -0
  331. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_continuum_collection.py +0 -0
  332. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_dancefloor_collection.py +0 -0
  333. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_dancefloor_demo.py +0 -0
  334. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_default_catalogue.py +0 -0
  335. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_expansion_collection.py +0 -0
  336. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_harness.py +0 -0
  337. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_initial_collection.py +0 -0
  338. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/build_recording_wasm.py +0 -0
  339. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/capture_readme_screenshots.py +0 -0
  340. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/check_release_version.py +0 -0
  341. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/club_demo_assets/app.js +0 -0
  342. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/club_demo_assets/style.css +0 -0
  343. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/club_demo_assets/template.html +0 -0
  344. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/compile_patterns.py +0 -0
  345. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/csharp_package.py +0 -0
  346. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/app.js +0 -0
  347. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/style.css +0 -0
  348. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/dancefloor_demo_assets/template.html +0 -0
  349. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/export_default_catalogue.cpp +0 -0
  350. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/export_harness_midi.mjs +0 -0
  351. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/harness_beats.py +0 -0
  352. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/recording_wasm.cpp +0 -0
  353. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/release_demo.py +0 -0
  354. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/release_version.py +0 -0
  355. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/render_club_demo.py +0 -0
  356. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/render_dancefloor_demo.py +0 -0
  357. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/render_release_demo.py +0 -0
  358. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/test_midi_harness.py +0 -0
  359. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tools/test_recording_harness.py +0 -0
  360. {dancerudiments-0.3.0 → dancerudiments-0.4.1}/tsconfig.json +0 -0
@@ -37,3 +37,8 @@ tools/recording_wasm.cpp text eol=lf
37
37
  include/dancerudiments/recording_view.hpp text eol=lf
38
38
  python/dancerudiments_authoring/harness_assets/recording.wasm.json text eol=lf
39
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,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
- - uses: actions/upload-pages-artifact@v4
48
- if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && vars.DANCERUDIMENTS_PAGES_ENABLED == 'true'
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.3.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)
@@ -120,6 +120,8 @@ install(DIRECTORY docs/ DESTINATION "${DANCERUDIMENTS_DOC_DIR}/docs"
120
120
  FILES_MATCHING PATTERN "*.md" PATTERN "*.png" PATTERN "*.svg" PATTERN "capture.json")
121
121
  install(DIRECTORY examples/bindings/ DESTINATION "${DANCERUDIMENTS_DOC_DIR}/examples/bindings"
122
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)
123
125
 
124
126
 
125
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.