livepilot 1.21.2 → 1.21.4
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,239 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.21.4 — v1.21.2 audit carry-over: slashed-compound filler + dev-install runbook (April 25 2026)
|
|
4
|
+
|
|
5
|
+
Ships two items the v1.21.2 audit #2 deferred to v1.22 but that turned
|
|
6
|
+
out to be safer to close in a patch cycle than to carry forward:
|
|
7
|
+
|
|
8
|
+
1. **`check_prose_claim` regex widen for slashed/chained compound fillers** —
|
|
9
|
+
`"38 spectral/analyzer tools"` drift across 3 docs silently passed
|
|
10
|
+
`sync_metadata --check` because the filler group required trailing
|
|
11
|
+
whitespace. Now caught.
|
|
12
|
+
2. **Dev-install runbook** (`docs/manual/dev-install.md`) — documented
|
|
13
|
+
path for contributors to run LivePilot from a local checkout without
|
|
14
|
+
publishing to npm. Previously every contributor had to reverse-engineer
|
|
15
|
+
this from `bin/livepilot.js` + `mcp_server/__main__.py`.
|
|
16
|
+
|
|
17
|
+
No API changes. No user-observable behavior change at runtime. Four new
|
|
18
|
+
TDD regression tests for the regex widening; ~180 lines of new
|
|
19
|
+
documentation. `sync_metadata --check` now catches an entire class of
|
|
20
|
+
compound-form drift that would otherwise have shipped untracked.
|
|
21
|
+
|
|
22
|
+
### 1. `sync_metadata` slashed/chained compound filler
|
|
23
|
+
|
|
24
|
+
All 4 regex patterns in `scripts/sync_metadata.py` (`check_tool_count`,
|
|
25
|
+
`check_prose_claim`, `fix_tool_count`, `_fix_count`) had an optional
|
|
26
|
+
filler group that required trailing whitespace —
|
|
27
|
+
`[A-Za-z]+\s+` — and matched at most once (`?` quantifier). Slashed
|
|
28
|
+
compounds like `"spectral/analyzer"` were rejected because `/` is not
|
|
29
|
+
whitespace; chained compounds like `"spectral/MCP tools"` (two filler
|
|
30
|
+
segments) were rejected because of the single-match quantifier.
|
|
31
|
+
|
|
32
|
+
v1.21.4 widens the filler to two branches, iterable 0+ times:
|
|
33
|
+
|
|
34
|
+
| Branch | Pattern | Matches |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| (a) Space-joined, uppercase-anchored | `[A-Z][A-Za-z\-]*\s+` | `"MCP "` in `"430 MCP Tools"` |
|
|
37
|
+
| (b) Slash-joined, any-case | `[A-Za-z][A-Za-z\-]*/` | `"spectral/"` in `"38 spectral/analyzer tools"` |
|
|
38
|
+
|
|
39
|
+
The uppercase anchor on branch (a) is preserved deliberately — without
|
|
40
|
+
it, lowercase English articles ("the tool") would false-positive on
|
|
41
|
+
prose like "released in 2020 the tool was first previewed." The slash
|
|
42
|
+
on branch (b) is itself an unambiguous compound marker that doesn't
|
|
43
|
+
appear in normal English, so any-case there is safe. The `*` quantifier
|
|
44
|
+
lets branches chain: `"300 spectral/MCP tools"` now parses as
|
|
45
|
+
`(b)"spectral/"` + `(a)"MCP "` + `"tools"`.
|
|
46
|
+
|
|
47
|
+
For `check_prose_claim` + its paired `_fix_count`, the filler is a
|
|
48
|
+
simpler single-branch `[A-Za-z][A-Za-z\-]*(?:/|\s+)` — these don't need
|
|
49
|
+
the uppercase anchor (prose-claim nouns predate the v1.21.4 cycle and
|
|
50
|
+
already allowed lowercase-start fillers).
|
|
51
|
+
|
|
52
|
+
**Concrete effect**: `sync_metadata --check` now flags drift in all 3
|
|
53
|
+
real surfaces that previously escaped:
|
|
54
|
+
|
|
55
|
+
- `README.md` — `"38 spectral/analyzer tools"` × 2
|
|
56
|
+
- `docs/manual/getting-started.md` — `"38 spectral/analyzer tools"` × 1
|
|
57
|
+
- `livepilot/skills/livepilot-release/SKILL.md` — `"38 spectral/analyzer tools"` × 1
|
|
58
|
+
|
|
59
|
+
(Today these say "38" and the count is 38, so no drift reported — but
|
|
60
|
+
the next time the analyzer module gains or loses a `@mcp.tool`, CI will
|
|
61
|
+
fail loudly instead of silently drifting.)
|
|
62
|
+
|
|
63
|
+
Tests added to `tests/test_claim_consistency.py` (4):
|
|
64
|
+
|
|
65
|
+
- `test_prose_claim_catches_slashed_compound` — drift detection
|
|
66
|
+
- `test_fix_count_rewrites_slashed_compound` — `--fix` preserves the adjective
|
|
67
|
+
- `test_tool_count_catches_slashed_compound` — chained filler (`"300 spectral/MCP tools"`)
|
|
68
|
+
- `test_tool_count_no_false_positive_on_year_prose` — uppercase anchor guard
|
|
69
|
+
|
|
70
|
+
### 2. Dev-install runbook
|
|
71
|
+
|
|
72
|
+
New file `docs/manual/dev-install.md` (~180 lines) documents the
|
|
73
|
+
bare-python local-checkout workflow for contributors:
|
|
74
|
+
|
|
75
|
+
1. **venv setup** — `python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt`
|
|
76
|
+
2. **Local Remote Script install** — `node bin/livepilot.js --install` (NOT `npx livepilot --install`, which resolves to the registry and silently discards local edits)
|
|
77
|
+
3. **MCP client config pointing at `python -m mcp_server`** — per-client examples for Claude Desktop, Claude Code, Cursor/VS Code
|
|
78
|
+
4. **Iterate loop** — client restart for `mcp_server/` edits; `node bin/livepilot.js --install` + `reload_handlers` tool for `remote_script/` edits
|
|
79
|
+
5. **Test suite** — `python -m pytest tests/ -q` (3128 tests as of v1.21.4)
|
|
80
|
+
6. **`sync_metadata` drift check** — `python scripts/sync_metadata.py --check` / `--fix`
|
|
81
|
+
7. **Going back to published** — remove the dev MCP entry or stop using it
|
|
82
|
+
|
|
83
|
+
Plus a troubleshooting section for the 4 most common first-run failures:
|
|
84
|
+
`ModuleNotFoundError: No module named 'mcp_server'`, `Another client is
|
|
85
|
+
already connected` on port 9878, stale `__pycache__` shadowing edits, and
|
|
86
|
+
module-level constants not reloading via `reload_handlers` (full Ableton
|
|
87
|
+
restart required).
|
|
88
|
+
|
|
89
|
+
Cross-links added:
|
|
90
|
+
|
|
91
|
+
- `docs/manual/getting-started.md` — callout at top routing contributors to dev-install before they commit to the npm path
|
|
92
|
+
- `docs/manual/index.md` — new "Contributing" section in the Chapters TOC
|
|
93
|
+
- `CLAUDE.md` — pointer in the Project section
|
|
94
|
+
|
|
95
|
+
### Carried forward to v1.22
|
|
96
|
+
|
|
97
|
+
Still deferred from the v1.21.2 audit:
|
|
98
|
+
|
|
99
|
+
- Atlas `.enriched` schema canonicalization (`stats.enriched_devices = 87`
|
|
100
|
+
vs 120 YAML files vs 135 historical claim — pick one and derive the
|
|
101
|
+
others at build time; add a sync_metadata gate matching JSON stats to
|
|
102
|
+
YAML file count)
|
|
103
|
+
|
|
104
|
+
## 1.21.3 — Third audit-response: manual-docs drift + sync_metadata file-list widening + unicode-escape regex fix (April 24 2026)
|
|
105
|
+
|
|
106
|
+
Fourth same-day patch in 48 hours, third audit-response in 24 hours.
|
|
107
|
+
Audit #3 surfaced that v1.21.2's `sync_metadata` scope expansion had
|
|
108
|
+
added new check TYPES but didn't widen the FILE LISTS — so docs/manual
|
|
109
|
+
pages kept drifting (1305 devices, 135 enriched, 52 domains) while
|
|
110
|
+
`sync_metadata --check` passed. This patch widens the file lists AND
|
|
111
|
+
fixes a latent regex bug that v1.21.2's new "device" check would have
|
|
112
|
+
triggered with data-corrupting consequences.
|
|
113
|
+
|
|
114
|
+
No API changes. No test additions beyond what `sync_metadata` newly
|
|
115
|
+
enforces. No new features.
|
|
116
|
+
|
|
117
|
+
### P2 — Manual-doc atlas/domain drift (audit finding)
|
|
118
|
+
|
|
119
|
+
Three manual pages shipped with stale counts through v1.21.2 because
|
|
120
|
+
they weren't in the `sync_metadata` file lists for `enriched` /
|
|
121
|
+
`domain` / the new `device` check:
|
|
122
|
+
|
|
123
|
+
| File | Stale claim | Corrected to |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `docs/manual/device-atlas.md` | 1305 devices / 135 enriched / 641 pack-indexed | 5264 / 120 / (claim dropped) |
|
|
126
|
+
| `docs/manual/index.md` | 1305 devices | 5264 |
|
|
127
|
+
| `docs/manual/tool-reference.md` | 1305 devices / 135 enriched / 52 domains | 5264 / 120 / 53 |
|
|
128
|
+
|
|
129
|
+
The 5 numeric substitutions (device count, enriched count, domain count)
|
|
130
|
+
were auto-closed by `sync_metadata --fix` once the file lists were
|
|
131
|
+
widened. The `641 pack-indexed` claim was manually dropped (the fixer
|
|
132
|
+
substitutes numbers, doesn't delete claims) — the shipped atlas has an
|
|
133
|
+
empty `.packs` list, so any specific pack-indexed number would be
|
|
134
|
+
meaningless anyway.
|
|
135
|
+
|
|
136
|
+
### Critical — Latent regex bug in `check_prose_claim` and `_fix_count`
|
|
137
|
+
|
|
138
|
+
Adding the `"device"` noun to `PROSE_CLAIM_FILES` exposed a regex
|
|
139
|
+
vulnerability that had existed since v1.15-era. `check_prose_claim`'s
|
|
140
|
+
pattern was:
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
r"(\d+)[-\s]+(?:[A-Za-z]+\s+)?{noun}s?\b"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
No word-boundary assertion at the start. In `manifest.json`, the em-dash
|
|
147
|
+
is stored as the JSON escape `\u2014`. Raw characters are
|
|
148
|
+
`\`, `u`, `2`, `0`, `1`, `4` — so the literal text "2014" appears
|
|
149
|
+
next to a space, next to "device atlas". The regex matched:
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
...\u2014 device atlas...
|
|
153
|
+
^^^^^^^^^^^^^^^
|
|
154
|
+
(captures "2014", next optional word is empty, then "device")
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Reported as `manifest.json: has '2014 device', expected '5264 device'`.
|
|
158
|
+
If `sync_metadata --fix` had run, it would have rewritten `\u2014`
|
|
159
|
+
(em-dash) to `\u5264` (CJK ideograph `剤`). The JSON would become
|
|
160
|
+
visually corrupted and linguistically nonsensical.
|
|
161
|
+
|
|
162
|
+
**Prior versions got away with this** because no earlier PROSE_CLAIM
|
|
163
|
+
noun could align adjacent to the 4-char "2014":
|
|
164
|
+
- "tool" starts with `t` — no match
|
|
165
|
+
- "bridge command" starts with `b` — no match
|
|
166
|
+
- "enriched" starts with `e` — no match
|
|
167
|
+
- "semantic move" / "analyzer tool" / "genre default" — none start with `d`
|
|
168
|
+
|
|
169
|
+
The new `"device"` noun (starts with `d`) was the first to align.
|
|
170
|
+
v1.21.2's extension would have shipped a corrupting `--fix` if anyone
|
|
171
|
+
had run it immediately.
|
|
172
|
+
|
|
173
|
+
Fix: leading `\b` assertion on all 4 regex patterns in sync_metadata
|
|
174
|
+
(`check_tool_count`, `check_prose_claim`, `fix_tool_count`,
|
|
175
|
+
`_fix_count`). Word-boundary before `\d+` means the digit must start
|
|
176
|
+
at a non-word-to-word transition — which excludes digits adjacent to
|
|
177
|
+
other word chars (like the `u` in `\u2014`).
|
|
178
|
+
|
|
179
|
+
Verified: post-fix, `check_prose_claim(noun="device")` reports only
|
|
180
|
+
the intended `5264 devices` in `manifest.json` — the `2014` ghost is
|
|
181
|
+
gone. All existing checks (tool count, bridge command, enriched, etc.)
|
|
182
|
+
continue to match correctly because their valid matches are always
|
|
183
|
+
preceded by non-word chars (space, parenthesis, start-of-string, etc.).
|
|
184
|
+
|
|
185
|
+
### `sync_metadata.py` expansion — new scope + 3 new file-list entries
|
|
186
|
+
|
|
187
|
+
Added:
|
|
188
|
+
* **`get_atlas_device_count()`** + `PROSE_CLAIM_FILES["device"]`
|
|
189
|
+
(threshold=1000) — enforces atlas device-count claims match
|
|
190
|
+
`stats.total_devices`. Deferred from v1.21.2 because generic
|
|
191
|
+
noun="device" was thought too broad; threshold=1000 filters
|
|
192
|
+
historical "5 devices" mentions entirely. Enabled here based on
|
|
193
|
+
audit #3 finding.
|
|
194
|
+
* **`PROSE_CLAIM_FILES["enriched"]`** file list widened: added
|
|
195
|
+
`docs/manual/device-atlas.md`, `docs/manual/tool-reference.md`.
|
|
196
|
+
These had stale "135 enriched" while README said "120".
|
|
197
|
+
* **`DOMAIN_COUNT_FILES`** file list widened: added
|
|
198
|
+
`docs/manual/tool-reference.md`. Its "52 domains" had drifted
|
|
199
|
+
while the rest of the repo was at 53.
|
|
200
|
+
|
|
201
|
+
New `sync_metadata --check` banner reports:
|
|
202
|
+
`version=1.21.3, tools=430, domains=53, bridge_cmds=31, enriched=120,
|
|
203
|
+
genres=4, moves=44, analyzer_tools=38, atlas_devices=5264`.
|
|
204
|
+
|
|
205
|
+
### Deferred to v1.22
|
|
206
|
+
|
|
207
|
+
- **`check_prose_claim` regex slash-prefix broadening** — still needs
|
|
208
|
+
doing (would let "spectral/analyzer tools" match the "analyzer tool"
|
|
209
|
+
check). Not landed in this patch because it would touch every
|
|
210
|
+
existing noun and warrants its own regression test pass.
|
|
211
|
+
- **Atlas `.enriched` schema decision** — three definitions (87 stats,
|
|
212
|
+
120 YAML files, 135 flag count). v1.21.3 standardized on 120 across
|
|
213
|
+
all descriptions via widened `enriched` check, but the schema
|
|
214
|
+
question is still open.
|
|
215
|
+
- **`dev-install` path** — still open.
|
|
216
|
+
|
|
217
|
+
### Scope stats
|
|
218
|
+
|
|
219
|
+
- 1 code fix (`sync_metadata.py` regex `\b` insertion on 4 patterns —
|
|
220
|
+
prevents future unicode-escape corruption)
|
|
221
|
+
- 1 code expansion (`sync_metadata.py` — new `device` check type +
|
|
222
|
+
file-list widening on 2 existing checks)
|
|
223
|
+
- 3 doc corrections auto-closed by `sync_metadata --fix` (9 numeric
|
|
224
|
+
substitutions across 3 manual files) + 1 manual prose-drop (641
|
|
225
|
+
pack-indexed in device-atlas.md)
|
|
226
|
+
- 15 version-string sites + `.amxd` binary patch (2 bytes) + `.maxpat`
|
|
227
|
+
source label + `package-lock.json` (2 fields) bumped 1.21.2 → 1.21.3
|
|
228
|
+
- Test suite: 3124 passed, 1 skipped (unchanged — no-regression patch)
|
|
229
|
+
|
|
230
|
+
### Credits
|
|
231
|
+
|
|
232
|
+
Third external audit by the repo owner. Fourth same-day patch since
|
|
233
|
+
v1.20.1. Audit-to-ship pattern stable at ~2h per round.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
3
237
|
## 1.21.2 — Second audit-response: atlas reconciliation + manual hygiene + sync_metadata expansion (April 24 2026)
|
|
4
238
|
|
|
5
239
|
Second same-day audit-response patch. After v1.21.1 shipped, the repo
|
|
Binary file
|
|
@@ -34,7 +34,7 @@ outlets = 2; // 0: to udpsend (responses), 1: to buffer~/status
|
|
|
34
34
|
// Single source of truth for the bridge version — bumped alongside the
|
|
35
35
|
// rest of the release manifest. Surfaced in the UI via messnamed("livepilot_version", ...)
|
|
36
36
|
// so the frozen .amxd visibly reports which build it was last exported from.
|
|
37
|
-
var VERSION = "1.21.
|
|
37
|
+
var VERSION = "1.21.3";
|
|
38
38
|
|
|
39
39
|
// ── State ──────────────────────────────────────────────────────────────────
|
|
40
40
|
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.21.
|
|
2
|
+
__version__ = "1.21.4"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.4",
|
|
4
4
|
"mcpName": "io.github.dreamrec/livepilot",
|
|
5
5
|
"description": "Agentic production system for Ableton Live 12 — 430 tools, 53 domains, 44 semantic moves. Device atlas (5264 devices, 120 enriched, 7 indexes), Splice intelligence (gRPC + GraphQL describe-a-sound + preview + collections + presets), 9-band spectral perception auto-loaded via ensure_analyzer_on_master, Creative Director skill, technique memory, 12 creative intelligence engines",
|
|
6
6
|
"author": "Pilot Studio",
|
|
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
|
|
|
5
5
|
when this script is selected in Preferences > Link, Tempo & MIDI.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "1.21.
|
|
8
|
+
__version__ = "1.21.4"
|
|
9
9
|
|
|
10
10
|
from _Framework.ControlSurface import ControlSurface
|
|
11
11
|
from . import router
|
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/dreamrec/LivePilot",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.21.
|
|
9
|
+
"version": "1.21.4",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "livepilot",
|
|
14
|
-
"version": "1.21.
|
|
14
|
+
"version": "1.21.4",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|