davinci-resolve-mcp 2.80.1 → 2.80.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +1 -1
- package/docs/README.md +78 -9
- package/docs/kernels/audio-fairlight-kernel.md +1 -1
- package/docs/kernels/color-grade-kernel.md +1 -1
- package/docs/kernels/fusion-composition-kernel.md +1 -1
- package/docs/kernels/media-pool-ingest-kernel.md +1 -1
- package/docs/kernels/render-deliver-kernel.md +1 -1
- package/docs/kernels/timeline-conform-interchange-kernel.md +1 -1
- package/docs/kernels/timeline-edit-kernel.md +1 -1
- package/install.py +1 -1
- package/package.json +1 -1
- package/scripts/agent-rules/README.md +7 -4
- package/src/granular/common.py +1 -1
- package/src/server.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,71 @@
|
|
|
2
2
|
|
|
3
3
|
Release history for the DaVinci Resolve MCP Server. The latest release is summarized in the root README; older entries live here to keep the README focused.
|
|
4
4
|
|
|
5
|
+
## What's New in v2.80.2
|
|
6
|
+
|
|
7
|
+
Agent tooling only. Ten Claude Code skills that this repository has shipped and
|
|
8
|
+
advertised were never loading; they load now. No runtime behavior changed and
|
|
9
|
+
nothing under `src/` was touched.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **The ten `.claude/skills/` domain skills were invisible to every agent.**
|
|
14
|
+
Claude Code discovers skills at `.claude/skills/<name>/SKILL.md`. All ten were
|
|
15
|
+
loose `.md` files at the top level of that directory — a layout the loader
|
|
16
|
+
does not scan — so `resolve-color`, `resolve-edit`, `resolve-conform`,
|
|
17
|
+
`resolve-delivery`, `resolve-audio`, `resolve-fusion`, `resolve-media-pool`,
|
|
18
|
+
`resolve-media-analysis`, `resolve-rough-cut`, and `resolve-mcp` never
|
|
19
|
+
appeared in a session, while the generated domain-routing block in `AGENTS.md`
|
|
20
|
+
and the index in `docs/README.md` both listed them as available. The failure
|
|
21
|
+
was silent: no warning, no error, no degraded mode. Each skill now lives in a
|
|
22
|
+
directory named for its frontmatter `name` (recorded as 100% renames, so
|
|
23
|
+
history follows), and both `docs/README.md` and
|
|
24
|
+
`scripts/agent-rules/README.md` — the file consulted when authoring a new
|
|
25
|
+
skill — state the directory requirement so the next one is not written back
|
|
26
|
+
into the bug.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- **Two opt-in `PreToolUse` guard scripts** for rules `AGENTS.md` has only ever
|
|
31
|
+
stated in prose. They ship as scripts and are deliberately *not* wired
|
|
32
|
+
repo-wide; `docs/README.md` carries the block to paste into a personal
|
|
33
|
+
gitignored `.claude/settings.local.json`. `frame_verification_guard.py`
|
|
34
|
+
refuses grade-applying actions on `timeline_item_color` until the session has
|
|
35
|
+
actually looked at a Resolve-rendered frame, and asks before `safe_copy_grade`
|
|
36
|
+
/ `bulk_match_to_hero` push a whole-grade artifact across clips; `dry_run`
|
|
37
|
+
passes through. `source_media_guard.py` refuses shell commands that write,
|
|
38
|
+
move, or delete source media outside a scratch root — paths are normalized and
|
|
39
|
+
matched by whole path component, and a derivative-output directory
|
|
40
|
+
(`proxies`/`renders`/`exports`) exempts a *write* but never a delete or a
|
|
41
|
+
move, so a camera card with an `exports` folder is still a camera card. Its
|
|
42
|
+
docstring states what it cannot catch — extension-less directory deletes,
|
|
43
|
+
`find -delete`, `xargs rm`, and scripts that write media themselves — because
|
|
44
|
+
it is a tripwire for the common direct mistake, not a sandbox.
|
|
45
|
+
- **Two review subagents** in `.claude/agents/`, run in their own context so
|
|
46
|
+
frame images stay out of the main session. `cut-reviewer` screens an assembled
|
|
47
|
+
timeline from its frames and is told explicitly that a metadata summary is not
|
|
48
|
+
a review, because assembling through an API succeeds loudly and fails quietly.
|
|
49
|
+
`grade-match-verifier` measures shot match numerically against the project's
|
|
50
|
+
R−B tolerance and must report the pixel count behind every masked
|
|
51
|
+
measurement — a near-empty skin mask returns a delta near zero and reads as a
|
|
52
|
+
perfect match.
|
|
53
|
+
- **Two skills outside the domain routing.** `house-style` accumulates editorial
|
|
54
|
+
corrections so the same note is not given twice, and `/resolve-session`
|
|
55
|
+
reports connection, edition, project, timeline, and media-pool state before
|
|
56
|
+
editing begins.
|
|
57
|
+
|
|
58
|
+
### Validation
|
|
59
|
+
|
|
60
|
+
- Full offline suite: 2460 passed, 1 skipped — level with the v2.80.1 baseline,
|
|
61
|
+
as expected for a change that touches no runtime code.
|
|
62
|
+
- Both guard scripts exercised against a 26-case matrix covering deny, ask, and
|
|
63
|
+
silent-allow: `ffprobe` reads, `ffmpeg` into scratch, `ffmpeg` overwriting a
|
|
64
|
+
card, chained `ffprobe && rm`, redirection onto a media file, glob `rm`,
|
|
65
|
+
quoted paths, writes into `renders`/`proxies`/`exports`, deletes out of those
|
|
66
|
+
same directories, `..` traversal, and ordinary repo commands (`git status`,
|
|
67
|
+
the test runner, `npm run build`).
|
|
68
|
+
- No live Resolve validation: no behavior changed.
|
|
69
|
+
|
|
5
70
|
## What's New in v2.80.1
|
|
6
71
|
|
|
7
72
|
A correction to the retime measurement contract published in v2.80.0, and a fix
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DaVinci Resolve MCP Server
|
|
2
2
|
|
|
3
|
-
[](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
|
|
4
4
|
[](https://www.npmjs.com/package/davinci-resolve-mcp)
|
|
5
5
|
[](docs/reference/api-coverage.md)
|
|
6
6
|
[-blue.svg)](#server-modes)
|
package/docs/README.md
CHANGED
|
@@ -47,19 +47,88 @@ Per-domain skills in `.claude/skills/` route craft ↔ live tools ↔ offline
|
|
|
47
47
|
advanced tools automatically when an agent works in that domain. They are thin
|
|
48
48
|
bridges — the authoritative depth stays in the kernels and guides above.
|
|
49
49
|
|
|
50
|
-
- `resolve-mcp` (`.claude/skills/resolve.md`) — orientation/index: the map to the domain skills below (self-trigger; not an auto-loader)
|
|
51
|
-
- `resolve-color` (`.claude/skills/color
|
|
52
|
-
- `resolve-edit` (`.claude/skills/
|
|
53
|
-
- `resolve-conform` (`.claude/skills/conform.md`) — conform, relink, finishing QC, grade tracing
|
|
54
|
-
- `resolve-delivery` (`.claude/skills/delivery.md`) — render, deliverable QC, media/provenance
|
|
55
|
-
- `resolve-fusion` (`.claude/skills/fusion.md`) — Fusion comps (titles, motion graphics, VFX)
|
|
56
|
-
- `resolve-audio` (`.claude/skills/audio.md`) — audio/Fairlight tracks, buses, loudness, sync
|
|
57
|
-
- `resolve-media-pool` (`.claude/skills/media-pool.md`) — media pool ingest, organize, multicam
|
|
58
|
-
- `resolve-media-analysis` (`.claude/skills/media-analysis.md`) — source-safe media intelligence
|
|
50
|
+
- `resolve-mcp` (`.claude/skills/resolve-mcp/SKILL.md`) — orientation/index: the map to the domain skills below (self-trigger; not an auto-loader)
|
|
51
|
+
- `resolve-color` (`.claude/skills/resolve-color/SKILL.md`) — grading, looks, shot match, LUT/CDL/DRX
|
|
52
|
+
- `resolve-edit` (`.claude/skills/resolve-edit/SKILL.md`) — cutting, ranges, variants, changelist
|
|
53
|
+
- `resolve-conform` (`.claude/skills/resolve-conform/SKILL.md`) — conform, relink, finishing QC, grade tracing
|
|
54
|
+
- `resolve-delivery` (`.claude/skills/resolve-delivery/SKILL.md`) — render, deliverable QC, media/provenance
|
|
55
|
+
- `resolve-fusion` (`.claude/skills/resolve-fusion/SKILL.md`) — Fusion comps (titles, motion graphics, VFX)
|
|
56
|
+
- `resolve-audio` (`.claude/skills/resolve-audio/SKILL.md`) — audio/Fairlight tracks, buses, loudness, sync
|
|
57
|
+
- `resolve-media-pool` (`.claude/skills/resolve-media-pool/SKILL.md`) — media pool ingest, organize, multicam
|
|
58
|
+
- `resolve-media-analysis` (`.claude/skills/resolve-media-analysis/SKILL.md`) — source-safe media intelligence
|
|
59
|
+
|
|
60
|
+
Each skill is a directory containing `SKILL.md`. Claude Code does not discover
|
|
61
|
+
loose `.md` files in `.claude/skills/`; a skill placed at the top level of that
|
|
62
|
+
directory silently never loads.
|
|
63
|
+
|
|
64
|
+
Two skills sit outside the domain routing:
|
|
65
|
+
|
|
66
|
+
- `house-style` (`.claude/skills/house-style/SKILL.md`) — accumulated editorial
|
|
67
|
+
corrections, so the same note is not given twice. Claude-only; append to it
|
|
68
|
+
when an editorial decision is corrected.
|
|
69
|
+
- `resolve-session` (`.claude/skills/resolve-session/SKILL.md`) — `/resolve-session`
|
|
70
|
+
connects, confirms edition and bridge, and reports project/timeline/pool state.
|
|
59
71
|
|
|
60
72
|
The offline half of every one is the advanced server; see
|
|
61
73
|
[Advanced Server](../resolve-advanced/README.md).
|
|
62
74
|
|
|
75
|
+
## Claude Code Hooks and Subagents
|
|
76
|
+
|
|
77
|
+
Two `PreToolUse` guards enforce rules `AGENTS.md` states in prose. They ship as
|
|
78
|
+
scripts but are **not** wired up by default — the repository does not enable
|
|
79
|
+
hooks on your behalf. Opt in by adding the block below to your own
|
|
80
|
+
`.claude/settings.local.json` (gitignored, so it stays yours):
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"hooks": {
|
|
85
|
+
"PreToolUse": [
|
|
86
|
+
{
|
|
87
|
+
"matcher": "mcp__davinci-resolve__(timeline_item_color|color_group)",
|
|
88
|
+
"hooks": [
|
|
89
|
+
{
|
|
90
|
+
"type": "command",
|
|
91
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/frame_verification_guard.py",
|
|
92
|
+
"timeout": 15
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"matcher": "Bash",
|
|
98
|
+
"hooks": [
|
|
99
|
+
{
|
|
100
|
+
"type": "command",
|
|
101
|
+
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/source_media_guard.py",
|
|
102
|
+
"timeout": 15
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Hooks are read at session start, so restart Claude Code after adding them. The
|
|
112
|
+
two guards are:
|
|
113
|
+
|
|
114
|
+
- `.claude/hooks/frame_verification_guard.py` — denies grade-applying actions on
|
|
115
|
+
`timeline_item_color` until the session has actually looked at a
|
|
116
|
+
Resolve-rendered frame, and asks before whole-grade artifacts
|
|
117
|
+
(`safe_copy_grade`, `bulk_match_to_hero`) overwrite hand-work. `dry_run`
|
|
118
|
+
passes through untouched.
|
|
119
|
+
- `.claude/hooks/source_media_guard.py` — denies shell commands that write,
|
|
120
|
+
move, or delete source media outside a scratch root. Reads (`ffprobe`, and
|
|
121
|
+
`ffmpeg` writing into scratch) pass.
|
|
122
|
+
|
|
123
|
+
Two review subagents in `.claude/agents/` run in their own context so frame
|
|
124
|
+
images stay out of the main session:
|
|
125
|
+
|
|
126
|
+
- `cut-reviewer` — screens an assembled timeline from its frames and reports on
|
|
127
|
+
pacing, shot order, continuity, and coverage gaps.
|
|
128
|
+
- `grade-match-verifier` — measures shot match numerically from rendered frames
|
|
129
|
+
against the project's R−B tolerance, and reports mask pixel counts so an empty
|
|
130
|
+
skin mask cannot pass as a match.
|
|
131
|
+
|
|
63
132
|
## Authoring References
|
|
64
133
|
|
|
65
134
|
- [Fuse + DCTL Authoring](authoring/fuse-dctl-authoring.md)
|
|
@@ -88,7 +88,7 @@ patches audio **offline, no Resolve running**:
|
|
|
88
88
|
|
|
89
89
|
Rule of thumb: plan/measure offline, apply mix/track changes live; use
|
|
90
90
|
`fairlight` for bus work the scripting API can't reach. See the `resolve-audio`
|
|
91
|
-
skill (`.claude/skills/audio.md`) and the `/audio_workflow` prompt.
|
|
91
|
+
skill (`.claude/skills/resolve-audio/SKILL.md`) and the `/audio_workflow` prompt.
|
|
92
92
|
|
|
93
93
|
## Live Probe
|
|
94
94
|
|
|
@@ -134,7 +134,7 @@ Cross-server rules an agent must know:
|
|
|
134
134
|
- **Deps.** The grading catalog needs `sharp`; call the advanced `capabilities`
|
|
135
135
|
tool for live status and install hints.
|
|
136
136
|
|
|
137
|
-
See the `resolve-color` skill (`.claude/skills/color
|
|
137
|
+
See the `resolve-color` skill (`.claude/skills/resolve-color/SKILL.md`) for the
|
|
138
138
|
craft ↔ live ↔ offline routing and the frame-first rule.
|
|
139
139
|
|
|
140
140
|
## Live Probe
|
|
@@ -119,7 +119,7 @@ running**, via the `fusion` tool:
|
|
|
119
119
|
Rule of thumb: author and verify the comp offline, then apply it live with
|
|
120
120
|
`fusion_comp` `safe_add_tool` → `safe_set_inputs` → `safe_connect_tools` (the
|
|
121
121
|
`to_api_calls` output maps directly onto those). See the `resolve-fusion` skill
|
|
122
|
-
(`.claude/skills/fusion.md`) and the `/fusion_workflow` prompt.
|
|
122
|
+
(`.claude/skills/resolve-fusion/SKILL.md`) and the `/fusion_workflow` prompt.
|
|
123
123
|
|
|
124
124
|
## Live Probe
|
|
125
125
|
|
|
@@ -137,7 +137,7 @@ actions):
|
|
|
137
137
|
Rule of thumb: verify and inventory the card offline *before* importing, then
|
|
138
138
|
import/organize live. `media` also serves the delivery side (see the
|
|
139
139
|
`resolve-delivery` skill). See the `resolve-media-pool` skill
|
|
140
|
-
(`.claude/skills/media-pool.md`) and the `/media_pool_workflow` prompt. Never
|
|
140
|
+
(`.claude/skills/resolve-media-pool/SKILL.md`) and the `/media_pool_workflow` prompt. Never
|
|
141
141
|
rename or derive camera originals without explicit approval.
|
|
142
142
|
|
|
143
143
|
## Live Evidence
|
|
@@ -135,7 +135,7 @@ Rules an agent must know:
|
|
|
135
135
|
- **Deps.** `deliverable`/`media` QC needs **ffmpeg + ffprobe on PATH** (GPL, not
|
|
136
136
|
bundled) — call the advanced `capabilities` tool for status + install hints.
|
|
137
137
|
|
|
138
|
-
See the `resolve-delivery` skill (`.claude/skills/delivery.md`) for the
|
|
138
|
+
See the `resolve-delivery` skill (`.claude/skills/resolve-delivery/SKILL.md`) for the
|
|
139
139
|
craft ↔ live ↔ offline routing.
|
|
140
140
|
|
|
141
141
|
## Live Evidence
|
|
@@ -121,7 +121,7 @@ Gotchas the live path shares:
|
|
|
121
121
|
- **Deps.** `better-sqlite3` gates lineage/reverse/DB; `sharp`/ffmpeg gate frame
|
|
122
122
|
compare — call the advanced `capabilities` tool.
|
|
123
123
|
|
|
124
|
-
See the `resolve-conform` skill (`.claude/skills/conform.md`) for the
|
|
124
|
+
See the `resolve-conform` skill (`.claude/skills/resolve-conform/SKILL.md`) for the
|
|
125
125
|
craft ↔ live ↔ offline routing.
|
|
126
126
|
|
|
127
127
|
## Live Probe
|
|
@@ -196,7 +196,7 @@ Use these to answer "what changed between v3 and v4" or to hand a conform an
|
|
|
196
196
|
accurate change list without opening either timeline. For conforming/relinking
|
|
197
197
|
that change list, see the Timeline Conform / Interchange kernel and the
|
|
198
198
|
`resolve-conform` skill; for the edit ↔ offline routing, see the `resolve-edit`
|
|
199
|
-
skill (`.claude/skills/
|
|
199
|
+
skill (`.claude/skills/resolve-edit/SKILL.md`).
|
|
200
200
|
|
|
201
201
|
## Development Guardrails
|
|
202
202
|
|
package/install.py
CHANGED
|
@@ -36,7 +36,7 @@ from src.utils.update_check import (
|
|
|
36
36
|
|
|
37
37
|
# ─── Version ──────────────────────────────────────────────────────────────────
|
|
38
38
|
|
|
39
|
-
VERSION = "2.80.
|
|
39
|
+
VERSION = "2.80.2"
|
|
40
40
|
# Only hard floor: mcp[cli] requires Python 3.10+. There is no upper bound —
|
|
41
41
|
# Resolve's scripting bridge loads into newer interpreters on recent builds
|
|
42
42
|
# (Python 3.14 verified against Resolve Studio 20.3.2). Older Resolve builds
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@ cannot drift.
|
|
|
24
24
|
| Platform | File(s) | Trigger | Source |
|
|
25
25
|
|---|---|---|---|
|
|
26
26
|
| Codex / OpenCode / Zed / others | `AGENTS.md` (`## Domain Routing` block) | always-on | generated block |
|
|
27
|
-
| Claude Code | `.claude/skills
|
|
27
|
+
| Claude Code | `.claude/skills/<name>/SKILL.md` | semantic (description) | hand-authored (rich) |
|
|
28
28
|
| Cursor | `.cursor/rules/*.mdc` | `alwaysApply` repo rule + per-domain `description` (agent-requested) | generated |
|
|
29
29
|
| VS Code / Copilot | `.github/copilot-instructions.md` + `.github/instructions/*.instructions.md` | always-on + `applyTo` | generated |
|
|
30
30
|
| Windsurf | `.windsurf/rules/*.md` + `.windsurfrules` | rules dir + legacy flat | generated |
|
|
@@ -33,7 +33,10 @@ cannot drift.
|
|
|
33
33
|
| Continue | `.continue/rules/resolve-mcp.md` | always-on | generated |
|
|
34
34
|
| Claude Desktop | — (chat client, no repo rules) | — | MCP prompts only |
|
|
35
35
|
|
|
36
|
-
`.claude/skills/*` stays hand-authored (Claude's rich semantic skills)
|
|
36
|
+
`.claude/skills/*` stays hand-authored (Claude's rich semantic skills). Each
|
|
37
|
+
one is a **directory** holding a `SKILL.md` named for its frontmatter `name`;
|
|
38
|
+
a loose `.md` at the top level of `.claude/skills/` is never discovered and
|
|
39
|
+
fails silently. Every
|
|
37
40
|
other file is generated. `AGENTS.md` remains the universal backstop for any
|
|
38
41
|
client not listed. Always-on rule dirs (Cline/Roo/Continue) get one compact
|
|
39
42
|
combined file (repo hygiene + domain table), since they load every rule file
|
|
@@ -61,8 +64,8 @@ node scripts/agent-rules/generate.mjs --check # exit 1 if anything is stale (C
|
|
|
61
64
|
## Adding a domain or a platform
|
|
62
65
|
|
|
63
66
|
- **New domain:** add an entry to `DOMAINS` in `generate.mjs`, add a matching
|
|
64
|
-
`@mcp.prompt` in `src/server.py`, and (optionally) a rich
|
|
65
|
-
Regenerate.
|
|
67
|
+
`@mcp.prompt` in `src/server.py`, and (optionally) a rich
|
|
68
|
+
`.claude/skills/<name>/SKILL.md`. Regenerate.
|
|
66
69
|
- **New platform:** add an `emit(...)` for its convention in `generate.mjs`,
|
|
67
70
|
reusing `domainBody(d)` / `repoHygiene`. Regenerate. Do not hand-edit generated
|
|
68
71
|
files — the drift guard will fail.
|
package/src/granular/common.py
CHANGED
|
@@ -85,7 +85,7 @@ if not logging.getLogger().handlers:
|
|
|
85
85
|
handlers=[logging.StreamHandler()],
|
|
86
86
|
)
|
|
87
87
|
|
|
88
|
-
VERSION = "2.80.
|
|
88
|
+
VERSION = "2.80.2"
|
|
89
89
|
logger = logging.getLogger("davinci-resolve-mcp")
|
|
90
90
|
logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
|
|
91
91
|
logger.info(f"Detected platform: {get_platform()}")
|