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.
Files changed (51) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +1 -1
  3. package/CHANGELOG.md +92 -0
  4. package/CODE_OF_CONDUCT.md +27 -0
  5. package/CONTRIBUTING.md +131 -0
  6. package/README.md +112 -387
  7. package/SECURITY.md +48 -0
  8. package/bin/livepilot.js +42 -2
  9. package/livepilot/.Codex-plugin/plugin.json +8 -0
  10. package/livepilot/.claude-plugin/plugin.json +1 -1
  11. package/livepilot/commands/beat.md +18 -6
  12. package/livepilot/commands/sounddesign.md +6 -5
  13. package/livepilot/skills/livepilot-core/SKILL.md +36 -13
  14. package/livepilot/skills/livepilot-core/references/overview.md +1 -1
  15. package/livepilot/skills/livepilot-release/SKILL.md +11 -8
  16. package/m4l_device/LivePilot_Analyzer.amxd +0 -0
  17. package/m4l_device/LivePilot_Analyzer.maxpat +378 -4
  18. package/m4l_device/capture_2026_04_07_192216.wav +0 -0
  19. package/m4l_device/livepilot_bridge.js +487 -184
  20. package/mcp_server/__init__.py +1 -1
  21. package/mcp_server/connection.py +40 -1
  22. package/mcp_server/curves.py +5 -1
  23. package/mcp_server/m4l_bridge.py +93 -26
  24. package/mcp_server/server.py +26 -31
  25. package/mcp_server/tools/_perception_engine.py +26 -3
  26. package/mcp_server/tools/_theory_engine.py +36 -5
  27. package/mcp_server/tools/analyzer.py +74 -18
  28. package/mcp_server/tools/arrangement.py +20 -5
  29. package/mcp_server/tools/automation.py +56 -1
  30. package/mcp_server/tools/devices.py +201 -13
  31. package/mcp_server/tools/generative.py +8 -1
  32. package/mcp_server/tools/harmony.py +16 -3
  33. package/mcp_server/tools/midi_io.py +22 -4
  34. package/mcp_server/tools/notes.py +4 -1
  35. package/mcp_server/tools/perception.py +27 -1
  36. package/mcp_server/tools/scenes.py +4 -1
  37. package/mcp_server/tools/theory.py +23 -8
  38. package/mcp_server/tools/transport.py +16 -6
  39. package/package.json +1 -1
  40. package/remote_script/LivePilot/__init__.py +1 -1
  41. package/remote_script/LivePilot/arrangement.py +25 -134
  42. package/remote_script/LivePilot/browser.py +19 -8
  43. package/remote_script/LivePilot/clip_automation.py +5 -4
  44. package/remote_script/LivePilot/clips.py +14 -6
  45. package/remote_script/LivePilot/devices.py +6 -3
  46. package/remote_script/LivePilot/diagnostics.py +81 -5
  47. package/remote_script/LivePilot/router.py +22 -0
  48. package/remote_script/LivePilot/server.py +41 -17
  49. package/remote_script/LivePilot/tracks.py +7 -2
  50. package/remote_script/LivePilot/transport.py +3 -3
  51. 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.9",
13
+ "version": "1.9.12",
14
14
  "author": {
15
15
  "name": "Pilot Studio"
16
16
  },
package/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- # LivePilot v1.9.9 — Ableton Live 12
1
+ # LivePilot v1.9.12 — Ableton Live 12
2
2
 
3
3
  ## Project
4
4
  - **Repo:** This directory (LivePilot)
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/>.
@@ -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).