You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2022/09/02 21:20:53 UTC

[airflow] branch main updated: Convert Helm tests to use the new Python Breeeze (#25678)

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 37581dadaa Convert Helm tests to use the new Python Breeeze (#25678)
37581dadaa is described below

commit 37581dadaa9732f216bb455f601ac24cc031dac4
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Sep 2 23:20:45 2022 +0200

    Convert Helm tests to use the new Python Breeeze (#25678)
    
    This PR converts the Helm tests to use the new Python Breeze.
    It has all the features of previous Kind breeze command and more.
    
    All the commands are now grupped under k8s group and they are very
    easy to use locally (even easier than the previous version).
    
    The CI part is also converted and simplified - i.e. the upgrade
    test is now much faster (only tests one upgrade per job and it
    runs withing the original Helm/Kubernetes tests jobs so it will
    not have the cluster creation overhead.
    
    Most importantly - this is almost the last step before we can get
    rid of the old legacy breeze code and one that we can get rid of
    the `./breeze-legacy` script because all functionality from the
    old breeze has been moved to the Python version with this change.
    
    This removal allows us also to remove a lot of the common library
    bash code that is not used any more anywhere - even in CI.
    
    The only change left is running regular tests in parallel.
    
    Closes: #23085
---
 .gitattributes                                     |    3 -
 .github/CODEOWNERS                                 |    2 -
 .github/workflows/ci.yml                           |  149 +-
 .gitpod.yml                                        |    2 +-
 .pre-commit-config.yaml                            |   17 +-
 BREEZE.rst                                         |  287 ++-
 CI.rst                                             |    8 +-
 CONTRIBUTING.rst                                   |    7 -
 Dockerfile.ci                                      |    3 +-
 LOCAL_VIRTUALENV.rst                               |   14 +-
 STATIC_CODE_CHECKS.rst                             |    2 -
 TESTING.rst                                        |  539 ++--
 breeze-complete                                    |  334 ---
 breeze-legacy                                      | 2579 --------------------
 dev/airflow-github                                 |    4 -
 dev/breeze/src/airflow_breeze/breeze.py            |    2 +
 .../airflow_breeze/commands/kubernetes_commands.py | 1467 +++++++++++
 .../commands/kubernetes_commands_config.py         |  232 ++
 .../commands/production_image_commands.py          |    5 +-
 .../src/airflow_breeze/configure_rich_click.py     |   14 +-
 dev/breeze/src/airflow_breeze/global_constants.py  |   30 +-
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |    1 -
 dev/breeze/src/airflow_breeze/utils/ci_group.py    |    8 +-
 .../src/airflow_breeze/utils/host_info_utils.py    |   54 +-
 .../src/airflow_breeze/utils/kubernetes_utils.py   |  578 +++++
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |   32 +-
 .../src/airflow_breeze/utils/selective_checks.py   |   50 +-
 dev/breeze/tests/test_host_info_utils.py           |    2 +-
 images/breeze/output-commands-hash.txt             |   19 +-
 images/breeze/output-commands.svg                  |  196 +-
 images/breeze/output_build-docs.svg                |  116 +-
 images/breeze/output_k8s.svg                       |  175 ++
 images/breeze/output_k8s_build-k8s-image.svg       |  164 ++
 images/breeze/output_k8s_configure-cluster.svg     |  168 ++
 images/breeze/output_k8s_create-cluster.svg        |  180 ++
 images/breeze/output_k8s_delete-cluster.svg        |  140 ++
 images/breeze/output_k8s_deploy-airflow.svg        |  196 ++
 images/breeze/output_k8s_k9s.svg                   |  128 +
 images/breeze/output_k8s_logs.svg                  |  140 ++
 images/breeze/output_k8s_setup-env.svg             |  111 +
 images/breeze/output_k8s_shell.svg                 |  144 ++
 images/breeze/output_k8s_status.svg                |  144 ++
 images/breeze/output_k8s_tests.svg                 |  192 ++
 images/breeze/output_k8s_upload-k8s-image.svg      |  176 ++
 ...e-management_prepare-provider-documentation.svg |   28 +-
 ...elease-management_prepare-provider-packages.svg |   30 +-
 .../output_setup_regenerate-command-images.svg     |  140 +-
 images/breeze/output_static-checks.svg             |  236 +-
 kubernetes_tests/test_kubernetes_executor.py       |    2 +
 kubernetes_tests/test_kubernetes_pod_operator.py   |    1 +
 scripts/ci/docker-compose/devcontainer.env         |    2 +-
 scripts/ci/kubernetes/ci_run_helm_upgrade.sh       |   26 -
 scripts/ci/kubernetes/ci_run_kubernetes_tests.sh   |  130 -
 ...tup_cluster_and_deploy_airflow_to_kubernetes.sh |   34 -
 ..._cluster_and_run_kubernetes_tests_single_job.sh |   70 -
 ...lusters_and_run_kubernetes_tests_in_parallel.sh |   37 -
 ...cluster_with_different_executors_in_parallel.sh |   36 -
 ..._cluster_with_different_executors_single_job.sh |   70 -
 scripts/ci/kubernetes/k8s_requirements.txt         |    7 +
 scripts/ci/kubernetes/redeploy_airflow.sh          |   28 -
 scripts/ci/libraries/_all_libs.sh                  |    8 -
 scripts/ci/libraries/_initialization.sh            |   82 +-
 scripts/ci/libraries/_kind.sh                      |  397 ---
 scripts/ci/libraries/_parallel.sh                  |   58 -
 scripts/ci/libraries/_parameters.sh                |   68 -
 scripts/ci/libraries/_push_pull_remove_images.sh   |   87 -
 scripts/ci/libraries/_repeats.sh                   |   46 -
 scripts/ci/libraries/_sanity_checks.sh             |    4 +-
 scripts/ci/libraries/_script_init.sh               |    2 +-
 scripts/ci/libraries/_verbosity.sh                 |   55 -
 .../ci/pre_commit/pre_commit_breeze_cmd_line.py    |    6 +-
 .../ci/pre_commit/pre_commit_check_integrations.sh |   45 -
 scripts/ci/pre_commit/pre_commit_flake8.py         |    5 +-
 scripts/ci/pre_commit/pre_commit_helm_lint.py      |   45 +
 scripts/ci/pre_commit/pre_commit_helm_lint.sh      |   32 -
 .../pre_commit/pre_commit_migration_reference.py   |    5 +-
 scripts/ci/pre_commit/pre_commit_mypy.py           |    4 +-
 scripts/docker/entrypoint_ci.sh                    |    1 -
 scripts/in_container/_in_container_utils.sh        |    2 +-
 .../kubernetes/operators/test_kubernetes_pod.py    |    1 +
 80 files changed, 5649 insertions(+), 4995 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 5f8117153f..4ee74a9d8a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,3 @@
-breeze export-ignore
-breeze-legacy export-ignore
-breeze-complete export-ignore
 clients export-ignore
 clients export-ignore
 dev export-ignore
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 67bff70e7b..bb601bec77 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -70,8 +70,6 @@
 
 # Dev tools
 /.github/workflows/ @potiuk @ashb @kaxil
-breeze @potiuk
-breeze-complete @potiuk
 Dockerfile @potiuk @ashb @mik-laj
 Dockerfile.ci @potiuk @ashb
 /dev/ @potiuk @ashb @jedcunningham
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d98f596e54..de17aa47a6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -133,13 +133,10 @@ jobs:
       all-python-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.all-python-versions-list-as-string }}
       default-python-version: ${{ steps.selective-checks.outputs.default-python-version }}
-      min-max-python-versions-as-string: >-
-        ${{ steps.selective-checks.outputs.min-max-python-versions-as-string }}
       kubernetes-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.kubernetes-versions-list-as-string }}
+      kubernetes-combos: ${{ steps.selective-checks.outputs.kubernetes-combos }}
       default-kubernetes-version: ${{ steps.selective-checks.outputs.default-kubernetes-version }}
-      min-max-kubernetes-versions-as-string: >-
-        ${{ steps.selective-checks.outputs.min-max-kubernetes-versions-as-string }}
       postgres-versions: ${{ steps.selective-checks.outputs.postgres-versions }}
       default-postgres-version: ${{ steps.selective-checks.outputs.default-postgres-version }}
       mysql-versions: ${{ steps.selective-checks.outputs.mysql-versions }}
@@ -1441,7 +1438,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-kubernetes:
     timeout-minutes: 240
-    name: Helm Chart; ${{matrix.executor}} - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+    name: "Helm: ${{matrix.executor}} - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}"
     runs-on: ${{ needs.build-info.outputs.runs-on }}
     needs: [build-info, wait-for-prod-images]
     strategy:
@@ -1450,17 +1447,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       fail-fast: false
     env:
       RUNS_ON: ${{ needs.build-info.outputs.runs-on }}
-      BACKEND: postgres
-      RUN_TESTS: "true"
-      RUNTIME: "kubernetes"
-      KUBERNETES_MODE: "image"
-      EXECUTOR: ${{matrix.executor}}
-      KIND_VERSION: "${{ needs.build-info.outputs.default-kind-version }}"
-      HELM_VERSION: "${{ needs.build-info.outputs.default-helm-version }}"
-      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.python-versions-list-as-string}}
-      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
     if: >
       ( needs.build-info.outputs.run-kubernetes-tests == 'true' ||
       needs.build-info.outputs.needs-helm-tests == 'true' ) &&
@@ -1489,98 +1475,63 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       - name: "Cache bin folder with tools for kubernetes testing"
         uses: actions/cache@v3
         with:
-          path: ".build/kubernetes-bin"
-          key: "kubernetes-binaries
--${{ needs.build-info.outputs.default-kind-version }}\
--${{ needs.build-info.outputs.default-helm-version }}"
-          restore-keys: "kubernetes-binaries"
-      - name: "Kubernetes Tests"
-        run: ./scripts/ci/kubernetes/ci_setup_clusters_and_run_kubernetes_tests_in_parallel.sh
-        env:
-          PR_LABELS: "${{ needs.build-info.outputs.pull-request-labels }}"
-      - name: "Upload KinD logs"
-        uses: actions/upload-artifact@v3
-        if: failure() || cancelled()
-        with:
-          name: kind-logs-${{matrix.executor}}
-          path: /tmp/kind_logs_*
-          retention-days: 7
-      - name: "Fix ownership"
-        run: breeze ci fix-ownership
-        if: always()
-
-  tests-helm-executor-upgrade:
-    timeout-minutes: 150
-    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
-    runs-on: ${{ needs.build-info.outputs.runs-on }}
-    needs: [build-info, wait-for-prod-images]
-    env:
-      RUNS_ON: ${{ needs.build-info.outputs.runs-on }}
-      BACKEND: postgres
-      RUN_TESTS: "true"
-      RUNTIME: "kubernetes"
-      KUBERNETES_MODE: "image"
-      EXECUTOR: "KubernetesExecutor"
-      KIND_VERSION: "${{ needs.build-info.outputs.default-kind-version }}"
-      HELM_VERSION: "${{ needs.build-info.outputs.default-helm-version }}"
-      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >-
-        ${{needs.build-info.outputs.min-max-python-versions-as-string}}
-      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >-
-        ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
-    if: >
-      needs.build-info.outputs.run-kubernetes-tests == 'true' &&
-      needs.build-info.outputs.default-branch == 'main'
-    steps:
-      - name: Cleanup repo
-        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
-      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
-        uses: actions/checkout@v3
-        with:
-          persist-credentials: false
-      - name: "Setup python"
-        uses: actions/setup-python@v4
-        with:
-          python-version: ${{ needs.build-info.outputs.default-python-version }}
-          cache: 'pip'
-          cache-dependency-path: ./dev/breeze/setup*
-      - run: ./scripts/ci/install_breeze.sh
-      - name: "Free space"
-        run: breeze ci free-space
-      - name: Pull PROD images ${{ env.PYTHON_VERSIONS }}:${{ env.IMAGE_TAG_FOR_THE_BUILD }}
-        run: breeze prod-image pull --run-in-parallel --tag-as-latest
+          path: ".build/.k8s-env"
+          key: "k8s-env"
+      - name: K8s Setup env
+        run: breeze k8s setup-env
+      - name: >
+          K8S Build images Python: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+        run: breeze k8s build-k8s-image --run-in-parallel
         env:
           PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
           IMAGE_TAG: ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
-      - name: "Cache virtualenv for kubernetes testing"
-        uses: actions/cache@v3
-        with:
-          path: ".build/.kubernetes_venv"
-          key: "kubernetes-${{ needs.build-info.outputs.default-python-version }}\
-  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
-  -${{needs.build-info.outputs.min-max-python-versions-as-string}}
-  -${{ hashFiles('setup.py','setup.cfg') }}"
-          restore-keys: "kubernetes-${{ needs.build-info.outputs.default-python-version }}-\
-  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}} \
-  -${{needs.build-info.outputs.min-max-python-versions-as-string}}"
-      - name: "Cache bin folder with tools for kubernetes testing"
-        uses: actions/cache@v3
-        with:
-          path: ".build/kubernetes-bin"
-          key: "kubernetes-binaries
-  -${{ needs.build-info.outputs.default-kind-version }}\
-  -${{ needs.build-info.outputs.default-helm-version }}"
-          restore-keys: "kubernetes-binaries"
-      - name: "Kubernetes Helm Chart Executor Upgrade Tests"
-        run: ./scripts/ci/kubernetes/ci_upgrade_cluster_with_different_executors_in_parallel.sh
+      - name: K8S Create clusters ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s create-cluster --run-in-parallel
         env:
-          PR_LABELS: "${{ needs.build-info.outputs.pull-request-labels }}"
-      - name: "Upload KinD logs"
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+      - name: K8S Upload images ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s upload-k8s-image --run-in-parallel
+        env:
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+          EXECUTOR: ${{matrix.executor}}
+      - name: K8S Configure clusters ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s configure-cluster --run-in-parallel
+        env:
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+      - name: K8S Deploy Airflow ${{matrix.executor}} ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s deploy-airflow --run-in-parallel
+        env:
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+          EXECUTOR: ${{matrix.executor}}
+      - name: K8S Tests ${{matrix.executor}} ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s tests --run-in-parallel
+        env:
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+          EXECUTOR: ${{matrix.executor}}
+      - name: K8S Upgrade ${{matrix.executor}} ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s deploy-airflow --run-in-parallel --upgrade --set config.logging.logging_level=INFO
+        env:
+          PYTHON_VERSIONS: ${{ needs.build-info.outputs.python-versions-list-as-string }}
+          KUBERNETES_VERSIONS: ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+          EXECUTOR: ${{matrix.executor}}
+      - name: K8S Logs ${{needs.build-info.outputs.kubernetes-combos}}
+        run: breeze k8s logs --all
+        if: failure() || cancelled()
+      - name: Upload KinD logs ${{needs.build-info.outputs.kubernetes-combos}}
         uses: actions/upload-artifact@v3
         if: failure() || cancelled()
         with:
-          name: kind-logs-KubernetesExecutor
+          name: kind-logs-${{matrix.executor}}
           path: /tmp/kind_logs_*
           retention-days: 7
+      - name: "Delete clusters"
+        run: breeze k8s delete-cluster --all
+        if: always()
       - name: "Fix ownership"
         run: breeze ci fix-ownership
         if: always()
diff --git a/.gitpod.yml b/.gitpod.yml
index b4115c3801..57ab1121aa 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -20,7 +20,7 @@
 # Docs: https://www.gitpod.io/docs/config-gitpod-file/
 
 tasks:
-  - init: ./breeze-legacy -y
+  - init: ./script/ci/install_breeze.sh
   - name: Install pre-commit
     openMode: split-right
     command: |
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 8af20f5d40..da81c24577 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -84,7 +84,7 @@ repos:
       - id: insert-license
         name: Add license for all shell files
         exclude: ^\.github/.*$|^airflow/_vendor/|^dev/breeze/autocomplete/.*$
-        files: ^breeze-legacy$|^breeze-complete$|\.bash$|\.sh$
+        files: \.bash$|\.sh$
         args:
           - --comment-style
           - "|#|"
@@ -301,7 +301,7 @@ repos:
           The word(s) should be in lowercase." && exec codespell "$@"' --
         language: python
         types: [text]
-        exclude: ^airflow/_vendor/|^RELEASE_NOTES\.txt$|^airflow/www/static/css/material-icons\.css$|^images/.*$
+        exclude: ^airflow/_vendor/|^RELEASE_NOTES\.txt$|^airflow/www/static/css/material-icons\.css$|^images/.*$|^.*package-lock.json$
         args:
           - --ignore-words=docs/spelling_wordlist.txt
           - --skip=docs/*/commits.rst,airflow/providers/*/*.rst,*.lock,INTHEWILD.md,*.min.js,docs/apache-airflow/tutorial/pipeline_example.csv,airflow/www/*.log
@@ -556,12 +556,6 @@ repos:
         files: \.*example_dags.*\.py$
         exclude: ^airflow/_vendor/
         pass_filenames: true
-      - id: check-integrations-are-consistent
-        name: Check if integration list is consistent in various places
-        entry: ./scripts/ci/pre_commit/pre_commit_check_integrations.sh
-        language: system
-        pass_filenames: false
-        files: ^common/_common_values\.sh$|^breeze-complete$
       - id: check-apache-license-rat
         name: Check if licenses are OK for Apache
         entry: ./scripts/ci/pre_commit/pre_commit_check_license.py
@@ -597,16 +591,17 @@ repos:
         require_serial: true
       - id: lint-helm-chart
         name: Lint Helm Chart
-        entry: ./scripts/ci/pre_commit/pre_commit_helm_lint.sh
-        language: system
+        entry: ./scripts/ci/pre_commit/pre_commit_helm_lint.py
+        language: python
         pass_filenames: false
         files: ^chart
         require_serial: true
+        additional_dependencies: ['rich>=12.4.4','requests']
       - id: run-shellcheck
         name: Check Shell scripts syntax correctness
         language: docker_image
         entry: koalaman/shellcheck:v0.8.0 -x -a
-        files: ^breeze-legacy$|^breeze-complete$|\.sh$|^hooks/build$|^hooks/push$|\.bash$
+        files: ^.*\.sh$|^hooks/build$|^hooks/push$|\.bash$
         exclude: ^dev/breeze/autocomplete/.*$
       - id: lint-css
         name: stylelint
diff --git a/BREEZE.rst b/BREEZE.rst
index 3ecf32354a..67c5d63e19 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -718,6 +718,282 @@ through ``breeze testing docker-compose-tests`` command.
 
 The docker-compose tests are in ``docker-tests/`` folder in the main repo.
 
+Running Kubernetes tests
+------------------------
+
+Breeze helps with running Kubernetes tests in the same environment/way as CI tests are run.
+Breeze helps to setup KinD cluster for testing, setting up virtualenv and downloads the right tools
+automatically to run the tests.
+
+You can:
+
+* Setup environment for k8s tests with ``breeze k8s setup-env``
+* Manage KinD Kubernetes cluster and deploy Airflow to KinD cluster ``breeze k8s create-cluster``,
+  ``breeze k8s deploy-airflow``, ``breeze k8s status``, ``breeze k8s delete-cluster`` commands
+* Run Kubernetes tests  specified with ``breeze k8s tests`` command
+* Enter the interactive kubernetes test environment with ``breeze k8s shell`` and ``breeze k8s k9s`` command
+* Run multi-cluster-operations ``breeze k8s list-all-clusters`` and
+  ``breeze k8s delete-all-clusters`` commands as well as running complete tests in parallel
+  via ``breeze k8s run-complete-tests`` and export logs from all clusters to a temp directory
+  via ``breeze k8s dump-logs`` command
+
+This is described in detail in `Testing Kubernetes <TESTING.rst#running-tests-with-kubernetes>`_.
+
+You can read more about KinD that we use in `The documentation <https://kind.sigs.k8s.io/>`_
+
+Here is the detailed set of options for the ``breeze k8s`` command.
+
+.. image:: ./images/breeze/output_k8s.svg
+  :width: 100%
+  :alt: Breeze k8s
+
+
+Setting up K8S environment
+..........................
+
+Kubernetes environment can be set with the ``breeze k8s setup-env`` command.
+It will create appropriate virtualenv to run tests and download the right set of tools to run
+the tests: ``kind``, ``kubectl`` and ``helm`` in the right versions. You can re-run the command
+when you want to make sure the expected versions of the tools are installed properly in the
+virtualenv. The Virtualenv is available in ``.build/.k8s-env/bin`` subdirectory of your Airflow
+installation.
+
+.. image:: ./images/breeze/output_k8s_setup-env.svg
+  :width: 100%
+  :alt: Breeze k8s setup-env
+
+Creating K8S cluster
+....................
+
+You can create kubernetes cluster (separate cluster for each python/kubernetes version) via
+``breeze k8s create-cluster`` command. With ``--force`` flag the cluster will be
+deleted if exists. You can also use it to create multiple clusters in parallel with
+``--run-in-parallel`` flag - this is what happens in our CI.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_create-cluster.svg
+  :width: 100%
+  :alt: Breeze k8s create-cluster
+
+Deleting K8S cluster
+....................
+
+You can delete current kubernetes cluster via ``breeze k8s delete-cluster`` command. You can also add
+``--run-in-parallel`` flag to delete all clusters.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_delete-cluster.svg
+  :width: 100%
+  :alt: Breeze k8s delete-cluster
+
+Building Airflow K8s images
+...........................
+
+Before deploying Airflow Helm Chart, you need to make sure the appropriate Airflow image is build (it has
+embedded test dags, pod templates and webserver is configured to refresh immediately. This can
+be done via ``breeze k8s build-k8s-image`` command. It can also be done in parallel for all images via
+``--run-in-parallel`` flag.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_build-k8s-image.svg
+  :width: 100%
+  :alt: Breeze k8s build-k8s-image
+
+Uploading Airflow K8s images
+............................
+
+The K8S airflow images need to be uploaded to the KinD cluster. This can be done via
+``breeze k8s upload-k8s-image`` command. It can also be done in parallel for all images via
+``--run-in-parallel`` flag.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_upload-k8s-image.svg
+  :width: 100%
+  :alt: Breeze k8s upload-k8s-image
+
+Configuring K8S cluster
+.......................
+
+In order to deploy Airflow, the cluster needs to be configured. Airflow namespace needs to be created
+and test resources should be deployed. By passing ``--run-in-parallel`` the configuration can be run
+for all clusters in parallel.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_configure-cluster.svg
+  :width: 100%
+  :alt: Breeze k8s configure-cluster
+
+Deploying Airflow to the Cluster
+................................
+
+Airflow can be deployed to the Cluster with ``breeze k8s deploy-airflow``. This step will automatically
+(unless disabled by switches) will rebuild the image to be deployed. It also uses the latest version
+of the Airflow Helm Chart to deploy it. You can also choose to upgrade existing airflow deployment
+and pass extra arguments to ``helm install`` or ``helm upgrade`` commands that are used to
+deploy airflow. By passing ``--run-in-parallel`` the deployment can be run
+for all clusters in parallel.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_deploy-airflow.svg
+  :width: 100%
+  :alt: Breeze k8s deploy-airflow
+
+Checking status of the K8S cluster
+..................................
+
+You can delete kubernetes cluster and airflow deployed in the current cluster
+via ``breeze k8s status`` command. It can be also checked fora all clusters created so far by passing
+``--all`` flag.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_status.svg
+  :width: 100%
+  :alt: Breeze k8s status
+
+Running k8s tests
+.................
+
+You can run ``breeze k8s tests`` command to run ``pytest`` tests with your cluster. Those testa are placed
+in ``kubernetes_tests/`` and you can either specify the tests to run as parameter of the tests command or
+you can leave them empty to run all tests. By passing ``--run-in-parallel`` the tests can be run
+for all clusters in parallel.
+
+Run all tests:
+
+.. code-block::bash
+
+    breeze k8s tests
+
+Run selected tests:
+
+.. code-block::bash
+
+    breeze k8s tests kubernetes_tests/test_kubernetes_executor.py
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_tests.svg
+  :width: 100%
+  :alt: Breeze k8s tests
+
+You can also specify any pytest flags as extra parameters - they will be passed to the
+shell command directly. In case the shell parameters are the same as the parameters of the command, you
+can pass them after ``--``. For example this is the way how you can see all available parameters of the shell
+you have:
+
+.. code-block::bash
+
+    breeze k8s tests -- --help
+
+The options that are not overlapping with the ``tests`` command options can be passed directly and mixed
+with the specifications of tests you want to run. For example the command below will only run
+``test_kubernetes_executor.py`` and will suppress capturing output from Pytest so that you can see the
+output during test execution.
+
+.. code-block::bash
+
+    breeze k8s tests -- kubernetes_tests/test_kubernetes_executor.py -s
+
+Entering k8s shell
+..................
+
+You can have multiple clusters created - with different versions of Kubernetes and Python at the same time.
+Breeze enables you to interact with the chosen cluster by entering dedicated shell session that has the
+cluster pre-configured. This is done via ``breeze k8s shell`` command.
+
+Once you are in the shell, the prompt will indicate which cluster you are interacting with as well
+as executor you use, similar to:
+
+.. code-block::bash
+
+    (kind-airflow-python-3.9-v1.24.0:KubernetesExecutor)>
+
+
+The shell automatically activates the virtual environment that has all appropriate dependencies
+installed and you can interactively run all k8s tests with pytest command (of course the cluster need to
+be created and airflow deployed to it before running the tests):
+
+.. code-block::bash
+
+    (kind-airflow-python-3.9-v1.24.0:KubernetesExecutor)> pytest kubernetes_tests/test_kubernetes_executor.py
+    ================================================= test session starts =================================================
+    platform linux -- Python 3.10.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- /home/jarek/code/airflow/.build/.k8s-env/bin/python
+    cachedir: .pytest_cache
+    rootdir: /home/jarek/code/airflow, configfile: pytest.ini
+    plugins: anyio-3.6.1
+    collected 2 items
+
+    kubernetes_tests/test_kubernetes_executor.py::TestKubernetesExecutor::test_integration_run_dag PASSED           [ 50%]
+    kubernetes_tests/test_kubernetes_executor.py::TestKubernetesExecutor::test_integration_run_dag_with_scheduler_failure PASSED [100%]
+
+    ================================================== warnings summary ===================================================
+    .build/.k8s-env/lib/python3.10/site-packages/_pytest/config/__init__.py:1233
+      /home/jarek/code/airflow/.build/.k8s-env/lib/python3.10/site-packages/_pytest/config/__init__.py:1233: PytestConfigWarning: Unknown config option: asyncio_mode
+
+        self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")
+
+    -- Docs: https://docs.pytest.org/en/stable/warnings.html
+    ============================================ 2 passed, 1 warning in 38.62s ============================================
+    (kind-airflow-python-3.9-v1.24.0:KubernetesExecutor)>
+
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_shell.svg
+  :width: 100%
+  :alt: Breeze k8s shell
+
+You can also specify any shell flags and commands as extra parameters - they will be passed to the
+shell command directly. In case the shell parameters are the same as the parameters of the command, you
+can pass them after ``--``. For example this is the way how you can see all available parameters of the shell
+you have:
+
+.. code-block::bash
+
+    breeze k8s shell -- --help
+
+Running k9s tool
+................
+
+The ``k9s`` is a fantastic tool that allows you to interact with running k8s cluster. Since we can have
+multiple clusters capability, ``breeze k8s k9s`` allows you to start k9s without setting it up or
+downloading - it uses k9s docker image to run it and connect it to the right cluster.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_k9s.svg
+  :width: 100%
+  :alt: Breeze k8s k9s
+
+You can also specify any ``k9s`` flags and commands as extra parameters - they will be passed to the
+``k9s`` command directly. In case the ``k9s`` parameters are the same as the parameters of the command, you
+can pass them after ``--``. For example this is the way how you can see all available parameters of the
+``k9s`` you have:
+
+.. code-block::bash
+
+    breeze k8s k9s -- --help
+
+Dumping logs from all k8s clusters
+..................................
+
+KinD allows to export logs from the running cluster so that you can troubleshoot your deployment.
+This can be done with ``breeze k8s logs`` command. Logs can be also dumped fora all clusters created
+so far by passing ``--all`` flag.
+
+All parameters of the command are here:
+
+.. image:: ./images/breeze/output_k8s_logs.svg
+  :width: 100%
+  :alt: Breeze k8s logs
+
 
 CI Image tasks
 --------------
@@ -1413,17 +1689,6 @@ from your ``logs`` directory in the Airflow sources, so all logs created in the
 visible in the host as well. Every time you enter the container, the ``logs`` directory is
 cleaned so that logs do not accumulate.
 
-Running "Docker Compose" commands
----------------------------------
-
-To run Docker Compose commands (such as ``help``, ``pull``, etc), use the
-``docker-compose`` command. To add extra arguments, specify them
-after ``--`` as extra arguments.
-
-.. code-block:: bash
-
-     ./breeze-legacy docker-compose pull -- --ignore-pull-failures
-
 Setting default answers for user interaction
 --------------------------------------------
 
diff --git a/CI.rst b/CI.rst
index 351346ad68..1b86a43b41 100644
--- a/CI.rst
+++ b/CI.rst
@@ -184,7 +184,7 @@ You can use those variables when you try to reproduce the build locally.
 +-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
 | ``HOST_GROUP_ID``                       |             |              |            | Group id of the host user.                      |
 +-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
-| ``HOST_OS``                             |             |    Linux     |    Linux   | OS of the Host (Darwin/Linux).                  |
+| ``HOST_OS``                             |             |    linux     |    linux   | OS of the Host (darwin/linux/windows).          |
 +-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
 |                                                            Git variables                                                            |
 +-----------------------------------------+-------------+--------------+------------+-------------------------------------------------+
@@ -680,17 +680,13 @@ the sources are not mapped from your host machine.
 Adding new Python versions to CI
 --------------------------------
 
-In the ``main`` branch of development line we currently support Python 3.7, 3.8, 3.9.
+In the ``main`` branch of development line we currently support Python 3.7, 3.8, 3.9, 3.10
 
 In order to add a new version the following operations should be done (example uses Python 3.10)
 
 * copy the latest constraints in ``constraints-main`` branch from previous versions and name it
   using the new Python version (``constraints-3.10.txt``). Commit and push
 
-* add the new Python version to `breeze-complete <breeze-complete>`_ and
-  `_initialization.sh <scripts/ci/libraries/_initialization.sh>`_ - tests will fail if they are not
-  in sync.
-
 * build image locally for both prod and CI locally using Breeze:
 
 .. code-block:: bash
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 18f22b3ad5..7c80c76555 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -545,13 +545,6 @@ All details about using and running Airflow Breeze can be found in
 The Airflow Breeze solution is intended to ease your local development as "*It's
 a Breeze to develop Airflow*".
 
-.. note::
-
-   We are in a process of switching to the new Python-based Breeze from a legacy Bash
-   Breeze. Not all functionality has been ported yet and the old Breeze is still available
-   until then as ``./breeze-legacy`` script. The documentation mentions when the old ./breeze-legacy
-   should be still used.
-
 Benefits:
 
 -   Breeze is a complete environment that includes external components, such as
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 57f6c6cee8..6b29ddfd5a 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -735,7 +735,6 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
         echo
         exit ${ENVIRONMENT_EXIT_CODE}
     fi
-    # Create symbolic link to fix possible issues with kubectl config cmd-path
     mkdir -p /usr/lib/google-cloud-sdk/bin
     touch /usr/lib/google-cloud-sdk/bin/gcloud
     ln -s -f /usr/bin/gcloud /usr/lib/google-cloud-sdk/bin/gcloud
@@ -1047,7 +1046,7 @@ RUN bash /scripts/docker/install_mysql.sh prod \
     && chmod 0440 /etc/sudoers.d/airflow
 
 # Install Helm
-ARG HELM_VERSION="v3.9.2"
+ARG HELM_VERSION="v3.9.4"
 
 RUN SYSTEM=$(uname -s | tr '[:upper:]' '[:lower:]') \
     && PLATFORM=$([ "$(uname -m)" = "aarch64" ] && echo "arm64" || echo "amd64" ) \
diff --git a/LOCAL_VIRTUALENV.rst b/LOCAL_VIRTUALENV.rst
index 1cbf5b6b12..469eedbf43 100644
--- a/LOCAL_VIRTUALENV.rst
+++ b/LOCAL_VIRTUALENV.rst
@@ -205,21 +205,15 @@ Activate your virtualenv, e.g. by using ``workon``, and once you are in it, run:
 
 .. code-block:: bash
 
-  ./breeze-legacy initialize-local-virtualenv
+  ./scripts/ci/tools/initialize_virtualenv.py
 
-By default Breeze installs the ``devel`` extra only. You can optionally control which extras are installed by exporting ``VIRTUALENV_EXTRAS`` before calling Breeze:
+By default Breeze installs the ``devel`` extra only. You can optionally control which extras are
+Adding extra dependencies as parameter.
 
 .. code-block:: bash
 
-  export VIRTUALENV_EXTRAS="devel,google,postgres"
-  ./breeze-legacy initialize-local-virtualenv
+  ./scripts/ci/tools/initialize_virtualenv.py devel,google,postgres
 
-5. (optionally) run yarn build if you plan to run the webserver
-
-.. code-block:: bash
-
-    cd airflow/www
-    yarn build
 
 Developing Providers
 --------------------
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index e2c49fcfd6..876695d6e5 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -179,8 +179,6 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-incorrect-use-of-LoggingMixin                    | Make sure LoggingMixin is not used alone                         |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
-| check-integrations-are-consistent                      | Check if integration list is consistent in various places        |         |
-+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-lazy-logging                                     | Check that all logging methods are lazy                          |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-merge-conflict                                   | Check that merge conflicts are not being committed               |         |
diff --git a/TESTING.rst b/TESTING.rst
index 977057e359..ba9165f671 100644
--- a/TESTING.rst
+++ b/TESTING.rst
@@ -633,14 +633,11 @@ before running, so you should run it before generating ``apache-airflow`` packag
 
 This prepares airflow .whl package in the dist folder.
 
-3. Enter breeze installing both airflow and providers from the packages
-
-This installs airflow and enters
+3. Enter breeze installing both airflow and providers from the dist packages
 
 .. code-block:: bash
 
-     ./breeze-legacy --use-airflow-version wheel --use-packages-from-dist --skip-mounting-local-sources
-
+     breeze --use-airflow-version wheel --use-packages-from-dist --skip-mounting-local-sources
 
 
 Running Tests with Kubernetes
@@ -650,60 +647,82 @@ Airflow has tests that are run against real Kubernetes cluster. We are using
 `Kind <https://kind.sigs.k8s.io/>`_ to create and run the cluster. We integrated the tools to start/stop/
 deploy and run the cluster tests in our repository and into Breeze development environment.
 
-Configuration for the cluster is kept in ``./build/.kube/config`` file in your Airflow source repository, and
-our scripts set the ``KUBECONFIG`` variable to it. If you want to interact with the Kind cluster created
-you can do it from outside of the scripts by exporting this variable and point it to this file.
+KinD has a really nice ``kind`` tool that you can use to interact with the cluster. Run ``kind --help`` to
+learn more.
 
-Starting Kubernetes Cluster
----------------------------
+K8S test environment
+------------------------
 
-For your testing, you manage Kind cluster with ``kind-cluster`` breeze command:
+Before running ``breeze k8s`` cluster commands you need to setup the environment. This is done
+by ``breeze k8s setup-env`` command. Breeze in this command makes sure to download tools that
+are needed to run k8s tests: Helm, Kind, Kubectl in the right versions and sets up a
+Python virtualenv that is needed to run the tests. All those tools and env are setup in
+``.build/.k8s-env`` folder. You can activate this environment yourselves as usual by sourcing
+``bin/activate`` script, but since we are supporting multiple clusters in the same installation
+it is best if you use ``breeze k8s shell`` with the right parameters specifying which cluster
+to use.
 
-.. code-block:: bash
+Multiple cluster support
+------------------------
 
-    ./breeze-legacy kind-cluster [ start | stop | recreate | status | deploy | test | shell | k9s ]
+The main feature of ``breeze k8s`` command is that it allows you to manage multiple KinD clusters - one
+per each combination of Python and Kubernetes version. This is used during CI where we can run same
+tests against those different clusters - even in parallel.
 
-The command allows you to start/stop/recreate/status Kind Kubernetes cluster, deploy Airflow via Helm
-chart as well as interact with the cluster (via test and shell commands).
+The cluster name follows the pattern ``airflow-python-X.Y-vA.B.C`` where X.Y is a major/minor Python version
+and A.B.C is Kubernetes version. Example cluster name:  ``airflow-python-3.7-v1.24.0``
 
-Setting up the Kind Kubernetes cluster takes some time, so once you started it, the cluster continues running
-until it is stopped with the ``kind-cluster stop`` command or until ``kind-cluster recreate``
-command is used (it will stop and recreate the cluster image).
+Most of the commands can be executed in parallel for multiple images/clusters by adding ``--run-in-parallel``
+to create clusters or deploy airflow. Similarly checking for status, dumping logs and deleting clusters
+can be run with ``--all`` flag and they will be executed sequentially for all locally created clusters.
 
-The cluster name follows the pattern ``airflow-python-X.Y-vA.B.C`` where X.Y is a Python version
-and A.B.C is a Kubernetes version. This way you can have multiple clusters set up and running at the same
-time for different Python versions and different Kubernetes versions.
+Per-cluster configuration files
+-------------------------------
 
+Once you start the cluster, the configuration for it is stored in a dynamically created folder - separate
+folder for each python/kubernetes_version combination. The folder is ``./build/.k8s-clusters/<CLUSTER_NAME>``
 
-Deploying Airflow to Kubernetes Cluster
----------------------------------------
+There are two files there:
 
-Deploying Airflow to the Kubernetes cluster created is also done via ``kind-cluster deploy`` breeze command:
+* kubectl config file stored in .kubeconfig file - our scripts set the ``KUBECONFIG`` variable to it
+* KinD cluster configuration in .kindconfig.yml file - our scripts set the ``KINDCONFIG`` variable to it
 
-.. code-block:: bash
+The ``KUBECONFIG`` file is automatically used when you enter any of the ``breeze k8s`` commands that use
+``kubectl`` or when you run ``kubectl`` in the k8s shell. The ``KINDCONFIG`` file is used when cluster is
+started but You and the ``k8s`` command can inspect it to know for example what port is forwarded to the
+webserver running in the cluster.
 
-    ./breeze-legacy kind-cluster deploy
+The files are deleted by ``breeze k8s delete-cluster`` command.
 
-The deploy command performs those steps:
+Managing Kubernetes Cluster
+---------------------------
 
-1. It rebuilds the latest ``apache/airflow:main-pythonX.Y`` production images using the
-   latest sources using local caching. It also adds example DAGs to the image, so that they do not
-   have to be mounted inside.
-2. Loads the image to the Kind Cluster using the ``kind load`` command.
-3. Starts airflow in the cluster using the official helm chart (in ``airflow`` namespace)
-4. Forwards Local 8080 port to the webserver running in the cluster
-5. Applies the volumes.yaml to get the volumes deployed to ``default`` namespace - this is where
-   KubernetesExecutor starts its pods.
+For your testing, you manage Kind cluster with ``k8s`` breeze command group. Those commands allow to
+created:
 
-You can also specify a different executor by providing the ``--executor`` optional argument:
+.. image:: ./images/breeze/output_k8s.svg
+  :width: 100%
+  :alt: Breeze k8s
 
-.. code-block:: bash
+The command group allows you to setup environment, start/stop/recreate/status Kind Kubernetes cluster,
+configure cluster (via ``create-cluster``, ``configure-cluster`` command). Those commands can be run with
+``--run-in-parallel`` flag for all/selected clusters and they can be executed in parallel.
 
-    ./breeze-legacy kind-cluster deploy --executor CeleryExecutor
+In order to deploy Airflow, the PROD image of Airflow need to be extended and example dags and POD
+template files should be added to the image. This is done via ``build-k8s-image``, ``upload-k8s-image``.
+This can also be done for all/selected images/clusters in parallel via ``--run-in-parallel`` flag.
 
-Note that when you specify the ``--executor`` option, it becomes the default. Therefore, every other operations
-on ``./breeze-legacy kind-cluster`` will default to using this executor. To change that, use the ``--executor`` option on the
-subsequent commands too.
+Then Airflow (by using Helm Chart) can be deployed to the cluster via ``deploy-airflow`` command.
+This can also be done for all/selected images/clusters in parallel via ``--run-in-parallel`` flag. You can
+pass extra options when deploying airflow to configure your depliyment.
+
+You can check the status, dump logs and finally delete cluster via ``status``, ``logs``, ``delete-cluster``
+commands. This can also be done for all created clusters in parallel via ``--all`` flag.
+
+You can interact with the cluster (via ``shell`` and ``k9s`` commands).
+
+You can run set of k8s tests via ``tests`` command. You can also run tests in parallel on all/selected
+clusters by ``--run-in-parallel`` flag.
 
 
 Running tests with Kubernetes Cluster
@@ -712,29 +731,20 @@ Running tests with Kubernetes Cluster
 You can either run all tests or you can select which tests to run. You can also enter interactive virtualenv
 to run the tests manually one by one.
 
-Running Kubernetes tests via shell:
-
-.. code-block:: bash
-
-      export EXECUTOR="KubernetesExecutor" ## can be also CeleryExecutor or CeleryKubernetesExecutor
-
-      ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh                      - runs all kubernetes tests
-      ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh TEST [TEST ...]      - runs selected kubernetes tests (from kubernetes_tests folder)
-
 
 Running Kubernetes tests via breeze:
 
 .. code-block:: bash
 
-      ./breeze-legacy kind-cluster test
-      ./breeze-legacy kind-cluster test -- TEST TEST [TEST ...]
+      breeze k8s tests
+      breeze k8s tests TEST TEST [TEST ...]
 
 Optionally add ``--executor``:
 
 .. code-block:: bash
 
-      ./breeze-legacy kind-cluster test --executor CeleryExecutor
-      ./breeze-legacy kind-cluster test -- TEST TEST [TEST ...] --executor CeleryExecutor
+      breeze k8s tests --executor CeleryExecutor
+      breeze k8s tests --executor CeleryExecutor TEST TEST [TEST ...]
 
 Entering shell with Kubernetes Cluster
 --------------------------------------
@@ -742,31 +752,18 @@ Entering shell with Kubernetes Cluster
 This shell is prepared to run Kubernetes tests interactively. It has ``kubectl`` and ``kind`` cli tools
 available in the path, it has also activated virtualenv environment that allows you to run tests via pytest.
 
-The binaries are available in ./.build/kubernetes-bin/``KUBERNETES_VERSION`` path.
-The virtualenv is available in ./.build/.kubernetes_venv/``KIND_CLUSTER_NAME``_host_python_``HOST_PYTHON_VERSION``
-
-Where ``KIND_CLUSTER_NAME`` is the name of the cluster and ``HOST_PYTHON_VERSION`` is the version of python
-in the host.
-
-You can enter the shell via those scripts
-
-.. code-block:: bash
-
-      export EXECUTOR="KubernetesExecutor" ## can be also CeleryExecutor or CeleryKubernetesExecutor
-
-      ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh [-i|--interactive]   - Activates virtual environment ready to run tests and drops you in
-      ./scripts/ci/kubernetes/ci_run_kubernetes_tests.sh [--help]             - Prints this help message
-
+The virtualenv is available in ./.build/.k8s-env/
+The binaries are available in ``.build/.k8s-env/bin`` path.
 
 .. code-block:: bash
 
-      ./breeze-legacy kind-cluster shell
+      breeze k8s shell
 
 Optionally add ``--executor``:
 
 .. code-block:: bash
 
-      ./breeze-legacy kind-cluster shell --executor CeleryExecutor
+      breeze k8s shell --executor CeleryExecutor
 
 
 K9s CLI - debug Kubernetes in style!
@@ -793,7 +790,7 @@ You can enter the k9s tool via breeze (after you deployed Airflow):
 
 .. code-block:: bash
 
-      ./breeze-legacy kind-cluster k9s
+      breeze k8s k9s
 
 You can exit k9s by pressing Ctrl-C.
 
@@ -802,73 +799,316 @@ Typical testing pattern for Kubernetes tests
 
 The typical session for tests with Kubernetes looks like follows:
 
-1. Start the Kind cluster:
+
+1. Prepare the environment:
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster start
+    breeze k8s setup-env
+
+The first time you run it, it should result in creating the virtualenv and installing good versions
+of kind, kubectl and helm. All of them are installed in ``./build/.k8s-env`` (binaries available in ``bin``
+sub-folder of it).
+
+.. code-block:: text
+
+    Initializing K8S virtualenv in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env
+    Reinstalling PIP version in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env
+    Installing necessary packages in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env
+    The ``kind`` tool is not downloaded yet. Downloading 0.14.0 version.
+    Downloading from: https://github.com/kubernetes-sigs/kind/releases/download/v0.14.0/kind-darwin-arm64
+    The ``kubectl`` tool is not downloaded yet. Downloading 1.24.3 version.
+    Downloading from: https://storage.googleapis.com/kubernetes-release/release/v1.24.3/bin/darwin/arm64/kubectl
+    The ``helm`` tool is not downloaded yet. Downloading 3.9.2 version.
+    Downloading from: https://get.helm.sh/helm-v3.9.2-darwin-arm64.tar.gz
+    Extracting the darwin-arm64/helm to /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin
+    Moving the helm to /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin/helm
+
 
-    Starts Kind Kubernetes cluster
+This prepares the virtual environment for tests and downloads the right versions of the tools
+to ``./build/.k8s-env``
 
-       Use CI image.
+2. Create the KinD cluster:
 
-       Branch name:             main
-       Docker image:            apache/airflow:main-python3.7-ci
+.. code-block:: bash
 
-       Airflow source version:  2.0.0.dev0
-       Python version:          3.7
-       Backend:                 postgres 10
+    breeze k8s create-cluster
 
-    No kind clusters found.
+Should result in KinD creating the K8S cluster.
 
-    Creating cluster
+.. code-block:: text
 
-    Creating cluster "airflow-python-3.7-v1.17.0" ...
-     ✓ Ensuring node image (kindest/node:v1.17.0) đŸ–ŧ
+    Config created in /Users/jarek/IdeaProjects/airflow/.build/.k8s-clusters/airflow-python-3.7-v1.24.2/.kindconfig.yaml:
+
+    # 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.
+    ---
+    kind: Cluster
+    apiVersion: kind.x-k8s.io/v1alpha4
+    networking:
+      ipFamily: ipv4
+      apiServerAddress: "127.0.0.1"
+      apiServerPort: 48366
+    nodes:
+      - role: control-plane
+      - role: worker
+        extraPortMappings:
+          - containerPort: 30007
+            hostPort: 18150
+            listenAddress: "127.0.0.1"
+            protocol: TCP
+
+
+
+    Creating cluster "airflow-python-3.7-v1.24.2" ...
+     ✓ Ensuring node image (kindest/node:v1.24.2) đŸ–ŧ
      ✓ Preparing nodes đŸ“Ļ đŸ“Ļ
      ✓ Writing configuration 📜
      ✓ Starting control-plane 🕹ī¸
      ✓ Installing CNI 🔌
-    Could not read storage manifest, falling back on old k8s.io/host-path default ...
      ✓ Installing StorageClass 💾
      ✓ Joining worker nodes 🚜
-    Set kubectl context to "kind-airflow-python-3.7-v1.17.0"
+    Set kubectl context to "kind-airflow-python-3.7-v1.24.2"
     You can now use your cluster with:
 
-    kubectl cluster-info --context kind-airflow-python-3.7-v1.17.0
+    kubectl cluster-info --context kind-airflow-python-3.7-v1.24.2
+
+    Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
+
+    KinD Cluster API server URL: http://localhost:48366
+    Connecting to localhost:18150. Num try: 1
+    Error when connecting to localhost:18150 : ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
+
+    Airflow webserver is not available at port 18150. Run `breeze k8s deploy-airflow --python 3.7 --kubernetes-version v1.24.2` to (re)deploy airflow
+
+    KinD cluster airflow-python-3.7-v1.24.2 created!
+
+    NEXT STEP: You might now configure your cluster by:
+
+    breeze k8s configure-cluster
+
+3. Configure cluster for Airflow - this will recreate namespace and upload test resources for Airflow.
+
+.. code-block:: bash
+
+    breeze k8s configure-cluster
+
+.. code-block:: text
+
+    Configuring airflow-python-3.7-v1.24.2 to be ready for Airflow deployment
+    Deleting K8S namespaces for kind-airflow-python-3.7-v1.24.2
+    Error from server (NotFound): namespaces "airflow" not found
+    Error from server (NotFound): namespaces "test-namespace" not found
+    Creating namespaces
+    namespace/airflow created
+    namespace/test-namespace created
+    Created K8S namespaces for cluster kind-airflow-python-3.7-v1.24.2
+
+    Deploying test resources for cluster kind-airflow-python-3.7-v1.24.2
+    persistentvolume/test-volume created
+    persistentvolumeclaim/test-volume created
+    service/airflow-webserver-node-port created
+    Deployed test resources for cluster kind-airflow-python-3.7-v1.24.2
+
+
+    NEXT STEP: You might now build your k8s image by:
+
+    breeze k8s build-k8s-image
+
+4. Check the status of the cluster
+
+.. code-block:: bash
+
+    breeze k8s status
+
+Should show the status of current KinD cluster.
+
+.. code-block:: text
+
+    ========================================================================================================================
+    Cluster: airflow-python-3.7-v1.24.2
+
+        * KUBECONFIG=/Users/jarek/IdeaProjects/airflow/.build/.k8s-clusters/airflow-python-3.7-v1.24.2/.kubeconfig
+        * KINDCONFIG=/Users/jarek/IdeaProjects/airflow/.build/.k8s-clusters/airflow-python-3.7-v1.24.2/.kindconfig.yaml
+
+    Cluster info: airflow-python-3.7-v1.24.2
 
-    Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
+    Kubernetes control plane is running at https://127.0.0.1:48366
+    CoreDNS is running at https://127.0.0.1:48366/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
 
-    Created cluster airflow-python-3.7-v1.17.0
+    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
 
+    Storage class for airflow-python-3.7-v1.24.2
 
-2. Check the status of the cluster
+    NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
+    standard (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  83s
+
+    Running pods for airflow-python-3.7-v1.24.2
+
+    NAME                                                               READY   STATUS    RESTARTS   AGE
+    coredns-6d4b75cb6d-rwp9d                                           1/1     Running   0          71s
+    coredns-6d4b75cb6d-vqnrc                                           1/1     Running   0          71s
+    etcd-airflow-python-3.7-v1.24.2-control-plane                      1/1     Running   0          84s
+    kindnet-ckc8l                                                      1/1     Running   0          69s
+    kindnet-qqt8k                                                      1/1     Running   0          71s
+    kube-apiserver-airflow-python-3.7-v1.24.2-control-plane            1/1     Running   0          84s
+    kube-controller-manager-airflow-python-3.7-v1.24.2-control-plane   1/1     Running   0          84s
+    kube-proxy-6g7hn                                                   1/1     Running   0          69s
+    kube-proxy-dwfvp                                                   1/1     Running   0          71s
+    kube-scheduler-airflow-python-3.7-v1.24.2-control-plane            1/1     Running   0          84s
+
+    KinD Cluster API server URL: http://localhost:48366
+    Connecting to localhost:18150. Num try: 1
+    Error when connecting to localhost:18150 : ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
+
+    Airflow webserver is not available at port 18150. Run `breeze k8s deploy-airflow --python 3.7 --kubernetes-version v1.24.2` to (re)deploy airflow
+
+
+    Cluster healthy: airflow-python-3.7-v1.24.2
+
+5. Build the image base on PROD Airflow image. You need to build the PROD image first (the command will
+   guide you if you did not - either by running the build separately or passing ``--rebuild-base-image`` flag
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster status
+    breeze k8s build-k8s-image
 
-    Checks status of Kind Kubernetes cluster
+.. code-block:: text
 
-       Use CI image.
+    Building the K8S image for Python 3.7 using airflow base image: ghcr.io/apache/airflow/main/prod/python3.7:latest
 
-       Branch name:             main
-       Docker image:            apache/airflow:main-python3.7-ci
+    [+] Building 0.1s (8/8) FINISHED
+     => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                           0.0s
+     => => transferring dockerfile: 301B                                                                                                                                                                                                                                                           0.0s
+     => [internal] load .dockerignore                                                                                                                                                                                                                                                              0.0s
+     => => transferring context: 35B                                                                                                                                                                                                                                                               0.0s
+     => [internal] load metadata for ghcr.io/apache/airflow/main/prod/python3.7:latest                                                                                                                                                                                                             0.0s
+     => [1/3] FROM ghcr.io/apache/airflow/main/prod/python3.7:latest                                                                                                                                                                                                                               0.0s
+     => [internal] load build context                                                                                                                                                                                                                                                              0.0s
+     => => transferring context: 3.00kB                                                                                                                                                                                                                                                            0.0s
+     => CACHED [2/3] COPY airflow/example_dags/ /opt/airflow/dags/                                                                                                                                                                                                                                 0.0s
+     => CACHED [3/3] COPY airflow/kubernetes_executor_templates/ /opt/airflow/pod_templates/                                                                                                                                                                                                       0.0s
+     => exporting to image                                                                                                                                                                                                                                                                         0.0s
+     => => exporting layers                                                                                                                                                                                                                                                                        0.0s
+     => => writing image sha256:c0bdd363c549c3b0731b8e8ce34153d081f239ee2b582355b7b3ffd5394c40bb                                                                                                                                                                                                   0.0s
+     => => naming to ghcr.io/apache/airflow/main/prod/python3.7-kubernetes:latest
 
-       Airflow source version:  2.0.0.dev0
-       Python version:          3.7
-       Backend:                 postgres 10
+    NEXT STEP: You might now upload your k8s image by:
 
-    airflow-python-3.7-v1.17.0-control-plane
-    airflow-python-3.7-v1.17.0-worker
+    breeze k8s upload-k8s-image
 
-3. Deploy Airflow to the cluster
+
+5. Upload the image to KinD cluster - this uploads your image to make it available for the KinD cluster.
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster deploy
+    breeze k8s upload-k8s-image
+
+.. code-block:: text
+
+    K8S Virtualenv is initialized in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env
+    Good version of kind installed: 0.14.0 in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin
+    Good version of kubectl installed: 1.25.0 in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin
+    Good version of helm installed: 3.9.2 in /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin
+    Stable repo is already added
+    Uploading Airflow image ghcr.io/apache/airflow/main/prod/python3.7-kubernetes to cluster airflow-python-3.7-v1.24.2
+    Image: "ghcr.io/apache/airflow/main/prod/python3.7-kubernetes" with ID "sha256:fb6195f7c2c2ad97788a563a3fe9420bf3576c85575378d642cd7985aff97412" not yet present on node "airflow-python-3.7-v1.24.2-worker", loading...
+    Image: "ghcr.io/apache/airflow/main/prod/python3.7-kubernetes" with ID "sha256:fb6195f7c2c2ad97788a563a3fe9420bf3576c85575378d642cd7985aff97412" not yet present on node "airflow-python-3.7-v1.24.2-control-plane", loading...
+
+    NEXT STEP: You might now deploy airflow by:
+
+    breeze k8s deploy-airflow
+
+
+7. Deploy Airflow to the cluster - this will use Airflow Helm Chart to deploy Airflow to the cluster.
+
+.. code-block:: bash
+
+    breeze k8s deploy-airflow
+
+.. code-block:: text
+
+    Deploying Airflow for cluster airflow-python-3.7-v1.24.2
+    Deploying kind-airflow-python-3.7-v1.24.2 with airflow Helm Chart.
+    Copied chart sources to /private/var/folders/v3/gvj4_mw152q556w2rrh7m46w0000gn/T/chart_edu__kir/chart
+    Deploying Airflow from /private/var/folders/v3/gvj4_mw152q556w2rrh7m46w0000gn/T/chart_edu__kir/chart
+    NAME: airflow
+    LAST DEPLOYED: Tue Aug 30 22:57:54 2022
+    NAMESPACE: airflow
+    STATUS: deployed
+    REVISION: 1
+    TEST SUITE: None
+    NOTES:
+    Thank you for installing Apache Airflow 2.3.4!
+
+    Your release is named airflow.
+    You can now access your dashboard(s) by executing the following command(s) and visiting the corresponding port at localhost in your browser:
+
+    Airflow Webserver:     kubectl port-forward svc/airflow-webserver 8080:8080 --namespace airflow
+    Default Webserver (Airflow UI) Login credentials:
+        username: admin
+        password: admin
+    Default Postgres connection credentials:
+        username: postgres
+        password: postgres
+        port: 5432
+
+    You can get Fernet Key value by running the following:
+
+        echo Fernet Key: $(kubectl get secret --namespace airflow airflow-fernet-key -o jsonpath="{.data.fernet-key}" | base64 --decode)
+
+    WARNING:
+        Kubernetes workers task logs may not persist unless you configure log persistence or remote logging!
+        Logging options can be found at: https://airflow.apache.org/docs/helm-chart/stable/manage-logs.html
+        (This warning can be ignored if logging is configured with environment variables or secrets backend)
+
+    ###########################################################
+    #  WARNING: You should set a static webserver secret key  #
+    ###########################################################
+
+    You are using a dynamically generated webserver secret key, which can lead to
+    unnecessary restarts of your Airflow components.
 
-4. Run Kubernetes tests
+    Information on how to set a static webserver secret key can be found here:
+    https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#webserver-secret-key
+    Deployed kind-airflow-python-3.7-v1.24.2 with airflow Helm Chart.
+
+    Airflow for Python 3.7 and K8S version v1.24.2 has been successfully deployed.
+
+    The KinD cluster name: airflow-python-3.7-v1.24.2
+    The kubectl cluster name: kind-airflow-python-3.7-v1.24.2.
+
+
+    KinD Cluster API server URL: http://localhost:48366
+    Connecting to localhost:18150. Num try: 1
+    Established connection to webserver at http://localhost:18150/health and it is healthy.
+    Airflow Web server URL: http://localhost:18150 (admin/admin)
+
+    NEXT STEP: You might now run tests or interact with airflow via shell (kubectl, pytest etc.) or k9s commands:
+
+
+    breeze k8s tests
+
+    breeze k8s shell
+
+    breeze k8s k9s
+
+
+8. Run Kubernetes tests
 
 Note that the tests are executed in production container not in the CI container.
 There is no need for the tests to run inside the Airflow CI container image as they only
@@ -876,69 +1116,77 @@ communicate with the Kubernetes-run Airflow deployed via the production image.
 Those Kubernetes tests require virtualenv to be created locally with airflow installed.
 The virtualenv required will be created automatically when the scripts are run.
 
-4a) You can run all the tests
+8a) You can run all the tests
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster test
-
+    breeze k8s tests
 
-4b) You can enter an interactive shell to run tests one-by-one
+.. code-block:: text
 
-This prepares and enters the virtualenv in ``.build/.kubernetes_venv_<YOUR_CURRENT_PYTHON_VERSION>`` folder:
+    Running tests with kind-airflow-python-3.7-v1.24.2 cluster.
+     Command to run: pytest kubernetes_tests
+    ========================================================================================= test session starts ==========================================================================================
+    platform darwin -- Python 3.9.9, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- /Users/jarek/IdeaProjects/airflow/.build/.k8s-env/bin/python
+    cachedir: .pytest_cache
+    rootdir: /Users/jarek/IdeaProjects/airflow, configfile: pytest.ini
+    plugins: anyio-3.6.1, instafail-0.4.2, xdist-2.5.0, forked-1.4.0, timeouts-1.2.1, cov-3.0.0
+    setup timeout: 0.0s, execution timeout: 0.0s, teardown timeout: 0.0s
+    collected 55 items
 
-.. code-block:: bash
+    kubernetes_tests/test_kubernetes_executor.py::TestKubernetesExecutor::test_integration_run_dag PASSED                                                                                            [  1%]
+    kubernetes_tests/test_kubernetes_executor.py::TestKubernetesExecutor::test_integration_run_dag_with_scheduler_failure PASSED                                                                     [  3%]
+    kubernetes_tests/test_kubernetes_pod_operator.py::TestKubernetesPodOperatorSystem::test_already_checked_on_failure PASSED                                                                        [  5%]
+    kubernetes_tests/test_kubernetes_pod_operator.py::TestKubernetesPodOperatorSystem::test_already_checked_on_success   ...
 
-    ./breeze-legacy kind-cluster shell
-
-Once you enter the environment, you receive this information:
+8b) You can enter an interactive shell to run tests one-by-one
 
+This enters the virtualenv in ``.build/.k8s-env`` folder:
 
 .. code-block:: bash
 
-    Activating the virtual environment for kubernetes testing
+    breeze k8s shell
 
-    You can run kubernetes testing via 'pytest kubernetes_tests/....'
-    You can add -s to see the output of your tests on screen
+Once you enter the environment, you receive this information:
 
-    The webserver is available at http://localhost:8080/
+.. code-block:: text
 
-    User/password: admin/admin
+    Entering interactive k8s shell.
 
-    You are entering the virtualenv now. Type exit to exit back to the original shell
+    (kind-airflow-python-3.7-v1.24.2:KubernetesExecutor)>
 
 In a separate terminal you can open the k9s CLI:
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster k9s
+    breeze k8s k9s
 
 Use it to observe what's going on in your cluster.
 
-6. Debugging in IntelliJ/PyCharm
+9. Debugging in IntelliJ/PyCharm
 
 It is very easy to running/debug Kubernetes tests with IntelliJ/PyCharm. Unlike the regular tests they are
 in ``kubernetes_tests`` folder and if you followed the previous steps and entered the shell using
-``./breeze-legacy kind-cluster shell`` command, you can setup your IDE very easy to run (and debug) your
+``breeze k8s shell`` command, you can setup your IDE very easy to run (and debug) your
 tests using the standard IntelliJ Run/Debug feature. You just need a few steps:
 
-a) Add the virtualenv as interpreter for the project:
+9a) Add the virtualenv as interpreter for the project:
 
 .. image:: images/testing/kubernetes-virtualenv.png
     :align: center
     :alt: Kubernetes testing virtualenv
 
 The virtualenv is created in your "Airflow" source directory in the
-``.build/.kubernetes_venv_<YOUR_CURRENT_PYTHON_VERSION>`` folder and you
-have to find ``python`` binary and choose it when selecting interpreter.
+``.build/.k8s-env`` folder and you have to find ``python`` binary and choose
+it when selecting interpreter.
 
-b) Choose pytest as test runner:
+9b) Choose pytest as test runner:
 
 .. image:: images/testing/pytest-runner.png
     :align: center
     :alt: Pytest runner
 
-c) Run/Debug tests using standard "Run/Debug" feature of IntelliJ
+9c) Run/Debug tests using standard "Run/Debug" feature of IntelliJ
 
 .. image:: images/testing/run-test.png
     :align: center
@@ -948,7 +1196,7 @@ c) Run/Debug tests using standard "Run/Debug" feature of IntelliJ
 NOTE! The first time you run it, it will likely fail with
 ``kubernetes.config.config_exception.ConfigException``:
 ``Invalid kube-config file. Expected key current-context in kube-config``. You need to add KUBECONFIG
-environment variable copying it from the result of "./breeze-legacy kind-cluster test":
+environment variable copying it from the result of "breeze k8s tests":
 
 .. code-block:: bash
 
@@ -956,7 +1204,6 @@ environment variable copying it from the result of "./breeze-legacy kind-cluster
 
     /home/jarek/code/airflow/.build/.kube/config
 
-
 .. image:: images/testing/kubeconfig-env.png
     :align: center
     :alt: Run/Debug tests
@@ -973,21 +1220,28 @@ print output generated test logs and print statements to the terminal immediatel
 
     pytest kubernetes_tests/test_kubernetes_executor.py::TestKubernetesExecutor::test_integration_run_dag_with_scheduler_failure -s
 
-
 You can modify the tests or KubernetesPodOperator and re-run them without re-deploying
 Airflow to KinD cluster.
 
+10. Dumping logs
 
-Sometimes there are side effects from running tests. You can run ``redeploy_airflow.sh`` without
-recreating the whole cluster. This will delete the whole namespace, including the database data
-and start a new Airflow deployment in the cluster.
+Sometimes You want to see the logs of the clister. This can be done with ``breeze k8s logs``.
 
 .. code-block:: bash
 
-    ./scripts/ci/redeploy_airflow.sh
+    breeze k8s logs
+
+11. Redeploying airflow
+
+Sometimes there are side effects from running tests. You can run ``breeze k8s deploy-airflow --upgrade``
+without recreating the whole cluster.
 
-If needed you can also delete the cluster manually:
+.. code-block:: bash
+
+    breeze k8s deploy-airflow --upgrade
 
+If needed you can also delete the cluster manually (within the virtualenv activated by
+``breeze k8s shell``:
 
 .. code-block:: bash
 
@@ -1000,20 +1254,17 @@ Kind has also useful commands to inspect your running cluster:
 
     kind --help
 
-
-However, when you change Kubernetes executor implementation, you need to redeploy
-Airflow to the cluster.
+12. Stop KinD cluster when you are done
 
 .. code-block:: bash
 
-    ./breeze-legacy kind-cluster deploy
-
+    breeze k8s delete-cluster
 
-7. Stop KinD cluster when you are done
-
-.. code-block:: bash
+.. code-block:: text
 
-    ./breeze-legacy kind-cluster stop
+    Deleting KinD cluster airflow-python-3.7-v1.24.2!
+    Deleting cluster "airflow-python-3.7-v1.24.2" ...
+    KinD cluster airflow-python-3.7-v1.24.2 deleted!
 
 
 Airflow System Tests
diff --git a/breeze-complete b/breeze-complete
deleted file mode 100644
index c43e3cc033..0000000000
--- a/breeze-complete
+++ /dev/null
@@ -1,334 +0,0 @@
-#!/usr/bin/env bash
-
-# 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.
-
-# Allowed values for the commands & flags used
-# The values here should be synchronized with the ones in
-# the ./scripts/ci/libraries/_initialization.sh and it is verified
-# Those cannot be made read-only as the breeze-complete must be re-sourceable
-
-_breeze_allowed_python_major_minor_versions="3.7 3.8 3.9 3.10"
-_breeze_allowed_backends="sqlite mysql postgres mssql"
-_breeze_allowed_integrations="cassandra kerberos mongo openldap pinot rabbitmq redis statsd trino all"
-_breeze_allowed_kubernetes_modes="image"
-_breeze_allowed_kubernetes_versions="v1.25.0 v1.24.4 v1.23.10 v1.22.13 v1.21.14"
-_breeze_allowed_helm_versions="v3.9.2"
-_breeze_allowed_kind_versions="v0.15.0"
-_breeze_allowed_mysql_versions="5.7 8"
-_breeze_allowed_mssql_versions="2017-latest 2019-latest"
-_breeze_allowed_postgres_versions="10 11 12 13 14"
-_breeze_allowed_kind_operations="start stop restart status deploy test shell k9s"
-_breeze_allowed_executors="KubernetesExecutor CeleryExecutor LocalExecutor CeleryKubernetesExecutor LocalKubernetesExecutor"
-_breeze_allowed_test_types="All Always Core Providers API CLI Integration Other WWW Postgres MySQL Helm Quarantined"
-
-# shellcheck disable=SC2034
-{
-    # Default values for the commands & flags used
-    _breeze_default_backend=$(echo "${_breeze_allowed_backends}" | awk '{print $1}')
-    _breeze_default_kubernetes_mode=$(echo "${_breeze_allowed_kubernetes_modes}" | awk '{print $1}')
-    _breeze_default_kubernetes_version=$(echo "${_breeze_allowed_kubernetes_versions}" | awk '{print $1}')
-    _breeze_default_helm_version=$(echo "${_breeze_allowed_helm_versions}" | awk '{print $1}')
-    _breeze_default_kind_version=$(echo "${_breeze_allowed_kind_versions}" | awk '{print $1}')
-    _breeze_default_executor=$(echo "${_breeze_allowed_executors}" | awk '{print $1}')
-    _breeze_default_postgres_version=$(echo "${_breeze_allowed_postgres_versions}" | awk '{print $1}')
-    _breeze_default_mysql_version=$(echo "${_breeze_allowed_mysql_versions}" | awk '{print $1}')
-    _breeze_default_mssql_version=$(echo "${_breeze_allowed_mssql_versions}" | awk '{print $1}')
-    _breeze_default_test_type=$(echo "${_breeze_allowed_test_types}" | awk '{print $1}')
-}
-
-_breeze_allowed_USE_AIRFLOW_VERSION=$(cat <<-EOF
-2.2.5
-2.1.4
-wheel
-sdist
-none
-EOF
-)
-
-_breeze_default_github_repository="apache/airflow"
-_breeze_default_github_image_id="latest"
-
-_breeze_short_options="
-h p: b: i:
-K: V:
-l a: t: d:
-v y n q f
-F P I E: C r
-L U X
-g: s:
-S: N:
-"
-
-_breeze_long_options="
-help python: backend: integration:
-kubernetes-mode: kubernetes-version: helm-version: kind-version:
-skip-mounting-local-sources mount-all-local-sources db-reset
-verbose assume-yes assume-no assume-quit forward-credentials init-script:
-github-repository: github-image-id:
-postgres-version: mysql-version: mssql-version:
-load-default-connections load-example-dags
-use-airflow-version: test-type: preserve-volumes dry-run-docker executor:
-"
-
-_breeze_commands="
-shell
-exec
-initialize-local-virtualenv
-setup-autocomplete
-start-airflow
-stop
-restart
-toggle-suppress-cheatsheet
-toggle-suppress-asciiart"
-
-_breeze_extra_arg_commands="
-docker-compose
-kind-cluster
-tests
-"
-
-_breeze_help_commands="
-flags
-help
-help-all"
-
-_breeze_all_commands="${_breeze_commands} ${_breeze_extra_arg_commands} ${_breeze_help_commands}"
-
-# Note on OSX bash has no associative arrays (Bash 3.2) so we have to fake it
-
-_breeze_known_values=""
-
-#######################################################################################################
-#
-# Dynamically set list of values in _breeze_known_values variable depending on the command used
-#
-# Used variables:
-#   _breeze_allowed_*  for allowed values for the commands
-#
-# Arguments:
-#   $1 - command to get known values for
-#
-# Set variables:
-#   _breeze_known_values is set to list of known values for the command, separated with space
-#
-#######################################################################################################
-
-function breeze_complete::get_known_values_breeze() {
-    case "$1" in
-    -p | --python)
-        _breeze_known_values=${_breeze_allowed_python_major_minor_versions}
-        ;;
-    -b | --backend)
-        _breeze_known_values=${_breeze_allowed_backends}
-        ;;
-    -i | --integration)
-        _breeze_known_values=${_breeze_allowed_integrations}
-        ;;
-    -K | --kubernetes-mode)
-        _breeze_known_values=${_breeze_allowed_kubernetes_modes}
-        ;;
-    -V | --kubernetes-version)
-        _breeze_known_values=${_breeze_allowed_kubernetes_versions}
-        ;;
-    --kind-version)
-        _breeze_known_values=${_breeze_allowed_kind_versions}
-        ;;
-    --helm-version)
-        _breeze_known_values=${_breeze_allowed_helm_versions}
-        ;;
-    --use-airflow-version)
-        _breeze_known_values=${_breeze_allowed_USE_AIRFLOW_VERSION}
-        ;;
-    docker-compose)
-        # shellcheck disable=SC2034
-        if typeset -f "_docker_compose" >/dev/null; then
-            _docker_compose
-        fi
-        _breeze_known_values=""
-        ;;
-    --postgres-version)
-        _breeze_known_values=${_breeze_allowed_postgres_versions}
-        ;;
-    --mysql-version)
-        _breeze_known_values=${_breeze_allowed_mysql_versions}
-        ;;
-    --mssql-version)
-        _breeze_known_values=${_breeze_allowed_mssql_versions}
-        ;;
-    -g | --github-repository)
-        _breeze_known_values="${_breeze_default_github_repository}"
-        ;;
-    kind-cluster)
-        _breeze_known_values="${_breeze_allowed_kind_operations}"
-        ;;
-    tests)
-        _breeze_known_values="$(find tests -name '*.py')"
-        ;;
-    --test-type)
-        _breeze_known_values="${_breeze_allowed_test_types}"
-        ;;
-    --executor)
-      _breeze_known_values="${_breeze_allowed_executors}"
-      ;;
-    *)
-        _breeze_known_values=""
-        ;;
-    esac
-}
-
-_breeze_getopt_short_options=""
-_breeze_getopt_long_options=""
-
-#######################################################################################################
-#
-# Retrieves list of short and long options from the constants in the form of EOL separated values
-# which is easy to maintain into comma separated list - usable for getopt.
-#
-# Used variables:
-#   _breeze_short_options
-#   _breeze_long_options
-#
-# Set variables:
-#   _breeze_getopt_short_options
-#   _breeze_getopt_long_options
-#######################################################################################################
-function breeze_complete::_build_options_breeze {
-    local separator=""
-    local option
-
-    for option in ${_breeze_short_options}
-    do
-        _breeze_getopt_short_options="${_breeze_getopt_short_options}${separator}${option}"
-        separator=","
-    done
-
-    separator=""
-    for option in ${_breeze_long_options}
-    do
-        _breeze_getopt_long_options="${_breeze_getopt_long_options}${separator}${option}"
-        separator=","
-    done
-}
-
-#######################################################################################################
-#
-# Returns 0 if word to check is in the list of words
-# which is easy to maintain into comma separated list - usable for getopt.
-#
-# Arguments:
-#   $1 - space separated list of words
-#   $2 - word to look for
-#
-# Return:
-#   0 - if the word is found in the list
-#   1 - otherwise
-#######################################################################################################
-function breeze_complete::_listcontains_breeze {
-    local word
-    for word in $1; do
-        [[ ${word} = "$2" ]] && return 0
-    done
-    return 1
-}
-
-
-#######################################################################################################
-#
-# Convert options from the lists passed and add the options to appropriate variables.
-# The options are stripped of the trailing colon and if they do have a colon, they are added
-# to the options that require an argument. Options are prefixed with the prefix.
-#
-#   Arguments:
-#      $1 - prefix for the option
-#      $2 - list of options
-#
-#   Variables modified:
-#       all_options - space-separated all options
-#       options_with extra_args - space separate list of options with an extra argument
-#######################################################################################################
-function breeze_complete::_convert_options {
-    local option_with_prefix_without_colon
-    local option
-    local prefix=$1
-    for option in $2
-    do
-        last_character="${option:$((${#option} - 1)):1}"
-        option_with_prefix_without_colon=${prefix}${option//:/}
-        if [[ "${last_character}" == ":" ]]; then
-            options_with_extra_arguments="${options_with_extra_arguments} ${option_with_prefix_without_colon}"
-        fi
-        all_options="${all_options} ${option_with_prefix_without_colon}"
-    done
-}
-
-
-#######################################################################################################
-#
-# A completion function for breeze
-#
-# See: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion
-#
-#######################################################################################################
-function breeze_complete::_comp_breeze {
-    local all_options=""
-    local options_with_extra_arguments=""
-    local currently_typed_string
-    local previous_command_in_the_command_line
-    local last_character
-
-    breeze_complete::_convert_options "-" "${_breeze_short_options}"
-    breeze_complete::_convert_options "--" "${_breeze_long_options}"
-
-    # Add all Breeze commands to list of all options
-    all_options="${all_options} ${_breeze_all_commands}"
-
-    # Add all Breeze commands with extra args to list of options with extra args
-    options_with_extra_arguments="${options_with_extra_arguments} ${_breeze_extra_arg_commands}"
-
-    # Retrieve typed beginning of current commands used so that we can use it as filter in the compgen utility
-    currently_typed_string="${COMP_WORDS[${COMP_CWORD}]}"
-
-    # if we have already typed more words, then we check what was the last previous command so that
-    # we can retrieve list of known values matching it.
-    if [[ ${#COMP_WORDS[@]} -gt 1 ]]; then
-        previous_command_in_the_command_line="${COMP_WORDS[${COMP_CWORD} - 1]}"
-    else
-        previous_command_in_the_command_line=""
-    fi
-
-    # if the previous command is in the list of options with extra args - check what are the known values
-    if breeze_complete::_listcontains_breeze \
-            "${options_with_extra_arguments}" "${previous_command_in_the_command_line}"; then
-        # Set COMPREPLY containing list of valid values matching currently typed string from known values
-        COMPREPLY=()
-        breeze_complete::get_known_values_breeze "${previous_command_in_the_command_line}"
-        while IFS='' read -r line; do COMPREPLY+=("${line}"); done \
-            < <(compgen -W "${_breeze_known_values}" -- "${currently_typed_string}")
-    else
-        # Set COMPREPLY containing list of valid commands/options matching currently typed string
-        COMPREPLY=()
-        while IFS='' read -r line; do COMPREPLY+=("${line}"); done \
-            < <(compgen -W "${all_options}" -- "${currently_typed_string}")
-    fi
-}
-
-breeze_complete::_build_options_breeze
-
-# set autocompletion function for breeze
-complete -F breeze_complete::_comp_breeze breeze-legacy
-complete -F breeze_complete::_comp_breeze ./breeze-legacy
diff --git a/breeze-legacy b/breeze-legacy
deleted file mode 100755
index 3269992a35..0000000000
--- a/breeze-legacy
+++ /dev/null
@@ -1,2579 +0,0 @@
-#!/usr/bin/env bash
-
-# 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.
-set -euo pipefail
-
-
-AIRFLOW_SOURCES="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-if [[ ${BREEZE_REDIRECT=} == "" ]]; then
-    set +u
-    mkdir -p "${AIRFLOW_SOURCES}"/logs
-    export BREEZE_REDIRECT="true"
-    if [[ "$(uname)" == "Darwin" ]]; then
-      exec script -q "${AIRFLOW_SOURCES}"/logs/breeze.out "$(command -v bash)" -c "$(printf "%q " "${0}" "${@}")"
-    else
-      exec script --return --quiet "${AIRFLOW_SOURCES}"/logs/breeze.out -c "$(printf "%q " "${0}" "${@}")"
-    fi
-    set -u
-fi
-
-export AIRFLOW_SOURCES
-readonly AIRFLOW_SOURCES
-
-
-# Bash arrays need to be defined outside of functions unfortunately :(
-# Because on Mac OS Bash 3.4 defining arrays inside functions does not work
-# Array with extra options for Docker compose
-declare -a EXTRA_DC_OPTIONS
-export EXTRA_DC_OPTIONS
-
-# Array with selected integrations
-declare -a INTEGRATIONS
-export INTEGRATIONS
-
-# This is where remaining args are passed
-declare -a REMAINING_ARGS
-export REMAINING_ARGS
-
-#######################################################################################################
-# Sets up all the default variables for Breeze. They are needed by all other functions
-# All those variables are exported. They are not set to read-only because those
-# defaults can be modified later on when command line arguments are parsed
-# and variables stored in .build directory (stored in the previous run) are read
-#
-# Used globals:
-#    FORCE_SCREEN_WIDTH
-#
-# Modified globals (constants or candidates for constants after we override them via appropriate flags):
-#
-#    BREEZE
-#    SUPPRESS_CHEATSHEET_FILE
-#    SUPPRESS_ASCIIART_FILE
-#    MAX_SCREEN_WIDTH
-#    SCREEN_WIDTH
-#    MOUNT_SELECTED_LOCAL_SOURCES
-#    FORWARD_CREDENTIALS
-#    DB_RESET
-#    START_AIRFLOW
-#    INSTALL_AIRFLOW_VERSION
-#    INSTALL_AIRFLOW_REFERENCE
-#    FORCE_BUILD_IMAGES
-#    PRODUCTION_IMAGE
-#    PYTHON_MAJOR_MINOR_VERSION
-#
-# Global variables:
-#
-#    command_to_run
-#    second_command_to_run
-#    docker_compose_command
-#
-# Also it sets the variables and globals set by common initialization functions from
-# scripts/ci/libraries/_initialization.sh and breeze-complete script (which sets-up auto-complete).
-#
-#######################################################################################################
-function breeze::setup_default_breeze_constants() {
-    # Indicates that we are inside Breeze environment
-    export BREEZE=true
-    readonly BREEZE
-
-    # If those files are present, the ASCII-art/cheat-sheet are suppressed
-    SUPPRESS_CHEATSHEET_FILE="${AIRFLOW_SOURCES}/.build/.suppress_cheatsheet"
-    readonly SUPPRESS_CHEATSHEET_FILE
-
-    SUPPRESS_ASCIIART_FILE="${AIRFLOW_SOURCES}/.build/.suppress_asciiart"
-    readonly SUPPRESS_ASCIIART_FILE
-
-    # Maximum screen indented_screen_width to print the lines spanning the whole terminal indented_screen_width
-    export MAX_SCREEN_WIDTH=100
-    readonly MAX_SCREEN_WIDTH
-
-    # By default we mount selected local Airflow sources
-    export MOUNT_SELECTED_LOCAL_SOURCES="true"
-
-    # By default we do not mount all local Airflow sources
-    export MOUNT_ALL_LOCAL_SOURCES="false"
-
-    # Forward common host credentials to docker (gcloud, aws etc.).
-    export FORWARD_CREDENTIALS="false"
-
-    # If set to true, the database will be reset at entry. Works for Postgres and MySQL
-    export DB_RESET="false"
-
-    # If set to true, the database will be initialized, a user created and webserver and scheduler started
-    export START_AIRFLOW="false"
-
-    # If set to true, the test connections will be created
-    export LOAD_DEFAULT_CONNECTIONS="false"
-
-    # If set to true, the sample dags will be used
-    export LOAD_EXAMPLES="false"
-
-    # If set to true, Breeze db volumes will be preserved when breeze is stopped and reused next time
-    # Which means that you do not have to start from scratch
-    export PRESERVE_VOLUMES="false"
-
-    # Sources by default are installed from local sources when using breeze
-    AIRFLOW_SOURCES_FROM=${AIRFLOW_SOURCES_FROM:="."}
-    export AIRFLOW_SOURCES_FROM
-
-    # They are copied to /opt/airflow by default in breeze
-    AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES_TO:="/opt/airflow"}
-    export AIRFLOW_SOURCES_TO
-
-    # Unlike in CI scripts, in breeze by default production image is installed from sources
-    export AIRFLOW_INSTALLATION_METHOD="."
-
-    # If it set is set to specified version, then the source version of Airflow
-    # is removed and the specified version of Airflow is installed from PyPi
-    export INSTALL_AIRFLOW_VERSION=""
-
-    # If it is set to specified reference (tag/branch), then the source version
-    # of Airflow is removed and the specified version of Airflow is installed from GitHub
-    export INSTALL_AIRFLOW_REFERENCE=""
-
-    # Determines whether to force build without checking if it is needed
-    # Can be overridden by '--force-build-images' flag.
-    export FORCE_BUILD_IMAGES="false"
-
-    # Determines whether to reinstall airflow at entering the image.
-    export USE_AIRFLOW_VERSION=""
-    # if set to true, the ci image will look for wheel packages in dist folder and will install them
-    # during entering the container
-    export USE_PACKAGES_FROM_DIST="false"
-
-    # load all the common functions here - those are the functions that are shared between Breeze
-    # and CI scripts. The CI scripts do not use Breeze as driving script - they read all configuration
-    # from the environment variables. That's why we keep all the common initialization in those libs
-    # shellcheck source=scripts/ci/libraries/_all_libs.sh
-    . "${AIRFLOW_SOURCES}/scripts/ci/libraries/_all_libs.sh"
-
-    # When we generate documentation for README files, we want to force the indented_screen_width of terminal so that
-    # No matter who is running the documentation generation gets the same output
-    if [[ ${FORCE_SCREEN_WIDTH:="false"} != "true" ]]; then
-        # Sets indented_screen_width of the screen from terminal
-        SCREEN_WIDTH="$(tput cols)"
-        if [[ -z ${SCREEN_WIDTH=} ]]; then
-            SCREEN_WIDTH=${MAX_SCREEN_WIDTH}
-        fi
-        if ((SCREEN_WIDTH > MAX_SCREEN_WIDTH)); then
-            SCREEN_WIDTH=${MAX_SCREEN_WIDTH}
-        fi
-    else
-        SCREEN_WIDTH=${MAX_SCREEN_WIDTH}
-    fi
-
-    export SCREEN_WIDTH
-    readonly SCREEN_WIDTH
-
-    # for Breeze default tests executed are "All"
-    export TEST_TYPE=${TEST_TYPE:="All"}
-
-    # Update short and long options in the breeze-complete script
-    # This way autocomplete will work automatically with all options available
-    # shellcheck source=breeze-complete
-    . "${AIRFLOW_SOURCES}/breeze-complete"
-
-    # Default command to run - entering breeze environment
-    command_to_run="enter_breeze"
-
-    # In some cases we also want to run two commands in a row (for example when we restart the environment)
-    second_command_to_run=""
-
-    # Determines if help should be run (set to true by --help flag)
-    run_help="false"
-
-    # Holds docker compose command if the `docker-compose` command is used.
-    docker_compose_command=""
-}
-
-#######################################################################################################
-#
-# Initializes development-friendly virtualenv if you are already in such env. It installs all the necessary
-# packages from PyPI and it case of problems it provides useful hints on what prerequisites should be
-# installed. It also removes and resets the existing AIRFLOW_HOME installation to make sure that you
-# have it synchronized with the version of airflow installed. It resets the airflow's sqlite database to
-# a clean state. You can use this function if your virtualenv is broken, to clean it up
-#
-# Used globals:
-#    PYTHON_MAJOR_MINOR_VERSION
-#    AIRFLOW_HOME_DIR
-#    AIRFLOW_SOURCES
-#    VIRTUALENV_EXTRAS
-#    DEFAULT_CONSTRAINTS_BRANCH
-#    OSTYPE
-#
-#######################################################################################################
-function breeze::initialize_virtualenv() {
-    # Check if we are inside virtualenv
-    set +e
-    echo -e "import sys\nif not hasattr(sys,'base_prefix'):\n  sys.exit(1)" |
-        python"${PYTHON_MAJOR_MINOR_VERSION}"
-    local res=$?
-    set -e
-    if [[ ${res} != "0" ]]; then
-        echo
-        echo  "${COLOR_RED}ERROR: Initializing local virtualenv only works when you have virtualenv activated  ${COLOR_RESET}"
-        echo
-        echo "Please enter your local virtualenv before (for example using 'pyenv activate' or 'workon') "
-        echo
-        exit 1
-    else
-        echo
-        echo "Initializing the virtualenv: $(command -v python)!"
-        echo
-        echo "Extras to be installed: ${VIRTUALENV_EXTRAS}"
-        echo
-        echo "This will wipe out ${AIRFLOW_HOME_DIR} and reset all the databases!"
-        echo
-        "${AIRFLOW_SOURCES}/scripts/tools/confirm" "Proceeding with the initialization"
-        echo
-        pushd "${AIRFLOW_SOURCES}" >/dev/null 2>&1 || exit 1
-        set +e
-        pip install -e ".[${VIRTUALENV_EXTRAS}]" \
-            --constraint "https://raw.githubusercontent.com/${CONSTRAINTS_GITHUB_REPOSITORY}/${DEFAULT_CONSTRAINTS_BRANCH}/constraints-source-providers-${PYTHON_MAJOR_MINOR_VERSION}.txt"
-        res=$?
-        set -e
-        popd
-        if [[ ${res} != "0" ]]; then
-            echo "#######################################################################"
-            echo "  You had some troubles installing the venv !!!!!"
-            echo "  Try running the command below and rerun virtualenv installation"
-            echo
-            if [[ ${OSTYPE} == "darwin"* ]]; then
-                echo "  brew install sqlite mysql postgresql openssl"
-                echo "  export LDFLAGS=\"-L/usr/local/opt/openssl/lib\""
-                echo "  export CPPFLAGS=\"-I/usr/local/opt/openssl/include\""
-            else
-                echo "  sudo apt install build-essential python3-dev libsqlite3-dev openssl \\"
-                echo "              sqlite default-libmysqlclient-dev libmysqlclient-dev postgresql"
-            fi
-            echo
-            echo "#######################################################################"
-            exit ${res}
-        fi
-        echo
-        echo "Wiping and recreating ${AIRFLOW_HOME_DIR}"
-        echo
-        if [[ "${AIRFLOW_SOURCES}" == "${AIRFLOW_HOME_DIR}" ]]; then
-            echo "AIRFLOW_HOME and Source code for Apache Airflow resides in the same path ${AIRFLOW_HOME_DIR}"
-            echo "When running this command it will delete all the files in the path ${AIRFLOW_HOME_DIR} to clear dynamic files like config/logs/db"
-            echo "Move your source code for Apache Airflow to different folder to avoid deletion"
-            exit 1
-        fi
-        rm -rvf "${AIRFLOW_HOME_DIR}"
-        mkdir -p "${AIRFLOW_HOME_DIR}"
-        echo
-        echo "Resetting AIRFLOW sqlite database"
-        echo
-        AIRFLOW__CORE__LOAD_EXAMPLES="False" \
-            AIRFLOW__CORE__UNIT_TEST_MODE="False" \
-            AIRFLOW__CORE__SQL_ALCHEMY_POOL_ENABLED="False" \
-            AIRFLOW__CORE__DAGS_FOLDER="${AIRFLOW_SOURCES}/empty" \
-            AIRFLOW__CORE__PLUGINS_FOLDER="${AIRFLOW_SOURCES}/empty" \
-            airflow db reset -y
-        echo
-        echo "Resetting AIRFLOW sqlite unit test database"
-        echo
-        AIRFLOW__CORE__LOAD_EXAMPLES="False" \
-            AIRFLOW__CORE__UNIT_TEST_MODE="True" \
-            AIRFLOW__CORE__SQL_ALCHEMY_POOL_ENABLED="False" \
-            AIRFLOW__CORE__DAGS_FOLDER="${AIRFLOW_SOURCES}/empty" \
-            AIRFLOW__CORE__PLUGINS_FOLDER="${AIRFLOW_SOURCES}/empty" \
-            airflow db reset -y
-        echo
-        echo "Initialization of virtualenv was successful! Go ahead and develop Airflow!"
-        echo
-        exit 0
-    fi
-}
-
-#######################################################################################################
-#
-# Sets up autocomplete for Breeze for both - bash and zsh
-#
-# Used globals:
-#
-#    AIRFLOW_SOURCES
-#    HOME
-#    OSTYPE
-#
-#######################################################################################################
-function breeze::setup_autocomplete() {
-    echo "Installing bash/zsh completion for local user"
-    echo
-    "${AIRFLOW_SOURCES}/scripts/tools/confirm" "This will create ~/.bash_completion.d/ directory and modify ~/.*rc files"
-    echo
-    echo
-    mkdir -pv ~/.bash_completion.d
-    ln -sf "${AIRFLOW_SOURCES}/breeze-complete" "${HOME}/.bash_completion.d/"
-    echo
-    echo "Breeze Bash completion is now linked to: ${AIRFLOW_SOURCES}/breeze-complete"
-    echo
-    local breeze_comment="Added by Airflow Breeze autocomplete setup"
-    if ! grep "${breeze_comment}" "${HOME}/.bashrc" >/dev/null 2>&1; then
-        touch ~/.bashrc
-        # shellcheck disable=SC2129
-        echo "# START: ${breeze_comment}" >>~/.bashrc
-        cat <<"EOF" >>~/.bashrc
-for bcfile in ~/.bash_completion.d/* ; do
-    . ${bcfile}
-done
-EOF
-        echo "# END: ${breeze_comment}" >>~/.bashrc
-        echo
-        echo "The ${HOME}/.bashrc has been modified"
-        echo
-    else
-        echo
-        echo "The ${HOME}/.bashrc was already modified before. Not changing it."
-        echo
-    fi
-    if ! grep "${breeze_comment}" "${HOME}/.zshrc" >/dev/null 2>&1; then
-        # shellcheck disable=SC2129
-        echo "# START: ${breeze_comment}" >>~/.zshrc
-        cat <<"EOF" >>~/.zshrc
-autoload compinit && compinit
-autoload bashcompinit && bashcompinit
-source ~/.bash_completion.d/breeze-complete
-EOF
-        echo "# END: ${breeze_comment}" >>~/.zshrc
-        echo
-        echo "The ${HOME}/.zshrc has been modified"
-        echo
-    else
-        echo
-        echo "The ${HOME}/.zshrc was already modified before. Not changing it."
-        echo
-    fi
-    if [[ "${OSTYPE}" == "darwin"* ]]; then
-        #  For MacOS we have to handle the special case where terminal app DOES NOT run .bashrc by default
-        #  But re-runs .bash_profile :(
-        #  See https://scriptingosx.com/2017/04/about-bash_profile-and-bashrc-on-macos/
-        if ! grep "${breeze_comment}" "${HOME}/.bash_profile"; then
-            # shellcheck disable=SC2129
-            echo "# START: ${breeze_comment}" >>~/.bash_profile
-            cat <<"EOF" >>~/.bash_profile
-if [ -r ~/.bashrc ]; then
-    source ~/.bashrc
-fi
-EOF
-            echo "# END: ${breeze_comment}" >>~/.bash_profile
-            echo
-            echo "The ${HOME}/.bash_profile has been modified"
-            echo
-        else
-            echo
-            echo "The ${HOME}/.bash_profile was already modified before. Not changing it."
-            echo
-        fi
-    fi
-    echo
-    echo
-    echo "Breeze completion is installed to ~/.bash_completion.d/breeze-complete"
-    echo
-    echo "Please exit and re-enter your shell or run:"
-    echo
-    if [[ "${OSTYPE}" == "darwin"* ]]; then
-        if grep "${breeze_comment}" "${HOME}/.zshrc" >/dev/null 2>&1; then
-            echo "    source ~/.zshrc"
-            echo
-            echo "    source ~/.bash_completion.d/breeze-complete"
-            echo
-            exec zsh
-            exit 0
-        fi
-    fi
-    echo "    source ~/.bash_completion.d/breeze-complete"
-    echo
-    exit 0
-}
-
-#######################################################################################################
-#
-# Prints information about the current configuration of Breeze - if you enter breeze interactively
-# and you did not suppress cheatsheet or asciiart, it also prints those. It also prints values
-# of constants set by breeze::read_saved_environment_variables() function and other initialization functions.
-#
-# Used globals:
-#
-#    BACKEND
-#    POSTGRES_VERSION
-#    MYSQL_VERSION
-#    SUPPRESS_CHEATSHEET_FILE
-#    SUPPRESS_ASCIIART_FILE
-#    PRODUCTION_IMAGE
-#    BRANCH_NAME
-#    AIRFLOW_CI_IMAGE
-#    AIRFLOW_PROD_IMAGE
-#    AIRFLOW_VERSION
-#    INSTALL_AIRFLOW_VERSION
-#    INSTALL_AIRFLOW_REFERENCE
-#
-# Outputs:
-#    Prints the information about the build to stdout.
-#
-#######################################################################################################
-function breeze::print_badge() {
-    local backend_version=""
-    if [[ ${BACKEND} == "postgres" ]]; then
-        backend_version="${POSTGRES_VERSION}"
-    elif [[ ${BACKEND} == "mysql" ]]; then
-        backend_version="${MYSQL_VERSION}"
-    fi
-    if [[ ! -f "${SUPPRESS_ASCIIART_FILE}" && ${command_to_run} == "enter_breeze" ]]; then
-        cat <<EOF
-
-
-
-
-                                  @&&&&&&@
-                                 @&&&&&&&&&&&@
-                                &&&&&&&&&&&&&&&&
-                                        &&&&&&&&&&
-                                            &&&&&&&
-                                             &&&&&&&
-                           @@@@@@@@@@@@@@@@   &&&&&&
-                          @&&&&&&&&&&&&&&&&&&&&&&&&&&
-                         &&&&&&&&&&&&&&&&&&&&&&&&&&&&
-                                         &&&&&&&&&&&&
-                                             &&&&&&&&&
-                                           &&&&&&&&&&&&
-                                      @@&&&&&&&&&&&&&&&@
-                   @&&&&&&&&&&&&&&&&&&&&&&&&&&&&  &&&&&&
-                  &&&&&&&&&&&&&&&&&&&&&&&&&&&&    &&&&&&
-                 &&&&&&&&&&&&&&&&&&&&&&&&         &&&&&&
-                                                 &&&&&&
-                                               &&&&&&&
-                                            @&&&&&&&&
-            @&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-           &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-          &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
-
-
-
-     @&&&@       &&  @&&&&&&&&&&&   &&&&&&&&&&&&  &&            &&&&&&&&&&  &&&     &&&     &&&
-    &&& &&&      &&  @&&       &&&  &&            &&          &&&       &&&@ &&&   &&&&&   &&&
-   &&&   &&&     &&  @&&&&&&&&&&&&  &&&&&&&&&&&   &&          &&         &&&  &&& &&& &&@ &&&
-  &&&&&&&&&&&    &&  @&&&&&&&&&     &&            &&          &&@        &&&   &&@&&   &&@&&
- &&&       &&&   &&  @&&     &&&@   &&            &&&&&&&&&&&  &&&&&&&&&&&&     &&&&   &&&&
-
-&&&&&&&&&&&&   &&&&&&&&&&&&   &&&&&&&&&&&@  &&&&&&&&&&&&   &&&&&&&&&&&   &&&&&&&&&&&
-&&&       &&&  &&        &&&  &&            &&&                  &&&&    &&
-&&&&&&&&&&&&@  &&&&&&&&&&&&   &&&&&&&&&&&   &&&&&&&&&&&       &&&&       &&&&&&&&&&
-&&&        &&  &&   &&&&      &&            &&&             &&&&         &&
-&&&&&&&&&&&&&  &&     &&&&@   &&&&&&&&&&&@  &&&&&&&&&&&&  @&&&&&&&&&&&   &&&&&&&&&&&
-
-EOF
-        if [[ ${PRODUCTION_IMAGE} == "true" ]]; then
-            cat <<EOF
-
-                               Use production image.
-
-                               Branch name:            ${BRANCH_NAME}
-                               Docker image:           ${AIRFLOW_PROD_IMAGE}
-                               Platform:               ${PLATFORM}
-EOF
-        else
-            cat <<EOF
-
-                               Use CI image.
-
-                               Branch name:            ${BRANCH_NAME}
-                               Docker image:           ${AIRFLOW_CI_IMAGE_WITH_TAG}
-                               Platform:               ${PLATFORM}
-                               Airflow source version: ${AIRFLOW_VERSION}
-EOF
-        fi
-        cat <<EOF
-                               Python version:         ${PYTHON_MAJOR_MINOR_VERSION}
-                               Backend:                ${BACKEND} ${backend_version}
-EOF
-        if [[ -n ${USE_AIRFLOW_VERSION=} ]]; then
-            cat <<EOF
-
-                               Airflow used at runtime: ${USE_AIRFLOW_VERSION=}
-
-EOF
-        fi
-    else
-        if [[ ${PRODUCTION_IMAGE} == "true" ]]; then
-            cat <<EOF
-
-   Production image.
-
-   Branch name:             ${BRANCH_NAME}
-   Docker image:            ${AIRFLOW_PROD_IMAGE}
-   Platform:                ${PLATFORM}
-EOF
-        else
-            cat <<EOF
-
-   CI image.
-
-   Branch name:             ${BRANCH_NAME}
-   Docker image:            ${AIRFLOW_CI_IMAGE}
-   Platform:                ${PLATFORM}
-
-EOF
-        fi
-        if [[ -n ${INSTALL_AIRFLOW_VERSION=} || -n ${INSTALL_AIRFLOW_REFERENCE=} ]]; then
-            cat <<EOF
-   Airflow version installed: ${INSTALL_AIRFLOW_VERSION=}${INSTALL_AIRFLOW_REFERENCE=}
-
-EOF
-        fi
-        cat <<EOF
-
-   Airflow source version:  ${AIRFLOW_VERSION}
-   Python version:          ${PYTHON_MAJOR_MINOR_VERSION}
-   Backend:                 ${BACKEND} ${backend_version}
-EOF
-    fi
-    if [[ ${VERBOSE} == "true" ]]; then
-        initialization::summarize_build_environment
-    fi
-
-}
-
-#######################################################################################################
-#
-# Prepares command file that can be used to easily run the docker commands outside of Breeze.
-#
-# The command file generated in cache ./build directory is a standalone script that contains
-# All the environment variables and docker-compose configuration to run the command.
-# This is because depending on configuration of Breeze we might have different compose files
-# used and different env variables set.
-#
-# Those are a convenience scripts that you might use to debug command execution although
-# In most cases they are used internally by Breeze.
-#
-# Arguments:
-#
-#   file to prepare
-#   command to run
-#   compose_file to use
-#   airflow_image to use
-#
-# Outputs:
-#   Creates the convenience command file that can be run to use the docker command.
-#
-#######################################################################################################
-function breeze::prepare_command_file() {
-    local file="${1}"
-    local command="${2}"
-    local compose_file="${3}"
-    cat <<EOF >"${file}"
-#!/usr/bin/env bash
-docker_compose_version=\$(docker-compose --version || true)
-if [[ \${docker_compose_version} =~ .*([0-9]+)\.([0-9]+)\.([0-9]+).* ]]; then
-    major=\${BASH_REMATCH[1]}
-    minor=\${BASH_REMATCH[2]}
-    patch=\${BASH_REMATCH[3]}
-    if [[ \${major} == "1" ]]; then
-        if (( minor < 29 )); then
-            echo
-            echo "${COLOR_RED}You have too old version of docker-compose: \${major}.\${minor}.\${patch}! At least 1.29 is needed! Please upgrade!${COLOR_RESET}"
-            echo "${COLOR_RED}See https://docs.docker.com/compose/install/ for instructions. Make sure docker-compose you install is first on the PATH variable of yours.${COLOR_RESET}"
-            echo
-            exit 1
-        fi
-    fi
-    echo
-    echo "${COLOR_GREEN}Good version of docker-compose: \${major}.\${minor}.\${patch}${COLOR_RESET}"
-    echo
-else
-    echo
-    echo "${COLOR_YELLOW}Unknown docker-compose version. At least 1.29 is needed! If Breeze fails - upgrade to latest available docker-compose version${COLOR_RESET}"
-    echo
-fi
-
-if [[ \${VERBOSE} == "true" ]]; then
-  echo
-  echo "Executing script:"
-  echo
-  echo "${COLOR_CYAN}${file} \${@}${COLOR_RESET}"
-  echo
-  set -x
-fi
-cd "\$( dirname "\${BASH_SOURCE[0]}" )" || exit
-export HOST_USER_ID=${HOST_USER_ID}
-export HOST_GROUP_ID=${HOST_GROUP_ID}
-export COMPOSE_FILE="${compose_file}"
-export PYTHON_MAJOR_MINOR_VERSION="${PYTHON_MAJOR_MINOR_VERSION}"
-export BACKEND="${BACKEND}"
-export AIRFLOW_VERSION="${AIRFLOW_VERSION}"
-export INSTALL_AIRFLOW_VERSION="${INSTALL_AIRFLOW_VERSION}"
-export PLATFORM="${PLATFORM}"
-export SSH_PORT="${SSH_PORT}"
-export WEBSERVER_HOST_PORT="${WEBSERVER_HOST_PORT}"
-export FLOWER_HOST_PORT="${FLOWER_HOST_PORT}"
-export REDIS_HOST_PORT="${REDIS_HOST_PORT}"
-export POSTGRES_HOST_PORT="${POSTGRES_HOST_PORT}"
-export POSTGRES_VERSION="${POSTGRES_VERSION}"
-export MYSQL_HOST_PORT="${MYSQL_HOST_PORT}"
-export MYSQL_VERSION="${MYSQL_VERSION}"
-export MSSQL_HOST_PORT="${MSSQL_HOST_PORT}"
-export MSSQL_VERSION="${MSSQL_VERSION}"
-export AIRFLOW_SOURCES="${AIRFLOW_SOURCES}"
-export AIRFLOW_CI_IMAGE="${AIRFLOW_CI_IMAGE}"
-export AIRFLOW_CI_IMAGE_WITH_TAG="${AIRFLOW_CI_IMAGE_WITH_TAG}"
-export AIRFLOW_PROD_IMAGE="${AIRFLOW_PROD_IMAGE}"
-export AIRFLOW_IMAGE_KUBERNETES="${AIRFLOW_IMAGE_KUBERNETES}"
-export SQLITE_URL="${SQLITE_URL}"
-export USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION}"
-export USE_PACKAGES_FROM_DIST="${USE_PACKAGES_FROM_DIST}"
-export EXECUTOR="${EXECUTOR}"
-export START_AIRFLOW="${START_AIRFLOW}"
-export ENABLED_INTEGRATIONS="${ENABLED_INTEGRATIONS}"
-export ENABLED_SYSTEMS="${ENABLED_SYSTEMS}"
-export GITHUB_ACTIONS="${GITHUB_ACTIONS}"
-export ISSUE_ID="${ISSUE_ID}"
-export NUM_RUNS="${NUM_RUNS}"
-docker-compose ${command}
-EOF
-    chmod u+x "${file}"
-}
-
-#######################################################################################################
-#
-# Prepare all command files that we are using. We use dc_ci - to run docker compose command for CI image
-#
-# Global constants set:
-#
-#     PYTHON_BASE_IMAGE
-#     AIRFLOW_CI_IMAGE
-#     BUILT_CI_IMAGE_FLAG_FILE
-#
-#######################################################################################################
-function breeze::prepare_command_files() {
-    local main_ci_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/base.yml
-    local backend_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/backend-${BACKEND}.yml
-
-    local backend_port_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/backend-${BACKEND}-port.yml
-    local local_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/local.yml
-    local local_all_sources_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/local-all-sources.yml
-    local files_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/files.yml
-    local remove_sources_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/remove-sources.yml
-    local forward_credentials_docker_compose_file=${SCRIPTS_CI_DIR}/docker-compose/forward-credentials.yml
-
-
-    if [[ ${BACKEND} == "mssql" ]]; then
-        local docker_filesystem
-        docker_filesystem=$(stat "-f" "-c" "%T" /var/lib/docker 2>/dev/null || echo "unknown")
-        if [[ ${docker_filesystem} == "tmpfs" ]]; then
-            # In case of tmpfs backend for docker, mssql fails because TMPFS does not support
-            # O_DIRECT parameter for direct writing to the filesystem
-            # https://github.com/microsoft/mssql-docker/issues/13
-            # so we need to mount an external volume for its db location
-            # specified by MSSQL_DATA_VOLUME
-            backend_docker_compose_file="${backend_docker_compose_file}:${SCRIPTS_CI_DIR}/docker-compose/backend-mssql-bind-volume.yml"
-        else
-            backend_docker_compose_file="${backend_docker_compose_file}:${SCRIPTS_CI_DIR}/docker-compose/backend-mssql-docker-volume.yml"
-        fi
-    fi
-
-
-    local compose_ci_file=${main_ci_docker_compose_file}:${backend_docker_compose_file}:${files_docker_compose_file}
-
-    if [[ "${MOUNT_SELECTED_LOCAL_SOURCES}" != "false" ]]; then
-        compose_ci_file=${compose_ci_file}:${local_docker_compose_file}:${backend_port_docker_compose_file}
-    fi
-
-    if [[ "${MOUNT_ALL_LOCAL_SOURCES}" != "false" ]]; then
-        compose_ci_file=${compose_ci_file}:${local_all_sources_docker_compose_file}:${backend_port_docker_compose_file}
-    fi
-
-    if [[ ${FORWARD_CREDENTIALS} == "true" ]]; then
-        compose_ci_file=${compose_ci_file}:${forward_credentials_docker_compose_file}
-    fi
-
-    if [[ -n ${INSTALL_AIRFLOW_VERSION=} || -n ${INSTALL_AIRFLOW_REFERENCE} || -n ${USE_AIRFLOW_VERSION=} ]]; then
-        compose_ci_file=${compose_ci_file}:${remove_sources_docker_compose_file}
-    fi
-
-    set +u
-    local unique_integrations
-    # shellcheck disable=SC2207
-    unique_integrations=($(echo "${INTEGRATIONS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
-
-    local integration
-    for integration in "${unique_integrations[@]}"; do
-        compose_ci_file=${compose_ci_file}:${SCRIPTS_CI_DIR}/docker-compose/integration-${integration}.yml
-    done
-    set -u
-
-    export DOCKER_COMPOSE_RUN_SCRIPT_FOR_CI="dc_ci"
-    readonly DOCKER_COMPOSE_RUN_SCRIPT_FOR_CI
-
-    breeze::prepare_command_file "${BUILD_CACHE_DIR}/${DOCKER_COMPOSE_RUN_SCRIPT_FOR_CI}" \
-        "\"\${@}\"" "${compose_ci_file}"
-}
-
-#######################################################################################################
-#
-# Prints detailed help for all commands and flags. Used to generate documentation added to BREEZE.rst
-# automatically.
-#
-# Used global variables:
-#    _breeze_all_commands
-#
-# Outputs:
-#   Prints detailed help for all commands to stdout.
-#
-#######################################################################################################
-function breeze::do_help_all() {
-    echo
-    breeze::print_line
-    breeze::usage
-    breeze::print_line
-    echo
-    echo
-    echo "Detailed usage"
-    echo
-    breeze::print_line
-    echo
-    local subcommand
-    # shellcheck disable=SC2154
-    for subcommand in ${_breeze_all_commands}; do
-        breeze::detailed_usage "${subcommand}"
-        breeze::print_line
-        echo
-    done
-    echo
-    breeze::flags
-}
-
-#######################################################################################################
-#
-# Parses all arguments that can be passed to Breeze command - that includes command to run and flags.
-#
-# Used global variables:
-#   _breeze_getopt_short_options
-#   _breeze_getopt_long_options
-#   _breeze_allowed_integrations
-#
-# Updated global constants:
-#      By the end of this function, all the constants from `initialization::make_constants_read_only`
-#      function are set and they are set as read-only.
-#
-#######################################################################################################
-function breeze::parse_arguments() {
-    set -u
-    local params
-    if ! params=$(getopt \
-        -o "${_breeze_getopt_short_options:=}" \
-        -l "${_breeze_getopt_long_options:=}" \
-        --name "$CMDNAME" -- "$@"); then
-        breeze::flags
-        exit 1
-    fi
-
-    eval set -- "${params}"
-    unset params
-
-    # Parse Flags.
-    # Please update short and long options in the breeze-complete script
-    # This way autocomplete will work out-of-the-box
-    while true; do
-        case "${1}" in
-        -h | --help)
-            run_help="true"
-            shift
-            ;;
-        -p | --python)
-            export PYTHON_MAJOR_MINOR_VERSION="${2}"
-            echo "Python version: ${PYTHON_MAJOR_MINOR_VERSION}"
-            echo
-            shift 2
-            ;;
-        -b | --backend)
-            export BACKEND="${2}"
-            echo "Backend: ${BACKEND}"
-            echo
-            shift 2
-            ;;
-        -i | --integration)
-            local INTEGRATION=${2}
-            parameters::check_and_save_allowed_param "INTEGRATION" "integration" "--integration"
-            echo "Integration: ${INTEGRATION}"
-            if [[ ${INTEGRATION} == "all" ]]; then
-                # shellcheck disable=SC2154
-                for INTEGRATION in ${_breeze_allowed_integrations}; do
-                    if [[ ${INTEGRATION} != "all" ]]; then
-                        echo "${INTEGRATION}"
-                        INTEGRATIONS+=("${INTEGRATION}")
-                    fi
-                done
-            else
-                INTEGRATIONS+=("${INTEGRATION}")
-            fi
-            if [[ " ${INTEGRATIONS[*]} " =~ " trino " ]]; then
-              INTEGRATIONS+=("kerberos");
-            fi
-            echo
-            shift 2
-            ;;
-        -K | --kubernetes-mode)
-            export KUBERNETES_MODE="${2}"
-            echo "Kubernetes mode: ${KUBERNETES_MODE}"
-            echo
-            shift 2
-            ;;
-        -V | --kubernetes-version)
-            export KUBERNETES_VERSION="${2}"
-            echo "Kubernetes version: ${KUBERNETES_VERSION}"
-            echo
-            shift 2
-            ;;
-        --kind-version)
-            export KIND_VERSION="${2}"
-            echo "Kind version: ${KIND_VERSION}"
-            echo
-            shift 2
-            ;;
-        --executor)
-            export EXECUTOR="${2}"
-            echo "Using ${EXECUTOR} in cluster"
-            echo
-            shift 2
-            ;;
-        --helm-version)
-            export HELM_VERSION="${2}"
-            echo "Helm version: ${HELM_VERSION}"
-            echo
-            shift 2
-            ;;
-        --postgres-version)
-            export POSTGRES_VERSION="${2}"
-            echo "Postgres version: ${POSTGRES_VERSION}"
-            echo
-            shift 2
-            ;;
-        --mysql-version)
-            export MYSQL_VERSION="${2}"
-            echo "MySQL version: ${MYSQL_VERSION}"
-            echo
-            shift 2
-            ;;
-        --mssql-version)
-            export MSSQL_VERSION="${2}"
-            echo "MSSQL version: ${MSSQL_VERSION}"
-            echo
-            shift 2
-            ;;
-        -l | --skip-mounting-local-sources)
-            MOUNT_SELECTED_LOCAL_SOURCES="false"
-            MOUNT_ALL_LOCAL_SOURCES="false"
-            echo "Mount selected local sources: ${MOUNT_SELECTED_LOCAL_SOURCES}"
-            echo "Mount all local sources: ${MOUNT_ALL_LOCAL_SOURCES}"
-            echo
-            shift
-            ;;
-        --mount-all-local-sources)
-            MOUNT_ALL_LOCAL_SOURCES="true"
-            MOUNT_SELECTED_LOCAL_SOURCES="false"
-            echo "Mount selected local sources: ${MOUNT_SELECTED_LOCAL_SOURCES}"
-            echo "Mount all local sources: ${MOUNT_ALL_LOCAL_SOURCES}"
-            echo
-            shift
-            ;;
-        -t | --install-airflow-reference)
-            INSTALL_AIRFLOW_REFERENCE="${2}"
-            # Reference is mutually exclusive with version
-            INSTALL_AIRFLOW_VERSION=""
-            # Skip mounting local sources when airflow is installed from remote
-            INSTALL_PROVIDERS_FROM_SOURCES="false"
-            echo "Installs Airflow from reference: ${INSTALL_AIRFLOW_REFERENCE}"
-            echo
-            shift 2
-            ;;
-        --use-airflow-version)
-            USE_AIRFLOW_VERSION="${2}"
-            MOUNT_SELECTED_LOCAL_SOURCES="false"
-            MOUNT_ALL_LOCAL_SOURCES="false"
-            DB_RESET="true"
-            echo "Uses Airflow at runtime from: ${USE_AIRFLOW_VERSION}, reset DB and skip mounting local sources"
-            echo
-            shift 2
-            ;;
-        --db-reset)
-            echo "Resetting the DB!"
-            echo
-            export DB_RESET="true"
-            shift
-            ;;
-        -v | --verbose)
-            export VERBOSE="true"
-            echo "Verbose output"
-            echo
-            shift
-            ;;
-        -y | --assume-yes)
-            export ANSWER="yes"
-            echo "Assuming 'yes' answer to all questions."
-            echo
-            shift
-            ;;
-        -n | --assume-no)
-            export ANSWER="no"
-            echo "Assuming 'no' answer to all questions."
-            echo
-            shift
-            ;;
-        -q | --assume-quit)
-            export ANSWER="quit"
-            echo "Assuming 'quit' answer to all questions."
-            echo
-            shift
-            ;;
-        -f | --forward-credentials)
-            echo "Forwarding credentials. Be careful as your credentials are available in the container!"
-            echo
-            export FORWARD_CREDENTIALS="true"
-            shift
-            ;;
-        -g | --github-repository)
-            echo
-            echo "Using GitHub registry."
-            echo "GitHub repository: ${2}"
-            echo
-            export GITHUB_REPOSITORY="${2}"
-            shift 2
-            ;;
-        --init-script)
-            export INIT_SCRIPT_FILE="${2}"
-            echo "The initialization file is in ${INIT_SCRIPT_FILE}"
-            echo
-            shift 2
-            ;;
-        --load-example-dags)
-            export LOAD_EXAMPLES="true"
-            echo "Include Airflow sample dags"
-            echo
-            shift
-            ;;
-        --load-default-connections)
-            export LOAD_DEFAULT_CONNECTIONS="true"
-            echo "Include Airflow default connections"
-            echo
-            shift
-            ;;
-        --preserve-volumes)
-            export PRESERVE_VOLUMES="true"
-            echo "Preserves data volumes when stopping airflow"
-            echo
-            shift
-            ;;
-        --installation-method)
-            export AIRFLOW_INSTALLATION_METHOD="${2}"
-            echo "Airflow installation method: ${AIRFLOW_INSTALLATION_METHOD}"
-            echo
-            shift 2
-            ;;
-        --test-type)
-            export TEST_TYPE="${2}"
-            echo "Selected test type: ${TEST_TYPE}"
-            echo
-            shift 2
-            ;;
-        --dry-run-docker)
-            export DRY_RUN_DOCKER="true"
-            echo "Dry run mode"
-            echo
-            shift
-            ;;
-        --)
-            shift
-            break
-            ;;
-        *)
-            breeze::flags
-            echo
-            echo  "${COLOR_RED}ERROR: Unknown flag  ${COLOR_RESET}"
-            echo
-            exit 1
-            ;;
-        esac
-    done
-    local last_subcommand=""
-    # Parse commands
-    if [[ "$#" -ne 0 ]]; then
-        case "${1}" in
-        shell)
-            last_subcommand="${1}"
-            shift
-            ;;
-        exec)
-            last_subcommand="${1}"
-            command_to_run="run_exec"
-            shift
-            ;;
-        docker-compose)
-            last_subcommand="${1}"
-            if [[ $# -lt 2 ]]; then
-                echo "You should specify docker compose command to run"
-                shift
-                run_help="true"
-            else
-                docker_compose_command="${2}"
-                shift 2
-            fi
-            command_to_run="run_docker_compose"
-            ;;
-        initialize-local-virtualenv)
-            last_subcommand="${1}"
-            echo "Initializing local virtualenv"
-            echo
-            command_to_run="perform_initialize_local_virtualenv"
-            export INSTALL_PROVIDERS_FROM_SOURCES="true"
-            shift
-            ;;
-        kind-cluster)
-            last_subcommand="${1}"
-            # Switch to production image for all kind operations
-            export PRODUCTION_IMAGE="true"
-            command_to_run="manage_kind_cluster"
-            export KIND_CLUSTER_OPERATION="${2:-}"
-            if [[ -n ${KIND_CLUSTER_OPERATION=} ]]; then
-                shift 2
-            else
-                shift
-            fi
-            ;;
-        setup-autocomplete)
-            last_subcommand="${1}"
-            echo "Setting up autocomplete"
-            echo
-            command_to_run="perform_setup_autocomplete"
-            shift
-            ;;
-        start-airflow)
-            last_subcommand="${1}"
-            export START_AIRFLOW="true"
-            shift
-            ;;
-        stop)
-            last_subcommand="${1}"
-            command_to_run="run_docker_compose"
-            docker_compose_command="down"
-            EXTRA_DC_OPTIONS+=("--remove-orphans")
-            for INTEGRATION in ${_breeze_allowed_integrations}; do
-                if [[ ${INTEGRATION} != "all" ]]; then
-                    INTEGRATIONS+=("${INTEGRATION}")
-                fi
-            done
-            # In case of tmpfs backend for docker, mssql fails because TMPFS does not support
-            # O_DIRECT parameter for direct writing to the filesystem
-            # https://github.com/microsoft/mssql-docker/issues/13
-            # so we need to mount an external volume for its db location
-            # the external db must allow for parallel testing so external volume is mapped
-            # to the data volume. Stop should also clean the volume
-            rm -rf "${MSSQL_DATA_VOLUME:?"MSSQL_DATA_VOLUME should never be empty!"}"/*
-            shift
-            ;;
-        restart)
-            last_subcommand="${1}"
-            command_to_run="run_docker_compose"
-            docker_compose_command="down"
-            EXTRA_DC_OPTIONS+=("--remove-orphans")
-            second_command_to_run="enter_breeze"
-            echo "Restarts the environment. Includes emptying the databases."
-            shift
-            ;;
-        tests)
-            last_subcommand="${1}"
-            command_to_run="run_tests"
-            shift
-            ;;
-        toggle-suppress-cheatsheet)
-            last_subcommand="${1}"
-            if [[ -f "${SUPPRESS_CHEATSHEET_FILE}" ]]; then
-                rm -f "${SUPPRESS_CHEATSHEET_FILE}"
-            else
-                touch "${SUPPRESS_CHEATSHEET_FILE}"
-            fi
-            echo "Toggle suppress cheatsheet"
-            echo
-            shift
-            command_to_run="toggle_suppress_cheatsheet"
-            ;;
-        toggle-suppress-asciiart)
-            last_subcommand="${1}"
-            if [[ -f "${SUPPRESS_ASCIIART_FILE}" ]]; then
-                rm -f "${SUPPRESS_ASCIIART_FILE}"
-            else
-                touch "${SUPPRESS_ASCIIART_FILE}"
-            fi
-            echo "Toggle suppress asciiart"
-            echo
-            shift
-            command_to_run="toggle_suppress_asciiart"
-            ;;
-        flags)
-            breeze::flags
-            exit 0
-            ;;
-        help)
-            breeze::usage
-            exit 0
-            ;;
-        help-all)
-            breeze::do_help_all
-            exit 0
-            ;;
-        *)
-            breeze::usage
-            echo
-            echo  "${COLOR_RED}ERROR: Unknown command  ${COLOR_RESET}"
-            echo
-            exit 1
-            ;;
-        esac
-    else
-        :
-        # By default, start interactive terminal
-    fi
-
-    if [[ ${run_help} == "true" ]]; then
-        if [[ ${last_subcommand} == "" ]]; then
-            breeze::usage
-            breeze::flag_footer
-        else
-            breeze::detailed_usage "${last_subcommand}"
-        fi
-        exit 0
-    fi
-
-    if [[ ${PRESERVE_VOLUMES} != "true" ]]; then
-        EXTRA_DC_OPTIONS+=("--volumes")
-    fi
-    # EXTRA_DC_OPTIONS is only used by Breeze. It's value is set here as well.
-    readonly EXTRA_DC_OPTIONS
-
-    # Also Remaining args are set here and set as read-only - no more changes to it.
-    REMAINING_ARGS+=("$@")
-    export REMAINING_ARGS
-    readonly REMAINING_ARGS
-}
-
-#######################################################################################################
-#
-# Prepares nicely formatted versions of list of allowed and default values defined in Breeze.
-# It is used in help command to print the lists in a readable format and fold the lists
-# so that they fit the screen indented_screen_width.
-#
-# Used global variables:
-#    _breeze_allowed_*
-#
-# Updated global constants:
-#       FORMATTED_* constant variables that can be used in Breeze Help output
-#
-#######################################################################################################
-function breeze::prepare_formatted_versions() {
-    if [[ -n "${_breeze_formatted_versions_prepared:-}" ]]; then
-        return
-    fi
-
-    _breeze_formatted_versions_prepared=1
-
-    local indent=15
-    local list_prefix
-    list_prefix=$(printf "%-${indent}s" " ")
-    local indented_screen_width=$((SCREEN_WIDTH - indent))
-
-    FORMATTED_PYTHON_MAJOR_MINOR_VERSIONS=$(echo "${_breeze_allowed_python_major_minor_versions=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_PYTHON_MAJOR_MINOR_VERSIONS
-
-    FORMATTED_BACKENDS=$(echo "${_breeze_allowed_backends=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_BACKENDS
-
-    FORMATTED_INTEGRATIONS=$(echo "${_breeze_allowed_integrations=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_INTEGRATIONS
-
-    FORMATTED_KUBERNETES_MODES=$(echo "${_breeze_allowed_kubernetes_modes=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_KUBERNETES_MODES
-
-    FORMATTED_KUBERNETES_VERSIONS=$(echo "${_breeze_allowed_kubernetes_versions=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_KUBERNETES_VERSIONS
-
-    FORMATTED_KIND_VERSIONS=$(echo "${_breeze_allowed_kind_versions=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_KIND_VERSIONS
-
-    FORMATTED_HELM_VERSIONS=$(echo "${_breeze_allowed_helm_versions=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_HELM_VERSIONS
-
-    FORMATTED_EXECUTORS=$(echo "${_breeze_allowed_executors=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_EXECUTORS
-
-    FORMATTED_KIND_OPERATIONS=$(echo "${_breeze_allowed_kind_operations=""}" | tr '\n' ' ' |
-        fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_KIND_OPERATIONS
-
-    FORMATTED_POSTGRES_VERSIONS=$(echo "${_breeze_allowed_postgres_versions=""}" |
-        tr '\n' ' ' | fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_POSTGRES_VERSIONS
-
-    FORMATTED_MYSQL_VERSIONS=$(echo "${_breeze_allowed_mysql_versions=""}" |
-        tr '\n' ' ' | fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_MYSQL_VERSIONS
-
-    FORMATTED_MSSQL_VERSIONS=$(echo "${_breeze_allowed_mssql_versions=""}" |
-        tr '\n' ' ' | fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_MSSQL_VERSIONS
-
-    FORMATTED_TEST_TYPES=$(echo "${_breeze_allowed_test_types=""}" |
-        fold -w "${indented_screen_width}" -s | sed "s/ /,/g; s/^/${list_prefix}/")
-    readonly FORMATTED_TEST_TYPES
-
-    FORMATTED_PACKAGE_FORMATS=$(echo "${_breeze_allowed_package_formats=""}" |
-        fold -w "${indented_screen_width}" -s | sed "s/ /,/g; s/^/${list_prefix}/")
-    readonly FORMATTED_PACKAGE_FORMATS
-
-    FORMATTED_USE_AIRFLOW_VERSION=$(echo "${_breeze_allowed_USE_AIRFLOW_VERSION=""}" |
-        tr '\n' ' ' | fold -w "${indented_screen_width}" -s | sed "s/^/${list_prefix}/")
-    readonly FORMATTED_USE_AIRFLOW_VERSION
-
-}
-
-#######################################################################################################
-#
-# Prepares usage information for all the commands in Breeze.
-# Those usage commands are stored in appropriate environment variables.
-#
-# Created constants:
-#    USAGE_*
-#    DETAILED_USAGE_*
-#
-#######################################################################################################
-
-# shellcheck disable=SC2034,SC2090,SC2089,SC2155
-
-function breeze::prepare_usage() {
-    if [[ -n "${_breeze_usage_prepared:-}" ]]; then
-        return
-    fi
-
-    _breeze_usage_prepared=1
-
-    breeze::prepare_formatted_versions
-
-    # Note that MacOS uses Bash 3.* and we cannot use associative arrays
-    export USAGE_SHELL="[Default] Enters interactive shell in the container"
-    readonly USAGE_SHELL
-    export USAGE_EXEC="Execs into running breeze container in new terminal"
-    readonly USAGE_EXEC
-    export USAGE_BUILD_DOCS="Builds documentation in the container"
-    readonly USAGE_BUILD_DOCS
-    export USAGE_DOCKER_COMPOSE="Executes specified docker-compose command"
-    readonly USAGE_DOCKER_COMPOSE
-    export USAGE_FLAGS="Shows all breeze's flags"
-    readonly USAGE_FLAGS
-    export USAGE_INITIALIZE_LOCAL_VIRTUALENV="Initializes local virtualenv"
-    readonly USAGE_INITIALIZE_LOCAL_VIRTUALENV
-    export USAGE_PUSH_IMAGE="Pushes images to registry"
-    readonly USAGE_PUSH_IMAGE
-    export USAGE_KIND_CLUSTER="Manages KinD cluster on the host"
-    readonly USAGE_KIND_CLUSTER
-    export USAGE_SETUP_AUTOCOMPLETE="Sets up autocomplete for breeze"
-    readonly USAGE_SETUP_AUTOCOMPLETE
-    export USAGE_START_AIRFLOW="Starts Scheduler and Webserver and enters the shell"
-    readonly USAGE_START_AIRFLOW
-    export USAGE_STOP="Stops the docker-compose environment"
-    readonly USAGE_STOP
-    export USAGE_RESTART="Stops the docker-compose environment including DB cleanup"
-    readonly USAGE_RESTART
-    export USAGE_TOGGLE_SUPPRESS_CHEATSHEET="Toggles on/off cheatsheet"
-    readonly USAGE_TOGGLE_SUPPRESS_CHEATSHEET
-    export USAGE_TOGGLE_SUPPRESS_ASCIIART="Toggles on/off asciiart"
-    readonly USAGE_TOGGLE_SUPPRESS_ASCIIART
-    export USAGE_TESTS="Runs selected tests in the container"
-    readonly USAGE_TESTS
-    export USAGE_HELP="Shows this help message"
-    readonly USAGE_HELP
-    export USAGE_HELP_ALL="Shows detailed help for all commands and flags"
-    readonly USAGE_HELP_ALL
-
-    export DETAILED_USAGE_SHELL="
-${CMDNAME} shell [FLAGS] [-- <EXTRA_ARGS>]
-
-      This is default subcommand if no subcommand is used.
-
-      Enters interactive shell where you can run all tests, start Airflow webserver, scheduler,
-      workers, interact with the database, run DAGs etc. It is the default command if no command
-      is selected. The shell is executed in the container and in case integrations are chosen,
-      the integrations will be started as separated docker containers - under the docker-compose
-      supervision. Local sources are by default mounted to within the container so you can edit
-      them locally and run tests immediately in the container. Several folders ('files', 'dist')
-      are also mounted so that you can exchange files between the host and container.
-
-      The 'files/airflow-breeze-config/variables.env' file can contain additional variables
-      and setup. This file is automatically sourced when you enter the container. Database
-      and webserver ports are forwarded to appropriate database/webserver so that you can
-      connect to it from your host environment.
-
-      You can also pass <EXTRA_ARGS> after -- they will be passed as bash parameters, this is
-      especially useful to pass bash options, for example -c to execute command:
-
-      '${CMDNAME} shell -- -c \"ls -la\"'
-      '${CMDNAME} -- -c \"ls -la\"'
-
-"
-    readonly DETAILED_USAGE_SHELL
-    export DETAILED_USAGE_EXEC="
-${CMDNAME} exec [-- <EXTRA_ARGS>]
-
-      Execs into interactive shell to an already running container. The container must be started
-      already by breeze shell command. If you are not familiar with tmux, this is the best
-      way to run multiple processes in the same container at the same time for example scheduler,
-      webserver, workers, database console and interactive terminal.
-"
-    export DETAILED_USAGE_DOCKER_COMPOSE="
-${CMDNAME} docker-compose [FLAGS] COMMAND [-- <EXTRA_ARGS>]
-
-      Run docker-compose command instead of entering the environment. Use 'help' as command
-      to see available commands. The <EXTRA_ARGS> passed after -- are treated
-      as additional options passed to docker-compose. For example
-
-      '${CMDNAME} docker-compose pull -- --ignore-pull-failures'
-
-Flags:
-$(breeze::flag_airflow_variants)
-$(breeze::flag_backend_variants)
-$(breeze::flag_verbosity)
-"
-    readonly DETAILED_USAGE_DOCKER_COMPOSE
-    export DETAILED_USAGE_FLAGS="
-      Explains in detail all the flags that can be used with breeze.
-"
-    readonly DETAILED_USAGE_FLAGS
-    export DETAILED_USAGE_KIND_CLUSTER="
-${CMDNAME} kind-cluster [FLAGS] OPERATION
-
-      Manages host-side Kind Kubernetes cluster that is used to run Kubernetes integration tests.
-      It allows to start/stop/restart/status the Kind Kubernetes cluster and deploy Airflow to it.
-      This enables you to run tests inside the breeze environment with latest airflow images.
-      Note that in case of deploying airflow, the first step is to rebuild the image and loading it
-      to the cluster so you can also pass appropriate build image flags that will influence
-      rebuilding the production image. Operation is one of:
-
-${FORMATTED_KIND_OPERATIONS}
-
-      The last two operations - shell and k9s allow you to perform interactive testing with
-      kubernetes tests. You can enter the shell from which you can run kubernetes tests and in
-      another terminal you can start the k9s CLI to debug kubernetes instance. It is an easy
-      way to debug the kubernetes deployments.
-
-      You can read more about k9s at https://k9scli.io/
-
-Flags:
-$(breeze::flag_airflow_variants)
-"
-    readonly DETAILED_USAGE_KIND_CLUSTER
-    export DETAILED_USAGE_SETUP_AUTOCOMPLETE="
-${CMDNAME} setup-autocomplete
-
-      Sets up autocomplete for breeze commands. Once you do it you need to re-enter the bash
-      shell and when typing breeze command <TAB> will provide autocomplete for
-      parameters and values.
-"
-    readonly DETAILED_USAGE_SETUP_AUTOCOMPLETE
-    export DETAILED_USAGE_START_AIRFLOW="
-${CMDNAME} start-airflow
-
-      Like the Shell command this will enter the interactive shell, but it will also start
-      automatically the Scheduler and the Webserver. It will leave you in a tmux session where you
-      can also observe what is happening in your Airflow.
-
-      This is a convenient way to setup a development environment. Your dags will be loaded from the
-      folder 'files/dags' on your host machine (it could take some times).
-
-      If you want to load default connections and example dags you can use the dedicated flags.
-
-Flags:
-$(breeze::flag_use_different_airflow_version)
-$(breeze::flag_start_airflow)
-"
-    readonly DETAILED_USAGE_START_AIRFLOW
-    export DETAILED_USAGE_STOP="
-${CMDNAME} stop
-
-      Brings down running docker compose environment. When you start the environment, the docker
-      containers will continue running so that startup time is shorter. But they take quite a lot of
-      memory and CPU. This command stops all running containers from the environment.
-
-Flags:
-$(breeze::flag_stop_airflow)
-"
-    readonly DETAILED_USAGE_STOP
-    export DETAILED_USAGE_RESTART="
-${CMDNAME} restart [FLAGS]
-
-      Restarts running docker compose environment. When you restart the environment, the docker
-      containers will be restarted. That includes cleaning up the databases. This is
-      especially useful if you switch between different versions of Airflow.
-
-Flags:
-$(breeze::flag_stop_airflow)
-"
-    readonly DETAILED_USAGE_RESTART
-    export DETAILED_USAGE_TESTS="
-${CMDNAME} tests [FLAGS] [TEST_TARGET ..] [-- <EXTRA_ARGS>]
-
-      Run the specified unit test target. There might be multiple
-      targets specified separated with comas. The <EXTRA_ARGS> passed after -- are treated
-      as additional options passed to pytest. You can pass 'tests' as target to
-      run all tests. For example:
-
-      '${CMDNAME} tests tests/core/test_core.py -- --logging-level=DEBUG'
-      '${CMDNAME} tests tests
-
-Flags:
-$(breeze::flag_tests)
-"
-    readonly DETAILED_USAGE_TESTS
-    export DETAILED_USAGE_TOGGLE_SUPPRESS_CHEATSHEET="
-${CMDNAME} toggle-suppress-cheatsheet
-
-      Toggles on/off cheatsheet displayed before starting bash shell.
-"
-    readonly DETAILED_USAGE_TOGGLE_SUPPRESS_CHEATSHEET
-    export DETAILED_USAGE_TOGGLE_SUPPRESS_ASCIIART="
-${CMDNAME} toggle-suppress-asciiart
-
-      Toggles on/off asciiart displayed before starting bash shell.
-"
-    readonly DETAILED_USAGE_TOGGLE_SUPPRESS_ASCIIART
-    export DETAILED_USAGE_HELP="
-${CMDNAME} help
-
-      Shows general help message for all commands.
-"
-    readonly DETAILED_USAGE_HELP
-    export DETAILED_USAGE_HELP_ALL="
-${CMDNAME} help-all
-
-      Shows detailed help for all commands and flags.
-"
-    readonly DETAILED_USAGE_HELP_ALL
-}
-
-# shellcheck enable=all
-
-#######################################################################################################
-#
-# Gets environment variable value converting the lowercase name of command into variable name
-# Arguments:
-#     prefix for the variable to add
-#     name of the variable
-# Outputs:
-#     Writes the capitalized name of the variable to stdout
-#######################################################################################################
-function breeze::get_variable_from_lowercase_name() {
-    local prefix="${1}"
-    local name="${2}"
-    local suffix
-    suffix="$(echo "${name}" | tr "[:lower:]-" "[:upper:]_")"
-    local variable_name="${prefix}_${suffix}"
-    echo "${!variable_name}"
-}
-
-#######################################################################################################
-#
-# Gets usage information from lowercase command
-# Arguments:
-#     lowercase command name
-# Outputs:
-#    usage information for the command.
-#######################################################################################################
-function breeze::get_usage() {
-    breeze::prepare_usage
-    breeze::get_variable_from_lowercase_name "USAGE" "${1}"
-}
-
-#######################################################################################################
-#
-# Gets detailed usage information from lowercase command
-# Arguments:
-#     lowercase command name
-# Outputs:
-#    Detailed usage information for the command.
-#######################################################################################################
-function breeze::get_detailed_usage() {
-    breeze::prepare_usage
-    breeze::get_variable_from_lowercase_name "DETAILED_USAGE" "${1}"
-}
-
-#######################################################################################################
-#
-# Prints general usage information for all commands.
-#
-# Globals used:
-#    CMDNAME
-#    _breeze_commands
-#    _breeze_extra_arg_commands
-#    _breeze_help_commands
-#
-# Outputs:
-#    General usage information for all commands.
-#######################################################################################################
-function breeze::usage() {
-    breeze::prepare_usage
-    echo "
-
-usage: ${CMDNAME} [FLAGS] [COMMAND] -- <EXTRA_ARGS>
-
-By default the script enters the  CI container and drops you to bash shell, but you can choose
-one of the commands to run specific actions instead.
-
-Add --help after each command to see details:
-
-Commands without arguments:
-"
-    for subcommand in ${_breeze_commands}; do
-        printf "  %-40s %s\n" "${subcommand}" "$(breeze::get_usage "${subcommand}")"
-    done
-    echo "
-Commands with arguments:
-"
-    # shellcheck disable=SC2154
-    for subcommand in ${_breeze_extra_arg_commands}; do
-        printf "  %-35s%-10s %s\n" "${subcommand}" "<ARG>" "$(breeze::get_usage "${subcommand}")"
-    done
-    echo "
-Help commands:
-"
-    # shellcheck disable=SC2154
-    for subcommand in ${_breeze_help_commands}; do
-        printf "  %-40s %s\n" "${subcommand}" "$(breeze::get_usage "${subcommand}")"
-    done
-    echo
-}
-
-#######################################################################################################
-#
-# Prints detailed usage for command specified
-#
-# Argument:
-#    Command name.
-#
-# Outputs:
-#    Detailed  usage information for the command
-#######################################################################################################
-# Prints detailed usage for command specified
-function breeze::detailed_usage() {
-    subcommand=${1}
-    echo "
-
-Detailed usage for command: ${subcommand}
-
-$(breeze::get_detailed_usage "${subcommand}")
-
-"
-}
-
-#######################################################################################################
-#
-# Prints flag footer - common to all commands..
-#
-# Outputs:
-#    Footer common for all commands.
-#######################################################################################################
-function breeze::flag_footer() {
-    echo "
-Run '${CMDNAME} flags' to see all applicable flags.
-"
-}
-
-#######################################################################################################
-#
-# Prints flags for different variants of airflow to use
-#
-# Global constants used:
-#       FORMATTED_PYTHON_MAJOR_MINOR_VERSIONS
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_airflow_variants() {
-    echo "
--p, --python PYTHON_MAJOR_MINOR_VERSION
-        Python version used for the image. This is always major/minor version.
-
-        One of:
-
-${FORMATTED_PYTHON_MAJOR_MINOR_VERSIONS}
-"
-}
-
-#######################################################################################################
-#
-# Prints flags for different backend to use
-#
-# Global constants used:
-#       FORMATTED_BACKENDS
-#       FORMATTED_POSTGRES_VERSIONS
-#       FORMATTED_MYSQL_VERSIONS
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_backend_variants() {
-    echo "
--b, --backend BACKEND
-        Backend to use for tests - it determines which database is used.
-        One of:
-
-${FORMATTED_BACKENDS}
-
-        Default: ${_breeze_default_backend:=}
-
---postgres-version POSTGRES_VERSION
-        Postgres version used. One of:
-
-${FORMATTED_POSTGRES_VERSIONS}
-
---mysql-version MYSQL_VERSION
-        MySql version used. One of:
-
-${FORMATTED_MYSQL_VERSIONS}
-
---mssql-version MSSQL_VERSION
-        MSSql version used. One of:
-
-${FORMATTED_MSSQL_VERSIONS}
-
-"
-}
-
-#######################################################################################################
-#
-# Prints production image flags
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_production_image() {
-    echo "
--I, --production-image
-        Use production image for entering the environment and builds (not for tests).
-"
-}
-
-#######################################################################################################
-#
-# Prints additional breeze action flags
-#
-# Global constants used:
-#       FORMATTED_INTEGRATIONS
-#
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_breeze_actions() {
-    echo "
--d, --db-reset
-        Resets the database at entry to the environment. It will drop all the tables
-        and data and recreate the DB from scratch even if 'restart' command was not used.
-        Combined with 'restart' command it enters the environment in the state that is
-        ready to start Airflow webserver/scheduler/worker. Without the switch, the database
-        does not have any tables and you need to run reset db manually.
-
--i, --integration INTEGRATION
-        Integration to start during tests - it determines which integrations are started
-        for integration tests. There can be more than one integration started, or all to
-        start all integrations. Selected integrations are not saved for future execution.
-        One of:
-
-${FORMATTED_INTEGRATIONS}
-
---init-script INIT_SCRIPT_FILE
-        Initialization script name - Sourced from files/airflow-breeze-config. Default value
-        init.sh. It will be executed after the environment is configured and started.
-
-"
-}
-
-#######################################################################################################
-#
-# Prints Kubernetes action flags
-#
-# Global constants used:
-#       FORMATTED_KUBERNETES_MODE
-#       FORMATTED_KUBERNETES_VERSIONS
-#       FORMATTED_KIND_VERSIONS
-#       FORMATTED_HELM_VERSIONS
-#       FORMATTED_EXECUTORS
-#
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_kubernetes_configuration() {
-    echo "
-Configuration for the KinD Kubernetes cluster and tests:
-
--K, --kubernetes-mode KUBERNETES_MODE
-        Kubernetes mode - only used in case one of kind-cluster commands is used.
-        One of:
-
-${FORMATTED_KUBERNETES_MODES}
-
-        Default: ${_breeze_default_kubernetes_mode:=}
-
--V, --kubernetes-version KUBERNETES_VERSION
-        Kubernetes version - only used in case one of kind-cluster commands is used.
-        One of:
-
-${FORMATTED_KUBERNETES_VERSIONS}
-
-        Default: ${_breeze_default_kubernetes_version:=}
-
---kind-version KIND_VERSION
-        Kind version - only used in case one of kind-cluster commands is used.
-        One of:
-
-${FORMATTED_KIND_VERSIONS}
-
-        Default: ${_breeze_default_kind_version:=}
-
---helm-version HELM_VERSION
-        Helm version - only used in case one of kind-cluster commands is used.
-        One of:
-
-${FORMATTED_HELM_VERSIONS}
-
-        Default: ${_breeze_default_helm_version:=}
-
---executor EXECUTOR
-        Executor to use in a kubernetes cluster.
-        One of:
-
-${FORMATTED_EXECUTORS}
-
-        Default: ${_breeze_default_executor:=}
-
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that determine what is the source mounting scheme
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_local_file_mounting() {
-    echo "
--l, --skip-mounting-local-sources
-        Skips mounting local volume with sources - you get exactly what is in the
-        docker image rather than your current local sources of Airflow.
-
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that allow to use different airflow variants
-#
-# Global constants used:
-#       FORMATTED_INSTALL_AIRFLOW_VERSIONS
-#
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_use_different_airflow_version() {
-    echo "
---use-airflow-version AIRFLOW_SPECIFICATION
-        In CI image, installs Airflow at runtime from PIP released version or using
-        the installation method specified (sdist, wheel, none). When 'none' is used,
-        airflow is just removed. In this case airflow package should be added to dist folder
-        and --use-packages-from-dist flag should be used.
-
-${FORMATTED_USE_AIRFLOW_VERSION}
-
---use-packages-from-dist
-        In CI image, if specified it will look for packages placed in dist folder and
-        it will install the packages after entering the image.
-        This is useful for testing provider packages.
-
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that allow to set assumed answers to questions
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_assume_answers_to_questions() {
-    echo "
--y, --assume-yes
-        Assume 'yes' answer to all questions.
-
--n, --assume-no
-        Assume 'no' answer to all questions.
-
--q, --assume-quit
-        Assume 'quit' answer to all questions.
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that are used for credential forwarding
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_credentials() {
-    echo "
--f, --forward-credentials
-        Forwards host credentials to docker container. Use with care as it will make
-        your credentials available to everything you install in Docker.
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that control package preparation
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_packages() {
-    echo "
---package-format PACKAGE_FORMAT
-
-        Chooses format of packages to prepare.
-
-        One of:
-
-${FORMATTED_PACKAGE_FORMATS}
-
-        Default: ${_breeze_default_package_format:=}
-
-"
-}
-
-#######################################################################################################
-#
-# Prints flags that control verbosity
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_verbosity() {
-    echo "
--v, --verbose
-        Show verbose information about executed docker, kind, kubectl, helm commands. Useful for
-        debugging - when you run breeze with --verbose flags you will be able to see the commands
-        executed under the hood and copy&paste them to your terminal to debug them more easily.
-
-        Note that you can further increase verbosity and see all the commands executed by breeze
-        by running 'export VERBOSE_COMMANDS=\"true\"' before running breeze.
-
---dry-run-docker
-        Only show docker commands to execute instead of actually executing them. The docker
-        commands are printed in yellow color.
-
-"
-}
-
-#######################################################################################################
-#
-# Prints information about help flag
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_help() {
-    echo "
--h, --help
-        Shows detailed help message for the command specified.
-"
-}
-
-#####################################################################################################
-#
-# Prints flags that control how Airflow should be populated with the command start-airflow
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_start_airflow() {
-    echo "
---load-example-dags
-        Include Airflow example dags.
-
---load-default-connections
-        Include Airflow Default Connections.
-"
-}
-
-#####################################################################################################
-#
-# Prints flags that control how Airflow should be populated with the command stop-airflow
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_stop_airflow() {
-    echo "
---preserve-volumes
-        Use this flag if you would like to preserve data volumes from the databases used
-        by the integrations. By default, those volumes are deleted, so when you run 'stop'
-        or 'restart' commands you start from scratch, but by using this flag you can
-        preserve them. If you want to delete those volumes after stopping Breeze, just
-        run the 'breeze stop' again without this flag.
-"
-}
-
-
-#####################################################################################################
-#
-# Prints flags that control tests
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flag_tests() {
-    echo "
---test-type TEST_TYPE
-        Type of the test to run. One of:
-
-${FORMATTED_TEST_TYPES}
-
-        Default: ${_breeze_default_test_type:=}
-
-"
-}
-
-#######################################################################################################
-#
-# Prints all flags
-#
-# Outputs:
-#    Flag information.
-#######################################################################################################
-function breeze::flags() {
-    breeze::prepare_formatted_versions
-
-    echo "
-$(breeze::print_line)
-
-Summary of all flags supported by Breeze:
-
-$(breeze::print_star_line)
- Choose Airflow variant
-$(breeze::flag_airflow_variants)
-
-$(breeze::print_star_line)
- Choose backend to run for Airflow
-$(breeze::flag_backend_variants)
-
-$(breeze::print_star_line)
- Enable production image
-$(breeze::flag_production_image)
-
-$(breeze::print_star_line)
- Additional actions executed while entering breeze
-$(breeze::flag_breeze_actions)
-
-$(breeze::print_star_line)
- Additional actions executed while starting Airflow
-$(breeze::flag_start_airflow)
-
-$(breeze::print_star_line)
- Cleanup options when stopping Airflow
-$(breeze::flag_stop_airflow)
-
-$(breeze::print_star_line)
- Kind kubernetes and Kubernetes tests configuration(optional)
-$(breeze::flag_kubernetes_configuration)
-
-$(breeze::print_star_line)
- Manage mounting local files
-$(breeze::flag_local_file_mounting)
-
-$(breeze::print_star_line)
- Assume answers to questions
-$(breeze::flag_assume_answers_to_questions)
-
-$(breeze::print_star_line)
- Use different Airflow version at runtime in CI image
-$(breeze::flag_use_different_airflow_version)
-
-$(breeze::print_star_line)
- Credentials
-$(breeze::flag_credentials)
-
-$(breeze::print_star_line)
- Flags for running tests
-$(breeze::flag_tests)
-
-$(breeze::print_star_line)
- Increase verbosity of the scripts
-$(breeze::flag_verbosity)
-
-$(breeze::print_star_line)
- Print detailed help message
-$(breeze::flag_help)
-"
-}
-
-#######################################################################################################
-#
-# Prints header line filling screen indented_screen_width - only when VERBOSE is set
-#
-# Outputs:
-#    Prints header line.
-#######################################################################################################
-function breeze::print_header_line() {
-    if [ ${VERBOSE:="false"} == "true" ]; then
-        echo
-        printf '=%.0s' $(seq "${SCREEN_WIDTH}")
-        echo
-    fi
-}
-
-#######################################################################################################
-#
-# Prints separation line filling screen indented_screen_width
-#
-# Outputs:
-#    Prints line.
-#######################################################################################################
-function breeze::print_line() {
-    printf '#%.0s' $(seq "${SCREEN_WIDTH}")
-}
-
-# Prints star line filling screen indented_screen_width
-function breeze::print_star_line() {
-    printf '*%.0s' $(seq "${SCREEN_WIDTH}")
-}
-
-#######################################################################################################
-#
-# Reads saved environment variables. Some of the variables are stored across session so that once
-# you use them you do not have to use it next time. That makes those flags persistent.
-#
-# An example of it is `--backend` or '--kubernetes-mode' flags.
-#
-# Note that PYTHON_MAJOR_MINOR_VERSION is not read here - it is read at the
-# `setup_default_breeze_variables` method because it is needed
-# to determine the right images to use and set several variables that depend on the Python version
-#
-# Uses:
-#   _breeze_default_* corresponding defaults for variables it reads
-#
-# Modified and used global constants:
-#
-#   BACKEND
-#   KUBERNETES_MODE
-#   KUBERNETES_VERSION
-#   KIND_VERSION
-#   HELM_VERSION
-#   EXECUTOR
-#   POSTGRES_VERSION
-#   MYSQL_VERSION
-#
-#######################################################################################################
-
-function breeze::read_saved_environment_variables() {
-    BACKEND="${BACKEND:=$(parameters::read_from_file BACKEND)}"
-    BACKEND=${BACKEND:-${_breeze_default_backend}}
-
-    KUBERNETES_MODE="${KUBERNETES_MODE:=$(parameters::read_from_file KUBERNETES_MODE)}"
-    KUBERNETES_MODE=${KUBERNETES_MODE:=${_breeze_default_kubernetes_mode}}
-
-    KUBERNETES_VERSION="${KUBERNETES_VERSION:=$(parameters::read_from_file KUBERNETES_VERSION)}"
-    KUBERNETES_VERSION=${KUBERNETES_VERSION:=${_breeze_default_kubernetes_version}}
-
-    KIND_VERSION="${KIND_VERSION:=$(parameters::read_from_file KIND_VERSION)}"
-    KIND_VERSION=${KIND_VERSION:=${_breeze_default_kind_version}}
-
-    HELM_VERSION="${HELM_VERSION:=$(parameters::read_from_file HELM_VERSION)}"
-    HELM_VERSION=${HELM_VERSION:=${_breeze_default_helm_version}}
-
-    EXECUTOR="${EXECUTOR:=$(parameters::read_from_file EXECUTOR)}"
-    EXECUTOR=${EXECUTOR:-${_breeze_default_executor}}
-
-    POSTGRES_VERSION="${POSTGRES_VERSION:=$(parameters::read_from_file POSTGRES_VERSION)}"
-    POSTGRES_VERSION=${POSTGRES_VERSION:=${_breeze_default_postgres_version}}
-
-    MYSQL_VERSION="${MYSQL_VERSION:=$(parameters::read_from_file MYSQL_VERSION)}"
-    MYSQL_VERSION=${MYSQL_VERSION:=${_breeze_default_mysql_version}}
-
-    MSSQL_VERSION="${MSSQL_VERSION:=$(parameters::read_from_file MSSQL_VERSION)}"
-    MSSQL_VERSION=${MSSQL_VERSION:=${_breeze_default_mssql_version}}
-}
-
-#######################################################################################################
-#
-# Checks if variables are correctly set and if they are - saves them so that they can be used across
-# sessions.
-#
-# In case the variables are matching expected values they are saved in ".build/VARIABLE_NAME" for
-# later reuse. If not, error is printed and the saved file is cleaned, so that next time
-# default value can be used.
-#
-# Used Global constants:
-#     INSTALL_AIRFLOW_REFERENCE
-#     INSTALL_AIRFLOW_VERSION
-#     BACKEND
-#     KUBERNETES_MODE
-#     KUBERNETES_VERSION
-#     KIND_VERSION
-#     HELM_VERSION
-#     EXECUTOR
-#     POSTGRES_VERSION
-#     MYSQL_VERSION
-#     MSSQL_VERSION
-#
-# Updated Global constants:
-#      BRANCH_NAME
-#
-# Output: saved variable files in .build,
-#######################################################################################################
-function breeze::check_and_save_all_params() {
-    parameters::check_and_save_allowed_param "PYTHON_MAJOR_MINOR_VERSION" "Python version" "--python"
-    # TODO: Generalize me (make it automatically use matching versions)
-    if [[ -n "${INSTALL_AIRFLOW_REFERENCE=}" ]]; then
-        if [[ ${INSTALL_AIRFLOW_REFERENCE=} == *2_0* ]]; then
-            export BRANCH_NAME="v2-0-test"
-        elif [[ ${INSTALL_AIRFLOW_REFERENCE=} == *2_1* ]]; then
-            export BRANCH_NAME="v2-1-test"
-        elif [[ ${INSTALL_AIRFLOW_REFERENCE=} == *2_2* ]]; then
-            export BRANCH_NAME="v2-2-test"
-        fi
-    elif [[ -n "${INSTALL_AIRFLOW_VERSION=}" ]]; then
-        if [[ ${INSTALL_AIRFLOW_VERSION=} == *2.0* ]]; then
-            export BRANCH_NAME="v2-0-test"
-        elif [[ ${INSTALL_AIRFLOW_VERSION=} == *2.1* ]]; then
-            export BRANCH_NAME="v2-1-test"
-        elif [[ ${INSTALL_AIRFLOW_VERSION=} == *2.2* ]]; then
-            export BRANCH_NAME="v2-2-test"
-        fi
-    fi
-
-    parameters::check_and_save_allowed_param "BACKEND" "backend" "--backend"
-    parameters::check_and_save_allowed_param "KUBERNETES_MODE" "Kubernetes mode" "--kubernetes-mode"
-    parameters::check_and_save_allowed_param "KUBERNETES_VERSION" "Kubernetes version" "--kubernetes-version"
-    parameters::check_and_save_allowed_param "KIND_VERSION" "KinD version" "--kind-version"
-    parameters::check_and_save_allowed_param "HELM_VERSION" "Helm version" "--helm-version"
-    parameters::check_and_save_allowed_param "EXECUTOR" "Executors" "--executor"
-    parameters::check_and_save_allowed_param "POSTGRES_VERSION" "Postgres version" "--postgres-version"
-    parameters::check_and_save_allowed_param "MYSQL_VERSION" "Mysql version" "--mysql-version"
-    parameters::check_and_save_allowed_param "MSSQL_VERSION" "MSSql version" "--mssql-version"
-
-    parameters::check_allowed_param TEST_TYPE "Type of tests" "--test-type"
-}
-
-#######################################################################################################
-#
-# Prints cheatsheet if it is not suppressed
-#
-# Used global constants:
-#
-#     AIRFLOW_SOURCES
-#     SSH_PORT
-#     WEBSERVER_HOST_PORT
-#     POSTGRES_HOST_PORT
-#     MYSQL_HOST_PORT
-#     MSSQL_HOST_PORT
-#
-#######################################################################################################
-function breeze::print_cheatsheet() {
-    if [[ ! -f ${SUPPRESS_CHEATSHEET_FILE} && ${command_to_run} == "enter_breeze" ]]; then
-
-        echo
-        breeze::print_line
-        echo
-        echo "                                  Airflow Breeze CHEATSHEET"
-        echo
-        set +e
-        if ! command -v breeze; then
-            breeze::print_line
-            echo
-            echo " Adding breeze to your path:"
-            echo "    When you exit the environment, you can add sources of Airflow to the path - you can"
-            echo "    run breeze or the scripts above from any directory by calling 'breeze' commands directly"
-            echo
-            echo "     export PATH=\${PATH}:\"${AIRFLOW_SOURCES}\""
-            echo
-        fi
-        set -e
-        breeze::print_line
-
-        echo
-        echo " Port forwarding:"
-        echo
-        echo "   Ports are forwarded to the running docker containers for webserver and database"
-        echo "     * ${SSH_PORT} -> forwarded to Airflow ssh server -> airflow:22"
-        echo "     * ${WEBSERVER_HOST_PORT} -> forwarded to Airflow webserver -> airflow:8080"
-        echo "     * ${FLOWER_HOST_PORT} -> forwarded to Flower dashboard -> airflow:5555"
-        echo "     * ${POSTGRES_HOST_PORT} -> forwarded to Postgres database -> postgres:5432"
-        echo "     * ${MYSQL_HOST_PORT} -> forwarded to MySQL database  -> mysql:3306"
-        echo "     * ${MSSQL_HOST_PORT} -> forwarded to MSSQL database  -> mssql:1443"
-        echo "     * ${REDIS_HOST_PORT} -> forwarded to Redis broker -> redis:6379"
-        echo
-        echo "   Here are links to those services that you can use on host:"
-        echo "     * ssh connection for remote debugging: ssh -p ${SSH_PORT} airflow@127.0.0.1 pw: airflow"
-        echo "     * Webserver: http://127.0.0.1:${WEBSERVER_HOST_PORT}"
-        echo "     * Flower:    http://127.0.0.1:${FLOWER_HOST_PORT}"
-        echo "     * Postgres:  jdbc:postgresql://127.0.0.1:${POSTGRES_HOST_PORT}/airflow?user=postgres&password=airflow"
-        echo "     * Mysql:     jdbc:mysql://127.0.0.1:${MYSQL_HOST_PORT}/airflow?user=root"
-        echo "     * MSSQL:     jdbc:sqlserver://127.0.0.1:${MSSQL_HOST_PORT};databaseName=airflow;user=sa;password=Airflow123"
-        echo "     * Redis:     redis://127.0.0.1:${REDIS_HOST_PORT}/0"
-    else
-        echo
-    fi
-}
-
-#######################################################################################################
-#
-# Prints setup instruction in case we find that autocomplete is not set
-# also prints how to toggle asciiart/cheatsheet
-#
-# Used global constants:
-#     CMDNAME
-#######################################################################################################
-function breeze::print_setup_instructions() {
-    if [[ ${command_to_run} == "enter_breeze" ]]; then
-        # shellcheck disable=SC2034  # Unused variables left for comp_breeze usage
-        if ! typeset -f "_comp_breeze" >/dev/null; then
-            breeze::print_line
-            echo
-            echo "  You can setup autocomplete by running '${CMDNAME} setup-autocomplete'"
-            echo
-            echo
-        fi
-        breeze::print_line
-        echo
-        echo "  You can toggle ascii/cheatsheet by running:"
-        echo "      * ${CMDNAME} toggle-suppress-cheatsheet"
-        echo "      * ${CMDNAME} toggle-suppress-asciiart"
-        echo
-        breeze::print_line
-        echo
-        echo
-        echo
-        echo
-    fi
-}
-
-#######################################################################################################
-#
-# Runs Build before a command if needed - the right build command will be determined and used
-# depending on which command you are trying ton
-#
-# Used global constants:
-#   PRODUCTION_IMAGE
-#   KIND_CLUSTER_OPERATION
-#   FORMATTED_KIND_OPERATIONS
-#
-# Used variables:
-#   command_to_run
-#
-#######################################################################################################
-function breeze::run_build_command() {
-    case "${command_to_run}" in
-    run_tests | run_docker_compose)
-        ;;
-    enter_breeze)
-        ;;
-    build_docs )
-        ;;
-    perform_initialize_local_virtualenv | perform_setup_autocomplete | \
-        toggle_suppress_cheatsheet | toggle_suppress_asciiart )
-        ;;
-    manage_kind_cluster)
-        if [[ ${KIND_CLUSTER_OPERATION} == "start" ]]; then
-            echo "Starts KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "stop" ]]; then
-            echo "Stops KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "restart" ]]; then
-            echo "Restarts KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "recreate" ]]; then
-            echo "Recreates KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "status" ]]; then
-            echo "Checks status of KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "deploy" ]]; then
-            echo "Deploys Airflow to KinD cluster"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "test" ]]; then
-            echo "Run Kubernetes tests with the KinD cluster "
-        elif [[ ${KIND_CLUSTER_OPERATION} == "shell" ]]; then
-            echo "Enter an interactive shell for kubernetes testing"
-        elif [[ ${KIND_CLUSTER_OPERATION} == "k9s" ]]; then
-            echo "Run k9s cli to debug in style"
-        elif [[ -z ${KIND_CLUSTER_OPERATION=} ]]; then
-            echo
-            echo "Please provide an operation to run"
-            echo
-            echo "Should be one of:"
-            echo "${FORMATTED_KIND_OPERATIONS}"
-            echo
-            exit 1
-        else
-            echo
-            echo "ERROR: Unknown Kind Kubernetes cluster operation: '${KIND_CLUSTER_OPERATION}'"
-            echo
-            echo "Should be one of:"
-            echo "${FORMATTED_KIND_OPERATIONS}"
-            echo
-            exit 1
-        fi
-        ;;
-    *)
-        echo
-        echo  "${COLOR_RED}ERROR: Unknown command to run ${command_to_run}  ${COLOR_RESET}"
-        echo
-        exit 1
-        ;;
-    esac
-}
-
-# executes command
-function breeze::run_command() {
-    "${@}"
-}
-
-
-# print command instead of executing
-function breeze::print_command() {
-    echo
-    echo "${COLOR_YELLOW}" "${@}" "${COLOR_RESET}"
-    echo
-}
-
-
-#######################################################################################################
-#
-# Runs the actual command - depending on the command chosen it will use the right
-# Convenient script and run the right command for the script.
-#
-# Used variables:
-#   command_to_run
-#
-# Used global constants:
-#     PRODUCTION_IMAGE
-#     SCRIPTS_CI_DIR
-#     BUILD_CACHE_DIR
-#     KIND_CLUSTER_OPERATION
-#     EXTRA_DC_OPTIONS
-#
-# Set Global variables:
-#     RUN_TESTS
-#######################################################################################################
-function breeze::run_breeze_command() {
-    set +u
-    local dc_run_file
-    local run_command="breeze::run_command"
-    if [[ ${DRY_RUN_DOCKER=} != "false" ]]; then
-        run_command="breeze::print_command"
-    fi
-    if [[ ${PRODUCTION_IMAGE} == "true" ]]; then
-        dc_run_file="${BUILD_CACHE_DIR}/${DOCKER_COMPOSE_RUN_SCRIPT_FOR_PROD}"
-    else
-        dc_run_file="${BUILD_CACHE_DIR}/${DOCKER_COMPOSE_RUN_SCRIPT_FOR_CI}"
-    fi
-
-    case "${command_to_run}" in
-    enter_breeze)
-        docker_engine_resources::check_all_resources
-        if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
-            if [[ ${BACKEND} == "mysql" || ${BACKEND} == "mssql" ]]; then
-                echo "${COLOR_RED}MacOS with ARM processor is not supported for ${BACKEND} backend. Exiting.${COLOR_RESET}"
-                exit 1
-            fi
-        fi
-        if [[ ${PRODUCTION_IMAGE} == "true" ]]; then
-            echo "${COLOR_RED}ERROR: Entering production image via breeze is not supported${COLOR_RESET}"
-            echo
-            echo "Please run ${COLOR_BLUE}docker run -it apache/airflow:latest bash${COLOR_RESET} instead"
-            echo
-            echo "See https://airflow.apache.org/docs/docker-stack/entrypoint.html#executing-commands for details"
-            exit 1
-        else
-            ${run_command} "${dc_run_file}" run --service-ports --rm airflow "${@}"
-        fi
-        ;;
-    run_exec)
-        docker_engine_resources::check_all_resources
-        # Unfortunately `docker-compose exec` does not support exec'ing into containers started with run :(
-        # so we have to find it manually
-        set +e
-        local airflow_testing_container
-        airflow_testing_container=$("${dc_run_file}" ps | grep airflow | awk '{print $1}' 2>/dev/null)
-        : "${airflow_testing_container:?"ERROR! Breeze must be running in order to exec into running container"}"
-        set -e
-        docker exec -it "${airflow_testing_container}" \
-            "/opt/airflow/scripts/docker/entrypoint_exec.sh" "${@}"
-        ;;
-    run_tests)
-        docker_engine_resources::check_all_resources
-        export RUN_TESTS="true"
-        readonly RUN_TESTS
-        export ENABLED_INTEGRATIONS="${INTEGRATIONS[*]}"
-        export LIST_OF_INTEGRATION_TESTS_TO_RUN="${INTEGRATIONS[*]}"
-        ${run_command} "${BUILD_CACHE_DIR}/${DOCKER_COMPOSE_RUN_SCRIPT_FOR_CI}" run --service-ports --rm airflow "$@"
-        ;;
-    run_docker_compose)
-        docker_engine_resources::check_all_resources
-        set +u
-        ${run_command} "${dc_run_file}" "${docker_compose_command}" "${EXTRA_DC_OPTIONS[@]}" "$@"
-        set -u
-        ;;
-    perform_initialize_local_virtualenv)
-        breeze::initialize_virtualenv
-        ;;
-    perform_setup_autocomplete)
-        breeze::setup_autocomplete
-        ;;
-    manage_kind_cluster)
-        docker_engine_resources::check_all_resources
-        kind::make_sure_kubernetes_tools_are_installed
-        kind::get_kind_cluster_name
-        kind::perform_kind_cluster_operation "${KIND_CLUSTER_OPERATION}"
-        ;;
-    build_docs)
-        docker_engine_resources::check_all_resources
-        runs::run_docs "${@}"
-        ;;
-    toggle_suppress_cheatsheet)
-        if [[ -f "${SUPPRESS_CHEATSHEET_FILE}" ]]; then
-            echo
-            echo "Cheatsheet disabled"
-            echo
-        else
-            echo
-            echo "Cheatsheet enabled"
-            echo
-        fi
-        ;;
-    toggle_suppress_asciiart)
-        if [[ -f "${SUPPRESS_ASCIIART_FILE}" ]]; then
-            echo
-            echo "ASCIIart disabled"
-            echo
-        else
-            echo
-            echo "ASCIIart enabled"
-            echo
-        fi
-        ;;
-    *)
-        echo
-        echo  "${COLOR_RED}ERROR: Unknown command to run ${command_to_run}  ${COLOR_RESET}"
-        echo
-        ;;
-    esac
-    set -u
-}
-
-#######################################################################################################
-#
-# We have different versions of images depending on the python version used. We keep up with the
-# Latest patch-level changes in Python (this is done automatically during CI test runs) so we have
-# To only take into account MAJOR and MINOR version of python. This variable keeps the major/minor
-# version of python in X.Y format (3.7, 3.8, 3.9, 3.10).
-#
-# In Breeze the precedence of setting the version is as follows:
-#      1. --python flag (if set, it will explicitly override it in the next step)
-#      2. PYTHON_MAJOR_MINOR_VERSION exported from outside
-#      3. last used version stored in ./build/PYTHON_MAJOR_MINOR_VERSION
-#      4. DEFAULT_PYTHON_MAJOR_MINOR_VERSION from scripts/ci/libraries/_initialization.sh
-#
-# Here points 2. and 3. are realized. If result is empty string , the 4. will be set in
-#      the next step (sanity_checks::basic_sanity_checks() is called and the version is still not set by then)
-#      finally, if  --python flag is specified, it will override whatever is set above.
-#
-# We need to run after initialization::initialize_common_environment (so that parameters::read_from_file function is present)
-# But before we set the default value for Python
-#
-# Used and modified global constants:
-#     PYTHON_MAJOR_MINOR_VERSION
-#######################################################################################################
-function breeze::determine_python_version_to_use_in_breeze() {
-    PYTHON_MAJOR_MINOR_VERSION="${PYTHON_MAJOR_MINOR_VERSION:=$(parameters::read_from_file PYTHON_MAJOR_MINOR_VERSION)}"
-    export PYTHON_MAJOR_MINOR_VERSION
-}
-
-breeze::setup_default_breeze_constants
-
-initialization::create_directories
-
-breeze::read_saved_environment_variables
-
-initialization::initialize_common_environment
-
-initialization::check_docker_version
-
-initialization::get_environment_for_builds_on_ci
-
-breeze::determine_python_version_to_use_in_breeze
-
-initialization::get_docker_cache_image_names
-
-sanity_checks::basic_sanity_checks
-
-start_end::script_start
-
-traps::add_trap start_end::script_end EXIT
-
-set +u
-breeze::parse_arguments "${@}"
-
-breeze::print_header_line
-
-breeze::check_and_save_all_params
-
-initialization::make_constants_read_only
-
-breeze::prepare_command_files
-
-breeze::run_build_command
-
-breeze::print_header_line
-
-breeze::print_badge
-
-breeze::print_cheatsheet
-
-breeze::print_setup_instructions
-
-set +u # Account for an empty array
-breeze::run_breeze_command "${REMAINING_ARGS[@]}"
-
-set +u # Account for an empty array
-if [[ -n ${second_command_to_run} ]]; then
-    command_to_run=${second_command_to_run}
-    breeze::run_breeze_command "${REMAINING_ARGS[@]}"
-fi
diff --git a/dev/airflow-github b/dev/airflow-github
index 5546460c32..57cba09ddc 100755
--- a/dev/airflow-github
+++ b/dev/airflow-github
@@ -135,10 +135,6 @@ def is_core_commit(files: List[str]) -> bool:
         "STATIC_CODE_CHECKS.rst",
         "images/",
         "TESTING.rst",
-        # dev/release/testing
-        "breeze",
-        "breeze-legacy",
-        "breeze-complete",
         "codecov.yml",
         "pytest.ini",
         "kubernetes_tests/",
diff --git a/dev/breeze/src/airflow_breeze/breeze.py b/dev/breeze/src/airflow_breeze/breeze.py
index c58567044f..488663cda9 100755
--- a/dev/breeze/src/airflow_breeze/breeze.py
+++ b/dev/breeze/src/airflow_breeze/breeze.py
@@ -28,12 +28,14 @@ create_directories_and_files()
 from airflow_breeze.commands import developer_commands  # noqa
 from airflow_breeze.commands.ci_commands import ci_group  # noqa
 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.setup_commands import setup  # noqa
 from airflow_breeze.commands.testing_commands import testing  # noqa
 
 main.add_command(testing)
+main.add_command(kubernetes_group)
 main.add_command(ci_group)
 main.add_command(ci_image)
 main.add_command(prod_image)
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
new file mode 100644
index 0000000000..488be2548b
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -0,0 +1,1467 @@
+# 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.
+import os
+import re
+import shutil
+import sys
+import tempfile
+from pathlib import Path
+from shlex import quote
+from typing import List, Optional, Tuple
+
+import click
+
+from airflow_breeze.commands.production_image_commands import run_build_production_image
+from airflow_breeze.global_constants import ALLOWED_EXECUTORS, ALLOWED_KUBERNETES_VERSIONS
+from airflow_breeze.params.build_prod_params import BuildProdParams
+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_dry_run,
+    option_include_success_outputs,
+    option_parallelism,
+    option_python,
+    option_python_versions,
+    option_run_in_parallel,
+    option_verbose,
+)
+from airflow_breeze.utils.console import Output, get_console
+from airflow_breeze.utils.custom_param_types import CacheableChoice, CacheableDefault
+from airflow_breeze.utils.kubernetes_utils import (
+    CHART_PATH,
+    K8S_CLUSTERS_PATH,
+    SCRIPTS_CI_KUBERNETES_PATH,
+    create_virtualenv,
+    get_config_folder,
+    get_k8s_env,
+    get_kind_cluster_config_path,
+    get_kind_cluster_name,
+    get_kubeconfig_file,
+    get_kubectl_cluster_name,
+    get_kubernetes_python_combos,
+    make_sure_kubernetes_tools_are_installed,
+    print_cluster_urls,
+    run_command_with_k8s_env,
+    set_random_cluster_ports,
+)
+from airflow_breeze.utils.parallel import (
+    DockerBuildxProgressMatcher,
+    GenericRegexpProgressMatcher,
+    check_async_run_results,
+    run_with_pool,
+)
+from airflow_breeze.utils.run_utils import RunCommandResult, check_if_image_exists, run_command
+
+
+@click.group(cls=BreezeGroup, name='k8s', help='Tools that developers use to run Kubernetes tests')
+def kubernetes_group():
+    pass
+
+
+option_executor = click.option(
+    '--executor',
+    help='Executor to use for a kubernetes cluster.',
+    type=CacheableChoice(ALLOWED_EXECUTORS),
+    show_default=True,
+    default=CacheableDefault(ALLOWED_EXECUTORS[0]),
+    envvar='EXECUTOR',
+)
+
+option_kubernetes_version = click.option(
+    '--kubernetes-version',
+    help='Kubernetes version used to create the KinD cluster of.',
+    type=CacheableChoice(ALLOWED_KUBERNETES_VERSIONS),
+    show_default=True,
+    default=CacheableDefault(ALLOWED_KUBERNETES_VERSIONS[0]),
+    envvar='KUBERNETES_VERSION',
+)
+
+option_image_tag = click.option(
+    '-t',
+    '--image-tag',
+    help='Image tag used to build K8S image from',
+    default='latest',
+    show_default=True,
+    envvar='IMAGE_TAG',
+)
+
+option_wait_time_in_seconds = click.option(
+    '--wait-time-in-seconds',
+    help="Wait for Airflow webserver for specified number of seconds.",
+    type=click.IntRange(0),
+    default=120,
+    envvar='WAIT_TIME_IN_SECONDS',
+)
+
+option_wait_time_in_seconds_0_default = click.option(
+    '--wait-time-in-seconds',
+    help="Wait for Airflow webserver for specified number of seconds.",
+    type=click.IntRange(0),
+    default=0,
+    envvar='WAIT_TIME_IN_SECONDS',
+)
+
+
+option_force_venv_setup = click.option(
+    '--force-venv-setup',
+    help="Force recreation of the virtualenv.",
+    is_flag=True,
+    envvar='FORCE_VENV_SETUP',
+)
+
+option_rebuild_base_image = click.option(
+    '--rebuild-base-image',
+    help="Rebuilds base Airflow image before building K8S image.",
+    is_flag=True,
+    envvar='REBUILD_BASE_IMAGE',
+)
+
+option_kubernetes_versions = click.option(
+    '--kubernetes-versions',
+    help='Kubernetes versions used to run in parallel (space separated).',
+    type=str,
+    show_default=True,
+    default=" ".join(ALLOWED_KUBERNETES_VERSIONS),
+    envvar='KUBERNETES_VERSIONS',
+)
+
+option_all = click.option('--all', help="Apply it to all created clusters", is_flag=True, envvar="ALL")
+
+K8S_CLUSTER_CREATE_PROGRESS_REGEXP = r'.*airflow-python-[0-9.]+-v[0-9.].*|.*Connecting to localhost.*'
+K8S_UPLOAD_PROGRESS_REGEXP = r'.*airflow-python-[0-9.]+-v[0-9.].*'
+K8S_CONFIGURE_CLUSTER_PROGRESS_REGEXP = r'.*airflow-python-[0-9.]+-v[0-9.].*'
+K8S_DEPLOY_PROGRESS_REGEXP = r'.*airflow-python-[0-9.]+-v[0-9.].*'
+K8S_TEST_PROGRESS_REGEXP = r'.*airflow-python-[0-9.]+-v[0-9.].*|^kubernetes_tests/.*'
+PERCENT_K8S_TEST_PROGRESS_REGEXP = r'^kubernetes_tests/.*\[[ \d*%]*\].*'
+K8S_SKIP_TRUNCATION_REGEXP = r'^kubernetes_tests/.*'
+
+
+@kubernetes_group.command(name="setup-env", help="Setup shared Kubernetes virtual environment and tools.")
+@click.option(
+    '--force',
+    help="Force recreation of the virtualenv even if it is already created.",
+    is_flag=True,
+    envvar='FORCE',
+)
+@option_verbose
+@option_dry_run
+def setup_env(force: bool, verbose: bool, dry_run: bool):
+    result = create_virtualenv(force, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(1)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    get_console().print("\n[warning]NEXT STEP:[/][info] You might now create your cluster by:\n")
+    get_console().print("\nbreeze k8s create-cluster\n")
+
+
+def _create_cluster(
+    python: str,
+    kubernetes_version: str,
+    output: Optional[Output],
+    num_tries: int,
+    force: bool,
+    verbose: bool,
+    dry_run: bool,
+) -> Tuple[int, str]:
+    while True:
+        if force:
+            _delete_cluster(
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                verbose=verbose,
+                dry_run=dry_run,
+            )
+        kubeconfig_file = get_kubeconfig_file(python=python, kubernetes_version=kubernetes_version)
+        cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+        kubeconfig_file.parent.mkdir(parents=True, exist_ok=True)
+        kubeconfig_file.touch(mode=0o700)
+        get_console(output=output).print(f"[info]Creating KinD cluster {cluster_name}!")
+        set_random_cluster_ports(python=python, kubernetes_version=kubernetes_version, output=output)
+        result = run_command_with_k8s_env(
+            [
+                'kind',
+                'create',
+                'cluster',
+                '--name',
+                cluster_name,
+                "--config",
+                str(get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version)),
+                "--image",
+                f"kindest/node:{kubernetes_version}",
+            ],
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=output,
+            text=True,
+            dry_run=dry_run,
+            verbose=verbose,
+            check=False,
+        )
+        if result.returncode == 0:
+            print_cluster_urls(python=python, kubernetes_version=kubernetes_version, output=output)
+            get_console(output=output).print(f"[success]KinD cluster {cluster_name} created!\n")
+            get_console().print("\n[warning]NEXT STEP:[/][info] You might now configure your cluster by:\n")
+            get_console().print("\nbreeze k8s configure-cluster\n")
+            return result.returncode, f"K8S cluster {cluster_name}."
+        num_tries -= 1
+        if num_tries == 0:
+            return result.returncode, f"K8S cluster {cluster_name}."
+        else:
+            get_console(output=output).print(
+                f"[warning]Failed to create KinD cluster {cluster_name}. "
+                f"Retrying! There are {num_tries} tries left.\n"
+            )
+            _delete_cluster(
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                verbose=verbose,
+                dry_run=dry_run,
+            )
+
+
+@kubernetes_group.command(
+    name="create-cluster",
+    help="Create a KinD Cluster for Python and Kubernetes version specified "
+    "(optionally create all clusters in parallel).",
+)
+@click.option(
+    '--force',
+    help="Force recreation of the cluster even if it is already created.",
+    is_flag=True,
+    envvar='FORCE',
+)
+@option_python
+@option_kubernetes_version
+@option_run_in_parallel
+@option_parallelism
+@option_kubernetes_versions
+@option_python_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+def create_cluster(
+    force: bool,
+    python: str,
+    kubernetes_version: str,
+    run_in_parallel: bool,
+    parallelism: int,
+    kubernetes_versions: str,
+    python_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if run_in_parallel:
+        python_version_array: List[str] = python_versions.split(" ")
+        kubernetes_version_array: List[str] = kubernetes_versions.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        with ci_group(f"Creating clusters {short_combo_titles}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=combo_titles,
+                progress_matcher=GenericRegexpProgressMatcher(
+                    K8S_CLUSTER_CREATE_PROGRESS_REGEXP, lines_to_search=15
+                ),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _create_cluster,
+                        kwds={
+                            "python": combo.python_version,
+                            "kubernetes_version": combo.kubernetes_version,
+                            "force": False,
+                            "num_tries": 3,  # when creating cluster in parallel, sometimes we need to retry
+                            "verbose": verbose,
+                            "dry_run": dry_run,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, combo in enumerate(combos)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All clusters created.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        return_code, _ = _create_cluster(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=None,
+            force=force,
+            num_tries=1,
+            verbose=verbose,
+            dry_run=dry_run,
+        )
+        if return_code != 0:
+            sys.exit(return_code)
+
+
+def _delete_cluster(
+    python: str, kubernetes_version: str, output: Optional[Output], dry_run: bool, verbose: bool
+):
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"[info]Deleting KinD cluster {cluster_name}!")
+    folder = get_config_folder(python=python, kubernetes_version=kubernetes_version)
+    run_command_with_k8s_env(
+        [
+            'kind',
+            'delete',
+            'cluster',
+            '--name',
+            cluster_name,
+        ],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        text=True,
+        dry_run=dry_run,
+        verbose=verbose,
+        check=False,
+    )
+    if not folder.exists():
+        get_console(output=output).print(
+            f"[warning]KinD cluster {cluster_name} was not created before but "
+            f"running delete in case it was created manually !\n"
+        )
+    shutil.rmtree(folder, ignore_errors=True)
+    get_console(output=output).print(f"[success]KinD cluster {cluster_name} deleted!\n")
+
+
+def _delete_all_clusters(dry_run: bool, verbose: bool):
+    clusters = list(K8S_CLUSTERS_PATH.iterdir())
+    if len(clusters) == 0:
+        get_console().print("\n[warning]No clusters.\n")
+    else:
+        get_console().print("\n[info]Deleting clusters")
+        for cluster_name in clusters:
+            resolved_path = cluster_name.resolve()
+            python, kubernetes_version = _get_python_kubernetes_version_from_name(resolved_path.name)
+            if python and kubernetes_version:
+                _delete_cluster(
+                    python=python,
+                    kubernetes_version=kubernetes_version,
+                    output=None,
+                    verbose=verbose,
+                    dry_run=dry_run,
+                )
+            else:
+                get_console().print(
+                    f"[warning]The cluster {resolved_path.name} does not match expected name. "
+                    f"Just removing the {resolved_path}!\n"
+                )
+                if resolved_path.is_dir():
+                    shutil.rmtree(cluster_name.resolve(), ignore_errors=True)
+                else:
+                    resolved_path.unlink()
+
+
+@kubernetes_group.command(
+    name="delete-cluster", help="Delete the current KinD Cluster (optionally all clusters)."
+)
+@option_python
+@option_kubernetes_version
+@option_all
+@option_verbose
+@option_dry_run
+def delete_cluster(python: str, kubernetes_version: str, all: bool, verbose: bool, dry_run: bool):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if all:
+        _delete_all_clusters(verbose=verbose, dry_run=dry_run)
+    else:
+        _delete_cluster(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=None,
+            dry_run=dry_run,
+            verbose=verbose,
+        )
+
+
+def _get_python_kubernetes_version_from_name(cluster_name: str) -> Tuple[Optional[str], Optional[str]]:
+    matcher = re.compile(r'airflow-python-(\d+\.\d+)-(v\d+.\d+.\d+)')
+    cluster_match = matcher.search(cluster_name)
+    if cluster_match:
+        python = cluster_match.group(1)
+        kubernetes_version = cluster_match.group(2)
+        return python, kubernetes_version
+    else:
+        return None, None
+
+
+LIST_CONSOLE_WIDTH = 120
+
+
+def _status(
+    python: str, kubernetes_version: str, wait_time_in_seconds: int, dry_run: bool, verbose: bool
+) -> bool:
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    kubectl_cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    if not get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version).exists():
+        get_console().print(f"\n[warning]Cluster: {cluster_name} has not been created yet\n")
+        get_console().print(
+            "[info]Run: "
+            f"`breeze k8s create-cluster --python {python} --kubernetes-version {kubernetes_version}`"
+            "to create it.\n"
+        )
+        return False
+    get_console().print("[info]" + "=" * LIST_CONSOLE_WIDTH)
+    get_console().print(f"[info]Cluster: {cluster_name}\n")
+    kubeconfig_file = get_kubeconfig_file(python=python, kubernetes_version=kubernetes_version)
+    get_console().print(f"    * KUBECONFIG={kubeconfig_file}")
+    kind_config_file = get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version)
+    get_console().print(f"    * KINDCONFIG={kind_config_file}")
+    get_console().print(f"\n[info]Cluster info: {cluster_name}\n")
+    result = run_command_with_k8s_env(
+        ['kubectl', 'cluster-info', '--cluster', kubectl_cluster_name],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        dry_run=dry_run,
+        verbose=verbose,
+        check=False,
+    )
+    if result.returncode != 0:
+        return False
+    get_console().print(f"\n[info]Storage class for {cluster_name}\n")
+    result = run_command_with_k8s_env(
+        ['kubectl', 'get', 'storageclass', '--cluster', kubectl_cluster_name],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        dry_run=dry_run,
+        verbose=verbose,
+        check=False,
+    )
+    if result.returncode != 0:
+        return False
+    get_console().print(f"\n[info]Running pods for {cluster_name}\n")
+    result = run_command_with_k8s_env(
+        ['kubectl', 'get', '-n', "kube-system", 'pods', '--cluster', kubectl_cluster_name],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        dry_run=dry_run,
+        verbose=verbose,
+        check=False,
+    )
+    if result.returncode != 0:
+        return False
+    print_cluster_urls(python, kubernetes_version, wait_time_in_seconds=wait_time_in_seconds, output=None)
+    get_console().print(f"\n[success]Cluster healthy: {cluster_name}\n")
+    return True
+
+
+@kubernetes_group.command(
+    name="status",
+    help="Check status of the current cluster and airflow deployed to it (optionally all clusters).",
+)
+@option_python
+@option_kubernetes_version
+@option_wait_time_in_seconds_0_default
+@option_all
+@option_verbose
+@option_dry_run
+def status(
+    kubernetes_version: str,
+    python: str,
+    wait_time_in_seconds: int,
+    all: bool,
+    verbose: bool,
+    dry_run: bool,
+):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if all:
+        clusters = list(K8S_CLUSTERS_PATH.iterdir())
+        if len(clusters) == 0:
+            get_console().print("\n[warning]No clusters.\n")
+            sys.exit(1)
+        else:
+            failed = False
+            get_console().print("[info]\nCluster status:\n")
+            for cluster_name in clusters:
+                name = cluster_name.name
+                found_python, found_kubernetes_version = _get_python_kubernetes_version_from_name(name)
+                if not found_python or not found_kubernetes_version:
+                    get_console().print(f"[warning]\nCould not get cluster from {name}. Skipping.\n")
+                    continue
+                if not _status(
+                    python=found_python,
+                    kubernetes_version=found_kubernetes_version,
+                    wait_time_in_seconds=wait_time_in_seconds,
+                    dry_run=dry_run,
+                    verbose=verbose,
+                ):
+                    failed = True
+            if failed:
+                get_console().print("\n[error]Some clusters are not healthy!\n")
+                sys.exit(1)
+    else:
+        if not _status(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            wait_time_in_seconds=wait_time_in_seconds,
+            dry_run=dry_run,
+            verbose=verbose,
+        ):
+            get_console().print("\n[error]The cluster is not healthy!\n")
+            sys.exit(1)
+
+
+def check_if_base_image_exists(params: BuildProdParams, verbose: bool, dry_run: bool) -> bool:
+    return check_if_image_exists(
+        image=params.airflow_image_name_with_tag,
+        verbose=verbose,
+        dry_run=dry_run,
+    )
+
+
+def _rebuild_k8s_image(
+    python: str,
+    image_tag: str,
+    rebuild_base_image: bool,
+    dry_run: bool,
+    verbose: bool,
+    output: Optional[Output],
+) -> Tuple[int, str]:
+    params = BuildProdParams(python=python, image_tag=image_tag)
+    if rebuild_base_image:
+        run_build_production_image(prod_image_params=params, verbose=verbose, dry_run=dry_run, output=output)
+    else:
+        if not check_if_base_image_exists(params, verbose=verbose, dry_run=dry_run):
+            get_console(output=output).print(
+                f"[error]The base PROD image {params.airflow_image_name_with_tag} does not exist locally.\n"
+            )
+            if image_tag == 'latest':
+                get_console(output=output).print(
+                    "[warning]Please add `--rebuild-base-image` flag or rebuild it manually with:\n"
+                )
+                get_console(output=output).print(f"breeze prod-image build --python {python}\n")
+            else:
+                get_console(output=output).print("[warning]Please pull the image:\n")
+                get_console(output=output).print(
+                    f"breeze prod-image pull --python {python} --image-tag {image_tag}\n"
+                )
+            sys.exit(1)
+    get_console(output=output).print(
+        f"[info]Building the K8S image for Python {python} using "
+        f"airflow base image: {params.airflow_image_name_with_tag}\n"
+    )
+    docker_image_for_kubernetes_tests = f"""
+FROM {params.airflow_image_name_with_tag}
+
+COPY airflow/example_dags/ /opt/airflow/dags/
+
+COPY airflow/kubernetes_executor_templates/ /opt/airflow/pod_templates/
+
+ENV GUNICORN_CMD_ARGS='--preload' AIRFLOW__WEBSERVER__WORKER_REFRESH_INTERVAL=0
+"""
+    image = f"{params.airflow_image_kubernetes}:latest"
+    docker_build_result = run_command(
+        ['docker', 'build', "--tag", image, ".", "-f", "-"],
+        input=docker_image_for_kubernetes_tests,
+        text=True,
+        check=False,
+        dry_run=dry_run,
+        verbose=verbose,
+        output=output,
+    )
+    if docker_build_result.returncode != 0:
+        get_console(output=output).print("[error]Error when building the kubernetes image.")
+    return docker_build_result.returncode, f"K8S image for Python {python}"
+
+
+def _upload_k8s_image(
+    python: str, kubernetes_version: str, output: Optional[Output], dry_run: bool, verbose: bool
+) -> Tuple[int, str]:
+    params = BuildProdParams(python=python)
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(
+        f'[info]Uploading Airflow image {params.airflow_image_kubernetes} to cluster {cluster_name}'
+    )
+    kind_load_result = run_command_with_k8s_env(
+        ['kind', 'load', "docker-image", "--name", cluster_name, params.airflow_image_kubernetes],
+        python=python,
+        output=output,
+        kubernetes_version=kubernetes_version,
+        dry_run=dry_run,
+        verbose=verbose,
+        check=False,
+    )
+    if kind_load_result.returncode != 0:
+        get_console(output=output).print(
+            f"[error]Error when uploading {params.airflow_image_kubernetes} image to "
+            f"KinD cluster {cluster_name}."
+        )
+    return kind_load_result.returncode, f"Uploaded K8S image to {cluster_name}"
+
+
+@kubernetes_group.command(
+    name="build-k8s-image",
+    help="Build k8s-ready airflow image (optionally all images in parallel).",
+)
+@option_python
+@option_image_tag
+@option_rebuild_base_image
+@option_run_in_parallel
+@option_parallelism
+@option_python_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+def build_k8s_image(
+    python: str,
+    image_tag: str,
+    rebuild_base_image: bool,
+    run_in_parallel: bool,
+    parallelism: int,
+    python_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if run_in_parallel:
+        python_version_array: List[str] = python_versions.split(" ")
+        with ci_group(f"Building K8s images for {python_versions}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=[f"Image {python}" for python in python_version_array],
+                progress_matcher=DockerBuildxProgressMatcher(),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _rebuild_k8s_image,
+                        kwds={
+                            "python": _python,
+                            "image_tag": image_tag,
+                            "rebuild_base_image": rebuild_base_image,
+                            "verbose": verbose,
+                            "dry_run": dry_run,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, _python in enumerate(python_version_array)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All K8S images built correctly.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        return_code, _ = _rebuild_k8s_image(
+            python=python,
+            image_tag=image_tag,
+            rebuild_base_image=rebuild_base_image,
+            verbose=verbose,
+            dry_run=dry_run,
+            output=None,
+        )
+        if return_code == 0:
+            get_console().print("\n[warning]NEXT STEP:[/][info] You might now upload your k8s image by:\n")
+            get_console().print("\nbreeze k8s upload-k8s-image\n")
+        sys.exit(return_code)
+
+
+@kubernetes_group.command(
+    name="upload-k8s-image",
+    help="Upload k8s-ready airflow image to the KinD cluster (optionally to all clusters in parallel)",
+)
+@option_python
+@option_kubernetes_version
+@option_run_in_parallel
+@option_parallelism
+@option_python_versions
+@option_kubernetes_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+def upload_k8s_image(
+    python: str,
+    kubernetes_version: str,
+    run_in_parallel: bool,
+    parallelism: int,
+    python_versions: str,
+    kubernetes_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if run_in_parallel:
+        python_version_array: List[str] = python_versions.split(" ")
+        kubernetes_version_array: List[str] = kubernetes_versions.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        with ci_group(f"Uploading K8s images for {short_combo_titles}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=combo_titles,
+                progress_matcher=GenericRegexpProgressMatcher(
+                    regexp=K8S_UPLOAD_PROGRESS_REGEXP, lines_to_search=2
+                ),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _upload_k8s_image,
+                        kwds={
+                            "python": combo.python_version,
+                            "kubernetes_version": combo.kubernetes_version,
+                            "verbose": verbose,
+                            "dry_run": dry_run,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, combo in enumerate(combos)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All K8S images uploaded correctly.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        return_code, _ = _upload_k8s_image(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=None,
+            dry_run=dry_run,
+            verbose=verbose,
+        )
+        if return_code == 0:
+            get_console().print("\n[warning]NEXT STEP:[/][info] You might now deploy airflow by:\n")
+            get_console().print("\nbreeze k8s deploy-airflow\n")
+        sys.exit(return_code)
+
+
+HELM_DEFAULT_NAMESPACE = "default"
+HELM_AIRFLOW_NAMESPACE = "airflow"
+TEST_NAMESPACE = "test-namespace"
+
+
+def _recreate_namespaces(
+    python: str,
+    kubernetes_version: str,
+    verbose: bool,
+    dry_run: bool,
+    output: Optional[Output],
+) -> RunCommandResult:
+    cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"[info]Deleting K8S namespaces for {cluster_name}")
+    run_command_with_k8s_env(
+        ["kubectl", "delete", "namespace", HELM_AIRFLOW_NAMESPACE],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        check=False,
+        verbose=verbose,
+        dry_run=dry_run,
+    )
+    run_command_with_k8s_env(
+        ["kubectl", "delete", "namespace", TEST_NAMESPACE],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        check=False,
+        verbose=verbose,
+        dry_run=dry_run,
+    )
+    get_console(output=output).print("[info]Creating namespaces")
+    result = run_command_with_k8s_env(
+        ["kubectl", "create", "namespace", HELM_AIRFLOW_NAMESPACE],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+    )
+    if result.returncode != 0:
+        return result
+    result = run_command_with_k8s_env(
+        ["kubectl", "create", "namespace", TEST_NAMESPACE],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+    )
+    if result.returncode == 0:
+        get_console(output=output).print(f"[success]Created K8S namespaces for cluster {cluster_name}\n")
+    return result
+
+
+def _deploy_test_resources(
+    python: str, kubernetes_version: str, output: Optional[Output], verbose: bool, dry_run: bool
+) -> RunCommandResult:
+    cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"[info]Deploying test resources for cluster {cluster_name}")
+    result = run_command_with_k8s_env(
+        [
+            "kubectl",
+            "apply",
+            "-f",
+            str(SCRIPTS_CI_KUBERNETES_PATH / "volumes.yaml"),
+            "--namespace",
+            HELM_DEFAULT_NAMESPACE,
+        ],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+    )
+    if result.returncode != 0:
+        return result
+    result = run_command_with_k8s_env(
+        [
+            "kubectl",
+            "apply",
+            "-f",
+            str(SCRIPTS_CI_KUBERNETES_PATH / "nodeport.yaml"),
+            "--namespace",
+            HELM_AIRFLOW_NAMESPACE,
+        ],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+    )
+    if result.returncode == 0:
+        get_console(output=output).print(f"[success]Deployed test resources for cluster {cluster_name}")
+    return result
+
+
+def _configure_k8s_cluster(
+    python: str, kubernetes_version: str, output: Optional[Output], verbose: bool, dry_run: bool
+) -> Tuple[int, str]:
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f'[info]Configuring {cluster_name} to be ready for Airflow deployment')
+    result = _recreate_namespaces(
+        python=python, kubernetes_version=kubernetes_version, output=output, dry_run=dry_run, verbose=verbose
+    )
+    if result.returncode == 0:
+        result = _deploy_test_resources(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=output,
+            dry_run=dry_run,
+            verbose=verbose,
+        )
+    return result.returncode, f"Configure {cluster_name}"
+
+
+@kubernetes_group.command(
+    name="configure-cluster",
+    help="Configures cluster for airflow deployment - creates namespaces and test resources "
+    "(optionally for all clusters in parallel).",
+)
+@option_python
+@option_kubernetes_version
+@option_run_in_parallel
+@option_parallelism
+@option_python_versions
+@option_kubernetes_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+def configure_cluster(
+    python: str,
+    kubernetes_version: str,
+    run_in_parallel: bool,
+    parallelism: int,
+    python_versions: str,
+    kubernetes_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if run_in_parallel:
+        python_version_array: List[str] = python_versions.split(" ")
+        kubernetes_version_array: List[str] = kubernetes_versions.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        with ci_group(f"Setting up clusters for {short_combo_titles}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=combo_titles,
+                progress_matcher=GenericRegexpProgressMatcher(
+                    regexp=K8S_CONFIGURE_CLUSTER_PROGRESS_REGEXP, lines_to_search=10
+                ),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _configure_k8s_cluster,
+                        kwds={
+                            "python": combo.python_version,
+                            "kubernetes_version": combo.kubernetes_version,
+                            "verbose": verbose,
+                            "dry_run": dry_run,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, combo in enumerate(combos)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All clusters configured correctly.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        return_code, _ = _configure_k8s_cluster(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=None,
+            dry_run=dry_run,
+            verbose=verbose,
+        )
+        if return_code == 0:
+            get_console().print("\n[warning]NEXT STEP:[/][info] You might now build your k8s image by:\n")
+            get_console().print("\nbreeze k8s build-k8s-image\n")
+        sys.exit(return_code)
+
+
+def _deploy_helm_chart(
+    python: str,
+    upgrade: bool,
+    kubernetes_version: str,
+    output: Optional[Output],
+    executor: str,
+    verbose: bool,
+    dry_run: bool,
+    extra_options: Optional[Tuple[str, ...]] = None,
+) -> RunCommandResult:
+    cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"[info]Deploying {cluster_name} with airflow Helm Chart.")
+    with tempfile.TemporaryDirectory(prefix="chart_") as tmp_dir:
+        tmp_chart_path = Path(tmp_dir).resolve() / "chart"
+        shutil.copytree(CHART_PATH, os.fspath(tmp_chart_path), ignore_dangling_symlinks=True)
+        get_console(output=output).print(f"[info]Copied chart sources to {tmp_chart_path}")
+        kubectl_context = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+        params = BuildProdParams(python=python)
+        airflow_kubernetes_image_name = params.airflow_image_kubernetes
+        helm_command = [
+            "helm",
+            "upgrade" if upgrade else "install",
+            "airflow",
+            os.fspath(tmp_chart_path.resolve()),
+            "--kube-context",
+            kubectl_context,
+            "--timeout",
+            "10m0s",
+            "--namespace",
+            HELM_AIRFLOW_NAMESPACE,
+            "--set",
+            f"defaultAirflowRepository={airflow_kubernetes_image_name}",
+            "--set",
+            "defaultAirflowTag=latest",
+            "-v",
+            "1",
+            "--set",
+            f"images.airflow.repository={airflow_kubernetes_image_name}",
+            "--set",
+            "images.airflow.tag=latest",
+            "-v",
+            "1",
+            "--set",
+            "config.api.auth_backends=airflow.api.auth.backend.basic_auth",
+            "--set",
+            "config.logging.logging_level=DEBUG",
+            "--set",
+            f"executor={executor}",
+        ]
+        if upgrade:
+            # force upgrade
+            helm_command.append("--force")
+        if extra_options:
+            helm_command.extend(extra_options)
+        get_console(output=output).print(f"[info]Deploying Airflow from {tmp_chart_path}")
+        result = run_command_with_k8s_env(
+            helm_command,
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=output,
+            verbose=verbose,
+            dry_run=dry_run,
+            check=False,
+        )
+        if result.returncode == 0:
+            get_console(output=output).print(f"[success]Deployed {cluster_name} with airflow Helm Chart.")
+        return result
+
+
+def _deploy_airflow(
+    python: str,
+    kubernetes_version: str,
+    output: Optional[Output],
+    executor: str,
+    upgrade: bool,
+    wait_time_in_seconds: int,
+    verbose: bool,
+    dry_run: bool,
+    extra_options: Optional[Tuple[str, ...]] = None,
+) -> Tuple[int, str]:
+    action = "Deploying" if not upgrade else "Upgrading"
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f'[info]{action} Airflow for cluster {cluster_name}')
+    result = _deploy_helm_chart(
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        upgrade=upgrade,
+        executor=executor,
+        verbose=verbose,
+        dry_run=dry_run,
+        extra_options=extra_options,
+    )
+    if result.returncode == 0:
+        get_console(output=output).print(
+            f"\n[success]Airflow for Python {python} and "
+            f"K8S version {kubernetes_version} has been successfully deployed."
+        )
+        kubectl_cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+        get_console(output=output).print(
+            f"\nThe KinD cluster name: {cluster_name}\nThe kubectl cluster name: {kubectl_cluster_name}.\n"
+        )
+        print_cluster_urls(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=output,
+            wait_time_in_seconds=wait_time_in_seconds,
+        )
+    return result.returncode, f"{action} Airflow to {cluster_name}"
+
+
+@kubernetes_group.command(
+    name="deploy-airflow",
+    help="Deploy airflow image to the current KinD cluster (or all clusters).",
+    context_settings=dict(
+        ignore_unknown_options=True,
+    ),
+)
+@option_python
+@option_kubernetes_version
+@option_executor
+@click.option(
+    '--upgrade',
+    help="Upgrade Helm Chart rather than installing it.",
+    is_flag=True,
+    envvar='UPGRADE',
+)
+@option_wait_time_in_seconds
+@option_run_in_parallel
+@option_parallelism
+@option_python_versions
+@option_kubernetes_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+@click.argument('extra_options', nargs=-1, type=click.UNPROCESSED)
+def deploy_airflow(
+    python: str,
+    kubernetes_version: str,
+    executor: str,
+    upgrade: bool,
+    wait_time_in_seconds: int,
+    run_in_parallel: bool,
+    parallelism: int,
+    python_versions: str,
+    kubernetes_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+    extra_options: Optional[Tuple[str, ...]] = None,
+):
+    if run_in_parallel:
+        python_version_array: List[str] = python_versions.split(" ")
+        kubernetes_version_array: List[str] = kubernetes_versions.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        with ci_group(f"Deploying airflow for: {short_combo_titles}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=combo_titles,
+                progress_matcher=GenericRegexpProgressMatcher(K8S_DEPLOY_PROGRESS_REGEXP, lines_to_search=15),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _deploy_airflow,
+                        kwds={
+                            "python": combo.python_version,
+                            "kubernetes_version": combo.kubernetes_version,
+                            "executor": executor,
+                            "upgrade": upgrade,
+                            "wait_time_in_seconds": wait_time_in_seconds,
+                            "dry_run": dry_run,
+                            "verbose": verbose,
+                            "extra_options": extra_options,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, combo in enumerate(combos)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All Airflow charts successfully deployed.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        return_code, _ = _deploy_airflow(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            output=None,
+            executor=executor,
+            upgrade=upgrade,
+            wait_time_in_seconds=wait_time_in_seconds,
+            verbose=verbose,
+            dry_run=dry_run,
+            extra_options=extra_options,
+        )
+        if return_code == 0:
+            get_console().print(
+                "\n[warning]NEXT STEP:[/][info] You might now run tests or interact "
+                "with airflow via shell (kubectl, pytest etc.) or k9s commands:\n"
+            )
+            get_console().print("\nbreeze k8s tests")
+            get_console().print("\nbreeze k8s shell")
+            get_console().print("\nbreeze k8s k9s\n")
+        sys.exit(return_code)
+
+
+@kubernetes_group.command(
+    name="k9s",
+    help="Run k9s tool. You can pass any k9s args as extra args.",
+    context_settings=dict(
+        ignore_unknown_options=True,
+        allow_extra_args=True,
+    ),
+)
+@option_python
+@option_kubernetes_version
+@option_verbose
+@option_dry_run
+@click.argument('k9s_args', nargs=-1, type=click.UNPROCESSED)
+def k9s(python: str, kubernetes_version: str, verbose: bool, dry_run: bool, k9s_args: Tuple[str, ...]):
+    result = create_virtualenv(force=False, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    env = get_k8s_env(python=python, kubernetes_version=kubernetes_version)
+    env['TERM'] = 'xterm-256color'
+    editor = env.get('EDITOR')
+    if not editor:
+        env['EDITOR'] = 'vim'
+    k9s_editor = env.get('K9S_EDITOR')
+    if not k9s_editor:
+        env['K9S_EDITOR'] = env['EDITOR']
+    kubeconfig_file = get_kubeconfig_file(python=python, kubernetes_version=kubernetes_version)
+    result = run_command(
+        [
+            'docker',
+            'run',
+            "--rm",
+            '-it',
+            '--network',
+            'host',
+            '-e',
+            'EDITOR',
+            '-e',
+            'K9S_EDITOR',
+            '-v',
+            f"{kubeconfig_file}:/root/.kube/config",
+            'quay.io/derailed/k9s',
+            '--namespace',
+            HELM_AIRFLOW_NAMESPACE,
+            *k9s_args,
+        ],
+        verbose=verbose,
+        dry_run=dry_run,
+        env=env,
+        check=False,
+    )
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+
+
+def _logs(python: str, kubernetes_version: str, verbose: bool, dry_run: bool):
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    tmpdir = Path(tempfile.gettempdir()) / f"kind_logs_{cluster_name}"
+    get_console().print(f"[info]\nDumping logs for {cluster_name} to {tmpdir}:\n")
+    run_command_with_k8s_env(
+        ['kind', '--name', cluster_name, 'export', 'logs', str(tmpdir)],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+    )
+
+
+@kubernetes_group.command(
+    name="logs",
+    help=f"Dump k8s logs to ${{TMP_DIR}}{os.sep}kind_logs_<cluster_name> directory "
+    f"(optionally all clusters). ",
+)
+@option_python
+@option_kubernetes_version
+@option_all
+@option_verbose
+@option_dry_run
+def logs(python: str, kubernetes_version: str, all: bool, verbose: bool, dry_run: bool):
+    if all:
+        clusters = list(K8S_CLUSTERS_PATH.iterdir())
+        if len(clusters) == 0:
+            get_console().print("\n[warning]No clusters.\n")
+            sys.exit(1)
+        else:
+            get_console().print("[info]\nDumping cluster logs:\n")
+            for cluster_name in clusters:
+                name = cluster_name.name
+                found_python, found_kubernetes_version = _get_python_kubernetes_version_from_name(name)
+                if not found_python or not found_kubernetes_version:
+                    get_console().print(f"[warning]\nCould not get cluster from {name}. Skipping.\n")
+                    continue
+                _logs(
+                    python=found_python,
+                    kubernetes_version=found_kubernetes_version,
+                    verbose=verbose,
+                    dry_run=dry_run,
+                )
+    else:
+        _logs(python=python, kubernetes_version=kubernetes_version, verbose=verbose, dry_run=dry_run)
+
+
+@kubernetes_group.command(
+    name="shell",
+    help="Run shell environment for the current KinD cluster.",
+    context_settings=dict(
+        ignore_unknown_options=True,
+        allow_extra_args=True,
+    ),
+)
+@option_python
+@option_kubernetes_version
+@option_executor
+@option_force_venv_setup
+@option_verbose
+@option_dry_run
+@click.argument('shell_args', nargs=-1, type=click.UNPROCESSED)
+def shell(
+    python: str,
+    kubernetes_version: str,
+    executor: str,
+    force_venv_setup: bool,
+    verbose: bool,
+    dry_run: bool,
+    shell_args: Tuple[str, ...],
+):
+    result = create_virtualenv(force=force_venv_setup, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    env = get_k8s_env(python=python, kubernetes_version=kubernetes_version, executor=executor)
+    get_console().print("\n[info]Entering interactive k8s shell.\n")
+    shell_binary = env['SHELL']
+    extra_args: List[str] = []
+    if shell_binary.endswith("zsh"):
+        extra_args.append('--no-rcs')
+    elif shell_binary.endswith("bash"):
+        extra_args.extend(['--norc', '--noprofile'])
+    result = run_command(
+        [shell_binary, *extra_args, *shell_args], verbose=verbose, dry_run=dry_run, env=env, check=False
+    )
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+
+
+def _run_tests(
+    python: str,
+    kubernetes_version: str,
+    output: Optional[Output],
+    executor: str,
+    test_args: Tuple[str, ...],
+    verbose: bool,
+    dry_run: bool,
+) -> Tuple[int, str]:
+    env = get_k8s_env(python=python, kubernetes_version=kubernetes_version, executor=executor)
+    kubectl_cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"\n[info]Running tests with {kubectl_cluster_name} cluster.")
+    shell_binary = env['SHELL']
+    extra_shell_args: List[str] = []
+    if shell_binary.endswith("zsh"):
+        extra_shell_args.append('--no-rcs')
+    elif shell_binary.endswith("bash"):
+        extra_shell_args.extend(['--norc', '--noprofile'])
+    the_tests = []
+    if not any(arg.startswith("kubernetes_tests") for arg in test_args):
+        # if no tests specified - use args
+        the_tests.append('kubernetes_tests')
+    command_to_run = ' '.join([quote(arg) for arg in ['pytest', *the_tests, *test_args]])
+    get_console(output).print(f"[info] Command to run:[/] {command_to_run}")
+    result = run_command(
+        [shell_binary, *extra_shell_args, '-c', command_to_run],
+        verbose=verbose,
+        dry_run=dry_run,
+        output=output,
+        env=env,
+        check=False,
+    )
+    return result.returncode, f"Tests {kubectl_cluster_name}"
+
+
+@kubernetes_group.command(
+    name="tests",
+    help="Run tests against the current KinD cluster (optionally for all clusters in parallel).",
+    context_settings=dict(
+        ignore_unknown_options=True,
+    ),
+)
+@option_python
+@option_kubernetes_version
+@option_executor
+@option_force_venv_setup
+@option_run_in_parallel
+@option_parallelism
+@option_python_versions
+@option_kubernetes_versions
+@option_include_success_outputs
+@option_verbose
+@option_dry_run
+@click.argument('test_args', nargs=-1, type=click.Path())
+def tests(
+    python: str,
+    kubernetes_version: str,
+    executor: str,
+    force_venv_setup: bool,
+    run_in_parallel: bool,
+    parallelism: int,
+    python_versions: str,
+    kubernetes_versions: str,
+    include_success_outputs: bool,
+    verbose: bool,
+    dry_run: bool,
+    test_args: Tuple[str, ...],
+):
+    result = create_virtualenv(force=force_venv_setup, verbose=verbose, dry_run=dry_run)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed(verbose=verbose, dry_run=dry_run)
+    if run_in_parallel:
+        pytest_args = [
+            "--verbosity=0",
+            "--strict-markers",
+            "--durations=100",
+            "--maxfail=50",
+            "--color=yes",
+            # timeouts in seconds for individual tests
+            "--timeouts-order",
+            "moi",
+            "--setup-timeout=60",
+            "--execution-timeout=60",
+            "--teardown-timeout=60",
+            # Only display summary for non-expected case
+            # f - failed
+            # E - error
+            # X - xpassed (passed even if expected to fail)
+            # The following cases are not displayed:
+            # s - skipped
+            # x - xfailed (expected to fail and failed)
+            # p - passed
+            # P - passed with output
+            "-rfEX",
+            *test_args,
+        ]
+        python_version_array: List[str] = python_versions.split(" ")
+        kubernetes_version_array: List[str] = kubernetes_versions.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        with ci_group(f"Running tests for: {short_combo_titles}"):
+            with run_with_pool(
+                parallelism=parallelism,
+                all_params=combo_titles,
+                progress_matcher=GenericRegexpProgressMatcher(
+                    K8S_TEST_PROGRESS_REGEXP,
+                    lines_to_search=15,
+                    regexp_for_joined_line=PERCENT_K8S_TEST_PROGRESS_REGEXP,
+                    regexp_to_skip_truncation=K8S_SKIP_TRUNCATION_REGEXP,
+                ),
+            ) as (pool, outputs):
+                results = [
+                    pool.apply_async(
+                        _run_tests,
+                        kwds={
+                            "python": combo.python_version,
+                            "kubernetes_version": combo.kubernetes_version,
+                            "executor": executor,
+                            "test_args": pytest_args,
+                            "dry_run": dry_run,
+                            "verbose": verbose,
+                            "output": outputs[index],
+                        },
+                    )
+                    for index, combo in enumerate(combos)
+                ]
+        check_async_run_results(
+            results=results,
+            success="All K8S tests successfully completed.",
+            outputs=outputs,
+            include_success_outputs=include_success_outputs,
+        )
+    else:
+        result, _ = _run_tests(
+            python=python,
+            kubernetes_version=kubernetes_version,
+            executor=executor,
+            output=None,
+            test_args=test_args,
+            verbose=verbose,
+            dry_run=dry_run,
+        )
+        sys.exit(result)
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
new file mode 100644
index 0000000000..6a51a01c91
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -0,0 +1,232 @@
+# 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 typing import Dict, List, Union
+
+KUBERNETES_CLUSTER_COMMANDS: Dict[str, Union[str, List[str]]] = {
+    "name": "K8S cluster management commands",
+    "commands": [
+        "setup-env",
+        "create-cluster",
+        "build-k8s-image",
+        "upload-k8s-image",
+        "configure-cluster",
+        "deploy-airflow",
+        "delete-cluster",
+    ],
+}
+KUBERNETES_INSPECTION_COMMANDS: Dict[str, Union[str, List[str]]] = {
+    "name": "K8S inspection commands",
+    "commands": ["status", "logs"],
+}
+
+KUBERNETES_TESTING_COMMANDS: Dict[str, Union[str, List[str]]] = {
+    "name": "K8S testing commands",
+    "commands": ["tests", "shell", "k9s", "logs"],
+}
+KUBERNETES_PARAMETERS: Dict[str, List[Dict[str, Union[str, List[str]]]]] = {
+    "breeze k8s setup-env": [
+        {
+            "name": "K8S setup flags",
+            "options": ["--force"],
+        }
+    ],
+    "breeze k8s create-cluster": [
+        {
+            "name": "K8S cluster creation flags",
+            "options": [
+                "--force",
+                "--forwarded-port-number",
+                "--api-server-port",
+                "--python",
+                "--kubernetes-version",
+            ],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s build-k8s-image": [
+        {
+            "name": "Build image flags",
+            "options": [
+                "--python",
+                "--rebuild-base-image",
+                "--image-tag",
+            ],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s upload-k8s-image": [
+        {
+            "name": "Upload image flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+                "--image-tag",
+            ],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s configure-k8s-cluster": [
+        {
+            "name": "Configure cluster flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+            ],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s deploy-airflow": [
+        {
+            "name": "Airflow deploy flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+                "--executor",
+                "--upgrade",
+                "--wait-time-in-seconds",
+            ],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s delete-cluster": [
+        {
+            "name": "K8S cluster delete flags",
+            "options": ["--python", "--kubernetes-version"],
+        },
+        {
+            "name": "K8S multi-cluster flags",
+            "options": ["--all"],
+        },
+    ],
+    "breeze k8s status": [
+        {
+            "name": "K8S cluster status flags",
+            "options": ["--python", "--kubernetes-version", "--wait-time-in-seconds"],
+        },
+        {
+            "name": "K8S multi-cluster flags",
+            "options": ["--all"],
+        },
+    ],
+    "breeze k8s logs": [
+        {
+            "name": "K8S logs flags",
+            "options": ["--python", "--kubernetes-version"],
+        },
+        {
+            "name": "K8S multi-cluster flags",
+            "options": ["--all"],
+        },
+    ],
+    "breeze k8s tests": [
+        {
+            "name": "K8S tests flags",
+            "options": ["--python", "--kubernetes-version", "--executor", "--force-venv-setup"],
+        },
+        {
+            "name": "Parallel options",
+            "options": [
+                "--run-in-parallel",
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+            ],
+        },
+    ],
+    "breeze k8s run-complete-tests": [
+        {
+            "name": "K8S setup & tests flags",
+            "options": [
+                "--parallelism",
+                "--python-versions",
+                "--kubernetes-versions",
+                "--include-success-outputs",
+                "--executor",
+                "--force-venv-setup",
+                "--image-tag",
+                "--wait-time-in-seconds",
+                "--skip-rebuilding-base-image",
+                "--skip-recreating-namespaces",
+                "--skip-deploying-test-resources",
+                "--skip-recreating-clusters",
+                "--skip-deploying-airflow",
+                "--skip-deleting-clusters",
+            ],
+        }
+    ],
+    "breeze k8s k9s": [
+        {
+            "name": "K8S k9s flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+            ],
+        }
+    ],
+    "breeze k8s shell": [
+        {
+            "name": "K8S shell flags",
+            "options": ["--python", "--kubernetes-version", "--executor", "--force-venv-setup"],
+        }
+    ],
+}
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
index 29af892d41..c87d2b059a 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -445,10 +445,7 @@ def check_docker_context_files(install_packages_from_context: bool):
             get_console().print(
                 '[warning]\nThis might result in unnecessary cache invalidation and long build times'
             )
-            get_console().print(
-                '[warning]\nExiting now \
-                    - please restart the command with --cleanup-context switch'
-            )
+            get_console().print('[warning]Please restart the command with --cleanup-context switch\n')
             sys.exit(1)
 
 
diff --git a/dev/breeze/src/airflow_breeze/configure_rich_click.py b/dev/breeze/src/airflow_breeze/configure_rich_click.py
index 71ea09c39a..53ea18c5d1 100644
--- a/dev/breeze/src/airflow_breeze/configure_rich_click.py
+++ b/dev/breeze/src/airflow_breeze/configure_rich_click.py
@@ -32,6 +32,12 @@ else:
         CI_IMAGE_TOOLS_PARAMETERS,
     )
     from airflow_breeze.commands.developer_commands_config import DEVELOPER_COMMANDS, DEVELOPER_PARAMETERS
+    from airflow_breeze.commands.kubernetes_commands_config import (
+        KUBERNETES_CLUSTER_COMMANDS,
+        KUBERNETES_INSPECTION_COMMANDS,
+        KUBERNETES_PARAMETERS,
+        KUBERNETES_TESTING_COMMANDS,
+    )
     from airflow_breeze.commands.production_image_commands_config import (
         PRODUCTION_IMAGE_TOOLS_COMMANDS,
         PRODUCTION_IMAGE_TOOLS_PARAMETERS,
@@ -54,6 +60,7 @@ else:
     )
     click.rich_click.OPTION_GROUPS = {
         **DEVELOPER_PARAMETERS,
+        **KUBERNETES_PARAMETERS,
         **TESTING_PARAMETERS,
         **SETUP_PARAMETERS,
         **CI_IMAGE_TOOLS_PARAMETERS,
@@ -66,10 +73,15 @@ else:
             DEVELOPER_COMMANDS,
             {
                 "name": "Advanced command groups",
-                "commands": ["testing", "ci-image", "prod-image", "setup", "release-management", "ci"],
+                "commands": ["testing", "ci-image", "k8s", "prod-image", "setup", "release-management", "ci"],
             },
         ],
         "breeze testing": [TESTING_COMMANDS],
+        "breeze k8s": [
+            KUBERNETES_CLUSTER_COMMANDS,
+            KUBERNETES_INSPECTION_COMMANDS,
+            KUBERNETES_TESTING_COMMANDS,
+        ],
         "breeze ci-image": [CI_IMAGE_TOOLS_COMMANDS],
         "breeze prod-image": [PRODUCTION_IMAGE_TOOLS_COMMANDS],
         "setup": [SETUP_COMMANDS],
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 13b93fe48a..b32de8d754 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -23,6 +23,7 @@ import platform
 from enum import Enum
 from functools import lru_cache
 
+from airflow_breeze.utils.host_info_utils import Architecture
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
 
 RUNS_ON_PUBLIC_RUNNER = "ubuntu-20.04"
@@ -41,6 +42,7 @@ APACHE_AIRFLOW_GITHUB_REPOSITORY = "apache/airflow"
 # Checked before putting in build cache
 ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS = ['3.7', '3.8', '3.9', '3.10']
 DEFAULT_PYTHON_MAJOR_MINOR_VERSION = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
+ALLOWED_ARCHITECTURES = [Architecture.X86_64, Architecture.ARM]
 ALLOWED_BACKENDS = ['sqlite', 'mysql', 'postgres', 'mssql']
 ALLOWED_PROD_BACKENDS = ['mysql', 'postgres', 'mssql']
 DEFAULT_BACKEND = ALLOWED_BACKENDS[0]
@@ -56,10 +58,7 @@ ALLOWED_INTEGRATIONS = [
     'trino',
     'all',
 ]
-ALLOWED_KUBERNETES_MODES = ['image']
-ALLOWED_KUBERNETES_VERSIONS = ['v1.25.0', 'v1.24.4', 'v1.23.10', 'v1.22.13', 'v1.21.14']
-ALLOWED_KIND_VERSIONS = ['v0.15.0']
-ALLOWED_HELM_VERSIONS = ['v3.9.2']
+ALLOWED_KUBERNETES_VERSIONS = ['v1.24.2', 'v1.23.6', 'v1.22.9', 'v1.21.12']
 ALLOWED_EXECUTORS = ['KubernetesExecutor', 'CeleryExecutor', 'LocalExecutor', 'CeleryKubernetesExecutor']
 ALLOWED_KIND_OPERATIONS = ['start', 'stop', 'restart', 'status', 'deploy', 'test', 'shell', 'k9s']
 ALLOWED_CONSTRAINTS_MODES_CI = ['constraints-source-providers', 'constraints', 'constraints-no-providers']
@@ -75,6 +74,8 @@ ALLOWED_POSTGRES_VERSIONS = ['10', '11', '12', '13', '14']
 ALLOWED_MYSQL_VERSIONS = ['5.7', '8']
 ALLOWED_MSSQL_VERSIONS = ['2017-latest', '2019-latest']
 
+PIP_VERSION = "22.2.2"
+
 
 @lru_cache(maxsize=None)
 def all_selective_test_types() -> tuple[str, ...]:
@@ -113,18 +114,6 @@ SINGLE_PLATFORMS = ["linux/amd64", "linux/arm64"]
 ALLOWED_PLATFORMS = [*SINGLE_PLATFORMS, MULTI_PLATFORM]
 ALLOWED_USE_AIRFLOW_VERSIONS = ['none', 'wheel', 'sdist']
 
-PARAM_NAME_DESCRIPTION = {
-    "BACKEND": "backend",
-    "MYSQL_VERSION": "Mysql version",
-    "KUBERNETES_MODE": "Kubernetes mode",
-    "KUBERNETES_VERSION": "Kubernetes version",
-    "KIND_VERSION": "KinD version",
-    "HELM_VERSION": "Helm version",
-    "EXECUTOR": "Executors",
-    "POSTGRES_VERSION": "Postgres version",
-    "MSSQL_VERSION": "MSSql version",
-}
-
 EXCLUDE_DOCS_PACKAGE_FOLDER = [
     'exts',
     'integration-logos',
@@ -239,18 +228,15 @@ FILES_FOR_REBUILD_CHECK = [
 
 ENABLED_SYSTEMS = ""
 
-CURRENT_KUBERNETES_MODES = ['image']
 CURRENT_KUBERNETES_VERSIONS = ALLOWED_KUBERNETES_VERSIONS
-CURRENT_KIND_VERSIONS = ALLOWED_KIND_VERSIONS
-CURRENT_HELM_VERSIONS = ALLOWED_HELM_VERSIONS
 CURRENT_EXECUTORS = ['KubernetesExecutor']
 
-DEFAULT_KUBERNETES_MODE = CURRENT_KUBERNETES_MODES[0]
 DEFAULT_KUBERNETES_VERSION = CURRENT_KUBERNETES_VERSIONS[0]
-DEFAULT_KIND_VERSION = CURRENT_KIND_VERSIONS[0]
-DEFAULT_HELM_VERSION = CURRENT_HELM_VERSIONS[0]
 DEFAULT_EXECUTOR = CURRENT_EXECUTORS[0]
 
+KIND_VERSION = 'v0.15.0'
+HELM_VERSION = 'v3.9.4'
+
 # Initialize image build variables - Have to check if this has to go to ci dataclass
 USE_AIRFLOW_VERSION = None
 GITHUB_ACTIONS = ""
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index a2400efd49..932a32955a 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -46,7 +46,6 @@ PRE_COMMIT_LIST = [
     'check-for-inclusive-language',
     'check-hooks-apply',
     'check-incorrect-use-of-LoggingMixin',
-    'check-integrations-are-consistent',
     'check-lazy-logging',
     'check-merge-conflict',
     'check-newsfragments-are-valid',
diff --git a/dev/breeze/src/airflow_breeze/utils/ci_group.py b/dev/breeze/src/airflow_breeze/utils/ci_group.py
index 57ef0d2d2e..eb61216400 100644
--- a/dev/breeze/src/airflow_breeze/utils/ci_group.py
+++ b/dev/breeze/src/airflow_breeze/utils/ci_group.py
@@ -54,6 +54,8 @@ def ci_group(
         get_console().print(f"::group::[{message_type.value}]{title}[/]")
     else:
         get_console().print(f"::group::{title}")
-    yield
-    get_console().print("::endgroup::")
-    _in_ci_group = False
+    try:
+        yield
+    finally:
+        get_console().print("::endgroup::")
+        _in_ci_group = False
diff --git a/dev/breeze/src/airflow_breeze/utils/host_info_utils.py b/dev/breeze/src/airflow_breeze/utils/host_info_utils.py
index 0e3db45a3e..0d2e7309e2 100644
--- a/dev/breeze/src/airflow_breeze/utils/host_info_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/host_info_utils.py
@@ -18,28 +18,62 @@
 Returns information about Host that should be passed to the docker-compose.
 """
 import platform
+from enum import Enum
+from typing import Dict, Optional, Tuple
 
-from airflow_breeze.utils.run_utils import run_command
 
+class Architecture(Enum):
+    X86_64 = "x86_64"
+    X86 = "x86"
+    PPC = "ppc"
+    ARM = "arm"
+
+
+def get_host_user_id() -> str:
+    from airflow_breeze.utils.run_utils import run_command
 
-def get_host_user_id():
     host_user_id = ''
     os = get_host_os()
-    if os == 'Linux' or os == 'Darwin':
+    if os == 'linux' or os == 'darwin':
         host_user_id = run_command(cmd=['id', '-ur'], capture_output=True, text=True).stdout.strip()
     return host_user_id
 
 
-def get_host_group_id():
+def get_host_group_id() -> str:
+    from airflow_breeze.utils.run_utils import run_command
+
     host_group_id = ''
     os = get_host_os()
-    if os == 'Linux' or os == 'Darwin':
+    if os == 'linux' or os == 'darwin':
         host_group_id = run_command(cmd=['id', '-gr'], capture_output=True, text=True).stdout.strip()
     return host_group_id
 
 
-def get_host_os():
-    # Linux: Linux
-    # Mac: Darwin
-    # Windows: Windows
-    return platform.system()
+def get_host_os() -> str:
+    return platform.system().lower()
+
+
+_MACHINE_TO_ARCHITECTURE: Dict[str, Architecture] = {
+    "amd64": Architecture.X86_64,
+    "x86_64": Architecture.X86_64,
+    "i686-64": Architecture.X86_64,
+    "i386": Architecture.X86,
+    "i686": Architecture.X86,
+    "x86": Architecture.X86,
+    "ia64": Architecture.X86,  # Itanium is different x64 arch, treat it as the common x86.
+    "powerpc": Architecture.PPC,
+    "power macintosh": Architecture.PPC,
+    "ppc64": Architecture.PPC,
+    "armv6": Architecture.ARM,
+    "armv6l": Architecture.ARM,
+    "arm64": Architecture.ARM,
+    "armv7": Architecture.ARM,
+    "armv7l": Architecture.ARM,
+    "aarch64": Architecture.ARM,
+}
+
+
+def get_host_architecture() -> Tuple[Optional[Architecture], str]:
+    """Get architecture in the form of Tuple: standardized architecture, original platform"""
+    machine = platform.machine()
+    return _MACHINE_TO_ARCHITECTURE.get(machine.lower()), machine
diff --git a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
new file mode 100644
index 0000000000..251fb6cb34
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
@@ -0,0 +1,578 @@
+# 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.
+
+import os
+import random
+import re
+import shutil
+import socket
+import stat
+import sys
+import tarfile
+import tempfile
+from datetime import datetime, timedelta, timezone
+from pathlib import Path
+from time import sleep
+from typing import Any, Dict, List, NamedTuple, Optional, Set, Tuple
+from urllib import request
+
+from airflow_breeze.branch_defaults import DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+from airflow_breeze.global_constants import ALLOWED_ARCHITECTURES, HELM_VERSION, KIND_VERSION, PIP_VERSION
+from airflow_breeze.utils.console import Output, get_console
+from airflow_breeze.utils.host_info_utils import Architecture, get_host_architecture, get_host_os
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, BUILD_CACHE_DIR
+from airflow_breeze.utils.run_utils import RunCommandResult, run_command
+
+K8S_ENV_PATH = BUILD_CACHE_DIR / ".k8s-env"
+K8S_CLUSTERS_PATH = BUILD_CACHE_DIR / ".k8s-clusters"
+K8S_BIN_BASE_PATH = K8S_ENV_PATH / "bin"
+KIND_BIN_PATH = K8S_BIN_BASE_PATH / "kind"
+KUBECTL_BIN_PATH = K8S_BIN_BASE_PATH / "kubectl"
+HELM_BIN_PATH = K8S_BIN_BASE_PATH / "helm"
+PYTHON_BIN_PATH = K8S_BIN_BASE_PATH / "python"
+SCRIPTS_CI_KUBERNETES_PATH = AIRFLOW_SOURCES_ROOT / "scripts" / "ci" / "kubernetes"
+K8S_REQUIREMENTS = SCRIPTS_CI_KUBERNETES_PATH / "k8s_requirements.txt"
+CACHED_K8S_REQUIREMENTS = K8S_ENV_PATH / "k8s_requirements.txt"
+CHART_PATH = AIRFLOW_SOURCES_ROOT / "chart"
+
+# In case of parallel runs those ports will be quickly allocated by multiple threads and closed, which
+# might mean that the port will be re-bound by parallel running thread. That's why we do not close the
+# socket here - we return it to the caller and only close the socket just before creating the cluster
+# we also add them to  the "used set" so even if another thread will get between closing the socket
+# and creating the cluster they will not reuse it and quickly close it
+
+USED_SOCKETS: Set[int] = set()
+
+
+def get_kind_cluster_name(python: str, kubernetes_version: str) -> str:
+    return f"airflow-python-{python}-{kubernetes_version}"
+
+
+def get_kubectl_cluster_name(python: str, kubernetes_version: str) -> str:
+    return f"kind-{get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)}"
+
+
+def get_config_folder(python: str, kubernetes_version: str) -> Path:
+    return K8S_CLUSTERS_PATH / get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+
+
+def get_kubeconfig_file(python: str, kubernetes_version: str) -> Path:
+    return get_config_folder(python=python, kubernetes_version=kubernetes_version) / ".kubeconfig"
+
+
+def get_kind_cluster_config_path(python: str, kubernetes_version: str) -> Path:
+    return get_config_folder(python=python, kubernetes_version=kubernetes_version) / ".kindconfig.yaml"
+
+
+def get_architecture_string_for_urls() -> str:
+    architecture, machine = get_host_architecture()
+    if architecture == Architecture.X86_64:
+        return 'amd64'
+    if architecture == Architecture.ARM:
+        return 'arm64'
+    raise Exception(f"The architecture {architecture} is not supported when downloading kubernetes tools!")
+
+
+def _download_with_retries(num_tries, path, tool, url):
+    while num_tries:
+        try:
+            request.urlretrieve(url, str(path))
+            st = os.stat(str(path))
+            os.chmod(str(path), st.st_mode | stat.S_IEXEC)
+            break
+        except OSError as e:
+            num_tries = num_tries - 1
+            if num_tries == 0:
+                get_console().print(f"[error]Failing on max retries. Error while downloading {tool}: {e}")
+                sys.exit(1)
+            get_console().print(
+                f"[warning]Retrying: {num_tries} retries  left on error "
+                f"while downloading {tool} tool: {e}"
+            )
+            continue
+
+
+def _download_tool_if_needed(
+    tool: str,
+    version: str,
+    url: str,
+    version_flag: List[str],
+    version_pattern: str,
+    path: Path,
+    verbose: bool,
+    dry_run: bool,
+    uncompress_file: Optional[str] = None,
+):
+    expected_version = version.replace("v", "")
+    try:
+        result = run_command(
+            [str(path), *version_flag],
+            check=False,
+            verbose=verbose,
+            dry_run=dry_run,
+            capture_output=True,
+            text=True,
+        )
+        if result.returncode == 0 and not dry_run:
+            match = re.search(version_pattern, result.stdout)
+            if not match:
+                get_console().print(
+                    f"[info]No regexp match for version check in `{tool}` tool output "
+                    f"{version_pattern} in:[/]\n{result.stdout}\n"
+                    f"[info]Downloading {expected_version}."
+                )
+            else:
+                current_version = match.group(1)
+                if current_version == expected_version:
+                    get_console().print(
+                        f"[success]Good version of {tool} installed: {expected_version} in "
+                        f"{K8S_BIN_BASE_PATH}"
+                    )
+                    return
+                else:
+                    get_console().print(
+                        f"[info]Currently installed `{tool}` tool version: {current_version}. "
+                        f"Downloading {expected_version}."
+                    )
+        else:
+            get_console().print(
+                f"[warning]The version check of `{tool}` tool returned "
+                f"{result.returncode} error. Downloading {expected_version} version."
+            )
+            get_console().print(result.stdout)
+            get_console().print(result.stderr)
+    except FileNotFoundError:
+        get_console().print(
+            f"[info]The `{tool}` tool is not downloaded yet. Downloading {expected_version} version."
+        )
+    except OSError as e:
+        get_console().print(
+            f"[info]Error when running `{tool}`: {e}. "
+            f"Removing and downloading {expected_version} version."
+        )
+        try:
+            # We can add missing=ok when we go to python 3.8+
+            path.unlink()
+        except FileNotFoundError:
+            pass
+    get_console().print(f"[info]Downloading from:[/] {url}")
+    if dry_run:
+        return
+    try:
+        # we can add missing_ok when we drop Python 3.7
+        path.unlink()
+    except OSError:
+        pass
+    path.parent.mkdir(parents=True, exist_ok=True)
+    num_tries = 4
+    if not uncompress_file:
+        _download_with_retries(num_tries, path, tool, url)
+    else:
+        with tempfile.NamedTemporaryFile(delete=True) as f:
+            _download_with_retries(num_tries, Path(f.name), tool, url)
+            tgz_file = tarfile.open(f.name)
+            get_console().print(f"[info]Extracting the {uncompress_file} to {path.parent}[/]")
+            with tempfile.TemporaryDirectory() as d:
+                tgz_file.extract(uncompress_file, str(d))
+                target_file = Path(d) / uncompress_file
+                get_console().print(f"[info]Moving the {target_file.name} to {path}[/]")
+                shutil.move(str(target_file), str(path))
+
+
+def _download_kind_if_needed(verbose: bool, dry_run: bool):
+    _download_tool_if_needed(
+        tool="kind",
+        version=KIND_VERSION,
+        version_flag=["--version"],
+        version_pattern=r".*[^\d].*(\d+\.\d+\.\d+)[^\d]*.*$",
+        url=f"https://github.com/kubernetes-sigs/kind/releases/download/"
+        f"{KIND_VERSION}/kind-{get_host_os()}-{get_architecture_string_for_urls()}",
+        path=KIND_BIN_PATH,
+        verbose=verbose,
+        dry_run=dry_run,
+    )
+
+
+def _download_kubectl_if_needed(verbose: bool, dry_run: bool):
+    import requests
+
+    kubectl_version = requests.get(
+        "https://storage.googleapis.com/kubernetes-release/release/stable.txt"
+    ).text
+    _download_tool_if_needed(
+        tool="kubectl",
+        version=kubectl_version,
+        version_pattern=r".*gitVersion:[^\d].*(\d+\.\d+\.\d+)[^\d]*",
+        version_flag=["version", "--client", "--output", "yaml"],
+        url=f"https://storage.googleapis.com/kubernetes-release/release/"
+        f"{kubectl_version}/bin/{get_host_os()}/{get_architecture_string_for_urls()}/kubectl",
+        path=KUBECTL_BIN_PATH,
+        verbose=verbose,
+        dry_run=dry_run,
+    )
+
+
+def _download_helm_if_needed(verbose: bool, dry_run: bool):
+    _download_tool_if_needed(
+        tool="helm",
+        version=HELM_VERSION,
+        version_pattern=r"v(\d+\.\d+\.\d+)$",
+        version_flag=["version", "--template", "{{.Version}}"],
+        url=f"https://get.helm.sh/"
+        f"helm-{HELM_VERSION}-{get_host_os()}-{get_architecture_string_for_urls()}.tar.gz",
+        path=HELM_BIN_PATH,
+        verbose=verbose,
+        dry_run=dry_run,
+        uncompress_file=f"{get_host_os()}-{get_architecture_string_for_urls()}/helm",
+    )
+
+
+def _check_architecture_supported():
+    architecture, machine = get_host_architecture()
+    if architecture not in ALLOWED_ARCHITECTURES:
+        get_console().print(
+            f'[error]The {architecture} is not one '
+            f'of the supported: {ALLOWED_ARCHITECTURES}. The original machine: {machine}'
+        )
+        sys.exit(1)
+
+
+def make_sure_helm_installed(verbose: bool, dry_run: bool):
+    K8S_CLUSTERS_PATH.mkdir(parents=True, exist_ok=True)
+    _check_architecture_supported()
+    _download_helm_if_needed(verbose=verbose, dry_run=dry_run)
+
+
+def make_sure_kubernetes_tools_are_installed(verbose: bool, dry_run: bool):
+    K8S_CLUSTERS_PATH.mkdir(parents=True, exist_ok=True)
+    _check_architecture_supported()
+    _download_kind_if_needed(verbose=verbose, dry_run=dry_run)
+    _download_kubectl_if_needed(verbose=verbose, dry_run=dry_run)
+    _download_helm_if_needed(verbose=verbose, dry_run=dry_run)
+    new_env = os.environ.copy()
+    new_env['PATH'] = str(K8S_BIN_BASE_PATH) + os.pathsep + new_env['PATH']
+    result = run_command(
+        ["helm", "repo", "list"],
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        capture_output=True,
+        env=new_env,
+        text=True,
+    )
+    if dry_run or result.returncode == 0 and "stable" in result.stdout:
+        get_console().print("[info]Stable repo is already added")
+    else:
+        get_console().print("[info]Adding stable repo")
+        run_command(
+            ["helm", "repo", "add", "stable", "https://charts.helm.sh/stable"],
+            verbose=verbose,
+            dry_run=dry_run,
+            check=False,
+            env=new_env,
+        )
+
+
+def _requirements_changed() -> bool:
+    if not CACHED_K8S_REQUIREMENTS.exists():
+        get_console().print(
+            f'\n[warning]The K8S venv in {K8S_ENV_PATH}. has never been created. Installing it.\n'
+        )
+        return True
+    requirements_file_content = K8S_REQUIREMENTS.read_text()
+    cached_requirements_content = CACHED_K8S_REQUIREMENTS.read_text()
+    if cached_requirements_content != requirements_file_content:
+        get_console().print(
+            f'\n[warning]Requirements changed for the K8S venv in {K8S_ENV_PATH}. '
+            f'Reinstalling the venv.\n'
+        )
+        return True
+    return False
+
+
+def create_virtualenv(force: bool, verbose: bool, dry_run: bool) -> RunCommandResult:
+    K8S_CLUSTERS_PATH.mkdir(parents=True, exist_ok=True)
+    if not force and not _requirements_changed():
+        try:
+            python_command_result = run_command(
+                [str(PYTHON_BIN_PATH), "--version"],
+                verbose=verbose,
+                dry_run=dry_run,
+                check=False,
+                capture_output=True,
+            )
+            if python_command_result.returncode == 0:
+                get_console().print(f'[success]K8S Virtualenv is initialized in {K8S_ENV_PATH}')
+                return python_command_result
+        except FileNotFoundError:
+            pass
+    if force:
+        get_console().print(f'[info]Forcing initializing K8S virtualenv in {K8S_ENV_PATH}')
+    else:
+        get_console().print(f'[info]Initializing K8S virtualenv in {K8S_ENV_PATH}')
+    shutil.rmtree(K8S_ENV_PATH, ignore_errors=True)
+    venv_command_result = run_command(
+        [sys.executable, "-m", "venv", str(K8S_ENV_PATH)],
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        capture_output=True,
+    )
+    if venv_command_result.returncode != 0:
+        get_console().print(
+            f'[error]Error when initializing K8S virtualenv in {K8S_ENV_PATH}:[/]\n'
+            f'{venv_command_result.stdout}\n{venv_command_result.stderr}'
+        )
+        return venv_command_result
+    get_console().print(f'[info]Reinstalling PIP version in {K8S_ENV_PATH}')
+    pip_reinstall_result = run_command(
+        [str(PYTHON_BIN_PATH), "-m", "pip", "install", f"pip=={PIP_VERSION}"],
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        capture_output=True,
+    )
+    if pip_reinstall_result.returncode != 0:
+        get_console().print(
+            f'[error]Error when updating pip to {PIP_VERSION}:[/]\n'
+            f'{pip_reinstall_result.stdout}\n{pip_reinstall_result.stderr}'
+        )
+        return pip_reinstall_result
+    get_console().print(f'[info]Installing necessary packages in {K8S_ENV_PATH}')
+    install_packages_result = run_command(
+        [
+            str(PYTHON_BIN_PATH),
+            "-m",
+            "pip",
+            "install",
+            "-r",
+            str(K8S_REQUIREMENTS.resolve()),
+            "--constraint",
+            f"https://raw.githubusercontent.com/apache/airflow/{DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH}/"
+            f"constraints-{sys.version_info.major}.{sys.version_info.minor}.txt",
+        ],
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        capture_output=True,
+    )
+    if install_packages_result.returncode != 0:
+        get_console().print(
+            f'[error]Error when updating pip to {PIP_VERSION}:[/]\n'
+            f'{install_packages_result.stdout}\n{install_packages_result.stderr}'
+        )
+    CACHED_K8S_REQUIREMENTS.write_text(K8S_REQUIREMENTS.read_text())
+    return install_packages_result
+
+
+def run_command_with_k8s_env(
+    cmd: List[str],
+    python: str,
+    kubernetes_version: str,
+    executor: Optional[str] = None,
+    title: Optional[str] = None,
+    *,
+    check: bool = True,
+    verbose: bool = False,
+    dry_run: bool = False,
+    no_output_dump_on_exception: bool = False,
+    output: Optional[Output] = None,
+    input: Optional[str] = None,
+    **kwargs,
+) -> RunCommandResult:
+    return run_command(
+        cmd,
+        title,
+        env=get_k8s_env(python=python, kubernetes_version=kubernetes_version, executor=executor),
+        check=check,
+        verbose=verbose,
+        dry_run=dry_run,
+        no_output_dump_on_exception=no_output_dump_on_exception,
+        input=input,
+        output=output,
+        **kwargs,
+    )
+
+
+def get_k8s_env(python: str, kubernetes_version: str, executor: Optional[str] = None) -> Dict[str, str]:
+    new_env = os.environ.copy()
+    new_env['PATH'] = str(K8S_BIN_BASE_PATH) + os.pathsep + new_env['PATH']
+    new_env['KUBECONFIG'] = str(get_kubeconfig_file(python=python, kubernetes_version=kubernetes_version))
+    new_env['KINDCONFIG'] = str(
+        get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version)
+    )
+    api_server_port, web_server_port = _get_kubernetes_port_numbers(
+        python=python, kubernetes_version=kubernetes_version
+    )
+    new_env['CLUSTER_FORWARDED_PORT'] = str(web_server_port)
+    kubectl_cluster_name = get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    if executor:
+        new_env['PS1'] = f"({kubectl_cluster_name}:{executor})> "
+        new_env['EXECUTOR'] = executor
+    return new_env
+
+
+START_PORT_RANGE = 10000
+END_PORT_RANGE = 49000
+
+
+def _get_free_port() -> int:
+    while True:
+        port = random.randrange(START_PORT_RANGE, END_PORT_RANGE)
+        if port in USED_SOCKETS:
+            continue
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        try:
+            s.bind(("127.0.0.1", port))
+            s.close()
+        except OSError:
+            continue
+        finally:
+            s.close()
+        USED_SOCKETS.add(port)
+        return port
+
+
+def _get_kind_cluster_config_content(python: str, kubernetes_version: str) -> Optional[Dict[str, Any]]:
+    if not get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version).exists():
+        return None
+    import yaml
+
+    return yaml.safe_load(
+        get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version).read_text()
+    )
+
+
+def set_random_cluster_ports(python: str, kubernetes_version: str, output: Optional[Output]) -> None:
+    """
+    Creates cluster config file and returns sockets keeping the ports bound.
+    The sockets should be closed just before creating the cluster.
+    """
+    forwarded_port_number = _get_free_port()
+    api_server_port = _get_free_port()
+    get_console(output=output).print(
+        f"[info]Random ports: API: {api_server_port}, Web: {forwarded_port_number}"
+    )
+    cluster_conf_path = get_kind_cluster_config_path(python=python, kubernetes_version=kubernetes_version)
+    config = (
+        (AIRFLOW_SOURCES_ROOT / "scripts" / "ci" / "kubernetes" / "kind-cluster-conf.yaml")
+        .read_text()
+        .replace("{{FORWARDED_PORT_NUMBER}}", str(forwarded_port_number))
+        .replace("{{API_SERVER_PORT}}", str(api_server_port))
+    )
+    cluster_conf_path.write_text(config)
+    get_console(output=output).print(f"[info]Config created in {cluster_conf_path}:\n")
+    get_console(output=output).print(config)
+    get_console(output=output).print("\n")
+
+
+def _get_kubernetes_port_numbers(python: str, kubernetes_version: str) -> Tuple[int, int]:
+    conf = _get_kind_cluster_config_content(python=python, kubernetes_version=kubernetes_version)
+    if conf is None:
+        return 0, 0
+    api_server_port = conf['networking']['apiServerPort']
+    web_server_port = conf['nodes'][1]['extraPortMappings'][0]['hostPort']
+    return api_server_port, web_server_port
+
+
+def _attempt_to_connect(port_number: int, output=Optional[Output], wait_seconds: int = 0) -> bool:
+    import requests
+
+    start_time = datetime.now(timezone.utc)
+    sleep_seconds = 5
+    num_try = 1
+    while True:
+        get_console(output=output).print(f"[info]Connecting to localhost:{port_number}. Num try: {num_try}")
+        try:
+            response = requests.head(f"http://localhost:{port_number}/health")
+        except ConnectionError:
+            get_console(output=output).print(
+                f"The webserver is not yet ready at http://localhost:{port_number}/health "
+            )
+        except Exception as e:
+            get_console(output=output).print(f"[info]Error when connecting to localhost:{port_number} : {e}")
+        else:
+            if response.status_code == 200:
+                get_console(output=output).print(
+                    "[success]Established connection to webserver at "
+                    f"http://localhost:{port_number}/health and it is healthy."
+                )
+                return True
+            else:
+                get_console(output=output).print(
+                    f"[warning]Error when connecting to localhost:{port_number} "
+                    f"{response.status_code}: {response.reason}"
+                )
+        current_time = datetime.now(timezone.utc)
+        if current_time - start_time > timedelta(seconds=wait_seconds):
+            if wait_seconds > 0:
+                get_console(output=output).print(f"[error]More than {wait_seconds} passed. Exiting.")
+            return False
+        get_console(output=output).print(f"Sleeping for {sleep_seconds} seconds.")
+        sleep(sleep_seconds)
+        num_try += 1
+
+
+def print_cluster_urls(
+    python: str, kubernetes_version: str, output=Optional[Output], wait_time_in_seconds: int = 0
+):
+    api_server_port, web_server_port = _get_kubernetes_port_numbers(
+        python=python, kubernetes_version=kubernetes_version
+    )
+    get_console(output=output).print(
+        f"\n[info]KinD Cluster API server URL: [/]http://localhost:{api_server_port}"
+    )
+    if _attempt_to_connect(port_number=web_server_port, output=output, wait_seconds=wait_time_in_seconds):
+        get_console(output=output).print(
+            f"[info]Airflow Web server URL: [/]http://localhost:{web_server_port} (admin/admin)\n"
+        )
+    else:
+        get_console(output=output).print(
+            f"\n[warning]Airflow webserver is not available at port {web_server_port}. "
+            f"Run `breeze k8s deploy-airflow --python {python} --kubernetes-version {kubernetes_version}` "
+            "to (re)deploy airflow\n"
+        )
+
+
+class KubernetesPythonVersion(NamedTuple):
+    kubernetes_version: str
+    python_version: str
+
+
+def _get_k8s_python_version(
+    index: int, kubernetes_version_array: List[str], python_version_array: List[str]
+) -> KubernetesPythonVersion:
+    current_python = python_version_array[index % len(python_version_array)]
+    current_kubernetes_version = kubernetes_version_array[index % len(kubernetes_version_array)]
+    return KubernetesPythonVersion(
+        kubernetes_version=current_kubernetes_version, python_version=current_python
+    )
+
+
+def get_kubernetes_python_combos(
+    kubernetes_version_array, python_version_array
+) -> Tuple[List[str], List[str], List[KubernetesPythonVersion]]:
+    num_tests = max(len(python_version_array), len(kubernetes_version_array))
+    combos: List[KubernetesPythonVersion] = [
+        _get_k8s_python_version(i, kubernetes_version_array, python_version_array) for i in range(num_tests)
+    ]
+    combo_titles = [
+        get_kind_cluster_name(python=combo.python_version, kubernetes_version=combo.kubernetes_version)
+        for combo in combos
+    ]
+    short_combo_titles = [combo[len("airflow-python-") :] for combo in combo_titles]
+    return combo_titles, short_combo_titles, combos
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 402345f407..20f5f971d1 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -354,13 +354,7 @@ def filter_out_none(**kwargs) -> dict:
     return kwargs
 
 
-def fail_if_image_missing(image: str, verbose: bool, dry_run: bool, instruction: str) -> None:
-    skip_image_pre_commits = os.environ.get('SKIP_IMAGE_PRE_COMMITS', "false")
-    if skip_image_pre_commits[0].lower() == "t":
-        get_console().print(
-            f"[info]Skipping image check as SKIP_IMAGE_PRE_COMMITS is set to {skip_image_pre_commits}[/]"
-        )
-        sys.exit(0)
+def check_if_image_exists(image: str, verbose: bool, dry_run: bool) -> bool:
     cmd_result = run_command(
         ["docker", "inspect", image],
         stdout=subprocess.DEVNULL,
@@ -369,22 +363,30 @@ def fail_if_image_missing(image: str, verbose: bool, dry_run: bool, instruction:
         verbose=verbose,
         dry_run=dry_run,
     )
-    if cmd_result.returncode != 0:
-        print(f'[red]The image {image} is not available.[/]\n')
-        print(f"\n[yellow]Please run at the earliest convenience:[/]\n\n{instruction}\n\n")
-        sys.exit(1)
+    return cmd_result.returncode == 0
 
 
-def get_runnable_ci_image(verbose: bool, dry_run: bool) -> str:
+def get_ci_image_for_pre_commits(verbose: bool, dry_run: bool) -> str:
     github_repository = os.environ.get('GITHUB_REPOSITORY', APACHE_AIRFLOW_GITHUB_REPOSITORY)
     python_version = "3.7"
     airflow_image = f"ghcr.io/{github_repository}/{AIRFLOW_BRANCH}/ci/python{python_version}"
-    fail_if_image_missing(
+    skip_image_pre_commits = os.environ.get('SKIP_IMAGE_PRE_COMMITS', "false")
+    if skip_image_pre_commits[0].lower() == "t":
+        get_console().print(
+            f"[info]Skipping image check as SKIP_IMAGE_PRE_COMMITS is set to {skip_image_pre_commits}[/]"
+        )
+        sys.exit(0)
+    if not check_if_image_exists(
         image=airflow_image,
         verbose=verbose,
         dry_run=dry_run,
-        instruction=f"breeze ci-image build --python {python_version}",
-    )
+    ):
+        get_console().print(f'[red]The image {airflow_image} is not available.[/]\n')
+        get_console().print(
+            f"\n[yellow]Please run this to fix it:[/]\n\n"
+            f"breeze ci-image build --python {python_version}\n\n"
+        )
+        sys.exit(1)
     return airflow_image
 
 
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index e4fcfb9a80..0bcb53fd9c 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -23,6 +23,7 @@ import sys
 from enum import Enum
 
 from airflow_breeze.utils.github_actions import get_ga_output
+from airflow_breeze.utils.kubernetes_utils import get_kubernetes_python_combos
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
 
 if sys.version_info >= (3, 8):
@@ -37,22 +38,18 @@ from typing import Any, Dict, List, TypeVar
 
 from airflow_breeze.global_constants import (
     ALL_PYTHON_MAJOR_MINOR_VERSIONS,
-    CURRENT_HELM_VERSIONS,
-    CURRENT_KIND_VERSIONS,
-    CURRENT_KUBERNETES_MODES,
     CURRENT_KUBERNETES_VERSIONS,
     CURRENT_MSSQL_VERSIONS,
     CURRENT_MYSQL_VERSIONS,
     CURRENT_POSTGRES_VERSIONS,
     CURRENT_PYTHON_MAJOR_MINOR_VERSIONS,
-    DEFAULT_HELM_VERSION,
-    DEFAULT_KIND_VERSION,
-    DEFAULT_KUBERNETES_MODE,
     DEFAULT_KUBERNETES_VERSION,
     DEFAULT_MSSQL_VERSION,
     DEFAULT_MYSQL_VERSION,
     DEFAULT_POSTGRES_VERSION,
     DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+    HELM_VERSION,
+    KIND_VERSION,
     GithubEvents,
     SelectiveUnitTestTypes,
     all_selective_test_types,
@@ -281,8 +278,8 @@ class SelectiveChecks:
     default_mssql_version = DEFAULT_MSSQL_VERSION
 
     default_kubernetes_version = DEFAULT_KUBERNETES_VERSION
-    default_kind_version = DEFAULT_KIND_VERSION
-    default_helm_version = DEFAULT_HELM_VERSION
+    default_kind_version = KIND_VERSION
+    default_helm_version = HELM_VERSION
 
     @cached_property
     def default_branch(self) -> str:
@@ -317,14 +314,6 @@ class SelectiveChecks:
     def python_versions_list_as_string(self) -> str:
         return " ".join(self.python_versions)
 
-    @cached_property
-    def min_max_python_versions_as_string(self) -> str:
-        return " ".join(
-            [CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[0], CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[-1]]
-            if self._full_tests_needed
-            else [DEFAULT_PYTHON_MAJOR_MINOR_VERSION]
-        )
-
     @cached_property
     def all_python_versions(self) -> list[str]:
         return (
@@ -337,10 +326,6 @@ class SelectiveChecks:
     def all_python_versions_list_as_string(self) -> str:
         return " ".join(self.all_python_versions)
 
-    @cached_property
-    def kubernetes_modes(self):
-        return CURRENT_KUBERNETES_MODES if self._full_tests_needed else [DEFAULT_KUBERNETES_MODE]
-
     @cached_property
     def postgres_versions(self) -> list[str]:
         return CURRENT_POSTGRES_VERSIONS if self._full_tests_needed else [DEFAULT_POSTGRES_VERSION]
@@ -354,12 +339,12 @@ class SelectiveChecks:
         return CURRENT_MSSQL_VERSIONS if self._full_tests_needed else [DEFAULT_MSSQL_VERSION]
 
     @cached_property
-    def kind_versions(self) -> list[str]:
-        return CURRENT_KIND_VERSIONS
+    def kind_version(self) -> str:
+        return KIND_VERSION
 
     @cached_property
-    def helm_versions(self) -> list[str]:
-        return CURRENT_HELM_VERSIONS
+    def helm_version(self) -> str:
+        return HELM_VERSION
 
     @cached_property
     def postgres_exclude(self) -> list[dict[str, str]]:
@@ -381,18 +366,19 @@ class SelectiveChecks:
     def kubernetes_versions(self) -> list[str]:
         return CURRENT_KUBERNETES_VERSIONS if self._full_tests_needed else [DEFAULT_KUBERNETES_VERSION]
 
-    @cached_property
-    def min_max_kubernetes_versions_as_string(self) -> str:
-        return " ".join(
-            [CURRENT_KUBERNETES_VERSIONS[0], CURRENT_KUBERNETES_VERSIONS[-1]]
-            if self._full_tests_needed
-            else [DEFAULT_KUBERNETES_VERSION]
-        )
-
     @cached_property
     def kubernetes_versions_list_as_string(self) -> str:
         return " ".join(self.kubernetes_versions)
 
+    @cached_property
+    def kubernetes_combos(self) -> str:
+        python_version_array: list[str] = self.python_versions_list_as_string.split(" ")
+        kubernetes_version_array: list[str] = self.kubernetes_versions_list_as_string.split(" ")
+        combo_titles, short_combo_titles, combos = get_kubernetes_python_combos(
+            kubernetes_version_array, python_version_array
+        )
+        return " ".join(short_combo_titles)
+
     def _match_files_with_regexps(self, matched_files, regexps):
         for file in self._files:
             for regexp in regexps:
diff --git a/dev/breeze/tests/test_host_info_utils.py b/dev/breeze/tests/test_host_info_utils.py
index abe5a1eaf1..079b4070e3 100644
--- a/dev/breeze/tests/test_host_info_utils.py
+++ b/dev/breeze/tests/test_host_info_utils.py
@@ -17,7 +17,7 @@
 
 from airflow_breeze.utils import host_info_utils
 
-SUPPORTED_OS = ['Linux', 'Darwin', 'Windows']
+SUPPORTED_OS = ['linux', 'darwin', 'windows']
 
 
 def test_get_host_os():
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index bc9f823c00..76cc498a9c 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -17,6 +17,19 @@ ci-image:b1c7a3c6dfa72b127fac559dcfdbb0d3
 cleanup:9bf46a1dfd9db4fe13a1c233ad1bb96b
 compile-www-assets:23675c1862d0968cbff6ab6f1d93d488
 exec:89b81bc34d45b0fe6653a6db5482258c
+k8s:build-k8s-image:0aa138f48c82fde2d12f76599803591c
+k8s:configure-cluster:a9339f650182fc2cb0f63b69a809162b
+k8s:create-cluster:2c49dfd097f8b7395b660169c2c6d1f0
+k8s:delete-cluster:1df7ec4a7d5ad8e723aa615093ffd196
+k8s:deploy-airflow:9dfd350351b3686a470702029c5202fb
+k8s:k9s:db569b061b9ef33968f4b1b630d9816d
+k8s:logs:e03f4fb8f982a6848ce013e1ee5cf525
+k8s:setup-env:9a04e2954ff6362eea189742b3829d70
+k8s:shell:f696bc6dc37839ab0b072ae191bb4a91
+k8s:status:792f30082d67a12c4eb847cf398ce82d
+k8s:tests:07df25b138a88a932562394d43796113
+k8s:upload-k8s-image:9d6da3554d668ebc6a7e3c9e1ad535a9
+k8s:503b525dbf5f45950a9f20dbc5fefc5d
 prod-image:build:b06e952a64e930a32f6ccec38439078f
 prod-image:pull:1aef99d8fd0706c7666170949d7ba834
 prod-image:verify:c9242a00b49e0081f34a19420e8032f5
@@ -30,13 +43,13 @@ release-management:verify-provider-packages:797e60067fc4611112527de808b5c1c1
 release-management:b633b97e7912daa45259555f3b407e63
 setup:autocomplete:9787fd9ac963e3c29e54ac53ec2b9565
 setup:config:92653afc11889e1b78e3a2e38f41107f
-setup:regenerate-command-images:072427bef0d0774f8cc135314d649315
+setup:regenerate-command-images:861bb8703c071508f342b79fd9a2c01a
 setup:self-upgrade:d02f70c7a230eae3463ceec2056b63fa
 setup:version:d11da4c17a23179830079b646160149c
-setup:5808681875b6b8c9bb0cb026b280c408
+setup:09e876968e669155b4aae7423a19e7b2
 shell:c24408a5fa0dc8e5405449d02ad88e29
 start-airflow:17b93add6c8ea218e9e5f0e0360d59ac
-static-checks:30c7b614c69fd3ec712db8e3fa57c3da
+static-checks:97d324104420f051378f372d8c589d9a
 stop:8ebd8a42f1003495d37b884de5ac7ce6
 testing:docker-compose-tests:3e07be65e30219930d3c62a593dd8c6a
 testing:helm-tests:66894434df46efe2f51bcb6dd168992d
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index 6a92b13614..b1389d4363 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 1050.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1074.8" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,205 +19,209 @@
         font-weight: 700;
     }
 
-    .terminal-612373463-matrix {
+    .terminal-1871393746-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-612373463-title {
+    .terminal-1871393746-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-612373463-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-612373463-r2 { fill: #c5c8c6 }
-.terminal-612373463-r3 { fill: #d0b344;font-weight: bold }
-.terminal-612373463-r4 { fill: #68a0b3;font-weight: bold }
-.terminal-612373463-r5 { fill: #868887 }
-.terminal-612373463-r6 { fill: #98a84b;font-weight: bold }
-.terminal-612373463-r7 { fill: #8d7b39 }
+    .terminal-1871393746-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-1871393746-r2 { fill: #c5c8c6 }
+.terminal-1871393746-r3 { fill: #d0b344;font-weight: bold }
+.terminal-1871393746-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-1871393746-r5 { fill: #868887 }
+.terminal-1871393746-r6 { fill: #98a84b;font-weight: bold }
+.terminal-1871393746-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-612373463-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="999.4" />
+    <clipPath id="terminal-1871393746-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1023.8" />
     </clipPath>
-    <clipPath id="terminal-612373463-line-0">
+    <clipPath id="terminal-1871393746-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-1">
+<clipPath id="terminal-1871393746-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-2">
+<clipPath id="terminal-1871393746-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-3">
+<clipPath id="terminal-1871393746-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-4">
+<clipPath id="terminal-1871393746-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-5">
+<clipPath id="terminal-1871393746-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-6">
+<clipPath id="terminal-1871393746-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-7">
+<clipPath id="terminal-1871393746-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-8">
+<clipPath id="terminal-1871393746-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-9">
+<clipPath id="terminal-1871393746-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-10">
+<clipPath id="terminal-1871393746-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-11">
+<clipPath id="terminal-1871393746-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-12">
+<clipPath id="terminal-1871393746-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-13">
+<clipPath id="terminal-1871393746-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-14">
+<clipPath id="terminal-1871393746-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-15">
+<clipPath id="terminal-1871393746-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-16">
+<clipPath id="terminal-1871393746-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-17">
+<clipPath id="terminal-1871393746-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-18">
+<clipPath id="terminal-1871393746-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-19">
+<clipPath id="terminal-1871393746-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-20">
+<clipPath id="terminal-1871393746-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-21">
+<clipPath id="terminal-1871393746-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-22">
+<clipPath id="terminal-1871393746-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-23">
+<clipPath id="terminal-1871393746-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-24">
+<clipPath id="terminal-1871393746-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-25">
+<clipPath id="terminal-1871393746-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-26">
+<clipPath id="terminal-1871393746-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-27">
+<clipPath id="terminal-1871393746-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-28">
+<clipPath id="terminal-1871393746-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-29">
+<clipPath id="terminal-1871393746-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-30">
+<clipPath id="terminal-1871393746-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-31">
+<clipPath id="terminal-1871393746-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-32">
+<clipPath id="terminal-1871393746-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-33">
+<clipPath id="terminal-1871393746-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-34">
+<clipPath id="terminal-1871393746-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-35">
+<clipPath id="terminal-1871393746-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-36">
+<clipPath id="terminal-1871393746-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-37">
+<clipPath id="terminal-1871393746-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-38">
+<clipPath id="terminal-1871393746-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-612373463-line-39">
+<clipPath id="terminal-1871393746-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-1871393746-line-40">
+    <rect x="0" y="977.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="1048.4" rx="8"/><text class="terminal-612373463-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;commands</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1072.8" rx="8"/><text class="terminal-1871393746-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;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"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-612373463-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-1871393746-clip-terminal)">
     
-    <g class="terminal-612373463-matrix">
-    <text class="terminal-612373463-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-612373463-line-0)">
-</text><text class="terminal-612373463-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-612373463-line-1)">Usage:&#160;</text><text class="terminal-612373463-r1" x="97.6" y="44.4" textLength="97.6" clip-path="url(#terminal-612373463-line-1)">breeze&#160;[</text><text class="terminal-612373463-r4" x="195.2" y="44.4" textLength="85.4" clip-path="url(#terminal-612373463-line-1)">OPTIONS</text><text class="terminal-612373463-r1" x="280.6" y="44.4" textLength="24.4" clip-path= [...]
-</text><text class="terminal-612373463-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-612373463-line-2)">
-</text><text class="terminal-612373463-r5" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-612373463-line-3)">╭─</text><text class="terminal-612373463-r5" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-612373463-line-3)">&#160;Basic&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-612373463-r5" x="1439.6" y="93.2" textLength="24.4" clip-path="url(#terminal-61237346 [...]
-</text><text class="terminal-612373463-r5" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-612373463-line-4)">│</text><text class="terminal-612373463-r4" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-612373463-line-4)">-</text><text class="terminal-612373463-r4" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-612373463-line-4)">-python</text><text class="terminal-612373463-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-612373463- [...]
-</text><text class="terminal-612373463-r5" x="0" y="142" textLength="12.2" clip-path="url(#terminal-612373463-line-5)">│</text><text class="terminal-612373463-r5" x="353.8" y="142" textLength="732" clip-path="url(#terminal-612373463-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-612373463-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-612373463-line-6)">│</text><text class="terminal-612373463-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-612373463-line-6)">-</text><text class="terminal-612373463-r4" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-612373463-line-6)">-backend</text><text class="terminal-612373463-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-612373463 [...]
-</text><text class="terminal-612373463-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-612373463-line-7)">│</text><text class="terminal-612373463-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-612373463-line-7)">-</text><text class="terminal-612373463-r4" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-612373463-line-7)">-postgres</text><text class="terminal-612373463-r4" x="146.4" y="190.8" textLength="97.6" clip-path="url(#terminal-61237 [...]
-</text><text class="terminal-612373463-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-612373463-line-8)">│</text><text class="terminal-612373463-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-612373463-line-8)">-</text><text class="terminal-612373463-r4" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-612373463-line-8)">-mysql</text><text class="terminal-612373463-r4" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-612373463 [...]
-</text><text class="terminal-612373463-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-612373463-line-9)">│</text><text class="terminal-612373463-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-612373463-line-9)">-</text><text class="terminal-612373463-r4" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-612373463-line-9)">-mssql</text><text class="terminal-612373463-r4" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-612373463 [...]
-</text><text class="terminal-612373463-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-612373463-line-10)">│</text><text class="terminal-612373463-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-612373463-line-10)">-</text><text class="terminal-612373463-r4" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-612373463-line-10)">-integration</text><text class="terminal-612373463-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#terminal-61237 [...]
-</text><text class="terminal-612373463-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-612373463-line-11)">│</text><text class="terminal-612373463-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-612373463-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-612373463-r5" x="1451.8 [...]
-</text><text class="terminal-612373463-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-612373463-line-12)">│</text><text class="terminal-612373463-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-612373463-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-612373463-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-612373463-line-13)">│</text><text class="terminal-612373463-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-612373463-line-13)">-</text><text class="terminal-612373463-r4" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-612373463-line-13)">-forward</text><text class="terminal-612373463-r4" x="134.2" y="337.2" textLength="146.4" clip-path="url(#terminal-612 [...]
-</text><text class="terminal-612373463-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-612373463-line-14)">│</text><text class="terminal-612373463-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-612373463-line-14)">-</text><text class="terminal-612373463-r4" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-612373463-line-14)">-db</text><text class="terminal-612373463-r4" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-612373463- [...]
-</text><text class="terminal-612373463-r5" x="0" y="386" textLength="1464" clip-path="url(#terminal-612373463-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-612373463-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-612373463-line-15)">
-</text><text class="terminal-612373463-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-612373463-line-16)">╭─</text><text class="terminal-612373463-r5" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-612373463-line-16)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-612373463-r5" x="1439.6" y="410.4" textLength="24.4" clip-path="url(#terminal-612 [...]
-</text><text class="terminal-612373463-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-612373463-line-17)">│</text><text class="terminal-612373463-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-612373463-line-17)">-</text><text class="terminal-612373463-r4" x="36.6" y="434.8" textLength="97.6" clip-path="url(#terminal-612373463-line-17)">-verbose</text><text class="terminal-612373463-r6" x="280.6" y="434.8" textLength="24.4" clip-path="url(#terminal-6123 [...]
-</text><text class="terminal-612373463-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-612373463-line-18)">│</text><text class="terminal-612373463-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-612373463-line-18)">-</text><text class="terminal-612373463-r4" x="36.6" y="459.2" textLength="48.8" clip-path="url(#terminal-612373463-line-18)">-dry</text><text class="terminal-612373463-r4" x="85.4" y="459.2" textLength="48.8" clip-path="url(#terminal-612373463 [...]
-</text><text class="terminal-612373463-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-612373463-line-19)">│</text><text class="terminal-612373463-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-612373463-line-19)">-</text><text class="terminal-612373463-r4" x="36.6" y="483.6" textLength="85.4" clip-path="url(#terminal-612373463-line-19)">-github</text><text class="terminal-612373463-r4" x="122" y="483.6" textLength="134.2" clip-path="url(#terminal-612373 [...]
-</text><text class="terminal-612373463-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-612373463-line-20)">│</text><text class="terminal-612373463-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-612373463-line-20)">-</text><text class="terminal-612373463-r4" x="36.6" y="508" textLength="85.4" clip-path="url(#terminal-612373463-line-20)">-answer</text><text class="terminal-612373463-r6" x="280.6" y="508" textLength="24.4" clip-path="url(#terminal-612373463-lin [...]
-</text><text class="terminal-612373463-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-612373463-line-21)">│</text><text class="terminal-612373463-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-612373463-line-21)">-</text><text class="terminal-612373463-r4" x="36.6" y="532.4" textLength="61" clip-path="url(#terminal-612373463-line-21)">-help</text><text class="terminal-612373463-r6" x="280.6" y="532.4" textLength="24.4" clip-path="url(#terminal-612373463 [...]
-</text><text class="terminal-612373463-r5" x="0" y="556.8" textLength="1464" clip-path="url(#terminal-612373463-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-612373463-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-612373463-line-22)">
-</text><text class="terminal-612373463-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#terminal-612373463-line-23)">╭─</text><text class="terminal-612373463-r5" x="24.4" y="581.2" textLength="1415.2" clip-path="url(#terminal-612373463-line-23)">&#160;Basic&#160;developer&#160;commands&#160;──────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-612373463-r5" x="1439.6" y="581.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-612373463-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-612373463-line-24)">│</text><text class="terminal-612373463-r4" x="24.4" y="605.6" textLength="256.2" clip-path="url(#terminal-612373463-line-24)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-612373463-line-24)">Enter&#160;breeze&#160;environment&#160;and&#160;starts& [...]
-</text><text class="terminal-612373463-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-612373463-line-25)">│</text><text class="terminal-612373463-r4" x="24.4" y="630" textLength="256.2" clip-path="url(#terminal-612373463-line-25)">static-checks&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-612373463-line-25)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-612373463-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-612373463-line-26)">│</text><text class="terminal-612373463-r4" x="24.4" y="654.4" textLength="256.2" clip-path="url(#terminal-612373463-line-26)">build-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-612373463-line-26)">Build&#160;documentation&#160;in&#160;the [...]
-</text><text class="terminal-612373463-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-612373463-line-27)">│</text><text class="terminal-612373463-r4" x="24.4" y="678.8" textLength="256.2" clip-path="url(#terminal-612373463-line-27)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-612373463-line-27)">Stop&#160;r [...]
-</text><text class="terminal-612373463-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-612373463-line-28)">│</text><text class="terminal-612373463-r4" x="24.4" y="703.2" textLength="256.2" clip-path="url(#terminal-612373463-line-28)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-612373463-line-28)">Enter&#160;breez [...]
-</text><text class="terminal-612373463-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-612373463-line-29)">│</text><text class="terminal-612373463-r4" x="24.4" y="727.6" textLength="256.2" clip-path="url(#terminal-612373463-line-29)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-612373463-line-29)">Joins&#160; [...]
-</text><text class="terminal-612373463-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-612373463-line-30)">│</text><text class="terminal-612373463-r4" x="24.4" y="752" textLength="256.2" clip-path="url(#terminal-612373463-line-30)">compile-www-assets&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-612373463-line-30)">Compiles&#160;www&#160;assets.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-612373463-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-612373463-line-31)">│</text><text class="terminal-612373463-r4" x="24.4" y="776.4" textLength="256.2" clip-path="url(#terminal-612373463-line-31)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="305" y="776.4" textLength="805.2" clip-path="url(#terminal-612373463-line-31)">Cleans&#160;the&#160;cache& [...]
-</text><text class="terminal-612373463-r5" x="0" y="800.8" textLength="1464" clip-path="url(#terminal-612373463-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-612373463-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-612373463-line-32)">
-</text><text class="terminal-612373463-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#terminal-612373463-line-33)">╭─</text><text class="terminal-612373463-r5" x="24.4" y="825.2" textLength="1415.2" clip-path="url(#terminal-612373463-line-33)">&#160;Advanced&#160;command&#160;groups&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-612373463-r5" x="1439.6" y="825.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-612373463-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-612373463-line-34)">│</text><text class="terminal-612373463-r4" x="24.4" y="849.6" textLength="280.6" clip-path="url(#terminal-612373463-line-34)">testing&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="849.6" textLength="1110.2" clip-path="url(#terminal-612373463-line-34)">Tools&#160;t [...]
-</text><text class="terminal-612373463-r5" x="0" y="874" textLength="12.2" clip-path="url(#terminal-612373463-line-35)">│</text><text class="terminal-612373463-r4" x="24.4" y="874" textLength="280.6" clip-path="url(#terminal-612373463-line-35)">ci-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="874" textLength="597.8" clip-path="url(#terminal-612373463-line-35)">Tools&#160;that&#160;dev [...]
-</text><text class="terminal-612373463-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-612373463-line-36)">│</text><text class="terminal-612373463-r4" x="24.4" y="898.4" textLength="280.6" clip-path="url(#terminal-612373463-line-36)">prod-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="898.4" textLength="597.8" clip-path="url(#terminal-612373463-line-36)">Tools&#160;that&#160;develop [...]
-</text><text class="terminal-612373463-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-612373463-line-37)">│</text><text class="terminal-612373463-r4" x="24.4" y="922.8" textLength="280.6" clip-path="url(#terminal-612373463-line-37)">setup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="922.8" textLength="1110.2" clip-path="url(#terminal-612373463-line-37)">To [...]
-</text><text class="terminal-612373463-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-612373463-line-38)">│</text><text class="terminal-612373463-r4" x="24.4" y="947.2" textLength="280.6" clip-path="url(#terminal-612373463-line-38)">release-management&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#terminal-612373463-line-38)">Tools&#160;that&#160;release&#160;managers&#160;can&#160;use&#160;t [...]
-</text><text class="terminal-612373463-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-612373463-line-39)">│</text><text class="terminal-612373463-r4" x="24.4" y="971.6" textLength="280.6" clip-path="url(#terminal-612373463-line-39)">ci&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-612373463-r2" x="329.4" y="971.6" textLength="134.2" clip-path="url(#terminal-61237346 [...]
-</text><text class="terminal-612373463-r5" x="0" y="996" textLength="1464" clip-path="url(#terminal-612373463-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-612373463-r2" x="1464" y="996" textLength="12.2" clip-path="url(#terminal-612373463-line-40)">
+    <g class="terminal-1871393746-matrix">
+    <text class="terminal-1871393746-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1871393746-line-0)">
+</text><text class="terminal-1871393746-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1871393746-line-1)">Usage:&#160;</text><text class="terminal-1871393746-r1" x="97.6" y="44.4" textLength="97.6" clip-path="url(#terminal-1871393746-line-1)">breeze&#160;[</text><text class="terminal-1871393746-r4" x="195.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1871393746-line-1)">OPTIONS</text><text class="terminal-1871393746-r1" x="280.6" y="44.4" textLength="24.4" cli [...]
+</text><text class="terminal-1871393746-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-2)">
+</text><text class="terminal-1871393746-r5" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-1871393746-line-3)">╭─</text><text class="terminal-1871393746-r5" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-1871393746-line-3)">&#160;Basic&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1871393746-r5" x="1439.6" y="93.2" textLength="24.4" clip-path="url(#terminal-187 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-4)">│</text><text class="terminal-1871393746-r4" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-4)">-</text><text class="terminal-1871393746-r4" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-1871393746-line-4)">-python</text><text class="terminal-1871393746-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-187 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="142" textLength="12.2" clip-path="url(#terminal-1871393746-line-5)">│</text><text class="terminal-1871393746-r5" x="353.8" y="142" textLength="732" clip-path="url(#terminal-1871393746-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-6)">│</text><text class="terminal-1871393746-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-6)">-</text><text class="terminal-1871393746-r4" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-1871393746-line-6)">-backend</text><text class="terminal-1871393746-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-7)">│</text><text class="terminal-1871393746-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-7)">-</text><text class="terminal-1871393746-r4" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-1871393746-line-7)">-postgres</text><text class="terminal-1871393746-r4" x="146.4" y="190.8" textLength="97.6" clip-path="url(#termina [...]
+</text><text class="terminal-1871393746-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-8)">│</text><text class="terminal-1871393746-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-8)">-</text><text class="terminal-1871393746-r4" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-1871393746-line-8)">-mysql</text><text class="terminal-1871393746-r4" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-9)">│</text><text class="terminal-1871393746-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-9)">-</text><text class="terminal-1871393746-r4" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-1871393746-line-9)">-mssql</text><text class="terminal-1871393746-r4" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1871393746-line-10)">│</text><text class="terminal-1871393746-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-1871393746-line-10)">-</text><text class="terminal-1871393746-r4" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-1871393746-line-10)">-integration</text><text class="terminal-1871393746-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#termina [...]
+</text><text class="terminal-1871393746-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-11)">│</text><text class="terminal-1871393746-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-1871393746-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-1871393746-r5" x="1 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-12)">│</text><text class="terminal-1871393746-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-1871393746-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-13)">│</text><text class="terminal-1871393746-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-13)">-</text><text class="terminal-1871393746-r4" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-1871393746-line-13)">-forward</text><text class="terminal-1871393746-r4" x="134.2" y="337.2" textLength="146.4" clip-path="url(#termi [...]
+</text><text class="terminal-1871393746-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-14)">│</text><text class="terminal-1871393746-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-14)">-</text><text class="terminal-1871393746-r4" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-1871393746-line-14)">-db</text><text class="terminal-1871393746-r4" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-187 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="386" textLength="1464" clip-path="url(#terminal-1871393746-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1871393746-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-1871393746-line-15)">
+</text><text class="terminal-1871393746-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-1871393746-line-16)">╭─</text><text class="terminal-1871393746-r5" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-1871393746-line-16)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1871393746-r5" x="1439.6" y="410.4" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-1871393746-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-17)">│</text><text class="terminal-1871393746-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-17)">-</text><text class="terminal-1871393746-r4" x="36.6" y="434.8" textLength="97.6" clip-path="url(#terminal-1871393746-line-17)">-verbose</text><text class="terminal-1871393746-r6" x="280.6" y="434.8" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-1871393746-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-18)">│</text><text class="terminal-1871393746-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-18)">-</text><text class="terminal-1871393746-r4" x="36.6" y="459.2" textLength="48.8" clip-path="url(#terminal-1871393746-line-18)">-dry</text><text class="terminal-1871393746-r4" x="85.4" y="459.2" textLength="48.8" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-19)">│</text><text class="terminal-1871393746-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-19)">-</text><text class="terminal-1871393746-r4" x="36.6" y="483.6" textLength="85.4" clip-path="url(#terminal-1871393746-line-19)">-github</text><text class="terminal-1871393746-r4" x="122" y="483.6" textLength="134.2" clip-path="url(#terminal [...]
+</text><text class="terminal-1871393746-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1871393746-line-20)">│</text><text class="terminal-1871393746-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-1871393746-line-20)">-</text><text class="terminal-1871393746-r4" x="36.6" y="508" textLength="85.4" clip-path="url(#terminal-1871393746-line-20)">-answer</text><text class="terminal-1871393746-r6" x="280.6" y="508" textLength="24.4" clip-path="url(#terminal-187139 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-21)">│</text><text class="terminal-1871393746-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-21)">-</text><text class="terminal-1871393746-r4" x="36.6" y="532.4" textLength="61" clip-path="url(#terminal-1871393746-line-21)">-help</text><text class="terminal-1871393746-r6" x="280.6" y="532.4" textLength="24.4" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="556.8" textLength="1464" clip-path="url(#terminal-1871393746-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1871393746-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-22)">
+</text><text class="terminal-1871393746-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#terminal-1871393746-line-23)">╭─</text><text class="terminal-1871393746-r5" x="24.4" y="581.2" textLength="1415.2" clip-path="url(#terminal-1871393746-line-23)">&#160;Basic&#160;developer&#160;commands&#160;──────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1871393746-r5" x="1439.6" y="581.2" textLength="24.4" clip-path="url(#te [...]
+</text><text class="terminal-1871393746-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-24)">│</text><text class="terminal-1871393746-r4" x="24.4" y="605.6" textLength="256.2" clip-path="url(#terminal-1871393746-line-24)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-1871393746-line-24)">Enter&#160;breeze&#160;environment&#160;and&#160;s [...]
+</text><text class="terminal-1871393746-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-1871393746-line-25)">│</text><text class="terminal-1871393746-r4" x="24.4" y="630" textLength="256.2" clip-path="url(#terminal-1871393746-line-25)">static-checks&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-1871393746-line-25)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-26)">│</text><text class="terminal-1871393746-r4" x="24.4" y="654.4" textLength="256.2" clip-path="url(#terminal-1871393746-line-26)">build-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-1871393746-line-26)">Build&#160;documentation&#160;in&#1 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-27)">│</text><text class="terminal-1871393746-r4" x="24.4" y="678.8" textLength="256.2" clip-path="url(#terminal-1871393746-line-27)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-1871393746-line-27)">Stop& [...]
+</text><text class="terminal-1871393746-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-28)">│</text><text class="terminal-1871393746-r4" x="24.4" y="703.2" textLength="256.2" clip-path="url(#terminal-1871393746-line-28)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-1871393746-line-28)">Enter&#160 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-29)">│</text><text class="terminal-1871393746-r4" x="24.4" y="727.6" textLength="256.2" clip-path="url(#terminal-1871393746-line-29)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-1871393746-line-29)">Joins [...]
+</text><text class="terminal-1871393746-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1871393746-line-30)">│</text><text class="terminal-1871393746-r4" x="24.4" y="752" textLength="256.2" clip-path="url(#terminal-1871393746-line-30)">compile-www-assets&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-1871393746-line-30)">Compiles&#160;www&#160;assets.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-31)">│</text><text class="terminal-1871393746-r4" x="24.4" y="776.4" textLength="256.2" clip-path="url(#terminal-1871393746-line-31)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="305" y="776.4" textLength="805.2" clip-path="url(#terminal-1871393746-line-31)">Cleans&#160;the&#160; [...]
+</text><text class="terminal-1871393746-r5" x="0" y="800.8" textLength="1464" clip-path="url(#terminal-1871393746-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1871393746-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-32)">
+</text><text class="terminal-1871393746-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#terminal-1871393746-line-33)">╭─</text><text class="terminal-1871393746-r5" x="24.4" y="825.2" textLength="1415.2" clip-path="url(#terminal-1871393746-line-33)">&#160;Advanced&#160;command&#160;groups&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1871393746-r5" x="1439.6" y="825.2" textLength="24.4" clip-path="url(#te [...]
+</text><text class="terminal-1871393746-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-34)">│</text><text class="terminal-1871393746-r4" x="24.4" y="849.6" textLength="280.6" clip-path="url(#terminal-1871393746-line-34)">testing&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="849.6" textLength="1110.2" clip-path="url(#terminal-1871393746-line-34)">Tools& [...]
+</text><text class="terminal-1871393746-r5" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1871393746-line-35)">│</text><text class="terminal-1871393746-r4" x="24.4" y="874" textLength="280.6" clip-path="url(#terminal-1871393746-line-35)">ci-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="874" textLength="597.8" clip-path="url(#terminal-1871393746-line-35)">Tools&#160;that&#1 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-36)">│</text><text class="terminal-1871393746-r4" x="24.4" y="898.4" textLength="280.6" clip-path="url(#terminal-1871393746-line-36)">k8s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="898.4" textLength="1110.2" clip-path="url(#terminal-1871393 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1871393746-line-37)">│</text><text class="terminal-1871393746-r4" x="24.4" y="922.8" textLength="280.6" clip-path="url(#terminal-1871393746-line-37)">prod-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="922.8" textLength="597.8" clip-path="url(#terminal-1871393746-line-37)">Tools&#160;that&#160;d [...]
+</text><text class="terminal-1871393746-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1871393746-line-38)">│</text><text class="terminal-1871393746-r4" x="24.4" y="947.2" textLength="280.6" clip-path="url(#terminal-1871393746-line-38)">setup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#terminal-1871393746-line-3 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1871393746-line-39)">│</text><text class="terminal-1871393746-r4" x="24.4" y="971.6" textLength="280.6" clip-path="url(#terminal-1871393746-line-39)">release-management&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="971.6" textLength="1110.2" clip-path="url(#terminal-1871393746-line-39)">Tools&#160;that&#160;release&#160;managers&#160;can&#160;use& [...]
+</text><text class="terminal-1871393746-r5" x="0" y="996" textLength="12.2" clip-path="url(#terminal-1871393746-line-40)">│</text><text class="terminal-1871393746-r4" x="24.4" y="996" textLength="280.6" clip-path="url(#terminal-1871393746-line-40)">ci&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1871393746-r2" x="329.4" y="996" textLength="134.2" clip-path="url(#terminal-187139374 [...]
+</text><text class="terminal-1871393746-r5" x="0" y="1020.4" textLength="1464" clip-path="url(#terminal-1871393746-line-41)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1871393746-r2" x="1464" y="1020.4" textLength="12.2" clip-path="url(#terminal-1871393746-line-41)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_build-docs.svg b/images/breeze/output_build-docs.svg
index a4e3f4f4ae..3a8475c27b 100644
--- a/images/breeze/output_build-docs.svg
+++ b/images/breeze/output_build-docs.svg
@@ -35,8 +35,8 @@
     .terminal-3098417804-r1 { fill: #c5c8c6;font-weight: bold }
 .terminal-3098417804-r2 { fill: #c5c8c6 }
 .terminal-3098417804-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3098417804-r4 { fill: #868887 }
-.terminal-3098417804-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-3098417804-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3098417804-r5 { fill: #868887 }
 .terminal-3098417804-r6 { fill: #98a84b;font-weight: bold }
 .terminal-3098417804-r7 { fill: #8d7b39 }
     </style>
@@ -235,65 +235,65 @@
     
     <g class="terminal-3098417804-matrix">
     <text class="terminal-3098417804-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3098417804-line-0)">
-</text><text class="terminal-3098417804-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3098417804-line-1)">Usage:&#160;</text><text class="terminal-3098417804-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-3098417804-line-1)">breeze&#160;build-docs&#160;[OPTIONS]</text><text class="terminal-3098417804-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-1)">
+</text><text class="terminal-3098417804-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3098417804-line-1)">Usage:&#160;</text><text class="terminal-3098417804-r1" x="97.6" y="44.4" textLength="231.8" clip-path="url(#terminal-3098417804-line-1)">breeze&#160;build-docs&#160;[</text><text class="terminal-3098417804-r4" x="329.4" y="44.4" textLength="85.4" clip-path="url(#terminal-3098417804-line-1)">OPTIONS</text><text class="terminal-3098417804-r1" x="414.8" y="44.4" text [...]
 </text><text class="terminal-3098417804-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-2)">
 </text><text class="terminal-3098417804-r2" x="12.2" y="93.2" textLength="451.4" clip-path="url(#terminal-3098417804-line-3)">Build&#160;documentation&#160;in&#160;the&#160;container.</text><text class="terminal-3098417804-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-3)">
 </text><text class="terminal-3098417804-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-4)">
-</text><text class="terminal-3098417804-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3098417804-line-5)">╭─</text><text class="terminal-3098417804-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3098417804-line-5)">&#160;Doc&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3098417804-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-309841 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-6)">│</text><text class="terminal-3098417804-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-6)">-</text><text class="terminal-3098417804-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-3098417804-line-6)">-docs</text><text class="terminal-3098417804-r5" x="97.6" y="166.4" textLength="61" clip-path="url(#terminal-30984178 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-7)">│</text><text class="terminal-3098417804-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-7)">-</text><text class="terminal-3098417804-r5" x="36.6" y="190.8" textLength="134.2" clip-path="url(#terminal-3098417804-line-7)">-spellcheck</text><text class="terminal-3098417804-r5" x="170.8" y="190.8" textLength="61" clip-path="url(#termina [...]
-</text><text class="terminal-3098417804-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-8)">│</text><text class="terminal-3098417804-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-8)">-</text><text class="terminal-3098417804-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-3098417804-line-8)">-clean</text><text class="terminal-3098417804-r5" x="109.8" y="215.2" textLength="73.2" clip-path="url(#terminal-30 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-9)">│</text><text class="terminal-3098417804-r2" x="305" y="239.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-9)">before&#160;the&#160;build&#160;-&#160;useful&#160;for&#160;a&#160;clean&#160;build.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3098417804-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3098417804-line-10)">│</text><text class="terminal-3098417804-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-3098417804-line-10)">-</text><text class="terminal-3098417804-r5" x="36.6" y="264" textLength="48.8" clip-path="url(#terminal-3098417804-line-10)">-for</text><text class="terminal-3098417804-r5" x="85.4" y="264" textLength="134.2" clip-path="url(#terminal-309841780 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-11)">│</text><text class="terminal-3098417804-r5" x="305" y="288.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-11)">-</text><text class="terminal-3098417804-r5" x="317.2" y="288.4" textLength="73.2" clip-path="url(#terminal-3098417804-line-11)">-clean</text><text class="terminal-3098417804-r5" x="390.4" y="288.4" textLength="73.2" clip-path="url(#terminal [...]
-</text><text class="terminal-3098417804-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-12)">│</text><text class="terminal-3098417804-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-12)">-</text><text class="terminal-3098417804-r5" x="36.6" y="312.8" textLength="97.6" clip-path="url(#terminal-3098417804-line-12)">-package</text><text class="terminal-3098417804-r5" x="134.2" y="312.8" textLength="85.4" clip-path="url(#termin [...]
-</text><text class="terminal-3098417804-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-13)">│</text><text class="terminal-3098417804-r7" x="305" y="337.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-13)">(apache-airflow&#160;|&#160;apache-airflow-providers&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-14)">│</text><text class="terminal-3098417804-r7" x="305" y="361.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-14)">apache-airflow-providers-alibaba&#160;|&#160;apache-airflow-providers-amazon&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-3098417804-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3098417804-line-15)">│</text><text class="terminal-3098417804-r7" x="305" y="386" textLength="1134.6" clip-path="url(#terminal-3098417804-line-15)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y="386" textLength="12.2" [...]
-</text><text class="terminal-3098417804-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-16)">│</text><text class="terminal-3098417804-r7" x="305" y="410.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-16)">apache-airflow-providers-apache-drill&#160;|&#160;apache-airflow-providers-apache-druid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y="410 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-17)">│</text><text class="terminal-3098417804-r7" x="305" y="434.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-17)">apache-airflow-providers-apache-hdfs&#160;|&#160;apache-airflow-providers-apache-hive&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-18)">│</text><text class="terminal-3098417804-r7" x="305" y="459.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-18)">apache-airflow-providers-apache-kylin&#160;|&#160;apache-airflow-providers-apache-livy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y [...]
-</text><text class="terminal-3098417804-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-19)">│</text><text class="terminal-3098417804-r7" x="305" y="483.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-19)">apache-airflow-providers-apache-pig&#160;|&#160;apache-airflow-providers-apache-pinot&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3098417804-line-20)">│</text><text class="terminal-3098417804-r7" x="305" y="508" textLength="1134.6" clip-path="url(#terminal-3098417804-line-20)">apache-airflow-providers-apache-spark&#160;|&#160;apache-airflow-providers-apache-sqoop&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y="508" te [...]
-</text><text class="terminal-3098417804-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-21)">│</text><text class="terminal-3098417804-r7" x="305" y="532.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-21)">apache-airflow-providers-arangodb&#160;|&#160;apache-airflow-providers-asana&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-3098417804-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-22)">│</text><text class="terminal-3098417804-r7" x="305" y="556.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-22)">apache-airflow-providers-atlassian-jira&#160;|&#160;apache-airflow-providers-celery&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
-</text><text class="terminal-3098417804-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-23)">│</text><text class="terminal-3098417804-r7" x="305" y="581.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-23)">apache-airflow-providers-cloudant&#160;|&#160;apache-airflow-providers-cncf-kubernetes&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y [...]
-</text><text class="terminal-3098417804-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-24)">│</text><text class="terminal-3098417804-r7" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-24)">apache-airflow-providers-common-sql&#160;|&#160;apache-airflow-providers-databricks&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
-</text><text class="terminal-3098417804-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3098417804-line-25)">│</text><text class="terminal-3098417804-r7" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-3098417804-line-25)">apache-airflow-providers-datadog&#160;|&#160;apache-airflow-providers-dbt-cloud&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termi [...]
-</text><text class="terminal-3098417804-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-26)">│</text><text class="terminal-3098417804-r7" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-26)">apache-airflow-providers-dingding&#160;|&#160;apache-airflow-providers-discord&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cla [...]
-</text><text class="terminal-3098417804-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-27)">│</text><text class="terminal-3098417804-r7" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-27)">apache-airflow-providers-docker&#160;|&#160;apache-airflow-providers-elasticsearch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-28)">│</text><text class="terminal-3098417804-r7" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-28)">apache-airflow-providers-exasol&#160;|&#160;apache-airflow-providers-facebook&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-3098417804-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-29)">│</text><text class="terminal-3098417804-r7" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-29)">apache-airflow-providers-ftp&#160;|&#160;apache-airflow-providers-github&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3098417804-line-30)">│</text><text class="terminal-3098417804-r7" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-3098417804-line-30)">apache-airflow-providers-google&#160;|&#160;apache-airflow-providers-grpc&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3098417804-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-31)">│</text><text class="terminal-3098417804-r7" x="305" y="776.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-31)">apache-airflow-providers-hashicorp&#160;|&#160;apache-airflow-providers-http&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-3098417804-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-32)">│</text><text class="terminal-3098417804-r7" x="305" y="800.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-32)">apache-airflow-providers-imap&#160;|&#160;apache-airflow-providers-influxdb&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
-</text><text class="terminal-3098417804-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-33)">│</text><text class="terminal-3098417804-r7" x="305" y="825.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-33)">apache-airflow-providers-jdbc&#160;|&#160;apache-airflow-providers-jenkins&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-3098417804-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-34)">│</text><text class="terminal-3098417804-r7" x="305" y="849.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-34)">apache-airflow-providers-jira&#160;|&#160;apache-airflow-providers-microsoft-azure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-3098417804-line-35)">│</text><text class="terminal-3098417804-r7" x="305" y="874" textLength="1134.6" clip-path="url(#terminal-3098417804-line-35)">apache-airflow-providers-microsoft-mssql&#160;|&#160;apache-airflow-providers-microsoft-psrp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y="874" textLength="12.2" clip-path [...]
-</text><text class="terminal-3098417804-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-36)">│</text><text class="terminal-3098417804-r7" x="305" y="898.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-36)">apache-airflow-providers-microsoft-winrm&#160;|&#160;apache-airflow-providers-mongo&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
-</text><text class="terminal-3098417804-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-37)">│</text><text class="terminal-3098417804-r7" x="305" y="922.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-37)">apache-airflow-providers-mysql&#160;|&#160;apache-airflow-providers-neo4j&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-38)">│</text><text class="terminal-3098417804-r7" x="305" y="947.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-38)">apache-airflow-providers-odbc&#160;|&#160;apache-airflow-providers-openfaas&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
-</text><text class="terminal-3098417804-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-39)">│</text><text class="terminal-3098417804-r7" x="305" y="971.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-39)">apache-airflow-providers-opsgenie&#160;|&#160;apache-airflow-providers-oracle&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-3098417804-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-3098417804-line-40)">│</text><text class="terminal-3098417804-r7" x="305" y="996" textLength="1134.6" clip-path="url(#terminal-3098417804-line-40)">apache-airflow-providers-pagerduty&#160;|&#160;apache-airflow-providers-papermill&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-309841 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-41)">│</text><text class="terminal-3098417804-r7" x="305" y="1020.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-41)">apache-airflow-providers-plexus&#160;|&#160;apache-airflow-providers-postgres&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><t [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-42)">│</text><text class="terminal-3098417804-r7" x="305" y="1044.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-42)">apache-airflow-providers-presto&#160;|&#160;apache-airflow-providers-qubole&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-43)">│</text><text class="terminal-3098417804-r7" x="305" y="1069.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-43)">apache-airflow-providers-redis&#160;|&#160;apache-airflow-providers-salesforce&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-44)">│</text><text class="terminal-3098417804-r7" x="305" y="1093.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-44)">apache-airflow-providers-samba&#160;|&#160;apache-airflow-providers-segment&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-3098417804-line-45)">│</text><text class="terminal-3098417804-r7" x="305" y="1118" textLength="1134.6" clip-path="url(#terminal-3098417804-line-45)">apache-airflow-providers-sendgrid&#160;|&#160;apache-airflow-providers-sftp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-46)">│</text><text class="terminal-3098417804-r7" x="305" y="1142.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-46)">apache-airflow-providers-singularity&#160;|&#160;apache-airflow-providers-slack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class= [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-47)">│</text><text class="terminal-3098417804-r7" x="305" y="1166.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-47)">apache-airflow-providers-snowflake&#160;|&#160;apache-airflow-providers-sqlite&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-48)">│</text><text class="terminal-3098417804-r7" x="305" y="1191.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-48)">apache-airflow-providers-ssh&#160;|&#160;apache-airflow-providers-tableau&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-49)">│</text><text class="terminal-3098417804-r7" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-49)">apache-airflow-providers-tabular&#160;|&#160;apache-airflow-providers-telegram&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-3098417804-line-50)">│</text><text class="terminal-3098417804-r7" x="305" y="1240" textLength="1134.6" clip-path="url(#terminal-3098417804-line-50)">apache-airflow-providers-trino&#160;|&#160;apache-airflow-providers-vertica&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1264.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-51)">│</text><text class="terminal-3098417804-r7" x="305" y="1264.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-51)">apache-airflow-providers-yandex&#160;|&#160;apache-airflow-providers-zendesk&#160;|&#160;docker-stack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r4" x="1451.8" y="1264.4" tex [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-52)">│</text><text class="terminal-3098417804-r7" x="305" y="1288.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-52)">helm-chart)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1313.2" textLength="1464" clip-path="url(#terminal-3098417804-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3098417804-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-53)">
-</text><text class="terminal-3098417804-r4" x="0" y="1337.6" textLength="24.4" clip-path="url(#terminal-3098417804-line-54)">╭─</text><text class="terminal-3098417804-r4" x="24.4" y="1337.6" textLength="1415.2" clip-path="url(#terminal-3098417804-line-54)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3098417804-r4" x="1439.6" y="1337.6" textLength="24.4" clip-path="url(#term [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-3098417804-line-55)">│</text><text class="terminal-3098417804-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#terminal-3098417804-line-55)">-</text><text class="terminal-3098417804-r5" x="36.6" y="1362" textLength="97.6" clip-path="url(#terminal-3098417804-line-55)">-verbose</text><text class="terminal-3098417804-r6" x="280.6" y="1362" textLength="24.4" clip-path="url(#terminal-3 [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-56)">│</text><text class="terminal-3098417804-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-56)">-</text><text class="terminal-3098417804-r5" x="36.6" y="1386.4" textLength="48.8" clip-path="url(#terminal-3098417804-line-56)">-dry</text><text class="terminal-3098417804-r5" x="85.4" y="1386.4" textLength="48.8" clip-path="url(#termina [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-57)">│</text><text class="terminal-3098417804-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-57)">-</text><text class="terminal-3098417804-r5" x="36.6" y="1410.8" textLength="85.4" clip-path="url(#terminal-3098417804-line-57)">-github</text><text class="terminal-3098417804-r5" x="122" y="1410.8" textLength="134.2" clip-path="url(#term [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-58)">│</text><text class="terminal-3098417804-r5" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-58)">-</text><text class="terminal-3098417804-r5" x="36.6" y="1435.2" textLength="61" clip-path="url(#terminal-3098417804-line-58)">-help</text><text class="terminal-3098417804-r6" x="280.6" y="1435.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-3098417804-r4" x="0" y="1459.6" textLength="1464" clip-path="url(#terminal-3098417804-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3098417804-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-59)">
+</text><text class="terminal-3098417804-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3098417804-line-5)">╭─</text><text class="terminal-3098417804-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3098417804-line-5)">&#160;Doc&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3098417804-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-309841 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-6)">│</text><text class="terminal-3098417804-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-6)">-</text><text class="terminal-3098417804-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-3098417804-line-6)">-docs</text><text class="terminal-3098417804-r4" x="97.6" y="166.4" textLength="61" clip-path="url(#terminal-30984178 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-7)">│</text><text class="terminal-3098417804-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-7)">-</text><text class="terminal-3098417804-r4" x="36.6" y="190.8" textLength="134.2" clip-path="url(#terminal-3098417804-line-7)">-spellcheck</text><text class="terminal-3098417804-r4" x="170.8" y="190.8" textLength="61" clip-path="url(#termina [...]
+</text><text class="terminal-3098417804-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-8)">│</text><text class="terminal-3098417804-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-8)">-</text><text class="terminal-3098417804-r4" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-3098417804-line-8)">-clean</text><text class="terminal-3098417804-r4" x="109.8" y="215.2" textLength="73.2" clip-path="url(#terminal-30 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-9)">│</text><text class="terminal-3098417804-r2" x="305" y="239.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-9)">before&#160;the&#160;build&#160;-&#160;useful&#160;for&#160;a&#160;clean&#160;build.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3098417804-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3098417804-line-10)">│</text><text class="terminal-3098417804-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-3098417804-line-10)">-</text><text class="terminal-3098417804-r4" x="36.6" y="264" textLength="48.8" clip-path="url(#terminal-3098417804-line-10)">-for</text><text class="terminal-3098417804-r4" x="85.4" y="264" textLength="134.2" clip-path="url(#terminal-309841780 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-11)">│</text><text class="terminal-3098417804-r4" x="305" y="288.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-11)">-</text><text class="terminal-3098417804-r4" x="317.2" y="288.4" textLength="73.2" clip-path="url(#terminal-3098417804-line-11)">-clean</text><text class="terminal-3098417804-r4" x="390.4" y="288.4" textLength="73.2" clip-path="url(#terminal [...]
+</text><text class="terminal-3098417804-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-12)">│</text><text class="terminal-3098417804-r4" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-12)">-</text><text class="terminal-3098417804-r4" x="36.6" y="312.8" textLength="97.6" clip-path="url(#terminal-3098417804-line-12)">-package</text><text class="terminal-3098417804-r4" x="134.2" y="312.8" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-3098417804-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-13)">│</text><text class="terminal-3098417804-r7" x="305" y="337.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-13)">(apache-airflow&#160;|&#160;apache-airflow-providers&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-14)">│</text><text class="terminal-3098417804-r7" x="305" y="361.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-14)">apache-airflow-providers-alibaba&#160;|&#160;apache-airflow-providers-amazon&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
+</text><text class="terminal-3098417804-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3098417804-line-15)">│</text><text class="terminal-3098417804-r7" x="305" y="386" textLength="1134.6" clip-path="url(#terminal-3098417804-line-15)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y="386" textLength="12.2" [...]
+</text><text class="terminal-3098417804-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-16)">│</text><text class="terminal-3098417804-r7" x="305" y="410.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-16)">apache-airflow-providers-apache-drill&#160;|&#160;apache-airflow-providers-apache-druid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y="410 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-17)">│</text><text class="terminal-3098417804-r7" x="305" y="434.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-17)">apache-airflow-providers-apache-hdfs&#160;|&#160;apache-airflow-providers-apache-hive&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-18)">│</text><text class="terminal-3098417804-r7" x="305" y="459.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-18)">apache-airflow-providers-apache-kylin&#160;|&#160;apache-airflow-providers-apache-livy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y [...]
+</text><text class="terminal-3098417804-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-19)">│</text><text class="terminal-3098417804-r7" x="305" y="483.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-19)">apache-airflow-providers-apache-pig&#160;|&#160;apache-airflow-providers-apache-pinot&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3098417804-line-20)">│</text><text class="terminal-3098417804-r7" x="305" y="508" textLength="1134.6" clip-path="url(#terminal-3098417804-line-20)">apache-airflow-providers-apache-spark&#160;|&#160;apache-airflow-providers-apache-sqoop&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y="508" te [...]
+</text><text class="terminal-3098417804-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-21)">│</text><text class="terminal-3098417804-r7" x="305" y="532.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-21)">apache-airflow-providers-arangodb&#160;|&#160;apache-airflow-providers-asana&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
+</text><text class="terminal-3098417804-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-22)">│</text><text class="terminal-3098417804-r7" x="305" y="556.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-22)">apache-airflow-providers-atlassian-jira&#160;|&#160;apache-airflow-providers-celery&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
+</text><text class="terminal-3098417804-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-23)">│</text><text class="terminal-3098417804-r7" x="305" y="581.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-23)">apache-airflow-providers-cloudant&#160;|&#160;apache-airflow-providers-cncf-kubernetes&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y [...]
+</text><text class="terminal-3098417804-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-24)">│</text><text class="terminal-3098417804-r7" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-24)">apache-airflow-providers-common-sql&#160;|&#160;apache-airflow-providers-databricks&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
+</text><text class="terminal-3098417804-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3098417804-line-25)">│</text><text class="terminal-3098417804-r7" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-3098417804-line-25)">apache-airflow-providers-datadog&#160;|&#160;apache-airflow-providers-dbt-cloud&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termi [...]
+</text><text class="terminal-3098417804-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-26)">│</text><text class="terminal-3098417804-r7" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-26)">apache-airflow-providers-dingding&#160;|&#160;apache-airflow-providers-discord&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cla [...]
+</text><text class="terminal-3098417804-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-27)">│</text><text class="terminal-3098417804-r7" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-27)">apache-airflow-providers-docker&#160;|&#160;apache-airflow-providers-elasticsearch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-28)">│</text><text class="terminal-3098417804-r7" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-28)">apache-airflow-providers-exasol&#160;|&#160;apache-airflow-providers-facebook&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-3098417804-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-29)">│</text><text class="terminal-3098417804-r7" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-29)">apache-airflow-providers-ftp&#160;|&#160;apache-airflow-providers-github&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3098417804-line-30)">│</text><text class="terminal-3098417804-r7" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-3098417804-line-30)">apache-airflow-providers-google&#160;|&#160;apache-airflow-providers-grpc&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3098417804-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-31)">│</text><text class="terminal-3098417804-r7" x="305" y="776.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-31)">apache-airflow-providers-hashicorp&#160;|&#160;apache-airflow-providers-http&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
+</text><text class="terminal-3098417804-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-32)">│</text><text class="terminal-3098417804-r7" x="305" y="800.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-32)">apache-airflow-providers-imap&#160;|&#160;apache-airflow-providers-influxdb&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
+</text><text class="terminal-3098417804-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-33)">│</text><text class="terminal-3098417804-r7" x="305" y="825.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-33)">apache-airflow-providers-jdbc&#160;|&#160;apache-airflow-providers-jenkins&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3098417804-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-34)">│</text><text class="terminal-3098417804-r7" x="305" y="849.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-34)">apache-airflow-providers-jira&#160;|&#160;apache-airflow-providers-microsoft-azure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="874" textLength="12.2" clip-path="url(#terminal-3098417804-line-35)">│</text><text class="terminal-3098417804-r7" x="305" y="874" textLength="1134.6" clip-path="url(#terminal-3098417804-line-35)">apache-airflow-providers-microsoft-mssql&#160;|&#160;apache-airflow-providers-microsoft-psrp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y="874" textLength="12.2" clip-path [...]
+</text><text class="terminal-3098417804-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-36)">│</text><text class="terminal-3098417804-r7" x="305" y="898.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-36)">apache-airflow-providers-microsoft-winrm&#160;|&#160;apache-airflow-providers-mongo&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r [...]
+</text><text class="terminal-3098417804-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-37)">│</text><text class="terminal-3098417804-r7" x="305" y="922.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-37)">apache-airflow-providers-mysql&#160;|&#160;apache-airflow-providers-neo4j&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-38)">│</text><text class="terminal-3098417804-r7" x="305" y="947.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-38)">apache-airflow-providers-odbc&#160;|&#160;apache-airflow-providers-openfaas&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
+</text><text class="terminal-3098417804-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-39)">│</text><text class="terminal-3098417804-r7" x="305" y="971.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-39)">apache-airflow-providers-opsgenie&#160;|&#160;apache-airflow-providers-oracle&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-3098417804-r5" x="0" y="996" textLength="12.2" clip-path="url(#terminal-3098417804-line-40)">│</text><text class="terminal-3098417804-r7" x="305" y="996" textLength="1134.6" clip-path="url(#terminal-3098417804-line-40)">apache-airflow-providers-pagerduty&#160;|&#160;apache-airflow-providers-papermill&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-309841 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-41)">│</text><text class="terminal-3098417804-r7" x="305" y="1020.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-41)">apache-airflow-providers-plexus&#160;|&#160;apache-airflow-providers-postgres&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><t [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-42)">│</text><text class="terminal-3098417804-r7" x="305" y="1044.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-42)">apache-airflow-providers-presto&#160;|&#160;apache-airflow-providers-qubole&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-43)">│</text><text class="terminal-3098417804-r7" x="305" y="1069.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-43)">apache-airflow-providers-redis&#160;|&#160;apache-airflow-providers-salesforce&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-44)">│</text><text class="terminal-3098417804-r7" x="305" y="1093.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-44)">apache-airflow-providers-samba&#160;|&#160;apache-airflow-providers-segment&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-3098417804-line-45)">│</text><text class="terminal-3098417804-r7" x="305" y="1118" textLength="1134.6" clip-path="url(#terminal-3098417804-line-45)">apache-airflow-providers-sendgrid&#160;|&#160;apache-airflow-providers-sftp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-46)">│</text><text class="terminal-3098417804-r7" x="305" y="1142.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-46)">apache-airflow-providers-singularity&#160;|&#160;apache-airflow-providers-slack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class= [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-47)">│</text><text class="terminal-3098417804-r7" x="305" y="1166.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-47)">apache-airflow-providers-snowflake&#160;|&#160;apache-airflow-providers-sqlite&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-48)">│</text><text class="terminal-3098417804-r7" x="305" y="1191.2" textLength="1134.6" clip-path="url(#terminal-3098417804-line-48)">apache-airflow-providers-ssh&#160;|&#160;apache-airflow-providers-tableau&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-49)">│</text><text class="terminal-3098417804-r7" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-3098417804-line-49)">apache-airflow-providers-tabular&#160;|&#160;apache-airflow-providers-telegram&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-3098417804-line-50)">│</text><text class="terminal-3098417804-r7" x="305" y="1240" textLength="1134.6" clip-path="url(#terminal-3098417804-line-50)">apache-airflow-providers-trino&#160;|&#160;apache-airflow-providers-vertica&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-51)">│</text><text class="terminal-3098417804-r7" x="305" y="1264.4" textLength="1134.6" clip-path="url(#terminal-3098417804-line-51)">apache-airflow-providers-yandex&#160;|&#160;apache-airflow-providers-zendesk&#160;|&#160;docker-stack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3098417804-r5" x="1451.8" y="1264.4" tex [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-52)">│</text><text class="terminal-3098417804-r7" x="305" y="1288.8" textLength="1134.6" clip-path="url(#terminal-3098417804-line-52)">helm-chart)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1313.2" textLength="1464" clip-path="url(#terminal-3098417804-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3098417804-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-53)">
+</text><text class="terminal-3098417804-r5" x="0" y="1337.6" textLength="24.4" clip-path="url(#terminal-3098417804-line-54)">╭─</text><text class="terminal-3098417804-r5" x="24.4" y="1337.6" textLength="1415.2" clip-path="url(#terminal-3098417804-line-54)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3098417804-r5" x="1439.6" y="1337.6" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-3098417804-line-55)">│</text><text class="terminal-3098417804-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#terminal-3098417804-line-55)">-</text><text class="terminal-3098417804-r4" x="36.6" y="1362" textLength="97.6" clip-path="url(#terminal-3098417804-line-55)">-verbose</text><text class="terminal-3098417804-r6" x="280.6" y="1362" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-56)">│</text><text class="terminal-3098417804-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#terminal-3098417804-line-56)">-</text><text class="terminal-3098417804-r4" x="36.6" y="1386.4" textLength="48.8" clip-path="url(#terminal-3098417804-line-56)">-dry</text><text class="terminal-3098417804-r4" x="85.4" y="1386.4" textLength="48.8" clip-path="url(#termina [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-57)">│</text><text class="terminal-3098417804-r4" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-3098417804-line-57)">-</text><text class="terminal-3098417804-r4" x="36.6" y="1410.8" textLength="85.4" clip-path="url(#terminal-3098417804-line-57)">-github</text><text class="terminal-3098417804-r4" x="122" y="1410.8" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-58)">│</text><text class="terminal-3098417804-r4" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-3098417804-line-58)">-</text><text class="terminal-3098417804-r4" x="36.6" y="1435.2" textLength="61" clip-path="url(#terminal-3098417804-line-58)">-help</text><text class="terminal-3098417804-r6" x="280.6" y="1435.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3098417804-r5" x="0" y="1459.6" textLength="1464" clip-path="url(#terminal-3098417804-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3098417804-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#terminal-3098417804-line-59)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_k8s.svg b/images/breeze/output_k8s.svg
new file mode 100644
index 0000000000..0a6e1a63d6
--- /dev/null
+++ b/images/breeze/output_k8s.svg
@@ -0,0 +1,175 @@
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .terminal-343177163-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-343177163-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-343177163-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-343177163-r2 { fill: #c5c8c6 }
+.terminal-343177163-r3 { fill: #d0b344;font-weight: bold }
+.terminal-343177163-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-343177163-r5 { fill: #868887 }
+.terminal-343177163-r6 { fill: #98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-343177163-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
+    </clipPath>
+    <clipPath id="terminal-343177163-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-343177163-line-27">
+    <rect x="0" y="660.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="755.6" rx="8"/><text class="terminal-343177163-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</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(#terminal-343177163-clip-terminal)">
+    
+    <g class="terminal-343177163-matrix">
+    <text class="terminal-343177163-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-343177163-line-0)">
+</text><text class="terminal-343177163-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-343177163-line-1)">Usage:&#160;</text><text class="terminal-343177163-r1" x="97.6" y="44.4" textLength="146.4" clip-path="url(#terminal-343177163-line-1)">breeze&#160;k8s&#160;[</text><text class="terminal-343177163-r4" x="244" y="44.4" textLength="85.4" clip-path="url(#terminal-343177163-line-1)">OPTIONS</text><text class="terminal-343177163-r1" x="329.4" y="44.4" textLength="24.4" cl [...]
+</text><text class="terminal-343177163-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-343177163-line-2)">
+</text><text class="terminal-343177163-r2" x="12.2" y="93.2" textLength="597.8" clip-path="url(#terminal-343177163-line-3)">Tools&#160;that&#160;developers&#160;use&#160;to&#160;run&#160;Kubernetes&#160;tests</text><text class="terminal-343177163-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-343177163-line-3)">
+</text><text class="terminal-343177163-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-343177163-line-4)">
+</text><text class="terminal-343177163-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-343177163-line-5)">╭─</text><text class="terminal-343177163-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-343177163-line-5)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-343177163-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-343177163-l [...]
+</text><text class="terminal-343177163-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-343177163-line-6)">│</text><text class="terminal-343177163-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-343177163-line-6)">-</text><text class="terminal-343177163-r4" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-343177163-line-6)">-help</text><text class="terminal-343177163-r6" x="122" y="166.4" textLength="24.4" clip-path="url(#terminal-343177163-line [...]
+</text><text class="terminal-343177163-r5" x="0" y="190.8" textLength="1464" clip-path="url(#terminal-343177163-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-343177163-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-343177163-line-7)">
+</text><text class="terminal-343177163-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-343177163-line-8)">╭─</text><text class="terminal-343177163-r5" x="24.4" y="215.2" textLength="1415.2" clip-path="url(#terminal-343177163-line-8)">&#160;K8S&#160;cluster&#160;management&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-343177163-r5" x="1439.6" y="215.2" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-343177163-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-343177163-line-9)">│</text><text class="terminal-343177163-r4" x="24.4" y="239.6" textLength="207.4" clip-path="url(#terminal-343177163-line-9)">setup-env&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="256.2" y="239.6" textLength="1183.4" clip-path="url(#terminal-343177163-line-9)">Setup&#160;shared&#160;Kubernetes&#160;virtual&#160;environme [...]
+</text><text class="terminal-343177163-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-343177163-line-10)">│</text><text class="terminal-343177163-r4" x="24.4" y="264" textLength="207.4" clip-path="url(#terminal-343177163-line-10)">create-cluster&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="256.2" y="264" textLength="1183.4" clip-path="url(#terminal-343177163-line-10)">Create&#160;a&#160;KinD&#160;Cluster&#160;for&#160;Python&#160;and&#160;Kubernetes&#160;v [...]
+</text><text class="terminal-343177163-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-343177163-line-11)">│</text><text class="terminal-343177163-r2" x="256.2" y="288.4" textLength="1183.4" clip-path="url(#terminal-343177163-line-11)">in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-343177163-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-343177163-line-12)">│</text><text class="terminal-343177163-r4" x="24.4" y="312.8" textLength="207.4" clip-path="url(#terminal-343177163-line-12)">build-k8s-image&#160;&#160;</text><text class="terminal-343177163-r2" x="256.2" y="312.8" textLength="1183.4" clip-path="url(#terminal-343177163-line-12)">Build&#160;k8s-ready&#160;airflow&#160;image&#160;(optionally&#160;all&#160;images&#160; [...]
+</text><text class="terminal-343177163-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-343177163-line-13)">│</text><text class="terminal-343177163-r4" x="24.4" y="337.2" textLength="207.4" clip-path="url(#terminal-343177163-line-13)">upload-k8s-image&#160;</text><text class="terminal-343177163-r2" x="256.2" y="337.2" textLength="1183.4" clip-path="url(#terminal-343177163-line-13)">Upload&#160;k8s-ready&#160;airflow&#160;image&#160;to&#160;the&#160;KinD&#160;cluster&#160;(o [...]
+</text><text class="terminal-343177163-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-343177163-line-14)">│</text><text class="terminal-343177163-r4" x="24.4" y="361.6" textLength="207.4" clip-path="url(#terminal-343177163-line-14)">configure-cluster</text><text class="terminal-343177163-r2" x="256.2" y="361.6" textLength="1183.4" clip-path="url(#terminal-343177163-line-14)">Configures&#160;cluster&#160;for&#160;airflow&#160;deployment&#160;-&#160;creates&#160;namespaces& [...]
+</text><text class="terminal-343177163-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-343177163-line-15)">│</text><text class="terminal-343177163-r2" x="256.2" y="386" textLength="1183.4" clip-path="url(#terminal-343177163-line-15)">all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-343177163-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-343177163-line-16)">│</text><text class="terminal-343177163-r4" x="24.4" y="410.4" textLength="207.4" clip-path="url(#terminal-343177163-line-16)">deploy-airflow&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="256.2" y="410.4" textLength="1183.4" clip-path="url(#terminal-343177163-line-16)">Deploy&#160;airflow&#160;image&#160;to&#160;the&#160;current&#160;KinD&#160;cluster [...]
+</text><text class="terminal-343177163-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-343177163-line-17)">│</text><text class="terminal-343177163-r4" x="24.4" y="434.8" textLength="207.4" clip-path="url(#terminal-343177163-line-17)">delete-cluster&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="256.2" y="434.8" textLength="1183.4" clip-path="url(#terminal-343177163-line-17)">Delete&#160;the&#160;current&#160;KinD&#160;Cluster&#160;(optionally&#160;all&#160; [...]
+</text><text class="terminal-343177163-r5" x="0" y="459.2" textLength="1464" clip-path="url(#terminal-343177163-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-343177163-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-343177163-line-18)">
+</text><text class="terminal-343177163-r5" x="0" y="483.6" textLength="24.4" clip-path="url(#terminal-343177163-line-19)">╭─</text><text class="terminal-343177163-r5" x="24.4" y="483.6" textLength="1415.2" clip-path="url(#terminal-343177163-line-19)">&#160;K8S&#160;inspection&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-343177163-r5" x="1439.6" y="483.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-343177163-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-343177163-line-20)">│</text><text class="terminal-343177163-r4" x="24.4" y="508" textLength="97.6" clip-path="url(#terminal-343177163-line-20)">status&#160;&#160;</text><text class="terminal-343177163-r2" x="146.4" y="508" textLength="1293.2" clip-path="url(#terminal-343177163-line-20)">Check&#160;status&#160;of&#160;the&#160;current&#160;cluster&#160;and&#160;airflow&#160;deployed&#160;to [...]
+</text><text class="terminal-343177163-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-343177163-line-21)">│</text><text class="terminal-343177163-r4" x="24.4" y="532.4" textLength="97.6" clip-path="url(#terminal-343177163-line-21)">logs&#160;&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="146.4" y="532.4" textLength="231.8" clip-path="url(#terminal-343177163-line-21)">Dump&#160;k8s&#160;logs&#160;to&#160;${</text><text class="terminal-343177163-r4" x="378. [...]
+</text><text class="terminal-343177163-r5" x="0" y="556.8" textLength="1464" clip-path="url(#terminal-343177163-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-343177163-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-343177163-line-22)">
+</text><text class="terminal-343177163-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#terminal-343177163-line-23)">╭─</text><text class="terminal-343177163-r5" x="24.4" y="581.2" textLength="1415.2" clip-path="url(#terminal-343177163-line-23)">&#160;K8S&#160;testing&#160;commands&#160;──────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-343177163-r5" x="1439.6" y="581.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-343177163-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-343177163-line-24)">│</text><text class="terminal-343177163-r4" x="24.4" y="605.6" textLength="85.4" clip-path="url(#terminal-343177163-line-24)">tests&#160;&#160;</text><text class="terminal-343177163-r2" x="134.2" y="605.6" textLength="1305.4" clip-path="url(#terminal-343177163-line-24)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(optionally&#160;for& [...]
+</text><text class="terminal-343177163-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-343177163-line-25)">│</text><text class="terminal-343177163-r4" x="24.4" y="630" textLength="85.4" clip-path="url(#terminal-343177163-line-25)">shell&#160;&#160;</text><text class="terminal-343177163-r2" x="134.2" y="630" textLength="1305.4" clip-path="url(#terminal-343177163-line-25)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster.&#160;&#160;&#160;& [...]
+</text><text class="terminal-343177163-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-343177163-line-26)">│</text><text class="terminal-343177163-r4" x="24.4" y="654.4" textLength="85.4" clip-path="url(#terminal-343177163-line-26)">k9s&#160;&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="134.2" y="654.4" textLength="1305.4" clip-path="url(#terminal-343177163-line-26)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;args&#160;as&# [...]
+</text><text class="terminal-343177163-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-343177163-line-27)">│</text><text class="terminal-343177163-r4" x="24.4" y="678.8" textLength="85.4" clip-path="url(#terminal-343177163-line-27)">logs&#160;&#160;&#160;</text><text class="terminal-343177163-r2" x="134.2" y="678.8" textLength="231.8" clip-path="url(#terminal-343177163-line-27)">Dump&#160;k8s&#160;logs&#160;to&#160;${</text><text class="terminal-343177163-r4" x="366" y="67 [...]
+</text><text class="terminal-343177163-r5" x="0" y="703.2" textLength="1464" clip-path="url(#terminal-343177163-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-343177163-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-343177163-line-28)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_build-k8s-image.svg b/images/breeze/output_k8s_build-k8s-image.svg
new file mode 100644
index 0000000000..78dd43055f
--- /dev/null
+++ b/images/breeze/output_k8s_build-k8s-image.svg
@@ -0,0 +1,164 @@
+<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;
+    }
+
+    .terminal-593134380-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-593134380-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-593134380-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-593134380-r2 { fill: #c5c8c6 }
+.terminal-593134380-r3 { fill: #d0b344;font-weight: bold }
+.terminal-593134380-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-593134380-r5 { fill: #868887 }
+.terminal-593134380-r6 { fill: #98a84b;font-weight: bold }
+.terminal-593134380-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-593134380-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="633.4" />
+    </clipPath>
+    <clipPath id="terminal-593134380-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-593134380-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="terminal-593134380-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;build-k8s-image</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(#terminal-593134380-clip-terminal)">
+    
+    <g class="terminal-593134380-matrix">
+    <text class="terminal-593134380-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-593134380-line-0)">
+</text><text class="terminal-593134380-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-593134380-line-1)">Usage:&#160;</text><text class="terminal-593134380-r1" x="97.6" y="44.4" textLength="341.6" clip-path="url(#terminal-593134380-line-1)">breeze&#160;k8s&#160;build-k8s-image&#160;[</text><text class="terminal-593134380-r4" x="439.2" y="44.4" textLength="85.4" clip-path="url(#terminal-593134380-line-1)">OPTIONS</text><text class="terminal-593134380-r1" x="524.6" y="44. [...]
+</text><text class="terminal-593134380-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-593134380-line-2)">
+</text><text class="terminal-593134380-r2" x="12.2" y="93.2" textLength="805.2" clip-path="url(#terminal-593134380-line-3)">Build&#160;k8s-ready&#160;airflow&#160;image&#160;(optionally&#160;all&#160;images&#160;in&#160;parallel).</text><text class="terminal-593134380-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-593134380-line-3)">
+</text><text class="terminal-593134380-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-593134380-line-4)">
+</text><text class="terminal-593134380-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-593134380-line-5)">╭─</text><text class="terminal-593134380-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-593134380-line-5)">&#160;Build&#160;image&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-593134380-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-593134 [...]
+</text><text class="terminal-593134380-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-593134380-line-6)">│</text><text class="terminal-593134380-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-593134380-line-6)">-</text><text class="terminal-593134380-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-593134380-line-6)">-python</text><text class="terminal-593134380-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-59313438 [...]
+</text><text class="terminal-593134380-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-593134380-line-7)">│</text><text class="terminal-593134380-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-593134380-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-593134380-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-593134380-line-8)">│</text><text class="terminal-593134380-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-593134380-line-8)">-</text><text class="terminal-593134380-r4" x="36.6" y="215.2" textLength="97.6" clip-path="url(#terminal-593134380-line-8)">-rebuild</text><text class="terminal-593134380-r4" x="134.2" y="215.2" textLength="134.2" clip-path="url(#terminal-593134 [...]
+</text><text class="terminal-593134380-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-593134380-line-9)">│</text><text class="terminal-593134380-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-593134380-line-9)">-</text><text class="terminal-593134380-r4" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-593134380-line-9)">-image</text><text class="terminal-593134380-r4" x="109.8" y="239.6" textLength="48.8" clip-path="url(#terminal-593134380 [...]
+</text><text class="terminal-593134380-r5" x="0" y="264" textLength="1464" clip-path="url(#terminal-593134380-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-593134380-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-593134380-line-10)">
+</text><text class="terminal-593134380-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#terminal-593134380-line-11)">╭─</text><text class="terminal-593134380-r5" x="24.4" y="288.4" textLength="1415.2" clip-path="url(#terminal-593134380-line-11)">&#160;Parallel&#160;options&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-593134380-r5" x="1439.6" y="288.4" textLength="24.4" clip-path="url(#terminal-593 [...]
+</text><text class="terminal-593134380-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-593134380-line-12)">│</text><text class="terminal-593134380-r4" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-593134380-line-12)">-</text><text class="terminal-593134380-r4" x="36.6" y="312.8" textLength="48.8" clip-path="url(#terminal-593134380-line-12)">-run</text><text class="terminal-593134380-r4" x="85.4" y="312.8" textLength="146.4" clip-path="url(#terminal-59313438 [...]
+</text><text class="terminal-593134380-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-593134380-line-13)">│</text><text class="terminal-593134380-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-593134380-line-13)">-</text><text class="terminal-593134380-r4" x="36.6" y="337.2" textLength="146.4" clip-path="url(#terminal-593134380-line-13)">-parallelism</text><text class="terminal-593134380-r2" x="378.2" y="337.2" textLength="915" clip-path="url(#terminal- [...]
+</text><text class="terminal-593134380-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-593134380-line-14)">│</text><text class="terminal-593134380-r7" x="378.2" y="361.6" textLength="915" clip-path="url(#terminal-593134380-line-14)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-593134380-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-593134380-line-15)">│</text><text class="terminal-593134380-r5" x="378.2" y="386" textLength="915" clip-path="url(#terminal-593134380-line-15)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-593134380-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-593134380-line-16)">│</text><text class="terminal-593134380-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#terminal-593134380-line-16)">-</text><text class="terminal-593134380-r4" x="36.6" y="410.4" textLength="85.4" clip-path="url(#terminal-593134380-line-16)">-python</text><text class="terminal-593134380-r4" x="122" y="410.4" textLength="109.8" clip-path="url(#terminal-593134 [...]
+</text><text class="terminal-593134380-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-593134380-line-17)">│</text><text class="terminal-593134380-r5" x="378.2" y="434.8" textLength="951.6" clip-path="url(#terminal-593134380-line-17)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-593134380-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-593134380-line-18)">│</text><text class="terminal-593134380-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-593134380-line-18)">-</text><text class="terminal-593134380-r4" x="36.6" y="459.2" textLength="97.6" clip-path="url(#terminal-593134380-line-18)">-include</text><text class="terminal-593134380-r4" x="134.2" y="459.2" textLength="195.2" clip-path="url(#terminal-593 [...]
+</text><text class="terminal-593134380-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-593134380-line-19)">│</text><text class="terminal-593134380-r2" x="378.2" y="483.6" textLength="1061.4" clip-path="url(#terminal-593134380-line-19)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-593134380-r5" x="0" y="508" textLength="1464" clip-path="url(#terminal-593134380-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-593134380-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-593134380-line-20)">
+</text><text class="terminal-593134380-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#terminal-593134380-line-21)">╭─</text><text class="terminal-593134380-r5" x="24.4" y="532.4" textLength="1415.2" clip-path="url(#terminal-593134380-line-21)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-593134380-r5" x="1439.6" y="532.4" textLength="24.4" clip-path="url(#terminal-593 [...]
+</text><text class="terminal-593134380-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-593134380-line-22)">│</text><text class="terminal-593134380-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-593134380-line-22)">-</text><text class="terminal-593134380-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#terminal-593134380-line-22)">-verbose</text><text class="terminal-593134380-r6" x="158.6" y="556.8" textLength="24.4" clip-path="url(#terminal-5931 [...]
+</text><text class="terminal-593134380-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-593134380-line-23)">│</text><text class="terminal-593134380-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-593134380-line-23)">-</text><text class="terminal-593134380-r4" x="36.6" y="581.2" textLength="48.8" clip-path="url(#terminal-593134380-line-23)">-dry</text><text class="terminal-593134380-r4" x="85.4" y="581.2" textLength="48.8" clip-path="url(#terminal-593134380 [...]
+</text><text class="terminal-593134380-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-593134380-line-24)">│</text><text class="terminal-593134380-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-593134380-line-24)">-</text><text class="terminal-593134380-r4" x="36.6" y="605.6" textLength="61" clip-path="url(#terminal-593134380-line-24)">-help</text><text class="terminal-593134380-r6" x="158.6" y="605.6" textLength="24.4" clip-path="url(#terminal-593134380 [...]
+</text><text class="terminal-593134380-r5" x="0" y="630" textLength="1464" clip-path="url(#terminal-593134380-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-593134380-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-593134380-line-25)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_configure-cluster.svg b/images/breeze/output_k8s_configure-cluster.svg
new file mode 100644
index 0000000000..2c918e26c8
--- /dev/null
+++ b/images/breeze/output_k8s_configure-cluster.svg
@@ -0,0 +1,168 @@
+<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;
+    }
+
+    .terminal-3935276725-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-3935276725-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-3935276725-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-3935276725-r2 { fill: #c5c8c6 }
+.terminal-3935276725-r3 { fill: #d0b344;font-weight: bold }
+.terminal-3935276725-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3935276725-r5 { fill: #868887 }
+.terminal-3935276725-r6 { fill: #98a84b;font-weight: bold }
+.terminal-3935276725-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-3935276725-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="657.8" />
+    </clipPath>
+    <clipPath id="terminal-3935276725-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3935276725-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="terminal-3935276725-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;configure-cluster</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(#terminal-3935276725-clip-terminal)">
+    
+    <g class="terminal-3935276725-matrix">
+    <text class="terminal-3935276725-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3935276725-line-0)">
+</text><text class="terminal-3935276725-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3935276725-line-1)">Usage:&#160;</text><text class="terminal-3935276725-r1" x="97.6" y="44.4" textLength="366" clip-path="url(#terminal-3935276725-line-1)">breeze&#160;k8s&#160;configure-cluster&#160;[</text><text class="terminal-3935276725-r4" x="463.6" y="44.4" textLength="85.4" clip-path="url(#terminal-3935276725-line-1)">OPTIONS</text><text class="terminal-3935276725-r1" x="549" y [...]
+</text><text class="terminal-3935276725-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-2)">
+</text><text class="terminal-3935276725-r2" x="12.2" y="93.2" textLength="1390.8" clip-path="url(#terminal-3935276725-line-3)">Configures&#160;cluster&#160;for&#160;airflow&#160;deployment&#160;-&#160;creates&#160;namespaces&#160;and&#160;test&#160;resources&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;</text><text class="terminal-3935276725-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-3)">
+</text><text class="terminal-3935276725-r2" x="12.2" y="117.6" textLength="122" clip-path="url(#terminal-3935276725-line-4)">parallel).</text><text class="terminal-3935276725-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-4)">
+</text><text class="terminal-3935276725-r2" x="1464" y="142" textLength="12.2" clip-path="url(#terminal-3935276725-line-5)">
+</text><text class="terminal-3935276725-r5" x="0" y="166.4" textLength="24.4" clip-path="url(#terminal-3935276725-line-6)">╭─</text><text class="terminal-3935276725-r5" x="24.4" y="166.4" textLength="1415.2" clip-path="url(#terminal-3935276725-line-6)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3935276725-r5" x="1439.6" y="166.4" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-3935276725-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-7)">│</text><text class="terminal-3935276725-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-7)">-</text><text class="terminal-3935276725-r4" x="36.6" y="190.8" textLength="85.4" clip-path="url(#terminal-3935276725-line-7)">-python</text><text class="terminal-3935276725-r6" x="353.8" y="190.8" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-8)">│</text><text class="terminal-3935276725-r7" x="402.6" y="215.2" textLength="732" clip-path="url(#terminal-3935276725-line-8)">(&gt;3.7&lt;&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-3935276725-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-9)">│</text><text class="terminal-3935276725-r5" x="402.6" y="239.6" textLength="732" clip-path="url(#terminal-3935276725-line-9)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3935276725-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3935276725-line-10)">│</text><text class="terminal-3935276725-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-3935276725-line-10)">-</text><text class="terminal-3935276725-r4" x="36.6" y="264" textLength="134.2" clip-path="url(#terminal-3935276725-line-10)">-kubernetes</text><text class="terminal-3935276725-r4" x="170.8" y="264" textLength="97.6" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3935276725-line-11)">│</text><text class="terminal-3935276725-r7" x="402.6" y="288.4" textLength="658.8" clip-path="url(#terminal-3935276725-line-11)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3935276725-r5" x="1451.8" y="288.4" textLength="12.2" c [...]
+</text><text class="terminal-3935276725-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-12)">│</text><text class="terminal-3935276725-r5" x="402.6" y="312.8" textLength="658.8" clip-path="url(#terminal-3935276725-line-12)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-13)">│</text><text class="terminal-3935276725-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-13)">-</text><text class="terminal-3935276725-r4" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-3935276725-line-13)">-run</text><text class="terminal-3935276725-r4" x="85.4" y="337.2" textLength="146.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-14)">│</text><text class="terminal-3935276725-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-14)">-</text><text class="terminal-3935276725-r4" x="36.6" y="361.6" textLength="146.4" clip-path="url(#terminal-3935276725-line-14)">-parallelism</text><text class="terminal-3935276725-r2" x="402.6" y="361.6" textLength="915" clip-path="url(#te [...]
+</text><text class="terminal-3935276725-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3935276725-line-15)">│</text><text class="terminal-3935276725-r7" x="402.6" y="386" textLength="915" clip-path="url(#terminal-3935276725-line-15)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3935276725-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3935276725-line-16)">│</text><text class="terminal-3935276725-r5" x="402.6" y="410.4" textLength="915" clip-path="url(#terminal-3935276725-line-16)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-17)">│</text><text class="terminal-3935276725-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-17)">-</text><text class="terminal-3935276725-r4" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-3935276725-line-17)">-python</text><text class="terminal-3935276725-r4" x="122" y="434.8" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-3935276725-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-18)">│</text><text class="terminal-3935276725-r5" x="402.6" y="459.2" textLength="951.6" clip-path="url(#terminal-3935276725-line-18)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-19)">│</text><text class="terminal-3935276725-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-19)">-</text><text class="terminal-3935276725-r4" x="36.6" y="483.6" textLength="134.2" clip-path="url(#terminal-3935276725-line-19)">-kubernetes</text><text class="terminal-3935276725-r4" x="170.8" y="483.6" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-3935276725-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3935276725-line-20)">│</text><text class="terminal-3935276725-r5" x="402.6" y="508" textLength="756.4" clip-path="url(#terminal-3935276725-line-20)">[default:&#160;v1.24.2&#160;v1.23.6&#160;v1.22.9&#160;v1.21.12]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3935276725-r5" x="1451.8" y="508" te [...]
+</text><text class="terminal-3935276725-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3935276725-line-21)">│</text><text class="terminal-3935276725-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3935276725-line-21)">-</text><text class="terminal-3935276725-r4" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-3935276725-line-21)">-include</text><text class="terminal-3935276725-r4" x="134.2" y="532.4" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-3935276725-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3935276725-line-22)">│</text><text class="terminal-3935276725-r2" x="402.6" y="556.8" textLength="1037" clip-path="url(#terminal-3935276725-line-22)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3935276725-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-23)">│</text><text class="terminal-3935276725-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-3935276725-line-23)">-</text><text class="terminal-3935276725-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#terminal-3935276725-line-23)">-verbose</text><text class="terminal-3935276725-r6" x="353.8" y="581.2" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-3935276725-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-24)">│</text><text class="terminal-3935276725-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-3935276725-line-24)">-</text><text class="terminal-3935276725-r4" x="36.6" y="605.6" textLength="48.8" clip-path="url(#terminal-3935276725-line-24)">-dry</text><text class="terminal-3935276725-r4" x="85.4" y="605.6" textLength="48.8" clip-path="url(#terminal-39 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3935276725-line-25)">│</text><text class="terminal-3935276725-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-3935276725-line-25)">-</text><text class="terminal-3935276725-r4" x="36.6" y="630" textLength="61" clip-path="url(#terminal-3935276725-line-25)">-help</text><text class="terminal-3935276725-r6" x="353.8" y="630" textLength="24.4" clip-path="url(#terminal-3935276725 [...]
+</text><text class="terminal-3935276725-r5" x="0" y="654.4" textLength="1464" clip-path="url(#terminal-3935276725-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3935276725-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-3935276725-line-26)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_create-cluster.svg b/images/breeze/output_k8s_create-cluster.svg
new file mode 100644
index 0000000000..07279c209e
--- /dev/null
+++ b/images/breeze/output_k8s_create-cluster.svg
@@ -0,0 +1,180 @@
+<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;
+    }
+
+    .terminal-2317414132-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-2317414132-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-2317414132-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-2317414132-r2 { fill: #c5c8c6 }
+.terminal-2317414132-r3 { fill: #d0b344;font-weight: bold }
+.terminal-2317414132-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2317414132-r5 { fill: #868887 }
+.terminal-2317414132-r6 { fill: #98a84b;font-weight: bold }
+.terminal-2317414132-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-2317414132-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="731.0" />
+    </clipPath>
+    <clipPath id="terminal-2317414132-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2317414132-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="terminal-2317414132-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;create-cluster</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(#terminal-2317414132-clip-terminal)">
+    
+    <g class="terminal-2317414132-matrix">
+    <text class="terminal-2317414132-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2317414132-line-0)">
+</text><text class="terminal-2317414132-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2317414132-line-1)">Usage:&#160;</text><text class="terminal-2317414132-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-2317414132-line-1)">breeze&#160;k8s&#160;create-cluster&#160;[</text><text class="terminal-2317414132-r4" x="427" y="44.4" textLength="85.4" clip-path="url(#terminal-2317414132-line-1)">OPTIONS</text><text class="terminal-2317414132-r1" x="512.4" y= [...]
+</text><text class="terminal-2317414132-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-2)">
+</text><text class="terminal-2317414132-r2" x="12.2" y="93.2" textLength="1354.2" clip-path="url(#terminal-2317414132-line-3)">Create&#160;a&#160;KinD&#160;Cluster&#160;for&#160;Python&#160;and&#160;Kubernetes&#160;version&#160;specified&#160;(optionally&#160;create&#160;all&#160;clusters&#160;in&#160;parallel).</text><text class="terminal-2317414132-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-3)">
+</text><text class="terminal-2317414132-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-4)">
+</text><text class="terminal-2317414132-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2317414132-line-5)">╭─</text><text class="terminal-2317414132-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2317414132-line-5)">&#160;K8S&#160;cluster&#160;creation&#160;flags&#160;────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2317414132-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#termi [...]
+</text><text class="terminal-2317414132-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-6)">│</text><text class="terminal-2317414132-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-6)">-</text><text class="terminal-2317414132-r4" x="36.6" y="166.4" textLength="73.2" clip-path="url(#terminal-2317414132-line-6)">-force</text><text class="terminal-2317414132-r2" x="341.6" y="166.4" textLength="756.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-7)">│</text><text class="terminal-2317414132-r4" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-7)">-</text><text class="terminal-2317414132-r4" x="36.6" y="190.8" textLength="85.4" clip-path="url(#terminal-2317414132-line-7)">-python</text><text class="terminal-2317414132-r6" x="292.8" y="190.8" textLength="24.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-8)">│</text><text class="terminal-2317414132-r5" x="341.6" y="215.2" textLength="732" clip-path="url(#terminal-2317414132-line-8)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-2317414132-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-9)">│</text><text class="terminal-2317414132-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-9)">-</text><text class="terminal-2317414132-r4" x="36.6" y="239.6" textLength="134.2" clip-path="url(#terminal-2317414132-line-9)">-kubernetes</text><text class="terminal-2317414132-r4" x="170.8" y="239.6" textLength="97.6" clip-path="url(#termi [...]
+</text><text class="terminal-2317414132-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-2317414132-line-10)">│</text><text class="terminal-2317414132-r7" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-2317414132-line-10)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2317414132-r5" x="1451.8" y="264" textLength="12.2" clip-pa [...]
+</text><text class="terminal-2317414132-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-11)">│</text><text class="terminal-2317414132-r5" x="341.6" y="288.4" textLength="658.8" clip-path="url(#terminal-2317414132-line-11)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="312.8" textLength="1464" clip-path="url(#terminal-2317414132-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2317414132-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-12)">
+</text><text class="terminal-2317414132-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#terminal-2317414132-line-13)">╭─</text><text class="terminal-2317414132-r5" x="24.4" y="337.2" textLength="1415.2" clip-path="url(#terminal-2317414132-line-13)">&#160;Parallel&#160;options&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2317414132-r5" x="1439.6" y="337.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-2317414132-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-14)">│</text><text class="terminal-2317414132-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-14)">-</text><text class="terminal-2317414132-r4" x="36.6" y="361.6" textLength="48.8" clip-path="url(#terminal-2317414132-line-14)">-run</text><text class="terminal-2317414132-r4" x="85.4" y="361.6" textLength="146.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2317414132-line-15)">│</text><text class="terminal-2317414132-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-2317414132-line-15)">-</text><text class="terminal-2317414132-r4" x="36.6" y="386" textLength="146.4" clip-path="url(#terminal-2317414132-line-15)">-parallelism</text><text class="terminal-2317414132-r2" x="378.2" y="386" textLength="915" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-16)">│</text><text class="terminal-2317414132-r7" x="378.2" y="410.4" textLength="915" clip-path="url(#terminal-2317414132-line-16)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-17)">│</text><text class="terminal-2317414132-r5" x="378.2" y="434.8" textLength="915" clip-path="url(#terminal-2317414132-line-17)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-18)">│</text><text class="terminal-2317414132-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-18)">-</text><text class="terminal-2317414132-r4" x="36.6" y="459.2" textLength="85.4" clip-path="url(#terminal-2317414132-line-18)">-python</text><text class="terminal-2317414132-r4" x="122" y="459.2" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-2317414132-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-19)">│</text><text class="terminal-2317414132-r5" x="378.2" y="483.6" textLength="951.6" clip-path="url(#terminal-2317414132-line-19)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2317414132-line-20)">│</text><text class="terminal-2317414132-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-2317414132-line-20)">-</text><text class="terminal-2317414132-r4" x="36.6" y="508" textLength="134.2" clip-path="url(#terminal-2317414132-line-20)">-kubernetes</text><text class="terminal-2317414132-r4" x="170.8" y="508" textLength="109.8" clip-path="url(#terminal- [...]
+</text><text class="terminal-2317414132-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-21)">│</text><text class="terminal-2317414132-r5" x="378.2" y="532.4" textLength="756.4" clip-path="url(#terminal-2317414132-line-21)">[default:&#160;v1.24.2&#160;v1.23.6&#160;v1.22.9&#160;v1.21.12]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2317414132-r5" x="1451.8" y="532 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-22)">│</text><text class="terminal-2317414132-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-22)">-</text><text class="terminal-2317414132-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#terminal-2317414132-line-22)">-include</text><text class="terminal-2317414132-r4" x="134.2" y="556.8" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-2317414132-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-23)">│</text><text class="terminal-2317414132-r2" x="378.2" y="581.2" textLength="1061.4" clip-path="url(#terminal-2317414132-line-23)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-2317414132-r5" x="0" y="605.6" textLength="1464" clip-path="url(#terminal-2317414132-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2317414132-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-24)">
+</text><text class="terminal-2317414132-r5" x="0" y="630" textLength="24.4" clip-path="url(#terminal-2317414132-line-25)">╭─</text><text class="terminal-2317414132-r5" x="24.4" y="630" textLength="1415.2" clip-path="url(#terminal-2317414132-line-25)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2317414132-r5" x="1439.6" y="630" textLength="24.4" clip-path="url(#terminal-2317 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-26)">│</text><text class="terminal-2317414132-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-2317414132-line-26)">-</text><text class="terminal-2317414132-r4" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-2317414132-line-26)">-verbose</text><text class="terminal-2317414132-r6" x="158.6" y="654.4" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-2317414132-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-27)">│</text><text class="terminal-2317414132-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-2317414132-line-27)">-</text><text class="terminal-2317414132-r4" x="36.6" y="678.8" textLength="48.8" clip-path="url(#terminal-2317414132-line-27)">-dry</text><text class="terminal-2317414132-r4" x="85.4" y="678.8" textLength="48.8" clip-path="url(#terminal-23 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-28)">│</text><text class="terminal-2317414132-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-2317414132-line-28)">-</text><text class="terminal-2317414132-r4" x="36.6" y="703.2" textLength="61" clip-path="url(#terminal-2317414132-line-28)">-help</text><text class="terminal-2317414132-r6" x="158.6" y="703.2" textLength="24.4" clip-path="url(#terminal-23 [...]
+</text><text class="terminal-2317414132-r5" x="0" y="727.6" textLength="1464" clip-path="url(#terminal-2317414132-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2317414132-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#terminal-2317414132-line-29)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_delete-cluster.svg b/images/breeze/output_k8s_delete-cluster.svg
new file mode 100644
index 0000000000..56af9c757c
--- /dev/null
+++ b/images/breeze/output_k8s_delete-cluster.svg
@@ -0,0 +1,140 @@
+<svg class="rich-terminal" viewBox="0 0 1482 538.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;
+    }
+
+    .terminal-997101604-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-997101604-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-997101604-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-997101604-r2 { fill: #c5c8c6 }
+.terminal-997101604-r3 { fill: #d0b344;font-weight: bold }
+.terminal-997101604-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-997101604-r5 { fill: #868887 }
+.terminal-997101604-r6 { fill: #98a84b;font-weight: bold }
+.terminal-997101604-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-997101604-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="487.0" />
+    </clipPath>
+    <clipPath id="terminal-997101604-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-997101604-line-18">
+    <rect x="0" y="440.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="536" rx="8"/><text class="terminal-997101604-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;delete-cluster</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(#terminal-997101604-clip-terminal)">
+    
+    <g class="terminal-997101604-matrix">
+    <text class="terminal-997101604-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-997101604-line-0)">
+</text><text class="terminal-997101604-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-997101604-line-1)">Usage:&#160;</text><text class="terminal-997101604-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-997101604-line-1)">breeze&#160;k8s&#160;delete-cluster&#160;[</text><text class="terminal-997101604-r4" x="427" y="44.4" textLength="85.4" clip-path="url(#terminal-997101604-line-1)">OPTIONS</text><text class="terminal-997101604-r1" x="512.4" y="44.4"  [...]
+</text><text class="terminal-997101604-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-997101604-line-2)">
+</text><text class="terminal-997101604-r2" x="12.2" y="93.2" textLength="707.6" clip-path="url(#terminal-997101604-line-3)">Delete&#160;the&#160;current&#160;KinD&#160;Cluster&#160;(optionally&#160;all&#160;clusters).</text><text class="terminal-997101604-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-997101604-line-3)">
+</text><text class="terminal-997101604-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-997101604-line-4)">
+</text><text class="terminal-997101604-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-997101604-line-5)">╭─</text><text class="terminal-997101604-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-997101604-line-5)">&#160;K8S&#160;cluster&#160;delete&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-997101604-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-9 [...]
+</text><text class="terminal-997101604-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-997101604-line-6)">│</text><text class="terminal-997101604-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-997101604-line-6)">-</text><text class="terminal-997101604-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-997101604-line-6)">-python</text><text class="terminal-997101604-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-99710160 [...]
+</text><text class="terminal-997101604-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-997101604-line-7)">│</text><text class="terminal-997101604-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-997101604-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-997101604-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-997101604-line-8)">│</text><text class="terminal-997101604-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-997101604-line-8)">-</text><text class="terminal-997101604-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-997101604-line-8)">-kubernetes</text><text class="terminal-997101604-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#terminal-997 [...]
+</text><text class="terminal-997101604-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-997101604-line-9)">│</text><text class="terminal-997101604-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-997101604-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-997101604-r5" x="1451.8" y="239.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-997101604-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-997101604-line-10)">│</text><text class="terminal-997101604-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-997101604-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text> [...]
+</text><text class="terminal-997101604-r5" x="0" y="288.4" textLength="1464" clip-path="url(#terminal-997101604-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-997101604-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-997101604-line-11)">
+</text><text class="terminal-997101604-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#terminal-997101604-line-12)">╭─</text><text class="terminal-997101604-r5" x="24.4" y="312.8" textLength="1415.2" clip-path="url(#terminal-997101604-line-12)">&#160;K8S&#160;multi-cluster&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-997101604-r5" x="1439.6" y="312.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-997101604-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-997101604-line-13)">│</text><text class="terminal-997101604-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-997101604-line-13)">-</text><text class="terminal-997101604-r4" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-997101604-line-13)">-all</text><text class="terminal-997101604-r2" x="134.2" y="337.2" textLength="390.4" clip-path="url(#terminal-9971016 [...]
+</text><text class="terminal-997101604-r5" x="0" y="361.6" textLength="1464" clip-path="url(#terminal-997101604-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-997101604-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-997101604-line-14)">
+</text><text class="terminal-997101604-r5" x="0" y="386" textLength="24.4" clip-path="url(#terminal-997101604-line-15)">╭─</text><text class="terminal-997101604-r5" x="24.4" y="386" textLength="1415.2" clip-path="url(#terminal-997101604-line-15)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-997101604-r5" x="1439.6" y="386" textLength="24.4" clip-path="url(#terminal-997101604 [...]
+</text><text class="terminal-997101604-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-997101604-line-16)">│</text><text class="terminal-997101604-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#terminal-997101604-line-16)">-</text><text class="terminal-997101604-r4" x="36.6" y="410.4" textLength="97.6" clip-path="url(#terminal-997101604-line-16)">-verbose</text><text class="terminal-997101604-r6" x="158.6" y="410.4" textLength="24.4" clip-path="url(#terminal-9971 [...]
+</text><text class="terminal-997101604-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-997101604-line-17)">│</text><text class="terminal-997101604-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-997101604-line-17)">-</text><text class="terminal-997101604-r4" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-997101604-line-17)">-dry</text><text class="terminal-997101604-r4" x="85.4" y="434.8" textLength="48.8" clip-path="url(#terminal-997101604 [...]
+</text><text class="terminal-997101604-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-997101604-line-18)">│</text><text class="terminal-997101604-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-997101604-line-18)">-</text><text class="terminal-997101604-r4" x="36.6" y="459.2" textLength="61" clip-path="url(#terminal-997101604-line-18)">-help</text><text class="terminal-997101604-r6" x="158.6" y="459.2" textLength="24.4" clip-path="url(#terminal-997101604 [...]
+</text><text class="terminal-997101604-r5" x="0" y="483.6" textLength="1464" clip-path="url(#terminal-997101604-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-997101604-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-997101604-line-19)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_deploy-airflow.svg b/images/breeze/output_k8s_deploy-airflow.svg
new file mode 100644
index 0000000000..256baa4298
--- /dev/null
+++ b/images/breeze/output_k8s_deploy-airflow.svg
@@ -0,0 +1,196 @@
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .terminal-2285074325-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-2285074325-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-2285074325-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-2285074325-r2 { fill: #c5c8c6 }
+.terminal-2285074325-r3 { fill: #d0b344;font-weight: bold }
+.terminal-2285074325-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2285074325-r5 { fill: #868887 }
+.terminal-2285074325-r6 { fill: #98a84b;font-weight: bold }
+.terminal-2285074325-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-2285074325-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+    </clipPath>
+    <clipPath id="terminal-2285074325-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-28">
+    <rect x="0" y="684.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-29">
+    <rect x="0" y="709.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-30">
+    <rect x="0" y="733.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-31">
+    <rect x="0" y="757.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2285074325-line-32">
+    <rect x="0" y="782.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="877.6" rx="8"/><text class="terminal-2285074325-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;deploy-airflow</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(#terminal-2285074325-clip-terminal)">
+    
+    <g class="terminal-2285074325-matrix">
+    <text class="terminal-2285074325-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2285074325-line-0)">
+</text><text class="terminal-2285074325-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2285074325-line-1)">Usage:&#160;</text><text class="terminal-2285074325-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-2285074325-line-1)">breeze&#160;k8s&#160;deploy-airflow&#160;[</text><text class="terminal-2285074325-r4" x="427" y="44.4" textLength="85.4" clip-path="url(#terminal-2285074325-line-1)">OPTIONS</text><text class="terminal-2285074325-r1" x="512.4" y= [...]
+</text><text class="terminal-2285074325-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-2)">
+</text><text class="terminal-2285074325-r2" x="12.2" y="93.2" textLength="817.4" clip-path="url(#terminal-2285074325-line-3)">Deploy&#160;airflow&#160;image&#160;to&#160;the&#160;current&#160;KinD&#160;cluster&#160;(or&#160;all&#160;clusters).</text><text class="terminal-2285074325-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-3)">
+</text><text class="terminal-2285074325-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-4)">
+</text><text class="terminal-2285074325-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2285074325-line-5)">╭─</text><text class="terminal-2285074325-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2285074325-line-5)">&#160;Airflow&#160;deploy&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2285074325-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-6)">│</text><text class="terminal-2285074325-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-6)">-</text><text class="terminal-2285074325-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-2285074325-line-6)">-python</text><text class="terminal-2285074325-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-7)">│</text><text class="terminal-2285074325-r5" x="366" y="190.8" textLength="732" clip-path="url(#terminal-2285074325-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-8)">│</text><text class="terminal-2285074325-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-8)">-</text><text class="terminal-2285074325-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-2285074325-line-8)">-kubernetes</text><text class="terminal-2285074325-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#termi [...]
+</text><text class="terminal-2285074325-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-9)">│</text><text class="terminal-2285074325-r7" x="366" y="239.6" textLength="658.8" clip-path="url(#terminal-2285074325-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2285074325-r5" x="1451.8" y="239.6" textLength="12.2" clip- [...]
+</text><text class="terminal-2285074325-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-2285074325-line-10)">│</text><text class="terminal-2285074325-r5" x="366" y="264" textLength="658.8" clip-path="url(#terminal-2285074325-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tex [...]
+</text><text class="terminal-2285074325-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-11)">│</text><text class="terminal-2285074325-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-11)">-</text><text class="terminal-2285074325-r4" x="36.6" y="288.4" textLength="109.8" clip-path="url(#terminal-2285074325-line-11)">-executor</text><text class="terminal-2285074325-r2" x="366" y="288.4" textLength="976" clip-path="url(#termina [...]
+</text><text class="terminal-2285074325-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-12)">│</text><text class="terminal-2285074325-r7" x="366" y="312.8" textLength="976" clip-path="url(#terminal-2285074325-line-12)">(KubernetesExecutor&#160;|&#160;CeleryExecutor&#160;|&#160;LocalExecutor&#160;|&#160;CeleryKubernetesExecutor)</text><text class="terminal-2285074325-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-12)">│</ [...]
+</text><text class="terminal-2285074325-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-13)">│</text><text class="terminal-2285074325-r5" x="366" y="337.2" textLength="976" clip-path="url(#terminal-2285074325-line-13)">[default:&#160;KubernetesExecutor]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-14)">│</text><text class="terminal-2285074325-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-14)">-</text><text class="terminal-2285074325-r4" x="36.6" y="361.6" textLength="97.6" clip-path="url(#terminal-2285074325-line-14)">-upgrade</text><text class="terminal-2285074325-r2" x="366" y="361.6" textLength="549" clip-path="url(#terminal- [...]
+</text><text class="terminal-2285074325-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2285074325-line-15)">│</text><text class="terminal-2285074325-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-2285074325-line-15)">-</text><text class="terminal-2285074325-r4" x="36.6" y="386" textLength="61" clip-path="url(#terminal-2285074325-line-15)">-wait</text><text class="terminal-2285074325-r4" x="97.6" y="386" textLength="195.2" clip-path="url(#terminal-2285074325 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="410.4" textLength="1464" clip-path="url(#terminal-2285074325-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2285074325-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-16)">
+</text><text class="terminal-2285074325-r5" x="0" y="434.8" textLength="24.4" clip-path="url(#terminal-2285074325-line-17)">╭─</text><text class="terminal-2285074325-r5" x="24.4" y="434.8" textLength="1415.2" clip-path="url(#terminal-2285074325-line-17)">&#160;Parallel&#160;options&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2285074325-r5" x="1439.6" y="434.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-2285074325-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-18)">│</text><text class="terminal-2285074325-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-18)">-</text><text class="terminal-2285074325-r4" x="36.6" y="459.2" textLength="48.8" clip-path="url(#terminal-2285074325-line-18)">-run</text><text class="terminal-2285074325-r4" x="85.4" y="459.2" textLength="146.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-19)">│</text><text class="terminal-2285074325-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-19)">-</text><text class="terminal-2285074325-r4" x="36.6" y="483.6" textLength="146.4" clip-path="url(#terminal-2285074325-line-19)">-parallelism</text><text class="terminal-2285074325-r2" x="378.2" y="483.6" textLength="915" clip-path="url(#te [...]
+</text><text class="terminal-2285074325-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2285074325-line-20)">│</text><text class="terminal-2285074325-r7" x="378.2" y="508" textLength="915" clip-path="url(#terminal-2285074325-line-20)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-2285074325-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-21)">│</text><text class="terminal-2285074325-r5" x="378.2" y="532.4" textLength="915" clip-path="url(#terminal-2285074325-line-21)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-22)">│</text><text class="terminal-2285074325-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-22)">-</text><text class="terminal-2285074325-r4" x="36.6" y="556.8" textLength="85.4" clip-path="url(#terminal-2285074325-line-22)">-python</text><text class="terminal-2285074325-r4" x="122" y="556.8" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-2285074325-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-23)">│</text><text class="terminal-2285074325-r5" x="378.2" y="581.2" textLength="951.6" clip-path="url(#terminal-2285074325-line-23)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-24)">│</text><text class="terminal-2285074325-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-2285074325-line-24)">-</text><text class="terminal-2285074325-r4" x="36.6" y="605.6" textLength="134.2" clip-path="url(#terminal-2285074325-line-24)">-kubernetes</text><text class="terminal-2285074325-r4" x="170.8" y="605.6" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-2285074325-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-2285074325-line-25)">│</text><text class="terminal-2285074325-r5" x="378.2" y="630" textLength="756.4" clip-path="url(#terminal-2285074325-line-25)">[default:&#160;v1.24.2&#160;v1.23.6&#160;v1.22.9&#160;v1.21.12]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2285074325-r5" x="1451.8" y="630" te [...]
+</text><text class="terminal-2285074325-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-26)">│</text><text class="terminal-2285074325-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-26)">-</text><text class="terminal-2285074325-r4" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-2285074325-line-26)">-include</text><text class="terminal-2285074325-r4" x="134.2" y="654.4" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-2285074325-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-27)">│</text><text class="terminal-2285074325-r2" x="378.2" y="678.8" textLength="1061.4" clip-path="url(#terminal-2285074325-line-27)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-2285074325-r5" x="0" y="703.2" textLength="1464" clip-path="url(#terminal-2285074325-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2285074325-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-28)">
+</text><text class="terminal-2285074325-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#terminal-2285074325-line-29)">╭─</text><text class="terminal-2285074325-r5" x="24.4" y="727.6" textLength="1415.2" clip-path="url(#terminal-2285074325-line-29)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2285074325-r5" x="1439.6" y="727.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-2285074325-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-2285074325-line-30)">│</text><text class="terminal-2285074325-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-2285074325-line-30)">-</text><text class="terminal-2285074325-r4" x="36.6" y="752" textLength="97.6" clip-path="url(#terminal-2285074325-line-30)">-verbose</text><text class="terminal-2285074325-r6" x="158.6" y="752" textLength="24.4" clip-path="url(#terminal-22850 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-31)">│</text><text class="terminal-2285074325-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-2285074325-line-31)">-</text><text class="terminal-2285074325-r4" x="36.6" y="776.4" textLength="48.8" clip-path="url(#terminal-2285074325-line-31)">-dry</text><text class="terminal-2285074325-r4" x="85.4" y="776.4" textLength="48.8" clip-path="url(#terminal-22 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-32)">│</text><text class="terminal-2285074325-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#terminal-2285074325-line-32)">-</text><text class="terminal-2285074325-r4" x="36.6" y="800.8" textLength="61" clip-path="url(#terminal-2285074325-line-32)">-help</text><text class="terminal-2285074325-r6" x="158.6" y="800.8" textLength="24.4" clip-path="url(#terminal-22 [...]
+</text><text class="terminal-2285074325-r5" x="0" y="825.2" textLength="1464" clip-path="url(#terminal-2285074325-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2285074325-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#terminal-2285074325-line-33)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_k9s.svg b/images/breeze/output_k8s_k9s.svg
new file mode 100644
index 0000000000..d15c209f83
--- /dev/null
+++ b/images/breeze/output_k8s_k9s.svg
@@ -0,0 +1,128 @@
+<svg class="rich-terminal" viewBox="0 0 1482 464.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;
+    }
+
+    .terminal-2963918477-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-2963918477-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-2963918477-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-2963918477-r2 { fill: #c5c8c6 }
+.terminal-2963918477-r3 { fill: #d0b344;font-weight: bold }
+.terminal-2963918477-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2963918477-r5 { fill: #868887 }
+.terminal-2963918477-r6 { fill: #98a84b;font-weight: bold }
+.terminal-2963918477-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-2963918477-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="413.79999999999995" />
+    </clipPath>
+    <clipPath id="terminal-2963918477-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2963918477-line-15">
+    <rect x="0" y="367.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="462.8" rx="8"/><text class="terminal-2963918477-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;k9s</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(#terminal-2963918477-clip-terminal)">
+    
+    <g class="terminal-2963918477-matrix">
+    <text class="terminal-2963918477-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2963918477-line-0)">
+</text><text class="terminal-2963918477-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2963918477-line-1)">Usage:&#160;</text><text class="terminal-2963918477-r1" x="97.6" y="44.4" textLength="195.2" clip-path="url(#terminal-2963918477-line-1)">breeze&#160;k8s&#160;k9s&#160;[</text><text class="terminal-2963918477-r4" x="292.8" y="44.4" textLength="85.4" clip-path="url(#terminal-2963918477-line-1)">OPTIONS</text><text class="terminal-2963918477-r1" x="378.2" y="44.4" te [...]
+</text><text class="terminal-2963918477-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2963918477-line-2)">
+</text><text class="terminal-2963918477-r2" x="12.2" y="93.2" textLength="658.8" clip-path="url(#terminal-2963918477-line-3)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;args&#160;as&#160;extra&#160;args.</text><text class="terminal-2963918477-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2963918477-line-3)">
+</text><text class="terminal-2963918477-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2963918477-line-4)">
+</text><text class="terminal-2963918477-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2963918477-line-5)">╭─</text><text class="terminal-2963918477-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2963918477-line-5)">&#160;K8S&#160;k9s&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2963918477-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2963918477-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2963918477-line-6)">│</text><text class="terminal-2963918477-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2963918477-line-6)">-</text><text class="terminal-2963918477-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-2963918477-line-6)">-python</text><text class="terminal-2963918477-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-2 [...]
+</text><text class="terminal-2963918477-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2963918477-line-7)">│</text><text class="terminal-2963918477-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-2963918477-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-2963918477-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2963918477-line-8)">│</text><text class="terminal-2963918477-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-2963918477-line-8)">-</text><text class="terminal-2963918477-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-2963918477-line-8)">-kubernetes</text><text class="terminal-2963918477-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#termi [...]
+</text><text class="terminal-2963918477-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2963918477-line-9)">│</text><text class="terminal-2963918477-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-2963918477-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2963918477-r5" x="1451.8" y="239.6" textLength="12.2" cli [...]
+</text><text class="terminal-2963918477-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-2963918477-line-10)">│</text><text class="terminal-2963918477-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-2963918477-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-2963918477-r5" x="0" y="288.4" textLength="1464" clip-path="url(#terminal-2963918477-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2963918477-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-2963918477-line-11)">
+</text><text class="terminal-2963918477-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#terminal-2963918477-line-12)">╭─</text><text class="terminal-2963918477-r5" x="24.4" y="312.8" textLength="1415.2" clip-path="url(#terminal-2963918477-line-12)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2963918477-r5" x="1439.6" y="312.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-2963918477-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2963918477-line-13)">│</text><text class="terminal-2963918477-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-2963918477-line-13)">-</text><text class="terminal-2963918477-r4" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-2963918477-line-13)">-verbose</text><text class="terminal-2963918477-r6" x="158.6" y="337.2" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-2963918477-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2963918477-line-14)">│</text><text class="terminal-2963918477-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-2963918477-line-14)">-</text><text class="terminal-2963918477-r4" x="36.6" y="361.6" textLength="48.8" clip-path="url(#terminal-2963918477-line-14)">-dry</text><text class="terminal-2963918477-r4" x="85.4" y="361.6" textLength="48.8" clip-path="url(#terminal-29 [...]
+</text><text class="terminal-2963918477-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2963918477-line-15)">│</text><text class="terminal-2963918477-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-2963918477-line-15)">-</text><text class="terminal-2963918477-r4" x="36.6" y="386" textLength="61" clip-path="url(#terminal-2963918477-line-15)">-help</text><text class="terminal-2963918477-r6" x="158.6" y="386" textLength="24.4" clip-path="url(#terminal-2963918477 [...]
+</text><text class="terminal-2963918477-r5" x="0" y="410.4" textLength="1464" clip-path="url(#terminal-2963918477-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2963918477-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-2963918477-line-16)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_logs.svg b/images/breeze/output_k8s_logs.svg
new file mode 100644
index 0000000000..99668d1e10
--- /dev/null
+++ b/images/breeze/output_k8s_logs.svg
@@ -0,0 +1,140 @@
+<svg class="rich-terminal" viewBox="0 0 1482 538.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;
+    }
+
+    .terminal-719954127-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-719954127-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-719954127-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-719954127-r2 { fill: #c5c8c6 }
+.terminal-719954127-r3 { fill: #d0b344;font-weight: bold }
+.terminal-719954127-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-719954127-r5 { fill: #868887 }
+.terminal-719954127-r6 { fill: #98a84b;font-weight: bold }
+.terminal-719954127-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-719954127-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="487.0" />
+    </clipPath>
+    <clipPath id="terminal-719954127-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-719954127-line-18">
+    <rect x="0" y="440.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="536" rx="8"/><text class="terminal-719954127-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;logs</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(#terminal-719954127-clip-terminal)">
+    
+    <g class="terminal-719954127-matrix">
+    <text class="terminal-719954127-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-719954127-line-0)">
+</text><text class="terminal-719954127-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-719954127-line-1)">Usage:&#160;</text><text class="terminal-719954127-r1" x="97.6" y="44.4" textLength="207.4" clip-path="url(#terminal-719954127-line-1)">breeze&#160;k8s&#160;logs&#160;[</text><text class="terminal-719954127-r4" x="305" y="44.4" textLength="85.4" clip-path="url(#terminal-719954127-line-1)">OPTIONS</text><text class="terminal-719954127-r1" x="390.4" y="44.4" textLength [...]
+</text><text class="terminal-719954127-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-719954127-line-2)">
+</text><text class="terminal-719954127-r2" x="12.2" y="93.2" textLength="231.8" clip-path="url(#terminal-719954127-line-3)">Dump&#160;k8s&#160;logs&#160;to&#160;${</text><text class="terminal-719954127-r4" x="244" y="93.2" textLength="85.4" clip-path="url(#terminal-719954127-line-3)">TMP_DIR</text><text class="terminal-719954127-r2" x="329.4" y="93.2" textLength="146.4" clip-path="url(#terminal-719954127-line-3)">}/kind_logs_</text><text class="terminal-719954127-r3" x="475.8" y="93.2" t [...]
+</text><text class="terminal-719954127-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-719954127-line-4)">
+</text><text class="terminal-719954127-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-719954127-line-5)">╭─</text><text class="terminal-719954127-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-719954127-line-5)">&#160;K8S&#160;logs&#160;flags&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-719954127-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-719954 [...]
+</text><text class="terminal-719954127-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-719954127-line-6)">│</text><text class="terminal-719954127-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-719954127-line-6)">-</text><text class="terminal-719954127-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-719954127-line-6)">-python</text><text class="terminal-719954127-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-71995412 [...]
+</text><text class="terminal-719954127-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-719954127-line-7)">│</text><text class="terminal-719954127-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-719954127-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-719954127-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-719954127-line-8)">│</text><text class="terminal-719954127-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-719954127-line-8)">-</text><text class="terminal-719954127-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-719954127-line-8)">-kubernetes</text><text class="terminal-719954127-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#terminal-719 [...]
+</text><text class="terminal-719954127-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-719954127-line-9)">│</text><text class="terminal-719954127-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-719954127-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-719954127-r5" x="1451.8" y="239.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-719954127-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-719954127-line-10)">│</text><text class="terminal-719954127-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-719954127-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text> [...]
+</text><text class="terminal-719954127-r5" x="0" y="288.4" textLength="1464" clip-path="url(#terminal-719954127-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-719954127-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-719954127-line-11)">
+</text><text class="terminal-719954127-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#terminal-719954127-line-12)">╭─</text><text class="terminal-719954127-r5" x="24.4" y="312.8" textLength="1415.2" clip-path="url(#terminal-719954127-line-12)">&#160;K8S&#160;multi-cluster&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-719954127-r5" x="1439.6" y="312.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-719954127-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-719954127-line-13)">│</text><text class="terminal-719954127-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-719954127-line-13)">-</text><text class="terminal-719954127-r4" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-719954127-line-13)">-all</text><text class="terminal-719954127-r2" x="134.2" y="337.2" textLength="390.4" clip-path="url(#terminal-7199541 [...]
+</text><text class="terminal-719954127-r5" x="0" y="361.6" textLength="1464" clip-path="url(#terminal-719954127-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-719954127-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-719954127-line-14)">
+</text><text class="terminal-719954127-r5" x="0" y="386" textLength="24.4" clip-path="url(#terminal-719954127-line-15)">╭─</text><text class="terminal-719954127-r5" x="24.4" y="386" textLength="1415.2" clip-path="url(#terminal-719954127-line-15)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-719954127-r5" x="1439.6" y="386" textLength="24.4" clip-path="url(#terminal-719954127 [...]
+</text><text class="terminal-719954127-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-719954127-line-16)">│</text><text class="terminal-719954127-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#terminal-719954127-line-16)">-</text><text class="terminal-719954127-r4" x="36.6" y="410.4" textLength="97.6" clip-path="url(#terminal-719954127-line-16)">-verbose</text><text class="terminal-719954127-r6" x="158.6" y="410.4" textLength="24.4" clip-path="url(#terminal-7199 [...]
+</text><text class="terminal-719954127-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-719954127-line-17)">│</text><text class="terminal-719954127-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-719954127-line-17)">-</text><text class="terminal-719954127-r4" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-719954127-line-17)">-dry</text><text class="terminal-719954127-r4" x="85.4" y="434.8" textLength="48.8" clip-path="url(#terminal-719954127 [...]
+</text><text class="terminal-719954127-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-719954127-line-18)">│</text><text class="terminal-719954127-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-719954127-line-18)">-</text><text class="terminal-719954127-r4" x="36.6" y="459.2" textLength="61" clip-path="url(#terminal-719954127-line-18)">-help</text><text class="terminal-719954127-r6" x="158.6" y="459.2" textLength="24.4" clip-path="url(#terminal-719954127 [...]
+</text><text class="terminal-719954127-r5" x="0" y="483.6" textLength="1464" clip-path="url(#terminal-719954127-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-719954127-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-719954127-line-19)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_setup-env.svg b/images/breeze/output_k8s_setup-env.svg
new file mode 100644
index 0000000000..5417a6e8e4
--- /dev/null
+++ b/images/breeze/output_k8s_setup-env.svg
@@ -0,0 +1,111 @@
+<svg class="rich-terminal" viewBox="0 0 1482 367.2" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @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;
+    }
+
+    .terminal-3931268740-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-3931268740-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-3931268740-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-3931268740-r2 { fill: #c5c8c6 }
+.terminal-3931268740-r3 { fill: #d0b344;font-weight: bold }
+.terminal-3931268740-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3931268740-r5 { fill: #868887 }
+.terminal-3931268740-r6 { fill: #98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-3931268740-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="316.2" />
+    </clipPath>
+    <clipPath id="terminal-3931268740-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3931268740-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+    </defs>
+
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="365.2" rx="8"/><text class="terminal-3931268740-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;setup-env</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(#terminal-3931268740-clip-terminal)">
+    
+    <g class="terminal-3931268740-matrix">
+    <text class="terminal-3931268740-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3931268740-line-0)">
+</text><text class="terminal-3931268740-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3931268740-line-1)">Usage:&#160;</text><text class="terminal-3931268740-r1" x="97.6" y="44.4" textLength="268.4" clip-path="url(#terminal-3931268740-line-1)">breeze&#160;k8s&#160;setup-env&#160;[</text><text class="terminal-3931268740-r4" x="366" y="44.4" textLength="85.4" clip-path="url(#terminal-3931268740-line-1)">OPTIONS</text><text class="terminal-3931268740-r1" x="451.4" y="44.4 [...]
+</text><text class="terminal-3931268740-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3931268740-line-2)">
+</text><text class="terminal-3931268740-r2" x="12.2" y="93.2" textLength="658.8" clip-path="url(#terminal-3931268740-line-3)">Setup&#160;shared&#160;Kubernetes&#160;virtual&#160;environment&#160;and&#160;tools.</text><text class="terminal-3931268740-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3931268740-line-3)">
+</text><text class="terminal-3931268740-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3931268740-line-4)">
+</text><text class="terminal-3931268740-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3931268740-line-5)">╭─</text><text class="terminal-3931268740-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3931268740-line-5)">&#160;K8S&#160;setup&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3931268740-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3931268740-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3931268740-line-6)">│</text><text class="terminal-3931268740-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3931268740-line-6)">-</text><text class="terminal-3931268740-r4" x="36.6" y="166.4" textLength="73.2" clip-path="url(#terminal-3931268740-line-6)">-force</text><text class="terminal-3931268740-r2" x="158.6" y="166.4" textLength="793" clip-path="url(#terminal-393 [...]
+</text><text class="terminal-3931268740-r5" x="0" y="190.8" textLength="1464" clip-path="url(#terminal-3931268740-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3931268740-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-3931268740-line-7)">
+</text><text class="terminal-3931268740-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-3931268740-line-8)">╭─</text><text class="terminal-3931268740-r5" x="24.4" y="215.2" textLength="1415.2" clip-path="url(#terminal-3931268740-line-8)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3931268740-r5" x="1439.6" y="215.2" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-3931268740-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3931268740-line-9)">│</text><text class="terminal-3931268740-r4" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-3931268740-line-9)">-</text><text class="terminal-3931268740-r4" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-3931268740-line-9)">-verbose</text><text class="terminal-3931268740-r6" x="158.6" y="239.6" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-3931268740-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3931268740-line-10)">│</text><text class="terminal-3931268740-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-3931268740-line-10)">-</text><text class="terminal-3931268740-r4" x="36.6" y="264" textLength="48.8" clip-path="url(#terminal-3931268740-line-10)">-dry</text><text class="terminal-3931268740-r4" x="85.4" y="264" textLength="48.8" clip-path="url(#terminal-3931268740 [...]
+</text><text class="terminal-3931268740-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3931268740-line-11)">│</text><text class="terminal-3931268740-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-3931268740-line-11)">-</text><text class="terminal-3931268740-r4" x="36.6" y="288.4" textLength="61" clip-path="url(#terminal-3931268740-line-11)">-help</text><text class="terminal-3931268740-r6" x="158.6" y="288.4" textLength="24.4" clip-path="url(#terminal-39 [...]
+</text><text class="terminal-3931268740-r5" x="0" y="312.8" textLength="1464" clip-path="url(#terminal-3931268740-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3931268740-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-3931268740-line-12)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_shell.svg b/images/breeze/output_k8s_shell.svg
new file mode 100644
index 0000000000..c3b1740669
--- /dev/null
+++ b/images/breeze/output_k8s_shell.svg
@@ -0,0 +1,144 @@
+<svg class="rich-terminal" viewBox="0 0 1482 562.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;
+    }
+
+    .terminal-319246302-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-319246302-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-319246302-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-319246302-r2 { fill: #c5c8c6 }
+.terminal-319246302-r3 { fill: #d0b344;font-weight: bold }
+.terminal-319246302-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-319246302-r5 { fill: #868887 }
+.terminal-319246302-r6 { fill: #98a84b;font-weight: bold }
+.terminal-319246302-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-319246302-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="511.4" />
+    </clipPath>
+    <clipPath id="terminal-319246302-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-319246302-line-19">
+    <rect x="0" y="465.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="560.4" rx="8"/><text class="terminal-319246302-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;shell</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(#terminal-319246302-clip-terminal)">
+    
+    <g class="terminal-319246302-matrix">
+    <text class="terminal-319246302-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-319246302-line-0)">
+</text><text class="terminal-319246302-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-319246302-line-1)">Usage:&#160;</text><text class="terminal-319246302-r1" x="97.6" y="44.4" textLength="219.6" clip-path="url(#terminal-319246302-line-1)">breeze&#160;k8s&#160;shell&#160;[</text><text class="terminal-319246302-r4" x="317.2" y="44.4" textLength="85.4" clip-path="url(#terminal-319246302-line-1)">OPTIONS</text><text class="terminal-319246302-r1" x="402.6" y="44.4" textLen [...]
+</text><text class="terminal-319246302-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-319246302-line-2)">
+</text><text class="terminal-319246302-r2" x="12.2" y="93.2" textLength="622.2" clip-path="url(#terminal-319246302-line-3)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster.</text><text class="terminal-319246302-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-319246302-line-3)">
+</text><text class="terminal-319246302-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-319246302-line-4)">
+</text><text class="terminal-319246302-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-319246302-line-5)">╭─</text><text class="terminal-319246302-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-319246302-line-5)">&#160;K8S&#160;shell&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-319246302-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-319246 [...]
+</text><text class="terminal-319246302-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-319246302-line-6)">│</text><text class="terminal-319246302-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-319246302-line-6)">-</text><text class="terminal-319246302-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-319246302-line-6)">-python</text><text class="terminal-319246302-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-31924630 [...]
+</text><text class="terminal-319246302-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-319246302-line-7)">│</text><text class="terminal-319246302-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-319246302-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-319246302-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-319246302-line-8)">│</text><text class="terminal-319246302-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-319246302-line-8)">-</text><text class="terminal-319246302-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-319246302-line-8)">-kubernetes</text><text class="terminal-319246302-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#terminal-319 [...]
+</text><text class="terminal-319246302-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-319246302-line-9)">│</text><text class="terminal-319246302-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-319246302-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-319246302-r5" x="1451.8" y="239.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-319246302-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-319246302-line-10)">│</text><text class="terminal-319246302-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-319246302-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text> [...]
+</text><text class="terminal-319246302-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-319246302-line-11)">│</text><text class="terminal-319246302-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-319246302-line-11)">-</text><text class="terminal-319246302-r4" x="36.6" y="288.4" textLength="109.8" clip-path="url(#terminal-319246302-line-11)">-executor</text><text class="terminal-319246302-r2" x="341.6" y="288.4" textLength="976" clip-path="url(#terminal-319 [...]
+</text><text class="terminal-319246302-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-319246302-line-12)">│</text><text class="terminal-319246302-r7" x="341.6" y="312.8" textLength="976" clip-path="url(#terminal-319246302-line-12)">(KubernetesExecutor&#160;|&#160;CeleryExecutor&#160;|&#160;LocalExecutor&#160;|&#160;CeleryKubernetesExecutor)</text><text class="terminal-319246302-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#terminal-319246302-line-12)">│</text [...]
+</text><text class="terminal-319246302-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-319246302-line-13)">│</text><text class="terminal-319246302-r5" x="341.6" y="337.2" textLength="976" clip-path="url(#terminal-319246302-line-13)">[default:&#160;KubernetesExecutor]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-319246302-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-319246302-line-14)">│</text><text class="terminal-319246302-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-319246302-line-14)">-</text><text class="terminal-319246302-r4" x="36.6" y="361.6" textLength="73.2" clip-path="url(#terminal-319246302-line-14)">-force</text><text class="terminal-319246302-r4" x="109.8" y="361.6" textLength="134.2" clip-path="url(#terminal-31924 [...]
+</text><text class="terminal-319246302-r5" x="0" y="386" textLength="1464" clip-path="url(#terminal-319246302-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-319246302-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-319246302-line-15)">
+</text><text class="terminal-319246302-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-319246302-line-16)">╭─</text><text class="terminal-319246302-r5" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-319246302-line-16)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-319246302-r5" x="1439.6" y="410.4" textLength="24.4" clip-path="url(#terminal-319 [...]
+</text><text class="terminal-319246302-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-319246302-line-17)">│</text><text class="terminal-319246302-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-319246302-line-17)">-</text><text class="terminal-319246302-r4" x="36.6" y="434.8" textLength="97.6" clip-path="url(#terminal-319246302-line-17)">-verbose</text><text class="terminal-319246302-r6" x="158.6" y="434.8" textLength="24.4" clip-path="url(#terminal-3192 [...]
+</text><text class="terminal-319246302-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-319246302-line-18)">│</text><text class="terminal-319246302-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-319246302-line-18)">-</text><text class="terminal-319246302-r4" x="36.6" y="459.2" textLength="48.8" clip-path="url(#terminal-319246302-line-18)">-dry</text><text class="terminal-319246302-r4" x="85.4" y="459.2" textLength="48.8" clip-path="url(#terminal-319246302 [...]
+</text><text class="terminal-319246302-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-319246302-line-19)">│</text><text class="terminal-319246302-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-319246302-line-19)">-</text><text class="terminal-319246302-r4" x="36.6" y="483.6" textLength="61" clip-path="url(#terminal-319246302-line-19)">-help</text><text class="terminal-319246302-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#terminal-319246302 [...]
+</text><text class="terminal-319246302-r5" x="0" y="508" textLength="1464" clip-path="url(#terminal-319246302-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-319246302-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-319246302-line-20)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_status.svg b/images/breeze/output_k8s_status.svg
new file mode 100644
index 0000000000..27b989c1c9
--- /dev/null
+++ b/images/breeze/output_k8s_status.svg
@@ -0,0 +1,144 @@
+<svg class="rich-terminal" viewBox="0 0 1482 562.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;
+    }
+
+    .terminal-74038232-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-74038232-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-74038232-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-74038232-r2 { fill: #c5c8c6 }
+.terminal-74038232-r3 { fill: #d0b344;font-weight: bold }
+.terminal-74038232-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-74038232-r5 { fill: #868887 }
+.terminal-74038232-r6 { fill: #98a84b;font-weight: bold }
+.terminal-74038232-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-74038232-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="511.4" />
+    </clipPath>
+    <clipPath id="terminal-74038232-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-74038232-line-19">
+    <rect x="0" y="465.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="560.4" rx="8"/><text class="terminal-74038232-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;status</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(#terminal-74038232-clip-terminal)">
+    
+    <g class="terminal-74038232-matrix">
+    <text class="terminal-74038232-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-74038232-line-0)">
+</text><text class="terminal-74038232-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-74038232-line-1)">Usage:&#160;</text><text class="terminal-74038232-r1" x="97.6" y="44.4" textLength="231.8" clip-path="url(#terminal-74038232-line-1)">breeze&#160;k8s&#160;status&#160;[</text><text class="terminal-74038232-r4" x="329.4" y="44.4" textLength="85.4" clip-path="url(#terminal-74038232-line-1)">OPTIONS</text><text class="terminal-74038232-r1" x="414.8" y="44.4" textLength="1 [...]
+</text><text class="terminal-74038232-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-74038232-line-2)">
+</text><text class="terminal-74038232-r2" x="12.2" y="93.2" textLength="1085.8" clip-path="url(#terminal-74038232-line-3)">Check&#160;status&#160;of&#160;the&#160;current&#160;cluster&#160;and&#160;airflow&#160;deployed&#160;to&#160;it&#160;(optionally&#160;all&#160;clusters).</text><text class="terminal-74038232-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-74038232-line-3)">
+</text><text class="terminal-74038232-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-74038232-line-4)">
+</text><text class="terminal-74038232-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-74038232-line-5)">╭─</text><text class="terminal-74038232-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-74038232-line-5)">&#160;K8S&#160;cluster&#160;status&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-74038232-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-740382 [...]
+</text><text class="terminal-74038232-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-74038232-line-6)">│</text><text class="terminal-74038232-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-74038232-line-6)">-</text><text class="terminal-74038232-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-74038232-line-6)">-python</text><text class="terminal-74038232-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-74038232-line-6 [...]
+</text><text class="terminal-74038232-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-74038232-line-7)">│</text><text class="terminal-74038232-r5" x="366" y="190.8" textLength="732" clip-path="url(#terminal-74038232-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-74038232-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-74038232-line-8)">│</text><text class="terminal-74038232-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-74038232-line-8)">-</text><text class="terminal-74038232-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-74038232-line-8)">-kubernetes</text><text class="terminal-74038232-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#terminal-74038232-l [...]
+</text><text class="terminal-74038232-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-74038232-line-9)">│</text><text class="terminal-74038232-r7" x="366" y="239.6" textLength="658.8" clip-path="url(#terminal-74038232-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-74038232-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url( [...]
+</text><text class="terminal-74038232-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-74038232-line-10)">│</text><text class="terminal-74038232-r5" x="366" y="264" textLength="658.8" clip-path="url(#terminal-74038232-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text  [...]
+</text><text class="terminal-74038232-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-74038232-line-11)">│</text><text class="terminal-74038232-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-74038232-line-11)">-</text><text class="terminal-74038232-r4" x="36.6" y="288.4" textLength="61" clip-path="url(#terminal-74038232-line-11)">-wait</text><text class="terminal-74038232-r4" x="97.6" y="288.4" textLength="195.2" clip-path="url(#terminal-74038232-line-11 [...]
+</text><text class="terminal-74038232-r5" x="0" y="312.8" textLength="1464" clip-path="url(#terminal-74038232-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-74038232-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-74038232-line-12)">
+</text><text class="terminal-74038232-r5" x="0" y="337.2" textLength="24.4" clip-path="url(#terminal-74038232-line-13)">╭─</text><text class="terminal-74038232-r5" x="24.4" y="337.2" textLength="1415.2" clip-path="url(#terminal-74038232-line-13)">&#160;K8S&#160;multi-cluster&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-74038232-r5" x="1439.6" y="337.2" textLength="24.4" clip-path="url(#terminal-740 [...]
+</text><text class="terminal-74038232-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-74038232-line-14)">│</text><text class="terminal-74038232-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-74038232-line-14)">-</text><text class="terminal-74038232-r4" x="36.6" y="361.6" textLength="48.8" clip-path="url(#terminal-74038232-line-14)">-all</text><text class="terminal-74038232-r2" x="134.2" y="361.6" textLength="390.4" clip-path="url(#terminal-74038232-line- [...]
+</text><text class="terminal-74038232-r5" x="0" y="386" textLength="1464" clip-path="url(#terminal-74038232-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-74038232-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-74038232-line-15)">
+</text><text class="terminal-74038232-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-74038232-line-16)">╭─</text><text class="terminal-74038232-r5" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-74038232-line-16)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-74038232-r5" x="1439.6" y="410.4" textLength="24.4" clip-path="url(#terminal-74038232 [...]
+</text><text class="terminal-74038232-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-74038232-line-17)">│</text><text class="terminal-74038232-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-74038232-line-17)">-</text><text class="terminal-74038232-r4" x="36.6" y="434.8" textLength="97.6" clip-path="url(#terminal-74038232-line-17)">-verbose</text><text class="terminal-74038232-r6" x="158.6" y="434.8" textLength="24.4" clip-path="url(#terminal-74038232-li [...]
+</text><text class="terminal-74038232-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-74038232-line-18)">│</text><text class="terminal-74038232-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-74038232-line-18)">-</text><text class="terminal-74038232-r4" x="36.6" y="459.2" textLength="48.8" clip-path="url(#terminal-74038232-line-18)">-dry</text><text class="terminal-74038232-r4" x="85.4" y="459.2" textLength="48.8" clip-path="url(#terminal-74038232-line-18 [...]
+</text><text class="terminal-74038232-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-74038232-line-19)">│</text><text class="terminal-74038232-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-74038232-line-19)">-</text><text class="terminal-74038232-r4" x="36.6" y="483.6" textLength="61" clip-path="url(#terminal-74038232-line-19)">-help</text><text class="terminal-74038232-r6" x="158.6" y="483.6" textLength="24.4" clip-path="url(#terminal-74038232-line-19 [...]
+</text><text class="terminal-74038232-r5" x="0" y="508" textLength="1464" clip-path="url(#terminal-74038232-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-74038232-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-74038232-line-20)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_tests.svg b/images/breeze/output_k8s_tests.svg
new file mode 100644
index 0000000000..4a323f88a9
--- /dev/null
+++ b/images/breeze/output_k8s_tests.svg
@@ -0,0 +1,192 @@
+<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" 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;
+    }
+
+    .terminal-3563148538-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-3563148538-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-3563148538-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-3563148538-r2 { fill: #c5c8c6 }
+.terminal-3563148538-r3 { fill: #d0b344;font-weight: bold }
+.terminal-3563148538-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3563148538-r5 { fill: #868887 }
+.terminal-3563148538-r6 { fill: #98a84b;font-weight: bold }
+.terminal-3563148538-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-3563148538-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+    </clipPath>
+    <clipPath id="terminal-3563148538-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-28">
+    <rect x="0" y="684.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-29">
+    <rect x="0" y="709.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-30">
+    <rect x="0" y="733.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3563148538-line-31">
+    <rect x="0" y="757.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="853.2" rx="8"/><text class="terminal-3563148538-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;tests</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(#terminal-3563148538-clip-terminal)">
+    
+    <g class="terminal-3563148538-matrix">
+    <text class="terminal-3563148538-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3563148538-line-0)">
+</text><text class="terminal-3563148538-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3563148538-line-1)">Usage:&#160;</text><text class="terminal-3563148538-r1" x="97.6" y="44.4" textLength="219.6" clip-path="url(#terminal-3563148538-line-1)">breeze&#160;k8s&#160;tests&#160;[</text><text class="terminal-3563148538-r4" x="317.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3563148538-line-1)">OPTIONS</text><text class="terminal-3563148538-r1" x="402.6" y="44.4"  [...]
+</text><text class="terminal-3563148538-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-2)">
+</text><text class="terminal-3563148538-r2" x="12.2" y="93.2" textLength="1037" clip-path="url(#terminal-3563148538-line-3)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).</text><text class="terminal-3563148538-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-3)">
+</text><text class="terminal-3563148538-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-4)">
+</text><text class="terminal-3563148538-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3563148538-line-5)">╭─</text><text class="terminal-3563148538-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3563148538-line-5)">&#160;K8S&#160;tests&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3563148538-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-6)">│</text><text class="terminal-3563148538-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-6)">-</text><text class="terminal-3563148538-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-3563148538-line-6)">-python</text><text class="terminal-3563148538-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-7)">│</text><text class="terminal-3563148538-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-3563148538-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3563148538-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-8)">│</text><text class="terminal-3563148538-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-8)">-</text><text class="terminal-3563148538-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-3563148538-line-8)">-kubernetes</text><text class="terminal-3563148538-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#termi [...]
+</text><text class="terminal-3563148538-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-9)">│</text><text class="terminal-3563148538-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-3563148538-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3563148538-r5" x="1451.8" y="239.6" textLength="12.2" cli [...]
+</text><text class="terminal-3563148538-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3563148538-line-10)">│</text><text class="terminal-3563148538-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-3563148538-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-3563148538-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-11)">│</text><text class="terminal-3563148538-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-11)">-</text><text class="terminal-3563148538-r4" x="36.6" y="288.4" textLength="109.8" clip-path="url(#terminal-3563148538-line-11)">-executor</text><text class="terminal-3563148538-r2" x="341.6" y="288.4" textLength="976" clip-path="url(#termi [...]
+</text><text class="terminal-3563148538-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-12)">│</text><text class="terminal-3563148538-r7" x="341.6" y="312.8" textLength="976" clip-path="url(#terminal-3563148538-line-12)">(KubernetesExecutor&#160;|&#160;CeleryExecutor&#160;|&#160;LocalExecutor&#160;|&#160;CeleryKubernetesExecutor)</text><text class="terminal-3563148538-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-12)">│ [...]
+</text><text class="terminal-3563148538-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-13)">│</text><text class="terminal-3563148538-r5" x="341.6" y="337.2" textLength="976" clip-path="url(#terminal-3563148538-line-13)">[default:&#160;KubernetesExecutor]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3563148538-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-14)">│</text><text class="terminal-3563148538-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-14)">-</text><text class="terminal-3563148538-r4" x="36.6" y="361.6" textLength="73.2" clip-path="url(#terminal-3563148538-line-14)">-force</text><text class="terminal-3563148538-r4" x="109.8" y="361.6" textLength="134.2" clip-path="url(#termina [...]
+</text><text class="terminal-3563148538-r5" x="0" y="386" textLength="1464" clip-path="url(#terminal-3563148538-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3563148538-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-3563148538-line-15)">
+</text><text class="terminal-3563148538-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-3563148538-line-16)">╭─</text><text class="terminal-3563148538-r5" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-3563148538-line-16)">&#160;Parallel&#160;options&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3563148538-r5" x="1439.6" y="410.4" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3563148538-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-17)">│</text><text class="terminal-3563148538-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-17)">-</text><text class="terminal-3563148538-r4" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-3563148538-line-17)">-run</text><text class="terminal-3563148538-r4" x="85.4" y="434.8" textLength="146.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-18)">│</text><text class="terminal-3563148538-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-18)">-</text><text class="terminal-3563148538-r4" x="36.6" y="459.2" textLength="146.4" clip-path="url(#terminal-3563148538-line-18)">-parallelism</text><text class="terminal-3563148538-r2" x="378.2" y="459.2" textLength="915" clip-path="url(#te [...]
+</text><text class="terminal-3563148538-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-19)">│</text><text class="terminal-3563148538-r7" x="378.2" y="483.6" textLength="915" clip-path="url(#terminal-3563148538-line-19)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3563148538-line-20)">│</text><text class="terminal-3563148538-r5" x="378.2" y="508" textLength="915" clip-path="url(#terminal-3563148538-line-20)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3563148538-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-21)">│</text><text class="terminal-3563148538-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-21)">-</text><text class="terminal-3563148538-r4" x="36.6" y="532.4" textLength="85.4" clip-path="url(#terminal-3563148538-line-21)">-python</text><text class="terminal-3563148538-r4" x="122" y="532.4" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-3563148538-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-22)">│</text><text class="terminal-3563148538-r5" x="378.2" y="556.8" textLength="951.6" clip-path="url(#terminal-3563148538-line-22)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-23)">│</text><text class="terminal-3563148538-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-3563148538-line-23)">-</text><text class="terminal-3563148538-r4" x="36.6" y="581.2" textLength="134.2" clip-path="url(#terminal-3563148538-line-23)">-kubernetes</text><text class="terminal-3563148538-r4" x="170.8" y="581.2" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-3563148538-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-24)">│</text><text class="terminal-3563148538-r5" x="378.2" y="605.6" textLength="756.4" clip-path="url(#terminal-3563148538-line-24)">[default:&#160;v1.24.2&#160;v1.23.6&#160;v1.22.9&#160;v1.21.12]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3563148538-r5" x="1451.8" y="605 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3563148538-line-25)">│</text><text class="terminal-3563148538-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-3563148538-line-25)">-</text><text class="terminal-3563148538-r4" x="36.6" y="630" textLength="97.6" clip-path="url(#terminal-3563148538-line-25)">-include</text><text class="terminal-3563148538-r4" x="134.2" y="630" textLength="195.2" clip-path="url(#terminal-3563 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-26)">│</text><text class="terminal-3563148538-r2" x="378.2" y="654.4" textLength="1061.4" clip-path="url(#terminal-3563148538-line-26)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-3563148538-r5" x="0" y="678.8" textLength="1464" clip-path="url(#terminal-3563148538-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3563148538-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-27)">
+</text><text class="terminal-3563148538-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#terminal-3563148538-line-28)">╭─</text><text class="terminal-3563148538-r5" x="24.4" y="703.2" textLength="1415.2" clip-path="url(#terminal-3563148538-line-28)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3563148538-r5" x="1439.6" y="703.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3563148538-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-29)">│</text><text class="terminal-3563148538-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3563148538-line-29)">-</text><text class="terminal-3563148538-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#terminal-3563148538-line-29)">-verbose</text><text class="terminal-3563148538-r6" x="158.6" y="727.6" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-3563148538-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3563148538-line-30)">│</text><text class="terminal-3563148538-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-3563148538-line-30)">-</text><text class="terminal-3563148538-r4" x="36.6" y="752" textLength="48.8" clip-path="url(#terminal-3563148538-line-30)">-dry</text><text class="terminal-3563148538-r4" x="85.4" y="752" textLength="48.8" clip-path="url(#terminal-3563148538 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-31)">│</text><text class="terminal-3563148538-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-3563148538-line-31)">-</text><text class="terminal-3563148538-r4" x="36.6" y="776.4" textLength="61" clip-path="url(#terminal-3563148538-line-31)">-help</text><text class="terminal-3563148538-r6" x="158.6" y="776.4" textLength="24.4" clip-path="url(#terminal-35 [...]
+</text><text class="terminal-3563148538-r5" x="0" y="800.8" textLength="1464" clip-path="url(#terminal-3563148538-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3563148538-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-3563148538-line-32)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_k8s_upload-k8s-image.svg b/images/breeze/output_k8s_upload-k8s-image.svg
new file mode 100644
index 0000000000..281aeb1dfc
--- /dev/null
+++ b/images/breeze/output_k8s_upload-k8s-image.svg
@@ -0,0 +1,176 @@
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .terminal-3807892499-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-3807892499-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-3807892499-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-3807892499-r2 { fill: #c5c8c6 }
+.terminal-3807892499-r3 { fill: #d0b344;font-weight: bold }
+.terminal-3807892499-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3807892499-r5 { fill: #868887 }
+.terminal-3807892499-r6 { fill: #98a84b;font-weight: bold }
+.terminal-3807892499-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-3807892499-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
+    </clipPath>
+    <clipPath id="terminal-3807892499-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-3807892499-line-27">
+    <rect x="0" y="660.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="755.6" rx="8"/><text class="terminal-3807892499-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;upload-k8s-image</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(#terminal-3807892499-clip-terminal)">
+    
+    <g class="terminal-3807892499-matrix">
+    <text class="terminal-3807892499-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3807892499-line-0)">
+</text><text class="terminal-3807892499-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3807892499-line-1)">Usage:&#160;</text><text class="terminal-3807892499-r1" x="97.6" y="44.4" textLength="353.8" clip-path="url(#terminal-3807892499-line-1)">breeze&#160;k8s&#160;upload-k8s-image&#160;[</text><text class="terminal-3807892499-r4" x="451.4" y="44.4" textLength="85.4" clip-path="url(#terminal-3807892499-line-1)">OPTIONS</text><text class="terminal-3807892499-r1" x="536.8 [...]
+</text><text class="terminal-3807892499-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-2)">
+</text><text class="terminal-3807892499-r2" x="12.2" y="93.2" textLength="1110.2" clip-path="url(#terminal-3807892499-line-3)">Upload&#160;k8s-ready&#160;airflow&#160;image&#160;to&#160;the&#160;KinD&#160;cluster&#160;(optionally&#160;to&#160;all&#160;clusters&#160;in&#160;parallel)</text><text class="terminal-3807892499-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-3)">
+</text><text class="terminal-3807892499-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-4)">
+</text><text class="terminal-3807892499-r5" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3807892499-line-5)">╭─</text><text class="terminal-3807892499-r5" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3807892499-line-5)">&#160;Upload&#160;image&#160;flags&#160;────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3807892499-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-6)">│</text><text class="terminal-3807892499-r4" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-6)">-</text><text class="terminal-3807892499-r4" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-3807892499-line-6)">-python</text><text class="terminal-3807892499-r6" x="292.8" y="166.4" textLength="24.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-7)">│</text><text class="terminal-3807892499-r5" x="341.6" y="190.8" textLength="732" clip-path="url(#terminal-3807892499-line-7)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3807892499-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-8)">│</text><text class="terminal-3807892499-r4" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-8)">-</text><text class="terminal-3807892499-r4" x="36.6" y="215.2" textLength="134.2" clip-path="url(#terminal-3807892499-line-8)">-kubernetes</text><text class="terminal-3807892499-r4" x="170.8" y="215.2" textLength="97.6" clip-path="url(#termi [...]
+</text><text class="terminal-3807892499-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-9)">│</text><text class="terminal-3807892499-r7" x="341.6" y="239.6" textLength="658.8" clip-path="url(#terminal-3807892499-line-9)">(v1.24.2&#160;|&#160;v1.23.6&#160;|&#160;v1.22.9&#160;|&#160;v1.21.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3807892499-r5" x="1451.8" y="239.6" textLength="12.2" cli [...]
+</text><text class="terminal-3807892499-r5" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3807892499-line-10)">│</text><text class="terminal-3807892499-r5" x="341.6" y="264" textLength="658.8" clip-path="url(#terminal-3807892499-line-10)">[default:&#160;v1.24.2]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-3807892499-r5" x="0" y="288.4" textLength="1464" clip-path="url(#terminal-3807892499-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3807892499-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-11)">
+</text><text class="terminal-3807892499-r5" x="0" y="312.8" textLength="24.4" clip-path="url(#terminal-3807892499-line-12)">╭─</text><text class="terminal-3807892499-r5" x="24.4" y="312.8" textLength="1415.2" clip-path="url(#terminal-3807892499-line-12)">&#160;Parallel&#160;options&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3807892499-r5" x="1439.6" y="312.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3807892499-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-13)">│</text><text class="terminal-3807892499-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-13)">-</text><text class="terminal-3807892499-r4" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-3807892499-line-13)">-run</text><text class="terminal-3807892499-r4" x="85.4" y="337.2" textLength="146.4" clip-path="url(#terminal-3 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-14)">│</text><text class="terminal-3807892499-r4" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-14)">-</text><text class="terminal-3807892499-r4" x="36.6" y="361.6" textLength="146.4" clip-path="url(#terminal-3807892499-line-14)">-parallelism</text><text class="terminal-3807892499-r2" x="378.2" y="361.6" textLength="915" clip-path="url(#te [...]
+</text><text class="terminal-3807892499-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3807892499-line-15)">│</text><text class="terminal-3807892499-r7" x="378.2" y="386" textLength="915" clip-path="url(#terminal-3807892499-line-15)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-3807892499-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-16)">│</text><text class="terminal-3807892499-r5" x="378.2" y="410.4" textLength="915" clip-path="url(#terminal-3807892499-line-16)">[default:&#160;7;&#160;1&lt;=x&lt;=14]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-17)">│</text><text class="terminal-3807892499-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-17)">-</text><text class="terminal-3807892499-r4" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-3807892499-line-17)">-python</text><text class="terminal-3807892499-r4" x="122" y="434.8" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-3807892499-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-18)">│</text><text class="terminal-3807892499-r5" x="378.2" y="459.2" textLength="951.6" clip-path="url(#terminal-3807892499-line-18)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-19)">│</text><text class="terminal-3807892499-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-3807892499-line-19)">-</text><text class="terminal-3807892499-r4" x="36.6" y="483.6" textLength="134.2" clip-path="url(#terminal-3807892499-line-19)">-kubernetes</text><text class="terminal-3807892499-r4" x="170.8" y="483.6" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-3807892499-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3807892499-line-20)">│</text><text class="terminal-3807892499-r5" x="378.2" y="508" textLength="756.4" clip-path="url(#terminal-3807892499-line-20)">[default:&#160;v1.24.2&#160;v1.23.6&#160;v1.22.9&#160;v1.21.12]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3807892499-r5" x="1451.8" y="508" te [...]
+</text><text class="terminal-3807892499-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-21)">│</text><text class="terminal-3807892499-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-21)">-</text><text class="terminal-3807892499-r4" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-3807892499-line-21)">-include</text><text class="terminal-3807892499-r4" x="134.2" y="532.4" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-3807892499-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-22)">│</text><text class="terminal-3807892499-r2" x="378.2" y="556.8" textLength="1061.4" clip-path="url(#terminal-3807892499-line-22)">printed).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-3807892499-r5" x="0" y="581.2" textLength="1464" clip-path="url(#terminal-3807892499-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3807892499-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-23)">
+</text><text class="terminal-3807892499-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#terminal-3807892499-line-24)">╭─</text><text class="terminal-3807892499-r5" x="24.4" y="605.6" textLength="1415.2" clip-path="url(#terminal-3807892499-line-24)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3807892499-r5" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3807892499-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3807892499-line-25)">│</text><text class="terminal-3807892499-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-3807892499-line-25)">-</text><text class="terminal-3807892499-r4" x="36.6" y="630" textLength="97.6" clip-path="url(#terminal-3807892499-line-25)">-verbose</text><text class="terminal-3807892499-r6" x="158.6" y="630" textLength="24.4" clip-path="url(#terminal-38078 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-26)">│</text><text class="terminal-3807892499-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-3807892499-line-26)">-</text><text class="terminal-3807892499-r4" x="36.6" y="654.4" textLength="48.8" clip-path="url(#terminal-3807892499-line-26)">-dry</text><text class="terminal-3807892499-r4" x="85.4" y="654.4" textLength="48.8" clip-path="url(#terminal-38 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-27)">│</text><text class="terminal-3807892499-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-3807892499-line-27)">-</text><text class="terminal-3807892499-r4" x="36.6" y="678.8" textLength="61" clip-path="url(#terminal-3807892499-line-27)">-help</text><text class="terminal-3807892499-r6" x="158.6" y="678.8" textLength="24.4" clip-path="url(#terminal-38 [...]
+</text><text class="terminal-3807892499-r5" x="0" y="703.2" textLength="1464" clip-path="url(#terminal-3807892499-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3807892499-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-3807892499-line-28)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output_release-management_prepare-provider-documentation.svg b/images/breeze/output_release-management_prepare-provider-documentation.svg
index 4f42acadda..4631da0d0f 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.svg
+++ b/images/breeze/output_release-management_prepare-provider-documentation.svg
@@ -35,8 +35,8 @@
     .terminal-3043648472-r1 { fill: #c5c8c6;font-weight: bold }
 .terminal-3043648472-r2 { fill: #c5c8c6 }
 .terminal-3043648472-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3043648472-r4 { fill: #868887 }
-.terminal-3043648472-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-3043648472-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3043648472-r5 { fill: #868887 }
 .terminal-3043648472-r6 { fill: #98a84b;font-weight: bold }
 .terminal-3043648472-r7 { fill: #8d7b39 }
     </style>
@@ -148,7 +148,7 @@
     
     <g class="terminal-3043648472-matrix">
     <text class="terminal-3043648472-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3043648472-line-0)">
-</text><text class="terminal-3043648472-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3043648472-line-1)">Usage:&#160;</text><text class="terminal-3043648472-r1" x="97.6" y="44.4" textLength="1342" clip-path="url(#terminal-3043648472-line-1)">breeze&#160;release-management&#160;prepare-provider-documentation&#160;[OPTIONS]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="terminal-3043648472-r2" x="1464" y="44.4" tex [...]
+</text><text class="terminal-3043648472-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3043648472-line-1)">Usage:&#160;</text><text class="terminal-3043648472-r1" x="97.6" y="44.4" textLength="707.6" clip-path="url(#terminal-3043648472-line-1)">breeze&#160;release-management&#160;prepare-provider-documentation&#160;[</text><text class="terminal-3043648472-r4" x="805.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3043648472-line-1)">OPTIONS</text><text class="ter [...]
 </text><text class="terminal-3043648472-r1" x="12.2" y="68.8" textLength="1366.4" clip-path="url(#terminal-3043648472-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
 </text><text class="terminal-3043648472-r1" x="12.2" y="93.2" textLength="1439.6" clip-path="url(#terminal-3043648472-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
 </text><text class="terminal-3043648472-r1" x="12.2" y="117.6" textLength="1317.6" clip-path="url(#terminal-3043648472-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
@@ -166,18 +166,18 @@
 </text><text class="terminal-3043648472-r1" x="12.2" y="410.4" textLength="1427.4" clip-path="url(#terminal-3043648472-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
 </text><text class="terminal-3043648472-r1" x="12.2" y="434.8" textLength="1146.8" clip-path="url(#terminal-3043648472-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
 </text><text class="terminal-3043648472-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-18)">
-</text><text class="terminal-3043648472-r2" x="12.2" y="483.6" textLength="780.8" clip-path="url(#terminal-3043648472-line-19)">Prepare&#160;CHANGELOG,&#160;README&#160;and&#160;COMMITS&#160;information&#160;for&#160;providers.</text><text class="terminal-3043648472-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3043648472-line-19)">
+</text><text class="terminal-3043648472-r2" x="12.2" y="483.6" textLength="97.6" clip-path="url(#terminal-3043648472-line-19)">Prepare&#160;</text><text class="terminal-3043648472-r4" x="109.8" y="483.6" textLength="109.8" clip-path="url(#terminal-3043648472-line-19)">CHANGELOG</text><text class="terminal-3043648472-r2" x="219.6" y="483.6" textLength="24.4" clip-path="url(#terminal-3043648472-line-19)">,&#160;</text><text class="terminal-3043648472-r4" x="244" y="483.6" textLength="73.2" [...]
 </text><text class="terminal-3043648472-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-3043648472-line-20)">
-</text><text class="terminal-3043648472-r4" x="0" y="532.4" textLength="24.4" clip-path="url(#terminal-3043648472-line-21)">╭─</text><text class="terminal-3043648472-r4" x="24.4" y="532.4" textLength="1415.2" clip-path="url(#terminal-3043648472-line-21)">&#160;Provider&#160;documentation&#160;preparation&#160;flags&#160;──────────────────────────────────────────────────────────────────────────</text><text class="terminal-3043648472-r4" x="1439.6" y="532.4" textLength="24.4" clip-path="ur [...]
-</text><text class="terminal-3043648472-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-22)">│</text><text class="terminal-3043648472-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-22)">-</text><text class="terminal-3043648472-r5" x="36.6" y="556.8" textLength="73.2" clip-path="url(#terminal-3043648472-line-22)">-debug</text><text class="terminal-3043648472-r2" x="158.6" y="556.8" textLength="878.4" clip-path="url(#termina [...]
-</text><text class="terminal-3043648472-r4" x="0" y="581.2" textLength="1464" clip-path="url(#terminal-3043648472-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3043648472-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-23)">
-</text><text class="terminal-3043648472-r4" x="0" y="605.6" textLength="24.4" clip-path="url(#terminal-3043648472-line-24)">╭─</text><text class="terminal-3043648472-r4" x="24.4" y="605.6" textLength="1415.2" clip-path="url(#terminal-3043648472-line-24)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3043648472-r4" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-3043648472-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3043648472-line-25)">│</text><text class="terminal-3043648472-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-3043648472-line-25)">-</text><text class="terminal-3043648472-r5" x="36.6" y="630" textLength="97.6" clip-path="url(#terminal-3043648472-line-25)">-verbose</text><text class="terminal-3043648472-r6" x="280.6" y="630" textLength="24.4" clip-path="url(#terminal-30436 [...]
-</text><text class="terminal-3043648472-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3043648472-line-26)">│</text><text class="terminal-3043648472-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-3043648472-line-26)">-</text><text class="terminal-3043648472-r5" x="36.6" y="654.4" textLength="48.8" clip-path="url(#terminal-3043648472-line-26)">-dry</text><text class="terminal-3043648472-r5" x="85.4" y="654.4" textLength="48.8" clip-path="url(#terminal-30 [...]
-</text><text class="terminal-3043648472-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-27)">│</text><text class="terminal-3043648472-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-27)">-</text><text class="terminal-3043648472-r5" x="36.6" y="678.8" textLength="85.4" clip-path="url(#terminal-3043648472-line-27)">-github</text><text class="terminal-3043648472-r5" x="122" y="678.8" textLength="134.2" clip-path="url(#terminal [...]
-</text><text class="terminal-3043648472-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-28)">│</text><text class="terminal-3043648472-r5" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-28)">-</text><text class="terminal-3043648472-r5" x="36.6" y="703.2" textLength="85.4" clip-path="url(#terminal-3043648472-line-28)">-answer</text><text class="terminal-3043648472-r6" x="280.6" y="703.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-3043648472-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3043648472-line-29)">│</text><text class="terminal-3043648472-r5" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3043648472-line-29)">-</text><text class="terminal-3043648472-r5" x="36.6" y="727.6" textLength="61" clip-path="url(#terminal-3043648472-line-29)">-help</text><text class="terminal-3043648472-r6" x="280.6" y="727.6" textLength="24.4" clip-path="url(#terminal-30 [...]
-</text><text class="terminal-3043648472-r4" x="0" y="752" textLength="1464" clip-path="url(#terminal-3043648472-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3043648472-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-3043648472-line-30)">
+</text><text class="terminal-3043648472-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#terminal-3043648472-line-21)">╭─</text><text class="terminal-3043648472-r5" x="24.4" y="532.4" textLength="1415.2" clip-path="url(#terminal-3043648472-line-21)">&#160;Provider&#160;documentation&#160;preparation&#160;flags&#160;──────────────────────────────────────────────────────────────────────────</text><text class="terminal-3043648472-r5" x="1439.6" y="532.4" textLength="24.4" clip-path="ur [...]
+</text><text class="terminal-3043648472-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-22)">│</text><text class="terminal-3043648472-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-22)">-</text><text class="terminal-3043648472-r4" x="36.6" y="556.8" textLength="73.2" clip-path="url(#terminal-3043648472-line-22)">-debug</text><text class="terminal-3043648472-r2" x="158.6" y="556.8" textLength="878.4" clip-path="url(#termina [...]
+</text><text class="terminal-3043648472-r5" x="0" y="581.2" textLength="1464" clip-path="url(#terminal-3043648472-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3043648472-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-23)">
+</text><text class="terminal-3043648472-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#terminal-3043648472-line-24)">╭─</text><text class="terminal-3043648472-r5" x="24.4" y="605.6" textLength="1415.2" clip-path="url(#terminal-3043648472-line-24)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3043648472-r5" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3043648472-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3043648472-line-25)">│</text><text class="terminal-3043648472-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-3043648472-line-25)">-</text><text class="terminal-3043648472-r4" x="36.6" y="630" textLength="97.6" clip-path="url(#terminal-3043648472-line-25)">-verbose</text><text class="terminal-3043648472-r6" x="280.6" y="630" textLength="24.4" clip-path="url(#terminal-30436 [...]
+</text><text class="terminal-3043648472-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3043648472-line-26)">│</text><text class="terminal-3043648472-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-3043648472-line-26)">-</text><text class="terminal-3043648472-r4" x="36.6" y="654.4" textLength="48.8" clip-path="url(#terminal-3043648472-line-26)">-dry</text><text class="terminal-3043648472-r4" x="85.4" y="654.4" textLength="48.8" clip-path="url(#terminal-30 [...]
+</text><text class="terminal-3043648472-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-27)">│</text><text class="terminal-3043648472-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-3043648472-line-27)">-</text><text class="terminal-3043648472-r4" x="36.6" y="678.8" textLength="85.4" clip-path="url(#terminal-3043648472-line-27)">-github</text><text class="terminal-3043648472-r4" x="122" y="678.8" textLength="134.2" clip-path="url(#terminal [...]
+</text><text class="terminal-3043648472-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-28)">│</text><text class="terminal-3043648472-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-3043648472-line-28)">-</text><text class="terminal-3043648472-r4" x="36.6" y="703.2" textLength="85.4" clip-path="url(#terminal-3043648472-line-28)">-answer</text><text class="terminal-3043648472-r6" x="280.6" y="703.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3043648472-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3043648472-line-29)">│</text><text class="terminal-3043648472-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3043648472-line-29)">-</text><text class="terminal-3043648472-r4" x="36.6" y="727.6" textLength="61" clip-path="url(#terminal-3043648472-line-29)">-help</text><text class="terminal-3043648472-r6" x="280.6" y="727.6" textLength="24.4" clip-path="url(#terminal-30 [...]
+</text><text class="terminal-3043648472-r5" x="0" y="752" textLength="1464" clip-path="url(#terminal-3043648472-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3043648472-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-3043648472-line-30)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management_prepare-provider-packages.svg b/images/breeze/output_release-management_prepare-provider-packages.svg
index 9f457a0e4a..81bf4c1892 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.svg
+++ b/images/breeze/output_release-management_prepare-provider-packages.svg
@@ -35,8 +35,8 @@
     .terminal-3181300188-r1 { fill: #c5c8c6;font-weight: bold }
 .terminal-3181300188-r2 { fill: #c5c8c6 }
 .terminal-3181300188-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3181300188-r4 { fill: #868887 }
-.terminal-3181300188-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-3181300188-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3181300188-r5 { fill: #868887 }
 .terminal-3181300188-r6 { fill: #8d7b39 }
 .terminal-3181300188-r7 { fill: #98a84b;font-weight: bold }
     </style>
@@ -151,7 +151,7 @@
     
     <g class="terminal-3181300188-matrix">
     <text class="terminal-3181300188-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3181300188-line-0)">
-</text><text class="terminal-3181300188-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3181300188-line-1)">Usage:&#160;</text><text class="terminal-3181300188-r1" x="97.6" y="44.4" textLength="1281" clip-path="url(#terminal-3181300188-line-1)">breeze&#160;release-management&#160;prepare-provider-packages&#160;[OPTIONS]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="terminal-3181300188-r2" x="1464" y="44.4" textLeng [...]
+</text><text class="terminal-3181300188-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3181300188-line-1)">Usage:&#160;</text><text class="terminal-3181300188-r1" x="97.6" y="44.4" textLength="646.6" clip-path="url(#terminal-3181300188-line-1)">breeze&#160;release-management&#160;prepare-provider-packages&#160;[</text><text class="terminal-3181300188-r4" x="744.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3181300188-line-1)">OPTIONS</text><text class="terminal [...]
 </text><text class="terminal-3181300188-r1" x="12.2" y="68.8" textLength="1305.4" clip-path="url(#terminal-3181300188-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cass [...]
 </text><text class="terminal-3181300188-r1" x="12.2" y="93.2" textLength="1403" clip-path="url(#terminal-3181300188-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.hdfs&# [...]
 </text><text class="terminal-3181300188-r1" x="12.2" y="117.6" textLength="1415.2" clip-path="url(#terminal-3181300188-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.pig [...]
@@ -170,18 +170,18 @@
 </text><text class="terminal-3181300188-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-17)">
 </text><text class="terminal-3181300188-r2" x="12.2" y="459.2" textLength="585.6" clip-path="url(#terminal-3181300188-line-18)">Prepare&#160;sdist/whl&#160;packages&#160;of&#160;Airflow&#160;Providers.</text><text class="terminal-3181300188-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-18)">
 </text><text class="terminal-3181300188-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-19)">
-</text><text class="terminal-3181300188-r4" x="0" y="508" textLength="24.4" clip-path="url(#terminal-3181300188-line-20)">╭─</text><text class="terminal-3181300188-r4" x="24.4" y="508" textLength="1415.2" clip-path="url(#terminal-3181300188-line-20)">&#160;Package&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3181300188-r4" x="1439.6" y="508" textLength="24.4" clip-path="url(#terminal-3181 [...]
-</text><text class="terminal-3181300188-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-21)">│</text><text class="terminal-3181300188-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-21)">-</text><text class="terminal-3181300188-r5" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-3181300188-line-21)">-package</text><text class="terminal-3181300188-r5" x="134.2" y="532.4" textLength="85.4" clip-path="url(#termin [...]
-</text><text class="terminal-3181300188-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-22)">│</text><text class="terminal-3181300188-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-22)">-</text><text class="terminal-3181300188-r5" x="36.6" y="556.8" textLength="97.6" clip-path="url(#terminal-3181300188-line-22)">-version</text><text class="terminal-3181300188-r5" x="134.2" y="556.8" textLength="195.2" clip-path="url(#termi [...]
-</text><text class="terminal-3181300188-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-23)">│</text><text class="terminal-3181300188-r5" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-23)">-</text><text class="terminal-3181300188-r5" x="36.6" y="581.2" textLength="97.6" clip-path="url(#terminal-3181300188-line-23)">-package</text><text class="terminal-3181300188-r5" x="134.2" y="581.2" textLength="122" clip-path="url(#termina [...]
-</text><text class="terminal-3181300188-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-24)">│</text><text class="terminal-3181300188-r5" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-24)">-</text><text class="terminal-3181300188-r5" x="36.6" y="605.6" textLength="73.2" clip-path="url(#terminal-3181300188-line-24)">-debug</text><text class="terminal-3181300188-r2" x="378.2" y="605.6" textLength="878.4" clip-path="url(#termina [...]
-</text><text class="terminal-3181300188-r4" x="0" y="630" textLength="1464" clip-path="url(#terminal-3181300188-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3181300188-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-3181300188-line-25)">
-</text><text class="terminal-3181300188-r4" x="0" y="654.4" textLength="24.4" clip-path="url(#terminal-3181300188-line-26)">╭─</text><text class="terminal-3181300188-r4" x="24.4" y="654.4" textLength="1415.2" clip-path="url(#terminal-3181300188-line-26)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3181300188-r4" x="1439.6" y="654.4" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-3181300188-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-27)">│</text><text class="terminal-3181300188-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-27)">-</text><text class="terminal-3181300188-r5" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-3181300188-line-27)">-verbose</text><text class="terminal-3181300188-r7" x="280.6" y="678.8" textLength="24.4" clip-path="url(#termin [...]
-</text><text class="terminal-3181300188-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-28)">│</text><text class="terminal-3181300188-r5" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-28)">-</text><text class="terminal-3181300188-r5" x="36.6" y="703.2" textLength="48.8" clip-path="url(#terminal-3181300188-line-28)">-dry</text><text class="terminal-3181300188-r5" x="85.4" y="703.2" textLength="48.8" clip-path="url(#terminal-31 [...]
-</text><text class="terminal-3181300188-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-29)">│</text><text class="terminal-3181300188-r5" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-29)">-</text><text class="terminal-3181300188-r5" x="36.6" y="727.6" textLength="85.4" clip-path="url(#terminal-3181300188-line-29)">-github</text><text class="terminal-3181300188-r5" x="122" y="727.6" textLength="134.2" clip-path="url(#terminal [...]
-</text><text class="terminal-3181300188-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3181300188-line-30)">│</text><text class="terminal-3181300188-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-3181300188-line-30)">-</text><text class="terminal-3181300188-r5" x="36.6" y="752" textLength="61" clip-path="url(#terminal-3181300188-line-30)">-help</text><text class="terminal-3181300188-r7" x="280.6" y="752" textLength="24.4" clip-path="url(#terminal-3181300188 [...]
-</text><text class="terminal-3181300188-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-3181300188-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3181300188-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-31)">
+</text><text class="terminal-3181300188-r5" x="0" y="508" textLength="24.4" clip-path="url(#terminal-3181300188-line-20)">╭─</text><text class="terminal-3181300188-r5" x="24.4" y="508" textLength="1415.2" clip-path="url(#terminal-3181300188-line-20)">&#160;Package&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3181300188-r5" x="1439.6" y="508" textLength="24.4" clip-path="url(#terminal-3181 [...]
+</text><text class="terminal-3181300188-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-21)">│</text><text class="terminal-3181300188-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-21)">-</text><text class="terminal-3181300188-r4" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-3181300188-line-21)">-package</text><text class="terminal-3181300188-r4" x="134.2" y="532.4" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-3181300188-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-22)">│</text><text class="terminal-3181300188-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-22)">-</text><text class="terminal-3181300188-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#terminal-3181300188-line-22)">-version</text><text class="terminal-3181300188-r4" x="134.2" y="556.8" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-3181300188-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-23)">│</text><text class="terminal-3181300188-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-23)">-</text><text class="terminal-3181300188-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#terminal-3181300188-line-23)">-package</text><text class="terminal-3181300188-r4" x="134.2" y="581.2" textLength="122" clip-path="url(#termina [...]
+</text><text class="terminal-3181300188-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-24)">│</text><text class="terminal-3181300188-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-24)">-</text><text class="terminal-3181300188-r4" x="36.6" y="605.6" textLength="73.2" clip-path="url(#terminal-3181300188-line-24)">-debug</text><text class="terminal-3181300188-r2" x="378.2" y="605.6" textLength="878.4" clip-path="url(#termina [...]
+</text><text class="terminal-3181300188-r5" x="0" y="630" textLength="1464" clip-path="url(#terminal-3181300188-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3181300188-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-3181300188-line-25)">
+</text><text class="terminal-3181300188-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#terminal-3181300188-line-26)">╭─</text><text class="terminal-3181300188-r5" x="24.4" y="654.4" textLength="1415.2" clip-path="url(#terminal-3181300188-line-26)">&#160;Common&#160;options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3181300188-r5" x="1439.6" y="654.4" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3181300188-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-27)">│</text><text class="terminal-3181300188-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-3181300188-line-27)">-</text><text class="terminal-3181300188-r4" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-3181300188-line-27)">-verbose</text><text class="terminal-3181300188-r7" x="280.6" y="678.8" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-3181300188-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-28)">│</text><text class="terminal-3181300188-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-3181300188-line-28)">-</text><text class="terminal-3181300188-r4" x="36.6" y="703.2" textLength="48.8" clip-path="url(#terminal-3181300188-line-28)">-dry</text><text class="terminal-3181300188-r4" x="85.4" y="703.2" textLength="48.8" clip-path="url(#terminal-31 [...]
+</text><text class="terminal-3181300188-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-29)">│</text><text class="terminal-3181300188-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3181300188-line-29)">-</text><text class="terminal-3181300188-r4" x="36.6" y="727.6" textLength="85.4" clip-path="url(#terminal-3181300188-line-29)">-github</text><text class="terminal-3181300188-r4" x="122" y="727.6" textLength="134.2" clip-path="url(#terminal [...]
+</text><text class="terminal-3181300188-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3181300188-line-30)">│</text><text class="terminal-3181300188-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-3181300188-line-30)">-</text><text class="terminal-3181300188-r4" x="36.6" y="752" textLength="61" clip-path="url(#terminal-3181300188-line-30)">-help</text><text class="terminal-3181300188-r7" x="280.6" y="752" textLength="24.4" clip-path="url(#terminal-3181300188 [...]
+</text><text class="terminal-3181300188-r5" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-3181300188-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3181300188-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-3181300188-line-31)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_setup_regenerate-command-images.svg b/images/breeze/output_setup_regenerate-command-images.svg
index cc1c4e0727..2091185f16 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -1,4 +1,4 @@
... 2380 lines suppressed ...