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

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


The following commit(s) were added to refs/heads/main by this push:
     new 3fa75e9674 Providers requirements for every python version (#35086)
3fa75e9674 is described below

commit 3fa75e9674574f8b0de8b98f293b21a6ea792eb0
Author: Pierre Jeambrun <pierrejb...@gmail.com>
AuthorDate: Tue Oct 24 16:12:01 2023 +0800

    Providers requirements for every python version (#35086)
    
    * Restructure output directory to handle multiple python versions
    
    * Generate for all historical versions
    
    * Add output to parallel mode
    
    * Split all airflow images building to a separate command
    
    * Allow generating per provider requirements
    
    * Update parameters help description
---
 BREEZE.rst                                         |  12 ++
 .../src/airflow_breeze/commands/sbom_commands.py   | 200 ++++++++++++++++-----
 .../commands/sbom_commands_config.py               |  21 ++-
 dev/breeze/src/airflow_breeze/global_constants.py  |  38 ++++
 dev/breeze/src/airflow_breeze/utils/cdxgen.py      |  96 ++++++----
 images/breeze/output-commands-hash.txt             |  11 +-
 images/breeze/output_sbom.svg                      |  16 +-
 .../output_sbom_build-all-airflow-images.svg       | 156 ++++++++++++++++
 ...output_sbom_generate-providers-requirements.svg |  80 +++++----
 .../output_setup_check-all-params-in-groups.svg    |  10 +-
 .../output_setup_regenerate-command-images.svg     |   2 +-
 11 files changed, 512 insertions(+), 130 deletions(-)

diff --git a/BREEZE.rst b/BREEZE.rst
index 4c3a84ddf4..1ca5386875 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -2284,6 +2284,18 @@ These are all of the available flags for the 
``update-sbom-information`` command
   :width: 100%
   :alt: Breeze update sbom information
 
+Build all airflow images
+.............................
+
+In order to generate providers requirements, we need docker images with all 
airflow versions pre-installed,
+such images are built with the ``build-all-airflow-images`` command.
+This command will build one docker image per python version, with all the 
airflow versions >=2.0.0 compatible.
+
+.. image:: ./images/breeze/output_sbom_build-all-airflow-images.svg.svg
+  :target: 
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_sbom_build-all-airflow-images.svg
+  :width: 100%
+  :alt: Breeze build all airflow images
+
 Generating Provider requirements
 .................................
 
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index c7425de8d0..8fc30faf72 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -18,13 +18,14 @@
 from __future__ import annotations
 
 import json
+import sys
 from pathlib import Path
 
 import click
 
 from airflow_breeze.global_constants import (
+    AIRFLOW_PYTHON_COMPATIBILITY_MATRIX,
     ALL_HISTORICAL_PYTHON_VERSIONS,
-    DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
     PROVIDER_DEPENDENCIES,
 )
 from airflow_breeze.utils.cdxgen import (
@@ -50,8 +51,12 @@ from airflow_breeze.utils.confirm import Answer, user_confirm
 from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.custom_param_types import BetterChoice
 from airflow_breeze.utils.docker_command_utils import 
perform_environment_checks
-from airflow_breeze.utils.github import get_active_airflow_versions
-from airflow_breeze.utils.parallel import ShowLastLineProgressMatcher, 
check_async_run_results, run_with_pool
+from airflow_breeze.utils.parallel import (
+    DockerBuildxProgressMatcher,
+    ShowLastLineProgressMatcher,
+    check_async_run_results,
+    run_with_pool,
+)
 from airflow_breeze.utils.path_utils import AIRFLOW_TMP_DIR_PATH, 
PROVIDER_METADATA_JSON_FILE_PATH
 from airflow_breeze.utils.shared_options import get_dry_run
 
@@ -236,23 +241,84 @@ def update_sbom_information(
             )
 
 
+@sbom.command(name="build-all-airflow-images", help="Generate images with 
airflow versions pre-installed")
+@option_historical_python_version
+@option_verbose
+@option_dry_run
+@option_answer
+@option_run_in_parallel
+@option_parallelism
+@option_debug_resources
+@option_include_success_outputs
+@option_skip_cleanup
+def build_all_airflow_images(
+    python: str,
+    run_in_parallel: bool,
+    parallelism: int,
+    debug_resources: bool,
+    include_success_outputs: bool,
+    skip_cleanup: bool,
+):
+    if python is None:
+        python_versions = ALL_HISTORICAL_PYTHON_VERSIONS
+    else:
+        python_versions = [python]
+
+    if run_in_parallel:
+        parallelism = min(parallelism, len(python_versions))
+        get_console().print(f"[info]Running {len(python_versions)} jobs in 
parallel")
+        with ci_group(f"Building all airflow base images for python: 
{python_versions}"):
+            all_params = [
+                f"Building all airflow base image for python: {python_version}"
+                for python_version in python_versions
+            ]
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=all_params,
+                debug_resources=debug_resources,
+                progress_matcher=DockerBuildxProgressMatcher(),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        build_all_airflow_versions_base_image,
+                        kwds={
+                            "python_version": python_version,
+                            "confirm": False,
+                            "output": outputs[index],
+                        },
+                    )
+                    for (index, python_version) in enumerate(python_versions)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All airflow base images were built successfully",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+            skip_cleanup=skip_cleanup,
+        )
+    else:
+        for python_version in python_versions:
+            build_all_airflow_versions_base_image(
+                python_version=python_version,
+                confirm=False,
+                output=None,
+            )
+
+
 @sbom.command(name="generate-providers-requirements", help="Generate 
requirements for selected provider.")
+@option_historical_python_version
 @click.option(
-    "--airflow-version", type=str, required=False, help="Airflow version to 
use to generate the requirements"
-)
-@click.option(
-    "--python",
-    type=BetterChoice(ALL_HISTORICAL_PYTHON_VERSIONS),
-    default=DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+    "--provider-id",
+    type=BetterChoice(list(PROVIDER_DEPENDENCIES.keys())),
     required=False,
-    help="Python version to generate the requirements for",
+    help="Provider id to generate the requirements for",
 )
 @click.option(
-    "--provider-id",
-    type=BetterChoice(list(PROVIDER_DEPENDENCIES.keys())),
+    "--provider-version",
+    type=str,
     required=False,
-    help="Provider to generate the requirements for",
-    multiple=True,
+    help="Provider version to generate the requirements for i.e `2.1.0`. 
`latest` is also a supported value "
+    "to account for the most recent version of the provider",
 )
 @option_verbose
 @option_dry_run
@@ -268,9 +334,9 @@ def update_sbom_information(
     help="Force update providers requirements even if they already exist.",
 )
 def generate_providers_requirements(
-    airflow_version: str | None,
     python: str,
-    provider_id: tuple[str, ...],
+    provider_id: str | None,
+    provider_version: str | None,
     run_in_parallel: bool,
     parallelism: int,
     debug_resources: bool,
@@ -280,36 +346,75 @@ def generate_providers_requirements(
 ):
     perform_environment_checks()
 
-    provider_ids = provider_id
-    if len(provider_ids) == 0:
+    if python is None:
+        python_versions = ALL_HISTORICAL_PYTHON_VERSIONS
+    else:
+        python_versions = [python]
+
+    with open(PROVIDER_METADATA_JSON_FILE_PATH) as f:
+        provider_metadata = json.load(f)
+
+    if provider_id is None:
+        if provider_version is not None and provider_version != "latest":
+            get_console().print(
+                "[error] You cannot pin the version of the providers if you 
generate the requirements for "
+                "all historical or latest versions. --provider-version needs 
to be unset when you pass None "
+                "or latest to --provider-id"
+            )
+            sys.exit(1)
+        provider_ids = provider_metadata.keys()
+    else:
+        provider_ids = [provider_id]
+
+    if provider_version is None:
         user_confirm(
-            "You are about to generate all providers requirements based on the 
"
-            "`provider_metadata.json` file (for all releases). Do you want to 
proceed?",
+            f"You are about to generate providers requirements for all 
historical versions for "
+            f"{len(provider_ids)} provider(s) based on 
`provider_metadata.json` file. "
+            f"Do you want to proceed?",
             quit_allowed=False,
             default_answer=Answer.YES,
         )
-        with open(PROVIDER_METADATA_JSON_FILE_PATH) as f:
-            provider_metadata = json.load(f)
-            providers_info = [
-                (p_id, p_version, info["associated_airflow_version"])
-                for (p_id, p_versions) in provider_metadata.items()
-                for (p_version, info) in p_versions.items()
-            ]
-    else:
-        if airflow_version is None:
-            airflow_version = get_active_airflow_versions(confirm=False)[-1]
-            get_console().print(f"[info]Using {airflow_version} as airflow 
version")
-        providers_info = [(provider_id, None, airflow_version) for provider_id 
in provider_ids]
 
-    build_all_airflow_versions_base_image(python_version=python)
+    providers_info = []
+    for provider_id in provider_ids:
+        if provider_version is not None:
+            if provider_version == "latest":
+                # Only the latest version for each provider
+                p_version, info = 
list(provider_metadata[provider_id].items())[-1]
+            else:
+                # Specified providers version
+                info = provider_metadata[provider_id][provider_version]
+                p_version = provider_version
+
+            airflow_version = info["associated_airflow_version"]
+
+            providers_info += [
+                (provider_id, p_version, python_version, airflow_version)
+                for python_version in 
AIRFLOW_PYTHON_COMPATIBILITY_MATRIX[airflow_version]
+                if python_version in python_versions
+            ]
+        else:
+            # All historical providers' versions
+            providers_info += [
+                (
+                    provider_id,
+                    p_version,
+                    python_version,
+                    info["associated_airflow_version"],
+                )
+                for (p_version, info) in provider_metadata[provider_id].items()
+                for python_version in 
AIRFLOW_PYTHON_COMPATIBILITY_MATRIX[info["associated_airflow_version"]]
+                if python_version in python_versions
+            ]
 
     if run_in_parallel:
         parallelism = min(parallelism, len(providers_info))
         get_console().print(f"[info]Running {len(providers_info)} jobs in 
parallel")
         with ci_group(f"Generating provider requirements for 
{providers_info}"):
             all_params = [
-                f"Generate provider requirements for {p_id} version 
{p_version}"
-                for (p_id, p_version, _) in providers_info
+                f"Generate provider requirements for {provider_id} version 
{provider_version} python "
+                f"{python_version}"
+                for (provider_id, provider_version, python_version, _) in 
providers_info
             ]
             with run_with_pool(
                 parallelism=parallelism,
@@ -321,14 +426,18 @@ def generate_providers_requirements(
                     pool.apply_async(
                         get_requirements_for_provider,
                         kwds={
-                            "provider_id": p_id,
-                            "provider_version": p_version,
-                            "airflow_version": a_version,
-                            "python_version": python,
+                            "provider_id": provider_id,
+                            "airflow_version": airflow_version,
+                            "provider_version": provider_version,
+                            "python_version": python_version,
                             "force": force,
+                            "output": outputs[index],
                         },
                     )
-                    for (p_id, p_version, a_version) in providers_info
+                    for (
+                        index,
+                        (provider_id, provider_version, python_version, 
airflow_version),
+                    ) in enumerate(providers_info)
                 ]
         check_async_run_results(
             results=results,
@@ -338,11 +447,12 @@ def generate_providers_requirements(
             skip_cleanup=skip_cleanup,
         )
     else:
-        for p_id, p_version, a_version in providers_info:
+        for provider_id, provider_version, python_version, airflow_version in 
providers_info:
             get_requirements_for_provider(
-                provider_id=p_id,
-                provider_version=p_version,
-                airflow_version=a_version,
-                python_version=python,
+                provider_id=provider_id,
+                provider_version=provider_version,
+                airflow_version=airflow_version,
+                python_version=python_version,
                 force=force,
+                output=None,
             )
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index 763b133cf3..ce17e4a258 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -20,6 +20,7 @@ SBOM_COMMANDS: dict[str, str | list[str]] = {
     "name": "SBOM commands",
     "commands": [
         "update-sbom-information",
+        "build-all-airflow-images",
         "generate-providers-requirements",
     ],
 }
@@ -47,13 +48,31 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
             ],
         },
     ],
+    "breeze sbom build-all-airflow-images": [
+        {
+            "name": "Generate all airflow images flags",
+            "options": [
+                "--python",
+            ],
+        },
+        {
+            "name": "Parallel running",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--skip-cleanup",
+                "--debug-resources",
+                "--include-success-outputs",
+            ],
+        },
+    ],
     "breeze sbom generate-providers-requirements": [
         {
             "name": "Generate provider requirements flags",
             "options": [
-                "--airflow-version",
                 "--python",
                 "--provider-id",
+                "--provider-version",
                 "--force",
             ],
         },
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py 
b/dev/breeze/src/airflow_breeze/global_constants.py
index 094376b04b..dc7250f5b3 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -225,6 +225,44 @@ DEFAULT_MYSQL_VERSION = CURRENT_MYSQL_VERSIONS[0]
 CURRENT_MSSQL_VERSIONS = ["2017-latest", "2019-latest"]
 DEFAULT_MSSQL_VERSION = CURRENT_MSSQL_VERSIONS[0]
 
+
+AIRFLOW_PYTHON_COMPATIBILITY_MATRIX = {
+    "2.0.0": ["3.6", "3.7", "3.8"],
+    "2.0.1": ["3.6", "3.7", "3.8"],
+    "2.0.2": ["3.6", "3.7", "3.8"],
+    "2.1.0": ["3.6", "3.7", "3.8"],
+    "2.1.1": ["3.6", "3.7", "3.8"],
+    "2.1.2": ["3.6", "3.7", "3.8", "3.9"],
+    "2.1.3": ["3.6", "3.7", "3.8", "3.9"],
+    "2.1.4": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.0": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.1": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.2": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.3": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.4": ["3.6", "3.7", "3.8", "3.9"],
+    "2.2.5": ["3.6", "3.7", "3.8", "3.9"],
+    "2.3.0": ["3.7", "3.8", "3.9", "3.10"],
+    "2.3.1": ["3.7", "3.8", "3.9", "3.10"],
+    "2.3.2": ["3.7", "3.8", "3.9", "3.10"],
+    "2.3.3": ["3.7", "3.8", "3.9", "3.10"],
+    "2.3.4": ["3.7", "3.8", "3.9", "3.10"],
+    "2.4.0": ["3.7", "3.8", "3.9", "3.10"],
+    "2.4.1": ["3.7", "3.8", "3.9", "3.10"],
+    "2.4.2": ["3.7", "3.8", "3.9", "3.10"],
+    "2.4.3": ["3.7", "3.8", "3.9", "3.10"],
+    "2.5.0": ["3.7", "3.8", "3.9", "3.10"],
+    "2.5.1": ["3.7", "3.8", "3.9", "3.10"],
+    "2.5.2": ["3.7", "3.8", "3.9", "3.10"],
+    "2.5.3": ["3.7", "3.8", "3.9", "3.10"],
+    "2.6.0": ["3.7", "3.8", "3.9", "3.10"],
+    "2.6.1": ["3.7", "3.8", "3.9", "3.10"],
+    "2.6.2": ["3.7", "3.8", "3.9", "3.10", "3.11"],
+    "2.6.3": ["3.7", "3.8", "3.9", "3.10", "3.11"],
+    "2.7.0": ["3.8", "3.9", "3.10", "3.11"],
+    "2.7.1": ["3.8", "3.9", "3.10", "3.11"],
+    "2.7.2": ["3.8", "3.9", "3.10", "3.11"],
+}
+
 DB_RESET = False
 START_AIRFLOW = "false"
 LOAD_EXAMPLES = False
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py 
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index d329069872..977c20c0ac 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -29,12 +29,14 @@ from pathlib import Path
 
 import yaml
 
-from airflow_breeze.global_constants import DEFAULT_PYTHON_MAJOR_MINOR_VERSION
+from airflow_breeze.global_constants import (
+    AIRFLOW_PYTHON_COMPATIBILITY_MATRIX,
+    DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+)
 from airflow_breeze.utils.console import Output, get_console
 from airflow_breeze.utils.github import (
     download_constraints_file,
     download_file_from_github,
-    get_active_airflow_versions,
 )
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, FILES_DIR
 from airflow_breeze.utils.run_utils import run_command
@@ -134,6 +136,7 @@ DOCKER_FILE_PREFIX = f"/files/{TARGET_DIR_NAME}/"
 def get_requirements_for_provider(
     provider_id: str,
     airflow_version: str,
+    output: Output | None,
     provider_version: str | None = None,
     python_version: str = DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
     force: bool = False,
@@ -144,34 +147,46 @@ def get_requirements_for_provider(
             *provider_path_array
         ) / "provider.yaml"
         provider_version = 
yaml.safe_load(provider_file.read_text())["versions"][0]
-    airflow_file_name = f"airflow-{airflow_version}-requirements.txt"
-    provider_with_airflow_file_name = (
-        
f"provider-{provider_id}-{provider_version}-with-airflow-requirements.txt"
-    )
-    provider_file_name = 
f"provider-{provider_id}-{provider_version}-without-airflow-requirements.txt"
+
     target_dir = FILES_DIR / TARGET_DIR_NAME
-    airflow_file = target_dir / airflow_file_name
-    provider_with_airflow_file = target_dir / provider_with_airflow_file_name
+    airflow_core_file_name = 
f"airflow-{airflow_version}-python{python_version}-requirements.txt"
+    airflow_core_path = target_dir / airflow_core_file_name
+
+    provider_with_core_file_name = 
f"python{python_version}-with-core-requirements.txt"
+    provider_without_core_file_name = 
f"python{python_version}-without-core-requirements.txt"
 
-    if os.path.exists(airflow_file) and 
os.path.exists(provider_with_airflow_file) and force is False:
-        get_console().print(
-            f"[warning] Requirements for provider {provider_id} version 
{provider_version} already exist, "
-            f"skipping. Set force=True to force generation."
+    provider_folder_name = f"provider-{provider_id}-{provider_version}"
+    provider_folder_path = target_dir / provider_folder_name
+    provider_with_core_path = provider_folder_path / 
provider_with_core_file_name
+    provider_without_core_file = provider_folder_path / 
provider_without_core_file_name
+
+    docker_file_provider_folder_prefix = 
f"{DOCKER_FILE_PREFIX}/{provider_folder_name}/"
+
+    if (
+        os.path.exists(provider_with_core_path)
+        and os.path.exists(provider_without_core_file)
+        and force is False
+    ):
+        get_console(output=output).print(
+            f"[warning] Requirements for provider {provider_id} version 
{provider_version} python "
+            f"{python_version} already exist, skipping. Set force=True to 
force generation."
         )
         return (
             0,
             f"Provider requirements already existed, skipped generation for 
{provider_id} version "
-            f"{provider_version}",
+            f"{provider_version} python {python_version}",
         )
+    else:
+        provider_folder_path.mkdir(exist_ok=True)
 
     command = f"""
 mkdir -pv {DOCKER_FILE_PREFIX}
-/opt/airflow/airflow-{airflow_version}/bin/pip freeze | sort > 
{DOCKER_FILE_PREFIX}{airflow_file_name}
+/opt/airflow/airflow-{airflow_version}/bin/pip freeze | sort > 
{DOCKER_FILE_PREFIX}{airflow_core_file_name}
 /opt/airflow/airflow-{airflow_version}/bin/pip install 
apache-airflow=={airflow_version} \
     apache-airflow-providers-{provider_id}=={provider_version}
 /opt/airflow/airflow-{airflow_version}/bin/pip freeze | sort > \
-    {DOCKER_FILE_PREFIX}{provider_with_airflow_file_name}
-chown --recursive {os.getuid()}:{os.getgid()} {DOCKER_FILE_PREFIX}
+    {docker_file_provider_folder_prefix}{provider_with_core_file_name}
+chown --recursive {os.getuid()}:{os.getgid()} 
{DOCKER_FILE_PREFIX}{provider_with_core_file_name}
 """
     provider_command_result = run_command(
         [
@@ -187,28 +202,29 @@ chown --recursive {os.getuid()}:{os.getgid()} 
{DOCKER_FILE_PREFIX}
             get_all_airflow_versions_image_name(python_version=python_version),
             "-c",
             ";".join(command.splitlines()[1:-1]),
-        ]
+        ],
+        output=output,
     )
-    get_console().print(f"[info]Airflow requirements in {airflow_file}")
-    get_console().print(f"[info]Provider requirements in 
{provider_with_airflow_file}")
-    base_packages = {package.split("==")[0] for package in 
airflow_file.read_text().splitlines()}
+    get_console(output=output).print(f"[info]Airflow requirements in 
{airflow_core_path}")
+    get_console(output=output).print(f"[info]Provider requirements in 
{provider_with_core_path}")
+    base_packages = {package.split("==")[0] for package in 
airflow_core_path.read_text().splitlines()}
     base_packages.add("apache-airflow-providers-" + provider_id.replace(".", 
"-"))
     provider_packages = sorted(
         [
             line
-            for line in provider_with_airflow_file.read_text().splitlines()
+            for line in provider_with_core_path.read_text().splitlines()
             if line.split("==")[0] not in base_packages
         ]
     )
-    get_console().print(
+    get_console(output=output).print(
         f"[info]Provider {provider_id} has {len(provider_packages)} 
transitively "
         f"dependent packages (excluding airflow and its dependencies)"
     )
-    get_console().print(provider_packages)
-    provider_file = target_dir / provider_file_name
-    provider_file.write_text("".join(f"{p}\n" for p in provider_packages))
-    get_console().print(
-        f"[success]Generated {provider_id}:{provider_version} requirements in 
{provider_file}"
+    get_console(output=output).print(provider_packages)
+    provider_without_core_file.write_text("".join(f"{p}\n" for p in 
provider_packages))
+    get_console(output=output).print(
+        f"[success]Generated {provider_id}:{provider_version}:{python_version} 
requirements in "
+        f"{provider_without_core_file}"
     )
 
     return (
@@ -217,7 +233,11 @@ chown --recursive {os.getuid()}:{os.getgid()} 
{DOCKER_FILE_PREFIX}
     )
 
 
-def build_all_airflow_versions_base_image(python_version: str):
+def build_all_airflow_versions_base_image(
+    python_version: str,
+    output: Output | None,
+    confirm: bool = True,
+) -> tuple[int, str]:
     """
     Build an image with all airflow versions pre-installed in separate 
virtualenvs.
     """
@@ -225,20 +245,30 @@ def build_all_airflow_versions_base_image(python_version: 
str):
     image_name = 
get_all_airflow_versions_image_name(python_version=python_version)
     dockerfile = f"""
 FROM ghcr.io/apache/airflow/main/ci/python{python_version}
-RUN pip install --upgrade pip
+RUN pip install --upgrade pip --no-cache-dir
 # Prevent setting sources in PYTHONPATH to not interfere with virtualenvs
 ENV USE_AIRFLOW_VERSION=none
+ENV START_AIRFLOW=none
     """
-    for airflow_version in get_active_airflow_versions():
+    compatible_airflow_versions = [
+        airflow_version
+        for airflow_version, python_versions in 
AIRFLOW_PYTHON_COMPATIBILITY_MATRIX.items()
+        if python_version in python_versions
+    ]
+
+    for airflow_version in compatible_airflow_versions:
         dockerfile += f"""
 # Create the virtualenv and install the proper airflow version in it
 RUN python -m venv /opt/airflow/airflow-{airflow_version} && \
-/opt/airflow/airflow-{airflow_version}/bin/pip install --upgrade pip && \
+/opt/airflow/airflow-{airflow_version}/bin/pip install --no-cache-dir 
--upgrade pip && \
 /opt/airflow/airflow-{airflow_version}/bin/pip install 
apache-airflow=={airflow_version} \
     --constraint https://raw.githubusercontent.com/apache/airflow/\
 constraints-{airflow_version}/constraints-{python_version}.txt
 """
-    run_command(["docker", "build", "--tag", image_name, "-"], 
input=dockerfile, text=True, check=True)
+    build_command = run_command(
+        ["docker", "build", "--tag", image_name, "-"], input=dockerfile, 
text=True, check=True, output=output
+    )
+    return build_command.returncode, f"All airflow image built for python 
{python_version}"
 
 
 @dataclass
diff --git a/images/breeze/output-commands-hash.txt 
b/images/breeze/output-commands-hash.txt
index 0dfeabe0e7..ff54cbc64d 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -52,16 +52,17 @@ 
release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
 release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef
 release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a
 release-management:a78938d2775ea0253af625ce67dabcbb
-sbom:generate-providers-requirements:51e0c660a5f7846ada099e871ebd4c67
+sbom:build-all-airflow-images:32f8acade299c2b112e986bae99846db
+sbom:generate-providers-requirements:8fe04d5797c8f71f96f569f687827950
 sbom:update-sbom-information:653be48be70b4b7ff5172d491aadc694
-sbom:b98ded4bbb76f0cb205cea32f3102aee
+sbom:28d8581cba82cabc545dbb006d993072
 setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
-setup:check-all-params-in-groups:7aa55fa1b0f17a6f7b7ca225c6b82574
+setup:check-all-params-in-groups:f9ca6bef11ed65e40f06d7cf261a4859
 setup:config:aaff9748d0970f7cb02e592ac4046d5d
-setup:regenerate-command-images:a228071206e00b6004ede2e69b8f4a6c
+setup:regenerate-command-images:ea2fba3440bd4e84311a53abe6e8dc56
 setup:self-upgrade:4af905a147fcd6670a0e33d3d369a94b
 setup:version:be116d90a21c2afe01087f7609774e1e
-setup:c569719a4fc7be726556a266e447c871
+setup:244883e40b4d2ff7c4c7cf4b10efb680
 shell:6840d0c0e939dcd03d127d5a040bf2f5
 start-airflow:7981958d896eebbab19ec32147657eb6
 static-checks:19926b8fcea5784b28d4a0d99865363c
diff --git a/images/breeze/output_sbom.svg b/images/breeze/output_sbom.svg
index 36f6faccd0..9ee73ec331 100644
--- a/images/breeze/output_sbom.svg
+++ b/images/breeze/output_sbom.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 342.79999999999995" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 367.2" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -42,7 +42,7 @@
 
     <defs>
     <clipPath id="breeze-sbom-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="291.79999999999995" />
+      <rect x="0" y="0" width="1463.0" height="316.2" />
     </clipPath>
     <clipPath id="breeze-sbom-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -77,9 +77,12 @@
 <clipPath id="breeze-sbom-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-sbom-line-11">
+    <rect x="0" y="269.9" 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="340.8" rx="8"/><text class="breeze-sbom-title" 
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;sbom</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="365.2" rx="8"/><text class="breeze-sbom-title" 
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;sbom</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -98,9 +101,10 @@
 </text><text class="breeze-sbom-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-line-6)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-line-6)">-</text><text class="breeze-sbom-r4" 
x="36.6" y="166.4" textLength="61" 
clip-path="url(#breeze-sbom-line-6)">-help</text><text class="breeze-sbom-r6" 
x="122" y="166.4" textLength="24.4" 
clip-path="url(#breeze-sbom-line-6)">-h</text><text class="breeze-sbom-r1" 
x="170.8" y=" [...]
 </text><text class="breeze-sbom-r5" x="0" y="190.8" textLength="1464" 
clip-path="url(#breeze-sbom-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-sbom-line-7)">
 </text><text class="breeze-sbom-r5" x="0" y="215.2" textLength="24.4" 
clip-path="url(#breeze-sbom-line-8)">╭─</text><text class="breeze-sbom-r5" 
x="24.4" y="215.2" textLength="183" 
clip-path="url(#breeze-sbom-line-8)">&#160;SBOM&#160;commands&#160;</text><text 
class="breeze-sbom-r5" x="207.4" y="215.2" textLength="1232.2" 
clip-path="url(#breeze-sbom-line-8)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-sbo [...]
-</text><text class="breeze-sbom-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-line-9)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="239.6" textLength="549" 
clip-path="url(#breeze-sbom-line-9)">update-sbom-information&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="597.8" y="239.6" textLength="841.8" 
clip-path="url(#breeze-sbom-line-9)">Update&# [...]
-</text><text class="breeze-sbom-r5" x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-line-10)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="264" textLength="549" 
clip-path="url(#breeze-sbom-line-10)">generate-providers-requirements&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="597.8" y="264" textLength="841.8" 
clip-path="url(#breeze-sbom-line-10)">Generate&#160;requirements&#160;for&#160;selected&#
 [...]
-</text><text class="breeze-sbom-r5" x="0" y="288.4" textLength="1464" 
clip-path="url(#breeze-sbom-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-r1" x="1464" y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-line-11)">
+</text><text class="breeze-sbom-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-line-9)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="239.6" textLength="536.8" 
clip-path="url(#breeze-sbom-line-9)">update-sbom-information&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="239.6" textLength="854" 
clip-path="url(#breeze-sbom-line-9)">Update&#160;SB [...]
+</text><text class="breeze-sbom-r5" x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-line-10)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="264" textLength="536.8" 
clip-path="url(#breeze-sbom-line-10)">build-all-airflow-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="264" textLength="854" 
clip-path="url(#breeze-sbom-line-10)">Generate&#160;images&# [...]
+</text><text class="breeze-sbom-r5" x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-line-11)">│</text><text class="breeze-sbom-r4" 
x="24.4" y="288.4" textLength="536.8" 
clip-path="url(#breeze-sbom-line-11)">generate-providers-requirements&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="288.4" textLength="854" 
clip-path="url(#breeze-sbom-line-11)">Generate&#160;requirements&#160;for&#160;selected&#
 [...]
+</text><text class="breeze-sbom-r5" x="0" y="312.8" textLength="1464" 
clip-path="url(#breeze-sbom-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-r1" x="1464" y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-line-12)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_sbom_build-all-airflow-images.svg 
b/images/breeze/output_sbom_build-all-airflow-images.svg
new file mode 100644
index 0000000000..76e5648299
--- /dev/null
+++ b/images/breeze/output_sbom_build-all-airflow-images.svg
@@ -0,0 +1,156 @@
+<svg class="rich-terminal" viewBox="0 0 1482 635.5999999999999" 
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-sbom-build-all-airflow-images-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .breeze-sbom-build-all-airflow-images-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .breeze-sbom-build-all-airflow-images-r1 { fill: #c5c8c6 }
+.breeze-sbom-build-all-airflow-images-r2 { fill: #d0b344 }
+.breeze-sbom-build-all-airflow-images-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-sbom-build-all-airflow-images-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-sbom-build-all-airflow-images-r5 { fill: #868887 }
+.breeze-sbom-build-all-airflow-images-r6 { fill: #8d7b39 }
+.breeze-sbom-build-all-airflow-images-r7 { fill: #98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath id="breeze-sbom-build-all-airflow-images-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="584.5999999999999" />
+    </clipPath>
+    <clipPath id="breeze-sbom-build-all-airflow-images-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-build-all-airflow-images-line-22">
+    <rect x="0" y="538.3" 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="633.6" rx="8"/><text 
class="breeze-sbom-build-all-airflow-images-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;build-all-airflow-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"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" 
clip-path="url(#breeze-sbom-build-all-airflow-images-clip-terminal)">
+    
+    <g class="breeze-sbom-build-all-airflow-images-matrix">
+    <text class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="20" 
textLength="12.2" clip-path="url(#breeze-sbom-build-all-airflow-images-line-0)">
+</text><text class="breeze-sbom-build-all-airflow-images-r2" x="12.2" y="44.4" 
textLength="73.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-1)">Usage:</text><text
 class="breeze-sbom-build-all-airflow-images-r3" x="97.6" y="44.4" 
textLength="439.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-1)">breeze&#160;sbom&#160;build-all-airflow-images</text><text
 class="breeze-sbom-build-all-airflow-images-r1" x="549" y="44.4" 
textLength="12.2" clip-path="url(#breeze-sb [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="68.8" 
textLength="12.2" clip-path="url(#breeze-sbom-build-all-airflow-images-line-2)">
+</text><text class="breeze-sbom-build-all-airflow-images-r1" x="12.2" y="93.2" 
textLength="622.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-3)">Generate&#160;images&#160;with&#160;airflow&#160;versions&#160;pre-installed</text><text
 class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="93.2" 
textLength="12.2" clip-path="url(#breeze-sbom-build-all-airflow-images-line-3)">
+</text><text class="breeze-sbom-build-all-airflow-images-r1" x="1464" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-4)">
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="142" 
textLength="24.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-5)">╭─</text><text 
class="breeze-sbom-build-all-airflow-images-r5" x="24.4" y="142" 
textLength="427" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-5)">&#160;Generate&#160;all&#160;airflow&#160;images&#160;flags&#160;</text><text
 class="breeze-sbom-build-all-airflow-images-r5" x="451.4" y="142" 
textLength="988.2" clip-path="url( [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-6)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-6)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="166.4" 
textLength="85.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-6)">-python</text 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-7)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r6" x="170.8" y="190.8" 
textLength="976" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-7)">(3.6&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="215.2" 
textLength="1464" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="215.2" 
textLength="12.2" clip-path="url(#breeze-sbom-build-all-airflow-images-line-8)">
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="239.6" 
textLength="24.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-9)">╭─</text><text 
class="breeze-sbom-build-all-airflow-images-r5" x="24.4" y="239.6" 
textLength="219.6" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-9)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-sbom-build-all-airflow-images-r5" x="244" y="239.6" 
textLength="1195.6" clip-path="url(#breeze-sbom-build-all-ai [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-10)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="264" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-10)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="264" 
textLength="48.8" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-10)">-run</text><text 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-11)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-11)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="288.4" 
textLength="146.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-11)">-parallel [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-12)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r6" x="378.2" y="312.8" 
textLength="915" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-12)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-13)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r5" x="378.2" y="337.2" 
textLength="915" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-13)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-14)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-14)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="361.6" 
textLength="61" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-14)">-skip</text> 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-15)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="386" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-15)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="386" 
textLength="73.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-15)">-debug</text><te 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-16)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-16)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="410.4" 
textLength="97.6" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-16)">-include</ [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="434.8" 
textLength="1464" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-17)">
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="459.2" 
textLength="24.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-18)">╭─</text><text 
class="breeze-sbom-build-all-airflow-images-r5" x="24.4" y="459.2" 
textLength="195.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-18)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-build-all-airflow-images-r5" x="219.6" y="459.2" 
textLength="1220" clip-path="url(#breeze-sbom-build-all-ai [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-19)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-19)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="483.6" 
textLength="97.6" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-19)">-verbose</ [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-20)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="508" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-20)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="508" 
textLength="48.8" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-20)">-dry</text><text 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-21)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-21)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="532.4" 
textLength="85.4" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-21)">-answer</t [...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-22)">│</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="24.4" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-22)">-</text><text 
class="breeze-sbom-build-all-airflow-images-r4" x="36.6" y="556.8" 
textLength="61" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-22)">-help</text> 
[...]
+</text><text class="breeze-sbom-build-all-airflow-images-r5" x="0" y="581.2" 
textLength="1464" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-build-all-airflow-images-r1" x="1464" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-build-all-airflow-images-line-23)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_sbom_generate-providers-requirements.svg 
b/images/breeze/output_sbom_generate-providers-requirements.svg
index 1d5d38d00e..5504460a0e 100644
--- a/images/breeze/output_sbom_generate-providers-requirements.svg
+++ b/images/breeze/output_sbom_generate-providers-requirements.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1026.0" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-sbom-generate-providers-requirements-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="901.8" />
+      <rect x="0" y="0" width="1463.0" height="975.0" />
     </clipPath>
     <clipPath id="breeze-sbom-generate-providers-requirements-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -153,9 +153,18 @@
 <clipPath id="breeze-sbom-generate-providers-requirements-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-sbom-generate-providers-requirements-line-36">
