This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 5d1b2715f7 Improve eager-upgrade additional requirements and 
constraint generation (#37745)
5d1b2715f7 is described below

commit 5d1b2715f73a5aaca77f646de3ef945eb389272a
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Tue Feb 27 19:24:42 2024 +0100

    Improve eager-upgrade additional requirements and constraint generation 
(#37745)
    
    Generate constraints have been still using pip, but similarly as in case
    of the image building, we can use uv and it will speed up the
    generation.
    
    Also we can remove now eager-upgrade requirements, because for uv it
    seems that their resolving algorithm should cope a bit better than
    `pip` in case of some troublesome dependencies.
---
 Dockerfile.ci                                      |   7 +-
 ...put_release-management_generate-constraints.svg |  70 +++++++-------
 ...put_release-management_generate-constraints.txt |   2 +-
 .../output_release-management_publish-docs.svg     |  14 +--
 .../output_release-management_publish-docs.txt     |   2 +-
 ...tput_release-management_release-prod-images.svg |  34 +++----
 ...tput_release-management_release-prod-images.txt |   2 +-
 .../airflow_breeze/commands/ci_image_commands.py   |  11 +--
 .../src/airflow_breeze/commands/common_options.py  |   7 ++
 .../commands/release_management_commands.py        |   7 +-
 .../commands/release_management_commands_config.py |  21 +++--
 .../src/airflow_breeze/params/shell_params.py      |   2 +
 dev/breeze/src/airflow_breeze/utils/packages.py    |   7 +-
 scripts/in_container/run_generate_constraints.py   | 104 +++++++++++++++------
 14 files changed, 175 insertions(+), 115 deletions(-)

diff --git a/Dockerfile.ci b/Dockerfile.ci
index 8e927094e8..1898cfd57a 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -1281,12 +1281,7 @@ COPY --from=scripts install_airflow.sh /scripts/docker/
 # force them on the main Airflow package. Currently we need no extra limits as 
PIP 23.1+ has much better
 # dependency resolution and we do not need to limit the versions of the 
dependencies
 #
-# boto3 is limited to <1.34 because of aiobotocore that only works with 1.33 
and we want to help
-# `pip` to limit the versions it checks and limit backtracking, by explicitly 
specifying these limits
-# when performing eager upgrade of dependencies - this way it won't even 
consider 1.34 versions of boto
-# We should update it every time a new version of aiobotocore is released 
supporting 1.34
-#
-ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="boto3>=1.33,<1.34"
+ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=""
 ARG UPGRADE_TO_NEWER_DEPENDENCIES="false"
 ARG VERSION_SUFFIX_FOR_PYPI=""
 
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-constraints.svg 
b/dev/breeze/doc/images/output_release-management_generate-constraints.svg
index e00db31f3f..96976e4d55 100644
--- a/dev/breeze/doc/images/output_release-management_generate-constraints.svg
+++ b/dev/breeze/doc/images/output_release-management_generate-constraints.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 928.4" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 952.8" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath 
id="breeze-release-management-generate-constraints-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="877.4" />
+      <rect x="0" y="0" width="1463.0" height="901.8" />
     </clipPath>
     <clipPath id="breeze-release-management-generate-constraints-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -150,9 +150,12 @@
 <clipPath id="breeze-release-management-generate-constraints-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-generate-constraints-line-35">
+    <rect x="0" y="855.5" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="926.4" rx="8"/><text 
class="breeze-release-management-generate-constraints-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;generate-constraints</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="950.8" rx="8"/><text 
class="breeze-release-management-generate-constraints-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;generate-constraints</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -168,36 +171,37 @@
 </text><text class="breeze-release-management-generate-constraints-r1" 
x="12.2" y="93.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-3)">Generates&#160;pinned&#160;constraint&#160;files&#160;with&#160;all&#160;extras&#160;from&#160;pyproject.toml&#160;in&#160;parallel.</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="93.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-3)">
 </text><text class="breeze-release-management-generate-constraints-r1" 
x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-4)">
 </text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="142" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-5)">╭─</text><text
 class="breeze-release-management-generate-constraints-r5" x="24.4" y="142" 
textLength="341.6" 
clip-path="url(#breeze-release-management-generate-constraints-line-5)">&#160;Generate&#160;constraints&#160;flags&#160;</text><text
 class="breeze-release-management-generate-constraints-r5" x="366" y="142" t 
