davinci-resolve-mcp 2.62.0 → 2.62.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,34 @@
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.1
6
+
7
+ Two correctness fixes for real-world project/DRP layouts. No new tool surface;
8
+ default behavior is unchanged.
9
+
10
+ ### Fixed
11
+
12
+ - **Timeline archiving survives out-of-band archive names** — the archive
13
+ version counter was sourced solely from the local brain DB, so any
14
+ `<name>_archived_vNN` timeline the DB hadn't recorded (another
15
+ session/machine, or a crash between `DuplicateTimeline` and the version
16
+ `INSERT`) collided on the next archive: `DuplicateTimeline` failed and Resolve
17
+ raised a blocking "Unable to Rename Timeline" modal that wedged the UI.
18
+ `archive_current_timeline` now scans every existing `_archived_vNN` suffix in
19
+ the project and treats the DB counter as a floor, not the source of truth.
20
+ - **`inject_grades` handles the `SeqContainer/<uuid>.xml` folder layout** —
21
+ `listSeqContainerEntries` only matched the legacy flat `SeqContainer<N>.xml`
22
+ naming, so `inject_grades` threw `No SeqContainer*.xml found` on DRPs using
23
+ the `SeqContainer/<uuid>.xml` folder layout that Resolve 19 exports (the same
24
+ layout the grade-node extractor already handles). Both shapes are now matched.
25
+
26
+ ### Validation
27
+
28
+ - Static checks and focused unit tests
29
+ (`tests.test_timeline_versioning`, `tests.test_import_from_drp`) run. The DRP
30
+ fix is offline zip surgery requiring no Resolve; the archiving fix is
31
+ defensive counter logic covered by unit tests.
32
+
5
33
  ## What's New in v2.62.0
6
34
 
7
35
  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
- [![Version](https://img.shields.io/badge/version-2.62.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.62.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
4
4
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
5
5
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
6
6
  [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(341%20full)-blue.svg)](#server-modes)
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.0"
38
+ VERSION = "2.62.1"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.62.0",
3
+ "version": "2.62.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -22,8 +22,10 @@ function listSeqContainerEntries(zip) {
22
22
  const out = [];
23
23
  zip.forEach((relativePath, entry) => {
24
24
  if (entry.dir) return;
25
- // Match any "<anything>/SeqContainer<N>.xml" path.
26
- if (/(^|\/)SeqContainer\d*\.xml$/.test(relativePath)) {
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
  });
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
80
80
  handlers=[logging.StreamHandler()],
81
81
  )
82
82
 
83
- VERSION = "2.62.0"
83
+ VERSION = "2.62.1"
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
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 341-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.62.0"
14
+ VERSION = "2.62.1"
15
15
 
16
16
  import base64
17
17
  import os
@@ -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