livepilot 1.9.9 → 1.9.12
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +92 -0
- package/CODE_OF_CONDUCT.md +27 -0
- package/CONTRIBUTING.md +131 -0
- package/README.md +112 -387
- package/SECURITY.md +48 -0
- package/bin/livepilot.js +42 -2
- package/livepilot/.Codex-plugin/plugin.json +8 -0
- package/livepilot/.claude-plugin/plugin.json +1 -1
- package/livepilot/commands/beat.md +18 -6
- package/livepilot/commands/sounddesign.md +6 -5
- package/livepilot/skills/livepilot-core/SKILL.md +36 -13
- package/livepilot/skills/livepilot-core/references/overview.md +1 -1
- package/livepilot/skills/livepilot-release/SKILL.md +11 -8
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Analyzer.maxpat +378 -4
- package/m4l_device/capture_2026_04_07_192216.wav +0 -0
- package/m4l_device/livepilot_bridge.js +487 -184
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/connection.py +40 -1
- package/mcp_server/curves.py +5 -1
- package/mcp_server/m4l_bridge.py +93 -26
- package/mcp_server/server.py +26 -31
- package/mcp_server/tools/_perception_engine.py +26 -3
- package/mcp_server/tools/_theory_engine.py +36 -5
- package/mcp_server/tools/analyzer.py +74 -18
- package/mcp_server/tools/arrangement.py +20 -5
- package/mcp_server/tools/automation.py +56 -1
- package/mcp_server/tools/devices.py +201 -13
- package/mcp_server/tools/generative.py +8 -1
- package/mcp_server/tools/harmony.py +16 -3
- package/mcp_server/tools/midi_io.py +22 -4
- package/mcp_server/tools/notes.py +4 -1
- package/mcp_server/tools/perception.py +27 -1
- package/mcp_server/tools/scenes.py +4 -1
- package/mcp_server/tools/theory.py +23 -8
- package/mcp_server/tools/transport.py +16 -6
- package/package.json +1 -1
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/arrangement.py +25 -134
- package/remote_script/LivePilot/browser.py +19 -8
- package/remote_script/LivePilot/clip_automation.py +5 -4
- package/remote_script/LivePilot/clips.py +14 -6
- package/remote_script/LivePilot/devices.py +6 -3
- package/remote_script/LivePilot/diagnostics.py +81 -5
- package/remote_script/LivePilot/router.py +22 -0
- package/remote_script/LivePilot/server.py +41 -17
- package/remote_script/LivePilot/tracks.py +7 -2
- package/remote_script/LivePilot/transport.py +3 -3
- package/requirements.txt +3 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "livepilot",
|
|
12
12
|
"description": "Agentic production system for Ableton Live 12 — 178 tools, 17 domains, device atlas, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
13
|
-
"version": "1.9.
|
|
13
|
+
"version": "1.9.12",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Pilot Studio"
|
|
16
16
|
},
|
package/AGENTS.md
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,97 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.12 — Deep Audit: 21 Fixes Across 15 Files (April 2026)
|
|
4
|
+
|
|
5
|
+
**Full codebase audit — 5 critical, 10 important, 6 doc/test fixes.**
|
|
6
|
+
|
|
7
|
+
### Critical Fixes
|
|
8
|
+
- Fix(P1): `capture_stop` no longer deadlocks — `cancel_capture_future` removed lock acquisition that blocked behind `send_capture`
|
|
9
|
+
- Fix(P1): `import_midi_to_clip` now distinguishes empty-slot NOT_FOUND from INDEX_ERROR/TIMEOUT instead of swallowing all AbletonConnectionErrors
|
|
10
|
+
- Fix(P1): capture audio files now write to `~/Documents/LivePilot/captures/` (stable path) instead of beside the .amxd preset
|
|
11
|
+
- Fix(P1): `check_flucoma` now uses `Folder.end` to detect FluCoMa — `typelist` check was always true
|
|
12
|
+
- Fix(P1): CI workflow updated to `actions/checkout@v4` + `actions/setup-python@v5` (v6 doesn't exist)
|
|
13
|
+
|
|
14
|
+
### Safety & Validation
|
|
15
|
+
- Fix(P2): 5 automation tools now validate `track_index >= 0` and `clip_index >= 0` (matching all peer modules)
|
|
16
|
+
- Fix(P2): `cmd_stop_scrub` now checks `cursor_a.id === 0` for empty clip slots (matching all peer bridge functions)
|
|
17
|
+
- Fix(P2): `cmd_get_selected` now resolves return tracks (negative indices) and master track (-1000)
|
|
18
|
+
- Fix(P2): `duplicate_track` uses count-before/after delta for correct group track duplication index
|
|
19
|
+
- Fix(P2): `create_arrangement_clip` locates first clip by `start_time` instead of stale index after trim pass
|
|
20
|
+
- Fix(P2): `get_session_info` reuses already-built lists instead of re-iterating `song.tracks`/`song.scenes`
|
|
21
|
+
- Fix(P2): client disconnect race — socket now closes before clearing `_client_connected` flag
|
|
22
|
+
|
|
23
|
+
### Tests
|
|
24
|
+
- Fix: transport validation tests now import production `_validate_tempo`/`_validate_time_signature` instead of testing local copies
|
|
25
|
+
- Fix: added `load_sample_to_simpler` to analyzer tool contract (was 28/29)
|
|
26
|
+
- Fix: removed duplicate `test_release_quick_verify_checks_both_plugin_manifests`
|
|
27
|
+
- New: 5 automation negative tests (index validation, parameter_type validation)
|
|
28
|
+
|
|
29
|
+
### Documentation
|
|
30
|
+
- Fix: `docs/manual/index.md` domain map — Tracks 14→17, Devices 12→15, Scenes 8→12
|
|
31
|
+
- Fix: README perception split — 145+33 → 149+29 (actual analyzer tool count is 29)
|
|
32
|
+
- Fix: M4L_BRIDGE.md command count — 22→28 (6 commands undocumented)
|
|
33
|
+
- Fix: tool-reference.md MIDI docs — `export_clip_midi` and `import_midi_to_clip` parameter tables matched to actual signatures
|
|
34
|
+
|
|
35
|
+
### Deferred (documented, low-impact)
|
|
36
|
+
- Timed-out commands still execute on main thread (needs cancellation token redesign)
|
|
37
|
+
- Chunked UDP reassembly fragile on packet loss (loopback mitigates)
|
|
38
|
+
- Diatonic transpose octave correction edge case (needs musical test suite)
|
|
39
|
+
- `cmd_map_plugin_param` reports false success (LiveAPI lacks Configure mapping API)
|
|
40
|
+
|
|
41
|
+
Verification: 145 tests passing (non-fastmcp), 178 tools confirmed, 15 files changed
|
|
42
|
+
|
|
43
|
+
## 1.9.11 — Session Diagnostics + Client Conflict Clarity (March 2026)
|
|
44
|
+
|
|
45
|
+
**Live-tested against the open Ableton set after reloading the updated Remote Script.**
|
|
46
|
+
|
|
47
|
+
- Fix(P1): device loading now surfaces post-load plugin health hints, including `opaque_or_failed_plugin`, `sample_dependent`, `plugin_host_status`, and `mcp_sound_design_ready`
|
|
48
|
+
- Fix(P1): `get_session_diagnostics` now flags opaque/sample-dependent plugins and no longer crashes on track types that omit standard `arm`/`mute`/`solo` properties
|
|
49
|
+
- Fix(P1): analyzer tools now distinguish between “analyzer missing” and “analyzer loaded but bridge/client conflict” when UDP 9880 is unavailable
|
|
50
|
+
- Fix(P1): add Hijaz / Phrygian Dominant theory support across key parsing, scale construction, chord building, and `identify_scale`
|
|
51
|
+
- Fix(P2): `--status` and TCP timeout paths now explain when another LivePilot client appears to be connected instead of only reporting a generic timeout
|
|
52
|
+
- Docs: beat/sounddesign/core skill guidance now includes device-health checks, sample-dependent plugin cautions, and pitch-audit discipline from the live stress-test sessions
|
|
53
|
+
- Verification: `292 passed`, `npm pack --dry-run` passed, live set diagnostics succeeded, analyzer bridge streamed on the master track, and conflict reproduction now reports the competing client PID
|
|
54
|
+
- Fix(P1): brownian automation curve reflection loop now has 100-iteration guard with hard clamp fallback — high volatility values could previously hang the server
|
|
55
|
+
- Fix(P1): schema coercion now recurses into array `items` so `list[float]` params benefit from string-to-number widening for MCP clients that serialize as strings
|
|
56
|
+
- Fix(P1): `apply_automation_shape` and `apply_automation_recipe` now validate `parameter_type` and required companion params before sending to Ableton
|
|
57
|
+
- Fix(P2): Remote Script `AssertionError` fallbacks now return STATE_ERROR instead of running LOM calls on the TCP thread during ControlSurface disconnection
|
|
58
|
+
- Fix(P2): M4L bridge ping version corrected to 1.9.11; `check_flucoma` now probes disk for FluCoMa package instead of returning hardcoded `true`
|
|
59
|
+
- Verification: deep audit across 45+ files (3 parallel agents), 292 unit tests + 15 live integration tests against Ableton session, all passing
|
|
60
|
+
|
|
61
|
+
## 1.9.10 — Analyzer Capture Finalization + Release Sync (March 2026)
|
|
62
|
+
|
|
63
|
+
**Live-tested in Ableton after a full analyzer rebuild and master-track validation.**
|
|
64
|
+
|
|
65
|
+
- Fix(P1): `capture_audio` now writes finalized WAV files instead of header-only stubs by correcting the `sfrecord~` start/stop messages in the analyzer patch
|
|
66
|
+
- Fix(P1): add a small delayed record start in `LivePilot_Analyzer.maxpat` to avoid the open/start race on fresh capture writes
|
|
67
|
+
- Fix(P2): normalize Max-style `Macintosh HD:/Users/...` file paths to POSIX paths in the Python bridge and offline perception tools
|
|
68
|
+
- Fix(P2): make OSC string args Unicode-safe end to end with ASCII-safe `b64:` transport and Max-side UTF-8 decode
|
|
69
|
+
- Fix(P2): arrangement automation unsupported cases now surface as outer MCP errors instead of fake success payloads
|
|
70
|
+
- Fix(P2): missing required Remote Script params now return `INVALID_PARAM` consistently
|
|
71
|
+
- Fix(P3): release metadata now treats Codex as the primary plugin manifest with Claude as a mirrored manifest
|
|
72
|
+
- Verification: live `capture_audio` wrote a 1.48s WAV from the master track; offline loudness + metadata reads succeeded on the returned path
|
|
73
|
+
|
|
74
|
+
## 1.9.9 — M4L Bridge Hardening + Deep Audit (March 2026)
|
|
75
|
+
|
|
76
|
+
**87 tools tested live, 0 failures. 13 bugs fixed across JS bridge + Python tools.**
|
|
77
|
+
|
|
78
|
+
### M4L Bridge (livepilot_bridge.js)
|
|
79
|
+
- Fix(P0): Remove `str_for_value` from all batched JS readers — Auto Filter hangs Max's JS engine (uncatchable), binary-patched .amxd
|
|
80
|
+
- Fix(P1): Deferred `udpsend` socket re-initialization via `deferlow` — fixes UDP not sending when device loads from a saved Live Set (socket fails to bind on frozen device restore)
|
|
81
|
+
- Fix(P1): Add try-catch to ALL Task.schedule batch functions: cmd_get_params, cmd_get_hidden_params, cmd_get_display_values, cmd_get_auto_state, cmd_get_plugin_params — prevents silent crash on parameter read errors
|
|
82
|
+
- Fix(P1): cmd_get_chains_deep, cmd_get_track_cpu, cmd_map_plugin_param — added missing error handling
|
|
83
|
+
- Fix(P2): Add `dspstate~` → JS inlet 1 for sample rate reporting (was declared in JS but missing from patcher)
|
|
84
|
+
- Fix(P2): Deferred `snapshot~` re-activation via `live.thisdevice` → `deferlow` — safety net for frozen device reload
|
|
85
|
+
- Perf: Batch size 4→8, delay 50→20ms (2.5× faster parameter reads)
|
|
86
|
+
- Fix: Binary-patch openinpresentation 0→1 in .amxd
|
|
87
|
+
|
|
88
|
+
### Python MCP Server
|
|
89
|
+
- Fix(P1): classify_progression accepts dict inputs `{"root": "F#", "quality": "minor"}` in addition to strings
|
|
90
|
+
- Fix(P1): Higher bridge timeouts — hidden_params 15s, display_values 15s, auto_state 10s, plugin_params 20s, plugin_presets 15s, map_plugin 10s
|
|
91
|
+
- Fix(P1): load_sample_to_simpler wraps send_command calls in try-except (prevents AbletonConnectionError propagation)
|
|
92
|
+
- Fix(P2): _ensure_list catches json.JSONDecodeError → ValueError (6 files: notes, devices, generative, scenes, harmony, automation)
|
|
93
|
+
- Fix(P2): _get_m4l/_get_spectral raise ValueError instead of RuntimeError (FastMCP compatibility)
|
|
94
|
+
|
|
3
95
|
## 1.9.7 — Safe automation fallback + correct clip length reporting (March 2026)
|
|
4
96
|
|
|
5
97
|
- Fix(P1): set_arrangement_automation places replacement BEFORE deleting original — no data loss if placement fails
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We are committed to making participation in this project a welcoming and respectful experience for everyone, regardless of background or experience level.
|
|
6
|
+
|
|
7
|
+
## Our Standards
|
|
8
|
+
|
|
9
|
+
Examples of behavior that contributes to a positive environment:
|
|
10
|
+
|
|
11
|
+
- Using welcoming and inclusive language
|
|
12
|
+
- Being respectful of differing viewpoints and experiences
|
|
13
|
+
- Gracefully accepting constructive criticism
|
|
14
|
+
- Focusing on what is best for the community
|
|
15
|
+
- Showing empathy toward other community members
|
|
16
|
+
|
|
17
|
+
## Enforcement
|
|
18
|
+
|
|
19
|
+
Project maintainers are responsible for clarifying standards of acceptable behavior and will take appropriate and fair corrective action in response to any unacceptable behavior.
|
|
20
|
+
|
|
21
|
+
Instances of unacceptable behavior may be reported by opening an issue or contacting the maintainers directly.
|
|
22
|
+
|
|
23
|
+
## Attribution
|
|
24
|
+
|
|
25
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1.
|
|
26
|
+
|
|
27
|
+
For the full text, see <https://www.contributor-covenant.org/version/2/1/code_of_conduct/>.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Contributing to LivePilot
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to LivePilot. This guide will help you get started.
|
|
4
|
+
|
|
5
|
+
## Quick Links
|
|
6
|
+
|
|
7
|
+
- [Bug reports](https://github.com/dreamrec/LivePilot/issues/new?template=bug_report.yml)
|
|
8
|
+
- [Feature requests](https://github.com/dreamrec/LivePilot/issues/new?template=feature_request.yml)
|
|
9
|
+
- [Questions & help](https://github.com/dreamrec/LivePilot/discussions)
|
|
10
|
+
|
|
11
|
+
## Development Setup
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone https://github.com/dreamrec/LivePilot.git
|
|
15
|
+
cd LivePilot
|
|
16
|
+
python3 -m venv .venv
|
|
17
|
+
source .venv/bin/activate # macOS/Linux
|
|
18
|
+
.venv/bin/pip install -r requirements.txt
|
|
19
|
+
.venv/bin/pip install pytest pytest-asyncio
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Install the Remote Script
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx livepilot --install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Restart Ableton → Preferences → Link, Tempo & MIDI → Control Surface → **LivePilot**
|
|
29
|
+
|
|
30
|
+
### Run Tests
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pytest tests/ -v
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Tests run without Ableton — they validate tool contracts, schema, and pure Python logic.
|
|
37
|
+
Integration testing with a live session is done manually.
|
|
38
|
+
|
|
39
|
+
## Architecture Overview
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
remote_script/LivePilot/ Python ControlSurface inside Ableton (main thread)
|
|
43
|
+
mcp_server/ FastMCP server — validates inputs, sends TCP to Ableton
|
|
44
|
+
m4l_device/ Max for Live analyzer — UDP/OSC bridge for deep LOM access
|
|
45
|
+
livepilot/ Plugin — skills, slash commands, producer agent
|
|
46
|
+
installer/ Auto-detects Ableton path, copies Remote Script
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
All Live Object Model (LOM) calls execute on Ableton's main thread via `schedule_message`.
|
|
50
|
+
Communication is JSON over TCP, newline-delimited, port 9878.
|
|
51
|
+
|
|
52
|
+
## How to Contribute
|
|
53
|
+
|
|
54
|
+
### Reporting Bugs
|
|
55
|
+
|
|
56
|
+
Use the [bug report template](https://github.com/dreamrec/LivePilot/issues/new?template=bug_report.yml).
|
|
57
|
+
Include:
|
|
58
|
+
|
|
59
|
+
- LivePilot version (`npx livepilot --version`)
|
|
60
|
+
- Ableton Live version
|
|
61
|
+
- Diagnostics output (`npx livepilot --doctor`)
|
|
62
|
+
- Steps to reproduce
|
|
63
|
+
|
|
64
|
+
### Suggesting Features
|
|
65
|
+
|
|
66
|
+
Use the [feature request template](https://github.com/dreamrec/LivePilot/issues/new?template=feature_request.yml).
|
|
67
|
+
Explain the workflow problem before describing the solution.
|
|
68
|
+
|
|
69
|
+
### Submitting Code
|
|
70
|
+
|
|
71
|
+
1. **Fork** the repository
|
|
72
|
+
2. **Create a branch** from `main` (`git checkout -b feat/your-feature`)
|
|
73
|
+
3. **Make your changes** — keep commits focused and atomic
|
|
74
|
+
4. **Run tests** — `pytest tests/ -v` must pass
|
|
75
|
+
5. **Update documentation** if you add or remove tools:
|
|
76
|
+
- Update tool count in `README.md`, `CLAUDE.md`, `package.json`
|
|
77
|
+
- Add an entry to `CHANGELOG.md`
|
|
78
|
+
6. **Open a PR** against `main`
|
|
79
|
+
|
|
80
|
+
### Code Style
|
|
81
|
+
|
|
82
|
+
- **Python:** Follow existing conventions in `mcp_server/`. No linter is enforced yet, but keep it clean.
|
|
83
|
+
- **Remote Script:** All LOM calls must use `schedule_message` — never call the LOM directly from a non-main thread.
|
|
84
|
+
- **M4L Bridge (JS):** Changes to `livepilot_bridge.js` must be tested with the analyzer loaded on the master track in a live Ableton session.
|
|
85
|
+
- **Error codes:** Use structured errors: `INDEX_ERROR`, `NOT_FOUND`, `INVALID_PARAM`, `STATE_ERROR`, `TIMEOUT`, `INTERNAL`.
|
|
86
|
+
|
|
87
|
+
### Commit Messages
|
|
88
|
+
|
|
89
|
+
Use concise, descriptive messages:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
fix: bridge UTF-8 OSC args, KeyError→INVALID_PARAM
|
|
93
|
+
feat: add per-track loudness analysis
|
|
94
|
+
docs: update tool reference for v1.9.11
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Prefix with `fix:`, `feat:`, `docs:`, `refactor:`, `test:`, or `chore:`.
|
|
98
|
+
|
|
99
|
+
## Tool Count Discipline
|
|
100
|
+
|
|
101
|
+
Currently **178 tools**. If you add or remove a `@mcp.tool()` decorator, update all of these files:
|
|
102
|
+
|
|
103
|
+
- `README.md`
|
|
104
|
+
- `CLAUDE.md`
|
|
105
|
+
- `package.json` description
|
|
106
|
+
- `livepilot/.Codex-plugin/plugin.json`
|
|
107
|
+
- `livepilot/.claude-plugin/plugin.json`
|
|
108
|
+
- `server.json`
|
|
109
|
+
- `livepilot/skills/livepilot-core/SKILL.md`
|
|
110
|
+
- `livepilot/skills/livepilot-core/references/overview.md`
|
|
111
|
+
- `CHANGELOG.md`
|
|
112
|
+
- `tests/test_tools_contract.py`
|
|
113
|
+
- `docs/manual/index.md`
|
|
114
|
+
- `docs/manual/tool-reference.md`
|
|
115
|
+
|
|
116
|
+
## Areas Where Help Is Welcome
|
|
117
|
+
|
|
118
|
+
- **Windows testing** — The installer and Remote Script are tested primarily on macOS
|
|
119
|
+
- **Documentation** — Guides, tutorials, workflow examples
|
|
120
|
+
- **New automation recipes** — Add to the 15 built-in recipes
|
|
121
|
+
- **Theory tools** — Additional modes, non-Western scales, extended harmony
|
|
122
|
+
- **Test coverage** — More contract tests, edge cases
|
|
123
|
+
|
|
124
|
+
## Code of Conduct
|
|
125
|
+
|
|
126
|
+
This project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md).
|
|
127
|
+
By participating, you agree to uphold this code.
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
By contributing, you agree that your contributions will be licensed under the [MIT License](LICENSE).
|