davinci-resolve-mcp 2.23.0 → 2.23.1

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,24 @@
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.23.1
6
+
7
+ **Control panel navigation fixes** — The local browser control panel now keeps
8
+ top-level dropdown buttons from navigating by themselves. Analysis,
9
+ Diagnostics, Docs, and Preferences open their menus first; selecting a menu item
10
+ is what changes the active view.
11
+
12
+ **Project dropdown cleanup** — The project context dropdown is back to showing
13
+ only the open/current project context plus a bottom `View All Projects` option.
14
+ The full database browser stays in the Projects view, and the standalone
15
+ Projects navbar button has been removed.
16
+
17
+ **Validation**: static import checks, API parity audit, focused dashboard unit
18
+ tests, npm CLI smoke tests, package dry-run, and `git diff --check` passed. A
19
+ local dashboard smoke check verified the served HTML on `127.0.0.1:8765`.
20
+ No Resolve scripting behavior changed; live Resolve mutation validation was not
21
+ required.
22
+
5
23
  ## What's New in v2.23.0
6
24
 
7
25
  **npm installer** — `npx davinci-resolve-mcp setup` is now the primary quick
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.23.0-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
3
+ [![Version](https://img.shields.io/badge/version-2.23.1-blue.svg)](https://github.com/samuelgursky/davinci-resolve-mcp/releases)
4
4
  [![API Coverage](https://img.shields.io/badge/API%20Coverage-100%25-brightgreen.svg)](docs/reference/api-coverage.md)
5
5
  [![Tools](https://img.shields.io/badge/MCP%20Tools-32%20(329%20full)-blue.svg)](#server-modes)
6
6
  [![Tested](https://img.shields.io/badge/Live%20Tested-98.5%25-green.svg)](docs/reference/api-coverage.md#test-results)
package/install.py CHANGED
@@ -34,7 +34,7 @@ from src.utils.update_check import (
34
34
 
35
35
  # ─── Version ──────────────────────────────────────────────────────────────────
36
36
 
37
- VERSION = "2.23.0"
37
+ VERSION = "2.23.1"
38
38
  SUPPORTED_PYTHON_MIN = (3, 10)
39
39
  SUPPORTED_PYTHON_MAX = (3, 12)
40
40
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "davinci-resolve-mcp",
3
- "version": "2.23.0",
3
+ "version": "2.23.1",
4
4
  "description": "NPM bootstrapper for the DaVinci Resolve MCP Server.",
5
5
  "license": "MIT",
6
6
  "author": "Samuel Gursky <samgursky@gmail.com>",
@@ -1533,7 +1533,6 @@ HTML = r"""<!doctype html>
1533
1533
  <button class="nav-dropdown-item" data-panel-target="diagnostics" data-subpage-target="tools" role="menuitem"><span class="nav-dropdown-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l2.1-2.1a6 6 0 0 1-7.6 7.6l-4 4a2.1 2.1 0 0 1-3-3l4-4a6 6 0 0 1 7.6-7.6z"></path></svg></span>Tools</button>
1534
1534
  </div>
1535
1535
  </div>
1536
- <button class="control-tab" data-panel-target="projects">Projects</button>
1537
1536
  <div class="control-nav-item">
1538
1537
  <button class="control-tab has-menu" data-panel-target="docs">Docs <span class="tab-chevron" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg></span></button>
1539
1538
  <div class="nav-dropdown" role="menu" aria-label="Documentation pages">
@@ -1630,7 +1629,7 @@ HTML = r"""<!doctype html>
1630
1629
  <div class="metric-card">
1631
1630
  <span>Open Projects</span>
1632
1631
  <b id="projectsOpenCount">0</b>
1633
- <small>Shown in the navbar dropdown</small>
1632
+ <small>Shown in the project dropdown</small>
1634
1633
  </div>
1635
1634
  <div class="metric-card">
1636
1635
  <span>Database Projects</span>
@@ -2090,6 +2089,7 @@ HTML = r"""<!doctype html>
2090
2089
  },
2091
2090
  };
2092
2091
  const $ = (id) => document.getElementById(id);
2092
+ const VIEW_ALL_PROJECTS_VALUE = '__view_all_projects__';
2093
2093
  const PANEL_LABELS = {
2094
2094
  overview: 'Overview',
2095
2095
  analysis: 'Analysis',
@@ -2701,18 +2701,21 @@ HTML = r"""<!doctype html>
2701
2701
  const contexts = (state.projects?.contexts || [])
2702
2702
  .filter(context => context.active || context.resolve_current);
2703
2703
  const activeRoot = state.activeContext?.project_root;
2704
- if (!contexts.length) {
2705
- select.innerHTML = '<option value="">No open Resolve project</option>';
2706
- select.disabled = true;
2707
- return;
2708
- }
2709
- select.innerHTML = contexts.map(context => {
2704
+ const options = contexts.map(context => {
2710
2705
  const label = context.project_name || 'Project';
2711
2706
  const selected = context.project_root === activeRoot ? ' selected' : '';
2712
- const disabled = context.project_root === activeRoot ? ' disabled' : '';
2707
+ const disabled = context.can_load_resolve === false ? ' disabled' : '';
2713
2708
  return `<option value="${escapeAttribute(context.project_root)}"${selected}${disabled}>${escapeHtml(label)}</option>`;
2714
- }).join('');
2715
- select.disabled = contexts.length <= 1;
2709
+ });
2710
+ options.push(`<option value="${VIEW_ALL_PROJECTS_VALUE}">View All Projects</option>`);
2711
+ if (!contexts.length) {
2712
+ options.unshift('<option value="" selected disabled>No open Resolve project</option>');
2713
+ select.innerHTML = options.join('');
2714
+ select.disabled = false;
2715
+ return;
2716
+ }
2717
+ select.innerHTML = options.join('');
2718
+ select.disabled = false;
2716
2719
  }
2717
2720
 
2718
2721
  function renderProjects() {
@@ -2788,7 +2791,9 @@ HTML = r"""<!doctype html>
2788
2791
  function restoreProjectContextSelect() {
2789
2792
  const select = $('projectContextSelect');
2790
2793
  const currentRoot = state.activeContext?.project_root;
2791
- if (select && currentRoot) select.value = currentRoot;
2794
+ if (!select) return;
2795
+ select.value = currentRoot || '';
2796
+ if (select.value !== (currentRoot || '')) select.selectedIndex = 0;
2792
2797
  }
2793
2798
 
2794
2799
  function projectSwitchDialog(currentName, nextName) {
@@ -3767,7 +3772,6 @@ HTML = r"""<!doctype html>
3767
3772
  control.addEventListener('click', (event) => {
3768
3773
  if (control.classList.contains('has-menu')) {
3769
3774
  event.stopPropagation();
3770
- setPanel(control.dataset.panelTarget, { subpage: control.dataset.subpageTarget });
3771
3775
  toggleNavDropdown(control);
3772
3776
  return;
3773
3777
  }
@@ -3784,7 +3788,17 @@ HTML = r"""<!doctype html>
3784
3788
  $('overviewRefresh').onclick = () => refreshAll().catch(alertError);
3785
3789
  $('projectsRefresh').onclick = () => refreshAllProjects().catch(alertError);
3786
3790
  $('projectFilterText').addEventListener('input', renderProjects);
3787
- $('projectContextSelect').addEventListener('change', event => switchProjectContext(event.target.value).catch(alertError));
3791
+ $('projectContextSelect').addEventListener('change', event => {
3792
+ if (event.target.value === VIEW_ALL_PROJECTS_VALUE) {
3793
+ setPanel('projects');
3794
+ restoreProjectContextSelect();
3795
+ return;
3796
+ }
3797
+ switchProjectContext(event.target.value).catch(error => {
3798
+ restoreProjectContextSelect();
3799
+ alertError(error);
3800
+ });
3801
+ });
3788
3802
  $('sampleFrameMode').addEventListener('change', () => {
3789
3803
  $('customFramesLabel').style.display = $('sampleFrameMode').value === 'custom' ? 'grid' : 'none';
3790
3804
  });
@@ -80,7 +80,7 @@ if not logging.getLogger().handlers:
80
80
  handlers=[logging.StreamHandler()],
81
81
  )
82
82
 
83
- VERSION = "2.23.0"
83
+ VERSION = "2.23.1"
84
84
  logger = logging.getLogger("davinci-resolve-mcp")
85
85
  logger.info(f"Starting DaVinci Resolve MCP Server v{VERSION}")
86
86
  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 329-tool granular server instead
12
12
  """
13
13
 
14
- VERSION = "2.23.0"
14
+ VERSION = "2.23.1"
15
15
 
16
16
  import base64
17
17
  import os