+    <rect x="0" y="879.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-generate-providers-requirements-line-37">
+    <rect x="0" y="904.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-sbom-generate-providers-requirements-line-38">
+    <rect x="0" y="928.7" 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="950.8" rx="8"/><text 
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;generate-providers-requirements</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1024" rx="8"/><text 
class="breeze-sbom-generate-providers-requirements-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;generate-providers-requirements</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -171,37 +180,40 @@
 </text><text class="breeze-sbom-generate-providers-requirements-r1" x="12.2" 
y="93.2" textLength="536.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">Generate&#160;requirements&#160;for&#160;selected&#160;provider.</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="93.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-3)">
 </text><text class="breeze-sbom-generate-providers-requirements-r1" x="1464" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-4)">
 </text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="142" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="142" 
textLength="463.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-5)">&#160;Generate&#160;provider&#160;requirements&#160;flags&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="488" y="142" t [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="166.4" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="190.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="190.8" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="215.2" 
textLength="109.8" clip-path="url(#breeze-sbom-generate-pr [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="239.6" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="264" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|&#16
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="288.4" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;a
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="312.8" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daskexe
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="337.2" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="361.6" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="386" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">microsoft.azure&#160;|&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|&#160;
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="410.4" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opensearch&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="434.8" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="459.2" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#1
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="280.6" y="483.6" 
textLength="1159" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">yandex&#160;|&#160;zendesk)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="508" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="508" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-provide [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="532.4" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="556.8" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="556.8" 
textLength="219.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="244" y="556.8" 
textLength="1195.6" cli [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="581.2" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="605.6" 
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="630" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="378.2" y="654.4" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="678.8" 
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="703.2" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="727.6" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="752" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="752" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="776.4" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="776.4" 
textLength="195.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="219.6" y="776.4" 
textLength="1220" clip- [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="800.8" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="825.2" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="849.6" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="874" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="874" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="874" 
textLength="61" clip-path="url(#breeze-sbom-generate-providers [...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="898.4" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="166.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-6)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="166.4" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="190.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="190.8" 
textLength="976" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-7)">(3.6&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="215.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-8)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="215.2" 
textLength="109.8" clip-path="url(#breeze-sbom-generate-pr [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="239.6" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-9)">(airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apach
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="264" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-10)">apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|&#
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="288.4" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-11)">apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="312.8" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-12)">asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daske
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="337.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="337.2" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#1
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="361.6" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="386" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#16
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="410.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="410.4" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">|&#160;odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opensearch&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="434.8" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sen
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="459.2" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabul
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="483.6" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">vertica&#160;|&#160;yandex&#160;|&#160;zendesk)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="508" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="508" 
textLength="109.8" clip-path="url(#breeze-sbom-generate-provid [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="292.8" y="532.4" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">value&#160;to&#160;account&#160;for&#160;the&#160;most&#160;recent&#160;version&#160;of&#160;the&#160;provider&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="556.8" 
textLength="1146.8" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-22)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-23)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="581.2" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="605.6" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-24)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="630" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="630" 
textLength="219.6" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-25)">&#160;Parallel&#160;running&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="244" y="630" 
textLength="1195.6" clip-path [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-26)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="654.4" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-27)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="678.8" 
textLength="146.4" clip-path="url(#breeze-sbom-generate- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r6" x="378.2" y="703.2" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-28)">(INTEGER&#160;RANGE)&#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-sbom-generate-providers-requirements-r5" x="0" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="378.2" y="727.6" 
textLength="915" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-29)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="752" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="752" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-30)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="752" 
textLength="61" clip-path="url(#breeze-sbom-generate-providers [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="776.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-31)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="776.4" 
textLength="73.2" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-32)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="800.8" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="825.2" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-33)">
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="849.6" textLength="24.4" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">╭─</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="24.4" y="849.6" 
textLength="195.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-34)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-generate-providers-requirements-r5" x="219.6" y="849.6" 
textLength="1220" clip- [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="874" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="874" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-35)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="874" 
textLength="97.6" clip-path="url(#breeze-sbom-generate-provide [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="898.4" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-36)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="898.4" 
textLength="48.8" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="922.8" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-37)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-37)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="922.8" 
textLength="85.4" clip-path="url(#breeze-sbom-generate-p [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="947.2" textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-38)">│</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-38)">-</text><text
 class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="947.2" 