[...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-6)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-6)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="166.4" 
textLength="73.2" clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-7)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="190.8" 
textLength="963.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-7)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-8)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="215.2" 
textLength="963.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-8)">[default:&#160;latest]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-9)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-9)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="239.6" 
textLength="85.4" clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-10)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="264" 
textLength="732" 
clip-path="url(#breeze-release-management-generate-constraints-line-10)">(&gt;3.8&lt;&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-11)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="288.4" 
textLength="732" 
clip-path="url(#breeze-release-management-generate-constraints-line-11)">[default:&#160;3.8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-12)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-12)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="312.8" 
textLength="97.6" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-13)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="337.2" 
textLength="866.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-13)">(constraints-source-providers&#160;|&#160;constraints&#160;|&#160;constraints-no-providers)</text><text
 class="breeze-release-mana [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-14)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="361.6" 
textLength="866.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-14)">[default:&#160;constraints-source-providers]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-15)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="386" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-15)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="386" 
textLength="97.6" clip-path="url(#breeze-releas [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-16)">│</text><text
 class="breeze-release-management-generate-constraints-r1" x="414.8" y="410.4" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-16)">current_version&#160;and&#160;should&#160;be&#160;installed&#160;in&#160;CI&#160;from&#160;locally&#160;built&#160;packages&#160;
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-17)">│</text><text
 class="breeze-release-management-generate-constraints-r1" x="414.8" y="434.8" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-17)">current_version.dev0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-18)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="459.2" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-18)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-19)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-19)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="483.6" 
textLength="85.4" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="508" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-20)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="532.4" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-21)">╭─</text><text
 class="breeze-release-management-generate-constraints-r5" x="24.4" y="532.4" 
textLength="219.6" 
clip-path="url(#breeze-release-management-generate-constraints-line-21)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-release-management-generate-constraints-r5" x="244" y="532.4" 
textLeng [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-22)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-22)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="556.8" 
textLength="48.8" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-23)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="581.2" 
textLength="146.4" clip-path="url(#breeze [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="280.6" y="605.6" 
textLength="915" 
clip-path="url(#breeze-release-management-generate-constraints-line-24)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="630" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-25)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="630" 
textLength="85.4" clip-path="url(#breeze-releas [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="280.6" y="654.4" 
textLength="951.6" 
clip-path="url(#breeze-release-management-generate-constraints-line-26)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-27)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-27)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="678.8" 
textLength="61" clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-28)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-28)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="703.2" 
textLength="73.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="727.6" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-29)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="752" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-30)">╭─</text><text
 class="breeze-release-management-generate-constraints-r5" x="24.4" y="752" 
textLength="195.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-30)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-generate-constraints-r5" x="219.6" y="752" 
textLength="12 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="776.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-31)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-31)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="776.4" 
textLength="97.6" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-32)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="800.8" 
textLength="48.8" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-33)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-33)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="825.2" 
textLength="85.4" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-34)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-34)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="849.6" 
textLength="61" clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="874" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="874" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-35)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-6)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-6)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="166.4" 
textLength="97.6" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-7)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="190.8" 
textLength="866.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-7)">(constraints-source-providers&#160;|&#160;constraints&#160;|&#160;constraints-no-providers)</text><text
 class="breeze-release-manage [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-8)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="215.2" 
textLength="866.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-8)">[default:&#160;constraints-source-providers]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-9)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-9)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="239.6" 
textLength="97.6" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-10)">│</text><text
 class="breeze-release-management-generate-constraints-r1" x="414.8" y="264" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-10)">current_version&#160;and&#160;should&#160;be&#160;installed&#160;in&#160;CI&#160;from&#160;locally&#160;built&#160;packages&#160;with
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-11)">│</text><text
 class="breeze-release-management-generate-constraints-r1" x="414.8" y="288.4" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-11)">current_version.dev0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-12)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="312.8" 
textLength="1024.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-12)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-13)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-13)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="337.2" 
textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-14)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-14)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="361.6" 
textLength="73.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-15)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="386" 
textLength="963.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-15)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-16)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="410.4" 
textLength="963.8" 
clip-path="url(#breeze-release-management-generate-constraints-line-16)">[default:&#160;latest]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-17)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-17)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="434.8" 
textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-18)">│</text><text
 class="breeze-release-management-generate-constraints-r6" x="414.8" y="459.2" 
textLength="732" 
clip-path="url(#breeze-release-management-generate-constraints-line-18)">(&gt;3.8&lt;&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-19)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="414.8" y="483.6" 
textLength="732" 
clip-path="url(#breeze-release-management-generate-constraints-line-19)">[default:&#160;3.8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-20)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-20)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="508" 
textLength="48.8" clip-path="url(#breeze-releas [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="532.4" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-21)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="556.8" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-22)">╭─</text><text
 class="breeze-release-management-generate-constraints-r5" x="24.4" y="556.8" 
textLength="219.6" 
clip-path="url(#breeze-release-management-generate-constraints-line-22)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-release-management-generate-constraints-r5" x="244" y="556.8" 
textLeng [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-23)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="581.2" 
textLength="73.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-24)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="605.6" 
textLength="146.4" clip-path="url(#breeze [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="280.6" y="630" 
textLength="915" 
clip-path="url(#breeze-release-management-generate-constraints-line-25)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-26)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="654.4" 
textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-27)">│</text><text
 class="breeze-release-management-generate-constraints-r5" x="280.6" y="678.8" 
