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.
Files changed (92) hide show
  1. package/AGENTS.md +85 -0
  2. package/CHANGELOG.md +802 -0
  3. package/CLAUDE.md +15 -0
  4. package/LICENSE +21 -0
  5. package/README.md +159 -0
  6. package/SECURITY.md +53 -0
  7. package/bin/davinci-resolve-mcp.mjs +376 -0
  8. package/docs/README.md +56 -0
  9. package/docs/SKILL.md +1145 -0
  10. package/docs/authoring/fuse-dctl-authoring.md +242 -0
  11. package/docs/authoring/script-plugin-authoring.md +195 -0
  12. package/docs/contributing.md +82 -0
  13. package/docs/guides/color-decision-guide.md +387 -0
  14. package/docs/guides/editorial-decision-guide.md +136 -0
  15. package/docs/guides/media-analysis-guide.md +615 -0
  16. package/docs/guides/multicam-setup-guide.md +138 -0
  17. package/docs/install.md +198 -0
  18. package/docs/integrations/workflow-integrations.md +120 -0
  19. package/docs/kernels/README.md +28 -0
  20. package/docs/kernels/audio-fairlight-kernel.md +86 -0
  21. package/docs/kernels/color-grade-kernel.md +103 -0
  22. package/docs/kernels/extension-authoring-kernel.md +101 -0
  23. package/docs/kernels/fusion-composition-kernel.md +91 -0
  24. package/docs/kernels/media-pool-ingest-kernel.md +147 -0
  25. package/docs/kernels/project-lifecycle-kernel.md +120 -0
  26. package/docs/kernels/render-deliver-kernel.md +92 -0
  27. package/docs/kernels/review-annotation-kernel.md +110 -0
  28. package/docs/kernels/timeline-conform-interchange-kernel.md +99 -0
  29. package/docs/kernels/timeline-edit-kernel.md +189 -0
  30. package/docs/notes/codec-plugin-notes.md +136 -0
  31. package/docs/notes/dctl-notes.md +234 -0
  32. package/docs/notes/fusion-template-notes.md +136 -0
  33. package/docs/notes/lut-notes.md +136 -0
  34. package/docs/notes/openfx-notes.md +120 -0
  35. package/docs/process/release-process.md +152 -0
  36. package/docs/reference/api-coverage.md +488 -0
  37. package/docs/reference/resolve_scripting_api.txt +1012 -0
  38. package/examples/README.md +53 -0
  39. package/examples/markers/README.md +81 -0
  40. package/examples/media/README.md +94 -0
  41. package/examples/timeline/README.md +98 -0
  42. package/install.py +1196 -0
  43. package/package.json +52 -0
  44. package/scripts/audit_api_parity.py +275 -0
  45. package/scripts/live_media_analysis_polish_probe.py +65 -0
  46. package/src/__init__.py +3 -0
  47. package/src/analysis_dashboard.py +4936 -0
  48. package/src/control_panel.py +13 -0
  49. package/src/granular/__init__.py +17 -0
  50. package/src/granular/common.py +727 -0
  51. package/src/granular/folder.py +287 -0
  52. package/src/granular/gallery.py +306 -0
  53. package/src/granular/graph.py +309 -0
  54. package/src/granular/media_pool.py +679 -0
  55. package/src/granular/media_pool_item.py +852 -0
  56. package/src/granular/media_storage.py +179 -0
  57. package/src/granular/project.py +1594 -0
  58. package/src/granular/resolve_control.py +521 -0
  59. package/src/granular/timeline.py +1074 -0
  60. package/src/granular/timeline_item.py +2251 -0
  61. package/src/resolve_mcp_server.py +43 -0
  62. package/src/server.py +15691 -0
  63. package/src/utils/__init__.py +3 -0
  64. package/src/utils/app_control.py +319 -0
  65. package/src/utils/audio_fairlight_live_probe.py +263 -0
  66. package/src/utils/cdl.py +20 -0
  67. package/src/utils/cloud_operations.py +192 -0
  68. package/src/utils/color_grade_live_probe.py +444 -0
  69. package/src/utils/dctl_templates.py +368 -0
  70. package/src/utils/extension_authoring_live_probe.py +292 -0
  71. package/src/utils/fuse_templates.py +1968 -0
  72. package/src/utils/fusion_composition_live_probe.py +284 -0
  73. package/src/utils/layout_presets.py +333 -0
  74. package/src/utils/mcp_stdio.py +32 -0
  75. package/src/utils/media_analysis.py +3618 -0
  76. package/src/utils/media_analysis_jobs.py +796 -0
  77. package/src/utils/media_pool_ingest_live_probe.py +592 -0
  78. package/src/utils/multicam.py +393 -0
  79. package/src/utils/object_inspection.py +287 -0
  80. package/src/utils/platform.py +157 -0
  81. package/src/utils/project_lifecycle_live_probe.py +376 -0
  82. package/src/utils/project_properties.py +601 -0
  83. package/src/utils/render_deliver_live_probe.py +384 -0
  84. package/src/utils/resolve_connection.py +77 -0
  85. package/src/utils/review_annotation_live_probe.py +352 -0
  86. package/src/utils/script_templates.py +1193 -0
  87. package/src/utils/sync_detection.py +887 -0
  88. package/src/utils/timeline_conform_live_probe.py +280 -0
  89. package/src/utils/timeline_kernel_live_probe.py +1091 -0
  90. package/src/utils/timeline_kernel_probe.py +185 -0
  91. package/src/utils/timeline_title_text.py +87 -0
  92. 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