danceflow-stemlab 1.3.1__tar.gz → 1.3.3__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 (165) hide show
  1. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/PKG-INFO +2 -2
  2. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/README.md +1 -1
  3. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/codex-publishing.md +7 -0
  4. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/mcp-registry/server.json +4 -4
  5. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
  6. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/plugin.json +1 -1
  7. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/build_codex_plugin.py +6 -0
  8. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/publish_mcp_registry.py +2 -0
  9. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/PKG-INFO +2 -2
  10. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/__init__.py +1 -1
  11. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_release.py +16 -0
  12. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/.agents/plugins/marketplace.json +0 -0
  13. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/.github/workflows/codex-plugin.yml +0 -0
  14. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/.github/workflows/release.yml +0 -0
  15. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/LICENSE +0 -0
  16. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/MANIFEST.in +0 -0
  17. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/branding/README.md +0 -0
  18. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/branding/logo-monochrome.svg +0 -0
  19. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/branding/logo.png +0 -0
  20. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/branding/logo.svg +0 -0
  21. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/codex-plugin.md +0 -0
  22. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/cue-alignment.md +0 -0
  23. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/evidence-models.md +0 -0
  24. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/docs/midi.md +0 -0
  25. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/.mcp.json +0 -0
  26. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/README.md +0 -0
  27. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
  28. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/branding/logo.png +0 -0
  29. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/branding/logo.svg +0 -0
  30. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/mcp.json +0 -0
  31. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
  32. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
  33. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/pyproject.toml +0 -0
  34. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/benchmark_evidence_corpus.py +0 -0
  35. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/capture_loop_workflow.py +0 -0
  36. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/check_codex_timeline.py +0 -0
  37. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/loop_demo.py +0 -0
  38. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/prepare_codex_marketplace.py +0 -0
  39. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/scripts/smoke_midi.py +0 -0
  40. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/setup.cfg +0 -0
  41. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/SOURCES.txt +0 -0
  42. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
  43. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
  44. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/requires.txt +0 -0
  45. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
  46. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/__main__.py +0 -0
  47. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/__init__.py +0 -0
  48. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/evidence/__init__.py +0 -0
  49. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/evidence/adapters.py +0 -0
  50. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/evidence/registry.py +0 -0
  51. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/evidence/runner.py +0 -0
  52. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/evidence/worker.py +0 -0
  53. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/harmony.py +0 -0
  54. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/loops.py +0 -0
  55. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/lyrics.py +0 -0
  56. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/__init__.py +0 -0
  57. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/adapters.py +0 -0
  58. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/artifacts.py +0 -0
  59. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/registry.py +0 -0
  60. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/runner.py +0 -0
  61. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/midi/worker.py +0 -0
  62. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/registry.py +0 -0
  63. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/rhythm.py +0 -0
  64. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/runner.py +0 -0
  65. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/semantic_audio.py +0 -0
  66. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/semantic_text.py +0 -0
  67. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/song_map.py +0 -0
  68. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/sonic.py +0 -0
  69. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/structure.py +0 -0
  70. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/tempo_regimes.py +0 -0
  71. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/analysis/transcription.py +0 -0
  72. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/audio.py +0 -0
  73. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/__init__.py +0 -0
  74. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/base.py +0 -0
  75. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/beatnet.py +0 -0
  76. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/beatthis.py +0 -0
  77. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/beattransformer.py +0 -0
  78. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/beats/common.py +0 -0
  79. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/bootstrap.py +0 -0
  80. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/branding.py +0 -0
  81. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/canonical.py +0 -0
  82. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/cli.py +0 -0
  83. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/__init__.py +0 -0
  84. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/__main__.py +0 -0
  85. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/bridge.py +0 -0
  86. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/jobs.py +0 -0
  87. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/paths.py +0 -0
  88. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/server.py +0 -0
  89. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/tasks.py +0 -0
  90. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/timeline.py +0 -0
  91. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/codex/worker.py +0 -0
  92. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/cue_cli.py +0 -0
  93. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/cues.py +0 -0
  94. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/lyric_lrc.py +0 -0
  95. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/manifest.py +0 -0
  96. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/models.py +0 -0
  97. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/pipeline.py +0 -0
  98. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/__init__.py +0 -0
  99. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/base.py +0 -0
  100. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/bsroformer.py +0 -0
  101. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/common.py +0 -0
  102. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/demucs.py +0 -0
  103. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/openunmix.py +0 -0
  104. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/separators/scnet.py +0 -0
  105. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/server.py +0 -0
  106. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/sonic_visualiser.py +0 -0
  107. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/spectrogram.py +0 -0
  108. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/spectrogram_repair.py +0 -0
  109. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/speech.py +0 -0
  110. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/types.py +0 -0
  111. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/util.py +0 -0
  112. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/vamp.py +0 -0
  113. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/vamp_runtime.py +0 -0
  114. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/app.js +0 -0
  115. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/arcadians-cover.jpg +0 -0
  116. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/arcadians-reference.json +0 -0
  117. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/index.html +0 -0
  118. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/style.css +0 -0
  119. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/web/timeline.css +0 -0
  120. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/webui.py +0 -0
  121. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/src/stemlab/word_alignment.py +0 -0
  122. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_analysis_registry.py +0 -0
  123. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_arcadians_fixture.py +0 -0
  124. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_audio_normalization.py +0 -0
  125. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_beat_consensus.py +0 -0
  126. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_beat_this_bootstrap.py +0 -0
  127. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_beatnet_bootstrap.py +0 -0
  128. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_beatnet_compat.py +0 -0
  129. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_branding.py +0 -0
  130. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_bsroformer_adapter.py +0 -0
  131. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_canonical.py +0 -0
  132. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_canonical_extended.py +0 -0
  133. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_bridge.py +0 -0
  134. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_jobs.py +0 -0
  135. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_package.py +0 -0
  136. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_protocol.py +0 -0
  137. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_codex_timeline.py +0 -0
  138. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_cue_integration.py +0 -0
  139. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_cues.py +0 -0
  140. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_deep_harmony.py +0 -0
  141. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_deep_lyrics.py +0 -0
  142. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_deep_sonic_rhythm.py +0 -0
  143. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_distribution_identity.py +0 -0
  144. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_docker_contract.py +0 -0
  145. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_evidence_models.py +0 -0
  146. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_loop_integration.py +0 -0
  147. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_loops.py +0 -0
  148. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_lyric_lrc.py +0 -0
  149. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_manifest.py +0 -0
  150. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_midi_adapters.py +0 -0
  151. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_midi_extraction.py +0 -0
  152. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_midi_integration.py +0 -0
  153. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_midi_registry.py +0 -0
  154. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_models.py +0 -0
  155. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_repository_hygiene.py +0 -0
  156. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_server.py +0 -0
  157. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_song_map.py +0 -0
  158. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_sonic_visualiser.py +0 -0
  159. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_sonic_visualiser_workspace.py +0 -0
  160. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_spectrogram.py +0 -0
  161. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_speech_repetition.py +0 -0
  162. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_vamp.py +0 -0
  163. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_vamp_runtime.py +0 -0
  164. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_web_frontend.py +0 -0
  165. {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.3}/tests/test_word_alignment.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: danceflow-stemlab
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Local music analysis for stems, timing, beats, harmony, lyrics, MIDI and loopable sections for Shorts. https://kieransimkin.co.uk/
5
5
  Author: Kieran Simkin
