davinci-resolve-mcp 2.62.0 → 2.62.2
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 +55 -0
- package/README.md +1 -1
- package/bin/davinci-resolve-advanced-mcp.mjs +2 -2
- package/install.py +1 -1
- package/package.json +1 -1
- package/resolve-advanced/vendor/drp-format/inject-grades.js +4 -2
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
- package/src/utils/timeline_versioning.py +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,61 @@
|
|
|
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.62.2
|
|
6
|
+
|
|
7
|
+
A single cross-platform launcher fix. No new tool surface; default behavior is
|
|
8
|
+
unchanged on macOS/Linux.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Advanced server launcher no longer crashes on Windows** —
|
|
13
|
+
`bin/davinci-resolve-advanced-mcp.mjs` resolved the server entry to an
|
|
14
|
+
absolute filesystem path and passed it straight to dynamic `import()`. On
|
|
15
|
+
Windows that path (e.g. `C:\...\resolve-advanced\server\index.mjs`) is parsed
|
|
16
|
+
by Node's ESM loader as a URL whose drive letter reads as the protocol, so the
|
|
17
|
+
launcher died on arrival with
|
|
18
|
+
`ERR_UNSUPPORTED_ESM_URL_SCHEME` ("Received protocol 'c:'"). The path is now
|
|
19
|
+
converted with `pathToFileURL()` before importing — the canonical
|
|
20
|
+
cross-platform way to hand an absolute path to `import()`. macOS/Linux behavior
|
|
21
|
+
is unchanged, and paths containing spaces or special characters are now handled
|
|
22
|
+
correctly on every platform. Thanks to Ryan Saunders (@Alpha7449) for the
|
|
23
|
+
report and fix.
|
|
24
|
+
|
|
25
|
+
### Validation
|
|
26
|
+
|
|
27
|
+
- Static checks and `node --check` on the modified launcher run. This is the only
|
|
28
|
+
dynamic `import()` call site in the repo receiving an absolute filesystem path;
|
|
29
|
+
the fix touches the Node advanced launcher only and changes no Resolve
|
|
30
|
+
scripting behavior, so a live Resolve run is not required.
|
|
31
|
+
|
|
32
|
+
## What's New in v2.62.1
|
|
33
|
+
|
|
34
|
+
Two correctness fixes for real-world project/DRP layouts. No new tool surface;
|
|
35
|
+
default behavior is unchanged.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **Timeline archiving survives out-of-band archive names** — the archive
|
|
40
|
+
version counter was sourced solely from the local brain DB, so any
|
|
41
|
+
`<name>_archived_vNN` timeline the DB hadn't recorded (another
|
|
42
|
+
session/machine, or a crash between `DuplicateTimeline` and the version
|
|
43
|
+
`INSERT`) collided on the next archive: `DuplicateTimeline` failed and Resolve
|
|
44
|
+
raised a blocking "Unable to Rename Timeline" modal that wedged the UI.
|
|
45
|
+
`archive_current_timeline` now scans every existing `_archived_vNN` suffix in
|
|
46
|
+
the project and treats the DB counter as a floor, not the source of truth.
|
|
47
|
+
- **`inject_grades` handles the `SeqContainer/<uuid>.xml` folder layout** —
|
|
48
|
+
`listSeqContainerEntries` only matched the legacy flat `SeqContainer<N>.xml`
|
|
49
|
+
naming, so `inject_grades` threw `No SeqContainer*.xml found` on DRPs using
|
|
50
|
+
the `SeqContainer/<uuid>.xml` folder layout that Resolve 19 exports (the same
|
|
51
|
+
layout the grade-node extractor already handles). Both shapes are now matched.
|
|
52
|
+
|
|
53
|
+
### Validation
|
|
54
|
+
|
|
55
|
+
- Static checks and focused unit tests
|
|
56
|
+
(`tests.test_timeline_versioning`, `tests.test_import_from_drp`) run. The DRP
|
|
57
|
+
fix is offline zip surgery requiring no Resolve; the archiving fix is
|
|
58
|
+
defensive counter logic covered by unit tests.
|
|
59
|
+
|
|
5
60
|
## What's New in v2.62.0
|
|
6
61
|
|
|
7
62
|
Community contribution by [@lukeashford](https://github.com/lukeashford)
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DaVinci Resolve MCP Server
|
|
2
2
|
|
|
3
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
6
|
[-blue.svg)](#server-modes)
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* the repo root for the published package.)
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { fileURLToPath } from 'node:url';
|
|
13
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
14
14
|
import path from 'node:path';
|
|
15
15
|
|
|
16
16
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
const serverEntry = path.resolve(__dirname, '..', 'resolve-advanced', 'server', 'index.mjs');
|
|
18
18
|
|
|
19
|
-
const { startServer } = await import(serverEntry);
|
|
19
|
+
const { startServer } = await import(pathToFileURL(serverEntry).href);
|
|
20
20
|
await startServer();
|
package/install.py
CHANGED
|
@@ -35,7 +35,7 @@ from src.utils.update_check import (
|
|
|
35
35
|
|
|
36
36
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
37
37
|
|
|
38
|
-
VERSION = "2.62.
|
|
38
|
+
VERSION = "2.62.2"
|
|
39
39
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
40
40
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
41
41
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
|
@@ -22,8 +22,10 @@ function listSeqContainerEntries(zip) {
|
|
|
22
22
|
const out = [];
|
|
23
23
|
zip.forEach((relativePath, entry) => {
|
|
24
24
|
if (entry.dir) return;
|
|
25
|
-
//
|
|
26
|
-
|
|
25
|
+
// Two shapes in the wild: legacy flat "SeqContainer<N>.xml" files, and the
|
|
26
|
+
// "SeqContainer/<uuid>.xml" folder layout Resolve 19 exports (which
|
|
27
|
+
// grade-node-extractor already handles). Match both.
|
|
28
|
+
if (/(^|\/)SeqContainer\d*\.xml$/.test(relativePath) || /(^|\/)SeqContainer\/[^/]+\.xml$/.test(relativePath)) {
|
|
27
29
|
out.push(relativePath);
|
|
28
30
|
}
|
|
29
31
|
});
|
package/src/granular/common.py
CHANGED
|
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
|
|
|
80
80
|
handlers=[logging.StreamHandler()],
|
|
81
81
|
)
|
|
82
82
|
|
|
83
|
-
VERSION = "2.62.
|
|
83
|
+
VERSION = "2.62.2"
|
|
84
84
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
85
85
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
86
86
|
logger.info(f"Detected platform: {get_platform()}")
|
package/src/server.py
CHANGED
|
@@ -137,6 +137,18 @@ def archive_current_timeline(
|
|
|
137
137
|
conn = timeline_brain_db.connect(project_root)
|
|
138
138
|
|
|
139
139
|
next_version = (timeline_brain_db.latest_version(conn, working_name) or 0) + 1
|
|
140
|
+
# The brain DB is not the only writer of archive names: other sessions,
|
|
141
|
+
# machines, or a crash between DuplicateTimeline and the version INSERT can
|
|
142
|
+
# leave `<name>_archived_vNN` timelines the DB has never heard of. A name
|
|
143
|
+
# collision makes DuplicateTimeline fail AND raises a blocking modal dialog
|
|
144
|
+
# in the Resolve UI, so bump past every suffix that exists in the project.
|
|
145
|
+
for existing_tl in _list_all_timelines(project):
|
|
146
|
+
try:
|
|
147
|
+
m = ARCHIVED_SUFFIX_PATTERN.match(existing_tl.GetName())
|
|
148
|
+
except Exception:
|
|
149
|
+
continue
|
|
150
|
+
if m and m.group("base") == working_name and m.group("v"):
|
|
151
|
+
next_version = max(next_version, int(m.group("v")) + 1)
|
|
140
152
|
archived_name = f"{working_name}_archived_v{next_version:02d}"
|
|
141
153
|
|
|
142
154
|
# Resolve duplication must happen on the live timeline; pin current folder
|