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
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# DaVinci Resolve Fusion Template Notes
|
|
2
|
+
|
|
3
|
+
Blackmagic's Fusion Templates README documents `.setting` templates used by the
|
|
4
|
+
Edit and Cut page Effects Library. This is relevant to the MCP because several
|
|
5
|
+
timeline actions insert named Fusion generators and titles, and failures often
|
|
6
|
+
come down to template location, category, naming, or Resolve needing a restart.
|
|
7
|
+
|
|
8
|
+
## Current MCP Surface
|
|
9
|
+
|
|
10
|
+
The scripting API overlap is useful but narrow:
|
|
11
|
+
|
|
12
|
+
- `timeline(action="insert_fusion_generator", params={"name": "..."})` wraps
|
|
13
|
+
`Timeline.InsertFusionGeneratorIntoTimeline(generatorName)`.
|
|
14
|
+
- `timeline(action="insert_fusion_title", params={"name": "..."})` wraps
|
|
15
|
+
`Timeline.InsertFusionTitleIntoTimeline(titleName)`.
|
|
16
|
+
- `timeline(action="insert_fusion_composition")` inserts an empty Fusion
|
|
17
|
+
composition into the current timeline.
|
|
18
|
+
- `timeline_item_fusion` manages Fusion comps already attached to timeline
|
|
19
|
+
items, including import/export of Fusion compositions.
|
|
20
|
+
- `fusion_comp` edits the node graph of the active Fusion comp or a scoped
|
|
21
|
+
timeline-item comp.
|
|
22
|
+
|
|
23
|
+
Fusion template `.setting` files are not the same thing as exported Fusion comp
|
|
24
|
+
files used by `timeline_item_fusion.import_comp`. Treat template installation
|
|
25
|
+
and Fusion-comp import as different workflows.
|
|
26
|
+
|
|
27
|
+
## Template Categories
|
|
28
|
+
|
|
29
|
+
Fusion templates are macro or group `.setting` files saved into category folders:
|
|
30
|
+
|
|
31
|
+
| Category | Shape |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Transitions | Two image inputs and one output. |
|
|
34
|
+
| Generators | No image inputs and one output. |
|
|
35
|
+
| Titles | Generator-style templates centered on Text+ or Text3D. |
|
|
36
|
+
| Effects | One image input and one output, applied to clips from the Effects tab. |
|
|
37
|
+
|
|
38
|
+
The MCP currently has direct timeline insertion helpers for Fusion generators
|
|
39
|
+
and Fusion titles. The Resolve scripting API does not expose a general
|
|
40
|
+
"install Fusion template" or "list Fusion templates" method.
|
|
41
|
+
|
|
42
|
+
## Template Paths
|
|
43
|
+
|
|
44
|
+
Fusion templates live under `Fusion/Templates/` in platform-specific roots:
|
|
45
|
+
|
|
46
|
+
| Platform | All users | Specific user |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| macOS | `/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Templates/` | `/Users/<UserName>/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Templates/` |
|
|
49
|
+
| Windows | `C:\ProgramData\Blackmagic Design\DaVinci Resolve\Fusion\Templates\` | `C:\Users\<UserName>\AppData\Roaming\Blackmagic Design\DaVinci Resolve\Support\Fusion\Templates\` |
|
|
50
|
+
| Linux | `/var/BlackmagicDesign/DaVinci Resolve/Fusion/Templates/` or `/home/resolve/Fusion/Templates/` | `$HOME/.local/share/DaVinciResolve/Fusion/Templates/` |
|
|
51
|
+
|
|
52
|
+
Only templates under this Edit-page hierarchy show up on the Cut and Edit pages:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Edit/
|
|
56
|
+
Transitions/
|
|
57
|
+
Titles/
|
|
58
|
+
Generators/
|
|
59
|
+
Effects/
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Templates saved elsewhere may still be visible from the Fusion page Effects
|
|
63
|
+
Library but not from the Edit/Cut page categories used by timeline insertion.
|
|
64
|
+
|
|
65
|
+
## Animation Guidance
|
|
66
|
+
|
|
67
|
+
Fusion template animation should generally use the Anim Curves modifier instead
|
|
68
|
+
of fixed-time keyframes. Edit/Cut page template duration is driven by the edit
|
|
69
|
+
length or transition curve, so fixed-time keyframes will not adapt cleanly when
|
|
70
|
+
an editor changes duration.
|
|
71
|
+
|
|
72
|
+
Anim Curves timing sources:
|
|
73
|
+
|
|
74
|
+
- `Duration` times animation to the edit duration.
|
|
75
|
+
- `Transition` follows duration and also uses the Edit page transition curve.
|
|
76
|
+
- `Custom` reveals an input that can be driven manually by another spline or
|
|
77
|
+
modifier.
|
|
78
|
+
|
|
79
|
+
Anim Curves supports linear, easing, and custom curves, plus mirror, invert,
|
|
80
|
+
scale, offset, clipping, time scale, and time offset controls.
|
|
81
|
+
|
|
82
|
+
## Assets, Icons, And DRFX Bundles
|
|
83
|
+
|
|
84
|
+
Since Resolve 17.2, Fusion templates can include bundled assets such as images,
|
|
85
|
+
FBX models/cameras, and LUTs. Inside templates, the `Setting:` path map points
|
|
86
|
+
to the directory containing the loaded `.setting` file. Examples:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
Setting:leaf.jpg
|
|
90
|
+
Setting:Models/object.fbx
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Resolve also supports a `.png` icon next to a `.setting` file when both share
|
|
94
|
+
the same base name. Blackmagic recommends `104 x 58`; very large icons may slow
|
|
95
|
+
Resolve startup.
|
|
96
|
+
|
|
97
|
+
`.drfx` bundles are ordinary zip files renamed with a lower-case `.drfx`
|
|
98
|
+
extension. They can contain multiple templates, icons, and assets. For Edit/Cut
|
|
99
|
+
recognition, keep the same `Edit/Titles`, `Edit/Generators`,
|
|
100
|
+
`Edit/Transitions`, and `Edit/Effects` folder hierarchy inside the bundle.
|
|
101
|
+
|
|
102
|
+
## Practical Failure Checks
|
|
103
|
+
|
|
104
|
+
If `insert_fusion_generator` or `insert_fusion_title` fails:
|
|
105
|
+
|
|
106
|
+
- Confirm the template is in the matching `Edit/Generators` or `Edit/Titles`
|
|
107
|
+
folder.
|
|
108
|
+
- Restart Resolve after adding template files.
|
|
109
|
+
- Confirm the display/template name matches the string passed to the API.
|
|
110
|
+
- Check whether the template category is wrong; transitions and effects are not
|
|
111
|
+
inserted by the generator/title helpers.
|
|
112
|
+
- Check any `Setting:` assets are present beside the `.setting` file or in the
|
|
113
|
+
expected subfolder.
|
|
114
|
+
- For animated templates, inspect whether fixed keyframes were used where Anim
|
|
115
|
+
Curves were needed.
|
|
116
|
+
|
|
117
|
+
## Useful Future Additions
|
|
118
|
+
|
|
119
|
+
Good repo additions, if Fusion template workflows become common:
|
|
120
|
+
|
|
121
|
+
1. A read-only Fusion template inventory helper that scans known template roots
|
|
122
|
+
and reports `.setting` files by category.
|
|
123
|
+
2. Better failure text for `insert_fusion_generator` and `insert_fusion_title`
|
|
124
|
+
that points users to category folders, restart requirements, and name checks.
|
|
125
|
+
3. A small example that installs a user-local generator/title template and then
|
|
126
|
+
inserts it with the existing timeline actions. Keep system-wide install
|
|
127
|
+
paths explicit because they may require administrator privileges.
|
|
128
|
+
4. A DRFX inspection helper that verifies lower-case `.drfx`, zip structure,
|
|
129
|
+
category folders, icons, and referenced `Setting:` assets.
|
|
130
|
+
|
|
131
|
+
## Source Media Integrity
|
|
132
|
+
|
|
133
|
+
Fusion templates and bundled assets affect Resolve's timeline/render pipeline.
|
|
134
|
+
They should not modify camera originals. Do not bake template effects into
|
|
135
|
+
source media, create rendered derivatives, or export/reimport processed media
|
|
136
|
+
unless the user explicitly asks for that workflow.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# DaVinci Resolve LUT Notes
|
|
2
|
+
|
|
3
|
+
Blackmagic's LUT developer README documents Resolve's supported `.cube` LUT
|
|
4
|
+
format. This is directly relevant to the MCP's color tools because Resolve will
|
|
5
|
+
only apply LUTs that it can parse and discover.
|
|
6
|
+
|
|
7
|
+
## Current MCP Surface
|
|
8
|
+
|
|
9
|
+
The scripting API already exposes the important LUT operations:
|
|
10
|
+
|
|
11
|
+
- `project_settings(action="refresh_luts")` wraps `Project.RefreshLUTList()`.
|
|
12
|
+
Call this after adding LUT files to Resolve's LUT folders.
|
|
13
|
+
- `graph(action="set_lut", params={"node_index": 1, "lut_path": "..."})`
|
|
14
|
+
wraps `Graph.SetLUT(nodeIndex, lutPath)`.
|
|
15
|
+
- `graph(action="get_lut", params={"node_index": 1})` wraps
|
|
16
|
+
`Graph.GetLUT(nodeIndex)`.
|
|
17
|
+
- `timeline_item_color(action="export_lut", ...)` wraps
|
|
18
|
+
`TimelineItem.ExportLUT(exportType, path)`.
|
|
19
|
+
- `graph(action="apply_arri_cdl_lut")` wraps `Graph.ApplyArriCdlLut()`.
|
|
20
|
+
- `project_manager(action="export_project", params={"with_stills_and_luts": true})`
|
|
21
|
+
can include LUTs in a `.drp` export.
|
|
22
|
+
|
|
23
|
+
`SetLUT()` uses 1-based node indexes and succeeds only for LUT paths Resolve has
|
|
24
|
+
already discovered. The `lut_path` may be absolute or relative to Resolve's
|
|
25
|
+
master/custom LUT paths.
|
|
26
|
+
|
|
27
|
+
## Cube LUT Format
|
|
28
|
+
|
|
29
|
+
A `.cube` file is a text file with a header followed by lookup-table data.
|
|
30
|
+
Resolve supports:
|
|
31
|
+
|
|
32
|
+
- 1D LUTs
|
|
33
|
+
- 3D LUTs
|
|
34
|
+
- An optional 1D shaper LUT before a 1D or 3D LUT
|
|
35
|
+
|
|
36
|
+
### 1D LUT
|
|
37
|
+
|
|
38
|
+
Header keywords:
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
LUT_1D_SIZE N
|
|
42
|
+
LUT_1D_INPUT_RANGE MIN_VAL MAX_VAL
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`N` is the number of entries, up to 65536. Each data row contains three
|
|
46
|
+
space-separated floating point values for output R, G, and B. Rows map evenly
|
|
47
|
+
from `MIN_VAL` to `MAX_VAL`; values between rows are linearly interpolated.
|
|
48
|
+
|
|
49
|
+
### 3D LUT
|
|
50
|
+
|
|
51
|
+
Header keywords:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
LUT_3D_SIZE N
|
|
55
|
+
LUT_3D_INPUT_RANGE MIN_VAL MAX_VAL
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`N` is the number of samples per channel, so the file must contain `N * N * N`
|
|
59
|
+
data rows. Each row contains output R, G, and B. Resolve expects the R axis to
|
|
60
|
+
change fastest, then G, then B. Resolve supports trilinear and tetrahedral
|
|
61
|
+
interpolation for 3D LUTs.
|
|
62
|
+
|
|
63
|
+
### Shaper LUT
|
|
64
|
+
|
|
65
|
+
A shaper LUT is a 1D LUT placed before the main LUT. It remaps the input range
|
|
66
|
+
so the main 1D/3D LUT can spend more samples on important parts of the signal,
|
|
67
|
+
for example a log curve's lower code values.
|
|
68
|
+
|
|
69
|
+
## Optional Properties
|
|
70
|
+
|
|
71
|
+
Comments begin with `#` and are ignored by the parser.
|
|
72
|
+
|
|
73
|
+
The optional title form is:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
TITLE "Description"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Resolve applies LUTs in data range, with values normalized from `0.0` to `1.0`.
|
|
80
|
+
For LUTs designed around video range values, the cube file can declare:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
LUT_IN_VIDEO_RANGE
|
|
84
|
+
LUT_OUT_VIDEO_RANGE
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Those flags tell Resolve to compensate when applying the LUT inside its
|
|
88
|
+
data-range processing pipeline.
|
|
89
|
+
|
|
90
|
+
## Built-In LUT Locations
|
|
91
|
+
|
|
92
|
+
Blackmagic's examples live in the installed LUT folder:
|
|
93
|
+
|
|
94
|
+
| Platform | LUT folder |
|
|
95
|
+
|---|---|
|
|
96
|
+
| macOS | `/Library/Application Support/Blackmagic Design/DaVinci Resolve/LUT` |
|
|
97
|
+
| Linux | `/opt/resolve/LUT` |
|
|
98
|
+
| Windows | `%PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\LUT` |
|
|
99
|
+
|
|
100
|
+
Example built-in LUT categories include `VFX IO`, `Blackmagic Design`, and
|
|
101
|
+
`ACES`.
|
|
102
|
+
|
|
103
|
+
## Practical Failure Checks
|
|
104
|
+
|
|
105
|
+
If `graph.set_lut` fails or `graph.get_lut` returns empty:
|
|
106
|
+
|
|
107
|
+
- Confirm the current page/context has a valid Color graph and the node index is
|
|
108
|
+
1-based.
|
|
109
|
+
- Confirm the LUT file is in a Resolve LUT folder or is referenced by a valid
|
|
110
|
+
absolute path.
|
|
111
|
+
- Call `project_settings(action="refresh_luts")` after adding or changing LUT
|
|
112
|
+
files.
|
|
113
|
+
- Check the `.cube` header and row count. 3D LUTs must contain exactly
|
|
114
|
+
`N * N * N` rows.
|
|
115
|
+
- Confirm the file extension is `.cube` and the content is plain text.
|
|
116
|
+
- Check whether video-range flags are needed; wrong range assumptions can look
|
|
117
|
+
like a broken grade even when the file parses.
|
|
118
|
+
|
|
119
|
+
## Useful Future Additions
|
|
120
|
+
|
|
121
|
+
Good repo additions, if LUT troubleshooting becomes common:
|
|
122
|
+
|
|
123
|
+
1. A read-only `.cube` validator that checks header shape, row count, numeric
|
|
124
|
+
values, shaper/main LUT ordering, and video-range flags.
|
|
125
|
+
2. A read-only LUT folder inventory helper that scans known Resolve LUT roots.
|
|
126
|
+
This would be a filesystem diagnostic, not a Resolve API list.
|
|
127
|
+
3. Better `graph.set_lut` failure text that reminds users to refresh the LUT
|
|
128
|
+
list and verify the 1-based node index.
|
|
129
|
+
4. A tiny synthetic LUT fixture for tests of any future validator.
|
|
130
|
+
|
|
131
|
+
## Source Media Integrity
|
|
132
|
+
|
|
133
|
+
Applying a LUT in Resolve changes the grade/render pipeline, not the source
|
|
134
|
+
media file on disk. Do not bake LUTs into camera originals, create transformed
|
|
135
|
+
copies, or export/reimport derivative media unless the user explicitly asks for
|
|
136
|
+
that workflow.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# DaVinci Resolve OpenFX Notes
|
|
2
|
+
|
|
3
|
+
Blackmagic's OpenFX developer package is for building native C++ image-effect
|
|
4
|
+
plugins that Resolve can load. It is not a separate control API for this MCP
|
|
5
|
+
server. The MCP can call Resolve scripting methods that reference installed OFX
|
|
6
|
+
generators, but it should not try to compile, install, or manage OFX bundles
|
|
7
|
+
unless the user explicitly asks.
|
|
8
|
+
|
|
9
|
+
## What The Bundled Package Contains
|
|
10
|
+
|
|
11
|
+
The installed Resolve developer package includes:
|
|
12
|
+
|
|
13
|
+
| Directory | Purpose |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `OpenFX-1.4` | Official OpenFX header files. |
|
|
16
|
+
| `Support` | C++ wrapper/support library around the OFX C plugin API. |
|
|
17
|
+
| `GainPlugin` | Single-input filter sample with CPU, CUDA, OpenCL, and Metal render paths. |
|
|
18
|
+
| `TemporalBlurPlugin` | Temporal sample that requests neighboring frames. |
|
|
19
|
+
| `DissolveTransitionPlugin` | Transition sample with two compulsory inputs and a `Transition` parameter. |
|
|
20
|
+
| `RandomFrameAccessPlugin` | Sample that demonstrates random temporal frame access. |
|
|
21
|
+
|
|
22
|
+
Each sample includes Xcode project files, Visual Studio files, and a Makefile.
|
|
23
|
+
The plugin source is split between the plugin class/factory files and optional
|
|
24
|
+
GPU kernel files:
|
|
25
|
+
|
|
26
|
+
- `[PluginName].h`
|
|
27
|
+
- `[PluginName].cpp`
|
|
28
|
+
- `CudaKernel.cu`
|
|
29
|
+
- `OpenCLKernel.cpp`
|
|
30
|
+
- `MetalKernel.mm`
|
|
31
|
+
|
|
32
|
+
## Plugin Install Locations
|
|
33
|
+
|
|
34
|
+
Compiled plugins produce a `[PluginName].ofx.bundle` directory. Resolve discovers
|
|
35
|
+
plugins from the standard OFX plugin folders:
|
|
36
|
+
|
|
37
|
+
| Platform | OFX plugin folder |
|
|
38
|
+
|---|---|
|
|
39
|
+
| macOS | `/Library/OFX/Plugins` |
|
|
40
|
+
| Linux | `/usr/OFX/Plugins` |
|
|
41
|
+
| Windows | `C:\Program Files\Common Files\OFX\Plugins` |
|
|
42
|
+
|
|
43
|
+
Installing into these locations is outside normal MCP behavior because it writes
|
|
44
|
+
to system plugin directories and may require administrator privileges.
|
|
45
|
+
|
|
46
|
+
## OFX Plugin Shape
|
|
47
|
+
|
|
48
|
+
The bundled samples follow the OpenFX support-library pattern:
|
|
49
|
+
|
|
50
|
+
- Subclass `OFX::ImageProcessor` and implement processing paths such as
|
|
51
|
+
`processImagesCUDA`, `processImagesOpenCL`, `processImagesMetal`, and
|
|
52
|
+
`multiThreadProcessImages`.
|
|
53
|
+
- Subclass `OFX::ImageEffect`; `render()` is the core render callback.
|
|
54
|
+
- Implement `isIdentity()` when a parameter state can pass the source through
|
|
55
|
+
unchanged.
|
|
56
|
+
- Implement `changedParam()` and `changedClip()` for host notifications.
|
|
57
|
+
- Implement `getFramesNeeded()` for temporal effects that need neighboring or
|
|
58
|
+
random frames.
|
|
59
|
+
- Keep `setupAndProcess()` as the handoff from Resolve render arguments to the
|
|
60
|
+
image processor.
|
|
61
|
+
- Implement a factory with `describe()`, `describeInContext()`, and
|
|
62
|
+
`createInstance()`.
|
|
63
|
+
- Register factories through `OFX::Plugin::getPluginIDs()`.
|
|
64
|
+
|
|
65
|
+
Important Resolve/OpenFX capability flags from the samples:
|
|
66
|
+
|
|
67
|
+
- `OFX::eContextFilter` is for a traditional one-input effect.
|
|
68
|
+
- `OFX::eContextTransition` requires two input clips plus the standard
|
|
69
|
+
transition parameter.
|
|
70
|
+
- `setNoSpatialAwareness(true)` tells the host the result does not depend on
|
|
71
|
+
neighboring pixels, which can make an effect eligible during LUT generation.
|
|
72
|
+
- `setTemporalClipAccess(true)` is needed for effects that request frames beyond
|
|
73
|
+
the current source frame.
|
|
74
|
+
- `setSupportsCudaRender`, `setSupportsOpenCLRender`, and
|
|
75
|
+
`setSupportsMetalRender` advertise GPU render paths to the host.
|
|
76
|
+
- If using the host-provided CUDA stream, call `setSupportsCudaStream(true)`.
|
|
77
|
+
If using an internal/default stream, synchronize GPU work before returning
|
|
78
|
+
from `render()`.
|
|
79
|
+
|
|
80
|
+
## What This Means For The MCP
|
|
81
|
+
|
|
82
|
+
The current scripting overlap is small and already present:
|
|
83
|
+
|
|
84
|
+
- `timeline(action="insert_ofx_generator", params={"name": "..."})` wraps
|
|
85
|
+
`Timeline.InsertOFXGeneratorIntoTimeline(generatorName)`.
|
|
86
|
+
- `graph(action="get_tools_in_node", ...)` can report OFX tools present in a
|
|
87
|
+
color node when Resolve exposes them.
|
|
88
|
+
|
|
89
|
+
The Resolve scripting README does not expose a general "list installed OFX
|
|
90
|
+
plugins" method. If an OFX insert fails, the likely causes are:
|
|
91
|
+
|
|
92
|
+
- The named OFX generator is not installed in Resolve's OFX plugin path.
|
|
93
|
+
- Resolve has not been restarted since the bundle was installed.
|
|
94
|
+
- The plugin is an effect/transition rather than an OFX generator accepted by
|
|
95
|
+
`InsertOFXGeneratorIntoTimeline`.
|
|
96
|
+
- The plugin name/grouping shown in Resolve does not match the string passed to
|
|
97
|
+
the scripting API.
|
|
98
|
+
- The plugin failed to load because of host capability, binary compatibility, or
|
|
99
|
+
GPU/backend issues.
|
|
100
|
+
|
|
101
|
+
## Useful Future Additions
|
|
102
|
+
|
|
103
|
+
Good repo additions, if this becomes a real workflow need:
|
|
104
|
+
|
|
105
|
+
1. A read-only diagnostic helper that scans standard OFX plugin folders and
|
|
106
|
+
reports discovered `.ofx.bundle` names. This would be a filesystem inventory,
|
|
107
|
+
not a Resolve API guarantee.
|
|
108
|
+
2. Better error text for `insert_ofx_generator` that points users to plugin
|
|
109
|
+
install paths and restart/name-mismatch checks.
|
|
110
|
+
3. A small developer example showing how an installed OFX generator can be
|
|
111
|
+
inserted through the MCP, plus how to inspect resulting Color-page node tools.
|
|
112
|
+
4. No automatic OFX install/build flow by default. Compiling and installing
|
|
113
|
+
native plugins is a system-level operation and should stay explicit.
|
|
114
|
+
|
|
115
|
+
## Source Media Integrity
|
|
116
|
+
|
|
117
|
+
OpenFX effects process frames provided by Resolve and should not modify camera
|
|
118
|
+
originals. Any generated renders, caches, logs, or diagnostics should remain
|
|
119
|
+
explicit outputs, cache files, or sidecars. Do not use OFX examples as a reason
|
|
120
|
+
to create proxies or derivatives of source media without a direct user request.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Release Process
|
|
2
|
+
|
|
3
|
+
This checklist is the required path for version bumps, tags, and GitHub
|
|
4
|
+
Releases. It exists so fixes do not ship without the matching release artifact,
|
|
5
|
+
and so Resolve behavior changes are live-tested before release.
|
|
6
|
+
|
|
7
|
+
## Version Selection
|
|
8
|
+
|
|
9
|
+
Use semantic versioning:
|
|
10
|
+
|
|
11
|
+
- Patch (`x.y.Z`) for bug fixes, docs, test harnesses, and release-process
|
|
12
|
+
hardening that do not add public tool surface.
|
|
13
|
+
- Minor (`x.Y.0`) for new MCP actions, new documented parameters, new tools, or
|
|
14
|
+
workflow capabilities.
|
|
15
|
+
- Major (`X.0.0`) for breaking behavior, renamed tools/actions, or removed
|
|
16
|
+
public API surface without a compatible replacement.
|
|
17
|
+
|
|
18
|
+
When in doubt, choose the smallest version bump that accurately describes the
|
|
19
|
+
public API impact.
|
|
20
|
+
|
|
21
|
+
## Files To Update
|
|
22
|
+
|
|
23
|
+
Every release bump must update all version surfaces:
|
|
24
|
+
|
|
25
|
+
- `src/server.py`
|
|
26
|
+
- `src/granular/common.py`
|
|
27
|
+
- `install.py`
|
|
28
|
+
- `package.json`
|
|
29
|
+
- README version badge
|
|
30
|
+
- README current stats or latest-release summary when they changed
|
|
31
|
+
- `CHANGELOG.md` latest release entry
|
|
32
|
+
- `docs/SKILL.md` when tool discovery, examples, or behavior changed
|
|
33
|
+
- Git tag, e.g. `v2.4.1`
|
|
34
|
+
- GitHub Release notes
|
|
35
|
+
|
|
36
|
+
Do not consider a release complete until the GitHub Release exists and is marked
|
|
37
|
+
latest when appropriate.
|
|
38
|
+
|
|
39
|
+
## Required Validation
|
|
40
|
+
|
|
41
|
+
Always run static checks before release:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
venv/bin/python tests/test_import.py
|
|
45
|
+
venv/bin/python scripts/audit_api_parity.py
|
|
46
|
+
node bin/davinci-resolve-mcp.mjs --help
|
|
47
|
+
node bin/davinci-resolve-mcp.mjs --version
|
|
48
|
+
npm pack --dry-run
|
|
49
|
+
git diff --check
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Run focused unit tests for the changed surface. For recent timeline/marker
|
|
53
|
+
helpers, this usually includes:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
venv/bin/python -m unittest tests.test_extract_source_frame_ranges tests.test_marker_params tests.test_v232_helpers tests.test_v233_helpers tests.test_append_clip_infos_result_handling
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Behavior changes that touch DaVinci Resolve scripting must also have a live
|
|
60
|
+
Resolve validation before release. Use disposable projects and synthetic media
|
|
61
|
+
only. Never modify, transcode, proxy, or create derivatives of source media
|
|
62
|
+
unless the user explicitly requests it.
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
env RESOLVE_SCRIPT_API="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting" \
|
|
68
|
+
RESOLVE_SCRIPT_LIB="/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so" \
|
|
69
|
+
PYTHONPATH="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules" \
|
|
70
|
+
python3.11 tests/live_marker_validation.py
|
|
71
|
+
|
|
72
|
+
env RESOLVE_SCRIPT_API="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting" \
|
|
73
|
+
RESOLVE_SCRIPT_LIB="/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so" \
|
|
74
|
+
PYTHONPATH="/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules" \
|
|
75
|
+
venv/bin/python tests/live_v233_validation.py
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
One-off live harnesses are acceptable during review, but reusable coverage
|
|
79
|
+
should live under `tests/`. Do not commit generated media or disposable project
|
|
80
|
+
artifacts.
|
|
81
|
+
|
|
82
|
+
Docs-only releases do not require a Resolve live run, but the release notes
|
|
83
|
+
should say that no behavior changed.
|
|
84
|
+
|
|
85
|
+
## Release Checklist
|
|
86
|
+
|
|
87
|
+
1. Start from a clean tracked worktree. Leave unrelated untracked user files
|
|
88
|
+
alone.
|
|
89
|
+
2. Merge or land the feature/fix commit.
|
|
90
|
+
3. Update all version surfaces, README current stats, and `CHANGELOG.md`.
|
|
91
|
+
4. Run required static checks, focused unit tests, and live Resolve validation
|
|
92
|
+
when behavior changed.
|
|
93
|
+
5. Commit the release bump with a conventional commit, for example:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
git commit -m "chore(release): bump version to 2.4.1"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
6. Push `main`.
|
|
100
|
+
7. Create and push the annotated tag:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
git tag -a v2.4.1 -m "v2.4.1"
|
|
104
|
+
git push origin v2.4.1
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
8. Create the GitHub Release:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
gh release create v2.4.1 \
|
|
111
|
+
--repo samuelgursky/davinci-resolve-mcp \
|
|
112
|
+
--title "v2.4.1" \
|
|
113
|
+
--notes-file /path/to/release-notes.md \
|
|
114
|
+
--latest
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
9. Verify the result:
|
|
118
|
+
|
|
119
|
+
The `Publish npm package` workflow publishes the npm package from `v*` tags.
|
|
120
|
+
The npm package should use trusted publishing/OIDC and provenance, not a
|
|
121
|
+
long-lived npm token.
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
gh release list --repo samuelgursky/davinci-resolve-mcp --limit 5
|
|
125
|
+
git tag --list "v2.4.*" --sort=-v:refname
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Release Notes Template
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
## vX.Y.Z
|
|
132
|
+
|
|
133
|
+
Short release summary.
|
|
134
|
+
|
|
135
|
+
### Added
|
|
136
|
+
|
|
137
|
+
- ...
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
|
|
141
|
+
- ...
|
|
142
|
+
|
|
143
|
+
### Documentation
|
|
144
|
+
|
|
145
|
+
- ...
|
|
146
|
+
|
|
147
|
+
### Validation
|
|
148
|
+
|
|
149
|
+
- Unit/static checks run.
|
|
150
|
+
- Live Resolve validation details, or "No Resolve behavior changed; live test
|
|
151
|
+
not required."
|
|
152
|
+
```
|