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

potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 2527fb0e0935d6bfdb8a78d694e3ec18b742cd69
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri Jan 12 17:39:50 2024 +0100

    Update Airflow release process to include reproducible tarballs (#36744)
    
    Source tarball is the main artifact produced by the release
    process - one that is the "official" release and named like that
    by the Apache Software Foundation.
    
    This PR makes the source tarball generation reproducible - following
    reproducibility of the `.whl` and `sdist` packages.
    
    This change adds:
    
    * vendors-in reproducible.py script that repacks .tar.gz package
      in reproducible way using source-date-epoch as timestamps
    * breeze release-management prepare-airflow-tarball command
    * adds verification of the tarballs to PMC verification process
    * adds --use-local-hatch for package building command to allow for
      faster / non-docker build of packages for PMC verification
    * improves diagnostic output of the release and build commands
    
    (cherry picked from commit 72a571dc6d21d90f92d5ce683a5d40c6a527fcb0)
---
 .rat-excludes                                      |   2 +
 3rd-party-licenses/LICENSE-reproducible.txt        |   8 ++
 BREEZE.rst                                         |  24 ++++
 dev/README_RELEASE_AIRFLOW.md                      |  15 ++-
 .../commands/release_candidate_command.py          | 136 +++++++++++++++------
 .../commands/release_management_commands.py        |  31 ++++-
 .../commands/release_management_commands_config.py |  15 ++-
 .../src/airflow_breeze/utils/reproducible.py       | 135 ++++++++++++++++++++
 images/breeze/output_release-management.svg        |  54 ++++----
 images/breeze/output_release-management.txt        |   2 +-
 ..._release-management_prepare-airflow-package.svg |  28 +++--
 ..._release-management_prepare-airflow-package.txt |   2 +-
 ..._release-management_prepare-airflow-tarball.svg | 106 ++++++++++++++++
 ..._release-management_prepare-airflow-tarball.txt |   1 +
 .../output_setup_check-all-params-in-groups.svg    |  20 +--
 .../output_setup_check-all-params-in-groups.txt    |   2 +-
 .../output_setup_regenerate-command-images.svg     |  46 +++----
 .../output_setup_regenerate-command-images.txt     |   2 +-
 .../in_container/run_prepare_airflow_packages.py   |   5 +-
 19 files changed, 514 insertions(+), 120 deletions(-)

diff --git a/.rat-excludes b/.rat-excludes
index 9822c9ac41..6464d827d5 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -132,6 +132,8 @@ scripts/*
 images/*
 dev/*
 chart/*.iml
+out/*
+airflow-build-dockerfile*
 
 # Sha files
 .*sha256
diff --git a/3rd-party-licenses/LICENSE-reproducible.txt 
b/3rd-party-licenses/LICENSE-reproducible.txt
new file mode 100644
index 0000000000..65310b4f85
--- /dev/null
+++ b/3rd-party-licenses/LICENSE-reproducible.txt
@@ -0,0 +1,8 @@
+# Copyright 2013 The Servo Project Developers.
+# Copyright 2017 zerolib Developers.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
diff --git a/BREEZE.rst b/BREEZE.rst
index 61b42c510f..e5a12a8ac9 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -1981,6 +1981,30 @@ default is to build ``both`` type of packages ``sdist`` 
and ``wheel``.
   :alt: Breeze release-management prepare-airflow-package
 
 
+Preparing airflow tarball
+"""""""""""""""""""""""""
+
+You can prepare airflow source tarball using Breeze:
+
+.. code-block:: bash
+
+     breeze release-management prepare-airflow-tarball
+
+This prepares airflow -source.tar.gz package in the dist folder.
+
+You must specify ``--version`` flag which is a pre-release version of Airflow 
you are preparing the
+tarball for.
+
+.. code-block:: bash
+
+     breeze release-management prepare-airflow-tarball --version 2.8.0rc1
+
+.. image:: 
./images/breeze/output_release-management_prepare-airflow-tarball.svg
+  :target: 
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_release-management_prepare-airflow-tarball.svg
+  :width: 100%
+  :alt: Breeze release-management prepare-airflow-tarball
+
+
 Start minor branch of Airflow
 """""""""""""""""""""""""""""
 
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 50ee3b280d..22013c90db 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -585,16 +585,23 @@ Airflow supports reproducible builds, which means that 
the packages prepared fro
 produce binary identical packages in reproducible way. You should check if the 
packages can be
 binary-reproduced when built from the sources.
 
-Checkout airflow sources and build packages in dist folder:
+Checkout airflow sources and build packages in dist folder (replace X.Y.Zrc1 
with the version
+you are checking):
 
 ```shell script
-git checkout X.Y.Zrc1
+VERSION=X.Y.Zrc1
+git checkout ${VERSION}
 export AIRFLOW_REPO_ROOT=$(pwd)
 rm -rf dist/*
-breeze release-management prepare-airflow-package --package-format both
+breeze release-management prepare-airflow-tarball --version ${VERSION}
+breeze release-management prepare-airflow-package --package-format both 
--use-local-hatch
 ```
 
-That should produce `.whl` and `.tar.gz` packages in dist folder.
+Note that you need to have `hatch` installed in order to build the packages 
with the last command.
+If you do not have `hatch`, you can remove the `--use-local-hatch` flag and it 
will build and use
+docker image that has `hatch` and other necessary tools installed.
+
+That should produce `-source.tar.gz` tarball of sources and  `.whl`, `.tar.gz` 
packages in dist folder.
 
 Change to the directory where you have the packages from svn:
 
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py 
b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
index 09cc67c226..11cba8d9f5 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -17,6 +17,7 @@
 from __future__ import annotations
 
 import os
+import shutil
 
 import click
 
@@ -25,6 +26,7 @@ from airflow_breeze.commands.release_management_group import 
release_management
 from airflow_breeze.utils.confirm import confirm_action
 from airflow_breeze.utils.console import console_print
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+from airflow_breeze.utils.reproducible import archive_deterministically, 
get_source_date_epoch
 from airflow_breeze.utils.run_utils import run_command
 
 CI = os.environ.get("CI")
@@ -59,21 +61,30 @@ def merge_pr(version_branch):
 def git_tag(version):
     if confirm_action(f"Tag {version}?"):
         run_command(["git", "tag", "-s", f"{version}", "-m", f"Apache Airflow 
{version}"], check=True)
-        console_print("Tagged")
+        console_print("[success]Tagged")
 
 
 def git_clean():
     if confirm_action("Clean git repo?"):
         run_command(["breeze", "ci", "fix-ownership"], 
dry_run_override=DRY_RUN, check=True)
         run_command(["git", "clean", "-fxd"], dry_run_override=DRY_RUN, 
check=True)
-        console_print("Git repo cleaned")
+        console_print("[success]Git repo cleaned")
 
 
-def tarball_release(version, version_without_rc):
-    if confirm_action("Create tarball?"):
-        run_command(["rm", "-rf", "dist"], check=True)
+DIST_DIR = AIRFLOW_SOURCES_ROOT / "dist"
+OUT_DIR = AIRFLOW_SOURCES_ROOT / "out"
+REPRODUCIBLE_DIR = OUT_DIR / "reproducible"
+
 
-        run_command(["mkdir", "dist"], check=True)
+def tarball_release(version: str, version_without_rc: str, source_date_epoch: 
int):
+    if confirm_action("Create tarball?"):
+        console_print(f"[info]Creating tarball for Airflow {version}")
+        shutil.rmtree(OUT_DIR, ignore_errors=True)
+        DIST_DIR.mkdir(exist_ok=True)
+        OUT_DIR.mkdir(exist_ok=True)
+        REPRODUCIBLE_DIR.mkdir(exist_ok=True)
+        archive_name = f"apache-airflow-{version_without_rc}-source.tar.gz"
+        temporary_archive = OUT_DIR / archive_name
         run_command(
             [
                 "git",
@@ -82,19 +93,48 @@ def tarball_release(version, version_without_rc):
                 f"{version}",
                 f"--prefix=apache-airflow-{version_without_rc}/",
                 "-o",
-                f"dist/apache-airflow-{version_without_rc}-source.tar.gz",
+                temporary_archive.as_posix(),
             ],
             check=True,
         )
-        console_print("Tarball created")
+        run_command(
+            [
+                "tar",
+                "-xf",
+                temporary_archive.as_posix(),
+                "-C",
+                REPRODUCIBLE_DIR.as_posix(),
+                "--strip",
+                "1",
+            ]
+        )
+        final_archive = DIST_DIR / archive_name
+        archive_deterministically(
+            dir_to_archive=REPRODUCIBLE_DIR.as_posix(),
+            dest_archive=final_archive.as_posix(),
+            prepend_path=None,
+            timestamp=source_date_epoch,
+        )
+        console_print(f"[success]Tarball created in {final_archive}")
 
 
-def create_artifacts_with_sdist():
-    run_command(["hatch", "build", "-t", "sdist", "-t", "wheel"], check=True)
-    console_print("Artifacts created")
+def create_artifacts_with_hatch(source_date_epoch: int):
+    console_print("[info]Creating artifacts with hatch")
+    shutil.rmtree(DIST_DIR, ignore_errors=True)
+    DIST_DIR.mkdir(exist_ok=True)
+    env_copy = os.environ.copy()
+    env_copy["SOURCE_DATE_EPOCH"] = str(source_date_epoch)
+    run_command(
+        ["hatch", "build", "-c", "-t", "custom", "-t", "sdist", "-t", 
"wheel"], check=True, env=env_copy
+    )
+    console_print("[success]Successfully prepared Airflow packages:")
+    for file in sorted(DIST_DIR.glob("apache_airflow*")):
+        console_print(print(file.name))
+    console_print()
 
 
-def create_artifacts_with_breeze():
+def create_artifacts_with_docker():
+    console_print("[info]Creating artifacts with docker")
     run_command(
         [
             "breeze",
@@ -105,14 +145,14 @@ def create_artifacts_with_breeze():
         ],
         check=True,
     )
-    console_print("Artifacts created")
+    console_print("[success]Artifacts created")
 
 
 def sign_the_release(repo_root):
     if confirm_action("Do you want to sign the release?"):
         os.chdir(f"{repo_root}/dist")
         run_command("./../dev/sign.sh *", dry_run_override=DRY_RUN, 
check=True, shell=True)
-        console_print("Release signed")
+        console_print("[success]Release signed")
 
 
 def tag_and_push_constraints(version, version_branch):
@@ -135,7 +175,7 @@ def tag_and_push_constraints(version, version_branch):
         run_command(
             ["git", "push", "origin", "tag", f"constraints-{version}"], 
dry_run_override=DRY_RUN, check=True
         )
-        console_print("Constraints tagged and pushed")
+        console_print("[success]Constraints tagged and pushed")
 
 
 def clone_asf_repo(version, repo_root):
@@ -146,7 +186,7 @@ def clone_asf_repo(version, repo_root):
             check=True,
         )
         run_command(["svn", "update", "--set-depth=infinity", 
"asf-dist/dev/airflow"], check=True)
-        console_print("Cloned ASF repo successfully")
+        console_print("[success]Cloned ASF repo successfully")
 
 
 def move_artifacts_to_svn(version, repo_root):
@@ -154,7 +194,7 @@ def move_artifacts_to_svn(version, repo_root):
         os.chdir(f"{repo_root}/asf-dist/dev/airflow")
         run_command(["svn", "mkdir", f"{version}"], dry_run_override=DRY_RUN, 
check=True)
         run_command(f"mv {repo_root}/dist/* {version}/", 
dry_run_override=DRY_RUN, check=True, shell=True)
-        console_print("Moved artifacts to SVN:")
+        console_print("[success]Moved artifacts to SVN:")
         run_command(["ls"], dry_run_override=DRY_RUN)
 
 
@@ -171,7 +211,7 @@ def push_artifacts_to_asf_repo(version, repo_root):
             dry_run_override=DRY_RUN,
             check=True,
         )
-        console_print("Files pushed to svn")
+        console_print("[success]Files pushed to svn")
 
 
 def delete_asf_repo(repo_root):
@@ -182,7 +222,7 @@ def delete_asf_repo(repo_root):
 
 def prepare_pypi_packages(version, version_suffix, repo_root):
     if confirm_action("Prepare pypi packages?"):
-        console_print("Preparing PyPI packages")
+        console_print("[info]Preparing PyPI packages")
         os.chdir(repo_root)
         run_command(["git", "checkout", f"{version}"], 
dry_run_override=DRY_RUN, check=True)
         run_command(
@@ -198,13 +238,13 @@ def prepare_pypi_packages(version, version_suffix, 
repo_root):
             check=True,
         )
         run_command(["twine", "check", "dist/*"], check=True)
-        console_print("PyPI packages prepared")
+        console_print("[success]PyPI packages prepared")
 
 
 def push_packages_to_pypi(version):
     if confirm_action("Do you want to push packages to production PyPI?"):
         run_command(["twine", "upload", "-r", "pypi", "dist/*"], 
dry_run_override=DRY_RUN, check=True)
-        console_print("Packages pushed to production PyPI")
+        console_print("[success]Packages pushed to production PyPI")
         console_print(
             "Again, confirm that the package is available here: 
https://pypi.python.org/pypi/apache-airflow";
         )
@@ -240,7 +280,7 @@ def push_release_candidate_tag_to_github(version):
         )
         confirm_action(f"Confirm that {version} is pushed to PyPI(not PyPI 
test). Is it pushed?", abort=True)
         run_command(["git", "push", "origin", "tag", f"{version}"], 
dry_run_override=DRY_RUN, check=True)
-        console_print("Release candidate tag pushed to GitHub")
+        console_print("[success]Release candidate tag pushed to GitHub")
 
 
 def create_issue_for_testing(version, previous_version, github_token):
@@ -293,10 +333,31 @@ def remove_old_releases(version, repo_root):
                 dry_run_override=DRY_RUN,
                 check=True,
             )
-
+    console_print("[success]Old releases removed")
     os.chdir(repo_root)
 
 
+@release_management.command(
+    name="prepare-airflow-tarball",
+    help="Prepare airflow's source tarball.",
+)
[email protected](
+    "--version", required=True, help="The release candidate version e.g. 
2.4.3rc1", envvar="VERSION"
+)
+def prepare_airflow_tarball(version: str):
+    from packaging.version import Version
+
+    airflow_version = Version(version)
+    if not airflow_version.is_prerelease:
+        exit("--version value must be a pre-release")
+    source_date_epoch = get_source_date_epoch()
+    version_without_rc = airflow_version.base_version
+    # Create the tarball
+    tarball_release(
+        version=version, version_without_rc=version_without_rc, 
source_date_epoch=source_date_epoch
+    )
+
+
 @release_management.command(
     name="start-rc-process",
     short_help="Start RC process",
@@ -311,7 +372,8 @@ def remove_old_releases(version, repo_root):
 def publish_release_candidate(version, previous_version, github_token):
     from packaging.version import Version
 
-    if not Version(version).is_prerelease:
+    airflow_version = Version(version)
+    if not airflow_version.is_prerelease:
         exit("--version value must be a pre-release")
     if Version(previous_version).is_prerelease:
         exit("--previous-version value must be a release not a pre-release")
@@ -320,9 +382,10 @@ def publish_release_candidate(version, previous_version, 
github_token):
         if not github_token:
             console_print("GITHUB_TOKEN is not set! Issue generation will 
fail.")
             confirm_action("Do you want to continue?", abort=True)
-    version_suffix = version[5:]
-    version_branch = version[:3].replace(".", "-")
-    version_without_rc = version[:5]
+
+    version_suffix = airflow_version.pre[0] + str(airflow_version.pre[1])
+    version_branch = str(airflow_version.release[0]) + "-" + 
str(airflow_version.release[1])
+    version_without_rc = airflow_version.base_version
     os.chdir(AIRFLOW_SOURCES_ROOT)
     airflow_repo_root = os.getcwd()
 
@@ -343,20 +406,21 @@ def publish_release_candidate(version, previous_version, 
github_token):
     confirm_action("Pushes will be made to origin. Do you want to continue?", 
abort=True)
     # Merge the sync PR
     merge_pr(version_branch)
-
-    # Tag & clean the repo
+    #
+    # # Tag & clean the repo
     git_tag(version)
     git_clean()
-    # Build the latest image
-    if confirm_action("Build latest breeze image?"):
-        run_command(["breeze", "ci-image", "build", "--python", "3.8"], 
dry_run_override=DRY_RUN, check=True)
+    source_date_epoch = get_source_date_epoch()
+    shutil.rmtree(DIST_DIR, ignore_errors=True)
     # Create the tarball
-    tarball_release(version, version_without_rc)
+    tarball_release(
+        version=version, version_without_rc=version_without_rc, 
source_date_epoch=source_date_epoch
+    )
     # Create the artifacts
-    if confirm_action("Use breeze to create artifacts?"):
-        create_artifacts_with_breeze()
+    if confirm_action("Use docker to create artifacts?"):
+        create_artifacts_with_docker()
     elif confirm_action("Use hatch to create artifacts?"):
-        create_artifacts_with_sdist()
+        create_artifacts_with_hatch()
     # Sign the release
     sign_the_release(airflow_repo_root)
     # Tag and push constraints
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 ca2041bd94..c19e9890bc 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -142,6 +142,7 @@ from airflow_breeze.utils.provider_dependencies import (
     get_related_providers,
 )
 from airflow_breeze.utils.python_versions import get_python_version_list
+from airflow_breeze.utils.reproducible import get_source_date_epoch
 from airflow_breeze.utils.run_utils import (
     run_command,
 )
@@ -282,6 +283,11 @@ AIRFLOW_BUILD_DOCKERFILE_IGNORE_PATH = 
AIRFLOW_SOURCES_ROOT / "airflow-build-doc
     name="prepare-airflow-package",
     help="Prepare sdist/whl package of Airflow.",
 )
[email protected](
+    "--use-local-hatch",
+    is_flag=True,
+    help="Use local hatch instead of docker to build the package. You need to 
have hatch installed.",
+)
 @option_package_format
 @option_version_suffix_for_pypi
 @option_verbose
@@ -289,10 +295,30 @@ AIRFLOW_BUILD_DOCKERFILE_IGNORE_PATH = 
AIRFLOW_SOURCES_ROOT / "airflow-build-doc
 def prepare_airflow_packages(
     package_format: str,
     version_suffix_for_pypi: str,
+    use_local_hatch: bool,
 ):
     perform_environment_checks()
     fix_ownership_using_docker()
     cleanup_python_generated_files()
+    source_date_epoch = get_source_date_epoch()
+    if use_local_hatch:
+        hatch_build_command = ["hatch", "build", "-c", "-t", "custom"]
+        if package_format in ["sdist", "both"]:
+            hatch_build_command.extend(["-t", "sdist"])
+        if package_format in ["wheel", "both"]:
+            hatch_build_command.extend(["-t", "wheel"])
+        env_copy = os.environ.copy()
+        env_copy["SOURCE_DATE_EPOCH"] = str(source_date_epoch)
+        run_command(
+            hatch_build_command,
+            check=True,
+            env=env_copy,
+        )
+        get_console().print("[success]Successfully prepared Airflow packages:")
+        for file in sorted(DIST_DIR.glob("apache_airflow*")):
+            get_console().print(file.name)
+        get_console().print()
+        return
     # This is security feature.
     #
     # Building the image needed to build airflow package including .git 
directory
@@ -350,7 +376,10 @@ def prepare_airflow_packages(
     # Copy all files in the dist directory in container to the host dist 
directory (note '/.' in SRC)
     run_command(["docker", "cp", f"{container_id}:/opt/airflow/dist/.", 
"./dist"], check=True)
     run_command(["docker", "rm", "--force", container_id], check=True)
-    get_console().print("[success]Successfully prepared Airflow package!\n\n")
+    get_console().print("[success]Successfully prepared Airflow packages:")
+    for file in sorted(DIST_DIR.glob("apache_airflow*")):
+        get_console().print(file.name)
+    get_console().print()
 
 
 def provider_action_summary(description: str, message_type: MessageType, 
packages: list[str]):
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 e6ddec7e16..b0b1bb96e0 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
@@ -19,8 +19,9 @@ from __future__ import annotations
 RELEASE_AIRFLOW_COMMANDS: dict[str, str | list[str]] = {
     "name": "Airflow release commands",
     "commands": [
-        "prepare-airflow-package",
         "create-minor-branch",
+        "prepare-airflow-package",
+        "prepare-airflow-tarball",
         "start-rc-process",
         "start-release",
         "release-prod-images",
@@ -43,9 +44,10 @@ RELEASE_PROVIDERS_COMMANDS: dict[str, str | list[str]] = {
 RELEASE_OTHER_COMMANDS: dict[str, str | list[str]] = {
     "name": "Other release commands",
     "commands": [
+        "add-back-references",
         "publish-docs",
         "generate-constraints",
-        "add-back-references",
+        "update-constraints",
     ],
 }
 
@@ -55,10 +57,19 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str 
| list[str]]]] = {
             "name": "Package flags",
             "options": [
                 "--package-format",
+                "--use-local-hatch",
                 "--version-suffix-for-pypi",
             ],
         }
     ],
+    "breeze release-management prepare-airflow-tarball": [
+        {
+            "name": "Package flags",
+            "options": [
+                "--version",
+            ],
+        }
+    ],
     "breeze release-management verify-provider-packages": [
         {
             "name": "Provider verification flags",
diff --git a/dev/breeze/src/airflow_breeze/utils/reproducible.py 
b/dev/breeze/src/airflow_breeze/utils/reproducible.py
new file mode 100644
index 0000000000..a85d871a3c
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/utils/reproducible.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Copyright 2013 The Servo Project Developers.
+# Copyright 2017 zerolib Developers.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+# This command is a largely vendored-in script from
+# https://github.com/MuxZeroNet/reproducible/blob/master/reproducible.py
+from __future__ import annotations
+
+import contextlib
+import gzip
+import itertools
+import locale
+import os
+import tarfile
+from argparse import ArgumentParser
+
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+
+
+def get_source_date_epoch():
+    import yaml
+
+    reproducible_build_yaml = AIRFLOW_SOURCES_ROOT / "airflow" / 
"reproducible_build.yaml"
+    reproducible_build_dict = 
yaml.safe_load(reproducible_build_yaml.read_text())
+    source_date_epoch: int = reproducible_build_dict["source-date-epoch"]
+    return source_date_epoch
+
+
[email protected]
+def cd(new_path):
+    """Context manager for changing the current working directory"""
+    previous_path = os.getcwd()
+    try:
+        os.chdir(new_path)
+        yield
+    finally:
+        os.chdir(previous_path)
+
+
[email protected]
+def setlocale(name):
+    """Context manager for changing the current locale"""
+    saved_locale = locale.setlocale(locale.LC_ALL)
+    try:
+        yield locale.setlocale(locale.LC_ALL, name)
+    finally:
+        locale.setlocale(locale.LC_ALL, saved_locale)
+
+
+def archive_deterministically(dir_to_archive, dest_archive, prepend_path=None, 
timestamp=0):
+    """Create a .tar.gz archive in a deterministic (reproducible) manner.
+
+    See https://reproducible-builds.org/docs/archives/ for more details."""
+
+    def reset(tarinfo):
+        """Helper to reset owner/group and modification time for tar entries"""
+        tarinfo.uid = tarinfo.gid = 0
+        tarinfo.uname = tarinfo.gname = "root"
+        tarinfo.mtime = timestamp
+        return tarinfo
+
+    dest_archive = os.path.abspath(dest_archive)
+    with cd(dir_to_archive):
+        current_dir = "."
+        file_list = [current_dir]
+        for root, dirs, files in os.walk(current_dir):
+            for name in itertools.chain(dirs, files):
+                file_list.append(os.path.join(root, name))
+
+        # Sort file entries with the fixed locale
+        with setlocale("C"):
+            file_list.sort(key=locale.strxfrm)
+
+        # Use a temporary file and atomic rename to avoid partially-formed
+        # packaging (in case of exceptional situations like running out of 
disk space).
+        temp_file = f"{dest_archive}.temp~"
+        with os.fdopen(os.open(temp_file, os.O_WRONLY | os.O_CREAT, 0o644), 
"wb") as out_file:
+            with gzip.GzipFile("wb", fileobj=out_file, mtime=0) as gzip_file:
+                with tarfile.open(fileobj=gzip_file, mode="w:") as tar_file:
+                    for entry in file_list:
+                        arcname = entry
+                        if prepend_path is not None:
+                            arcname = 
os.path.normpath(os.path.join(prepend_path, arcname))
+                        tar_file.add(entry, filter=reset, recursive=False, 
arcname=arcname)
+        os.rename(temp_file, dest_archive)
+
+
+def main():
+    parser = ArgumentParser()
+    parser.add_argument("-d", "--dir", help="directory to archive")
+    parser.add_argument("-o", "--out", help="archive destination")
+    parser.add_argument("-p", "--prepend", help="prepend path")
+    parser.add_argument(
+        "-t", "--timestamp", help="timestamp of files", type=int, 
default=get_source_date_epoch()
+    )
+
+    args = parser.parse_args()
+
+    if not args.dir or not args.out:
+        error = (
+            "You should provide a directory to archive, and the "
+            f"archive file name, not {repr((args.dir, args.out))}"
+        )
+        raise ValueError(error)
+
+    archive_deterministically(args.dir, args.out, args.prepend, args.timestamp)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/images/breeze/output_release-management.svg 
b/images/breeze/output_release-management.svg
index f853a75b69..745601db24 100644
--- a/images/breeze/output_release-management.svg
+++ b/images/breeze/output_release-management.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 806.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -42,7 +42,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="779.8" />
+      <rect x="0" y="0" width="1463.0" height="755.4" />
     </clipPath>
     <clipPath id="breeze-release-management-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -134,12 +134,9 @@
 <clipPath id="breeze-release-management-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="breeze-release-management-line-30">
-    <rect x="0" y="733.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="828.8" rx="8"/><text 
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;release-management</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="804.4" rx="8"/><text 
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;release-management</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -158,29 +155,28 @@
 </text><text class="breeze-release-management-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-6)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-line-6)">-</text><text 
class="breeze-release-management-r4" x="36.6" y="166.4" textLength="61" 
clip-path="url(#breeze-release-management-line-6)">-help</text><text 
class="breeze-release-management-r6" x="122" y="166.4" textLeng [...]
 </text><text class="breeze-release-management-r5" x="0" y="190.8" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-line-7)">
 </text><text class="breeze-release-management-r5" x="0" y="215.2" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-8)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="215.2" textLength="317.2" 
clip-path="url(#breeze-release-management-line-8)">&#160;Airflow&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="341.6" y="215.2" textLength="1098" 
clip-path="url(#breeze-release-management-line-8)">───────────────────────────────
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-9)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="239.6" textLength="353.8" 
clip-path="url(#breeze-release-management-line-9)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="239.6" textLength="1037" 
clip-path="url(#breeze-release-management-line-9)">Prepare&#160;sdist/ [...]
-</text><text class="breeze-release-management-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-10)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="264" textLength="353.8" 
clip-path="url(#breeze-release-management-line-10)">create-minor-branch&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="264" textLength="1037" 
clip-path="url(#breeze-release-management-line-10)">Cr [...]
-</text><text class="breeze-release-management-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-11)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="288.4" textLength="353.8" 
clip-path="url(#breeze-release-management-line-11)">start-rc-process&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="288.4" textLength="1037" 
clip-path="url(#breeze-release-ma [...]
-</text><text class="breeze-release-management-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-12)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="312.8" textLength="353.8" 
clip-path="url(#breeze-release-management-line-12)">start-release&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="312.8" textLength="1037" 
clip-path="url(#br [...]
-</text><text class="breeze-release-management-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-13)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="337.2" textLength="353.8" 
clip-path="url(#breeze-release-management-line-13)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="337.2" textLength="1037" 
clip-path="url(#breeze-release-management-line-1 [...]
-</text><text class="breeze-release-management-r5" x="0" y="361.6" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-line-14)">
-</text><text class="breeze-release-management-r5" x="0" y="386" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-15)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="386" textLength="341.6" 
clip-path="url(#breeze-release-management-line-15)">&#160;Providers&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="366" y="386" textLength="1073.6" 
clip-path="url(#breeze-release-management-line-15)">────────────────────────────────
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-16)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="410.4" textLength="439.2" 
clip-path="url(#breeze-release-management-line-16)">prepare-provider-documentation&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="410.4" textLength="951.6" 
clip-path="url(#breeze-release-management-line-16)">Prepare&#1 [...]
-</text><text class="breeze-release-management-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-17)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="434.8" textLength="439.2" 
clip-path="url(#breeze-release-management-line-17)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="434.8" textLength="951.6" 
clip-path="url(#breeze-release-manage [...]
-</text><text class="breeze-release-management-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-18)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="459.2" textLength="439.2" 
clip-path="url(#breeze-release-management-line-18)">install-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="459.2" textLength="951.6" 
clip-path="url(#breeze-release-manage [...]
-</text><text class="breeze-release-management-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-19)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="483.6" textLength="439.2" 
clip-path="url(#breeze-release-management-line-19)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="483.6" textLength="951.6" 
clip-path="url(#breeze-release-m [...]
-</text><text class="breeze-release-management-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-20)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="508" textLength="439.2" 
clip-path="url(#breeze-release-management-line-20)">generate-providers-metadata&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="508" textLength="951.6" 
clip-path="url(#breeze-release-management-line-20)">G [...]
-</text><text class="breeze-release-management-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-21)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="532.4" textLength="439.2" 
clip-path="url(#breeze-release-management-line-21)">generate-issue-content-providers&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="532.4" textLength="951.6" 
clip-path="url(#breeze-release-management-line-21)">Generates&#160;conte [...]
-</text><text class="breeze-release-management-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-22)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="556.8" textLength="439.2" 
clip-path="url(#breeze-release-management-line-22)">clean-old-provider-artifacts&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="556.8" textLength="951.6" 
clip-path="url(#breeze-release-management-line-22)"> [...]
-</text><text class="breeze-release-management-r5" x="0" y="581.2" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-line-23)">
-</text><text class="breeze-release-management-r5" x="0" y="605.6" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-24)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="605.6" textLength="292.8" 
clip-path="url(#breeze-release-management-line-24)">&#160;Other&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="317.2" y="605.6" textLength="1122.4" 
clip-path="url(#breeze-release-management-line-24)">────────────────────────────
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-25)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="630" textLength="280.6" 
clip-path="url(#breeze-release-management-line-25)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="630" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-25)">C [...]
-</text><text class="breeze-release-management-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-26)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="654.4" textLength="280.6" 
clip-path="url(#breeze-release-management-line-26)">generate-constraints&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="654.4" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-26)">Generates&#160;pinned&#160;constrai
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-27)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="678.8" textLength="280.6" 
clip-path="url(#breeze-release-management-line-27)">add-back-references&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="678.8" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-27)">Command&#160;to&#160;add&#160;
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="703.2" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="703.2" textLength="12.2" 
clip-path="url(#breeze-release-management-line-28)">
-</text><text class="breeze-release-management-r5" x="0" y="727.6" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-29)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="727.6" textLength="122" 
clip-path="url(#breeze-release-management-line-29)">&#160;Commands&#160;</text><text
 class="breeze-release-management-r5" x="146.4" y="727.6" textLength="1293.2" 
clip-path="url(#breeze-release-management-line-29)">──────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-30)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="752" textLength="390.4" 
clip-path="url(#breeze-release-management-line-30)">update-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="752" textLength="1000.4" 
clip-path="url(#breeze-releas [...]
-</text><text class="breeze-release-management-r5" x="0" y="776.4" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="776.4" textLength="12.2" 
clip-path="url(#breeze-release-management-line-31)">
+</text><text class="breeze-release-management-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-9)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="239.6" textLength="353.8" 
clip-path="url(#breeze-release-management-line-9)">create-minor-branch&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="239.6" textLength="1037" 
clip-path="url(#breeze-release-management-line-9)" [...]
+</text><text class="breeze-release-management-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-10)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="264" textLength="353.8" 
clip-path="url(#breeze-release-management-line-10)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="264" textLength="1037" 
clip-path="url(#breeze-release-management-line-10)">Prepare&#160;sdist/whl [...]
+</text><text class="breeze-release-management-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-11)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="288.4" textLength="353.8" 
clip-path="url(#breeze-release-management-line-11)">prepare-airflow-tarball&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="288.4" textLength="1037" 
clip-path="url(#breeze-release-management-line-11)">Prepare&#160;air [...]
+</text><text class="breeze-release-management-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-12)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="312.8" textLength="353.8" 
clip-path="url(#breeze-release-management-line-12)">start-rc-process&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="312.8" textLength="1037" 
clip-path="url(#breeze-release-ma [...]
+</text><text class="breeze-release-management-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-13)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="337.2" textLength="353.8" 
clip-path="url(#breeze-release-management-line-13)">start-release&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="337.2" textLength="1037" 
clip-path="url(#br [...]
+</text><text class="breeze-release-management-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-14)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="361.6" textLength="353.8" 
clip-path="url(#breeze-release-management-line-14)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="402.6" y="361.6" textLength="1037" 
clip-path="url(#breeze-release-management-line-1 [...]
+</text><text class="breeze-release-management-r5" x="0" y="386" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-line-15)">
+</text><text class="breeze-release-management-r5" x="0" y="410.4" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-16)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="410.4" textLength="341.6" 
clip-path="url(#breeze-release-management-line-16)">&#160;Providers&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="366" y="410.4" textLength="1073.6" 
clip-path="url(#breeze-release-management-line-16)">────────────────────────── 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-17)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="434.8" textLength="439.2" 
clip-path="url(#breeze-release-management-line-17)">prepare-provider-documentation&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="434.8" textLength="951.6" 
clip-path="url(#breeze-release-management-line-17)">Prepare&#1 [...]
+</text><text class="breeze-release-management-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-18)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="459.2" textLength="439.2" 
clip-path="url(#breeze-release-management-line-18)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="459.2" textLength="951.6" 
clip-path="url(#breeze-release-manage [...]
+</text><text class="breeze-release-management-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-19)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="483.6" textLength="439.2" 
clip-path="url(#breeze-release-management-line-19)">install-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="483.6" textLength="951.6" 
clip-path="url(#breeze-release-manage [...]
+</text><text class="breeze-release-management-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-20)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="508" textLength="439.2" 
clip-path="url(#breeze-release-management-line-20)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="508" textLength="951.6" 
clip-path="url(#breeze-release-managem [...]
+</text><text class="breeze-release-management-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-21)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="532.4" textLength="439.2" 
clip-path="url(#breeze-release-management-line-21)">generate-providers-metadata&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="532.4" textLength="951.6" 
clip-path="url(#breeze-release-management-line- [...]
+</text><text class="breeze-release-management-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-22)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="556.8" textLength="439.2" 
clip-path="url(#breeze-release-management-line-22)">generate-issue-content-providers&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="556.8" textLength="951.6" 
clip-path="url(#breeze-release-management-line-22)">Generates&#160;conte [...]
+</text><text class="breeze-release-management-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-23)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="581.2" textLength="439.2" 
clip-path="url(#breeze-release-management-line-23)">clean-old-provider-artifacts&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="488" y="581.2" textLength="951.6" 
clip-path="url(#breeze-release-management-line-23)"> [...]
+</text><text class="breeze-release-management-r5" x="0" y="605.6" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="605.6" textLength="12.2" 
clip-path="url(#breeze-release-management-line-24)">
+</text><text class="breeze-release-management-r5" x="0" y="630" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-25)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="630" textLength="292.8" 
clip-path="url(#breeze-release-management-line-25)">&#160;Other&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="317.2" y="630" textLength="1122.4" 
clip-path="url(#breeze-release-management-line-25)">──────────────────────────────────
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-26)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="654.4" textLength="280.6" 
clip-path="url(#breeze-release-management-line-26)">add-back-references&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="654.4" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-26)">Command&#160;to&#160;add&#160;
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-27)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="678.8" textLength="280.6" 
clip-path="url(#breeze-release-management-line-27)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="678.8" textLength="1110.2" 
clip-path="url(#breeze-release-management-line- [...]
+</text><text class="breeze-release-management-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-28)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="703.2" textLength="280.6" 
clip-path="url(#breeze-release-management-line-28)">generate-constraints&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="703.2" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-28)">Generates&#160;pinned&#160;constrai
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-29)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="727.6" textLength="280.6" 
clip-path="url(#breeze-release-management-line-29)">update-constraints&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="329.4" y="727.6" textLength="1110.2" 
clip-path="url(#breeze-release-management-line-29)">Update&#160;released&#160 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="752" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="752" textLength="12.2" 
clip-path="url(#breeze-release-management-line-30)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management.txt 
b/images/breeze/output_release-management.txt
index a0e84e6bf9..81a7a34a0e 100644
--- a/images/breeze/output_release-management.txt
+++ b/images/breeze/output_release-management.txt
@@ -1 +1 @@
-f4edc0671c6ceb04d81e936f600ba8c4
+531a745e860b739dd3e802e594db6e7e
diff --git 
a/images/breeze/output_release-management_prepare-airflow-package.svg 
b/images/breeze/output_release-management_prepare-airflow-package.svg
index c8490f5700..8ee42db614 100644
--- a/images/breeze/output_release-management_prepare-airflow-package.svg
+++ b/images/breeze/output_release-management_prepare-airflow-package.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 391.59999999999997" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 440.4" 
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-prepare-airflow-package-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="340.59999999999997" />
+      <rect x="0" y="0" width="1463.0" height="389.4" />
     </clipPath>
     <clipPath id="breeze-release-management-prepare-airflow-package-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -84,9 +84,15 @@
 <clipPath id="breeze-release-management-prepare-airflow-package-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-package-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-package-line-14">
+    <rect x="0" y="343.1" 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="389.6" rx="8"/><text 
class="breeze-release-management-prepare-airflow-package-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;prepare-airflow-package</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="438.4" rx="8"/><text 
class="breeze-release-management-prepare-airflow-package-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;prepare-airflow-package</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -103,13 +109,15 @@
 </text><text class="breeze-release-management-prepare-airflow-package-r1" 
x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-4)">
 </text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-5)">╭─</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="24.4" y="142" 
textLength="183" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-5)">&#160;Package&#160;flags&#160;</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="207.4" y="142" 
text [...]
 </text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-6)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-6)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="166.4" textLength="97.6" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="190.8" textLength="97.6" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="215.2" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-package-r1" x="1464" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="239.6" textLength="24.4" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">╭─</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="24.4" 
y="239.6" textLength="195.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="219.6" y="23 
[...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" y="264" 
textLength="97.6" clip-path="url [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="288.4" textLength="48.8" clip-pat [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="312.8" textLength="61" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="337.2" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-package-r1" x="1464" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="190.8" textLength="48.8" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r1" x="378.2" 
y="215.2" textLength="1061.4" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">installed.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="239.6" textLength="97.6" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="264" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-package-r1" x="1464" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="288.4" textLength="24.4" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">╭─</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="24.4" 
y="288.4" textLength="195.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-prepare-airflow-package-r5" x="219.6" y=" 
[...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="312.8" textLength="97.6" clip-pat [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="337.2" textLength="48.8" clip-pat [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-14)">│</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="24.4" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-14)">-</text><text
 class="breeze-release-management-prepare-airflow-package-r4" x="36.6" 
y="361.6" textLength="61" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5" 
x="0" y="386" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-package-r1" x="1464" y="386" 
textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-package-line-15)">
 </text>
     </g>
     </g>
diff --git 
a/images/breeze/output_release-management_prepare-airflow-package.txt 
b/images/breeze/output_release-management_prepare-airflow-package.txt
index f295947476..315a3f647a 100644
--- a/images/breeze/output_release-management_prepare-airflow-package.txt
+++ b/images/breeze/output_release-management_prepare-airflow-package.txt
@@ -1 +1 @@
-8f786828b9862f9ae63f1b691921979f
+92215dd76f7de9837fa03e88324d4be7
diff --git 
a/images/breeze/output_release-management_prepare-airflow-tarball.svg 
b/images/breeze/output_release-management_prepare-airflow-tarball.svg
new file mode 100644
index 0000000000..5a982d348d
--- /dev/null
+++ b/images/breeze/output_release-management_prepare-airflow-tarball.svg
@@ -0,0 +1,106 @@
+<svg class="rich-terminal" viewBox="0 0 1482 318.4" 
xmlns="http://www.w3.org/2000/svg";>
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2";)
 format("woff2"),
+                
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff";)
 format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2";)
 format("woff2"),
+                
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff";)
 format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .breeze-release-management-prepare-airflow-tarball-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .breeze-release-management-prepare-airflow-tarball-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .breeze-release-management-prepare-airflow-tarball-r1 { fill: #c5c8c6 }
+.breeze-release-management-prepare-airflow-tarball-r2 { fill: #d0b344 }
+.breeze-release-management-prepare-airflow-tarball-r3 { fill: 
#c5c8c6;font-weight: bold }
+.breeze-release-management-prepare-airflow-tarball-r4 { fill: 
#68a0b3;font-weight: bold }
+.breeze-release-management-prepare-airflow-tarball-r5 { fill: #868887 }
+.breeze-release-management-prepare-airflow-tarball-r6 { fill: #cc555a }
+.breeze-release-management-prepare-airflow-tarball-r7 { fill: #8d7b39 }
+.breeze-release-management-prepare-airflow-tarball-r8 { fill: #8a4346 }
+.breeze-release-management-prepare-airflow-tarball-r9 { fill: 
#98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath 
id="breeze-release-management-prepare-airflow-tarball-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="267.4" />
+    </clipPath>
+    <clipPath id="breeze-release-management-prepare-airflow-tarball-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-9">
+    <rect x="0" y="221.1" 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="316.4" rx="8"/><text 
class="breeze-release-management-prepare-airflow-tarball-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;prepare-airflow-tarball</text>
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-clip-terminal)">
+    
+    <g class="breeze-release-management-prepare-airflow-tarball-matrix">
+    <text class="breeze-release-management-prepare-airflow-tarball-r1" 
x="1464" y="20" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-0)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r2" 
x="12.2" y="44.4" textLength="73.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">Usage:</text><text
 class="breeze-release-management-prepare-airflow-tarball-r3" x="97.6" y="44.4" 
textLength="597.8" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">breeze&#160;release-management&#160;prepare-airflow-tarball</text><text
 class="breeze-release-management-prepare-ai [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1" 
x="1464" y="68.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-2)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1" 
x="12.2" y="93.2" textLength="402.6" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">Prepare&#160;airflow&#x27;s&#160;source&#160;tarball.</text><text
 class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="93.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1" 
x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-4)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)">╭─</text><text
 class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" y="142" 
textLength="183" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)">&#160;Package&#160;flags&#160;</text><text
 class="breeze-release-management-prepare-airflow-tarball-r5" x="207.4" y="142" 
text [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">│</text><text
 class="breeze-release-management-prepare-airflow-tarball-r6" x="24.4" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">*</text><text
 class="breeze-release-management-prepare-airflow-tarball-r4" x="61" y="166.4" 
textLength="12.2" clip-path="u [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="190.8" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="215.2" textLength="24.4" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">╭─</text><text
 class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" 
y="215.2" textLength="195.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-prepare-airflow-tarball-r5" x="219.6" y="21 
[...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">│</text><text
 class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">-</text><text
 class="breeze-release-management-prepare-airflow-tarball-r4" x="36.6" 
y="239.6" textLength="61" clip-path="u [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5" 
x="0" y="264" textLength="1464" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="264" 
textLength="12.2" 
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git 
a/images/breeze/output_release-management_prepare-airflow-tarball.txt 
b/images/breeze/output_release-management_prepare-airflow-tarball.txt
new file mode 100644
index 0000000000..12bc4ebe94
--- /dev/null
+++ b/images/breeze/output_release-management_prepare-airflow-tarball.txt
@@ -0,0 +1 @@
+7cf8b45e0b23837e8bf99d5a4907d48c
diff --git a/images/breeze/output_setup_check-all-params-in-groups.svg 
b/images/breeze/output_setup_check-all-params-in-groups.svg
index f8b7ce58c0..05beab1bb3 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -170,16 +170,16 @@
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">release-management:clean-old-provider-artifacts&#160;|&#160;release-management:create-minor-branch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-providers&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tex
 [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:generate-providers-metadata&#160;|&#160;release-management:install-provider-packages&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:prepare-airflow-package&#160;|&#160;release-management:prepare-provider-documentation&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:prepare-provider-packages&#160;|&#160;release-management:publish-docs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:release-prod-images&#160;|&#160;release-management:start-rc-process&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:start-release&#160;|&#160;release-management:update-constraints&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:verify-provider-packages&#160;|&#160;sbom&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;|&#160;setup&#160;|&#160;setup:autocomplete&#160;|&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">setup:check-all-params-in-groups&#160;|&#160;setup:config&#160;|&#160;setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;</text><text
 class="b [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">|&#160;setup:synchronize-local-mounts&#160;|&#160;setup:version&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;static-checks&#160;|&#160;testing&#160;
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">testing:db-tests&#160;|&#160;testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;testing:integration-tests&#160;|&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">testing:non-db-tests&#160;|&#160;testing:tests)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:prepare-airflow-package&#160;|&#160;release-management:prepare-airflow-tarball&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:prepare-provider-documentation&#160;|&#160;release-management:prepare-provider-packages&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 cla [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:publish-docs&#160;|&#160;release-management:release-prod-images&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:start-rc-process&#160;|&#160;release-management:start-release&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:update-constraints&#160;|&#160;release-management:verify-provider-packages&#160;|&#160;sbom&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">sbom:build-all-airflow-images&#160;|&#160;sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;|&#160;&#160;</text><text
 class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">setup&#160;|&#160;setup:autocomplete&#160;|&#160;setup:check-all-params-in-groups&#160;|&#160;setup:config&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;|&#160;setup:synchronize-local-mounts&#160;|&#160;setup:version&#160;|</text><text
 class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">shell&#160;|&#160;start-airflow&#160;|&#160;static-checks&#160;|&#160;testing&#160;|&#160;testing:db-tests&#160;|&#160;testing:docker-compose-tests&#160;|&#160;&#1
 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">testing:helm-tests&#160;|&#160;testing:integration-tests&#160;|&#160;testing:non-db-tests&#160;|&#160;testing:tests)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="678.8" textLength="1464" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="703.2" textLength="24.4" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">╭─</text><text
 class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="703.2" 
textLength="195.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="703.2" 
textLength="1220" clip-path="url(#breeze-se [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">-</text><text 
class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="727.6" 
textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-li 
[...]
diff --git a/images/breeze/output_setup_check-all-params-in-groups.txt 
b/images/breeze/output_setup_check-all-params-in-groups.txt
index a785973bff..243d3eca55 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.txt
+++ b/images/breeze/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-ff7ba7e2ad2a27deacc72227a3584b6b
+69ae9158510708ca0793c715a62368b2
diff --git a/images/breeze/output_setup_regenerate-command-images.svg 
b/images/breeze/output_setup_regenerate-command-images.svg
index 5057857969..fc59c7c211 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.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-setup-regenerate-command-images-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-setup-regenerate-command-images-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -150,9 +150,12 @@
 <clipPath id="breeze-setup-regenerate-command-images-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-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-setup-regenerate-command-images-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;regenerate-command-images</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-setup-regenerate-command-images-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;regenerate-command-images</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -180,24 +183,25 @@
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:clean-old-provider-artifacts&#160;|&#160;release-management:create-minor-branch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</
 [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-providers&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 class="bre [...]
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:generate-providers-metadata&#160;|&#160;release-management:install-provider-packages&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 class="bre [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:prepare-airflow-package&#160;|&#160;release-management:prepare-provider-documentation&#160;|&#160;&#160;&#160;&#160;</text><text
 class="breeze-s [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:prepare-provider-packages&#160;|&#160;release-management:publish-docs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:release-prod-images&#160;|&#160;release-management:start-rc-process&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:start-release&#160;|&#160;release-management:update-constraints&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">release-management:verify-provider-packages&#160;|&#160;sbom&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;|&#160;setup&#160;|&#160;setup:autocomplete&#160;|&#160;&#160;</text><text
 class [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">setup:check-all-params-in-groups&#160;|&#160;setup:config&#160;|&#160;setup:regenerate-command-images&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">setup:self-upgrade&#160;|&#160;setup:synchronize-local-mounts&#160;|&#160;setup:version&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="654.4" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">static-checks&#160;|&#160;testing&#160;|&#160;testing:db-tests&#160;|&#160;testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="678.8" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">testing:integration-tests&#160;|&#160;testing:non-db-tests&#160;|&#160;testing:tests)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="703.2" 
textLength="73.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text 
class="breeze-setup-regenerate-command-images-r1" x="219.6" y="727.6" 
textLength="170.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">together&#160;with&#160;</text><text
 class="breeze-setup-regenerate-command-images-r4" x="390.4" y="727.6" 
textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" 
textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="752" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" 
textLength="24.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">╭─</text><text 
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="776.4" 
textLength="195.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="219.6" y="776.4" 
textLength="1220" clip-path="url(#breeze-setup-r [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="800.8" 
textLength="97.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="825.2" 
textLength="48.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="849.6" 
textLength="61" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)"> [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874" 
textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="874" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:prepare-airflow-package&#160;|&#160;release-management:prepare-airflow-tarball&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:prepare-provider-documentation&#160;|&#160;release-management:prepare-provider-packages&#160;|&#160;&#160;</text><text
 class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:publish-docs&#160;|&#160;release-management:release-prod-images&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:start-rc-process&#160;|&#160;release-management:start-release&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">release-management:update-constraints&#160;|&#160;release-management:verify-provider-packages&#160;|&#160;sbom&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">sbom:build-all-airflow-images&#160;|&#160;sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;</text><text
 class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">|&#160;setup&#160;|&#160;setup:autocomplete&#160;|&#160;setup:check-all-params-in-groups&#160;|&#160;setup:config&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;|&#160;setup:synchronize-local-mounts&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="654.4" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">setup:version&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;static-checks&#160;|&#160;testing&#160;|&#160;testing:db-tests&#160;|&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="678.8" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;testing:integration-tests&#160;|&#160;testing:non-db-tests</text><text
 class="breeze-setup- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="703.2" 
textLength="1220" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">|&#160;testing:tests)&#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-setup-regenerate-command-images-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="727.6" 
textLength="73.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">│</text><text 
class="breeze-setup-regenerate-command-images-r1" x="219.6" y="752" 
textLength="170.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">together&#160;with&#160;</text><text
 class="breeze-setup-regenerate-command-images-r4" x="390.4" y="752" 
textLength="12.2" clip-path="url(#breeze-setup-regenerate-com [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" 
textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" 
textLength="24.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">╭─</text><text 
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="800.8" 
textLength="195.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="219.6" y="800.8" 
textLength="1220" clip-path="url(#breeze-setup-r [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="825.2" 
textLength="97.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="849.6" 
textLength="48.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="874" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">-</text><text 
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="874" 
textLength="61" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">-help< [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="898.4" 
textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_setup_regenerate-command-images.txt 
b/images/breeze/output_setup_regenerate-command-images.txt
index c1fea28696..87d87112ba 100644
--- a/images/breeze/output_setup_regenerate-command-images.txt
+++ b/images/breeze/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-2dd686ef33844512aed7032351111991
+4f1d4b74c81fd81e8c6f32ec137ff480
diff --git a/scripts/in_container/run_prepare_airflow_packages.py 
b/scripts/in_container/run_prepare_airflow_packages.py
index 66aae93ca4..9305d0dbd4 100755
--- a/scripts/in_container/run_prepare_airflow_packages.py
+++ b/scripts/in_container/run_prepare_airflow_packages.py
@@ -77,11 +77,10 @@ def get_current_airflow_version() -> str:
 
 def build_airflow_packages(package_format: str):
     build_command = [sys.executable, "-m", "hatch", "build", "-t", "custom"]
-
-    if package_format in ["both", "wheel"]:
-        build_command.extend(["-t", "wheel"])
     if package_format in ["both", "sdist"]:
         build_command.extend(["-t", "sdist"])
+    if package_format in ["both", "wheel"]:
+        build_command.extend(["-t", "wheel"])
 
     reproducible_date = 
yaml.safe_load(REPRODUCIBLE_BUILD_FILE.read_text())["source-date-epoch"]
 

Reply via email to