Prepare release v2.2.0 (#3874)

Work towards #3867

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 21108ff..bcb6c6d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,45 @@
 directory, or view the [latest generated
 changelog](https://rules-python.readthedocs.io/en/latest/changelog.html).
 
+{#v2-2-0}
+## [2.2.0] - 2026-06-30
+
+[2.2.0]: https://github.com/bazel-contrib/rules_python/releases/tag/2.2.0
+
+{#v2-2-0-changed}
+### Changed
+* Renamed most public bzl_library targets from `{foo}_bzl` to `{foo}` to follow
+gazelle naming conventions. Deprecated aliases are left for backwards
+compatibility.
+* (binaries/tests) Added a deprecation warning for targets relying on implicit `__init__.py` creation.
+
+{#v2-2-0-fixed}
+### Fixed
+* Fixed a flaky error on Windows 2022 when looking up the win32 version during
+site initialization by retrying the lookup
+([#3721](https://github.com/bazel-contrib/rules_python/issues/3721)).
+* (coverage) Skip lcov report when no data was collected.
+* (pypi) Fixed `experimental_index_url` checking truthiness before envsubst
+expansion.
+* (rules) Fixed venv output paths for `py_binary` and `py_test` targets whose
+names contain path separators so distinct targets with the same basename no
+longer share the same venv output directory.
+
+{#v2-2-0-added}
+### Added
+* Added {bzl:obj}`features.loadable_symbols` to allow detecting public symbols
+exported by bzl files.
+* Exposed {bzl:obj}`VenvSymlinkEntry` and {bzl:obj}`VenvSymlinkKind` in
+{bzl:target}`//python:py_info.bzl`.
+* (pypi) Added `@pypi` repo: a unified hub of `pip.parse` hubs.
+* (uv) Support for basic `uv.lock` generation via the `lock` rule
+and basic support for importing the `uv.lock` file itself. Since this
+may have bugs, please report this by creating new tickets.
+Work towards [#2787](https://github.com/bazel-contrib/rules_python/issues/2787)
+and [#1975](https://github.com/bazel-contrib/rules_python/issues/1975).
+
+
+
 {#v2-1-0}
 ## [2.1.0] - 2026-06-17
 
diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md
index 7908a28..6b7a150 100644
--- a/docs/api/rules_python/python/config_settings/index.md
+++ b/docs/api/rules_python/python/config_settings/index.md
@@ -362,7 +362,7 @@
   specified concrete PyPI hub (corresponding to a
   {obj}`pip.parse.hub_name` value).
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.2.0
 :::
 ::::
 
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 983ae3c..3eb6222 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -126,7 +126,7 @@
 to `0`), a warning is printed advising to rename the hub, and the collision
 is not resolved.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.2.0
 :::
 
 :::
diff --git a/docs/pypi/download.md b/docs/pypi/download.md
index 6705df1..161a753 100644
--- a/docs/pypi/download.md
+++ b/docs/pypi/download.md
@@ -53,7 +53,7 @@
 (unified-pypi-hub)=
 ## Unified `@pypi` Hub for Multi-Hub Configurations
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.2.0
 Unified `@pypi` hub repository for Bzlmod multi-hub configurations.
 :::
 
diff --git a/news/2945.changed.md b/news/2945.changed.md
deleted file mode 100644
index c0ff002..0000000
--- a/news/2945.changed.md
+++ /dev/null
@@ -1 +0,0 @@
-(binaries/tests) Added a deprecation warning for targets relying on implicit `__init__.py` creation.
diff --git a/news/3785.added.md b/news/3785.added.md
deleted file mode 100644
index db0ec56..0000000
--- a/news/3785.added.md
+++ /dev/null
@@ -1,5 +0,0 @@
-(uv) Support for basic `uv.lock` generation via the `lock` rule
-and basic support for importing the `uv.lock` file itself. Since this
-may have bugs, please report this by creating new tickets.
-Work towards [#2787](https://github.com/bazel-contrib/rules_python/issues/2787)
-and [#1975](https://github.com/bazel-contrib/rules_python/issues/1975).
diff --git a/news/3828.fixed.md b/news/3828.fixed.md
deleted file mode 100644
index 64de2cc..0000000
--- a/news/3828.fixed.md
+++ /dev/null
@@ -1,2 +0,0 @@
-(pypi) Fixed `experimental_index_url` checking truthiness before envsubst
-expansion.
diff --git a/news/3832.fixed.md b/news/3832.fixed.md
deleted file mode 100644
index f1dd32d..0000000
--- a/news/3832.fixed.md
+++ /dev/null
@@ -1 +0,0 @@
-(coverage) Skip lcov report when no data was collected.
diff --git a/news/3837.added.md b/news/3837.added.md
deleted file mode 100644
index 6d3e4b5..0000000
--- a/news/3837.added.md
+++ /dev/null
@@ -1 +0,0 @@
-(pypi) Added `@pypi` repo: a unified hub of `pip.parse` hubs.
diff --git a/news/expose-venv-symlink.added.md b/news/expose-venv-symlink.added.md
deleted file mode 100644
index e339bb5..0000000
--- a/news/expose-venv-symlink.added.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Exposed {bzl:obj}`VenvSymlinkEntry` and {bzl:obj}`VenvSymlinkKind` in
-{bzl:target}`//python:py_info.bzl`.
diff --git a/news/gazelle-bzl-library.changed.md b/news/gazelle-bzl-library.changed.md
deleted file mode 100644
index 0d60211..0000000
--- a/news/gazelle-bzl-library.changed.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Renamed most public bzl_library targets from `{foo}_bzl` to `{foo}` to follow
-gazelle naming conventions. Deprecated aliases are left for backwards
-compatibility.
diff --git a/news/loadable-symbols.added.md b/news/loadable-symbols.added.md
deleted file mode 100644
index 7d92df7..0000000
--- a/news/loadable-symbols.added.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Added {bzl:obj}`features.loadable_symbols` to allow detecting public symbols
-exported by bzl files.
diff --git a/news/slash-target-venv-output.fixed.md b/news/slash-target-venv-output.fixed.md
deleted file mode 100644
index 780b498..0000000
--- a/news/slash-target-venv-output.fixed.md
+++ /dev/null
@@ -1,3 +0,0 @@
-(rules) Fixed venv output paths for `py_binary` and `py_test` targets whose
-names contain path separators so distinct targets with the same basename no
-longer share the same venv output directory.
diff --git a/news/win32_version_lookup.fixed.md b/news/win32_version_lookup.fixed.md
deleted file mode 100644
index 6f01c9e..0000000
--- a/news/win32_version_lookup.fixed.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Fixed a flaky error on Windows 2022 when looking up the win32 version during
-site initialization by retrying the lookup
-([#3721](https://github.com/bazel-contrib/rules_python/issues/3721)).
diff --git a/python/features.bzl b/python/features.bzl
index ee850ad..33323b8 100644
--- a/python/features.bzl
+++ b/python/features.bzl
@@ -54,7 +54,7 @@
 
     A map of bzl paths to the list of public symbols they export.
 
-    :::{versionadded} VERSION_NEXT_FEATURE
+    :::{versionadded} 2.2.0
     :::
     ::::
 
diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl
index da94216..dac1dde 100644
--- a/python/private/py_info.bzl
+++ b/python/private/py_info.bzl
@@ -125,7 +125,7 @@
     :type: DepsetBuilder[File]
     :::
 
-    :::{versionadded} VERSION_NEXT_FEATURE
+    :::{versionadded} 2.2.0
     :::
     """
 
@@ -677,7 +677,7 @@
 def _PyInfoBuilder_add_venv_symlink(self):
     """Create and return a new VenvSymlinkEntryBuilder.
 
-    :::{versionadded} VERSION_NEXT_FEATURE
+    :::{versionadded} 2.2.0
     :::
 
     Args:
diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl
index 62d2c8d..02c5ad0 100644
--- a/python/private/pypi/extension.bzl
+++ b/python/private/pypi/extension.bzl
@@ -845,7 +845,7 @@
 hubs can be created, and each program can use its respective hub's targets.
 Targets from different hubs should not be used together.
 
-:::{versionchanged} VERSION_NEXT_FEATURE
+:::{versionchanged} 2.2.0
 Using the hub name `"pypi"` is deprecated and is changed to
 `{module_name}_pypi` depending on the
 {envvar}`RULES_PYTHON_PYPI_HUB_RESERVED` environment variable.
diff --git a/python/uv/private/lock.bzl b/python/uv/private/lock.bzl
index 8caf0ed..695591e 100644
--- a/python/uv/private/lock.bzl
+++ b/python/uv/private/lock.bzl
@@ -387,7 +387,7 @@
 The lock rule that does the locking in a build action and also prepares information for a `bazel
 run` executable rule.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.2.0
 :::
 """,
     attrs = _common_attrs | {