This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new d2c038e043 Add command to generate requirements that are needed by a
provider (#31943)
d2c038e043 is described below
commit d2c038e0437a23ce1f41960ce6e27216d9f9e579
Author: Jarek Potiuk <[email protected]>
AuthorDate: Mon Jun 19 09:48:36 2023 +0200
Add command to generate requirements that are needed by a provider (#31943)
This new SBOM command will generate the requirement file for the
specified provider. It will exclude all the requirements that Airflow
adds on its own. It will be used in the future to generate per
provider sbom.
The SBOM commands have also been separated out to a new command.
Co-authored-by: Tzu-ping Chung <[email protected]>
---
BREEZE.rst | 28 ++-
dev/breeze/src/airflow_breeze/breeze.py | 2 +
.../commands/developer_commands_config.py | 2 +-
.../commands/release_management_commands.py | 182 +-------------
.../commands/release_management_commands_config.py | 22 --
.../src/airflow_breeze/commands/sbom_commands.py | 277 +++++++++++++++++++++
.../commands/sbom_commands_config.py | 61 +++++
.../src/airflow_breeze/commands/setup_commands.py | 6 +-
.../src/airflow_breeze/configure_rich_click.py | 24 +-
dev/breeze/src/airflow_breeze/global_constants.py | 4 +
dev/breeze/src/airflow_breeze/utils/cdxgen.py | 96 +++++++
dev/breeze/src/airflow_breeze/utils/github.py | 17 +-
images/breeze/output-commands-hash.txt | 12 +-
images/breeze/output-commands.svg | 18 +-
images/breeze/output_release-management.svg | 14 +-
..._release-management_update-sbom-information.svg | 182 --------------
images/breeze/output_sbom.svg | 107 ++++++++
.../output_sbom_generate-provider-requirements.svg | 170 +++++++++++++
.../breeze/output_sbom_update-sbom-information.svg | 166 ++++++++++++
.../output_setup_check-all-params-in-groups.svg | 4 +-
.../output_setup_regenerate-command-images.svg | 4 +-
21 files changed, 975 insertions(+), 423 deletions(-)
diff --git a/BREEZE.rst b/BREEZE.rst
index 4d7e474601..129dcc14e6 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -1955,6 +1955,17 @@ These are all of the available flags for the
``release-prod-images`` command:
:width: 100%
:alt: Breeze release management release prod images
+
+SBOM generation tasks
+----------------------
+
+Maintainers also can use Breeze for SBOM generation:
+
+.. image:: ./images/breeze/output_sbom.svg
+ :target:
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_sbom.svg
+ :width: 100%
+ :alt: Breeze sbom
+
Generating SBOM information
...........................
@@ -1965,11 +1976,22 @@ information is written directly to ``docs-archive`` in
airflow-site repository.
These are all of the available flags for the ``update-sbom-information``
command:
-.. image::
./images/breeze/output_release-management_update-sbom-information.svg
- :target:
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_release-management_update-sbom-information.svg
+.. image:: ./images/breeze/output_sbom_update-sbom-information.svg
+ :target:
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_sbomt_update-sbom-information.svg
:width: 100%
- :alt: Breeze release management update sbom information
+ :alt: Breeze update sbom information
+
+Generating Provider requirements
+.................................
+In order to generate SBOM information for providers, we need to generate
requirements for them. This is
+done by the ``generate-provider-requirements`` command. This command generates
requirements for the
+selected provider and python version, using the airflow version specified.
+
+.. image:: ./images/breeze/output_sbom_generate-provider-requirements.svg
+ :target:
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_sbom_generate-provider-requirements.svg
+ :width: 100%
+ :alt: Breeze generate SBOM provider requirements
Details of Breeze usage
=======================
diff --git a/dev/breeze/src/airflow_breeze/breeze.py
b/dev/breeze/src/airflow_breeze/breeze.py
index ba9805f9ef..f061952914 100755
--- a/dev/breeze/src/airflow_breeze/breeze.py
+++ b/dev/breeze/src/airflow_breeze/breeze.py
@@ -34,6 +34,7 @@ from airflow_breeze.commands.ci_image_commands import
ci_image # noqa
from airflow_breeze.commands.kubernetes_commands import kubernetes_group #
noqa
from airflow_breeze.commands.production_image_commands import prod_image #
noqa
from airflow_breeze.commands.release_management_commands import
release_management # noqa
+from airflow_breeze.commands.sbom_commands import sbom # noqa
from airflow_breeze.commands.setup_commands import setup # noqa
from airflow_breeze.commands.testing_commands import group_for_testing # noqa
@@ -44,6 +45,7 @@ main.add_command(ci_image)
main.add_command(prod_image)
main.add_command(setup)
main.add_command(release_management)
+main.add_command(sbom)
if __name__ == "__main__":
main()
diff --git
a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 4de641dd19..5fb6cb2b22 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -17,7 +17,7 @@
from __future__ import annotations
DEVELOPER_COMMANDS: dict[str, str | list[str]] = {
- "name": "Basic developer commands",
+ "name": "Developer commands",
"commands": [
"start-airflow",
"static-checks",
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 1cc0c3a8e0..bea677c51d 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -17,7 +17,6 @@
from __future__ import annotations
import os
-import pathlib
import re
import shlex
import sys
@@ -38,7 +37,6 @@ from airflow_breeze.commands.minor_release_command import
create_minor_version_b
from airflow_breeze.commands.release_candidate_command import
publish_release_candidate
from airflow_breeze.commands.release_command import airflow_release
from airflow_breeze.global_constants import (
- ALL_HISTORICAL_PYTHON_VERSIONS,
ALLOWED_PLATFORMS,
APACHE_AIRFLOW_GITHUB_REPOSITORY,
CURRENT_PYTHON_MAJOR_MINOR_VERSIONS,
@@ -48,7 +46,6 @@ from airflow_breeze.global_constants import (
MULTI_PLATFORM,
)
from airflow_breeze.params.shell_params import ShellParams
-from airflow_breeze.utils.cdxgen import SbomApplicationJob,
get_cdxgen_port_mapping
from airflow_breeze.utils.ci_group import ci_group
from airflow_breeze.utils.click_utils import BreezeGroup
from airflow_breeze.utils.common_options import (
@@ -87,14 +84,12 @@ from airflow_breeze.utils.docker_command_utils import (
)
from airflow_breeze.utils.parallel import (
GenericRegexpProgressMatcher,
- ShowLastLineProgressMatcher,
SummarizeAfter,
check_async_run_results,
run_with_pool,
)
from airflow_breeze.utils.path_utils import (
AIRFLOW_SOURCES_ROOT,
- AIRFLOW_TMP_DIR_PATH,
DIST_DIR,
cleanup_python_generated_files,
)
@@ -106,7 +101,7 @@ from airflow_breeze.utils.run_utils import (
run_command,
run_compile_www_assets,
)
-from airflow_breeze.utils.shared_options import get_dry_run, get_forced_answer
+from airflow_breeze.utils.shared_options import get_forced_answer
from airflow_breeze.utils.suspended_providers import get_suspended_provider_ids
option_debug_release_management = click.option(
@@ -1112,181 +1107,6 @@ def generate_issue_content_providers(
get_console().print(" ".join(users))
-SBOM_INDEX_TEMPLATE = """
-<html>
-<head><title>CycloneDX SBOMs for Apache Airflow {{ version }}</title></head>
-<body>
- <h1>CycloneDX SBOMs for Apache Airflow {{ version }}</h1>
- <ul>
- {% for sbom_file in sbom_files %}
- <li><a href="{{ sbom_file.name }}">{{ sbom_file.name }}</a></li>
- {% endfor %}
- </ul>
-</body>
-</html>
-"""
-
-
-@release_management.command(
- name="update-sbom-information", help="Update SBOM information in
airflow-site project."
-)
[email protected](
- "--airflow-site-dir",
- type=click.Path(file_okay=False, dir_okay=True, path_type=pathlib.Path,
exists=True),
- required=True,
- envvar="AIRFLOW_SITE_DIR",
- help="Directory where airflow-site directory is located.",
-)
[email protected](
- "--airflow-version",
- type=str,
- required=False,
- envvar="AIRFLOW_VERSION",
- help="Version of airflow to update sbom from. (defaulted to all active
airflow versions)",
-)
[email protected](
- "--python",
- type=BetterChoice(ALL_HISTORICAL_PYTHON_VERSIONS),
- required=False,
- envvar="PYTHON_VERSION",
- help="Python version to update sbom from. (defaults to all python
versions)",
-)
[email protected](
- "--include-provider-dependencies",
- is_flag=True,
- help="Whether to include provider dependencies in SBOM generation.",
-)
-@option_run_in_parallel
-@option_parallelism
-@option_debug_resources
-@option_include_success_outputs
-@option_skip_cleanup
[email protected](
- "--force",
- is_flag=True,
- help="Force update of sbom even if it already exists.",
-)
-@option_verbose
-@option_dry_run
-@option_answer
-def update_sbom_information(
- airflow_site_dir: Path,
- airflow_version: str | None,
- python: str | None,
- include_provider_dependencies: bool,
- run_in_parallel: bool,
- parallelism: int,
- debug_resources: bool,
- include_success_outputs: bool,
- skip_cleanup: bool,
- force: bool,
-):
- import jinja2
- from jinja2 import StrictUndefined
-
- from airflow_breeze.utils.cdxgen import (
- produce_sbom_for_application_via_cdxgen_server,
- start_cdxgen_server,
- )
- from airflow_breeze.utils.github import get_active_airflow_versions
-
- if airflow_version is None:
- airflow_versions = get_active_airflow_versions()
- else:
- airflow_versions = [airflow_version]
- if python is None:
- python_versions = ALL_HISTORICAL_PYTHON_VERSIONS
- else:
- python_versions = [python]
- application_root_path = AIRFLOW_TMP_DIR_PATH
- start_cdxgen_server(application_root_path, run_in_parallel, parallelism)
-
- jobs_to_run: list[SbomApplicationJob] = []
-
- apache_airflow_dir = airflow_site_dir / "docs-archive" / "apache-airflow"
-
- for airflow_v in airflow_versions:
- airflow_version_dir = apache_airflow_dir / airflow_v
- if not airflow_version_dir.exists():
- get_console().print(f"[warning]The {airflow_version_dir} does not
exist. Skipping")
- continue
- destination_dir = airflow_version_dir / "sbom"
- destination_dir.mkdir(parents=True, exist_ok=True)
- if destination_dir.exists():
- if not force:
- get_console().print(f"[warning]The {destination_dir} already
exists. Skipping")
- continue
- else:
- get_console().print(f"[warning]The {destination_dir} already
exists. Forcing update")
- get_console().print(f"[info]Attempting to update sbom for
{airflow_v}.")
- get_console().print(f"[success]The {destination_dir} exists.
Proceeding.")
- for python_version in python_versions:
- target_sbom_file_name =
f"apache-airflow-sbom-{airflow_v}-python{python_version}.json"
- target_sbom_path = destination_dir / target_sbom_file_name
- if target_sbom_path.exists():
- if not force:
- get_console().print(f"[warning]The {target_sbom_path}
already exists. Skipping")
- continue
- else:
- get_console().print(f"[warning]The {target_sbom_path}
already exists. Forcing update")
- jobs_to_run.append(
- SbomApplicationJob(
- airflow_version=airflow_v,
- python_version=python_version,
- application_root_path=application_root_path,
-
include_provider_dependencies=include_provider_dependencies,
- target_path=target_sbom_path,
- )
- )
- if run_in_parallel:
- parallelism = min(parallelism, len(jobs_to_run))
- get_console().print(f"[info]Running {len(jobs_to_run)} jobs in
parallel")
- with ci_group(f"Generating SBoMs for
{airflow_versions}:{python_versions}"):
- all_params = [f"CI {job.airflow_version}:{job.python_version}" for
job in jobs_to_run]
- with run_with_pool(
- parallelism=parallelism,
- all_params=all_params,
- debug_resources=debug_resources,
- progress_matcher=ShowLastLineProgressMatcher(),
- ) as (pool, outputs):
- port_map = get_cdxgen_port_mapping(parallelism, pool)
- results = [
- pool.apply_async(
- produce_sbom_for_application_via_cdxgen_server,
- kwds={
- "job": job,
- "output": outputs[index],
- "port_map": port_map,
- },
- )
- for index, job in enumerate(jobs_to_run)
- ]
- check_async_run_results(
- results=results,
- success="All SBoMs were generated successfully",
- outputs=outputs,
- include_success_outputs=include_success_outputs,
- skip_cleanup=skip_cleanup,
- )
- else:
- for job in jobs_to_run:
- produce_sbom_for_application_via_cdxgen_server(job, output=None)
-
- for airflow_v in airflow_versions:
- airflow_version_dir = apache_airflow_dir / airflow_v
- destination_dir = airflow_version_dir / "sbom"
- destination_index_path = destination_dir / "index.html"
- get_console().print(f"[info]Generating index for {destination_dir}")
- sbom_files = sorted(destination_dir.glob("apache-airflow-sbom-*"))
- html_template = SBOM_INDEX_TEMPLATE
- if not get_dry_run():
- destination_index_path.write_text(
- jinja2.Template(html_template, autoescape=True,
undefined=StrictUndefined).render(
- version=airflow_v, sbom_files=sbom_files
- )
- )
-
-
# AIRFLOW RELEASE COMMANDS
release_management.add_command(publish_release_candidate)
release_management.add_command(airflow_release)
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index e3cf5605eb..a5076365e9 100644
---
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -151,28 +151,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str,
str | list[str]]]] = {
],
}
],
- "breeze release-management update-sbom-information": [
- {
- "name": "Update SBOM information flags",
- "options": [
- "--airflow-site-dir",
- "--airflow-version",
- "--python",
- "--include-provider-dependencies",
- "--force",
- ],
- },
- {
- "name": "Parallel running",
- "options": [
- "--run-in-parallel",
- "--parallelism",
- "--skip-cleanup",
- "--debug-resources",
- "--include-success-outputs",
- ],
- },
- ],
"breeze release-management start-rc-process": [
{
"name": "Start RC process flags",
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
new file mode 100644
index 0000000000..8106049823
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -0,0 +1,277 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from __future__ import annotations
+
+from pathlib import Path
+
+import click
+
+from airflow_breeze.global_constants import (
+ ALL_HISTORICAL_PYTHON_VERSIONS,
+ DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+ PROVIDER_DEPENDENCIES,
+)
+from airflow_breeze.utils.cdxgen import (
+ SbomApplicationJob,
+ build_providers_base_image,
+ get_cdxgen_port_mapping,
+ get_requirements_for_provider,
+)
+from airflow_breeze.utils.ci_group import ci_group
+from airflow_breeze.utils.click_utils import BreezeGroup
+from airflow_breeze.utils.common_options import (
+ option_answer,
+ option_debug_resources,
+ option_dry_run,
+ option_include_success_outputs,
+ option_parallelism,
+ option_run_in_parallel,
+ option_skip_cleanup,
+ option_verbose,
+)
+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.path_utils import AIRFLOW_TMP_DIR_PATH
+from airflow_breeze.utils.shared_options import get_dry_run
+
+
[email protected](
+ cls=BreezeGroup,
+ name="sbom",
+ help="Tools that release managers can use to prepare sbom information",
+)
+def sbom():
+ pass
+
+
+SBOM_INDEX_TEMPLATE = """
+<html>
+<head><title>CycloneDX SBOMs for Apache Airflow {{ version }}</title></head>
+<body>
+ <h1>CycloneDX SBOMs for Apache Airflow {{ version }}</h1>
+ <ul>
+ {% for sbom_file in sbom_files %}
+ <li><a href="{{ sbom_file.name }}">{{ sbom_file.name }}</a></li>
+ {% endfor %}
+ </ul>
+</body>
+</html>
+"""
+
+
[email protected](name="update-sbom-information", help="Update SBOM information in
airflow-site project.")
[email protected](
+ "--airflow-site-dir",
+ type=click.Path(file_okay=False, dir_okay=True, path_type=Path,
exists=True),
+ required=True,
+ envvar="AIRFLOW_SITE_DIR",
+ help="Directory where airflow-site directory is located.",
+)
[email protected](
+ "--airflow-version",
+ type=str,
+ required=False,
+ envvar="AIRFLOW_VERSION",
+ help="Version of airflow to update sbom from. (defaulted to all active
airflow versions)",
+)
[email protected](
+ "--python",
+ type=BetterChoice(ALL_HISTORICAL_PYTHON_VERSIONS),
+ required=False,
+ envvar="PYTHON_VERSION",
+ help="Python version to update sbom from. (defaults to all python
versions)",
+)
[email protected](
+ "--include-provider-dependencies",
+ is_flag=True,
+ help="Whether to include provider dependencies in SBOM generation.",
+)
+@option_run_in_parallel
+@option_parallelism
+@option_debug_resources
+@option_include_success_outputs
+@option_skip_cleanup
[email protected](
+ "--force",
+ is_flag=True,
+ help="Force update of sbom even if it already exists.",
+)
+@option_verbose
+@option_dry_run
+@option_answer
+def update_sbom_information(
+ airflow_site_dir: Path,
+ airflow_version: str | None,
+ python: str | None,
+ include_provider_dependencies: bool,
+ run_in_parallel: bool,
+ parallelism: int,
+ debug_resources: bool,
+ include_success_outputs: bool,
+ skip_cleanup: bool,
+ force: bool,
+):
+ import jinja2
+ from jinja2 import StrictUndefined
+
+ from airflow_breeze.utils.cdxgen import (
+ produce_sbom_for_application_via_cdxgen_server,
+ start_cdxgen_server,
+ )
+ from airflow_breeze.utils.github import get_active_airflow_versions
+
+ if airflow_version is None:
+ airflow_versions = get_active_airflow_versions()
+ else:
+ airflow_versions = [airflow_version]
+ if python is None:
+ python_versions = ALL_HISTORICAL_PYTHON_VERSIONS
+ else:
+ python_versions = [python]
+ application_root_path = AIRFLOW_TMP_DIR_PATH
+ start_cdxgen_server(application_root_path, run_in_parallel, parallelism)
+
+ jobs_to_run: list[SbomApplicationJob] = []
+
+ apache_airflow_dir = airflow_site_dir / "docs-archive" / "apache-airflow"
+
+ for airflow_v in airflow_versions:
+ airflow_version_dir = apache_airflow_dir / airflow_v
+ if not airflow_version_dir.exists():
+ get_console().print(f"[warning]The {airflow_version_dir} does not
exist. Skipping")
+ continue
+ destination_dir = airflow_version_dir / "sbom"
+ destination_dir.mkdir(parents=True, exist_ok=True)
+ if destination_dir.exists():
+ if not force:
+ get_console().print(f"[warning]The {destination_dir} already
exists. Skipping")
+ continue
+ else:
+ get_console().print(f"[warning]The {destination_dir} already
exists. Forcing update")
+ get_console().print(f"[info]Attempting to update sbom for
{airflow_v}.")
+ get_console().print(f"[success]The {destination_dir} exists.
Proceeding.")
+ for python_version in python_versions:
+ target_sbom_file_name =
f"apache-airflow-sbom-{airflow_v}-python{python_version}.json"
+ target_sbom_path = destination_dir / target_sbom_file_name
+ if target_sbom_path.exists():
+ if not force:
+ get_console().print(f"[warning]The {target_sbom_path}
already exists. Skipping")
+ continue
+ else:
+ get_console().print(f"[warning]The {target_sbom_path}
already exists. Forcing update")
+ jobs_to_run.append(
+ SbomApplicationJob(
+ airflow_version=airflow_v,
+ python_version=python_version,
+ application_root_path=application_root_path,
+
include_provider_dependencies=include_provider_dependencies,
+ target_path=target_sbom_path,
+ )
+ )
+ if run_in_parallel:
+ parallelism = min(parallelism, len(jobs_to_run))
+ get_console().print(f"[info]Running {len(jobs_to_run)} jobs in
parallel")
+ with ci_group(f"Generating SBoMs for
{airflow_versions}:{python_versions}"):
+ all_params = [f"CI {job.airflow_version}:{job.python_version}" for
job in jobs_to_run]
+ with run_with_pool(
+ parallelism=parallelism,
+ all_params=all_params,
+ debug_resources=debug_resources,
+ progress_matcher=ShowLastLineProgressMatcher(),
+ ) as (pool, outputs):
+ port_map = get_cdxgen_port_mapping(parallelism, pool)
+ results = [
+ pool.apply_async(
+ produce_sbom_for_application_via_cdxgen_server,
+ kwds={
+ "job": job,
+ "output": outputs[index],
+ "port_map": port_map,
+ },
+ )
+ for index, job in enumerate(jobs_to_run)
+ ]
+ check_async_run_results(
+ results=results,
+ success="All SBoMs were generated successfully",
+ outputs=outputs,
+ include_success_outputs=include_success_outputs,
+ skip_cleanup=skip_cleanup,
+ )
+ else:
+ for job in jobs_to_run:
+ produce_sbom_for_application_via_cdxgen_server(job, output=None)
+
+ for airflow_v in airflow_versions:
+ airflow_version_dir = apache_airflow_dir / airflow_v
+ destination_dir = airflow_version_dir / "sbom"
+ destination_index_path = destination_dir / "index.html"
+ get_console().print(f"[info]Generating index for {destination_dir}")
+ sbom_files = sorted(destination_dir.glob("apache-airflow-sbom-*"))
+ html_template = SBOM_INDEX_TEMPLATE
+ if not get_dry_run():
+ destination_index_path.write_text(
+ jinja2.Template(html_template, autoescape=True,
undefined=StrictUndefined).render(
+ version=airflow_v, sbom_files=sbom_files
+ )
+ )
+
+
[email protected](name="generate-provider-requirements", help="Generate
requirements for selected provider.")
[email protected](
+ "--airflow-version", type=str, required=False, help="Airflow version to
use to generate the requirements"
+)
[email protected](
+ "--python",
+ type=BetterChoice(ALL_HISTORICAL_PYTHON_VERSIONS),
+ default=DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+ required=False,
+ help="Python version to generate the requirements for",
+)
[email protected](
+ "--provider-id",
+ type=BetterChoice(list(PROVIDER_DEPENDENCIES.keys())),
+ required=True,
+ help="Provider to generate the requirements for",
+)
[email protected](
+ "--provider-version", type=str, required=False, help="Provider version to
generate the requirements for"
+)
+@option_verbose
+@option_dry_run
+@option_answer
+def generate_provider_requirements(
+ airflow_version: str | None,
+ python: str,
+ provider_id: str,
+ provider_version: str | None,
+):
+ perform_environment_checks()
+ 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")
+ build_providers_base_image(airflow_version=airflow_version,
python_version=python)
+ get_requirements_for_provider(
+ provider_id=provider_id,
+ provider_version=provider_version,
+ airflow_version=airflow_version,
+ python_version=python,
+ )
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
new file mode 100644
index 0000000000..14dbcbff38
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -0,0 +1,61 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+SBOM_COMMANDS: dict[str, str | list[str]] = {
+ "name": "SBOM commands",
+ "commands": [
+ "update-sbom-information",
+ "generate-provider-requirements",
+ ],
+}
+
+SBOM_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
+ "breeze sbom update-sbom-information": [
+ {
+ "name": "Update SBOM information flags",
+ "options": [
+ "--airflow-site-dir",
+ "--airflow-version",
+ "--python",
+ "--include-provider-dependencies",
+ "--force",
+ ],
+ },
+ {
+ "name": "Parallel running",
+ "options": [
+ "--run-in-parallel",
+ "--parallelism",
+ "--skip-cleanup",
+ "--debug-resources",
+ "--include-success-outputs",
+ ],
+ },
+ ],
+ "breeze sbom generate-provider-requirements": [
+ {
+ "name": "Generate provider requirements flags",
+ "options": [
+ "--airflow-version",
+ "--python",
+ "--provider-id",
+ "--provider-version",
+ ],
+ },
+ ],
+}
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
index 752c909023..cf6d8cedb7 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
@@ -260,7 +260,11 @@ def dict_hash(dictionary: dict[str, Any]) -> str:
"""MD5 hash of a dictionary. Sorted and dumped via json to account for
random sequence)"""
# noinspection InsecureHash
dhash = hashlib.md5()
- encoded = json.dumps(dictionary, sort_keys=True, default=vars).encode()
+ try:
+ encoded = json.dumps(dictionary, sort_keys=True, default=vars).encode()
+ except TypeError:
+ get_console().print(dictionary)
+ raise
dhash.update(encoded)
return dhash.hexdigest()
diff --git a/dev/breeze/src/airflow_breeze/configure_rich_click.py
b/dev/breeze/src/airflow_breeze/configure_rich_click.py
index f3f55f188e..385ed1d887 100644
--- a/dev/breeze/src/airflow_breeze/configure_rich_click.py
+++ b/dev/breeze/src/airflow_breeze/configure_rich_click.py
@@ -16,6 +16,8 @@
# under the License.
from __future__ import annotations
+from airflow_breeze.commands.sbom_commands_config import SBOM_COMMANDS,
SBOM_PARAMETERS
+
from airflow_breeze.utils import recording # isort:skip # noqa
try:
@@ -69,13 +71,26 @@ else:
**PRODUCTION_IMAGE_TOOLS_PARAMETERS,
**CI_PARAMETERS,
**RELEASE_MANAGEMENT_PARAMETERS,
+ **SBOM_PARAMETERS,
}
click.rich_click.COMMAND_GROUPS = {
"breeze": [
DEVELOPER_COMMANDS,
{
- "name": "Advanced command groups",
- "commands": ["testing", "ci-image", "k8s", "prod-image",
"setup", "release-management", "ci"],
+ "name": "Testing commands",
+ "commands": ["testing", "k8s"],
+ },
+ {
+ "name": "Image commands",
+ "commands": ["ci-image", "prod-image"],
+ },
+ {
+ "name": "Release management commands",
+ "commands": ["release-management", "sbom"],
+ },
+ {
+ "name": "Other commands",
+ "commands": ["setup", "ci"],
},
],
"breeze testing": [TESTING_COMMANDS],
@@ -86,7 +101,8 @@ else:
],
"breeze ci-image": [CI_IMAGE_TOOLS_COMMANDS],
"breeze prod-image": [PRODUCTION_IMAGE_TOOLS_COMMANDS],
- "setup": [SETUP_COMMANDS],
- "release-management": [RELEASE_MANAGEMENT_COMMANDS],
+ "breeze setup": [SETUP_COMMANDS],
+ "breeze release-management": [RELEASE_MANAGEMENT_COMMANDS],
+ "breeze sbom": [SBOM_COMMANDS],
"breeze ci": [CI_COMMANDS],
}
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py
b/dev/breeze/src/airflow_breeze/global_constants.py
index be897924d1..6ecce95b0d 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -287,6 +287,10 @@ AVAILABLE_INTEGRATIONS = [
"trino",
]
ALL_PROVIDER_YAML_FILES =
Path(AIRFLOW_SOURCES_ROOT).glob("airflow/providers/**/provider.yaml")
+
+with Path(AIRFLOW_SOURCES_ROOT, "generated",
"provider_dependencies.json").open() as f:
+ PROVIDER_DEPENDENCIES = json.load(f)
+
# Initialize files for rebuild check
FILES_FOR_REBUILD_CHECK = [
"setup.py",
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index acc713d4cc..a38ddc942e 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -27,8 +27,12 @@ from dataclasses import dataclass
from multiprocessing.pool import Pool
from pathlib import Path
+import yaml
+
+from airflow_breeze.global_constants import DEFAULT_PYTHON_MAJOR_MINOR_VERSION
from airflow_breeze.utils.console import Output, get_console
from airflow_breeze.utils.github import download_file_from_github
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, FILES_DIR
from airflow_breeze.utils.run_utils import run_command
from airflow_breeze.utils.shared_options import get_dry_run
@@ -115,6 +119,98 @@ def get_cdxgen_port_mapping(parallelism: int, pool: Pool)
-> dict[str, int]:
return port_map
+def get_provider_requirement_image_name(airflow_version: str, python_version:
str) -> str:
+ return
f"apache/airflow-dev/base_requirements/{airflow_version}/python{python_version}"
+
+
+def build_providers_base_image(airflow_version: str, python_version: str):
+ image_name = get_provider_requirement_image_name(
+ airflow_version=airflow_version, python_version=python_version
+ )
+ dockerfile = f"""
+FROM ghcr.io/apache/airflow/main/ci/python{python_version}
+RUN pip install --upgrade pip
+# Remove all packages
+RUN python -m venv /opt/airflow/providers
+RUN /opt/airflow/providers/bin/pip install --upgrade pip
+RUN /opt/airflow/providers/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)
+
+
+TARGET_DIR_NAME = "provider_requirements"
+DOCKER_FILE_PREFIX = f"/files/{TARGET_DIR_NAME}/"
+
+
+def get_requirements_for_provider(
+ provider_id: str,
+ airflow_version: str,
+ provider_version: str | None = None,
+ python_version: str = DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+):
+ provider_path_array = provider_id.split(".")
+ if not provider_version:
+ provider_file = (AIRFLOW_SOURCES_ROOT / "airflow" /
"providers").joinpath(
+ *provider_path_array
+ ) / "provider.yaml"
+ provider_version =
yaml.safe_load(provider_file.read_text())["versions"][0]
+ airflow_file_name =
f"provider-{provider_id}-{provider_version}-base-requirements.txt"
+ provider_with_airflow_file_name =
f"provider-{provider_id}-{provider_version}-airflow-requirements.txt"
+ provider_file_name =
f"provider-{provider_id}-{provider_version}-requirements.txt"
+ command = f"""
+mkdir -pv {DOCKER_FILE_PREFIX}
+/opt/airflow/providers/bin/pip freeze | sort >
{DOCKER_FILE_PREFIX}{airflow_file_name}
+/opt/airflow/providers/bin/pip install apache-airflow=={airflow_version} \
+ apache-airflow-providers-{provider_id}=={provider_version}
+/opt/airflow/providers/bin/pip freeze | sort >
{DOCKER_FILE_PREFIX}{provider_with_airflow_file_name}
+chown --recursive {os.getuid()}:{os.getgid()} {DOCKER_FILE_PREFIX}
+"""
+ run_command(
+ [
+ "docker",
+ "run",
+ "--rm",
+ "-e",
+ f"HOST_USER_ID={os.getuid()}",
+ "-e",
+ f"HOST_GROUP_ID={os.getgid()}",
+ "-v",
+ f"{AIRFLOW_SOURCES_ROOT}/files:/files",
+ get_provider_requirement_image_name(
+ airflow_version=airflow_version, python_version=python_version
+ ),
+ "-c",
+ ";".join(command.split("\n")[1:-1]),
+ ]
+ )
+ 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
+ get_console().print(f"[info]Airflow requirements in {airflow_file}")
+ get_console().print(f"[info]Provider requirements in
{provider_with_airflow_file}")
+ base_packages = set([package.split("==")[0] for package in
airflow_file.read_text().split("\n")])
+ base_packages.add("apache-airflow-providers-" + provider_id.replace(".",
"-"))
+ provider_packages = sorted(
+ [
+ line
+ for line in provider_with_airflow_file.read_text().split("\n")
+ if line.split("==")[0] not in base_packages
+ ]
+ )
+ get_console().print(
+ f"[info]Provider {provider_id} has {len(provider_packages)}
transitively "
+ f"dependent packages (excluding airflow and it's dependencies)"
+ )
+ get_console().print(provider_packages)
+ provider_file = target_dir / provider_file_name
+ provider_file.write_text("\n".join(provider_packages) + "\n")
+ get_console().print(
+ f"[success]Generated {provider_id}:{provider_version} requirements in
{provider_file}"
+ )
+
+
@dataclass
class SbomApplicationJob:
airflow_version: str
diff --git a/dev/breeze/src/airflow_breeze/utils/github.py
b/dev/breeze/src/airflow_breeze/utils/github.py
index 370055ff0c..728d459088 100644
--- a/dev/breeze/src/airflow_breeze/utils/github.py
+++ b/dev/breeze/src/airflow_breeze/utils/github.py
@@ -67,7 +67,7 @@ def download_file_from_github(tag: str, path: str,
output_file: Path) -> bool:
ACTIVE_TAG_MATCH = re.compile(r"^(\d+)\.\d+\.\d+$")
-def get_active_airflow_versions() -> list[str]:
+def get_active_airflow_versions(confirm: bool = True) -> list[str]:
"""
Gets list of active Airflow versions from GitHub.
:return: list of active Airflow versions
@@ -100,11 +100,12 @@ def get_active_airflow_versions() -> list[str]:
if match and match.group(1) == "2":
all_active_tags.append(tag)
airflow_versions = sorted(all_active_tags, key=lambda x: Version(x))
- get_console().print(f"All Airflow 2 versions: {all_active_tags}")
- answer = user_confirm(
- "Should we continue with those versions?", quit_allowed=False,
default_answer=Answer.YES
- )
- if answer == Answer.NO:
- get_console().print("[red]Aborting[/]")
- sys.exit(1)
+ if confirm:
+ get_console().print(f"All Airflow 2 versions: {all_active_tags}")
+ answer = user_confirm(
+ "Should we continue with those versions?", quit_allowed=False,
default_answer=Answer.YES
+ )
+ if answer == Answer.NO:
+ get_console().print("[red]Aborting[/]")
+ sys.exit(1)
return airflow_versions
diff --git a/images/breeze/output-commands-hash.txt
b/images/breeze/output-commands-hash.txt
index c11cdbde45..5652ec6d84 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -45,16 +45,18 @@
release-management:prepare-provider-packages:cf41c33c6d6121efef1f1d97333e8710
release-management:release-prod-images:9bf4731e91c435e9df17199c395a23fb
release-management:start-rc-process:6aafbaceabd7b67b9a1af4c2f59abc4c
release-management:start-release:acb384d86e02ff5fde1bf971897be17c
-release-management:update-sbom-information:e6c43441fdda06a7f0d3574de2951360
release-management:verify-provider-packages:566c60fb1bfdc5ed7c4be590736891b2
-release-management:5d53c2230b52ba36cd8bdd65b42da4bc
+release-management:e30735d4b3903a168d8542fca0d92b6d
+sbom:generate-provider-requirements:2353aaccbd92819d168bde4d39a8b7d8
+sbom:update-sbom-information:e6c43441fdda06a7f0d3574de2951360
+sbom:b0f1ca8f60a073e612ae55082733db23
setup:autocomplete:03343478bf1d0cf9c101d454cdb63b68
-setup:check-all-params-in-groups:27a55838171cf07c35e314c43fd73270
+setup:check-all-params-in-groups:daecf114bd2ab1f6d1bf1f1abec15aeb
setup:config:2db1944d8fcb030d4db329a1ff28dd19
-setup:regenerate-command-images:dfb756874dc71ebef60dc0bfd788e06b
+setup:regenerate-command-images:f773bdec7a209069b3cc57ac91db7ed6
setup:self-upgrade:d02f70c7a230eae3463ceec2056b63fa
setup:version:123b462a421884dc2320ffc5e54b2478
-setup:66256c0ba3ae0ffd15b986cbd466ca52
+setup:bc91bc8678e5307258a9c0d78d482d9c
shell:13f90c5749811e2f00e24d95e44e946d
start-airflow:22c118d58b13a9d190e966bed5bb8ed8
static-checks:9985d1db64592e29ab71b8a000ce302e
diff --git a/images/breeze/output-commands.svg
b/images/breeze/output-commands.svg
index 382b9f150a..713fd9f6e0 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1148.0"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1221.1999999999998"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-help-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1097.0" />
+ <rect x="0" y="0" width="1463.0" height="1170.1999999999998" />
</clipPath>
<clipPath id="breeze-help-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -177,9 +177,18 @@
<clipPath id="breeze-help-line-43">
<rect x="0" y="1050.7" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-help-line-44">
+ <rect x="0" y="1075.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-help-line-45">
+ <rect x="0" y="1099.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-help-line-46">
+ <rect x="0" y="1123.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="1146" rx="8"/><text class="breeze-help-title"
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze commands</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="1219.2" rx="8"/><text
class="breeze-help-title" fill="#c5c8c6" text-anchor="middle" x="740"
y="27">Breeze commands</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -234,6 +243,9 @@
</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2"
clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4"
x="24.4" y="1044.8" textLength="280.6"
clip-path="url(#breeze-help-line-42)">release-management     </text><text
class="breeze-help-r2" x="329.4" y="1044.8" textLength="1110.2"
clip-path="url(#breeze-help-line-42)">Tools that release managers can use to prepare and manage
[...]
</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="12.2"
clip-path="url(#breeze-help-line-43)">│</text><text class="breeze-help-r4"
x="24.4" y="1069.2" textLength="280.6"
clip-path="url(#breeze-help-line-43)">ci                     </text><text
class="breeze-help-r2" x="329.4" y="1069.2" textLength="134.2"
clip-path="url(#breeze-help-line-43)">Tools that </text [...]
</text><text class="breeze-help-r5" x="0" y="1093.6" textLength="1464"
clip-path="url(#breeze-help-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r2" x="1464" y="1093.6" textLength="12.2"
clip-path="url(#breeze-help-line-44)">
+</text><text class="breeze-help-r5" x="0" y="1118" textLength="24.4"
clip-path="url(#breeze-help-line-45)">╭─</text><text class="breeze-help-r5"
x="24.4" y="1118" textLength="122"
clip-path="url(#breeze-help-line-45)"> Commands </text><text
class="breeze-help-r5" x="146.4" y="1118" textLength="1293.2"
clip-path="url(#breeze-help-line-45)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-help-r5" [...]
+</text><text class="breeze-help-r5" x="0" y="1142.4" textLength="12.2"
clip-path="url(#breeze-help-line-46)">│</text><text class="breeze-help-r4"
x="24.4" y="1142.4" textLength="97.6"
clip-path="url(#breeze-help-line-46)">sbom    </text><text
class="breeze-help-r2" x="146.4" y="1142.4" textLength="1293.2"
clip-path="url(#breeze-help-line-46)">Tools that release managers can use to prepare sbom information   &
[...]
+</text><text class="breeze-help-r5" x="0" y="1166.8" textLength="1464"
clip-path="url(#breeze-help-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r2" x="1464" y="1166.8" textLength="12.2"
clip-path="url(#breeze-help-line-47)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management.svg
b/images/breeze/output_release-management.svg
index 9ac9bf686f..9ea0d2537c 100644
--- a/images/breeze/output_release-management.svg
+++ b/images/breeze/output_release-management.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 513.5999999999999"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 489.2"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -42,7 +42,7 @@
<defs>
<clipPath id="breeze-release-management-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="462.59999999999997" />
+ <rect x="0" y="0" width="1463.0" height="438.2" />
</clipPath>
<clipPath id="breeze-release-management-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -95,12 +95,9 @@
<clipPath id="breeze-release-management-line-16">
<rect x="0" y="391.9" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-line-17">
- <rect x="0" y="416.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="511.6" rx="8"/><text
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: release-management</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="487.2" rx="8"/><text
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: release-management</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -126,9 +123,8 @@
</text><text class="breeze-release-management-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-13)">│</text><text
class="breeze-release-management-r4" x="24.4" y="337.2" textLength="414.8"
clip-path="url(#breeze-release-management-line-13)">prepare-provider-documentation    </text><text
class="breeze-release-management-r2" x="463.6" y="337.2" textLength="97.6"
clip-path="url(#breeze-release-management-line-13)">Prepare </text>< [...]
</text><text class="breeze-release-management-r5" x="0" y="361.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-14)">│</text><text
class="breeze-release-management-r4" x="24.4" y="361.6" textLength="414.8"
clip-path="url(#breeze-release-management-line-14)">prepare-provider-packages         </text><text
class="breeze-release-management-r2" x="463.6" y="361.6" textLength="976"
clip-path="url(#breeze-release-management-line-14 [...]
</text><text class="breeze-release-management-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-release-management-line-15)">│</text><text
class="breeze-release-management-r4" x="24.4" y="386" textLength="414.8"
clip-path="url(#breeze-release-management-line-15)">release-prod-images               </text><text
class="breeze-release-management-r2" x="463.6" y="386" textLength="976"
clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-16)">│</text><text
class="breeze-release-management-r4" x="24.4" y="410.4" textLength="414.8"
clip-path="url(#breeze-release-management-line-16)">update-sbom-information           </text><text
class="breeze-release-management-r2" x="463.6" y="410.4" textLength="85.4"
clip-path="url(#breeze-release-managem [...]
-</text><text class="breeze-release-management-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-17)">│</text><text
class="breeze-release-management-r4" x="24.4" y="434.8" textLength="414.8"
clip-path="url(#breeze-release-management-line-17)">verify-provider-packages          </text><text
class="breeze-release-management-r2" x="463.6" y="434.8" textLength="976"
clip-path="url(#breeze-release-management-li [...]
-</text><text class="breeze-release-management-r5" x="0" y="459.2"
textLength="1464"
clip-path="url(#breeze-release-management-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r2" x="1464" y="459.2" textLength="12.2"
clip-path="url(#breeze-release-management-line-18)">
+</text><text class="breeze-release-management-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-16)">│</text><text
class="breeze-release-management-r4" x="24.4" y="410.4" textLength="414.8"
clip-path="url(#breeze-release-management-line-16)">verify-provider-packages          </text><text
class="breeze-release-management-r2" x="463.6" y="410.4" textLength="976"
clip-path="url(#breeze-release-management-li [...]
+</text><text class="breeze-release-management-r5" x="0" y="434.8"
textLength="1464"
clip-path="url(#breeze-release-management-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r2" x="1464" y="434.8" textLength="12.2"
clip-path="url(#breeze-release-management-line-17)">
</text>
</g>
</g>
diff --git
a/images/breeze/output_release-management_update-sbom-information.svg
b/images/breeze/output_release-management_update-sbom-information.svg
deleted file mode 100644
index da92384992..0000000000
--- a/images/breeze/output_release-management_update-sbom-information.svg
+++ /dev/null
@@ -1,182 +0,0 @@
-<svg class="rich-terminal" viewBox="0 0 1482 782.0"
xmlns="http://www.w3.org/2000/svg">
- <!-- Generated with Rich https://www.textualize.io -->
- <style>
-
- @font-face {
- font-family: "Fira Code";
- src: local("FiraCode-Regular"),
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2")
format("woff2"),
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff")
format("woff");
- font-style: normal;
- font-weight: 400;
- }
- @font-face {
- font-family: "Fira Code";
- src: local("FiraCode-Bold"),
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2")
format("woff2"),
-
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff")
format("woff");
- font-style: bold;
- font-weight: 700;
- }
-
- .breeze-release-management-update-sbom-information-matrix {
- font-family: Fira Code, monospace;
- font-size: 20px;
- line-height: 24.4px;
- font-variant-east-asian: full-width;
- }
-
- .breeze-release-management-update-sbom-information-title {
- font-size: 18px;
- font-weight: bold;
- font-family: arial;
- }
-
- .breeze-release-management-update-sbom-information-r1 { fill:
#c5c8c6;font-weight: bold }
-.breeze-release-management-update-sbom-information-r2 { fill: #c5c8c6 }
-.breeze-release-management-update-sbom-information-r3 { fill:
#d0b344;font-weight: bold }
-.breeze-release-management-update-sbom-information-r4 { fill:
#68a0b3;font-weight: bold }
-.breeze-release-management-update-sbom-information-r5 { fill: #868887 }
-.breeze-release-management-update-sbom-information-r6 { fill: #cc555a }
-.breeze-release-management-update-sbom-information-r7 { fill: #8d7b39 }
-.breeze-release-management-update-sbom-information-r8 { fill: #8a4346 }
-.breeze-release-management-update-sbom-information-r9 { fill:
#98a84b;font-weight: bold }
- </style>
-
- <defs>
- <clipPath
id="breeze-release-management-update-sbom-information-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="731.0" />
- </clipPath>
- <clipPath id="breeze-release-management-update-sbom-information-line-0">
- <rect x="0" y="1.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-1">
- <rect x="0" y="25.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-2">
- <rect x="0" y="50.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-3">
- <rect x="0" y="74.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-4">
- <rect x="0" y="99.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-5">
- <rect x="0" y="123.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-6">
- <rect x="0" y="147.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-7">
- <rect x="0" y="172.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-8">
- <rect x="0" y="196.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-9">
- <rect x="0" y="221.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-10">
- <rect x="0" y="245.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-11">
- <rect x="0" y="269.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-12">
- <rect x="0" y="294.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-13">
- <rect x="0" y="318.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-14">
- <rect x="0" y="343.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-15">
- <rect x="0" y="367.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-16">
- <rect x="0" y="391.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-17">
- <rect x="0" y="416.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-18">
- <rect x="0" y="440.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-19">
- <rect x="0" y="465.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-20">
- <rect x="0" y="489.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-21">
- <rect x="0" y="513.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-22">
- <rect x="0" y="538.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-23">
- <rect x="0" y="562.7" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-24">
- <rect x="0" y="587.1" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-25">
- <rect x="0" y="611.5" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-26">
- <rect x="0" y="635.9" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-27">
- <rect x="0" y="660.3" width="1464" height="24.65"/>
- </clipPath>
-<clipPath id="breeze-release-management-update-sbom-information-line-28">
- <rect x="0" y="684.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="780" rx="8"/><text
class="breeze-release-management-update-sbom-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: release-management update-sbom-information</text>
- <g transform="translate(26,22)">
- <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
- <circle cx="22" cy="0" r="7" fill="#febc2e"/>
- <circle cx="44" cy="0" r="7" fill="#28c840"/>
- </g>
-
- <g transform="translate(9, 41)"
clip-path="url(#breeze-release-management-update-sbom-information-clip-terminal)">
-
- <g class="breeze-release-management-update-sbom-information-matrix">
- <text class="breeze-release-management-update-sbom-information-r2"
x="1464" y="20" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-0)">
-</text><text class="breeze-release-management-update-sbom-information-r3"
x="12.2" y="44.4" textLength="85.4"
clip-path="url(#breeze-release-management-update-sbom-information-line-1)">Usage: </text><text
class="breeze-release-management-update-sbom-information-r1" x="97.6" y="44.4"
textLength="622.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-1)">breeze release-management update-sbom-information [</text><text
class="breeze-release-manageme [...]
-</text><text class="breeze-release-management-update-sbom-information-r2"
x="1464" y="68.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-2)">
-</text><text class="breeze-release-management-update-sbom-information-r2"
x="12.2" y="93.2" textLength="85.4"
clip-path="url(#breeze-release-management-update-sbom-information-line-3)">Update </text><text
class="breeze-release-management-update-sbom-information-r4" x="97.6" y="93.2"
textLength="48.8"
clip-path="url(#breeze-release-management-update-sbom-information-line-3)">SBOM</text><text
class="breeze-release-management-update-sbom-information-r2" x="146.4"
y="93.2" textLength="4 [...]
-</text><text class="breeze-release-management-update-sbom-information-r2"
x="1464" y="117.6" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-4)">
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="142" textLength="24.4"
clip-path="url(#breeze-release-management-update-sbom-information-line-5)">╭─</text><text
class="breeze-release-management-update-sbom-information-r5" x="24.4" y="142"
textLength="378.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-5)"> Update SBOM information flags </text><text
class="breeze-release-management-update-sbom-informatio [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-6)">│</text><text
class="breeze-release-management-update-sbom-information-r6" x="24.4"
y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-6)">*</text><text
class="breeze-release-management-update-sbom-information-r4" x="61" y="166.4"
textLength="12.2" clip-path="u [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-7)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="61" y="190.8"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-7)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="73.2"
y="190.8" textLength="97.6" clip-path="u [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="215.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-8)">│</text><text
class="breeze-release-management-update-sbom-information-r2" x="488" y="215.2"
textLength="951.6"
clip-path="url(#breeze-release-management-update-sbom-information-line-8)">versions)                   
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-9)">│</text><text
class="breeze-release-management-update-sbom-information-r7" x="488" y="239.6"
textLength="951.6"
clip-path="url(#breeze-release-management-update-sbom-information-line-9)">(TEXT)                   &#
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="264" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-10)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="61" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-10)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="73.2" y="264"
textLength="85.4" clip-path="url(# [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-11)">│</text><text
class="breeze-release-management-update-sbom-information-r7" x="488" y="288.4"
textLength="841.8"
clip-path="url(#breeze-release-management-update-sbom-information-line-11)">(3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11)     
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="312.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-12)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="61" y="312.8"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-12)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="73.2"
y="312.8" textLength="97.6" clip-path= [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-13)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="61" y="337.2"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-13)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="73.2"
y="337.2" textLength="73.2" clip-path= [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="361.6" textLength="1464"
clip-path="url(#breeze-release-management-update-sbom-information-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-update-sbom-information-r2" x="1464"
y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-14)">
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="386" textLength="24.4"
clip-path="url(#breeze-release-management-update-sbom-information-line-15)">╭─</text><text
class="breeze-release-management-update-sbom-information-r5" x="24.4" y="386"
textLength="219.6"
clip-path="url(#breeze-release-management-update-sbom-information-line-15)"> Parallel running </text><text
class="breeze-release-management-update-sbom-information-r5" x="244" y="386"
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="410.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-16)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="410.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-16)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="410.4" textLength="48.8" clip-pat [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="434.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-17)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="434.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-17)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="434.8" textLength="146.4" clip-pa [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="459.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-18)">│</text><text
class="breeze-release-management-update-sbom-information-r7" x="378.2"
y="459.2" textLength="915"
clip-path="url(#breeze-release-management-update-sbom-information-line-18)">(INTEGER RANGE)                
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="483.6" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-19)">│</text><text
class="breeze-release-management-update-sbom-information-r5" x="378.2"
y="483.6" textLength="915"
clip-path="url(#breeze-release-management-update-sbom-information-line-19)">[default: 4; 1<=x<=8]              
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="508" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-20)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4" y="508"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-20)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6" y="508"
textLength="61" clip-path="url(# [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="532.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-21)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="532.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-21)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="532.4" textLength="73.2" clip-pat [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="556.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-22)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="556.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-22)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="556.8" textLength="97.6" clip-pat [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="581.2" textLength="1464"
clip-path="url(#breeze-release-management-update-sbom-information-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-update-sbom-information-r2" x="1464"
y="581.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-23)">
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="605.6" textLength="24.4"
clip-path="url(#breeze-release-management-update-sbom-information-line-24)">╭─</text><text
class="breeze-release-management-update-sbom-information-r5" x="24.4"
y="605.6" textLength="195.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-24)"> Common options </text><text
class="breeze-release-management-update-sbom-information-r5" x="219.6" y="
[...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="630" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-25)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4" y="630"
textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-25)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6" y="630"
textLength="97.6" clip-path="url [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="654.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-26)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="654.4" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-26)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="654.4" textLength="48.8" clip-pat [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="678.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-27)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="678.8" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-27)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="678.8" textLength="85.4" clip-pat [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="703.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-28)">│</text><text
class="breeze-release-management-update-sbom-information-r4" x="24.4"
y="703.2" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-28)">-</text><text
class="breeze-release-management-update-sbom-information-r4" x="36.6"
y="703.2" textLength="61" clip-path= [...]
-</text><text class="breeze-release-management-update-sbom-information-r5"
x="0" y="727.6" textLength="1464"
clip-path="url(#breeze-release-management-update-sbom-information-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-update-sbom-information-r2" x="1464"
y="727.6" textLength="12.2"
clip-path="url(#breeze-release-management-update-sbom-information-line-29)">
-</text>
- </g>
- </g>
-</svg>
diff --git a/images/breeze/output_sbom.svg b/images/breeze/output_sbom.svg
new file mode 100644
index 0000000000..b5e3a895e6
--- /dev/null
+++ b/images/breeze/output_sbom.svg
@@ -0,0 +1,107 @@
+<svg class="rich-terminal" viewBox="0 0 1482 342.79999999999995"
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-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-sbom-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-sbom-r1 { fill: #c5c8c6;font-weight: bold }
+.breeze-sbom-r2 { fill: #c5c8c6 }
+.breeze-sbom-r3 { fill: #d0b344;font-weight: bold }
+.breeze-sbom-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-sbom-r5 { fill: #868887 }
+.breeze-sbom-r6 { fill: #98a84b;font-weight: bold }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-sbom-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="291.79999999999995" />
+ </clipPath>
+ <clipPath id="breeze-sbom-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+ </defs>
+
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="340.8" rx="8"/><text class="breeze-sbom-title"
fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: 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"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)"
clip-path="url(#breeze-sbom-clip-terminal)">
+
+ <g class="breeze-sbom-matrix">
+ <text class="breeze-sbom-r2" x="1464" y="20" textLength="12.2"
clip-path="url(#breeze-sbom-line-0)">
+</text><text class="breeze-sbom-r3" x="12.2" y="44.4" textLength="85.4"
clip-path="url(#breeze-sbom-line-1)">Usage: </text><text
class="breeze-sbom-r1" x="97.6" y="44.4" textLength="158.6"
clip-path="url(#breeze-sbom-line-1)">breeze sbom [</text><text
class="breeze-sbom-r4" x="256.2" y="44.4" textLength="85.4"
clip-path="url(#breeze-sbom-line-1)">OPTIONS</text><text class="breeze-sbom-r1"
x="341.6" y="44.4" textLength="24.4"
clip-path="url(#breeze-sbom-line-1)">] </te [...]
+</text><text class="breeze-sbom-r2" x="1464" y="68.8" textLength="12.2"
clip-path="url(#breeze-sbom-line-2)">
+</text><text class="breeze-sbom-r2" x="12.2" y="93.2" textLength="768.6"
clip-path="url(#breeze-sbom-line-3)">Tools that release managers can use to prepare sbom information</text><text
class="breeze-sbom-r2" x="1464" y="93.2" textLength="12.2"
clip-path="url(#breeze-sbom-line-3)">
+</text><text class="breeze-sbom-r2" x="1464" y="117.6" textLength="12.2"
clip-path="url(#breeze-sbom-line-4)">
+</text><text class="breeze-sbom-r5" x="0" y="142" textLength="24.4"
clip-path="url(#breeze-sbom-line-5)">╭─</text><text class="breeze-sbom-r5"
x="24.4" y="142" textLength="195.2"
clip-path="url(#breeze-sbom-line-5)"> Common options </text><text
class="breeze-sbom-r5" x="219.6" y="142" textLength="1220"
clip-path="url(#breeze-sbom-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-sbom-r5" [...]
+</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-r2"
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-r2" 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="122"
clip-path="url(#breeze-sbom-line-8)"> Commands </text><text
class="breeze-sbom-r5" x="146.4" y="215.2" textLength="1293.2"
clip-path="url(#breeze-sbom-line-8)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-sbom-r5" [...]
+</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)">generate-provider-requirements              </text><text
class="breeze-sbom-r2" x="585.6" y="239.6" textLength="854"
clip-path="url(#breeze-sbom-line-9)">Generate requirements for selected
[...]
+</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)">update-sbom-information                     </text><text
class="breeze-sbom-r2" x="585.6" y="264" textLength="85.4"
clip-path="url(#breeze-sbom-line-10)">Update </te [...]
+</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-r2" x="1464" y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-line-11)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/images/breeze/output_sbom_generate-provider-requirements.svg
b/images/breeze/output_sbom_generate-provider-requirements.svg
new file mode 100644
index 0000000000..e433f73dd2
--- /dev/null
+++ b/images/breeze/output_sbom_generate-provider-requirements.svg
@@ -0,0 +1,170 @@
+<svg class="rich-terminal" viewBox="0 0 1482 708.8"
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-generate-provider-requirements-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-sbom-generate-provider-requirements-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-sbom-generate-provider-requirements-r1 { fill:
#c5c8c6;font-weight: bold }
+.breeze-sbom-generate-provider-requirements-r2 { fill: #c5c8c6 }
+.breeze-sbom-generate-provider-requirements-r3 { fill: #d0b344;font-weight:
bold }
+.breeze-sbom-generate-provider-requirements-r4 { fill: #68a0b3;font-weight:
bold }
+.breeze-sbom-generate-provider-requirements-r5 { fill: #868887 }
+.breeze-sbom-generate-provider-requirements-r6 { fill: #8d7b39 }
+.breeze-sbom-generate-provider-requirements-r7 { fill: #cc555a }
+.breeze-sbom-generate-provider-requirements-r8 { fill: #8a4346 }
+.breeze-sbom-generate-provider-requirements-r9 { fill: #98a84b;font-weight:
bold }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-sbom-generate-provider-requirements-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="657.8" />
+ </clipPath>
+ <clipPath id="breeze-sbom-generate-provider-requirements-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-16">
+ <rect x="0" y="391.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-17">
+ <rect x="0" y="416.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-18">
+ <rect x="0" y="440.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-19">
+ <rect x="0" y="465.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-20">
+ <rect x="0" y="489.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-21">
+ <rect x="0" y="513.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-22">
+ <rect x="0" y="538.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-23">
+ <rect x="0" y="562.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-24">
+ <rect x="0" y="587.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-generate-provider-requirements-line-25">
+ <rect x="0" y="611.5" width="1464" height="24.65"/>
+ </clipPath>
+ </defs>
+
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="706.8" rx="8"/><text
class="breeze-sbom-generate-provider-requirements-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom generate-provider-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"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)"
clip-path="url(#breeze-sbom-generate-provider-requirements-clip-terminal)">
+
+ <g class="breeze-sbom-generate-provider-requirements-matrix">
+ <text class="breeze-sbom-generate-provider-requirements-r2" x="1464"
y="20" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-0)">
+</text><text class="breeze-sbom-generate-provider-requirements-r3" x="12.2"
y="44.4" textLength="85.4"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-1)">Usage: </text><text
class="breeze-sbom-generate-provider-requirements-r1" x="97.6" y="44.4"
textLength="536.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-1)">breeze sbom generate-provider-requirements [</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="634.4" y [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r2" x="1464"
y="68.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-2)">
+</text><text class="breeze-sbom-generate-provider-requirements-r2" x="12.2"
y="93.2" textLength="536.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-3)">Generate requirements for selected provider.</text><text
class="breeze-sbom-generate-provider-requirements-r2" x="1464" y="93.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-3)">
+</text><text class="breeze-sbom-generate-provider-requirements-r2" x="1464"
y="117.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-4)">
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="142" textLength="24.4"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-5)">╭─</text><text
class="breeze-sbom-generate-provider-requirements-r5" x="24.4" y="142"
textLength="195.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-5)"> Common options </text><text
class="breeze-sbom-generate-provider-requirements-r5" x="219.6" y="142"
textLength="1220" clip-path="url(#br [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="166.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-6)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-6)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="166.4"
textLength="97.6" clip-path="url(#breeze-sbom-generate-provider-r [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="190.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-7)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-7)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="190.8"
textLength="85.4" clip-path="url(#breeze-sbom-generate-provider-r [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="215.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-8)">│</text><text
class="breeze-sbom-generate-provider-requirements-r7" x="24.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-8)">*</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="215.2"
textLength="12.2" clip-path="url(#breeze-sbom-generate-provider-r [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-9)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="239.6"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-9)">(airbyte | alibaba | amazon | apache.beam | apache.cassandra | apache.drill |  
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="264" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-10)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="264"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-10)">apache.druid | apache.flink | apache.hdfs | apache.hive | apache.impala | apache.kafka | 
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-11)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="288.4"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-11)">apache.kylin | apache.livy | apache.pig | apache.pinot | apache.spark | apache.sqoop |
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-12)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="312.8"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-12)">arangodb | asana | atlassian.jira | celery | cloudant | cncf.kubernetes | common.sql&
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="337.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-13)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="337.2"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-13)">databricks | datadog | dbt.cloud | dingding | discord | docker | elasticsearch |
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-14)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="361.6"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-14)">facebook | ftp | github | google | grpc | hashicorp | http | imap |
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="386" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-15)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="386"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-15)">jenkins | microsoft.azure | microsoft.mssql | microsoft.psrp | microsoft.winrm | mongo | 
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-16)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="410.4"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-16)">mysql | neo4j | odbc | openfaas | openlineage | opsgenie | oracle | pagerdu
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-17)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="434.8"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-17)">| plexus | postgres | presto | qubole | redis | salesforce | samba | s
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-18)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="459.2"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-18)">sftp | singularity | slack | smtp | snowflake | sqlite | ssh | tableau 
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-19)">│</text><text
class="breeze-sbom-generate-provider-requirements-r6" x="353.8" y="483.6"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-19)">telegram | trino | vertica | zendesk)             
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="508" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-20)">│</text><text
class="breeze-sbom-generate-provider-requirements-r8" x="353.8" y="508"
textLength="1085.8"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-20)">[required]                       &
[...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-21)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-21)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="532.4"
textLength="109.8" clip-path="url(#breeze-sbom-generate-provide [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="556.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-22)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-22)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="556.8"
textLength="97.6" clip-path="url(#breeze-sbom-generate-provider [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="581.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-23)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-23)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="581.2"
textLength="48.8" clip-path="url(#breeze-sbom-generate-provider [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-24)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-24)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="605.6"
textLength="85.4" clip-path="url(#breeze-sbom-generate-provider [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="630" textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-25)">│</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="61" y="630"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-25)">-</text><text
class="breeze-sbom-generate-provider-requirements-r4" x="73.2" y="630"
textLength="61" clip-path="url(#breeze-sbom-generate-provider-require [...]
+</text><text class="breeze-sbom-generate-provider-requirements-r5" x="0"
y="654.4" textLength="1464"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-generate-provider-requirements-r2" x="1464" y="654.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-provider-requirements-line-26)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/images/breeze/output_sbom_update-sbom-information.svg
b/images/breeze/output_sbom_update-sbom-information.svg
new file mode 100644
index 0000000000..3a42a8a4be
--- /dev/null
+++ b/images/breeze/output_sbom_update-sbom-information.svg
@@ -0,0 +1,166 @@
+<svg class="rich-terminal" viewBox="0 0 1482 684.4"
xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2")
format("woff2"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff")
format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2")
format("woff2"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff")
format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-sbom-update-sbom-information-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-sbom-update-sbom-information-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-sbom-update-sbom-information-r1 { fill: #c5c8c6;font-weight: bold }
+.breeze-sbom-update-sbom-information-r2 { fill: #c5c8c6 }
+.breeze-sbom-update-sbom-information-r3 { fill: #d0b344;font-weight: bold }
+.breeze-sbom-update-sbom-information-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-sbom-update-sbom-information-r5 { fill: #868887 }
+.breeze-sbom-update-sbom-information-r6 { fill: #cc555a }
+.breeze-sbom-update-sbom-information-r7 { fill: #8d7b39 }
+.breeze-sbom-update-sbom-information-r8 { fill: #8a4346 }
+.breeze-sbom-update-sbom-information-r9 { fill: #98a84b;font-weight: bold }
+ </style>
+
+ <defs>
+ <clipPath id="breeze-sbom-update-sbom-information-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="633.4" />
+ </clipPath>
+ <clipPath id="breeze-sbom-update-sbom-information-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-10">
+ <rect x="0" y="245.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-11">
+ <rect x="0" y="269.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-12">
+ <rect x="0" y="294.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-15">
+ <rect x="0" y="367.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-16">
+ <rect x="0" y="391.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-17">
+ <rect x="0" y="416.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-18">
+ <rect x="0" y="440.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-19">
+ <rect x="0" y="465.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-20">
+ <rect x="0" y="489.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-21">
+ <rect x="0" y="513.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-22">
+ <rect x="0" y="538.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-23">
+ <rect x="0" y="562.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-24">
+ <rect x="0" y="587.1" width="1464" height="24.65"/>
+ </clipPath>
+ </defs>
+
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="682.4" rx="8"/><text
class="breeze-sbom-update-sbom-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom update-sbom-information</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-update-sbom-information-clip-terminal)">
+
+ <g class="breeze-sbom-update-sbom-information-matrix">
+ <text class="breeze-sbom-update-sbom-information-r2" x="1464" y="20"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-0)">
+</text><text class="breeze-sbom-update-sbom-information-r3" x="12.2" y="44.4"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-1)">Usage: </text><text
class="breeze-sbom-update-sbom-information-r1" x="97.6" y="44.4"
textLength="451.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-1)">breeze sbom update-sbom-information [</text><text
class="breeze-sbom-update-sbom-information-r4" x="549" y="44.4"
textLength="85.4" clip-path="url(#br [...]
+</text><text class="breeze-sbom-update-sbom-information-r2" x="1464" y="68.8"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-2)">
+</text><text class="breeze-sbom-update-sbom-information-r2" x="12.2" y="93.2"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-3)">Update </text><text
class="breeze-sbom-update-sbom-information-r4" x="97.6" y="93.2"
textLength="48.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-3)">SBOM</text><text
class="breeze-sbom-update-sbom-information-r2" x="146.4" y="93.2"
textLength="451.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-3)"> [...]
+</text><text class="breeze-sbom-update-sbom-information-r2" x="1464" y="117.6"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-4)">
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="142"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="142"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)"> Common options </text><text
class="breeze-sbom-update-sbom-information-r5" x="219.6" y="142"
textLength="1220" clip-path="url(#breeze-sbom-update-sbom-information-l [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="24.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">*</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">-</text><text
class=" [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="190.8"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">-airflow</text><text
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">│</text><text
class="breeze-sbom-update-sbom-information-r2" x="512.4" y="215.2"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">versions)                            
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="512.4" y="239.6"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">(TEXT)                            &#
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="264" textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="264"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">-python</text><text
clas [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="512.4" y="288.4"
textLength="841.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">(3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11)              
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="312.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="312.8"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">-include</text><te
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="337.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="337.2"
textLength="48.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">-run</text><text
c [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="361.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="361.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="361.6"
textLength="146.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">-parallelism</tex
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="512.4" y="386"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">(INTEGER RANGE)                          
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">│</text><text
class="breeze-sbom-update-sbom-information-r5" x="512.4" y="410.4"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">[default: 4; 1<=x<=8]                       &
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="434.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="434.8"
textLength="73.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">-debug</text><text
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="459.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="459.2"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">-include</text><te
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="483.6"
textLength="61"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">-skip</text><text
cl [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="508" textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="508"
textLength="73.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">-force</text><text
class [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="532.4"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">-verbose</text><te
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="556.8"
textLength="48.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">-dry</text><text
c [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="581.2"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">-answer</text><tex
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">-</text><text
class="breeze-sbom-update-sbom-information-r4" x="73.2" y="605.6"
textLength="61"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">-help</text><text
cl [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="630"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r2" x="1464" y="630"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-25)">
+</text>
+ </g>
+ </g>
+</svg>
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 6e663cee02..d1dfe2d6c0 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -155,8 +155,8 @@
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">release-management:install-provider-packages | release-management:prepare-airflow-package |         
[...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |     </text><text
class=" [...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:release-prod-images | release-management:start-rc-process |           
[...]
-</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:start-release | release-management:update-sbom-information |           
[...]
-</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:verify-provider-packages | release-management | setup:autocomplete |        
[...]
+</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:start-release | release-management:verify-provider-packages | release-management |  </text><text
class="b [...]
+</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)">sbom:generate-provider-requirements | sbom:update-sbom-information | sbom | setup:autocomplete |    
[...]
</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)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images | setup:self-upgrade </text><text
class="b [...]
</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)">| setup:version | setup | shell | start-airflow | static-checks | testing:docker-compose-tests | &
[...]
</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)">testing:helm-tests | testing:integration-tests | testing:tests | testing)         &#
[...]
diff --git a/images/breeze/output_setup_regenerate-command-images.svg
b/images/breeze/output_setup_regenerate-command-images.svg
index 3c3db22746..a766eb33b1 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -168,8 +168,8 @@
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:install-provider-packages | release-management:prepare-airflow-package |         </text>
[...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |  </text><text
class="breeze-setup-regen [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:release-prod-images | release-management:start-rc-process |           
[...]
-</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:start-release | release-management:update-sbom-information |           
[...]
-</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:verify-provider-packages | release-management | setup:autocomplete |        
[...]
+</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:start-release | release-management:verify-provider-packages | release-management </text><text
class="breeze-setup-regen [...]
+</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)">| sbom:generate-provider-requirements | sbom:update-sbom-information | sbom | setup:autocomplete |  </text><text
[...]
</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)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images |          
[...]
</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)">setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks |    
[...]
</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)">testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests |     </t
[...]