Skip to main content

sync-with-uv

Tests uv Ruff Black codecov
PyPI version PyPI platforms Total downloads
Made Using tsvikas/python-template GitHub Discussion PRs Welcome

Overview

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/prek.toml can be tedious.

This package automatically updates the versions of dependencies in .pre-commit-config.yaml/prek.toml 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/prek.toml.

Simply add this pre-commit hook to your setup and enjoy consistent dependency management.

Usage

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

or to your prek.toml:

[[repos]]
repo = "https://github.com/tsvikas/sync-with-uv"
rev = "main"  # replace with the latest version
hooks = [{ id = "sync-with-uv" }]

That's it! The hook syncs versions for any tool present in both your pre-commit config and uv.lock. To make a tool eligible, add it to your uv dependencies with uv add --group dev <tool-name>.

Alternative: Command Line Interface

For manual usage or CI/CD integration, install and run directly:

uv tool install sync-with-uv

# Update .pre-commit-config.yaml / prek.toml
sync-with-uv

# Preview changes only
sync-with-uv --diff

# Custom file paths
sync-with-uv -u custom-lock.toml
sync-with-uv -p custom-precommit.yaml
sync-with-uv -p custom-prek.toml

Syncing additional dependencies

Besides the rev of each hook, the tool can also sync version pins inside additional_dependencies (or any other dependency line). Because these lists can contain arbitrary packages, syncing is strictly opt-in per line: a dependency is only touched if its line carries a # sync-with-uv pragma comment.

- repo: https://github.com/adamchainz/blacken-docs
  rev: 1.16.0
  hooks:
    - id: blacken-docs
      additional_dependencies:
        - black==23.9.1  # sync-with-uv
        - some-other-lib==1.0.0  # left alone, no pragma

For every annotated line, the dependency is pinned to an exact version (==) from uv.lock, adding a specifier when the dependency has none, so the example above becomes black==<locked>. The package name, extras (like black[jupyter]), environment markers (like ; python_version < "3.11"), quoting, and the comment itself are preserved.

Because the pragma is an explicit request to sync a line, the tool errors (exit code 123) when an annotated line cannot be synced.

Advanced Configuration

The tool works out of the box with popular tools like black, ruff, and mypy, as well as commonly used mirrors for those tools. Most users don't need the settings below.

Mapping from repo URL to package name

Details and example

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/prek.toml, 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" = ""

Mapping from repo URL to version tag format

Details and example

For each repo in .pre-commit-config.yaml/prek.toml 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}"

Contributing

Interested in contributing? See CONTRIBUTING.md for development setup and guideline.

Metadata

Release files for sync-with-uv 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sync-with-uv 0.6.0
File Size Uploaded Provenance
sync_with_uv-0.6.0.tar.gz 128.8 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sync-with-uv 0.6.0
File Interpreter ABI Platform
sync_with_uv-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 143.3 kB

Release files / sync_with_uv-0.6.0.tar.gz

Download URL sync_with_uv-0.6.0.tar.gz
Size 128.8 kB
Tags Source
SHA-256 checksum
How to use checksums
cb995f87e7863e281ff005e8e74fda043af320a8fcb6cef949a83dea0ac944bd
BLAKE2b-256 checksum
How to use checksums
b703b152ef82e9de78584ac82537c98991723bec809e4994c1d3e2bb022469e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

Release files / sync_with_uv-0.6.0-py3-none-any.whl

Download URL sync_with_uv-0.6.0-py3-none-any.whl
Size 14.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
acb634a3ddc406f0d713b9263106f52b7d4a7ee791d2105efe8d4a6f6abc42dd
BLAKE2b-256 checksum
How to use checksums
8cc3353b684b02ab653fbbd60172fac7a715b0d49d03a7c7da51db2a364dc061
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

Security for sync-with-uv 0.6.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for sync_with_uv-0.6.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page