This release is a pre-release and may not be stable for production use.
resolvescript
The only resolve scripting framework out there.
Overview
Build, test, package and install DaVinci Resolve Python scripts and plugins: a small CLI with an npm-style workflow for the Resolve Scripts/ tree.
createscaffolds a project with amanifest.jsonand smoke testsdev/testrun against a mockDaVinciResolveScriptAPI - no Resolve neededbuildconsolidates the multi-file package into a single.pyfor distributionadd/install/updateresolve dependencies from GitHub, URLs, archives or local folders and record them inresolvescript.jsonpackageemitsdist/<name>-<version>.tar.gzplusSHA256SUMS.txt
Install with pip: pip install resolvescript (Python 3.12+).
| Aspect | Specification |
|---|---|
| Current version | v0.1.4-alpha |
| Resolve support | DaVinci Resolve Free & Studio 18+ |
| License | MIT |
Quickstart
$ resolvescript create my-cool-tool
$ cd my-cool-tool
$ resolvescript dev # sandboxed dev loop against the mock API
$ resolvescript test # run the smoke tests
$ resolvescript build # single-file build -> dist/my_cool_tool.py
$ resolvescript analyze # static checks (imports, manifest, API usage)
$ resolvescript package # dist/my-cool-tool-0.1.0.tar.gz + SHA256SUMS.txt
# elsewhere, consume it:
$ resolvescript add github:example/my-cool-tool
$ resolvescript install # materialize all recorded deps into Resolve
Authoring
Directory
my-cool-tool/
manifest.json # project manifest (or manifest.xml)
my_cool_tool/ # your Python package (module name from manifest.name/python)
__init__.py
export.py
tests/
test_smoke.py
Commands
| Command | Purpose |
|---|---|
create <name> |
Scaffold a new project (--json/--xml, --template minimal|toolkit, --dir) |
dev |
Sandboxed dev loop / REPL against the mock Resolve API (--built for the consolidated file, --repl, --editor) |
test |
Run the project's pytest suite against the mock API (--built, -k pattern, --api-coverage) |
analyze |
Static checks: missing entrypoint/module, syntax, unused imports, unmocked API methods, attribute typing (--json) |
build |
Consolidate into a single file (--output, or the manifest consolidate.output) |
package |
Assemble dist/<name>-<version>.tar.gz + SHA256SUMS.txt (--dist DIR) |
add <spec> |
Resolve, install a dependency and record it (--no-save, --target, --scripts-root) |
install [<spec>] |
One-off install, local project, or materialize recorded deps (--locked, --dry-run) |
update [<name>] |
Re-resolve recorded deps within their ranges (--precise X.Y.Z, --fix) |
remove <name> |
Uninstall and unrecord (--no-save) |
search <query> |
Search the known sources table |
manage list|remove |
Low-level registry operations (--json, --all) |
Exit codes: 0 ok, 1 error, 2 usage.
Specifiers
add / install <spec> accept:
name- a name from the built-in known-sources table (resolvescript search)owner/repoorgithub:owner/repo[#ref]- GitHub repo (ref = branch/tag/commit, or#semver:^1.2for a range)https://...tar.gz/.zip- direct archive URLhttps://...- a URL whose root carries amanifest.json(GitHub Pages-style hosting)file:path,./dir, an absolute path - local directory or archive.tar.gz/.zipfiles and local directories
Recorded specs live in resolvescript.json; use resolvescript install --locked for a CI/npm-ci style check that recorded artifacts still satisfy the recorded ranges.
Manifest reference
manifest.json (or manifest.xml, same shape):
{
"name": "my-cool-tool", // required
"version": "0.1.0", // required, semver
"author": "You",
"description": "...",
"python": "my_cool_tool", // package/module name (defaults to "name")
"entrypoint": "export.py", // recommended CLI/bootstrap module
"kind": "script", // "script" (default) | "extension" (plugin)
"targets": ["Comp"], // Scripts subfolders: Comp, Utility, Tool, Render,
// Deliver, Edit, WorkflowIntegrations, Fusion, root
"compat": { "resolve": "18.6.4", "python": "3.12" },
"release": { "owner": "you", "repo": "my-cool-tool" }, // for `add` discovery
"scripts_root": "", // per-OS override for the Resolve Scripts root
"consolidate": { "enabled": true, "output": "dist/my_tool.py", "exclude": [], "no_comment": [] },
"install": { "as_directory": true, "include": [], "exclude": [], "to": "resolve" },
"dependencies": ["github:example/dep"] // resolved on install
}
Install model
Installs drop into each OS's Resolve Scripts root under the manifest targets. Directories install as a single folder; .py-only packages can opt into install.as_directory: false multi-file installs. Every install is recorded in <ScriptsRoot>/.resolvescript/install.json (schema v1):
- keys are
<name>:<target>(directory) or<name>:<target>:<relpath>(file-based) - each entry carries
version,targets,as_directory,files,source,resolvedandintegrity install --lockedverifies registry entries against recorded specs before reusing them
--scripts-root (or RESOLVESCRIPT_SCRIPTS_ROOT) overrides OS detection.
Frameworks
resolvescript ships a mock DaVinciResolveScript module with a faithful-enough Resolve color/editing/page object model for testing, plus resolvescript test --api-coverage to report which mock methods your tests actually exercise.
Library API
ResolveScript is a first-class Python package — import it in any script:
import ResolveScript as rs
# scaffold a new project
root, written = rs.scaffold_project("my_tool", destination=".")
# static analysis
issues = rs.analyze_project(root)
# load & validate manifest
manifest = rs.load_manifest(root / "manifest.json")
rs.validate_manifest_or_throw(manifest)
# consolidate to a single file
cfg = rs.config_from_manifest(root, manifest)
result = rs.consolidate(cfg)
print(rs.summarize(result, cfg))
# package a release artifact
pkg = rs.package_project(root)
print(pkg.archive)
Every name exported at the package root is also available from its owning submodule, e.g. rs.consolidate mirrors ResolveScript.consolidate.consolidate. The major subpackages are:
ResolveScript.manifest— model, loaders, validatorsResolveScript.sandbox— mock Resolve API, smoke runs, REPLResolveScript.sources— archive/GitHub/known-source helpersResolveScript.install— install, registry, target resolution
Version: rs.get_version() returns the installed version string.
Development
python -m venv .venv
.\.venv\Scripts\activate # Windows; source .venv/bin/activate elsewhere
pip install -e ".[dev]"
pytest
ruff check .
Milestones and the full plan live in TODO.md. CI runs the shared OseMine/workflows action; cutting a vX.Y.Z tag runs the release pipeline (sdist+wheel, checksums, GitHub release, optional PyPI publishing).
Metadata
Release files for resolvescript 0.1.4a0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| resolvescript-0.1.4a0.tar.gz | 82.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| resolvescript-0.1.4a0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 159.4 kB
Release files / resolvescript-0.1.4a0.tar.gz
| Download URL | resolvescript-0.1.4a0.tar.gz |
|---|---|
| Size | 82.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9c9225b9554f318f867e02d91a2a43d222447984d4145a94bd6580073bee3c58
|
|
BLAKE2b-256 checksum How to use checksums |
351dd1f3f0153d25087e49b190b922e965c19b90fb7a54ec92c6aa4c7865fb0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / resolvescript-0.1.4a0-py3-none-any.whl
| Download URL | resolvescript-0.1.4a0-py3-none-any.whl |
|---|---|
| Size | 76.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
63e99cbcd188666158bf03b0239d1a1718d738998b2b60593751ceb38a0afe07
|
|
BLAKE2b-256 checksum How to use checksums |
6c475e37188780f88e56ff30146428c5f0539c4d81d73d602ed751038154d370
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|