livepilot 1.1.0

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 (63) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.mcpregistry_github_token +1 -0
  3. package/.mcpregistry_registry_token +1 -0
  4. package/.playwright-mcp/console-2026-03-17T15-47-29-021Z.log +10 -0
  5. package/.playwright-mcp/console-2026-03-17T15-51-09-247Z.log +10 -0
  6. package/.playwright-mcp/console-2026-03-17T15-52-22-831Z.log +12 -0
  7. package/.playwright-mcp/console-2026-03-17T15-52-29-709Z.log +10 -0
  8. package/.playwright-mcp/console-2026-03-17T15-53-20-147Z.log +1 -0
  9. package/.playwright-mcp/glama-snapshot.md +2140 -0
  10. package/.playwright-mcp/page-2026-03-17T15-49-02-625Z.png +0 -0
  11. package/.playwright-mcp/page-2026-03-17T15-52-15-149Z.png +0 -0
  12. package/.playwright-mcp/page-2026-03-17T15-52-57-333Z.png +0 -0
  13. package/CHANGELOG.md +33 -0
  14. package/LICENSE +21 -0
  15. package/README.md +296 -0
  16. package/bin/livepilot.js +376 -0
  17. package/installer/install.js +95 -0
  18. package/installer/paths.js +79 -0
  19. package/mcp_server/__init__.py +2 -0
  20. package/mcp_server/__main__.py +5 -0
  21. package/mcp_server/connection.py +207 -0
  22. package/mcp_server/server.py +40 -0
  23. package/mcp_server/tools/__init__.py +1 -0
  24. package/mcp_server/tools/arrangement.py +399 -0
  25. package/mcp_server/tools/browser.py +78 -0
  26. package/mcp_server/tools/clips.py +187 -0
  27. package/mcp_server/tools/devices.py +238 -0
  28. package/mcp_server/tools/mixing.py +113 -0
  29. package/mcp_server/tools/notes.py +266 -0
  30. package/mcp_server/tools/scenes.py +63 -0
  31. package/mcp_server/tools/tracks.py +148 -0
  32. package/mcp_server/tools/transport.py +113 -0
  33. package/package.json +38 -0
  34. package/plugin/.mcp.json +8 -0
  35. package/plugin/agents/livepilot-producer/AGENT.md +61 -0
  36. package/plugin/commands/beat.md +18 -0
  37. package/plugin/commands/mix.md +15 -0
  38. package/plugin/commands/session.md +13 -0
  39. package/plugin/commands/sounddesign.md +16 -0
  40. package/plugin/plugin.json +18 -0
  41. package/plugin/skills/livepilot-core/SKILL.md +160 -0
  42. package/plugin/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
  43. package/plugin/skills/livepilot-core/references/m4l-devices.md +352 -0
  44. package/plugin/skills/livepilot-core/references/midi-recipes.md +402 -0
  45. package/plugin/skills/livepilot-core/references/mixing-patterns.md +578 -0
  46. package/plugin/skills/livepilot-core/references/overview.md +191 -0
  47. package/plugin/skills/livepilot-core/references/sound-design.md +392 -0
  48. package/remote_script/LivePilot/__init__.py +42 -0
  49. package/remote_script/LivePilot/arrangement.py +678 -0
  50. package/remote_script/LivePilot/browser.py +325 -0
  51. package/remote_script/LivePilot/clips.py +172 -0
  52. package/remote_script/LivePilot/devices.py +466 -0
  53. package/remote_script/LivePilot/diagnostics.py +198 -0
  54. package/remote_script/LivePilot/mixing.py +194 -0
  55. package/remote_script/LivePilot/notes.py +339 -0
  56. package/remote_script/LivePilot/router.py +74 -0
  57. package/remote_script/LivePilot/scenes.py +75 -0
  58. package/remote_script/LivePilot/server.py +286 -0
  59. package/remote_script/LivePilot/tracks.py +229 -0
  60. package/remote_script/LivePilot/transport.py +147 -0
  61. package/remote_script/LivePilot/utils.py +112 -0
  62. package/requirements.txt +2 -0
  63. package/server.json +20 -0