textLength="951.6" 
clip-path="url(#breeze-release-management-generate-constraints-line-27)">[default:&#160;3.8&#160;3.9&#160;3.10&#160;3.11]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-28)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-28)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="703.2" 
textLength="48.8" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-29)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-29)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="727.6" 
textLength="61" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="752" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="752" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-30)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="776.4" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-constraints-line-31)">╭─</text><text
 class="breeze-release-management-generate-constraints-r5" x="24.4" y="776.4" 
textLength="195.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-31)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-generate-constraints-r5" x="219.6" y="776.4" 
textLeng [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-32)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="800.8" 
textLength="97.6" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-33)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-33)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="825.2" 
textLength="48.8" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-34)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-34)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="849.6" 
textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="874" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-35)">│</text><text
 class="breeze-release-management-generate-constraints-r4" x="24.4" y="874" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-35)">-</text><text
 class="breeze-release-management-generate-constraints-r4" x="36.6" y="874" 
textLength="61" clip-path="url(#breeze-release- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" 
y="898.4" textLength="1464" 
clip-path="url(#breeze-release-management-generate-constraints-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-constraints-r1" x="1464" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-generate-constraints-line-36)">
 </text>
     </g>
     </g>
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-constraints.txt 
b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
index 37b035c8d5..06c7108c2e 100644
--- a/dev/breeze/doc/images/output_release-management_generate-constraints.txt
+++ b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
@@ -1 +1 @@
-587c21578af75c3c8fb9b4629e3577e1
+839a8605b97ed77f000b907f62752037
diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.svg 
b/dev/breeze/doc/images/output_release-management_publish-docs.svg
index 115fbb2d5a..55cca08f67 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs.svg
+++ b/dev/breeze/doc/images/output_release-management_publish-docs.svg
@@ -223,13 +223,13 @@
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-29)">│</text><text 
class="breeze-release-management-publish-docs-r8" x="488" y="727.6" 
textLength="951.6" 
clip-path="url(#breeze-release-management-publish-docs-line-29)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="752" 
textLength="1464" 
clip-path="url(#breeze-release-management-publish-docs-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-publish-docs-r1" x="1464" y="752" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-30)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="776.4" 
textLength="24.4" 
clip-path="url(#breeze-release-management-publish-docs-line-31)">╭─</text><text 
class="breeze-release-management-publish-docs-r5" x="24.4" y="776.4" 
textLength="219.6" 
clip-path="url(#breeze-release-management-publish-docs-line-31)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-release-management-publish-docs-r5" x="244" y="776.4" 
textLength="1195.6" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-32)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-32)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="800.8" 
textLength="48.8" 
clip-path="url(#breeze-release-management-publish-docs-line-32) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-33)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-33)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="825.2" 
textLength="146.4" 
clip-path="url(#breeze-release-management-publish-docs-line-33 [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-34)">│</text><text 
class="breeze-release-management-publish-docs-r8" x="378.2" y="849.6" 
textLength="915" 
clip-path="url(#breeze-release-management-publish-docs-line-34)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-35)">│</text><text 
class="breeze-release-management-publish-docs-r5" x="378.2" y="874" 
textLength="915" 
clip-path="url(#breeze-release-management-publish-docs-line-35)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-36)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-36)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="898.4" 
textLength="61" 
clip-path="url(#breeze-release-management-publish-docs-line-36)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-37)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-37)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="922.8" 
textLength="73.2" 
clip-path="url(#breeze-release-management-publish-docs-line-37) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-38)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-38)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="947.2" 
textLength="97.6" 
clip-path="url(#breeze-release-management-publish-docs-line-38) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-32)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-32)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="800.8" 
textLength="73.2" 
clip-path="url(#breeze-release-management-publish-docs-line-32) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-33)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-33)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="825.2" 
textLength="97.6" 
clip-path="url(#breeze-release-management-publish-docs-line-33) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-34)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-34)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="849.6" 
textLength="146.4" 
clip-path="url(#breeze-release-management-publish-docs-line-34 [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-35)">│</text><text 
class="breeze-release-management-publish-docs-r8" x="378.2" y="874" 
textLength="915" 
clip-path="url(#breeze-release-management-publish-docs-line-35)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-36)">│</text><text 
class="breeze-release-management-publish-docs-r5" x="378.2" y="898.4" 
textLength="915" 
clip-path="url(#breeze-release-management-publish-docs-line-36)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-37)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-37)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="922.8" 
textLength="48.8" 
clip-path="url(#breeze-release-management-publish-docs-line-37) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-38)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-38)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="947.2" 
textLength="61" 
clip-path="url(#breeze-release-management-publish-docs-line-38)"> [...]
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="971.6" 
textLength="1464" 
clip-path="url(#breeze-release-management-publish-docs-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-publish-docs-r1" x="1464" y="971.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-39)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="996" 
textLength="24.4" 
clip-path="url(#breeze-release-management-publish-docs-line-40)">╭─</text><text 
class="breeze-release-management-publish-docs-r5" x="24.4" y="996" 
textLength="195.2" 
clip-path="url(#breeze-release-management-publish-docs-line-40)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-publish-docs-r5" x="219.6" y="996" 
textLength="1220" clip-path="url(#breeze-release-manag [...]
 </text><text class="breeze-release-management-publish-docs-r5" x="0" 