textLength="61" clip-path="url(#breeze-sbom-generate-pro [...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0" 
y="971.6" textLength="1464" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-generate-providers-requirements-r1" x="1464" y="971.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-generate-providers-requirements-line-39)">
 </text>
     </g>
     </g>
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 03f873859e..c29db1ff1f 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -167,11 +167,11 @@
 </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-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="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: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="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:start-release&#160;|&#160;release-management:update-constraints&#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:verify-provider-packages&#160;|&#160;release-management&#160;|&#160;sbom:generate-providers-requirements</text><text
 class="breeze-setup-check-a [...]
-</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)">|&#160;sbom:update-sbom-information&#160;|&#160;sbom&#160;|&#160;setup:autocomplete&#160;|&#160;setup:check-all-params-in-groups&#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)">setup:config&#160;|&#160;setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;|&#160;setup:version&#160;|&#160;setup&#160;|&#160;shell&#160;|&#1
 [...]
-</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)">start-airflow&#160;|&#160;static-checks&#160;|&#160;testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</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)">testing:integration-tests&#160;|&#160;testing:tests&#160;|&#160;testing)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</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:verify-provider-packages&#160;|&#160;release-management&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;&#160;&#160;&#160;&#160;</text><te
 [...]
+</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)">sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;|&#160;sbom&#160;|&#160;setup:autocomplete&#160;|&#160;&#160;&#160;&#160;&#1
 [...]
