danceflow-stemlab 1.3.1__tar.gz → 1.3.2__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.
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/PKG-INFO +2 -2
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/README.md +1 -1
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/codex-publishing.md +7 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/mcp-registry/server.json +4 -4
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/plugin.json +1 -1
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/build_codex_plugin.py +6 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/publish_mcp_registry.py +2 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/PKG-INFO +2 -2
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/__init__.py +1 -1
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_release.py +16 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/.agents/plugins/marketplace.json +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/.github/workflows/codex-plugin.yml +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/.github/workflows/release.yml +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/LICENSE +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/MANIFEST.in +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/branding/README.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/branding/logo.png +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/branding/logo.svg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/codex-plugin.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/cue-alignment.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/evidence-models.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/docs/midi.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/.mcp.json +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/README.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/branding/logo.png +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/branding/logo.svg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/mcp.json +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/pyproject.toml +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/benchmark_evidence_corpus.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/capture_loop_workflow.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/check_codex_timeline.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/loop_demo.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/prepare_codex_marketplace.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/scripts/smoke_midi.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/setup.cfg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/SOURCES.txt +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/requires.txt +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/__main__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/adapters.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/registry.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/runner.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/worker.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/harmony.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/loops.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/lyrics.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/adapters.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/artifacts.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/registry.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/runner.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/midi/worker.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/registry.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/rhythm.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/runner.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/semantic_audio.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/semantic_text.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/song_map.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/sonic.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/structure.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/tempo_regimes.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/transcription.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/audio.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/base.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/beatnet.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/beatthis.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/beattransformer.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/beats/common.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/bootstrap.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/branding.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/canonical.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/cli.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/__main__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/bridge.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/jobs.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/paths.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/server.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/tasks.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/timeline.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/codex/worker.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/cue_cli.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/cues.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/lyric_lrc.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/manifest.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/models.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/pipeline.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/__init__.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/base.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/bsroformer.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/common.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/demucs.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/openunmix.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/separators/scnet.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/server.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/spectrogram.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/spectrogram_repair.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/speech.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/types.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/util.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/vamp.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/vamp_runtime.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/app.js +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/arcadians-cover.jpg +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/arcadians-reference.json +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/index.html +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/style.css +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/timeline.css +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/webui.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/word_alignment.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_analysis_registry.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_arcadians_fixture.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_audio_normalization.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_beat_consensus.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_beat_this_bootstrap.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_beatnet_bootstrap.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_beatnet_compat.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_branding.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_bsroformer_adapter.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_canonical.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_canonical_extended.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_bridge.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_jobs.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_package.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_protocol.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_codex_timeline.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_cue_integration.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_cues.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_deep_harmony.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_deep_lyrics.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_deep_sonic_rhythm.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_distribution_identity.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_docker_contract.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_evidence_models.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_loop_integration.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_loops.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_lyric_lrc.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_manifest.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_midi_adapters.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_midi_extraction.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_midi_integration.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_midi_registry.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_models.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_repository_hygiene.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_server.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_song_map.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_sonic_visualiser_workspace.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_spectrogram.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_speech_repetition.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_vamp.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_vamp_runtime.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_web_frontend.py +0 -0
- {danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/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.
|
|
3
|
+
Version: 1.3.2
|
|
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
|
-
[](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
|
-
[](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
|
|
5
|
-
"description": "
|
|
6
|
-
"version": "1.3.
|
|
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.2",
|
|
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.
|
|
16
|
+
"version": "1.3.2",
|
|
17
17
|
"runtimeHint": "uvx",
|
|
18
18
|
"runtimeArguments": [
|
|
19
19
|
{
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/.codex-plugin/plugin.json
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stemlab",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
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.
|
|
4
|
+
"version": "1.3.2",
|
|
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.
|
|
3
|
+
Version: 1.3.2
|
|
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
|
-
[](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
|
|
|
@@ -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)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/plugins/stemlab/branding/logo-monochrome.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/requires.txt
RENAMED
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/danceflow_stemlab.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/__init__.py
RENAMED
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/adapters.py
RENAMED
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/analysis/evidence/registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/src/stemlab/web/arcadians-reference.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{danceflow_stemlab-1.3.1 → danceflow_stemlab-1.3.2}/tests/test_sonic_visualiser_workspace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|