Skip to content

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[Unreleased]

Added

  • Single-package workspace layout. A root pyproject.toml carrying [project] and [build-system] with no [tool.uv.workspace] is now discovered as a one-package workspace, with the root itself as the package at path .. Users releasing a single library no longer need to scaffold a packages/<name>/ subdirectory. A root that combines [project] and [tool.uv.workspace] is rejected with an error because the discovery semantics are ambiguous. See ADR-0019.
  • [tool.uvr.config].latest defaults to the sole package's name in single-package workspaces. The marker has no meaning when only one package can be selected, so requiring users to write it would be busywork.

Changed

  • SetVersionCommand and BuildCommand carry the package name as an explicit package_name field instead of deriving it from the directory portion of package_path. Path-derived names returned an empty string for the new single-package layout where package_path == ".".

[uv-release v0.38.0] - 2026-05-14

Changed

  • uvr status and uvr release no longer mark a package as changed because one of its workspace dependencies changed. Change detection is purely file-based: a package is dirty when its own files have moved since its baseline tag, or when it has no baseline. To coordinate a cross-package release, run uvr version --bump <axis> --packages <pkg> first. The bump now rewrites the pins on every workspace dependent whose existing specifier rejects the new version's stripped-dev form, so the bump commit produces file changes in the dependents and the next uvr release picks them up in the same cycle. Patch-level bumps that stay within an existing pin range no longer cascade. See ADR-0018.
  • compute_dependency_pins emits a pin only when the dependent's current Dependency specifier does not already accept the new release form. The lower bound uses the stripped-dev form (compute_release_version), so uvr version --bump minor on 0.1.0.dev0 writes pins referencing 0.2.0 rather than 0.2.0.dev0. The previous unconditional rewrite tightened every dependent's lower bound on every bump, including patches.
  • ReleaseDependencyPins now feeds ReleaseVersions (the just-published form) into the pin computer instead of ReleaseBumpVersions (next-dev). Under the new pin lower-bound semantics, the next-dev source would have pinned consumers at versions that did not exist yet. With the conditional rule this is typically a no-op safety net.

Fixed

  • uvr release --packages X now forwards the package filter to the strip-dev fixup. Previously the suggested uvr version --bump release ran over every changed package, so accepting the fix on a filtered release stripped dev versions on packages the user had not selected. --not-packages and --all-packages are forwarded the same way.

[uv-release v0.37.2] - 2026-05-13

Fixed

  • Publish job no longer strips wheels to the publish runner's host platform before uploading. DownloadWheelsCommand now runs with all_platforms=True for the publish step, so every wheel attached to the GitHub release lands in dist/ before uv publish runs. Previously the default packaging.tags.sys_tags() filter on an ubuntu-latest publish runner kept only manylinux_2_17_x86_64, and PyPI ended up with a single-platform release. Pure-Python (py3-none-any) packages were unaffected.

[uv-release v0.37.1] - 2026-05-13

Fixed

  • uvr bump and uvr version now rewrite workspace dependency pins in [build-system].requires, not just [project].dependencies. A workspace package that build-depends on a sibling no longer drifts out of sync with the rest of the release. The user-facing docs already claimed this behavior; only the code was missing.

[uv-release v0.37.0] - 2026-05-13

Added

  • uvr version --bump release strips only the .devN suffix, preserving any pre-release or post-release suffix. 1.0.0a0.dev0 becomes 1.0.0a0; 1.0.0.dev0 becomes 1.0.0. Mirrors what the release pipeline does when it turns a working-tree dev version into a published version.

Fixed

  • The uvr release strip-dev fixup now uses --bump release instead of --bump stable. --bump stable strips both .devN and the pre-release suffix, which silently turned 1.0.0a0.dev0 into 1.0.0 and published a stable release instead of the alpha. --bump release preserves the pre-release suffix so the alpha cycle survives.

[uv-release v0.36.0] - 2026-05-13

