davinci-resolve-mcp 2.224.0 → 2.224.1

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
@@ -2,6 +2,64 @@
2
2
 
3
3
  Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
4
4
 
5
+ ## What's New in v2.224.1 — the bridge installer explains the outcome it was built to detect
6
+
7
+ Reported by @hemna (#219). No behaviour changed; the installer writes exactly
8
+ what it wrote before and says considerably more about it.
9
+
10
+ ### Fixed
11
+
12
+ - **The canary-only outcome had no printed guidance at all.** Seeing
13
+ `resolve_bridge_canary` in Workspace ▸ Scripts while `resolve_bridge_probe`
14
+ is absent is not a failed install — it is the single most informative thing
15
+ the installer can tell you, and the exact signal the Lua canary exists to
16
+ produce. But the printed steps were a fixed four-line list that assumed the
17
+ Python probe had listed, so a user in this case followed step 3 to a menu
18
+ entry that cannot exist. The explanation was written down the whole time —
19
+ inside the canary's own Lua comments, which nobody has any reason to open.
20
+ There is now a real branch for it that says the install worked, says not to
21
+ re-run it, and explains what the missing probe means.
22
+ - **Duplicate canary entries are now expected rather than alarming.** The
23
+ installer writes into every Scripts/Utility folder Resolve scans, giving the
24
+ canary the same filename in each, so Resolve lists it once per folder with no
25
+ way to tell them apart. The reporter saw two and reasonably read it as a
26
+ broken install; a real run on the maintainer's machine produces **four**. The
27
+ guidance now names the number and says running any one of them is the same as
28
+ running any other. The count is derived from what was actually installed, and
29
+ the filename now has a single definition shared by the writer and the
30
+ counter — those two disagreeing would produce guidance promising entries that
31
+ are not there.
32
+ - **The Console is named.** The canary reports through `print()`, which lands in
33
+ Workspace ▸ Console and nowhere else. The installer had never mentioned the
34
+ Console — the string does not appear in it — so running the canary with no
35
+ Console open looks exactly like nothing happening, which is what was
36
+ reported.
37
+
38
+ ### Changed
39
+
40
+ - The canary-only explanation is **split by edition instead of asserting a
41
+ single cause**. The canary's own text predates Resolve 21.1 and blames Python
42
+ discovery — `PYTHON3HOME`, then `/usr/local/bin/python3`, and nowhere else.
43
+ That is still right on Studio and on 21.0.x and earlier, but on **free 21.1
44
+ it is wrong**: Python scripting moved to the Studio edition (#203), so `.py`
45
+ files do not list there whatever Python is installed, and the older advice
46
+ would send a user chasing a setting that cannot fix their problem. Both
47
+ branches are now stated, newer cause first.
48
+
49
+ ### Validation
50
+
51
+ - Full suite green: 3,484 passed, 1 skipped. Six new tests cover the duplicate
52
+ count and its wording, the absence of that wording for a single canary, the
53
+ canary-only branch, the Console pointer, both edition branches with the
54
+ newer one ordered first, and the single-definition guarantee on the canary
55
+ filename.
56
+ - Verified by running the installer for real on this machine, which is where
57
+ the four-entry figure comes from.
58
+ - **Still open in #219**: the canary's own embedded remediation text carries
59
+ the pre-21.1 single-cause diagnosis. Correcting what it says to a specific
60
+ user needs their edition, which has been asked for; the printed guidance
61
+ above no longer depends on that answer.
62
+
5
63
  ## What's New in v2.224.0 — native Resolve 21.1 DCTL encryption
6
64
 
7
65
  Contributed by @legionsound (#216), live-validated on Studio 21.1.0.14.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [简体中文](README.zh-CN.md)
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.224.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.224.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(377%20full)-blue.svg)](#server-modes)
package/README.zh-CN.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | 简体中文
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.224.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
5
+ [![Version](https://img.shields.io/badge/version-2.224.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
6
6
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
7
7
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
8
8
  [![Tools](https://img.shields.io/badge/MCP%20Tools-36%20(377%20full)-blue.svg)](#服务器模式)
@@ -12,7 +12,7 @@
12
12
  [![Python](https://img.shields.io/badge/python-3.10+-green.svg)](https://www.python.org/downloads/)
13
13
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
14
14
 
15
- > 本翻译对应 v2.224.0 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
15
+ > 本翻译对应 v2.224.1 版 README。如与英文原版有出入,以 [英文原版](README.md) 为准。
16
16
 
17
17
  一个 Model Context Protocol (MCP) 服务器,让 AI 助手通过官方脚本 API 控制 DaVinci Resolve Studio(达芬奇)。它提供完整的 API 覆盖,外加带护栏的工作流助手,涵盖剪辑、媒体池整理、渲染设置、审阅标记、调色、Fusion、Fairlight、项目生命周期任务、扩展开发,以及不碰源媒体的媒体分析。
18
18
 
package/install.py CHANGED
@@ -37,7 +37,7 @@ from src.utils.update_check import (
37
37
 
38
38
  # ─── Version ──────────────────────────────────────────────────────────────────
39
39
 
40
- VERSION = "2.224.0"
40
+ VERSION = "2.224.1"
41
41
  # Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
42
42
  # Resolve's scripting bridge loads into newer interpreters on recent builds
43
43
  # (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.224.0",
3
+ "version": "2.224.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -281,6 +281,11 @@ _FRAMEWORK_PYTHON_ROOTS = (
281
281
  #: PYTHON3HOME is unset. This is the one python.org's installer creates.
282
282
  _FALLBACK_PYTHON3 = Path("/usr/local/bin/python3")
283
283
 
284
+ #: Filename of the Lua enumeration canary. Named once: the installer writes it
285
+ #: and the post-install guidance counts it, and those two disagreeing is how a
286
+ #: user ends up told to expect entries that are not there.
287
+ _CANARY_NAME = "resolve_bridge_canary.lua"
288
+
284
289
  _LUA_CANARY = """-- Installed by davinci-resolve-mcp as an enumeration canary.
285
290
  -- If THIS appears under Workspace > Scripts but resolve_bridge_probe does not,
286
291
  -- Resolve is listing Lua and silently skipping Python: it cannot find a Python 3.
@@ -650,7 +655,7 @@ def _install_to(target: Path, *, probe_only: bool, installed: list[str]) -> None
650
655
  installed.append(str(target / probe))
651
656
  # Lua always enumerates; Python only with a framework install. The canary
652
657
  # makes "Python not detected" distinguishable from "wrong folder".
653
- canary = target / "resolve_bridge_canary.lua"
658
+ canary = target / _CANARY_NAME
654
659
  canary.write_text(_LUA_CANARY, encoding="utf-8")
655
660
  installed.append(str(canary))
656
661
  if probe_only:
@@ -686,6 +691,65 @@ def _install_to(target: Path, *, probe_only: bool, installed: list[str]) -> None
686
691
  installed.append(str(launcher_path))
687
692
 
688
693
 
694
+ def canary_count(result: dict) -> int:
695
+ """How many identical `resolve_bridge_canary` entries Resolve will list.
696
+
697
+ One per Scripts/Utility folder installed into, all with the same filename,
698
+ so they are indistinguishable in the menu. Reported in issue #219 by a user
699
+ who reasonably read two identical entries as a broken install.
700
+ """
701
+ return sum(1 for path in result.get("installed", [])
702
+ if str(path).endswith(_CANARY_NAME))
703
+
704
+
705
+ def next_steps(result: dict) -> list:
706
+ """The post-install instructions, as lines.
707
+
708
+ Built rather than printed inline so the canary-only branch is testable: it
709
+ is the single most likely outcome on macOS and, until issue #219, the only
710
+ one the installer had no words for. The user followed step 3 to a menu
711
+ entry that cannot exist, and the explanation was sitting in a Lua comment
712
+ they had no reason to open.
713
+ """
714
+ lines = [
715
+ "Next:",
716
+ " 1. Restart DaVinci Resolve so it re-scans the Scripts folders.",
717
+ " 2. Open a saved project (the Scripts menu is empty in Project Manager).",
718
+ " 3. Workspace > Scripts > resolve_bridge_probe — run it TWICE.",
719
+ # The probe runs INSIDE Resolve, which never sees the shell's
720
+ # DAVINCI_RESOLVE_BRIDGE_CONFIG — it always writes to the fixed default
721
+ # directory, so the guidance must not follow the override.
722
+ " 4. Read ~/.config/davinci-resolve-mcp/host-model-probe.json",
723
+ ]
724
+ count = canary_count(result)
725
+ if count > 1:
726
+ lines += [
727
+ "",
728
+ f"Expect {count} identical 'resolve_bridge_canary' entries — one per Scripts",
729
+ "folder this installed into. That is normal, not a double install; running",
730
+ "any one of them is the same as running any other.",
731
+ ]
732
+ lines += [
733
+ "",
734
+ "If step 3 shows no 'resolve_bridge_probe' and you can only see",
735
+ "'resolve_bridge_canary':",
736
+ " - The install worked. Do not re-run it. That is the canary doing its job:",
737
+ " Resolve is enumerating scripts, listing Lua, and skipping Python.",
738
+ " - Run 'resolve_bridge_canary' and read its output in Workspace > Console.",
739
+ " It reports with print(), not a dialog, so with no Console open it looks",
740
+ " like nothing happened.",
741
+ " - What it means depends on your edition:",
742
+ " * Resolve 21.1+ FREE — Python scripting moved to the Studio edition,",
743
+ " so .py files no longer list there at all and no Python setting will",
744
+ " change that. See issue #203.",
745
+ " * Studio, or 21.0.x and earlier — Resolve cannot find a Python 3. It",
746
+ " looks at PYTHON3HOME and then /usr/local/bin/python3 and nowhere",
747
+ " else, which is why Homebrew, pyenv, uv and conda builds go unseen.",
748
+ " The canary's own output carries the fix.",
749
+ ]
750
+ return lines
751
+
752
+
689
753
  def main() -> int:
690
754
  parser = argparse.ArgumentParser(description=__doc__)
691
755
  parser.add_argument("--probe-only", action="store_true",
@@ -709,14 +773,8 @@ def main() -> int:
709
773
  print("WARNING: " + warning)
710
774
  print("!" * 72)
711
775
  print()
712
- print("Next:")
713
- print(" 1. Restart DaVinci Resolve so it re-scans the Scripts folders.")
714
- print(" 2. Open a saved project (the Scripts menu is empty in Project Manager).")
715
- print(" 3. Workspace > Scripts > resolve_bridge_probe — run it TWICE.")
716
- # The probe runs INSIDE Resolve, which never sees the shell's
717
- # DAVINCI_RESOLVE_BRIDGE_CONFIG — it always writes to the fixed default
718
- # directory, so the guidance must not follow the override.
719
- print(" 4. Read ~/.config/davinci-resolve-mcp/host-model-probe.json")
776
+ for line in next_steps(result):
777
+ print(line)
720
778
  return 0
721
779
 
722
780
 
@@ -87,7 +87,7 @@ if not logging.getLogger().handlers:
87
87
  handlers=[logging.StreamHandler()],
88
88
  )
89
89
 
90
- VERSION = "2.224.0"
90
+ VERSION = "2.224.1"
91
91
  logger = logging.getLogger("davinci-resolve-mcp")
92
92
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
93
93
  logger.info(f"Detected platform: {get_platform()}")
package/src/server.py CHANGED
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 377-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.224.0"
14
+ VERSION = "2.224.1"
15
15
 
16
16
  import base64
17
17
  import os