y="1020.4" textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-41)">│</text><text 
class="breeze-release-management-publish-docs-r4" x="24.4" y="1020.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-publish-docs-line-41)">-</text><text 
class="breeze-release-management-publish-docs-r4" x="36.6" y="1020.4" 
textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line- 
[...]
diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.txt 
b/dev/breeze/doc/images/output_release-management_publish-docs.txt
index 69a8235801..9529819686 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs.txt
+++ b/dev/breeze/doc/images/output_release-management_publish-docs.txt
@@ -1 +1 @@
-13ec64b7164df160ed21b6395cdd67ee
+a6be6aad28ce6b74e0b3d075b03aabc4
diff --git 
a/dev/breeze/doc/images/output_release-management_release-prod-images.svg 
b/dev/breeze/doc/images/output_release-management_release-prod-images.svg
index 5d958a3d3e..1106b97270 100644
--- a/dev/breeze/doc/images/output_release-management_release-prod-images.svg
+++ b/dev/breeze/doc/images/output_release-management_release-prod-images.svg
@@ -153,23 +153,23 @@
 </text><text class="breeze-release-management-release-prod-images-r1" x="1464" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-4)">
 </text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="142" textLength="24.4" 
clip-path="url(#breeze-release-management-release-prod-images-line-5)">╭─</text><text
 class="breeze-release-management-release-prod-images-r5" x="24.4" y="142" 
textLength="317.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-5)">&#160;Release&#160;PROD&#160;IMAGE&#160;flags&#160;</text><text
 class="breeze-release-management-release-prod-images-r5" x="341.6" y="142" t 
[...]
 </text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-6)">│</text><text
 class="breeze-release-management-release-prod-images-r6" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-6)">*</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="166.4" 
textLength="12.2" clip-path="url(#breeze-release-m [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-7)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-7)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="190.8" 
textLength="122" clip-path="url(#breeze-release-ma [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-8)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-8)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="215.2" 
textLength="61" clip-path="url(#breeze-release-man [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-9)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-9)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="239.6" 
textLength="73.2" clip-path="url(#breeze-release-m [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-10)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="264" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-10)">all&#160;available&#160;python&#160;versions)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-11)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="288.4" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-11)">(3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-12)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-12)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="312.8" 
textLength="73.2" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-13)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="337.2" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-13)">built.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-14)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="361.6" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-14)">(linux/amd64&#160;|&#160;linux/arm64&#160;|&#160;linux/amd64,linux/arm64)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-15)">│</text><text
 class="breeze-release-management-release-prod-images-r5" x="390.4" y="386" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-15)">[default:&#160;linux/amd64,linux/arm64]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-16)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-16)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="410.4" 