6
6
  Maintainer: Kieran Simkin
@@ -125,7 +125,7 @@ Dynamic: license-file
125
125
 
126
126
  # StemLab
127
127
 
128
- [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.1/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
128
+ [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.3/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
129
129
 
130
130
  By **[Kieran Simkin](https://kieransimkin.co.uk/)** · [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/) · [Vector logo and usage guide](docs/branding/README.md).
131
131
 
@@ -1,6 +1,6 @@
1
1
  # StemLab
2
2
 
3
- [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.1/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
3
+ [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.3/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
4
4
 
5
5
  By **[Kieran Simkin](https://kieransimkin.co.uk/)** · [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/) · [Vector logo and usage guide](docs/branding/README.md).
6
6
 
@@ -168,3 +168,10 @@ validation at submission. Upstream specification changes can require a new patch
168
168
  - [GitHub workflow event behaviour](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/trigger-a-workflow)
169
169
 
170
170
  - [uv tool invocation, extras and version selection](https://docs.astral.sh/uv/guides/tools/)
171
+
172
+
173
+ ## Potential problems
174
+
175
+ ### MCP Registry description length
176
+
177
+ On 8 October 2026 the 1.3.1 MCP publication returned HTTP 422 with `expected length <= 100` at `body.description`. The package summary including its website URL exceeded this registry field's limit. The matching maintainer report [registry issue 1184](https://github.com/modelcontextprotocol/registry/issues/1184) and [official OpenAPI schema](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/api/openapi.yaml), accessed 8 October 2026, confirm the 100-character bound. Use a concise registry-specific description and keep fuller capability wording in Python/package metadata. Both the builder and publisher now validate 1–100 characters locally, with empty, overlong and non-string regression cases. Do not overwrite published tags or distributions to repair a registry description; release a successor version.
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.kieransimkin/stemlab",
4
- "title": "StemLab — timing and loops for Shorts",
5
- "description": "Local music analysis for stems, timing, beats, harmony, lyrics, MIDI and loopable sections for Shorts. https://kieransimkin.co.uk/",
6
- "version": "1.3.1",
4
+ "title": "StemLab \u2014 timing and loops for Shorts",
5
+ "description": "Music and stem analysis, timing and loopable Shorts. https://kieransimkin.co.uk/",
6
+ "version": "1.3.3",
7
7
  "websiteUrl": "https://kieransimkin.co.uk/my-songs/",
8
8
  "repository": {
9
9
  "url": "https://github.com/kieransimkin/stemlab",
@@ -13,7 +13,7 @@
13
13
  {
14
14
  "registryType": "pypi",
15
15
  "identifier": "danceflow-stemlab",
16
- "version": "1.3.1",
16
+ "version": "1.3.3",
17
17
  "runtimeHint": "uvx",
18
18
  "runtimeArguments": [
19
19
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stemlab",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "Local music analysis for stems, timing, beats, harmony, lyrics, MIDI and loopable sections for Shorts. https://kieransimkin.co.uk/",
5
5
  "skills": "./skills/",
6
6
  "mcpServers": "./.mcp.json",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "stemlab",
4
- "version": "1.3.1",
4
+ "version": "1.3.3",
5
5
  "description": "Local music analysis for stems, timing, beats, harmony, lyrics, MIDI and loopable sections for Shorts. https://kieransimkin.co.uk/",
6
6
  "author": {
7
7
  "name": "Kieran Simkin",
@@ -58,9 +58,15 @@ def registry_metadata(root: Path, version: str) -> dict:
58
58
  value = json.loads((root / "mcp-registry/server.json").read_text(encoding="utf-8"))
59
59
  if value["name"] != "io.github.kieransimkin/stemlab":
60
60
  raise ValueError("Unexpected MCP registry namespace")
61
+ if not isinstance(value.get("description"), str) or not 1 <= len(value["description"]) <= 100:
62
+ raise ValueError("MCP registry description must contain 1 to 100 characters")
61
63
  if f'mcp-name: {value["name"]} -->' not in (root / "README.md").read_text(encoding="utf-8"):
62
64
  raise ValueError("PyPI README ownership marker is missing")
63
65
  value["version"] = version
66
+ value["icons"] = [{
67
+ "src": f"https://raw.githubusercontent.com/kieransimkin/stemlab/v{version}/docs/branding/logo.png",
68
+ "mimeType": "image/png", "sizes": ["256x256"],
69
+ }]
64
70
  for package in value["packages"]:
65
71
  if package["registryType"] != "pypi" or package["identifier"] != "danceflow-stemlab":
66
72
  raise ValueError("Unexpected MCP registry package")
@@ -43,6 +43,8 @@ def validate_metadata(data: dict, tag: str) -> str:
43
43
  raise ValueError("Unexpected registry identity")
44
44
  if tag != f"v{version}":
45
45
  raise ValueError("Registry version does not match the release tag")
46
+ if not isinstance(data.get("description"), str) or not 1 <= len(data["description"]) <= 100:
47
+ raise ValueError("MCP registry description must contain 1 to 100 characters")
46
48
  packages = data.get("packages", [])
47
49
  if len(packages) != 1 or packages[0].get("identifier") != "danceflow-stemlab":
48
50
  raise ValueError("Unexpected package")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: danceflow-stemlab
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Local music analysis for stems, timing, beats, harmony, lyrics, MIDI and loopable sections for Shorts. https://kieransimkin.co.uk/
5
5
  Author: Kieran Simkin
6
6
  Maintainer: Kieran Simkin
@@ -125,7 +125,7 @@ Dynamic: license-file
125
125
 
126
126
  # StemLab
127
127
 
128
- [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.1/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
128
+ [![StemLab logo](https://raw.githubusercontent.com/kieransimkin/stemlab/v1.3.3/docs/branding/logo.png)](https://kieransimkin.co.uk/danceflow/)
129
129
 
130
130
  By **[Kieran Simkin](https://kieransimkin.co.uk/)** · [DanceFlow ecosystem](https://kieransimkin.co.uk/danceflow/) · [Vector logo and usage guide](docs/branding/README.md).
131
131
 
@@ -7,4 +7,4 @@ Created by Kieran Simkin — https://kieransimkin.co.uk/
7
7
  Music catalogue — https://kieransimkin.co.uk/my-songs/
8
8
  """
9
9
 
10
- __version__ = "1.3.1"
10
+ __version__ = "1.3.3"
@@ -25,6 +25,8 @@ def test_release_tag_and_registry_version_are_tied_to_source(tmp_path):
25
25
  archive = builder.build(ROOT, tmp_path, f"v{version}")
26
26
  meta = json.loads((tmp_path / "stemlab-mcp-server.json").read_text())
27
27
  assert meta["version"] == meta["packages"][0]["version"] == version
28
+ assert meta["icons"][0]["src"] == f"https://raw.githubusercontent.com/kieransimkin/stemlab/v{version}/docs/branding/logo.png"
29
+ assert meta["icons"][0]["sizes"] == ["256x256"]
28
30
  with zipfile.ZipFile(archive) as z:
29
31
  assert json.loads(z.read("plugins/stemlab/plugin.json"))["version"] == version
30
32
  assert json.loads(z.read("plugins/stemlab/.codex-plugin/plugin.json"))["version"] == version
@@ -80,6 +82,20 @@ def test_registry_publisher_metadata_fails_before_network():
80
82
  publisher.validate_metadata(meta, "v1.2.3")
81
83
 
82
84
 
85
+ @pytest.mark.parametrize("description", ["", "x" * 101, None])
86
+ def test_registry_rejects_description_outside_published_schema(description, tmp_path):
87
+ publisher = module("publish_mcp_registry")
88
+ builder = module("build_codex_plugin")
89
+ meta = builder.registry_metadata(ROOT, "1.2.3")
90
+ meta["description"] = description
91
+ with pytest.raises(ValueError, match="1 to 100"):
92
+ publisher.validate_metadata(meta, "v1.2.3")
93
+ (tmp_path / "mcp-registry").mkdir()
94
+ (tmp_path / "mcp-registry/server.json").write_text(json.dumps(meta))
95
+ with pytest.raises(ValueError, match="1 to 100"):
96
+ builder.registry_metadata(tmp_path, "1.2.3")
97
+
98
+
83
99
  def test_publication_is_release_gated_and_dependency_ordered():
84
100
  yaml = pytest.importorskip("yaml")
85
101
  workflow = yaml.load((ROOT / ".github/workflows/release.yml").read_text(), Loader=yaml.BaseLoader)