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
@@ -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
+ ```