+</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)">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="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)">|&#160;setup:version&#160;|&#160;setup&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;static-checks&#160;|&#160;testing:docker-compose-tests&#160;|&#1
 [...]
+</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)">testing:helm-tests&#160;|&#160;testing:integration-tests&#160;|&#160;testing:tests&#160;|&#160;testing)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630" 
textLength="1464" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-check-all-params-in-groups-r1" x="1464" 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-r5" x="0" 
y="654.4" textLength="24.4" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">╭─</text><text
 class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="654.4" 
textLength="195.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="654.4" 
textLength="1220" clip-path="url(#breeze-se [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
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-r4" x="24.4" 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-r4" x="36.6" y="678.8" 
textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-li 
[...]
diff --git a/images/breeze/output_setup_regenerate-command-images.svg 
b/images/breeze/output_setup_regenerate-command-images.svg
index 427c8f14c1..bd4bd20270 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -180,7 +180,7 @@
 </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-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="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:release-prod-images&#160;|&#160;release-management:start-rc-process&#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="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:start-release&#160;|&#160;release-management:update-constraints&#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:verify-provider-packages&#160;|&#160;release-management&#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="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:verify-provider-packages&#160;|&#160;release-management&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;&#160;</text><text
 class="breeze-s [...]
 </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)">sbom:generate-providers-requirements&#160;|&#160;sbom:update-sbom-information&#160;|&#160;sbom&#160;|&#160;setup:autocomplete&#160;|&#160;&#160;&#160;</text><text
  [...]
 </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)">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="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:self-upgrade&#160;|&#160;setup:version&#160;|&#160;setup&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;static-checks&#160;|&#160;&#160;&#160;&#160;
 [...]

Reply via email to