## v2.23.0

v2.23.0 adds the first npm installer, a local control panel, durable
media-analysis jobs, and a searchable SQLite analysis index while keeping the
existing Python installer as the source of truth.

### Added

- Added the `davinci-resolve-mcp` npm package and CLI:
  `setup`, `doctor`, `server`, `control-panel`, `--help`, and `--version`.
- Added managed per-user npm installs that copy packaged source into a stable
  application-data directory before running `install.py`.
- Added the local single-user control panel for Resolve/server status,
  source-safe media-analysis jobs, analysis search, and preferences.
- Added durable media-analysis job actions:
  `start_batch_job`, `run_batch_job_slice`, `batch_job_status`,
  `list_batch_jobs`, `cancel_batch_job`, and `resume_batch_job`.
- Added analysis index actions:
  `build_index`, `index_status`, and `query_index`.
- Added npm package-content filtering and a GitHub Actions npm publish workflow
  using OIDC/provenance.

### Changed

- Bumped version surfaces to `2.23.0`.
- Updated the README quick start to `npx davinci-resolve-mcp setup`.
- Tightened installer Python validation to require Python 3.10-3.12, matching
  the documented Resolve scripting compatibility range.
- Updated release validation to include npm CLI smoke tests and
  `npm pack --dry-run`.
- Made the npm publish workflow skip publishing when the package version already
  exists, so a first manual npm registration can coexist with tag automation.

### Validation

- `venv/bin/python tests/test_import.py`
- `venv/bin/python scripts/audit_api_parity.py`
- `venv/bin/python -m unittest tests.test_media_analysis tests.test_update_check tests.test_media_pool_ingest_probe`
- `npm run smoke`
- `DAVINCI_RESOLVE_MCP_INSTALL_ROOT=/private/tmp/davinci-resolve-mcp-npm-smoke node bin/davinci-resolve-mcp.mjs setup --dry-run --no-venv --clients manual --update-policy never`
- `node bin/davinci-resolve-mcp.mjs doctor --update-policy never`
- `npm pack --dry-run`
- `git diff --check`

### Notes

- The npm package is npm-only for v1; PyPI remains deferred because
  `davinci-resolve-mcp` is already owned by another PyPI project.
- Analysis job and index artifacts remain under the configured
  `davinci-resolve-mcp-analysis` project root and do not store sampled image
  bytes in SQLite.
