For users who want to try an unreleased feature, contribute to darnit, or run a specific commit/branch before it ships through one of the published channels (PyPI, container, Homebrew, binary, Claude Code plugin).
There are two routes: install straight from the git URL with uv tool install (no clone), or clone the repository and work in the checkout.
uv tool install --python 3.12 git+https://github.com/darnitdevorg/darnit
darnit --version
darnit list # openssf-baseline (66 controls), gittuf, reproducibilityThis installs the workspace root, the darnit-mcp package. It provides the darnit command and pulls in every workspace plugin. The package is darnit-mcp, but the command is darnit; there is no darnit-mcp command.
Pin a tag, branch or commit with @:
uv tool install --python 3.12 "git+https://github.com/darnitdevorg/darnit@<tag>"Tags up to and including v0.1.1 predate the root package's darnit command (#621), so uv tool install fails on them with "No executables are provided by package darnit-mcp". To run any tag without installing it, use uvx --from:
uvx --python 3.12 --from "git+https://github.com/darnitdevorg/darnit@<tag>" darnit audit /path/to/repo
uvx --python 3.12 --from "git+https://github.com/darnitdevorg/darnit@<tag>" darnit serve --framework openssf-baseline # MCP server# 1. Clone the canonical repository
git clone https://github.com/darnitdevorg/darnit ~/Projects/darnit
cd ~/Projects/darnit
# 2. Optionally switch to a specific feature branch
git checkout <branch-name>
# 3. Install the workspace and its development dependencies
uv sync
# 4. Run darnit from the checkout
uv run darnit list
uv run darnit serve # MCP server; OpenSSF Baseline by defaultThis is the contributor setup; see CONTRIBUTING.md.
To run darnit from anywhere while it runs your clone's code, install it as an editable uv tool:
uv tool install --python 3.12 \
--editable packages/darnit \
--with-editable packages/darnit-baseline \
--with-editable packages/darnit-gittuf \
--with-editable packages/darnit-reproducibility
darnit list # openssf-baseline (66 controls), gittuf, reproducibilityThe user-facing CLI lives in packages/darnit/ (the darnit-core package), but it discovers compliance implementations via Python entry points exposed by sibling packages:
packages/darnit/→ thedarnit-coreframework (CLI, sieve, MCP server)packages/darnit-baseline/→ the OpenSSF Baseline implementationpackages/darnit-gittuf/→ the gittuf pluginpackages/darnit-reproducibility/→ the reproducibility plugin
darnit-core does not depend on the plugins, so each --with-editable adds one to the same tool environment. Leave one out and darnit list does not show it.
Because the install is editable, switching branches in ~/Projects/darnit immediately changes what darnit runs — no reinstall needed:
cd ~/Projects/darnit
git checkout feature-branch
darnit --version # now runs the feature branch's codeThe only time you need to reinstall is when the workspace dependency set itself changes (e.g., a new sibling package gets added to packages/, or pinned versions in any pyproject.toml change).
darnit's workspace targets Python 3.11 and 3.12 (see requires-python in each pyproject.toml). Newer Python versions (3.13, 3.14) may work but are not yet covered by darnit's CI matrix, and tree-sitter-language-pack doesn't ship wheels for them at the time of writing (see #268). Pinning the tool venv to 3.12 avoids surprise build-from-source failures and matches what darnit's own CI runs against.
If your system default is 3.11 or 3.12 already, you can omit the flag.
darnit serve --framework openssf-baselineOr configure it as an MCP server in Claude Code:
# Recommended: use darnit's install command (writes ~/.claude.json).
# --from-source registers this checkout's darnit. Without it the entry runs
# the darnit-mcp release on PyPI through uvx, not this checkout.
darnit install --client claude-code --from-source
# Or register manually with the Claude Code CLI
claude mcp add --scope user darnit -- "$(which darnit)" serve --framework openssf-baseline--project writes the absolute path of this checkout's venv into the repository's .mcp.json, so it is not recommended with --from-source; see docs/SECURITY_GUIDE.md on project-scoped registration.
uv tool uninstall darnit-mcp # installed from the git URL (or from PyPI)
uv tool uninstall darnit-core # editable install from a cloneThe clone in ~/Projects/darnit stays on disk — remove it manually if you no longer want the source tree.
- Installation overview — decision tree for the published channels.
- PyPI install —
uv tool install darnit-mcpanduvx --from darnit-mcp darnit. - The maintainer release runbook — how releases get produced.