textLength="61" clip-path="url(#breeze-release-m [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-17)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="434.8" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-17)">updated).&#160;This&#160;should&#160;only&#160;be&#160;used&#160;if&#160;you&#160;release&#160;image&#160;for&#160;previous&#160;bran
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-18)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="459.2" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-18)">Automatically&#160;set&#160;when&#160;rc/alpha/beta&#160;images&#160;are&#160;built.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-19)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-19)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="483.6" 
textLength="85.4" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-20)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-20)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="508" 
textLength="97.6" clip-path="url(#breeze-release-manag [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-21)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="532.4" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-21)">current_version&#160;and&#160;should&#160;be&#160;installed&#160;in&#160;CI&#160;from&#160;locally&#160;built&#160;packages&#160;with
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-22)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="556.8" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-22)">current_version.dev0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-23)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="581.2" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-23)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-7)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-7)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="190.8" 
textLength="97.6" clip-path="url(#breeze-release-m [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-8)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="215.2" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-8)">current_version&#160;and&#160;should&#160;be&#160;installed&#160;in&#160;CI&#160;from&#160;locally&#160;built&#160;packages&#160;with&#
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-9)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="239.6" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-9)">current_version.dev0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-10)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="264" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-10)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-11)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-11)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="288.4" 
textLength="85.4" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-12)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-12)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="312.8" 
textLength="122" clip-path="url(#breeze-release- [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-13)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-13)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="337.2" 
textLength="73.2" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-14)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="361.6" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-14)">all&#160;available&#160;python&#160;versions)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-15)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="386" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-15)">(3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-16)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-16)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="410.4" 
textLength="73.2" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-17)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="434.8" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-17)">built.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-18)">│</text><text
 class="breeze-release-management-release-prod-images-r7" x="390.4" y="459.2" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-18)">(linux/amd64&#160;|&#160;linux/arm64&#160;|&#160;linux/amd64,linux/arm64)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-19)">│</text><text
 class="breeze-release-management-release-prod-images-r5" x="390.4" y="483.6" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-19)">[default:&#160;linux/amd64,linux/arm64]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-20)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-20)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="508" 
textLength="61" clip-path="url(#breeze-release-managem [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-21)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="532.4" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-21)">updated).&#160;This&#160;should&#160;only&#160;be&#160;used&#160;if&#160;you&#160;release&#160;image&#160;for&#160;previous&#160;bran
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-22)">│</text><text
 class="breeze-release-management-release-prod-images-r1" x="390.4" y="556.8" 
textLength="1049.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-22)">Automatically&#160;set&#160;when&#160;rc/alpha/beta&#160;images&#160;are&#160;built.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-23)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="61" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-23)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="73.2" y="581.2" 
textLength="61" clip-path="url(#breeze-release-m [...]
 </text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="605.6" textLength="1464" 
clip-path="url(#breeze-release-management-release-prod-images-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-release-prod-images-r1" x="1464" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-24)">
 </text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="630" textLength="24.4" 
clip-path="url(#breeze-release-management-release-prod-images-line-25)">╭─</text><text
 class="breeze-release-management-release-prod-images-r5" x="24.4" y="630" 
textLength="195.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-25)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-release-prod-images-r5" x="219.6" y="630" 
textLength="1220" c [...]
 </text><text class="breeze-release-management-release-prod-images-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-26)">│</text><text
 class="breeze-release-management-release-prod-images-r4" x="24.4" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-release-prod-images-line-26)">-</text><text
 class="breeze-release-management-release-prod-images-r4" x="36.6" y="654.4" 