Added

  • uvr version --bump alpha|a|beta|b|rc enters or advances a pre-release cycle. Same-kind input increments the pre-number with .dev0 (1.0.0a2 -> 1.0.0a3.dev0); a higher kind resets to 0 (1.0.0a2 -> --bump beta -> 1.0.0b0.dev0); regressions (rc -> alpha) and post-release sources are rejected. a and b are short-form aliases for alpha and beta. Restores the pre-release axis removed in 0.34.0 when the --promote flag was deleted, this time on --bump itself with no auto-promote chain.

[uv-release v0.35.2] - 2026-05-12

Changed

  • uvr release Packages table dropped the CURRENT and DIFF FROM columns. The current version is the working-tree state the user just edited and the diff-from baseline is internal accounting; both still surface in uvr status. Release output stays focused on what is about to happen.
  • uvr release pipeline rendering now surfaces the most informative datum per job. Release lines show name TAG_NAME (e.g., my-core my-core/v0.35.1) — the actual git tag and GitHub release that will be created. Publish lines show name INDEX (my-core pypi) — where the wheel is going. Bump lines show name NEXT_VERSION (my-core 0.35.2.dev0) — the post-release dev cycle anchor. Names are right-padded so columns align across packages.

Fixed

  • Wheel platform compatibility filter in the build job now uses packaging.tags.sys_tags(), the canonical check used by pip and uv. The previous hand-rolled substring check only inspected arch tokens (x86_64/arm64/aarch64) and ignored the OS, so it could keep macOS wheels on a Linux runner or drop a valid manylinux_2_17_x86_64 wheel. Each removal now logs Removing incompatible wheel: <name> so the filter's behavior is visible.
  • uvr workflow install --upgrade and uvr skill install --upgrade no longer hard-fail when [tool.uvr.config].workflow-version / skill-version is missing (users who installed before version tracking landed in 0.32.2). The provider now falls back to uv-release 0.32.0 as the merge baseline — the oldest released version that shipped the bundled workflow and skill templates. A yellow warning prints the chosen baseline. Hand edits stay safe because the three-way merge surfaces divergent regions as conflicts in the editor rather than overwriting.

Added

  • --from-version VERSION flag on uvr workflow install and uvr skill install. One-shot override for the --upgrade merge baseline; takes precedence over both the recorded *-version and the 0.32.0 fallback. Useful when you know the version you originally installed with.

[uv-release v0.35.1] - 2026-05-10

Fixed

  • uvr workflow install --print-template and uvr skill install --print-template no longer raise "already exists" when run in a workspace that has the workflow or skill files installed. The provider now short-circuits before the existence and mode checks so the uvx-based fetch path used by --upgrade works regardless of cwd state.

Added

  • FetchWorkflowBaseCommand and FetchSkillBasesCommand now fall back to extracting templates directly when the uvx --print-template path fails. The fallback runs uv pip install --no-deps --target <tmp> uv-release=={version} and reads template files straight out of the installed site-packages. This rescues uvr workflow install --upgrade and uvr skill install --upgrade against older releases on PyPI that ship the --print-template bug.

[uv-release v0.35.0] - 2026-05-09

Added

  • New uv_release.ui module: a small vocabulary of primitives — section headers, ASCII progress bars, no-box tables, status badges, confirm prompts, two-level pipelines, error blocks with copy-paste fix sections, key/value pairs, hints, banner, ASCII spinner. Every command imports from this layer instead of touching Rich directly.
  • uvr ui-demo renders every primitive plus the full uvr release composition for visual verification.
  • Custom argparse renderer: uvr --help and every subcommand help use the design grammar. Internal CI flags (--plan, --print-template) hidden via argparse.SUPPRESS. Every option flag has a real help string.

