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 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
- [![Version](https://img.shields.io/badge/version-2.80.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.80.2-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
4
4
  [![npm](https://img.shields.io/npm/v/davinci-resolve-mcp.svg?label=npm&color=CB3837)](https://www.npmjs.com/package/davinci-resolve-mcp)
5
5
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
6
6
  [![Tools](https://img.shields.io/badge/MCP%20Tools-34%20(341%20full)-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-grade.md`) — grading, looks, shot match, LUT/CDL/DRX
52
- - `resolve-edit` (`.claude/skills/timeline-edit.md`) — cutting, ranges, variants, changelist
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-grade.md`) for the
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/timeline-edit.md`).
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.1"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.80.1",
3
+ "version": "2.80.2",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -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/*.md` | semantic (description) | hand-authored (rich) |
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); every
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 `.claude/skills/*.md`.
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.
@@ -85,7 +85,7 @@ if not logging.getLogger().handlers:
85
85
  handlers=[logging.StreamHandler()],
86
86
  )
87
87
 
88
- VERSION = "2.80.1"
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()}")
package/src/server.py CHANGED
@@ -11,7 +11,7 @@ Usage:
11
11
  python src/server.py --full # Start the 341-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.80.1"
14
+ VERSION = "2.80.2"
15
15
 
16
16
  import base64
17
17
  import os