devr (pronounced dev-er, like “developer” without the “lop”) is a single command that runs your Python linting, formatting, type checks, tests, and coverage inside your project’s virtual environment.
Why devr?
- One setup command for new repos:
devr init - One gate command before commit/PR:
devr check - Works from your project venv, so tooling is isolated per repo
- Can install a local pre-commit hook that runs the same checks on staged files
Most Python projects have:
- ruff
- a formatter
- mypy or pyright
- pytest + coverage
- pre-commit
devr runs all of them together, correctly, inside your project’s virtualenv — with one command.
No guessing which Python is used.
No copying long command chains.
No drift between local and pre-commit.
Install
Recommended with pipx:
Or with pip:
Quick start
From the root of a Python project:
devr init will:
- Create or find a virtual environment.
- Install the default toolchain into that environment.
- Install your project dependencies (
pip install -e .whenpyproject.tomlexists). - Create
.pre-commit-config.yamlif it does not already exist. - Install the git pre-commit hook.
Commands
devr init [--python python3.12]devr check [--fix] [--staged --changed] [--fast] [--no-tests]devr fixdevr security [--fail-fast]devr doctorpython -m devr --version(module entrypoint smoke check)
Shell completion
devr currently ships with Typer shell completion disabled (add_completion=False).
This is intentional for now to keep startup behavior predictable in minimal
environments and avoid implying completion-install support that is not yet
documented or validated across shells.
If you need completion today, use your shell's native completion wrappers or aliasing as a local workaround. A future release can enable Typer completion installation once cross-shell setup guidance is documented and tested.
Notes
--changed --stagedscopes lint/format checks to staged Python files.--fastskips tests.--no-testsalways skips tests, even when configured to run.--fixapplies safe autofixes (ruff fix + formatting).devr securityrunspip-auditandbanditfor dependency and code security scans.--fail-faststops the security scan after the first failing check.devr doctorprints environment diagnostics (project root, Python path, venv resolution, and git detection) to help debug setup issues.
Configuration
Add configuration in your pyproject.toml:
[tool.devr] venv_path = ".venv" formatter = "ruff" # or "black" typechecker = "mypy" # or "pyright" coverage_min = 85 coverage_branch = true run_tests = true
If values are omitted or invalid, devr falls back to safe defaults.
Virtual environment resolution order
When devr needs to run tooling, it resolves the venv in this order:
tool.devr.venv_pathfrompyproject.toml(when it points to a valid venv).- The currently active virtual environment (when
devris invoked from inside one). - Project-local fallback directories:
.venv, thenvenv, thenenv.
This is the same resolution order used by devr init, devr check, devr fix, and
devr security.
Release checklist
Use this checklist when cutting a release:
- Verify local quality gates pass (
devr checkanddevr security). - Update
CHANGELOG.md:- Move completed entries from
Unreleasedinto a new version section. - Add release date (
YYYY-MM-DD) and keep entries grouped by change type.
- Move completed entries from
- Bump version in
pyproject.tomlunder[project].version. - Run release preflight checks (artifact smoke tests + changelog/version consistency):
python -m devr.release_preflight- This builds both wheel and sdist artifacts, installs each in an isolated venv, and verifies both
devr --versionandpython -m devr --version.
- Commit release metadata (
CHANGELOG.md, version bump, and any final docs updates). - Tag the release (for example,
vX.Y.Z) and push branch + tag. - Publish to PyPI using your standard release workflow.
- Add a fresh
Unreleasedsection toCHANGELOG.mdfor subsequent work.
Default toolchain
devr init installs:
ruffblackmypypyrightpytestpytest-covpre-commitpip-auditbandit
License
MIT