Changed

  • The whole CLI now speaks the design grammar: status, release, version, build, configure, workflow validate, every Command.execute() label.
  • Color language is six semantic tokens: magenta (brand / things you type), green (success), yellow ("look here, nothing broken"), red (error), cyan (refs — package names, tags, baselines, version strings), dim (chrome only). Default fg is the workhorse for everything else.
  • SetVersionCommand prints a branded diff line (Updated PKG vOLD -> vNEW) instead of a generic label.
  • Argparse errors humanized: error: Unknown command 'foo' for uvr. instead of argument wf_subcommand: invalid choice ....
  • Confirm prompts read Apply fix? (y/N): — capital marks the default, only the (y/N) token is brand-colored.
  • Bump commit messages now reflect the actual CLI intent. --bump stablechore: set release versions; --bump minorchore: bump minor versions; --set Xchore: set versions.
  • DIFF FROM resolution prefers the dev0 baseline tag for clean stable versions. After strip-dev, 0.34.2 correctly diffs from v0.34.2.dev0-base (the cycle anchor) instead of skipping back to the previous release.
  • Strip-dev fix simplified to a single literal shell command: uvr version --bump stable. The Fix block shows exactly what runs.

Fixed

  • Fix ModuleNotFoundError: No module named 'yaml' on every uvr invocation by declaring pyyaml as a runtime dependency (#20)
  • Post-release bump commit now includes uv.lock. The lockfile sync step uses uv lock (not uv sync) and aborts loudly on failure instead of silently shipping a bump commit out of sync with pyproject.toml.
  • Baseline -base tags are annotated, so git push --follow-tags actually pushes them.
  • git pull --rebase runs before tagging in the bump job, not after — orphaned tag refs from a rebased commit can no longer happen.

Internal

  • All # type: ignore[arg-type] / [no-untyped-def] suppressions removed (34 of them). uv run poe check reports zero diagnostics.

[uv-release v0.34.0] - 2026-05-06

Changed

  • uvr version --bump now accepts stable, which strips pre-release and dev suffixes (e.g., 1.2.3a2.dev0 to 1.2.3). Replaces uvr version --promote final.

Removed

  • BREAKING: uvr version --promote and all of its targets (a, alpha, b, beta, rc, final, and no-arg auto-advance). Use --bump stable to finalize a pre-release; use --set <version> to enter or advance a pre-release cycle.

[v0.22.0] - 2026-04-02

Added

  • Add uvr build command for building changed workspace packages locally using layered dependency ordering without versioning, tagging, or publishing
  • Add typed pydantic argument models for all CLI commands, replacing untyped getattr() access on argparse.Namespace

Changed

  • Reorganize CLI command files into nested subpackages matching the command tree (workflow/, skill/, jobs/)
  • Extract shared upgrade/merge-base helpers into cli/_upgrade.py

Fixed

  • Fix uvr status not showing previous release version and diff-from tag for unchanged packages

[v0.18.0b0] - 2026-03-29

Changed

  • BREAKING: Bump ReleasePlan schema version to 9 — consolidate per-package data into ChangedPackage model replacing BumpPlan, MatrixEntry, PublishEntry, current_versions, release_tags, and bumps fields
  • BREAKING: Rename release pipeline phase from "publish" to "release" — affects --skip flag values, workflow job names, and plan field names (publish_commandsrelease_commands, publish_matrixrelease_matrix, runnersbuild_matrix)
  • BREAKING: Rename all shared module functions to verb-first convention — load_pyprojectread_pyproject, save_pyprojectwrite_pyproject, stepprint_step, fatalexit_fatal, discover_packagesfind_packages, get_baseline_tagsfind_baseline_tags, base_versionget_base_version, get_uvr_configget_config, get_uvr_matrixget_matrix
  • BREAKING: Restructure shared/ modules by topological dependency layer — planner/ subpackage absorbs versions.py, deps.py, graph.py, changes.py; context/ subpackage replaces discovery.py with RepositoryContext model; execute.pyexecutor.py
  • Change ReleasePlanner to accept a pre-built RepositoryContext instead of calling discovery functions internally
  • Change uvr init --upgrade to use editor prompt with --wait for GUI editors instead of git checkout -p for conflict resolution
  • Prefix all core workflow jobs with uvr- (uvr-validate, uvr-build, uvr-release, uvr-finalize) to distinguish from user-defined jobs
  • Replace GitHub API calls and tag scanning with O(1) local ref lookups via find_previous_release inverse version bump

Added

  • Add RepositoryContext model that pre-fetches all repository state (repo handle, git tags, GitHub releases, packages, release tags, baselines) in a single build_context() call
  • Add ChangedPackage model extending PackageInfo with current_version, release_version, next_version, last_release_tag, release_notes, make_latest, and runners fields
  • Add get_path() helper in toml.py for navigating nested TOML dicts without chained .get() calls
  • Add --editor CLI flag and [tool.uvr.config].editor setting for configuring conflict resolution editor in uvr init --upgrade
  • Add @computed_field properties on ReleasePlan for build_matrix and release_matrix — derived from changed packages, serialized into JSON for CI workflow consumption
  • Add cumulative pre-release notes — beta notes include all commits since the last final release, not just since the last alpha
  • Add --full-release-notes flag to show all commits (default truncates to 10 with overflow count)
  • Add is_pre() helper for detecting alpha/beta/rc versions
  • Add --allow-dirty flag to uvr release for running with uncommitted changes
  • Add progress bar with per-phase timing and bar chart summary to uvr release planning output
  • Add find_previous_release() inverse version bump — derives predecessor via O(1) ref lookups with kind chain fallback (rc → b → a → final)
  • Add uvr skill init --upgrade with three-way merge and editor conflict resolution matching uvr init --upgrade
  • Add versioned skill templates replacing git commit SHA tracking

Removed

  • Remove BumpPlan, MatrixEntry, PublishEntry, PinChange, DepPinChange models — data consolidated into ChangedPackage
  • Remove git(), gh(), run() subprocess wrappers from shell.py — replaced by pygit2 and httpx in earlier versions
  • Remove unused functions: dev_number, is_final, is_prerelease, is_postrelease, tag_for_package, topo_sort, rewrite_pyproject, update_dep_pins
  • Remove GitHub API dependency for release detection — all tag lookups are now local via pygit2
  • Remove git/remote.py module

Fixed

  • Fix git merge-file exit code check in uvr init --upgrade — was treating conflict count > 1 as fatal error instead of only negative exit codes
  • Fix multiline run: steps in generated workflow YAML rendering as quoted strings instead of block scalars (|)
  • Fix strategy field rendering after steps in workflow YAML job definitions
  • Fix --pre b with alpha version producing another alpha instead of beta
  • Fix --dev rejecting clean versions — now auto-appends .dev0 consistent with other release types

[v0.17.0] - 2026-03-27

Added

  • Add pre_build_stage/post_build_stage hooks called before and after each build stage with the list of packages
  • Add pre_build_package/post_build_package hooks called around individual package builds (run in parallel threads)
  • Add optional runner parameter to pre_build/post_build hooks identifying the active runner labels

Changed

  • BREAKING: Replace BuildStage.commands dict (with __setup__/__cleanup__ sentinel keys) with explicit setup, packages, and cleanup fields
  • BREAKING: Change build_commands dict keys from JSON-encoded strings to RunnerKey — a Pydantic-validated tuple[str, ...] that parses JSON strings at model validation time
  • Change ReleaseExecutor.build() to accept str | list[str] | None for the runner parameter — JSON strings from CI are parsed via the RunnerKey validator instead of a separate parse_runner function

[v0.16.0] - 2026-03-27

Added

  • Add validate-plan CI job that runs first in the release pipeline — validates the plan JSON as a ReleasePlan and pretty-prints it to stdout
  • Add uvr validate-plan CLI subcommand for validating and displaying a release plan

Changed

  • Change pipeline order to validate-plan → build → publish → finalize — build now depends on validate-plan

[v0.15.0] - 2026-03-27

Added

  • Add ReleaseHook plugin system for extending the release pipeline with Python hooks — supports local hooks (pre_plan/post_plan) and CI hooks (pre_build/post_build/pre_release/post_release/pre_finalize/post_finalize) (ADR-0011)
  • Add [tool.uvr.hooks] config key and convention-based discovery (uvr_hooks.py at workspace root)
  • Export ReleaseHook and ReleasePlan from uv_release package root

Changed

  • Replace git and gh subprocess calls with pygit2 and httpx for faster release planning (ADR-0012)
  • Change uvr init --upgrade to use three-way merge for combining template updates with user customizations (ADR-0013)
  • Bump ReleasePlan schema version to 8 — plans now preserve extra keys injected by hooks

[v0.14.3] - 2026-03-27

Changed

  • Deduplicate subprocess calls in the planning phase — fetch git tags and GitHub releases once instead of 3x and 2x respectively
  • Batch per-package baseline tag lookups into a single git tag --list call with Python set filtering (eliminates N subprocess calls)
  • Parallelize per-package git diff change detection with ThreadPoolExecutor
  • Pre-compute release notes once instead of regenerating per caller

[v0.14.2] - 2026-03-27

Fixed

  • Fix build commands failing on Windows runners — replace mkdir -p and find -delete with cross-platform uv run python -c equivalents (#9)

[v0.14.1] - 2026-03-27

Fixed

  • Fix uvr init --upgrade step matching to use all of id/name/uses for cross-matching between old and new templates
  • Fix uvr init --upgrade to block on uncommitted release.yml changes and handle quit gracefully
  • Remove special characters from CLI output

[v0.14.0] - 2026-03-27

Added

  • Add uvr init --upgrade to update frozen template fields in an existing release.yml while preserving custom jobs, triggers, and env vars
  • Add uvr skill init to copy bundled Claude Code skills into your project

[v0.13.4] - 2026-03-27

Fixed

  • Fix uvr build/uvr finalize failing on Windows runners — --plan now falls back to the UVR_PLAN environment variable and supports @file input (#8)

Changed

  • Change workflow template to omit --plan "$UVR_PLAN" from build/finalize run commands — re-run uvr init to update existing workflows

[v0.13.3] - 2026-03-27

Fixed

  • Fix uvr status build display to show all packages built per runner, including transitive deps marked with (dep)

[v0.13.2] - 2026-03-27

Fixed

  • Fix cross-runner builds failing when a workspace dependency is only assigned to a different runner — unchanged deps are now fetched into deps/ and changed transitive deps are built on every runner that needs them (#7)

[v0.13.1] - 2026-03-27

Fixed

  • Fix topo-sort not considering [build-system].requires dependencies, causing concurrent builds to fail when a package's build-time dep hadn't finished building (#6)

[v0.13.0] - 2026-03-27

Changed

  • Move version setting and dependency pinning from CI build commands to local pre-dispatch — uvr release now commits release versions before dispatching to CI, so release tags point at commits with the correct version (ADR-0010)

[v0.12.0] - 2026-03-27

Changed

  • Change uvr release --json to output only the plan JSON to stdout — no human-readable output, no worktree check, no dispatch prompt

[v0.11.3] - 2026-03-27

Fixed

  • Fix layered builds resolving workspace sources instead of pre-built wheels — uv build now passes --no-sources for layer 1+ packages (#5)

[v0.11.2] - 2026-03-27

Changed

  • Change uvr runners to group output by runner instead of by package and show the default (ubuntu-latest) for unconfigured packages

[v0.11.1] - 2026-03-27

Fixed

  • Fix uvr release CI dispatch checking out the default branch instead of the dispatching branch

[v0.11.0] - 2026-03-27

Changed

  • Move dependency pin writes from local two-pass flow to inline uvr pin-deps commands in the build plan (ADR-0009) — pins are only applied if the build succeeds

Fixed

  • Fix set_version and pin_dependencies crashing on pyproject.toml files without a [project] table

[v0.10.0] - 2026-03-27

Added

  • Add parallel builds within runners — packages at the same dependency depth build concurrently using topological layers

[v0.9.0] - 2026-03-27

Added

  • Add self-hosted runner support — runners are now label sets (e.g. uvr runners pkg --add "self-hosted,linux,x64")
  • Add tag and release conflict detection — planner validates no planned tags/releases already exist before dispatching
  • Add --where local platform check — errors when changed packages have runners for a different OS
  • Add HEAD-vs-remote sync check before CI dispatch

Changed

  • BREAKING: Remove hook jobs from workflow model — uvr init generates only build, release, finalize; users add their own jobs by editing release.yml
  • BREAKING: Remove uvr set-version subcommand — planner emits uv version commands instead
  • BREAKING: Change runner type from str to list[str] in MatrixEntry, ReleasePlan, and [tool.uvr.matrix]
  • BREAKING: Require org/repo/pkg format for uvr install (bare package names no longer accepted)
  • Change uvr status to an alias for uvr release --dry-run
  • Improve dry-run output: column headers, current → release version display, version rewrite visibility in build section
  • Rewrite README with usage-focused sections

Removed

  • Remove uvr set-version subcommand (use uv version directly)
  • Remove hook job classes (HookJob, PreBuildJob, PostBuildJob, PreReleaseJob, PostReleaseJob)
  • Remove _NOOP_STEPS constant and auto-skip logic for no-op hooks

Fixed

  • Fix publish workflow files: pattern missing dist/ prefix — wheels not attached to GitHub releases
  • Fix conflict error suggesting deletion as first option — now shows --post and version bump first

[v0.8.0] - 2026-03-26

Added

  • Add --dev, --pre {a,b,rc}, and --post flags to uvr release for PEP 440 dev, pre, and post releases (ADR-0008)
  • Add uvr build, uvr finalize, uvr set-version, and uvr pin-deps subcommands (previously separate uvr-ci entry point)
  • Add --where {ci,local} flag to uvr release — replaces the separate uvr run command
  • Add --dry-run flag to uvr release for previewing the release plan without changes
  • Add PlanCommand model for pre-computed shell commands in the release plan
  • Add ReleasePlanner class as the single entry point for creating release plans

Changed

  • BREAKING: Remove uvr run command — use uvr release --where local instead
  • BREAKING: Remove uvr-ci / uvr-steps entry point — all subcommands are now under uvr
  • BREAKING: Rename CI subcommand build-all to build
  • BREAKING: Bump ReleasePlan schema version to 6 — plans include pre-computed command sequences
  • Change ReleaseExecutor to a pure command runner — all domain logic moved to ReleasePlanner
  • Change find_release_tags to query GitHub releases instead of git tags
  • Change release tag lookup to only match versions below the current base version
  • Change BumpPlan.new_version to store the exact pyproject.toml version (includes .dev0 suffix)
  • Improve uvr --help with grouped command listing (Commands, CI steps, Low-level)
  • Improve uvr release --help with argument groups (mode, build, dispatch, local, output)
  • Column-align package, build, and finalize sections in dry-run output

Removed

  • Remove pipeline/ re-export package — all imports use shared.* directly
  • Remove ci/ package — step functions inlined into CLI
  • Remove run_release(), execute_plan(), bump_versions(), collect_published_state() functions
  • Remove legacy -dev baseline tag handling

Fixed

  • Fix --dry-run not showing auto-skipped no-op hook jobs
  • Fix --dev release silently publishing a clean version when pyproject.toml has no .dev suffix
  • Fix double .dev0.dev0 in post-release bump versions
  • Fix pre-release bump producing a patch bump instead of next pre-release .dev0 (e.g. a0a1.dev0)
  • Fix post-release bump producing .post0.dev0 instead of .post1.dev0

[v0.6.1] - 2026-03-25

Added

  • Add --skip JOB and --skip-to JOB flags to uvr release for skipping individual or ranges of jobs in the pipeline
  • Add --reuse-run RUN_ID and --reuse-release flags for reusing build artifacts from a previous workflow run or existing GitHub releases
  • Add skip and reuse_run_id workflow dispatch inputs with per-job if: conditions
  • Add JOB_ORDER constant defining the canonical pipeline job ordering

Fixed

  • Fix GH_TOKEN not being set in post-release download step
  • Fix duplicate if: keys in generated workflow when hook jobs had template-generated skip conditions

[v0.6.0] - 2026-03-25

Added

  • Add uvr workflow command for reading, writing, and deleting any key in release.yml with --set, --add, --insert --at, --remove, and --clear flags
  • Add uvr runners PKG --add/--remove/--clear RUNNER command for managing per-package build runners
  • Add ReleaseWorkflow Pydantic model validating the full workflow YAML schema before writes
  • Add ruamel-yaml dependency for lossless YAML round-tripping (preserves key order, comments, quote style)

Changed

  • BREAKING: Remove -m/--matrix flag from uvr init — use uvr runners instead
  • BREAKING: Replace uvr hooks PHASE {add|insert|remove|update|clear} positional subcommands with flag-based --add/--insert --at/--set/--remove/--clear
  • Split monolithic cli.py (1461 lines) into cli/ package with one module per command

Fixed

  • Fix on: key being serialized as true: after YAML round-trip (PyYAML boolean coercion)
  • Fix PyYAML corrupting GitHub Actions ${{ }} expressions with double-quoted single quotes
  • Fix PyYAML reordering top-level YAML keys on write

[v0.5.0] - 2026-03-25

Added

  • Add per-runner build matrix where each runner builds all assigned packages in dependency order via uvr-steps build-all
  • Add topo_layers() for computing dependency depth in the package graph
  • Add runners and dist_name fields to ReleasePlan (schema version 4)

Changed

  • BREAKING: Replace per-package parallel matrix with per-runner matrix — fixes build failures when packages have build-time dependencies on sibling workspace packages
  • BREAKING: Rename --force-all to --rebuild-all
  • Publish job filters wheels by dist_name for per-package GitHub releases

Fixed

  • Fix CI dispatch pinning uvr_version to a .dev version that doesn't exist on PyPI
  • Fix shell quoting issues with plan JSON by passing it via environment variable

[v0.4.2] - 2026-03-23

Added

  • Add tag-triggered PyPI publish workflow (uv-release/v* tags, excluding -dev)
  • Add make_latest field to PublishEntry, driven by [tool.uvr.config] latest setting

Fixed

  • Fix glob wildcard for tag pattern in publish workflow trigger

[v0.4.1] - 2026-03-23

Fixed

  • Fix PyPI publish rebuilding from HEAD (which picked up the .dev0 bump) — now downloads the wheel directly from the GitHub release artifact

[v0.4.0] - 2026-03-23

Added

  • Add [tool.uvr.config] with include and exclude lists for package filtering
  • Add --yes/-y flag to skip the confirmation prompt

Changed

  • BREAKING: uvr release now prints the plan and prompts before dispatching — read-only by default (replaces --dry-run)
  • BREAKING: Remove --dry-run flag from uvr release
  • Replace shell scripts in release workflow with real GitHub Actions (softprops/action-gh-release)
  • Move dependency pinning from CI to local planning — build_plan() pre-computes all version bumps, CI applies them via apply_bumps()
  • Add BumpPlan model and bumps field to ReleasePlan
  • Add precomputed release notes via PublishEntry and generate_release_notes()
  • Bump ReleasePlan schema version to 3

[v0.3.1] - 2026-03-20

Fixed

  • Fix dogfood release by using uv run uvr-steps from workspace instead of global install

[v0.3.0] - 2026-03-20

Added

  • Plan+execute architecture: uvr release builds a ReleasePlan locally and dispatches it to CI as a pure executor
  • Per-package GitHub releases tagged {package}/v{version}
  • uvr install PACKAGE[@VERSION] with transitive internal dependency resolution
  • uvr install ORG/REPO/PACKAGE[@VERSION] for remote installs
  • --python VERSION flag to pin CI Python version (default 3.12)
  • uvr-steps CLI entry point for workflow step dispatch
  • uvr status command showing workflow config and changed packages

Changed

  • BREAKING: Replace lazy-wheels package entirely with uv-release
  • Matrix config moved to [tool.uvr.matrix] in workspace root pyproject.toml

Removed

  • Remove lazy-wheels package and all associated code