@@ -0,0 +1,112 @@
1
+ """
2
+ LivePilot - Error formatting, validation helpers, and JSON serialization.
3
+ """
4
+
5
+ import json
6
+
7
+
8
+ # ── Error codes ──────────────────────────────────────────────────────────────
9
+
10
+ INDEX_ERROR = "INDEX_ERROR"
11
+ NOT_FOUND = "NOT_FOUND"
12
+ INVALID_PARAM = "INVALID_PARAM"
13
+ STATE_ERROR = "STATE_ERROR"
14
+ TIMEOUT = "TIMEOUT"
15
+ INTERNAL = "INTERNAL"
16
+
17
+
18
+ # ── Response builders ────────────────────────────────────────────────────────
19
+
20
+ def success_response(request_id, result=None):
21
+ """Build a success JSON-RPC-style response."""
22
+ resp = {"id": request_id, "ok": True}
23
+ if result is not None:
24
+ resp["result"] = result
25
+ return resp
26
+
27
+
28
+ def error_response(request_id, message, code=INTERNAL):
29
+ """Build an error JSON-RPC-style response."""
30
+ return {
31
+ "id": request_id,
32
+ "ok": False,
33
+ "error": {
34
+ "code": code,
35
+ "message": str(message),
36
+ },
37
+ }
38
+
39
+
40
+ # ── Validation helpers ───────────────────────────────────────────────────────
41
+
42
+ def get_track(song, track_index):
43
+ """Return a track by index (0-based). Supports negative indices for
44
+ return tracks: -1 = first return, -2 = second return, etc."""
45
+ tracks = list(song.tracks)
46
+ if track_index < 0:
47
+ return_tracks = list(song.return_tracks)
48
+ ri = abs(track_index) - 1
49
+ if ri >= len(return_tracks):
50
+ raise IndexError(
51
+ "Return track index %d out of range (0..%d)"
52
+ % (ri, len(return_tracks) - 1)
53
+ )
54
+ return return_tracks[ri]
55
+ if track_index >= len(tracks):
56
+ raise IndexError(
57
+ "Track index %d out of range (0..%d)"
58
+ % (track_index, len(tracks) - 1)
59
+ )
60
+ return tracks[track_index]
61
+
62
+
63
+ def get_clip_slot(song, track_index, clip_index):
64
+ """Return a clip slot by track + slot index."""
65
+ track = get_track(song, track_index)
66
+ slots = list(track.clip_slots)
67
+ if clip_index < 0 or clip_index >= len(slots):
68
+ raise IndexError(
69
+ "Clip slot index %d out of range (0..%d)"
70
+ % (clip_index, len(slots) - 1)
71
+ )
72
+ return slots[clip_index]
73
+
74
+
75
+ def get_clip(song, track_index, clip_index):
76
+ """Return a clip (must exist in the slot)."""
77
+ slot = get_clip_slot(song, track_index, clip_index)
78
+ clip = slot.clip
79
+ if clip is None:
80
+ raise ValueError(
81
+ "No clip in track %d, slot %d" % (track_index, clip_index)
82
+ )
83
+ return clip
84
+
85
+
86
+ def get_device(track, device_index):
87
+ """Return a device from a track by index."""
88
+ devices = list(track.devices)
89
+ if device_index < 0 or device_index >= len(devices):
90
+ raise IndexError(
91
+ "Device index %d out of range (0..%d)"
92
+ % (device_index, len(devices) - 1)
93
+ )
94
+ return devices[device_index]
95
+
96
+
97
+ def get_scene(song, scene_index):
98
+ """Return a scene by index."""
99
+ scenes = list(song.scenes)
100
+ if scene_index < 0 or scene_index >= len(scenes):
101
+ raise IndexError(
102
+ "Scene index %d out of range (0..%d)"
103
+ % (scene_index, len(scenes) - 1)
104
+ )
105
+ return scenes[scene_index]
106
+
107
+
108
+ # ── JSON serialization ───────────────────────────────────────────────────────
109
+
110
+ def serialize_json(data):
111
+ """Serialize *data* to a compact JSON string with a trailing newline."""
112
+ return json.dumps(data, separators=(",", ":"), ensure_ascii=True) + "\n"
@@ -0,0 +1,2 @@
1
+ # LivePilot MCP Server dependencies
2
+ fastmcp>=3.0.0,<4.0.0
package/server.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.dreamrec/livepilot",
4
+ "description": "AI copilot for Ableton Live 12 — 91 MCP tools for music production and mixing",
5
+ "repository": {
6
+ "url": "https://github.com/dreamrec/LivePilot",
7
+ "source": "github"
8
+ },
9
+ "version": "1.1.0",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "identifier": "livepilot",
14
+ "version": "1.1.0",
15
+ "transport": {
16
+ "type": "stdio"
17
+ }
18
+ }
19
+ ]
20
+ }