davinci-resolve-mcp 2.48.0 → 2.48.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,19 @@
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.48.1
6
+
7
+ Bug fix surfaced by the first real-cut tighten pilot.
8
+
9
+ - **Fixed** cross-root analysis reuse never landed in the current project's
10
+ DB: when the registry matched a reusable report from another project's
11
+ analysis root, `execute_plan_async` reported success but wrote no DB rows
12
+ and no local export — so `media_ref` lookups against the current media
13
+ pool (edit-engine planners, panel readers) found nothing. The reuse path
14
+ now re-keys the report to the current project's clip identity, ingests it
15
+ into the current root's DB, and writes a lockstep `analysis.json` export
16
+ (provenance kept in `reused_from`).
17
+
5
18
  ## What's New in v2.48.0
6
19
 
7
20
  Edit-engine hardening: trustworthy execute readback ahead of the first
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.48.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.48.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.48.0"
38
+ VERSION = "2.48.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.48.0",
3
+ "version": "2.48.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
80
80
  handlers=[logging.StreamHandler()],
81
81
  )
82
82
 
83
- VERSION = "2.48.0"
83
+ VERSION = "2.48.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.48.0"
14
+ VERSION = "2.48.1"
15
15
 
16
16
  import base64
17
17
  import os
@@ -5218,15 +5218,46 @@ async def execute_plan_async(
5218
5218
  "success": False,
5219
5219
  }
5220
5220
  if clip_plan.get("skip_execution") and existing_report.get("path"):
5221
+ # DB-canonical (C1): a reused report — especially one matched from
5222
+ # ANOTHER project's root via the registry — must still land rows
5223
+ # and a lockstep export in THIS root, keyed to THIS project's clip
5224
+ # identity. Without this, media_ref lookups against the current
5225
+ # media pool (edit_engine planners, panel readers) find nothing
5226
+ # even though the manifest reports success.
5227
+ local_analysis_json = existing_report["path"]
5228
+ try:
5229
+ with open(existing_report["path"], "r", encoding="utf-8") as handle:
5230
+ reused_report = json.load(handle)
5231
+ except (OSError, json.JSONDecodeError):
5232
+ reused_report = None
5233
+ if isinstance(reused_report, dict):
5234
+ reused_report = dict(reused_report)
5235
+ clip_block = dict(reused_report.get("clip") or {})
5236
+ for key in ("clip_id", "clip_name", "media_id", "bin_path"):
5237
+ if record.get(key):
5238
+ clip_block[key] = record[key]
5239
+ if record.get("file_path"):
5240
+ clip_block["file_path"] = record["file_path"]
5241
+ reused_report["clip"] = clip_block
5242
+ db_ingest = _ingest_report_into_db(
5243
+ output_root,
5244
+ reused_report,
5245
+ os.path.dirname(artifacts["analysis_json"]),
5246
+ )
5247
+ if not db_ingest.get("success"):
5248
+ clip_result["db_ingest_error"] = db_ingest.get("error")
5249
+ if os.path.normpath(artifacts["analysis_json"]) != os.path.normpath(existing_report["path"]):
5250
+ _write_json(artifacts["analysis_json"], reused_report)
5251
+ local_analysis_json = artifacts["analysis_json"]
5221
5252
  clip_result.update({
5222
5253
  "success": True,
5223
5254
  "reused": True,
5224
- "analysis_json": existing_report["path"],
5255
+ "analysis_json": local_analysis_json,
5225
5256
  "reuse_reason": clip_plan.get("reuse_reason"),
5226
5257
  "cache_status": clip_plan.get("cache_status"),
5227
5258
  "cache_warnings": existing_report.get("cache_warnings", []),
5228
5259
  "reuse_source": clip_plan.get("reuse_source"),
5229
- "reused_from": clip_plan.get("reused_from"),
5260
+ "reused_from": clip_plan.get("reused_from") or existing_report["path"],
5230
5261
  })
5231
5262
  manifest["clips"].append(clip_result)
5232
5263
  continue