PEP 735 introduces dependency groups in pyproject.toml
,
allowing tools like black, ruff, and mypy to be managed centrally.
However, when these tools are also used in pre-commit hooks,
keeping versions in sync between uv.lock
and .pre-commit-config.yaml
can be tedious.
This package automatically updates the versions of dependencies in .pre-commit-config.yaml
to match their versions in uv.lock
,
ensuring everything stays aligned and is managed from a single source.
Any tool not specified in uv.lock
remains managed by .pre-commit-config.yaml
.
Simply add this pre-commit hook to your setup and enjoy consistent dependency management.
Simply add these lines to your .pre-commit-config.yaml
file:
- repo: https://github.com/tsvikas/sync-with-uv
rev: main # replace with the latest version
hooks:
- id: sync-with-uv
Note: Place this hook after hooks that modify uv.lock
(like uv-lock
), and before hooks that read versions from .pre-commit-config.yaml
(like sync-pre-commit-deps
).
That's it! The hook will automatically sync versions for any tools present in both your pre-commit config and uv.lock
.
To add a tool to your uv dependencies, use uv add --group dev tool-name
(the tool must be available on PyPI).
For manual usage or CI/CD integration, install and run directly:
pipx install sync-with-uv
# Update .pre-commit-config.yaml
sync-with-uv
# Preview changes only
sync-with-uv --diff
# Custom file paths
sync-with-uv -p custom-precommit.yaml -u custom-lock.toml
Most users don't need this section - the tool works out of the box with popular tools like black, ruff, and mypy, as well as commonly used mirrors for those tools.
By default, the tool assumes the last part of a repo URL is the package name.
For example, if repo: https://github.com/my-org/my-awesome-linter
is in .pre-commit-config.yaml
,
the tool will sync with the version of my-awesome-linter
in uv.lock
.
The tool skips any repo without a corresponding package in uv.lock
.
To link a repo to a different package name,
add an entry to the [tool.sync-with-uv.repo-to-package]
section in pyproject.toml
.
Use an empty value to disable syncing for a specific repo.
[tool.sync-with-uv.repo-to-package]
# sync this repo with the `awesome-linter` package
"https://github.com/my-org/my-awesome-linter" = "awesome-linter"
# do not sync this repo, even if `cool-tool` is in `uv.lock`
"https://github.com/my-org/cool-tool" = ""
For each repo in .pre-commit-config.yaml
with a linked package,
the tool updates the rev
field with the version from uv.lock
, optionally preserving a leading v
.
The tool preserves the original formatting and any comments on the rev
line.
For example, if the uv.lock
version is 1.2.3
,
it will update rev: 1.0.0
to rev: 1.2.3
,
and rev: v1.0.0
to rev: v1.2.3
.
To use a custom format for the rev
field,
add an entry to the [tool.sync-with-uv.repo-to-version-template]
section in pyproject.toml
,
using ${version}
as a placeholder for the package version.
[tool.sync-with-uv.repo-to-version-template]
# for example, this project uses `version_1.2.3` format for tags
"https://github.com/my-org/my-awesome-linter" = "version_${version}"
Interested in contributing? See CONTRIBUTING.md for development setup and guideline.