textLength="48.8" clip-path="url(#breeze-relea [...]
diff --git 
a/dev/breeze/doc/images/output_release-management_release-prod-images.txt 
b/dev/breeze/doc/images/output_release-management_release-prod-images.txt
index 96ce03643f..9404ab7680 100644
--- a/dev/breeze/doc/images/output_release-management_release-prod-images.txt
+++ b/dev/breeze/doc/images/output_release-management_release-prod-images.txt
@@ -1 +1 @@
-7df532d7f563185a27b49f18286d2572
+08136e69a6e1f7e7522f330f2dd30250
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py 
b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
index 8213555c0a..b1dabb0a2a 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -71,6 +71,7 @@ from airflow_breeze.commands.common_options import (
     option_python_versions,
     option_run_in_parallel,
     option_skip_cleanup,
+    option_use_uv,
     option_verbose,
 )
 from airflow_breeze.commands.common_package_installation_options import (
@@ -252,14 +253,6 @@ option_eager_upgrade_additional_requirements = 
click.option(
     "(see `breeze ci find-backtracking-candidates`).",
 )
 
-option_use_uv_ci = click.option(
-    "--use-uv/--no-use-uv",
-    is_flag=True,
-    default=True,
-    help="Use uv instead of pip as packaging tool.",
-    envvar="USE_UV",
-)
-
 option_upgrade_to_newer_dependencies = click.option(
     "-u",
     "--upgrade-to-newer-dependencies",
@@ -327,7 +320,7 @@ option_version_suffix_for_pypi_ci = click.option(
 @option_tag_as_latest
 @option_upgrade_on_failure
 @option_upgrade_to_newer_dependencies
-@option_use_uv_ci
+@option_use_uv
 @option_verbose
 @option_version_suffix_for_pypi_ci
 def build(
diff --git a/dev/breeze/src/airflow_breeze/commands/common_options.py 
b/dev/breeze/src/airflow_breeze/commands/common_options.py
index 03632bd601..af30a9d299 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_options.py
@@ -337,6 +337,13 @@ option_upgrade_boto = click.option(
     is_flag=True,
     envvar="UPGRADE_BOTO",
 )
+option_use_uv = click.option(
+    "--use-uv/--no-use-uv",
+    is_flag=True,
+    default=True,
+    help="Use uv instead of pip as packaging tool.",
+    envvar="USE_UV",
+)
 option_pydantic = click.option(
     "--pydantic",
     help="Determines which pydantic should be used during tests.",
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 1f65ffaff0..9b700f6514 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -61,6 +61,7 @@ from airflow_breeze.commands.common_options import (
     option_run_in_parallel,
     option_skip_cleanup,
     option_use_airflow_version,
+    option_use_uv,
     option_verbose,
     option_version_suffix_for_pypi,
 )
@@ -980,11 +981,13 @@ def run_generate_constraints_in_parallel(
 @option_airflow_constraints_mode_ci
 @option_chicken_egg_providers
 @option_github_repository
+@option_use_uv
 @option_verbose
 @option_dry_run
 @option_answer
 def generate_constraints(
     airflow_constraints_mode: str,
+    chicken_egg_providers: str,
     debug_resources: bool,
     github_repository: str,
     image_tag: str | None,
@@ -993,7 +996,7 @@ def generate_constraints(
     python_versions: str,
     run_in_parallel: bool,
     skip_cleanup: bool,
-    chicken_egg_providers: str,
+    use_uv: bool,
 ):
     perform_environment_checks()
     check_remote_ghcr_io_commands()
@@ -1035,6 +1038,7 @@ def generate_constraints(
                 github_repository=github_repository,
                 image_tag=image_tag,
                 python=python,
+                use_uv=use_uv,
             )
             for python in python_version_list
         ]
@@ -1054,6 +1058,7 @@ def generate_constraints(
             github_repository=github_repository,
             image_tag=image_tag,
             python=python,
+            use_uv=use_uv,
         )
         return_code, info = run_generate_constraints(
             shell_params=shell_params,
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 9300a7d642..4ac7fba7f4 100644
--- 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -217,21 +217,22 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] = {
         {
             "name": "Generate constraints flags",
             "options": [
-                "--image-tag",
-                "--python",
                 "--airflow-constraints-mode",
                 "--chicken-egg-providers",
                 "--github-repository",
+                "--image-tag",
+                "--python",
+                "--use-uv",
             ],
         },
         {
             "name": "Parallel running",
             "options": [
-                "--run-in-parallel",
+                "--debug-resources",
                 "--parallelism",
                 "--python-versions",
+                "--run-in-parallel",
                 "--skip-cleanup",
-                "--debug-resources",
             ],
         },
     ],
@@ -240,13 +241,13 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] = {
             "name": "Release PROD IMAGE flags",
             "options": [
                 "--airflow-version",
+                "--chicken-egg-providers",
+                "--commit-sha",
                 "--dockerhub-repo",
-                "--slim-images",
                 "--limit-python",
                 "--limit-platform",
                 "--skip-latest",
-                "--commit-sha",
-                "--chicken-egg-providers",
+                "--slim-images",
             ],
         }
     ],
@@ -265,11 +266,11 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] = {
         {
             "name": "Parallel running",
             "options": [
-                "--run-in-parallel",
-                "--parallelism",
-                "--skip-cleanup",
                 "--debug-resources",
                 "--include-success-outputs",
+                "--parallelism",
+                "--run-in-parallel",
+                "--skip-cleanup",
             ],
         },
     ],
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py 
b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 01baf0d0e1..ced28c78d4 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -192,6 +192,7 @@ class ShellParams:
     upgrade_boto: bool = False
     use_airflow_version: str | None = None
     use_packages_from_dist: bool = False
+    use_uv: bool = False
     use_xdist: bool = False
     verbose: bool = False
     verbose_commands: bool = False
@@ -531,6 +532,7 @@ class ShellParams:
         _set_var(_env, "PYDANTIC", self.pydantic)
         _set_var(_env, "USE_AIRFLOW_VERSION", self.use_airflow_version, "")
         _set_var(_env, "USE_PACKAGES_FROM_DIST", self.use_packages_from_dist)
+        _set_var(_env, "USE_UV", self.use_uv)
         _set_var(_env, "USE_XDIST", self.use_xdist)
         _set_var(_env, "VERBOSE", get_verbose())
         _set_var(_env, "VERBOSE_COMMANDS", self.verbose_commands)
diff --git a/dev/breeze/src/airflow_breeze/utils/packages.py 
b/dev/breeze/src/airflow_breeze/utils/packages.py
index 307b4cc9c0..e908a29b01 100644
--- a/dev/breeze/src/airflow_breeze/utils/packages.py
+++ b/dev/breeze/src/airflow_breeze/utils/packages.py
@@ -403,7 +403,12 @@ def get_install_requirements(provider_id: str, 
version_suffix: str) -> str:
     """
 
     def apply_version_suffix(install_clause: str) -> str:
-        if install_clause.startswith("apache-airflow") and ">=" in 
install_clause and version_suffix != "":
+        if (
+            install_clause.startswith("apache-airflow")
+            and ">=" in install_clause
+            and version_suffix != ""
+            and not install_clause.endswith(version_suffix)
+        ):
             # This is workaround for `pip` way of handling `--pre` 
installation switch. It apparently does
             # not modify the meaning of `install_requires` to include also 
pre-releases, so we need to
             # modify our internal provider and airflow package version 
references to include all pre-releases
diff --git a/scripts/in_container/run_generate_constraints.py 
b/scripts/in_container/run_generate_constraints.py
index 9a77b17814..0d84c16ac3 100755
--- a/scripts/in_container/run_generate_constraints.py
+++ b/scripts/in_container/run_generate_constraints.py
@@ -109,6 +109,7 @@ class ConfigParams:
     github_actions: bool
     eager_upgrade_additional_requirements: str
     python: str
+    use_uv: bool
 
     @cached_property
     def constraints_dir(self) -> Path:
@@ -128,22 +129,63 @@ class ConfigParams:
     def current_constraints_file(self) -> Path:
         return self.constraints_dir / 
f"{self.airflow_constraints_mode}-{self.python}.txt"
 
+    @cached_property
+    def get_freeze_command(self) -> list[str]:
+        if self.use_uv:
+            return ["uv", "pip", "freeze"]
+        else:
+            return ["pip", "freeze"]
 
-def install_local_airflow_with_eager_upgrade(
-    config_params: ConfigParams, eager_upgrade_additional_requirements: str
-) -> None:
+    @cached_property
+    def get_install_command(self) -> list[str]:
+        if self.use_uv:
+            return ["uv", "pip", "install"]
+        else:
+            return ["pip", "install"]
+
+    @cached_property
+    def get_uninstall_command(self) -> list[str]:
+        if self.use_uv:
+            return ["uv", "pip", "uninstall"]
+        else:
+            return ["pip", "uninstall"]
+
+    @cached_property
+    def get_install_args(self) -> list[str]:
+        if self.use_uv:
+            return []
+        else:
+            return ["--root-user-action", "ignore"]
+
+    @cached_property
+    def get_uninstall_args(self) -> list[str]:
+        if self.use_uv:
+            return []
+        else:
+            return ["--root-user-action", "ignore", "--yes"]
+
+    @cached_property
+    def get_resolution_highest_args(self) -> list[str]:
+        if self.use_uv:
+            return ["--resolution", "highest"]
+        else:
+            return ["--upgrade", "--upgrade-strategy", "eager"]
+
+    @cached_property
+    def eager_upgrade_additional_requirements_list(self) -> list[str]:
+        if self.eager_upgrade_additional_requirements:
+            return self.eager_upgrade_additional_requirements.split(" ")
+        return []
+
+
+def install_local_airflow_with_eager_upgrade(config_params: ConfigParams) -> 
None:
     run_command(
         [
-            "pip",
-            "install",
-            "--root-user-action",
-            "ignore",
+            *config_params.get_install_command,
             "-e",
             ".[all-core]",
-            *eager_upgrade_additional_requirements.split(" "),
-            "--upgrade",
-            "--upgrade-strategy",
-            "eager",
+            *config_params.eager_upgrade_additional_requirements_list,
+            *config_params.get_resolution_highest_args,
         ],
         github_actions=config_params.github_actions,
         cwd=AIRFLOW_SOURCE_DIR,
@@ -154,7 +196,7 @@ def install_local_airflow_with_eager_upgrade(
 def freeze_packages_to_file(config_params: ConfigParams, file: TextIO) -> None:
     console.print(f"[bright_blue]Freezing constraints to file: {file.name}")
     result = run_command(
-        ["pip", "freeze"],
+        cmd=config_params.get_freeze_command,
         github_actions=config_params.github_actions,
         text=True,
         check=True,
@@ -239,20 +281,22 @@ def diff_constraints(config_params: ConfigParams) -> None:
 def uninstall_all_packages(config_params: ConfigParams):
     console.print("[bright_blue]Uninstall All PIP packages")
     result = run_command(
-        ["pip", "freeze"],
+        cmd=config_params.get_freeze_command,
         github_actions=config_params.github_actions,
         cwd=AIRFLOW_SOURCE_DIR,
         text=True,
         check=True,
         capture_output=True,
     )
+    # do not remove installer!
+    installer = "uv==" if config_params.use_uv else "pip=="
     all_installed_packages = [
         dep.split("==")[0]
         for dep in result.stdout.strip().split("\n")
-        if not dep.startswith(("apache-airflow", "apache-airflow==", 
"/opt/airflow", "#", "-e"))
+        if not dep.startswith(("apache-airflow", "apache-airflow==", 
"/opt/airflow", "#", "-e", installer))
     ]
     run_command(
-        ["pip", "uninstall", "--root-user-action", "ignore", "-y", 
*all_installed_packages],
+        cmd=[*config_params.get_uninstall_command, *all_installed_packages],
         github_actions=config_params.github_actions,
         cwd=AIRFLOW_SOURCE_DIR,
         text=True,
@@ -314,7 +358,7 @@ def generate_constraints_pypi_providers(config_params: 
ConfigParams) -> None:
                     f"[yellow]Installing {file.name} from local dist folder as 
it is "
                     f"a chicken egg provider"
                 )
-                packages_to_install.append(file.as_posix())
+                packages_to_install.append(f"{provider_package} @ 
file://{file.as_posix()}")
             else:
                 console.print(
                     f"[yellow]Skipping {provider_package} as it is not found 
in dist folder to install."
@@ -329,16 +373,12 @@ def generate_constraints_pypi_providers(config_params: 
ConfigParams) -> None:
             console.print("[yellow]NOK. Skipping.")
     run_command(
         cmd=[
-            "pip",
-            "install",
-            "--root-user-action",
-            "ignore",
+            *config_params.get_install_command,
+            "-e",
             ".[all-core]",
             *packages_to_install,
-            *config_params.eager_upgrade_additional_requirements.split(" "),
-            "--upgrade",
-            "--upgrade-strategy",
-            "eager",
+            *config_params.eager_upgrade_additional_requirements_list,
+            *config_params.get_resolution_highest_args,
         ],
         github_actions=config_params.github_actions,
         check=True,
@@ -358,12 +398,10 @@ def generate_constraints_no_providers(config_params: 
ConfigParams) -> None:
     """
     uninstall_all_packages(config_params)
     console.print(
-        "[bright_blue]Installing airflow with [all-core] extras only with 
eager upgrade in "
+        "[bright_blue]Installing airflow with `all-core` extras only with 
eager upgrade in "
         "installable mode."
     )
-    install_local_airflow_with_eager_upgrade(
-        config_params, config_params.eager_upgrade_additional_requirements
-    )
+    install_local_airflow_with_eager_upgrade(config_params)
     console.print("[success]Installed airflow with [all-core] extras only with 
eager upgrade.")
     with config_params.current_constraints_file.open("w") as constraints_file:
         constraints_file.write(NO_PROVIDERS_CONSTRAINTS_PREFIX)
@@ -404,6 +442,7 @@ ALLOWED_CONSTRAINTS_MODES = ["constraints", 
"constraints-source-providers", "con
 @click.option(
     "--eager-upgrade-additional-requirements",
     envvar="EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS",
+    default="",
     help="Additional requirements to add to eager upgrade",
 )
 @click.option(
@@ -420,6 +459,13 @@ ALLOWED_CONSTRAINTS_MODES = ["constraints", 
"constraints-source-providers", "con
     envvar="PYTHON_MAJOR_MINOR_VERSION",
     help="Python major.minor version",
 )
+@click.option(
+    "--use-uv/--no-use-uv",
+    is_flag=True,
+    default=True,
+    help="Use uv instead of pip as packaging tool.",
+    envvar="USE_UV",
+)
 def generate_constraints(
     airflow_constraints_mode: str,
     chicken_egg_providers: str,
@@ -428,6 +474,7 @@ def generate_constraints(
     eager_upgrade_additional_requirements: str,
     github_actions: bool,
     python: str,
+    use_uv: bool,
 ) -> None:
     config_params = ConfigParams(
         airflow_constraints_mode=airflow_constraints_mode,
@@ -437,6 +484,7 @@ def generate_constraints(
         
eager_upgrade_additional_requirements=eager_upgrade_additional_requirements,
         github_actions=github_actions,
         python=python,
+        use_uv=use_uv,
     )
     if airflow_constraints_mode == "constraints-source-providers":
         generate_constraints_source_providers(config_params)

Reply via email to