davinci-resolve-mcp 2.23.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.
- package/AGENTS.md +85 -0
- package/CHANGELOG.md +802 -0
- package/CLAUDE.md +15 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/SECURITY.md +53 -0
- package/bin/davinci-resolve-mcp.mjs +376 -0
- package/docs/README.md +56 -0
- package/docs/SKILL.md +1145 -0
- package/docs/authoring/fuse-dctl-authoring.md +242 -0
- package/docs/authoring/script-plugin-authoring.md +195 -0
- package/docs/contributing.md +82 -0
- package/docs/guides/color-decision-guide.md +387 -0
- package/docs/guides/editorial-decision-guide.md +136 -0
- package/docs/guides/media-analysis-guide.md +615 -0
- package/docs/guides/multicam-setup-guide.md +138 -0
- package/docs/install.md +198 -0
- package/docs/integrations/workflow-integrations.md +120 -0
- package/docs/kernels/README.md +28 -0
- package/docs/kernels/audio-fairlight-kernel.md +86 -0
- package/docs/kernels/color-grade-kernel.md +103 -0
- package/docs/kernels/extension-authoring-kernel.md +101 -0
- package/docs/kernels/fusion-composition-kernel.md +91 -0
- package/docs/kernels/media-pool-ingest-kernel.md +147 -0
- package/docs/kernels/project-lifecycle-kernel.md +120 -0
- package/docs/kernels/render-deliver-kernel.md +92 -0
- package/docs/kernels/review-annotation-kernel.md +110 -0
- package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
- package/docs/kernels/timeline-edit-kernel.md +189 -0
- package/docs/notes/codec-plugin-notes.md +136 -0
- package/docs/notes/dctl-notes.md +234 -0
- package/docs/notes/fusion-template-notes.md +136 -0
- package/docs/notes/lut-notes.md +136 -0
- package/docs/notes/openfx-notes.md +120 -0
- package/docs/process/release-process.md +152 -0
- package/docs/reference/api-coverage.md +488 -0
- package/docs/reference/resolve_scripting_api.txt +1012 -0
- package/examples/README.md +53 -0
- package/examples/markers/README.md +81 -0
- package/examples/media/README.md +94 -0
- package/examples/timeline/README.md +98 -0
- package/install.py +1196 -0
- package/package.json +52 -0
- package/scripts/audit_api_parity.py +275 -0
- package/scripts/live_media_analysis_polish_probe.py +65 -0
- package/src/__init__.py +3 -0
- package/src/analysis_dashboard.py +4936 -0
- package/src/control_panel.py +13 -0
- package/src/granular/__init__.py +17 -0
- package/src/granular/common.py +727 -0
- package/src/granular/folder.py +287 -0
- package/src/granular/gallery.py +306 -0
- package/src/granular/graph.py +309 -0
- package/src/granular/media_pool.py +679 -0
- package/src/granular/media_pool_item.py +852 -0
- package/src/granular/media_storage.py +179 -0
- package/src/granular/project.py +1594 -0
- package/src/granular/resolve_control.py +521 -0
- package/src/granular/timeline.py +1074 -0
- package/src/granular/timeline_item.py +2251 -0
- package/src/resolve_mcp_server.py +43 -0
- package/src/server.py +15691 -0
- package/src/utils/__init__.py +3 -0
- package/src/utils/app_control.py +319 -0
- package/src/utils/audio_fairlight_live_probe.py +263 -0
- package/src/utils/cdl.py +20 -0
- package/src/utils/cloud_operations.py +192 -0
- package/src/utils/color_grade_live_probe.py +444 -0
- package/src/utils/dctl_templates.py +368 -0
- package/src/utils/extension_authoring_live_probe.py +292 -0
- package/src/utils/fuse_templates.py +1968 -0
- package/src/utils/fusion_composition_live_probe.py +284 -0
- package/src/utils/layout_presets.py +333 -0
- package/src/utils/mcp_stdio.py +32 -0
- package/src/utils/media_analysis.py +3618 -0
- package/src/utils/media_analysis_jobs.py +796 -0
- package/src/utils/media_pool_ingest_live_probe.py +592 -0
- package/src/utils/multicam.py +393 -0
- package/src/utils/object_inspection.py +287 -0
- package/src/utils/platform.py +157 -0
- package/src/utils/project_lifecycle_live_probe.py +376 -0
- package/src/utils/project_properties.py +601 -0
- package/src/utils/render_deliver_live_probe.py +384 -0
- package/src/utils/resolve_connection.py +77 -0
- package/src/utils/review_annotation_live_probe.py +352 -0
- package/src/utils/script_templates.py +1193 -0
- package/src/utils/sync_detection.py +887 -0
- package/src/utils/timeline_conform_live_probe.py +280 -0
- package/src/utils/timeline_kernel_live_probe.py +1091 -0
- package/src/utils/timeline_kernel_probe.py +185 -0
- package/src/utils/timeline_title_text.py +87 -0
- package/src/utils/update_check.py +610 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,802 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
## What's New in v2.23.0
|
|
6
|
+
|
|
7
|
+
**npm installer** — `npx davinci-resolve-mcp setup` is now the primary quick
|
|
8
|
+
start. The npm package bootstraps a managed per-user install, runs the existing
|
|
9
|
+
Python installer from that stable location, and keeps MCP client configs pointed
|
|
10
|
+
at the managed virtual environment and `src/server.py`.
|
|
11
|
+
|
|
12
|
+
**Local control panel** — Added a single-user browser control panel for server
|
|
13
|
+
status, Resolve clip visibility, source-safe analysis jobs, analysis search, and
|
|
14
|
+
preference management. It can be launched from source with
|
|
15
|
+
`venv/bin/python -m src.control_panel` or from npm with
|
|
16
|
+
`npx davinci-resolve-mcp control-panel`.
|
|
17
|
+
|
|
18
|
+
**Durable media-analysis jobs and search** — `media_analysis` can now create,
|
|
19
|
+
slice, inspect, cancel, resume, and list durable analysis jobs. Persisted reports
|
|
20
|
+
refresh a single-user SQLite index with clip, marker, timeline occurrence,
|
|
21
|
+
keyframe, and transcript search helpers through `build_index`, `index_status`,
|
|
22
|
+
and `query_index`.
|
|
23
|
+
|
|
24
|
+
**Release automation** — Added npm package metadata, package-content guards, and
|
|
25
|
+
a tag-driven GitHub Actions workflow for trusted npm publishing with provenance.
|
|
26
|
+
The workflow skips publish when the package version already exists, which keeps
|
|
27
|
+
the first manual npm registration from fighting the later tag workflow.
|
|
28
|
+
|
|
29
|
+
**Validation**: static import checks, API parity audit, focused media-analysis,
|
|
30
|
+
update-check, and media-pool ingest unit tests passed. npm smoke tests, setup
|
|
31
|
+
dry-run, package dry-run, and `git diff --check` passed. No source media was
|
|
32
|
+
modified.
|
|
33
|
+
|
|
34
|
+
## What's New in v2.22.0
|
|
35
|
+
|
|
36
|
+
**Configurable MCP update prompting** — Update checks now carry a persisted
|
|
37
|
+
policy: `prompt`, `auto`, `notify`, or `never`. The server still never blocks
|
|
38
|
+
MCP stdio startup, but the installer can prompt users to update, continue,
|
|
39
|
+
snooze for 24 hours, ignore the current release, enable safe auto-update, or
|
|
40
|
+
disable checks. Safe auto-update is opt-in and only attempts a clean git
|
|
41
|
+
fast-forward from checkouts with no local changes and a configured upstream.
|
|
42
|
+
|
|
43
|
+
**MCP update controls** — `resolve_control.mcp_update_status` reports the local
|
|
44
|
+
MCP version, cached or forced update status, and the current prompt decision.
|
|
45
|
+
`set_mcp_update_policy`, `ignore_mcp_update`, `snooze_mcp_update`, and
|
|
46
|
+
`clear_mcp_update_preferences` expose the same policy state through the
|
|
47
|
+
compound server without requiring Resolve to be connected.
|
|
48
|
+
|
|
49
|
+
**Conversation setup defaults** — New `setup` compound tool centralizes
|
|
50
|
+
conversation-configurable defaults. It can read, set, dry-run, and clear
|
|
51
|
+
preferences for media-analysis modality, slate detection, transcription,
|
|
52
|
+
analysis persistence, metadata publish fields and overwrite policy, timed marker
|
|
53
|
+
types/colors/counts, report style, preferred analysis roots, post-operation page
|
|
54
|
+
behavior, and MCP update interval/snooze policy. These defaults shape future
|
|
55
|
+
tool calls while preserving explicit confirmation for Resolve project writes.
|
|
56
|
+
|
|
57
|
+
**Metadata field inventory** — `media_pool.metadata_field_inventory` gives
|
|
58
|
+
assistant editors and metadata workflows a read-only map of clip metadata,
|
|
59
|
+
clip-property keys, default analysis writeback fields, optional slate fields,
|
|
60
|
+
and inferred Resolve Metadata-panel groups. This helps bridge analysis
|
|
61
|
+
publishing to the fields Resolve actually exposes on a given clip/build.
|
|
62
|
+
|
|
63
|
+
**Optional timed analysis markers** — `media_analysis.publish_clip_metadata`
|
|
64
|
+
can now write source-frame Media Pool clip markers for slate claps, best
|
|
65
|
+
moments, and QC warnings when the user opts in. If no marker preference exists,
|
|
66
|
+
the tool returns a prompt with yes/no/default-yes/default-no choices rather than
|
|
67
|
+
silently writing markers.
|
|
68
|
+
|
|
69
|
+
**Validation**: static import checks, API parity audit, `git diff --check`, and
|
|
70
|
+
focused update-check, media-analysis, and media-pool ingest unit tests passed.
|
|
71
|
+
Media-pool ingest tests cover the new metadata inventory and Metadata-panel
|
|
72
|
+
group hints. Live validation used DaVinci Resolve Studio 20.3.2.9 through the
|
|
73
|
+
connected MCP server with a disposable project and synthetic media only. It
|
|
74
|
+
verified `metadata_field_inventory`, `MediaPool.ExportMetadata()` header
|
|
75
|
+
comparison, default analysis writeback field mapping, and `SetMetadata()`
|
|
76
|
+
readback for analysis and slate fields. The standalone live metadata inventory
|
|
77
|
+
harness is included for future release validation with a Resolve-compatible
|
|
78
|
+
Python 3.10-3.12 interpreter.
|
|
79
|
+
|
|
80
|
+
## What's New in v2.21.0
|
|
81
|
+
|
|
82
|
+
**Resolve metadata publishing from analysis** —
|
|
83
|
+
`media_analysis.publish_clip_metadata` turns source-safe analysis reports into
|
|
84
|
+
Resolve-native clip metadata. It proposes field-specific merges for
|
|
85
|
+
`Description`, `Comments`, `Keywords`, `People`, and optional slate-derived
|
|
86
|
+
fields, preserves existing human metadata by default, writes provenance to
|
|
87
|
+
third-party metadata, and requires `confirm=true` before mutating Resolve.
|
|
88
|
+
|
|
89
|
+
**Slate-aware metadata proposals** — Metadata publishing can reuse
|
|
90
|
+
`detect_sync_events` slate-clap evidence and, when chat-context sampling is
|
|
91
|
+
available, inspect frames around the clap for high-confidence slate fields before
|
|
92
|
+
proposing `Scene`, `Shot`, `Take`, `Camera #`, and `Roll/Card` writes.
|
|
93
|
+
|
|
94
|
+
**MCP update visibility** — The installer and both MCP server entrypoints now
|
|
95
|
+
perform a best-effort GitHub release check, cache the result under `logs/`, and
|
|
96
|
+
surface the local MCP version plus last update-check status from
|
|
97
|
+
`resolve_control.get_version`. Checks are informational only and never install
|
|
98
|
+
code automatically.
|
|
99
|
+
|
|
100
|
+
**Validation**: static/import checks, API parity audit, focused media-analysis,
|
|
101
|
+
sync-event, and update-check unit tests passed. Live validation used DaVinci
|
|
102
|
+
Resolve Studio 20.3.2.9 through the active Resolve script runner with disposable
|
|
103
|
+
projects and synthetic media only. `tests/live_metadata_publish_validation.py`
|
|
104
|
+
verified dry-run previews, confirmed metadata writes, human metadata
|
|
105
|
+
preservation, keyword merging, third-party provenance, and cleanup;
|
|
106
|
+
`tests/live_sync_event_validation.py` revalidated 2-pop/slate-clap detection and
|
|
107
|
+
confirmed marker writes.
|
|
108
|
+
|
|
109
|
+
## What's New in v2.20.0
|
|
110
|
+
|
|
111
|
+
**Sync event detection helper** — `media_analysis.detect_sync_events` detects
|
|
112
|
+
likely audio 2-pops and slate claps with FFprobe/FFmpeg, returns advisory
|
|
113
|
+
frame/timecode positions, and suggests per-file `record_offset` values for
|
|
114
|
+
`media_pool.setup_multicam_timeline(sync_mode="record_frame")`. The helper is
|
|
115
|
+
source-safe and never installs FFmpeg automatically. It also returns marker
|
|
116
|
+
suggestions; `media_analysis.add_sync_event_markers` writes Media Pool item
|
|
117
|
+
markers only when called separately with `confirm=true`.
|
|
118
|
+
|
|
119
|
+
**Validation**: static/import checks, API parity audit, focused media-analysis
|
|
120
|
+
and multicam unit tests, and `tests/live_sync_event_validation.py` passed. The
|
|
121
|
+
live run used DaVinci Resolve Studio 20.3.2.9, a disposable project, and
|
|
122
|
+
synthetic audio only; it verified detection, confirmation refusal, confirmed
|
|
123
|
+
Media Pool marker writes, and cleanup.
|
|
124
|
+
|
|
125
|
+
## What's New in v2.19.0
|
|
126
|
+
|
|
127
|
+
**Multicam setup support** — `media_pool.setup_multicam_timeline` creates a
|
|
128
|
+
source-safe stacked prep timeline from Media Pool clips, with one angle per video
|
|
129
|
+
track, optional matching audio tracks, and stack-start, manual record-frame, or
|
|
130
|
+
source-timecode planning. Native multicam clip conversion remains a Resolve UI
|
|
131
|
+
step because the public scripting API does not expose a multicam-create method;
|
|
132
|
+
the current UI workflow is documented in the DaVinci Resolve 20 Manual,
|
|
133
|
+
Edit > Chapter 42, "Multicam Editing."
|
|
134
|
+
|
|
135
|
+
**Documentation**: added `docs/guides/multicam-setup-guide.md` and linked the
|
|
136
|
+
helper from the README, docs index, AI skill reference, kernel coverage, ingest
|
|
137
|
+
kernel, and API coverage notes so it is clearly listed as a helper rather than
|
|
138
|
+
a native API feature.
|
|
139
|
+
|
|
140
|
+
## What's New in v2.18.0
|
|
141
|
+
|
|
142
|
+
**Edit-page title / Text+ text (undocumented keys)** — `timeline.title_property_scan`,
|
|
143
|
+
`timeline.set_title_text`, and `timeline.bulk_set_title_text` use
|
|
144
|
+
`TimelineItem.GetProperty` / `SetProperty` to discover and update generator Text+
|
|
145
|
+
payloads when `GetFusionCompCount()` is zero (no Fusion comp for `fusion_comp`).
|
|
146
|
+
Heuristic key ranking and a minimal styled-text XML fallback are included; callers
|
|
147
|
+
should confirm keys with `title_property_scan` on their Resolve build.
|
|
148
|
+
|
|
149
|
+
## What's New in v2.17.1
|
|
150
|
+
|
|
151
|
+
Operational and client-safety hardening for the v2.17 media-analysis release.
|
|
152
|
+
|
|
153
|
+
**MCP tool metadata**: compound and granular tools now publish MCP
|
|
154
|
+
`ToolAnnotations` with conservative read-only, destructive, idempotent, and
|
|
155
|
+
external-resource hints. Compound tool annotations are intentionally conservative
|
|
156
|
+
because each tool groups multiple actions behind an `action` parameter.
|
|
157
|
+
|
|
158
|
+
**MCPSafe report cleanup**: explicitly annotated the granular tools highlighted
|
|
159
|
+
by the public MCPSafe report, including project settings, media import, page
|
|
160
|
+
switching, proxy linking, Gallery album reads, and timeline-item transforms.
|
|
161
|
+
|
|
162
|
+
**Operational guardrails**: Resolve app-control subprocess fallbacks now use
|
|
163
|
+
bounded timeouts and report non-zero exits. Best-effort Resolve object
|
|
164
|
+
inspection and state probes now log swallowed exceptions at debug level instead
|
|
165
|
+
of failing silently.
|
|
166
|
+
|
|
167
|
+
**Correctness fix**: fixed the granular
|
|
168
|
+
`media_pool.append_to_timeline(clip_infos=...)` path so it retains the current
|
|
169
|
+
project handle while normalizing positioned appends against the active timeline
|
|
170
|
+
start frame.
|
|
171
|
+
|
|
172
|
+
**Documentation**: added `SECURITY.md` with the local stdio trust boundary,
|
|
173
|
+
confirmation guidance for destructive tools, source-media safety boundaries, and
|
|
174
|
+
private vulnerability reporting guidance. The README now links the security
|
|
175
|
+
policy and summarizes the local-only auth posture.
|
|
176
|
+
|
|
177
|
+
**Validation**: static/import checks, API parity audit, compileall, and 161
|
|
178
|
+
focused unit tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9
|
|
179
|
+
with a direct external-scripting smoke test, `tests/live_v233_validation.py`
|
|
180
|
+
passing 10/10 checks, and a v2.17.1 disposable-project
|
|
181
|
+
`media_pool.append_to_timeline(clip_infos=...)` normalization probe passing 2/2
|
|
182
|
+
checks. The v2.17.1 probe used synthetic media only and verified the default
|
|
183
|
+
relative `record_frame` path landed at timeline start frame 86400 + 12 = 86412,
|
|
184
|
+
while `record_frame_mode="absolute"` preserved frame 86484.
|
|
185
|
+
|
|
186
|
+
## What's New in v2.17.0
|
|
187
|
+
|
|
188
|
+
Media analysis and editorial-assist expansion - `media_analysis` now reuses
|
|
189
|
+
existing project reports when cache signatures satisfy the requested analysis
|
|
190
|
+
layers, can review timeline marker contact sheets with chat-context vision, and
|
|
191
|
+
`timeline` adds editor-facing helpers for story-spine reports, declarative
|
|
192
|
+
variant creation, bulk item property writes, multi-item look application,
|
|
193
|
+
thumbnail contact sheets, marker thumbnail review, and audio mix capability
|
|
194
|
+
fallback reporting.
|
|
195
|
+
|
|
196
|
+
**New `media_analysis` compound tool**: added `capabilities`,
|
|
197
|
+
`install_guidance`, `resolve_output_root`, `plan`, `analyze_file`,
|
|
198
|
+
`analyze_clip`, `analyze_bin`, `analyze_project`, `review_timeline_markers`,
|
|
199
|
+
`summarize`, `get_report`, and `cleanup_artifacts`.
|
|
200
|
+
|
|
201
|
+
**MCP prompts and visual review**: the compound server now registers
|
|
202
|
+
`davinci_resolve_workflow` and `analyze_media` prompts. `analyze_media` defaults
|
|
203
|
+
to chat-context visual analysis when MCP sampling is available, while
|
|
204
|
+
`timeline_markers.get_thumbnail_image` returns current Resolve frames as MCP
|
|
205
|
+
image content without writing a file.
|
|
206
|
+
|
|
207
|
+
**Source-safe editorial helpers**: timeline actions now support
|
|
208
|
+
`story_spine_report`, `create_variant_from_ranges`, `bulk_set_item_properties`,
|
|
209
|
+
`apply_look_to_items`, `thumbnail_contact_sheet`, `marker_thumbnail_review`, and
|
|
210
|
+
`audio_mix_capability_report`. Positioned timeline appends normalize
|
|
211
|
+
`record_frame` relative to the active timeline start by default, matching
|
|
212
|
+
Resolve's common 01:00:00:00 start-frame behavior.
|
|
213
|
+
|
|
214
|
+
**Documentation reorganization**: moved durable references into `docs/guides`,
|
|
215
|
+
`docs/kernels`, `docs/authoring`, `docs/notes`, `docs/process`, and
|
|
216
|
+
`docs/reference`, added a compact docs index, and kept local gameplans/scratch
|
|
217
|
+
artifacts ignored.
|
|
218
|
+
|
|
219
|
+
**Privacy cleanup**: sanitized tracked live-test fixtures and scripts that had
|
|
220
|
+
workstation-specific source-media paths while leaving public project contact
|
|
221
|
+
information intact.
|
|
222
|
+
|
|
223
|
+
**Validation**: static/import checks, API parity audit, and 141 focused unit
|
|
224
|
+
tests passed. Live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
225
|
+
disposable `_mcp_media_analysis_v2170_probe` project and a generated synthetic
|
|
226
|
+
clip only. The run covered source-adjacent output-root rejection,
|
|
227
|
+
`media_analysis.plan`, session-only `analyze_file`, `story_spine_report`,
|
|
228
|
+
`audio_mix_capability_report`, raw thumbnail retrieval, `thumbnail_contact_sheet`,
|
|
229
|
+
and `review_timeline_markers`; the disposable project and temp artifacts were
|
|
230
|
+
cleaned up.
|
|
231
|
+
|
|
232
|
+
## v2.16.0
|
|
233
|
+
|
|
234
|
+
Extension Authoring kernel expansion - adding lifecycle-aware Fuse, DCTL, ACES
|
|
235
|
+
DCTL, and Resolve-page script probes around the existing authoring tools.
|
|
236
|
+
|
|
237
|
+
**New `script_plugin` extension actions**: added `extension_capabilities`,
|
|
238
|
+
`probe_fuse_lifecycle`, `probe_dctl_lifecycle`, `probe_script_lifecycle`,
|
|
239
|
+
`safe_install_extension`, `safe_remove_extension`,
|
|
240
|
+
`refresh_or_restart_required`, and `extension_boundary_report`.
|
|
241
|
+
|
|
242
|
+
**Lifecycle and cleanup guards**: safe extension installs require `_mcp_` names
|
|
243
|
+
and MCP markers by default. Safe removal refuses to delete unmarked files unless
|
|
244
|
+
explicitly overridden. The kernel classifies Fuse and ACES DCTL installs as
|
|
245
|
+
restart-required, regular LUT DCTLs as `refresh_luts`-driven, and Resolve-page
|
|
246
|
+
scripts as menu-refresh-only.
|
|
247
|
+
|
|
248
|
+
**Documented support map**: added
|
|
249
|
+
[`docs/kernels/extension-authoring-kernel.md`](docs/kernels/extension-authoring-kernel.md) and
|
|
250
|
+
updated the Fuse/DCTL and script authoring docs with live lifecycle findings.
|
|
251
|
+
|
|
252
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
253
|
+
MCP-marked `_mcp_` extension files only. Final probe result: 14 supported, 1
|
|
254
|
+
partially supported installed-Lua-script execution boundary, 1 intentional
|
|
255
|
+
unsupported unmarked-source guard, and 0 errors. All generated extension files
|
|
256
|
+
and the disposable project were cleaned up.
|
|
257
|
+
|
|
258
|
+
## v2.15.0
|
|
259
|
+
|
|
260
|
+
Project / Database / Archive kernel expansion - adding disposable project
|
|
261
|
+
lifecycle guards, settings snapshots and write/restore probes, database switch
|
|
262
|
+
dry-runs, preset lifecycle probing, archive safety validation, and project
|
|
263
|
+
boundary reporting.
|
|
264
|
+
|
|
265
|
+
**New `project_manager` lifecycle actions**: added `project_capabilities`,
|
|
266
|
+
`probe_project_lifecycle`, `probe_project_settings`, `safe_project_create`,
|
|
267
|
+
`safe_project_export`, `safe_project_import`, `safe_project_archive`,
|
|
268
|
+
`safe_project_restore`, `safe_project_delete`, `safe_set_project_settings`,
|
|
269
|
+
`project_settings_snapshot`, `database_capabilities`,
|
|
270
|
+
`safe_set_current_database`, `preset_lifecycle_probe`, and
|
|
271
|
+
`project_boundary_report`.
|
|
272
|
+
|
|
273
|
+
**Operational guardrails**: safe project mutation defaults to `_mcp_`
|
|
274
|
+
disposable names and temp paths. Database switching dry-runs by default because
|
|
275
|
+
Resolve closes open projects when changing databases. Archive source media,
|
|
276
|
+
render cache, and proxy media flags are rejected unless explicitly opted in.
|
|
277
|
+
|
|
278
|
+
**Documented support map**: added
|
|
279
|
+
[`docs/kernels/project-lifecycle-kernel.md`](docs/kernels/project-lifecycle-kernel.md) with
|
|
280
|
+
project CRUD, DRP import/export, archive/restore, folder, settings, database,
|
|
281
|
+
layout preset, render preset, page, keyframe, and cloud-infrastructure
|
|
282
|
+
boundaries.
|
|
283
|
+
|
|
284
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
285
|
+
disposable `_mcp_` projects only. Final probe result: 35 supported, 5 partially
|
|
286
|
+
supported lifecycle/archive/keyframe/render-preset boundaries, 1 intentional
|
|
287
|
+
unsupported archive media-flag guard, 1 not-applicable archive restore boundary,
|
|
288
|
+
and 0 errors. Disposable projects, layout presets, and temp work files were
|
|
289
|
+
cleaned up.
|
|
290
|
+
|
|
291
|
+
## v2.14.0
|
|
292
|
+
|
|
293
|
+
Audio / Fairlight kernel expansion - adding audio track/item probes, source
|
|
294
|
+
audio mapping reports, guarded audio property writes, voice isolation
|
|
295
|
+
capabilities, auto-sync planning, transcription/subtitle probes, and Fairlight
|
|
296
|
+
boundary reporting.
|
|
297
|
+
|
|
298
|
+
**New `timeline` audio actions**: added `audio_capabilities`,
|
|
299
|
+
`probe_audio_track`, `probe_audio_item`, `safe_set_audio_properties`,
|
|
300
|
+
`voice_isolation_capabilities`, `audio_mapping_report`, `safe_auto_sync_audio`,
|
|
301
|
+
`transcription_capabilities`, `subtitle_generation_probe`, and
|
|
302
|
+
`fairlight_boundary_report`.
|
|
303
|
+
|
|
304
|
+
**Audio state and mapping**: the kernel snapshots audio track state, timeline
|
|
305
|
+
item audio properties, source audio channel mapping, MediaPoolItem audio
|
|
306
|
+
mapping, and track/item voice isolation availability.
|
|
307
|
+
|
|
308
|
+
**Guarded AI and sync surfaces**: auto-sync dry-runs by default and normalizes
|
|
309
|
+
Resolve audio-sync constants. Subtitle generation dry-runs unless
|
|
310
|
+
`allow_generate=True`; transcription capability reporting is read-only by
|
|
311
|
+
default.
|
|
312
|
+
|
|
313
|
+
**Documented support map**: added
|
|
314
|
+
[`docs/kernels/audio-fairlight-kernel.md`](docs/kernels/audio-fairlight-kernel.md) with
|
|
315
|
+
track/item state, voice isolation, mapping, transcription, subtitle, auto-sync,
|
|
316
|
+
and Fairlight insertion boundaries.
|
|
317
|
+
|
|
318
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
319
|
+
generated synthetic video and audio-only media. Final probe result: 13
|
|
320
|
+
supported, 3 partially supported audio property/auto-sync/audio-insert
|
|
321
|
+
boundaries, and 0 errors. The disposable project and generated media were
|
|
322
|
+
cleaned up.
|
|
323
|
+
|
|
324
|
+
## v2.13.0
|
|
325
|
+
|
|
326
|
+
Timeline Conform / Interchange kernel expansion - adding timeline structure
|
|
327
|
+
snapshots, source range reporting, gap/overlap detection, guarded interchange
|
|
328
|
+
export/import, round-trip comparison, missing-media detection, and relink
|
|
329
|
+
planning around Resolve's public timeline APIs.
|
|
330
|
+
|
|
331
|
+
**New `timeline` conform actions**: added `conform_capabilities`,
|
|
332
|
+
`probe_timeline_structure`, `detect_gaps_overlaps`, `source_range_report`,
|
|
333
|
+
`export_timeline_checked`, `import_timeline_checked`, `compare_timelines`,
|
|
334
|
+
`probe_interchange_roundtrip`, `detect_missing_media`, `build_relink_plan`,
|
|
335
|
+
and `conform_boundary_report`.
|
|
336
|
+
|
|
337
|
+
**Interchange probing**: export aliases now cover FCPXML, DRT, EDL, AAF, OTIO,
|
|
338
|
+
FCP 7 XML, and EDL subtype variants. FCPXML directory-style exports are
|
|
339
|
+
normalized with a `primary_file` path for import.
|
|
340
|
+
|
|
341
|
+
**Conform analysis**: the kernel reports track/item structure, same-track gaps
|
|
342
|
+
and overlaps, source ranges with handles, missing/offline media, and relink
|
|
343
|
+
candidates without mutating user source media.
|
|
344
|
+
|
|
345
|
+
**Documented support map**: added
|
|
346
|
+
[`docs/kernels/timeline-conform-interchange-kernel.md`](docs/kernels/timeline-conform-interchange-kernel.md)
|
|
347
|
+
with export, round-trip, missing-media, relink planning, and format-survival
|
|
348
|
+
boundaries.
|
|
349
|
+
|
|
350
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
351
|
+
generated synthetic gapped timeline. Final probe result: 17 supported, 1
|
|
352
|
+
partially supported FCPXML round-trip survivability boundary, and 0 errors. The
|
|
353
|
+
disposable project, generated media, and imported round-trip timelines were
|
|
354
|
+
cleaned up.
|
|
355
|
+
|
|
356
|
+
## v2.12.0
|
|
357
|
+
|
|
358
|
+
Fusion Composition kernel expansion - adding safe Fusion graph inspection,
|
|
359
|
+
tool creation, input writes, connection validation, scoped bulk writes, and
|
|
360
|
+
boundary reporting around Resolve's public Fusion comp API.
|
|
361
|
+
|
|
362
|
+
**New `fusion_comp` kernel actions**: added `fusion_graph_capabilities`,
|
|
363
|
+
`probe_fusion_comp`, `probe_fusion_tool`, `safe_add_tool`, `safe_set_inputs`,
|
|
364
|
+
`safe_connect_tools`, and `fusion_boundary_report`.
|
|
365
|
+
|
|
366
|
+
**Timeline item graph automation**: the kernel can target timeline item Fusion
|
|
367
|
+
comps via `timeline_item`, `clip_id`, or `timeline_item_id`, then add tools,
|
|
368
|
+
write inputs with readback, inspect ports, connect tools, set frame ranges, and
|
|
369
|
+
export the comp through `timeline_item_fusion`.
|
|
370
|
+
|
|
371
|
+
**Scoped bulk writes**: `bulk_set_inputs` remains the safe batch path for
|
|
372
|
+
applying input updates across multiple explicitly scoped timeline-item comps,
|
|
373
|
+
so agent workflows do not accidentally mutate the active Fusion page comp.
|
|
374
|
+
|
|
375
|
+
**Documented support map**: added
|
|
376
|
+
[`docs/kernels/fusion-composition-kernel.md`](docs/kernels/fusion-composition-kernel.md) with
|
|
377
|
+
tool availability, input/output, scope, comp export, and page-state boundaries.
|
|
378
|
+
|
|
379
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
380
|
+
generated synthetic timeline item Fusion comp. Final probe result: 18
|
|
381
|
+
supported, 0 unsupported, 0 partially supported, and 0 errors. The disposable
|
|
382
|
+
project, generated media, and exported temp comp were cleaned up.
|
|
383
|
+
|
|
384
|
+
## v2.11.0
|
|
385
|
+
|
|
386
|
+
Color / Grade kernel expansion - adding safe grade inspection, CDL validation,
|
|
387
|
+
node graph probing, grade copy, LUT export, version restore, Gallery, and color
|
|
388
|
+
group boundary reporting around Resolve's public Color API.
|
|
389
|
+
|
|
390
|
+
**New `timeline_item_color` kernel actions**: added `grade_capabilities`,
|
|
391
|
+
`probe_grade_item`, `probe_node_graph`, `safe_set_cdl`, `safe_copy_grade`,
|
|
392
|
+
`safe_apply_drx`, `safe_export_lut`, `grade_version_snapshot`,
|
|
393
|
+
`grade_version_restore`, `color_group_capabilities`, `gallery_capabilities`,
|
|
394
|
+
and `grade_boundary_report`.
|
|
395
|
+
|
|
396
|
+
**Grade and graph probing**: the kernel snapshots item grade versions, graph
|
|
397
|
+
availability, node counts, node LUT/cache/label/tools metadata, color-group
|
|
398
|
+
assignment, and cache state without guessing at opaque node internals.
|
|
399
|
+
|
|
400
|
+
**Safe mutation helpers**: CDL payloads are validated and normalized before
|
|
401
|
+
`SetCDL`; grade copy resolves target timeline item IDs first; LUT export is
|
|
402
|
+
guarded to temp paths by default; DRX apply requires an existing DRX path and
|
|
403
|
+
documents that it replaces the target graph.
|
|
404
|
+
|
|
405
|
+
**Color groups and Gallery**: color-group capability probes cover project
|
|
406
|
+
groups plus pre/post graph availability. Gallery capability probes report album
|
|
407
|
+
state and classify still export as UI/page dependent when Resolve returns false.
|
|
408
|
+
|
|
409
|
+
**Documented support map**: added
|
|
410
|
+
[`docs/kernels/color-grade-kernel.md`](docs/kernels/color-grade-kernel.md) with graph, LUT, DRX,
|
|
411
|
+
version, Gallery, color-group, and AI-tool boundaries.
|
|
412
|
+
|
|
413
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
414
|
+
generated synthetic color-bar timeline. Final probe result: 25 supported, 2
|
|
415
|
+
version/page-dependent Gallery/DRX export boundaries, 1 not-applicable DRX apply
|
|
416
|
+
path because no DRX could be produced in that run, and 0 errors. The disposable
|
|
417
|
+
project, generated media, and temp LUT exports were cleaned up.
|
|
418
|
+
|
|
419
|
+
## v2.10.0
|
|
420
|
+
|
|
421
|
+
Review Annotation kernel expansion - adding a unified marker, custom data,
|
|
422
|
+
flag, clip color, copy/move, and review report layer across timeline, timeline
|
|
423
|
+
item, and media pool item scopes.
|
|
424
|
+
|
|
425
|
+
**New `timeline_markers` kernel actions**: added
|
|
426
|
+
`annotation_capabilities`, `probe_annotations`, `normalize_marker_payload`,
|
|
427
|
+
`copy_annotations`, `move_annotations`, `sync_marker_custom_data`,
|
|
428
|
+
`clear_annotations_by_scope`, `export_review_report`, and
|
|
429
|
+
`annotation_boundary_report`.
|
|
430
|
+
|
|
431
|
+
**Unified annotation scopes**: the new helpers normalize marker payloads,
|
|
432
|
+
frame/timecode aliases, custom data aliases, and marker colors before touching
|
|
433
|
+
Resolve. `probe_annotations` snapshots timeline, current timeline item, and
|
|
434
|
+
media pool item annotations when the current playhead can resolve them.
|
|
435
|
+
|
|
436
|
+
**Review metadata copying**: `copy_annotations` and `move_annotations` can copy
|
|
437
|
+
marker payloads between timeline, timeline item, and media pool item scopes
|
|
438
|
+
using direct frame numbers. When supported by both scopes, flags and clip color
|
|
439
|
+
can travel with the marker payload.
|
|
440
|
+
|
|
441
|
+
**Read-only review reports**: `export_review_report` and
|
|
442
|
+
`annotation_boundary_report` produce agent-friendly summaries without mutating
|
|
443
|
+
media or projects.
|
|
444
|
+
|
|
445
|
+
**Documented support map**: added
|
|
446
|
+
[`docs/kernels/review-annotation-kernel.md`](docs/kernels/review-annotation-kernel.md) with the
|
|
447
|
+
scope matrix, field support, frame-space caveats, and live probe findings.
|
|
448
|
+
|
|
449
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
450
|
+
generated synthetic timeline. Final probe result: 44 supported, 1 expected
|
|
451
|
+
unsupported invalid-color boundary, and 0 errors. The disposable project and
|
|
452
|
+
generated media were cleaned up after report generation.
|
|
453
|
+
|
|
454
|
+
## v2.9.0
|
|
455
|
+
|
|
456
|
+
Render / Deliver kernel expansion — adding a safer render planning, settings,
|
|
457
|
+
format/codec compatibility, queue lifecycle, and Quick Export boundary layer.
|
|
458
|
+
|
|
459
|
+
**New `render` kernel actions**: added `render_capabilities`,
|
|
460
|
+
`probe_render_matrix`, `probe_render_settings`, `validate_render_settings`,
|
|
461
|
+
`safe_set_render_settings`, `prepare_render_job`,
|
|
462
|
+
`render_job_lifecycle_probe`, `quick_export_capabilities`,
|
|
463
|
+
`safe_quick_export`, and `export_render_boundary_report`.
|
|
464
|
+
|
|
465
|
+
**Render compatibility matrix**: `probe_render_matrix` walks available render
|
|
466
|
+
formats, codecs, and resolutions so agents can choose what this specific
|
|
467
|
+
Resolve install can actually deliver.
|
|
468
|
+
|
|
469
|
+
**Job-safe rendering helpers**: render settings validation now checks documented
|
|
470
|
+
setting keys, value types, frame ranges, and temp-target requirements.
|
|
471
|
+
`prepare_render_job` creates queued jobs without starting renders, while
|
|
472
|
+
`render_job_lifecycle_probe` validates add/status/delete behavior safely.
|
|
473
|
+
|
|
474
|
+
**Guarded Quick Export**: `safe_quick_export` validates temp targets, forces
|
|
475
|
+
`EnableUpload=False`, and requires `allow_render=True` before it can actually
|
|
476
|
+
start Quick Export.
|
|
477
|
+
|
|
478
|
+
**Documented support map**: added
|
|
479
|
+
[`docs/kernels/render-deliver-kernel.md`](docs/kernels/render-deliver-kernel.md) with
|
|
480
|
+
format/codec, settings, render job, and Quick Export boundaries.
|
|
481
|
+
|
|
482
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with a
|
|
483
|
+
two-second generated synthetic timeline. Final probe result: 23 supported, 1
|
|
484
|
+
version/page-dependent `GetRenderSettings` readback boundary, and 0 errors. The
|
|
485
|
+
probe rendered one tiny synthetic output, then cleaned up the disposable project
|
|
486
|
+
and generated files.
|
|
487
|
+
|
|
488
|
+
## v2.8.0
|
|
489
|
+
|
|
490
|
+
Media Pool / Ingest kernel expansion — applying the timeline edit kernel probe
|
|
491
|
+
pattern to import, organization, metadata, annotation, and media-link boundary
|
|
492
|
+
workflows while preserving source media integrity.
|
|
493
|
+
|
|
494
|
+
**New `media_pool` kernel actions**: added `ingest_capabilities`,
|
|
495
|
+
`probe_media_pool`, `probe_ingest_item`, `safe_import_media`,
|
|
496
|
+
`safe_import_sequence`, `safe_import_folder`, `organize_clips`,
|
|
497
|
+
`copy_metadata`, `normalize_metadata`, `probe_clip_properties`,
|
|
498
|
+
`safe_relink`, `safe_unlink`, `link_proxy_checked`,
|
|
499
|
+
`link_full_resolution_checked`, `set_clip_marks`, `clear_clip_marks`,
|
|
500
|
+
`copy_clip_annotations`, and `media_pool_boundary_report`.
|
|
501
|
+
|
|
502
|
+
**Safe ingest and organization**: safe import helpers validate paths, sequence
|
|
503
|
+
patterns, frame ranges, and optional target folders before calling Resolve.
|
|
504
|
+
`organize_clips` can move clips to existing folders or create missing folder
|
|
505
|
+
paths explicitly. All helpers support dry-run where useful for planning.
|
|
506
|
+
|
|
507
|
+
**Metadata and annotation workflows**: bulk metadata normalization, metadata
|
|
508
|
+
copying, clip property probes, mark in/out bulk operations, and annotation copy
|
|
509
|
+
now have agent-friendly wrappers over Resolve's lower-level clip APIs.
|
|
510
|
+
|
|
511
|
+
**Documented support map**: added
|
|
512
|
+
[`docs/kernels/media-pool-ingest-kernel.md`](docs/kernels/media-pool-ingest-kernel.md) so
|
|
513
|
+
agents and users can inspect the supported, partial, unsupported, and
|
|
514
|
+
version/page-dependent ingest boundaries directly.
|
|
515
|
+
|
|
516
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
517
|
+
generated synthetic video, audio, still, image sequence, and non-media
|
|
518
|
+
fixtures. Final probe result: 56 supported, 1 expected unsupported non-media
|
|
519
|
+
text import, and 0 errors. The disposable project and generated media were
|
|
520
|
+
cleaned up after report generation.
|
|
521
|
+
|
|
522
|
+
## v2.7.0
|
|
523
|
+
|
|
524
|
+
Timeline edit kernel expansion — turning the v2.6.0 duplicate helper into a
|
|
525
|
+
broader, live-probed edit layer for clip duplication, linked audio, range edits,
|
|
526
|
+
state copying, and capability reporting while preserving source media integrity.
|
|
527
|
+
|
|
528
|
+
**Expanded `timeline.duplicate_clips` action**: duplication now supports
|
|
529
|
+
`selected=True`, explicit `record_frame`, `track_offset`, and placement modes
|
|
530
|
+
`same_time`, `offset`, `at_playhead`, `track_above`, `after_source`, and
|
|
531
|
+
`next_gap`. `include_linked=True` duplicates linked audio and restores the
|
|
532
|
+
video/audio link state. `copy_clips` is an alias for duplication, and
|
|
533
|
+
`move_clips` duplicates successfully first before deleting the original source
|
|
534
|
+
items.
|
|
535
|
+
|
|
536
|
+
**Timeline range operations**: added `copy_range`, `duplicate_range`,
|
|
537
|
+
`overwrite_range`, and `lift_range`. Range copies rebuild exact source segments
|
|
538
|
+
with positioned append operations. `overwrite_range` deletes whole destination
|
|
539
|
+
overlaps before appending. `lift_range` safely deletes whole matching items and
|
|
540
|
+
requires explicit `allow_partial_item_delete=True` for whole-item deletion when
|
|
541
|
+
a requested range only partially overlaps an item.
|
|
542
|
+
|
|
543
|
+
**State copying groups**: duplicate/copy operations can now copy transform,
|
|
544
|
+
crop, composite, audio, retime, dynamic zoom, scaling, stabilization, clip
|
|
545
|
+
color, markers, flags, enabled state, cache, voice isolation, Fusion comps,
|
|
546
|
+
grades, takes, and keyframes where Resolve exposes readable/writable item APIs.
|
|
547
|
+
Transition cloning is accepted as a requested group but reported unsupported
|
|
548
|
+
because Resolve's public scripting API does not expose transition cloning.
|
|
549
|
+
|
|
550
|
+
**Capability and boundary probes**: added `timeline.edit_kernel_capabilities`
|
|
551
|
+
for a maintained support map and `timeline.probe_edit_kernel_item` for read-only
|
|
552
|
+
inspection of item methods, properties, keyframes, and linked items. Added
|
|
553
|
+
`src/utils/timeline_kernel_live_probe.py` plus offline report/parser tests so
|
|
554
|
+
future work can expand the technical boundary without guessing.
|
|
555
|
+
|
|
556
|
+
**Documented limits**: added
|
|
557
|
+
[`docs/kernels/timeline-edit-kernel.md`](docs/kernels/timeline-edit-kernel.md), which records
|
|
558
|
+
the supported, partially supported, unsupported, and version/page-dependent
|
|
559
|
+
surfaces. Known public-API boundaries include transition cloning, direct
|
|
560
|
+
razor/split edits, true partial lifts, source-less item append cloning, and
|
|
561
|
+
opaque speed-ramp internals.
|
|
562
|
+
|
|
563
|
+
**Validation**: live validated against DaVinci Resolve Studio 20.3.2.9 with
|
|
564
|
+
disposable projects and synthetic media. Final exhaustive probe result:
|
|
565
|
+
255 supported, 4 partially supported, 138 unsupported, 4 version/page
|
|
566
|
+
dependent, and 0 errors. Static/unit checks include `tests/test_import.py`,
|
|
567
|
+
`scripts/audit_api_parity.py`, `git diff --check`, the focused timeline/helper
|
|
568
|
+
unit suite, and the full live duplicate/range/probe harness.
|
|
569
|
+
|
|
570
|
+
## v2.6.0
|
|
571
|
+
|
|
572
|
+
Timeline clip duplication — adding an Alt-drag-style helper for duplicating
|
|
573
|
+
existing video timeline items without creating proxy media, renders, or source
|
|
574
|
+
derivatives.
|
|
575
|
+
|
|
576
|
+
**New `timeline.duplicate_clips` action**: `timeline(action="duplicate_clips")`
|
|
577
|
+
duplicates video timeline items by re-appending the same Media Pool item with
|
|
578
|
+
the same source trim via `MediaPool.AppendToTimeline([{clipInfo}])`. It accepts
|
|
579
|
+
timeline item IDs from `timeline.get_items`, an optional
|
|
580
|
+
`target_track_index`, and `record_frame_offset`; each result reports per-clip
|
|
581
|
+
success and the duplicated timeline item ID when Resolve exposes or recovers it.
|
|
582
|
+
|
|
583
|
+
**Resolve append-result hardening**: duplicate results now tolerate thin
|
|
584
|
+
`AppendToTimeline` return objects that lack readable `GetUniqueId()` or
|
|
585
|
+
`GetName()` methods, then scan the target video track to recover the real item
|
|
586
|
+
handle. Bad inputs now return clean per-clip errors for non-video items,
|
|
587
|
+
invalid offsets, and nonexistent target tracks.
|
|
588
|
+
|
|
589
|
+
**Live-tested source trim semantics**: validation against Resolve Studio
|
|
590
|
+
20.3.2.9 confirmed that positioned `AppendToTimeline` treats `endFrame` as an
|
|
591
|
+
exclusive source boundary in this workflow. `duplicate_clips` now uses
|
|
592
|
+
`TimelineItem.GetDuration()` and `GetSourceStartFrame()` where available, so
|
|
593
|
+
the duplicate preserves the original duration and source start.
|
|
594
|
+
|
|
595
|
+
**Validation**: added `tests/live_duplicate_clips_validation.py`, which creates
|
|
596
|
+
a disposable project, imports synthetic media, places a trimmed clip, duplicates
|
|
597
|
+
it to another track, verifies record frame/duration/source trim/media identity,
|
|
598
|
+
checks the invalid-track error path, and deletes the project. Focused unit
|
|
599
|
+
coverage now includes anonymous append objects, source-start preference,
|
|
600
|
+
video-only `mediaType`, and target-track ID recovery.
|
|
601
|
+
|
|
602
|
+
## v2.5.0
|
|
603
|
+
|
|
604
|
+
Three new compound tools for *authoring and conversationally executing* Resolve extensions: Fusion Fuse plugins, DCTL color transforms, and Resolve-page Lua/Python scripts. Plus a documentation pass on six adjacent Resolve extension systems.
|
|
605
|
+
|
|
606
|
+
**New `fuse_plugin` tool**: generate, install, list, read, remove, and validate Fusion Fuse plugins (`.fuse`). **18 template kinds** spanning color (`color_matrix`, `per_pixel`, `channel_op`), geometric (`transform`, `spatial_warp`), text/shapes (`text_overlay`, `shape_generator`), source/temporal (`source_generator`, `time_displace`), filters (`builtin_blur`, `builtin_resize`, `variable_blur` SAT-based), modifiers (`modifier`, `point_modifier`), display shaders (`view_lut`, `dctl_kernel`), and reference (`controls_demo`, `notifychanged_demo`). Each generator produces ready-to-install Lua (or Lua + GLSL / Lua + DCTL) source that passes `luac -p` syntax checks across all option branches. **Live-verified in DaVinci Resolve Studio 20.3.2.9**: generated Fuses register on Resolve restart and instantiate via `comp:AddTool`; the `text_overlay` template was confirmed rendering glyphs into the viewer. The `view_lut` template supports `float`, `vec2`, `vec3_rgb`, and `vec4_rgba` shader parameter types. Includes a path-bug fix: corrected install path on macOS to `Fusion/Fuses/` (the SDK doc lists `Support/Fusion/Fuses/`, but Fusion's own `MapPath("Fuses:")` returns the path without `/Support/`).
|
|
607
|
+
|
|
608
|
+
**New `dctl` tool**: generate, install, list, read, remove, and validate DCTL color-transform files plus ACES IDT/ODT transforms. **8 template kinds** — `transform`, `transform_alpha` (Resolve 19.1+ alpha modes), `transition` (with `TRANSITION_PROGRESS`), `matrix` (3x3 color matrix), `kernel` (TODO stub), `lut_apply` (wraps an external `.cube` LUT via `DEFINE_LUT`/`APPLY_LUT`), `aces_idt`, `aces_odt`. UI-parameter syntax covers all six DCTL UI types (slider float/int, value box, checkbox, combo, color picker) with optional tooltips. Per-template `suggested_category` so callers know whether to install to the regular LUT directory or the separate ACES Transforms tree. Subdir support with strict path-traversal guards. Validator catches missing entry points, brace imbalance, and float literals missing the required `f` suffix. Regular DCTLs pick up via `project_settings(action='refresh_luts')`; ACES DCTLs require a Resolve restart.
|
|
609
|
+
|
|
610
|
+
**New `script_plugin` tool — conversational Lua/Python execution**: generate, install, and **execute** Resolve-page scripts that appear in the Workspace → Scripts menu. Two template kinds: `scaffold` (minimal stub) and `media_rules` (a comprehensive rules-and-variables DSL with sources, extract patterns, transforms, targets, actions, conditions, dry-run mode, external CSV/JSON data with exact/regex/fuzzy matching, and per-rule metadata — ~22k chars Lua engine and ~18k chars Python engine, both first-class). **Two new actions close the conversational loop**: `run_inline(source, language)` runs an ad-hoc Lua/Python snippet inside Resolve and streams stdout + return value back into the conversation; `execute(name, category, language)` runs an installed script the same way. Python uses subprocess with full stdout/stderr capture; Lua uses `fusion.RunScript()` against a temp file with completion-sentinel polling and `app:SetData()` bridge for return values (Resolve 20.x's `fusion.Execute()` is a no-op from the Python bridge — that quirk is encoded in the implementation). **Live-verified end-to-end** on Resolve Studio 20.3.2.9: Python `run_inline` returned project list and walked media pool; Lua `run_inline` enumerated `MapPath` symbols with stdout AND return value captured.
|
|
611
|
+
|
|
612
|
+
**`list_templates` action** on all three new tools enumerates available kinds.
|
|
613
|
+
|
|
614
|
+
**Resolve developer-package reference consolidation**: extension-system notes
|
|
615
|
+
were consolidated back into README/SKILL guidance, while dedicated authoring
|
|
616
|
+
docs remain in `docs/authoring/fuse-dctl-authoring.md` and
|
|
617
|
+
`docs/authoring/script-plugin-authoring.md`.
|
|
618
|
+
|
|
619
|
+
**Test coverage**: 185 offline tests across 7 modules (`test_fuse_dctl_authoring.py` and `test_script_plugin.py` both new in this release), all green in <2s. Includes hermetic round-trip tests with mocked install paths, DSL-coverage tests confirming every documented source/action/target/transform is in both Lua and Python engines, and Python subprocess execution tests with real captured stdout/stderr.
|
|
620
|
+
|
|
621
|
+
**Compound tool count: 27 → 30**. Granular tool count unchanged at 328.
|
|
622
|
+
|
|
623
|
+
## v2.4.1
|
|
624
|
+
|
|
625
|
+
Release process hardening — documenting the version bump, validation, tag, and GitHub Release checklist.
|
|
626
|
+
|
|
627
|
+
**Release checklist documented**: added `docs/process/release-process.md` with semantic version guidance, required version surfaces, validation requirements, tag/release commands, and release-note template.
|
|
628
|
+
|
|
629
|
+
**Live-test requirement clarified**: Resolve behavior changes must be validated live with disposable projects and synthetic media before release. Docs-only releases do not require a live Resolve run when no behavior changed.
|
|
630
|
+
|
|
631
|
+
## v2.4.0
|
|
632
|
+
|
|
633
|
+
Timeline source range extraction — adding a compound workflow helper for frame-pull and conform preparation.
|
|
634
|
+
|
|
635
|
+
**New `timeline.extract_source_frame_ranges` action**: `timeline(action="extract_source_frame_ranges")` scans every video clip on the current timeline and returns per-source frame ranges, clip occurrences, timeline positions, source offsets, applied handles, and timeline item IDs. Clip names prefer the basename from the Media Pool `File Path`, with audio extensions skipped by default.
|
|
636
|
+
|
|
637
|
+
**Handle-aware source ranges**: fixed handles default to 24 frames. Passing `handles=0` switches to gap-only auto handles, using neighboring timeline gaps up to `gap_max` frames. Returned `source_range_final` and `frame_ranges` endpoints are inclusive/inclusive for downstream extraction tools.
|
|
638
|
+
|
|
639
|
+
**Inclusive endpoint fix**: live validation caught and fixed the off-by-one where Resolve's exclusive source boundary was being returned as an inclusive final frame. A 48-frame synthetic clip with `handles=0` now returns `source_used_inclusive_end=47` and `source_range_final=[0, 47]`.
|
|
640
|
+
|
|
641
|
+
**Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic media. Added unit coverage in `tests/test_extract_source_frame_ranges.py` for zero-handle and fixed-handle ranges.
|
|
642
|
+
|
|
643
|
+
## v2.3.4
|
|
644
|
+
|
|
645
|
+
Marker API hardening for Issue #34 — making the compound marker tools match the parameter shapes agents and users naturally send.
|
|
646
|
+
|
|
647
|
+
**Marker parameter aliases fixed**: `timeline_markers`, `media_pool_item_markers`, and `timeline_item_markers` now accept `frame`, `frame_id`, and `frameId` consistently for add/get/update/delete operations. Marker lookup and delete paths also accept `customData` as an alias for `custom_data`.
|
|
648
|
+
|
|
649
|
+
**Timeline marker ergonomics improved**: `timeline_markers(action="add")` can now add at the current playhead when no frame/timecode is provided, and also accepts explicit `timecode` input. Optional marker fields now have sensible defaults (`color="Blue"`, `name` from note or `"Marker"`, `note=""`, `duration=1`).
|
|
650
|
+
|
|
651
|
+
**Resolve overload fallback**: marker creation first uses the documented six-argument `AddMarker(..., customData)` call, and falls back to the five-argument form when `customData` is empty and a Resolve build rejects the optional parameter.
|
|
652
|
+
|
|
653
|
+
**Live Resolve validation**: verified against DaVinci Resolve Studio 20.3.2.9 with `tests/live_marker_validation.py`. The harness creates a disposable project, imports synthetic media, inserts a visible timeline generator, and live-tests timeline, media-pool-item, and timeline-item marker add/get/update/delete alias paths. A `--keep-open` mode leaves a marked timeline open for visual inspection.
|
|
654
|
+
|
|
655
|
+
## v2.3.3
|
|
656
|
+
|
|
657
|
+
Granular layer hardening — closing exposure gaps and dropped-dict-key bugs surfaced by an exhaustive parity audit of every documented Resolve scripting method against both server layers.
|
|
658
|
+
|
|
659
|
+
**Cloud project helper rewritten** (Critical): `src/utils/cloud_operations.py` was calling `pm.CreateCloudProject(project_name, folder_path)` with positional arguments — but the documented Resolve API signature is `CreateCloudProject({cloudSettings})`, a single dict. Same bug affected `ImportCloudProject` and `RestoreCloudProject`. Helper now builds proper `{cloudSettings}` dicts and exposes all 5 documented keys (`PROJECT_NAME`, `PROJECT_MEDIA_PATH`, `IS_COLLAB`, `SYNC_MODE`, `IS_CAMERA_ACCESS`) per docs lines 576-594. Granular wrappers (`create_cloud_project_tool`, `import_cloud_project_tool`, `restore_cloud_project_tool`) updated to expose the full settings surface; `load_cloud_project_tool` added (was missing entirely from granular).
|
|
660
|
+
|
|
661
|
+
**Silent-drop bugs fixed** (Critical):
|
|
662
|
+
- **`render_with_quick_export()` (granular)** previously dropped the documented `{param_dict}` (TargetDir, CustomName, VideoQuality, EnableUpload). Now forwards all four keys per docs line 179.
|
|
663
|
+
- **`timeline_create_compound_clip()` (granular)** previously dropped the documented `{clipInfo}` dict (`name`, `startTimecode`). Now exposes both keys per docs line 369.
|
|
664
|
+
|
|
665
|
+
**Missing granular tools added**:
|
|
666
|
+
- **`append_to_timeline`** — both simple `clip_ids` form and positioned `clip_infos` form (`MediaPool.AppendToTimeline` was completely absent from granular layer; only compound had it).
|
|
667
|
+
- **`auto_sync_audio`** — with proper `{audioSyncSettings}` dict mapping per docs lines 600-614 (`sync_mode`, `channel_number` with `'automatic'`/`'mix'` aliases, `retain_embedded_audio`, `retain_video_metadata`).
|
|
668
|
+
- **`load_cloud_project_tool`** — was missing entirely; compound had it.
|
|
669
|
+
- **`rename_color_group`** — wraps `ColorGroup.SetName` (compound had it via `color_group(action="set_name")` but no granular tool).
|
|
670
|
+
|
|
671
|
+
**Removed 4 undocumented cloud method wrappers**:
|
|
672
|
+
- `get_cloud_projects` resource → `GetCloudProjectList` not in API docs
|
|
673
|
+
- `export_project_to_cloud_tool` → `ExportToCloud`/`ExportProjectToCloud` not in API docs
|
|
674
|
+
- `add_user_to_cloud_project_tool` → `AddUserToCloudProject` not in API docs
|
|
675
|
+
- `remove_user_from_cloud_project_tool` → `RemoveUserFromCloudProject` not in API docs
|
|
676
|
+
|
|
677
|
+
**Removed 9 legacy granular gallery tools** that wrapped undocumented or renamed methods (`gallery.GetAlbums()`, `gallery.CreateAlbum()`, `still.GetTimecode()`, `still.IsGrabbed()`, etc.). The proper documented Gallery and GalleryStillAlbum wrappers (lines 743+ of the previous gallery.py — all 14 of those, e.g. `get_gallery_still_albums`, `create_gallery_still_album`, `import_stills_to_album`, `export_stills_from_album`, `get_album_stills`, `set_still_label`) cover the documented API surface and remain. Removed: `get_color_presets`, `save_color_preset`, `apply_color_preset`, `delete_color_preset`, `create_color_preset_album`, `delete_color_preset_album`, `export_lut`, `get_lut_formats`, `export_all_powergrade_luts`.
|
|
678
|
+
|
|
679
|
+
**Removed 2 granular project optimized-media tools** that wrapped undocumented Resolve methods (`Project.GenerateOptimizedMedia`, `Project.DeleteOptimizedMedia`, `MediaPool.SetClipSelection` — none in API docs). Removed: `generate_optimized_media`, `delete_optimized_media`. Use the Resolve UI for optimized-media generation; `set_optimized_media_mode` (which uses the documented `Project.SetSetting("OptimizedMediaMode", ...)`) is preserved.
|
|
680
|
+
|
|
681
|
+
**Deprecated method call fixed**: `timeline(action="get_items_in_track")` was calling the deprecated `tl.GetItemsInTrack()` form (docs line 989, marked deprecated) instead of the supported `tl.GetItemListInTrack()` (line 350). Every other call site already used the correct form.
|
|
682
|
+
|
|
683
|
+
**New: API parity CI guard** at `scripts/audit_api_parity.py`. Parses `docs/reference/resolve_scripting_api.txt` and verifies (1) no `from api.X` broken imports remain, (2) every documented Resolve method appears somewhere in `src/`, (3) wrappers calling undocumented methods are flagged for review. Includes an allowlist for legitimate undocumented-but-real Resolve API surface (Fusion compositing API, UIManager methods like `OpenProjectSettings`/`LoadUILayout`/`SaveUILayout`, internal type-discrimination helpers like `TimelineItem.GetType`/`GetMediaType`). Run with `python3 scripts/audit_api_parity.py` — currently passes all three checks cleanly.
|
|
684
|
+
|
|
685
|
+
**Tool count: 328 granular tools** (was 354 before v2.3.2; net change since v2.3.1 is −26 broken/duplicate/undocumented tools removed and +4 missing tools added). 20 new unit tests against Resolve stubs covering the cloud settings builder, audio sync settings builder, and AppendToTimeline clipInfo builder. All 41 tests pass without a live Resolve connection.
|
|
686
|
+
|
|
687
|
+
**Live disposable Resolve validation**: every new and changed v2.3.3 granular tool was exercised against DaVinci Resolve Studio 20.3.2.9 in a disposable project with synthetic temp media via `tests/live_v233_validation.py`. 10/10 checks passed: `append_to_timeline` (simple + positioned + failure path), `auto_sync_audio` (settings dict + invalid input rejection), `import_media` image-sequence form, `timeline_create_compound_clip` (info dict forwarded — compound clip created with explicit name), `rename_color_group` (renamed a real color group), `render_with_quick_export` (params dict forwarded — Resolve's structured `{JobStatus, Error}` response confirms the dict reached it), and the compound-side `GetItemListInTrack` deprecated→supported fix.
|
|
688
|
+
|
|
689
|
+
## v2.3.2
|
|
690
|
+
|
|
691
|
+
API parity sweep — closing documented overloads and dropped parameters that the v2.3.1 audit surfaced.
|
|
692
|
+
|
|
693
|
+
- **Positioned `CreateTimelineFromClips` via `clip_infos`** — `media_pool(action="create_timeline_from_clips", params={"clip_infos": [...]})` and the granular `create_timeline_from_clips(clip_infos=[...])` now expose the documented `MediaPool.CreateTimelineFromClips(name, [{clipInfo}, ...])` overload (4 keys: `mediaPoolItem`, `startFrame`, `endFrame`, `recordFrame`)
|
|
694
|
+
- **Image-sequence `ImportMedia` via `clip_infos`** — both layers now expose `MediaPool.ImportMedia([{FilePath, StartIndex, EndIndex}, ...])` for DPX/EXR/etc. sequence imports. PascalCase keys preserved per Resolve docs
|
|
695
|
+
- **Positioned `AddItemListToMediaPool` via `item_infos`** — `media_storage(action="import_to_pool", params={"item_infos": [{media, startFrame, endFrame}, ...]})` and granular `add_items_to_media_pool_from_storage(item_infos=[...])` now expose the documented `MediaStorage.AddItemListToMediaPool([{itemInfo}, ...])` overload
|
|
696
|
+
- **`Timeline.AddTrack` dict form** — replaced the legacy bare-string `sub_type` argument with the documented `newTrackOptions` dict (`audio_type`, `index`). Granular `timeline_add_track(track_type, audio_type=, index=)` and compound `timeline(action="add_track", params={"track_type", "options": {audio_type, index}})`
|
|
697
|
+
- **`CreateSubtitlesFromAudio` actually wired up** — granular `timeline_create_subtitles_from_audio` previously advertised `language` and `preset` parameters then silently dropped them. Now maps user strings (e.g. `"korean"`, `"netflix"`, `"double"`) to `resolve.AUTO_CAPTION_*` constants per docs lines 720-761, and exposes the missing `chars_per_line`, `line_break`, `gap` keys
|
|
698
|
+
- **Granular `import_media` no longer crashes** — the granular `import_media` tool was importing from a deleted `api.media_operations` module and would throw `ModuleNotFoundError` on first call. Rewritten to call `MediaPool.ImportMedia` directly and to share the new `clip_infos` overload
|
|
699
|
+
- **`SetRenderSettings` docstring completeness** — granular `set_render_settings` now documents all 27 keys per docs lines 765-799 (previously omitted `EncodingProfile`, `MultiPassEncode`, `AlphaMode`, `NetworkOptimization`, `PixelAspectRatio`, `ClipStartFrame`, `TimelineStartTimecode`, `ReplaceExistingFilesInPlace`)
|
|
700
|
+
- **Removed 18 broken granular tools (+ 7 broken resources)** that imported from a deleted `api.*` namespace and would crash with `ModuleNotFoundError` on first call. All 25 had working equivalents elsewhere or wrapped undocumented Resolve methods. Granular tool count is now **336** (was 354). Migration map for any caller that was hitting them:
|
|
701
|
+
- `delete_media` → `media_pool(action="delete_clips")`
|
|
702
|
+
- `move_media_to_bin` → `media_pool(action="move_clips")`
|
|
703
|
+
- `auto_sync_audio` (granular tool) → `media_pool(action="auto_sync_audio")`
|
|
704
|
+
- `unlink_clips` → `media_pool(action="unlink")`
|
|
705
|
+
- `relink_clips` → `media_pool(action="relink")`
|
|
706
|
+
- `create_bin` → `media_pool(action="add_subfolder")`
|
|
707
|
+
- `list_media_pool_bins` (resource) → `folder(action="get_subfolders")`
|
|
708
|
+
- `get_media_pool_bin_contents` (resource) → `folder(action="get_clips")`
|
|
709
|
+
- `get_timeline_tracks` (resource) → `timeline(action="get_track_count")` + `timeline(action="get_items_in_track")`
|
|
710
|
+
- `create_empty_timeline` → `media_pool(action="create_timeline")`
|
|
711
|
+
- `delete_timeline` → `media_pool(action="delete_timelines")`
|
|
712
|
+
- `add_marker` (granular timeline tool) → `timeline_markers(action="add")`
|
|
713
|
+
- `add_clip_to_timeline` → `media_pool(action="append_to_timeline")`
|
|
714
|
+
- `apply_lut` (granular graph tool) → `graph(action="set_lut")`
|
|
715
|
+
- `copy_grade` → `timeline_item_color(action="copy_grades")`
|
|
716
|
+
- `get_render_presets` (resource) → `render(action="list_presets")`
|
|
717
|
+
- `add_to_render_queue` → `render(action="add_job")`
|
|
718
|
+
- `start_render` (granular project tool) → `render(action="start")`
|
|
719
|
+
- `get_render_queue_status` (resource) → `render(action="list_jobs")` + `render(action="get_job_status")`
|
|
720
|
+
- `clear_render_queue` (granular project tool) → `render(action="delete_all_jobs")`
|
|
721
|
+
- `create_sub_clip`, `get_current_color_node`, `get_color_wheel_params`, `set_color_wheel_param`, `add_node`: removed — these wrapped undocumented Resolve methods that were never exposed in the official scripting API. No replacement exists; use the Resolve UI for now.
|
|
722
|
+
|
|
723
|
+
## v2.3.1
|
|
724
|
+
|
|
725
|
+
- **Positioned `AppendToTimeline` via `clip_infos`** — `media_pool(action="append_to_timeline", params={"clip_infos": [...]})` now exposes the documented `MediaPool.AppendToTimeline([{clipInfo}, ...])` overload, accepting per-entry `clip_id`/`media_pool_item_id`, `start_frame`, `end_frame`, `record_frame`, `track_index`, and optional `media_type`. Each appended item returns its `timeline_item_id` for follow-up Fusion ops
|
|
726
|
+
- **Positioned append failure reporting** — the same call now returns `{"error": ...}` when Resolve fails to produce valid timeline items, including falsey `AppendToTimeline()` results and returned item handles without a timeline item id
|
|
727
|
+
- **Live disposable Resolve validation** — verified the fix against DaVinci Resolve Studio 20.3.2 with synthetic temp media in a disposable project: valid `clip_infos` append returned `success`, `count=1`, and `timeline_item_id`; invalid `clip_infos` calls returned errors
|
|
728
|
+
|
|
729
|
+
## v2.3.0
|
|
730
|
+
|
|
731
|
+
- **Resolve 20.2.2 API sync** — added the 12 scripting methods introduced across Resolve 20.0-20.2.2, with compatibility guards so older Resolve builds return clear "requires Resolve 20.x" errors instead of crashing
|
|
732
|
+
- **Resolve 20 live validation** — revalidated the new API surface against DaVinci Resolve Studio 20.3.2, bringing live-tested coverage to 331/336 methods (98.5%)
|
|
733
|
+
- **Official scripting docs refreshed** — `docs/reference/resolve_scripting_api.txt` now tracks the Resolve 20 scripting README bundled with the installed 20.3.2 developer package
|
|
734
|
+
- **AI skill reference updated** — merged PR #30's `docs/SKILL.md` and updated it for the Resolve 20 method count, granular server, version guards, and source media integrity guidance
|
|
735
|
+
- **Stale Resolve handle recovery** — both server modes now validate cached Resolve handles and reconnect cleanly after Resolve restarts or Project Manager transitions
|
|
736
|
+
|
|
737
|
+
## v2.2.0
|
|
738
|
+
|
|
739
|
+
- **Granular server modularized internally** — `src/resolve_mcp_server.py` is now a thin entrypoint, with the granular implementation split across `src/granular/resolve_control.py`, `project.py`, `timeline.py`, `timeline_item.py`, `media_pool.py`, `folder.py`, `media_pool_item.py`, `gallery.py`, `graph.py`, and `media_storage.py`
|
|
740
|
+
- **Installer now emits env blocks for every generated stdio config** — standard `.mcp.json`, VS Code `.vscode/mcp.json`, Zed `context_servers`, and manual snippets now include `RESOLVE_SCRIPT_API`, `RESOLVE_SCRIPT_LIB`, and `PYTHONPATH`
|
|
741
|
+
- **Windows Resolve 20.3 hardening** — on Windows, the installer also emits `PYTHONHOME` derived from the selected interpreter's base install so Resolve binds against the intended Python instead of a newer globally registered one
|
|
742
|
+
- **Windows stdio transport hardening** — server entrypoints now run FastMCP through strict LF-only stdio wrappers to avoid client disconnects caused by platform newline translation in Windows pipes
|
|
743
|
+
- **`set_cdl` accepts arrays cleanly** — both compound and granular servers now normalize JSON array, tuple, and numeric CDL values into Resolve's required string form like `"1.0 1.0 1.0"`
|
|
744
|
+
- **`fusion_comp` can target timeline item comps** — node graph actions can now operate on a clip's Fusion comp via `clip_id`, `timeline_item_id`, or `timeline_item`, and `bulk_set_inputs` applies scoped input changes across multiple timeline comps
|
|
745
|
+
- **`python src/server.py --full` now stays intact** — the compound entrypoint now correctly launches the granular server instead of importing it and exiting
|
|
746
|
+
|
|
747
|
+
## v2.1.0
|
|
748
|
+
|
|
749
|
+
- **New `fusion_comp` tool** — 20-action tool exposing the full Fusion composition node graph API. Add/delete/find nodes, wire connections, set/get parameters, manage keyframes, control undo grouping, set render ranges, and trigger renders — all on the currently active Fusion page composition
|
|
750
|
+
- **`timeline_item_fusion` cache actions** — added `get_cache_enabled` and `set_cache` actions for Fusion output cache control directly on timeline items
|
|
751
|
+
- **Fusion node graph reference** — docstring includes common tool IDs (Merge, TextPlus, Background, Transform, ColorCorrector, DeltaKeyer, etc.) for discoverability
|
|
752
|
+
|
|
753
|
+
## v2.0.9
|
|
754
|
+
|
|
755
|
+
- **Cross-platform sandbox path redirect** — `_resolve_safe_dir()` now handles macOS (`/var/folders`, `/private/var`), Linux (`/tmp`, `/var/tmp`), and Windows (`AppData\Local\Temp`) sandbox paths that Resolve can't write to. Redirects to `~/Documents/resolve-stills` instead of Desktop
|
|
756
|
+
- **Auto-cleanup for `grab_and_export`** — exported files are read into the response (DRX as inline text, images as base64) then deleted from disk automatically. Zero file accumulation. Pass `cleanup: false` to keep files on disk
|
|
757
|
+
- **Both servers in sync** — `server.py` and `resolve_mcp_server.py` now share the same version and both use `_resolve_safe_dir()` for all Resolve-facing temp paths (project export, LUT export, still export)
|
|
758
|
+
|
|
759
|
+
## v2.0.8
|
|
760
|
+
|
|
761
|
+
- **New `grab_and_export` action on `gallery_stills`** — combines `GrabStill()` + `ExportStills()` in a single atomic call, keeping the live GalleryStill reference for reliable export. Returns a file manifest with exported image + companion `.drx` grade file
|
|
762
|
+
- **Format fallback chain** — if the requested format fails, automatically retries with tif then dpx
|
|
763
|
+
- **macOS sandbox path redirect** — `/var/folders` and `/private/var` paths are redirected to `~/Desktop/resolve-stills` since Resolve's process can't write to sandboxed temp directories
|
|
764
|
+
- **Key finding documented** — `ExportStills` requires the Gallery panel to be visible on the Color page. All 9 supported formats (dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx) produce a companion `.drx` grade file alongside the image
|
|
765
|
+
|
|
766
|
+
## v2.0.7
|
|
767
|
+
|
|
768
|
+
- **Security: path traversal protection for layout preset tools** — `export_layout_preset`, `import_layout_preset`, and `delete_layout_preset` now validate that resolved file paths stay within the expected Resolve presets directory, preventing path traversal via crafted preset names
|
|
769
|
+
- **Security: document destructive tool risk** — added Security Considerations section noting that `quit_app`/`restart_app` tools can terminate Resolve; MCP clients should require user confirmation before invoking
|
|
770
|
+
|
|
771
|
+
## v2.0.6
|
|
772
|
+
|
|
773
|
+
- **Fix color group operations crash** — `timeline_item_color` unpacked `_check()` as `(proj, _, _)` but `_check()` returns `(pm, proj, err)`, so `proj` got the ProjectManager instead of the Project, crashing `assign_color_group` and `remove_from_color_group`
|
|
774
|
+
|
|
775
|
+
## v2.0.5
|
|
776
|
+
|
|
777
|
+
- **Lazy connection recovery** — full server (`--full` mode) now auto-reconnects and auto-launches Resolve, matching the compound server behavior
|
|
778
|
+
- **Null guards on all chained API calls** — `GetProjectManager()`, `GetCurrentProject()`, `GetCurrentTimeline()` failures now return clear errors instead of `NoneType` crashes
|
|
779
|
+
- **Helper functions** — `get_resolve()`, `get_project_manager()`, `get_current_project()` replace 178 boilerplate blocks
|
|
780
|
+
|
|
781
|
+
## v2.0.4
|
|
782
|
+
|
|
783
|
+
- **Fix apply_grade_from_drx parameter** — renamed `mode` to `grade_mode` to match Resolve API; corrected documentation from replace/append to actual keyframe alignment modes (0=No keyframes, 1=Source Timecode aligned, 2=Start Frames aligned)
|
|
784
|
+
- **Backward compatible** — still accepts `mode` for existing clients, `grade_mode` takes precedence
|
|
785
|
+
|
|
786
|
+
## v2.0.3
|
|
787
|
+
|
|
788
|
+
- **Fix GetNodeGraph crash** — `GetNodeGraph(0)` returns `False` in Resolve; now calls without args unless `layer_index` is explicitly provided
|
|
789
|
+
- **Falsy node graph check** — guard checks `not g` instead of `g is None` to catch `False` returns
|
|
790
|
+
|
|
791
|
+
## v2.0.2
|
|
792
|
+
|
|
793
|
+
- **Antigravity support** — Google's agentic AI coding assistant added as 10th MCP client
|
|
794
|
+
- **Alphabetical client ordering** — MCP_CLIENTS list sorted for easier maintenance
|
|
795
|
+
|
|
796
|
+
## v2.0.1
|
|
797
|
+
|
|
798
|
+
- **26-tool compound server** — all 324 API methods grouped into 26 context-efficient tools (default)
|
|
799
|
+
- **Universal installer** — single `python install.py` for macOS/Windows/Linux, 10 MCP clients
|
|
800
|
+
- **Dedicated timeline_item actions** — retime/speed, transform, crop, composite, audio, keyframes with validation
|
|
801
|
+
- **Lazy Resolve connection** — server starts instantly, connects when first tool is called
|
|
802
|
+
- **Bug fixes** — CreateMagicMask param type, GetCurrentClipThumbnailImage args, Python 3.13+ warning
|