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

utkarsharma pushed a commit to branch sync_2-10-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit f593d8b07386320a0eb9c1a1a75af41a0d284996
Author: Jarek Potiuk <[email protected]>
AuthorDate: Mon Nov 4 09:59:29 2024 +0100

    Allow to switch breeze to use uv internally to create virtualenvs (#43587) 
(#43624)
    
    Breeze sometimes creates "internal" virtualenvs in local ".build"
    directory when it needs - for example in order to run k8s tests
    or for release management commands.
    
    This PR adds capability to switch breeze to use `uv` instead of
    `pip` to install depdendencies in those envs.
    
    You can now switch breeze to use uv by `breeze setup config --use-uv`
    and switch back to pip by `breeze setup config --no-use-uv`.
    
    (cherry picked from commit a2a0ef09357f278bde031092e395f13286fd3076)
---
 .github/workflows/ci.yml                           |  1 +
 .github/workflows/k8s-tests.yml                    |  7 ++++
 Dockerfile                                         |  4 +--
 Dockerfile.ci                                      |  8 ++---
 dev/breeze/doc/ci/02_images.md                     |  4 +--
 dev/breeze/doc/images/output-commands.svg          | 42 +++++++++++-----------
 dev/breeze/doc/images/output_setup_config.svg      | 32 +++++++++--------
 dev/breeze/doc/images/output_setup_config.txt      |  2 +-
 .../commands/release_management_commands.py        | 10 ++++--
 .../src/airflow_breeze/commands/setup_commands.py  | 31 ++++++++++++----
 .../commands/setup_commands_config.py              |  1 +
 dev/breeze/src/airflow_breeze/global_constants.py  |  3 +-
 .../src/airflow_breeze/utils/kubernetes_utils.py   | 27 +++++++++++---
 dev/breeze/src/airflow_breeze/utils/run_tests.py   |  6 ++--
 .../src/airflow_breeze/utils/virtualenv_utils.py   | 30 ++++++++++++++--
 scripts/ci/install_breeze.sh                       |  2 +-
 scripts/ci/pre_commit/update_installers.py         |  6 +++-
 17 files changed, 150 insertions(+), 66 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 866f8f253d4..c94518489d2 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -622,6 +622,7 @@ jobs:
       kubernetes-versions-list-as-string: ${{ 
needs.build-info.outputs.kubernetes-versions-list-as-string }}
       kubernetes-combos-list-as-string: ${{ 
needs.build-info.outputs.kubernetes-combos-list-as-string }}
       include-success-outputs: ${{ 
needs.build-info.outputs.include-success-outputs }}
+      use-uv: ${{ needs.build-info.outputs.force-pip && 'false' || 'true' }}
       debug-resources: ${{ needs.build-info.outputs.debug-resources }}
     if: >
       ( needs.build-info.outputs.run-kubernetes-tests == 'true' ||
diff --git a/.github/workflows/k8s-tests.yml b/.github/workflows/k8s-tests.yml
index c4b72a9afc9..9a764e88c4e 100644
--- a/.github/workflows/k8s-tests.yml
+++ b/.github/workflows/k8s-tests.yml
@@ -44,6 +44,10 @@ on:  # yamllint disable-line rule:truthy
         description: "Whether to include success outputs"
         required: true
         type: string
+      use-uv:
+        description: "Whether to use uv"
+        required: true
+        type: string
       debug-resources:
         description: "Whether to debug resources"
         required: true
@@ -96,6 +100,9 @@ jobs:
           key: "\
             k8s-env-${{ steps.breeze.outputs.host-python-version }}-\
             ${{ 
hashFiles('scripts/ci/kubernetes/k8s_requirements.txt','hatch_build.py') }}"
+      - name: "Switch breeze to use uv"
+        run: breeze setup-config --use-uv
+        if: inputs.use-uv == 'true'
       - name: Run complete K8S tests ${{ 
inputs.kubernetes-combos-list-as-string }}
         run: breeze k8s run-complete-tests --run-in-parallel --upgrade 
--no-copy-local-sources
         env:
diff --git a/Dockerfile b/Dockerfile
index cf5226c0008..4cdf1a8bb34 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -49,8 +49,8 @@ ARG AIRFLOW_VERSION="2.9.3"
 
 ARG PYTHON_BASE_IMAGE="python:3.8-slim-bookworm"
 
-ARG AIRFLOW_PIP_VERSION=24.2
-ARG AIRFLOW_UV_VERSION=0.4.1
+ARG AIRFLOW_PIP_VERSION=24.3.1
+ARG AIRFLOW_UV_VERSION=0.4.29
 ARG AIRFLOW_USE_UV="false"
 ARG UV_HTTP_TIMEOUT="300"
 ARG AIRFLOW_IMAGE_REPOSITORY="https://github.com/apache/airflow";
diff --git a/Dockerfile.ci b/Dockerfile.ci
index d23e810fa36..e188a7ec391 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -1297,8 +1297,8 @@ ARG DEFAULT_CONSTRAINTS_BRANCH="constraints-main"
 # It can also be overwritten manually by setting the AIRFLOW_CI_BUILD_EPOCH 
environment variable.
 ARG AIRFLOW_CI_BUILD_EPOCH="10"
 ARG AIRFLOW_PRE_CACHED_PIP_PACKAGES="true"
-ARG AIRFLOW_PIP_VERSION=24.2
-ARG AIRFLOW_UV_VERSION=0.4.1
+ARG AIRFLOW_PIP_VERSION=24.3.1
+ARG AIRFLOW_UV_VERSION=0.4.29
 ARG AIRFLOW_USE_UV="true"
 # Setup PIP
 # By default PIP install run without cache to make image smaller
@@ -1321,8 +1321,8 @@ ARG AIRFLOW_VERSION=""
 # Additional PIP flags passed to all pip install commands except reinstalling 
pip itself
 ARG ADDITIONAL_PIP_INSTALL_FLAGS=""
 
-ARG AIRFLOW_PIP_VERSION=24.2
-ARG AIRFLOW_UV_VERSION=0.4.1
+ARG AIRFLOW_PIP_VERSION=24.3.1
+ARG AIRFLOW_UV_VERSION=0.4.29
 ARG AIRFLOW_USE_UV="true"
 
 ENV AIRFLOW_REPO=${AIRFLOW_REPO}\
diff --git a/dev/breeze/doc/ci/02_images.md b/dev/breeze/doc/ci/02_images.md
index f9ea4faaee7..1db263f8b3a 100644
--- a/dev/breeze/doc/ci/02_images.md
+++ b/dev/breeze/doc/ci/02_images.md
@@ -447,8 +447,8 @@ can be used for CI images:
 | `DEV_APT_DEPS`                    |                            | Dev APT 
dependencies installed in the first part of the image                           
                                                                   |
 | `ADDITIONAL_DEV_APT_DEPS`         |                            | Additional 
apt dev dependencies installed in the first part of the image                   
                                                                |
 | `ADDITIONAL_DEV_APT_ENV`          |                            | Additional 
env variables defined when installing dev deps                                  
                                                                |
-| `AIRFLOW_PIP_VERSION`             | `24.0`                     | PIP version 
used.                                                                           
                                                               |
-| `AIRFLOW_UV_VERSION`              | `0.1.10`                   | UV version 
used.                                                                           
                                                                |
+| `AIRFLOW_PIP_VERSION`             | `24.3.1`                   | PIP version 
used.                                                                           
                                                               |
+| `AIRFLOW_UV_VERSION`              | `0.4.29`                   | UV version 
used.                                                                           
                                                                |
 | `AIRFLOW_USE_UV`                  | `true`                     | Whether to 
use UV for installation.                                                        
                                                                |
 | `PIP_PROGRESS_BAR`                | `on`                       | Progress 
bar for PIP installation                                                        
                                                                  |
 
diff --git a/dev/breeze/doc/images/output-commands.svg 
b/dev/breeze/doc/images/output-commands.svg
index 08d3dc2a13e..5888d1fc862 100644
--- a/dev/breeze/doc/images/output-commands.svg
+++ b/dev/breeze/doc/images/output-commands.svg
@@ -298,53 +298,53 @@
 </text><text class="breeze-help-r2" x="12.2" y="44.4" textLength="73.2" 
clip-path="url(#breeze-help-line-1)">Usage:</text><text class="breeze-help-r3" 
x="97.6" y="44.4" textLength="73.2" 
clip-path="url(#breeze-help-line-1)">breeze</text><text class="breeze-help-r1" 
x="183" y="44.4" textLength="12.2" 
clip-path="url(#breeze-help-line-1)">[</text><text class="breeze-help-r4" 
x="195.2" y="44.4" textLength="85.4" 
clip-path="url(#breeze-help-line-1)">OPTIONS</text><text class="breeze-help-r1" 
 [...]
 </text><text class="breeze-help-r1" x="1464" y="68.8" textLength="12.2" 
clip-path="url(#breeze-help-line-2)">
 </text><text class="breeze-help-r5" x="0" y="93.2" textLength="24.4" 
clip-path="url(#breeze-help-line-3)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="93.2" textLength="195.2" 
clip-path="url(#breeze-help-line-3)">&#160;Execution&#160;mode&#160;</text><text
 class="breeze-help-r5" x="219.6" y="93.2" textLength="1220" 
clip-path="url(#breeze-help-line-3)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-help-r [...]
-</text><text class="breeze-help-r5" x="0" y="117.6" textLength="12.2" 
clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r4" 
x="24.4" y="117.6" textLength="12.2" 
clip-path="url(#breeze-help-line-4)">-</text><text class="breeze-help-r4" 
x="36.6" y="117.6" textLength="85.4" 
clip-path="url(#breeze-help-line-4)">-python</text><text class="breeze-help-r6" 
x="366" y="117.6" textLength="24.4" 
clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r1" 
x="414.8" [...]
+</text><text class="breeze-help-r5" x="0" y="117.6" textLength="12.2" 
clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r4" 
x="24.4" y="117.6" textLength="97.6" 
clip-path="url(#breeze-help-line-4)">--python</text><text 
class="breeze-help-r6" x="366" y="117.6" textLength="24.4" 
clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r1" 
x="414.8" y="117.6" textLength="732" 
clip-path="url(#breeze-help-line-4)">Python&#160;major/minor&#160;version&#160;use
 [...]
 </text><text class="breeze-help-r5" x="0" y="142" textLength="12.2" 
clip-path="url(#breeze-help-line-5)">│</text><text class="breeze-help-r7" 
x="414.8" y="142" textLength="732" 
clip-path="url(#breeze-help-line-5)">(&gt;3.8&lt;&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r5" x="145 [...]
 </text><text class="breeze-help-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-help-line-6)">│</text><text class="breeze-help-r5" 
x="414.8" y="166.4" textLength="732" 
clip-path="url(#breeze-help-line-6)">[default:&#160;3.8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r4" 
x="24.4" y="190.8" textLength="12.2" 
clip-path="url(#breeze-help-line-7)">-</text><text class="breeze-help-r4" 
x="36.6" y="190.8" textLength="146.4" 
clip-path="url(#breeze-help-line-7)">-integration</text><text 
class="breeze-help-r1" x="414.8" y="190.8" textLength="1024.8" 
clip-path="url(#breeze-help-line-7)">Integration(s)&#160;to&#160;enable&#1 [...]
+</text><text class="breeze-help-r5" x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r4" 
x="24.4" y="190.8" textLength="158.6" 
clip-path="url(#breeze-help-line-7)">--integration</text><text 
class="breeze-help-r1" x="414.8" y="190.8" textLength="1024.8" 
clip-path="url(#breeze-help-line-7)">Integration(s)&#160;to&#160;enable&#160;when&#160;running&#160;(can&#160;be&#160;more&#160;than&#160;one).&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
 </text><text class="breeze-help-r5" x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-help-line-8)">│</text><text class="breeze-help-r7" 
x="414.8" y="215.2" textLength="1024.8" 
clip-path="url(#breeze-help-line-8)">(all&#160;|&#160;all-testable&#160;|&#160;cassandra&#160;|&#160;celery&#160;|&#160;drill&#160;|&#160;kafka&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;mssql&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="215.2" textLength="12.2" 
clip-path="url(#breeze-help [...]
 </text><text class="breeze-help-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-help-line-9)">│</text><text class="breeze-help-r7" 
x="414.8" y="239.6" textLength="1024.8" 
clip-path="url(#breeze-help-line-9)">|&#160;openlineage&#160;|&#160;otel&#160;|&#160;pinot&#160;|&#160;qdrant&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;ydb)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r5" x [...]
-</text><text class="breeze-help-r5" x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r4" 
x="24.4" y="264" textLength="12.2" 
clip-path="url(#breeze-help-line-10)">-</text><text class="breeze-help-r4" 
x="36.6" y="264" textLength="134.2" 
clip-path="url(#breeze-help-line-10)">-standalone</text><text 
class="breeze-help-r4" x="170.8" y="264" textLength="170.8" 
clip-path="url(#breeze-help-line-10)">-dag-processor</text><text 
class="breeze-he [...]
-</text><text class="breeze-help-r5" x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r4" 
x="24.4" y="288.4" textLength="12.2" 
clip-path="url(#breeze-help-line-11)">-</text><text class="breeze-help-r4" 
x="36.6" y="288.4" textLength="109.8" 
clip-path="url(#breeze-help-line-11)">-database</text><text 
class="breeze-help-r4" x="146.4" y="288.4" textLength="122" 
clip-path="url(#breeze-help-line-11)">-isolation</text><text class="breeze-he 
[...]
+</text><text class="breeze-help-r5" x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r4" 
x="24.4" y="264" textLength="317.2" 
clip-path="url(#breeze-help-line-10)">--standalone-dag-processor</text><text 
class="breeze-help-r1" x="414.8" y="264" textLength="573.4" 
clip-path="url(#breeze-help-line-10)">Run&#160;standalone&#160;dag&#160;processor&#160;for&#160;start-airflow.</text><text
 class="breeze-help-r5" x="1451.8" y="264" textLength= [...]
+</text><text class="breeze-help-r5" x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r4" 
x="24.4" y="288.4" textLength="244" 
clip-path="url(#breeze-help-line-11)">--database-isolation</text><text 
class="breeze-help-r1" x="414.8" y="288.4" textLength="475.8" 
clip-path="url(#breeze-help-line-11)">Run&#160;airflow&#160;in&#160;database&#160;isolation&#160;mode.</text><text
 class="breeze-help-r5" x="1451.8" y="288.4" textLength="12.2" c [...]
 </text><text class="breeze-help-r5" x="0" y="312.8" textLength="1464" 
clip-path="url(#breeze-help-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="312.8" textLength="12.2" 
clip-path="url(#breeze-help-line-12)">
 </text><text class="breeze-help-r5" x="0" y="337.2" textLength="24.4" 
clip-path="url(#breeze-help-line-13)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="337.2" textLength="463.6" 
clip-path="url(#breeze-help-line-13)">&#160;Docker&#160;Compose&#160;selection&#160;and&#160;cleanup&#160;</text><text
 class="breeze-help-r5" x="488" y="337.2" textLength="951.6" 
clip-path="url(#breeze-help-line-13)">──────────────────────────────────────────────────────────────────────────────</text><text
  [...]
-</text><text class="breeze-help-r5" x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r4" 
x="24.4" y="361.6" textLength="12.2" 
clip-path="url(#breeze-help-line-14)">-</text><text class="breeze-help-r4" 
x="36.6" y="361.6" textLength="97.6" 
clip-path="url(#breeze-help-line-14)">-project</text><text 
class="breeze-help-r4" x="134.2" y="361.6" textLength="61" 
clip-path="url(#breeze-help-line-14)">-name</text><text class="breeze-help-r1" 
x [...]
-</text><text class="breeze-help-r5" x="0" y="386" textLength="12.2" 
clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r1" 
x="244" y="386" textLength="512.4" 
clip-path="url(#breeze-help-line-15)">project&#160;name&#160;and&#160;you&#160;can&#160;use&#160;`breeze&#160;down&#160;</text><text
 class="breeze-help-r4" x="756.4" y="386" textLength="12.2" 
clip-path="url(#breeze-help-line-15)">-</text><text class="breeze-help-r4" 
x="768.6" y="386" textLength="97.6" clip-path=" [...]
+</text><text class="breeze-help-r5" x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r4" 
x="24.4" y="361.6" textLength="170.8" 
clip-path="url(#breeze-help-line-14)">--project-name</text><text 
class="breeze-help-r1" x="244" y="361.6" textLength="1195.6" 
clip-path="url(#breeze-help-line-14)">Name&#160;of&#160;the&#160;docker-compose&#160;project&#160;to&#160;bring&#160;down.&#160;The&#160;`docker-compose`&#160;is&#160;for&#160;legacy&
 [...]
+</text><text class="breeze-help-r5" x="0" y="386" textLength="12.2" 
clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r1" 
x="244" y="386" textLength="512.4" 
clip-path="url(#breeze-help-line-15)">project&#160;name&#160;and&#160;you&#160;can&#160;use&#160;`breeze&#160;down&#160;</text><text
 class="breeze-help-r4" x="756.4" y="386" textLength="170.8" 
clip-path="url(#breeze-help-line-15)">--project-name</text><text 
class="breeze-help-r1" x="927.2" y="386" textLength="512 [...]
 </text><text class="breeze-help-r5" x="0" y="410.4" textLength="12.2" 
clip-path="url(#breeze-help-line-16)">│</text><text class="breeze-help-r1" 
x="244" y="410.4" textLength="1195.6" 
clip-path="url(#breeze-help-line-16)">belonging&#160;to&#160;it.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
 </text><text class="breeze-help-r5" x="0" y="434.8" textLength="12.2" 
clip-path="url(#breeze-help-line-17)">│</text><text class="breeze-help-r7" 
x="244" y="434.8" textLength="1195.6" 
clip-path="url(#breeze-help-line-17)">(breeze&#160;|&#160;pre-commit&#160;|&#160;docker-compose)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="459.2" textLength="12.2" 
clip-path="url(#breeze-help-line-18)">│</text><text class="breeze-help-r5" 
x="244" y="459.2" textLength="1195.6" 
clip-path="url(#breeze-help-line-18)">[default:&#160;breeze]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="483.6" textLength="12.2" 
clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r4" 
x="24.4" y="483.6" textLength="12.2" 
clip-path="url(#breeze-help-line-19)">-</text><text class="breeze-help-r4" 
x="36.6" y="483.6" textLength="85.4" 
clip-path="url(#breeze-help-line-19)">-docker</text><text 
class="breeze-help-r4" x="122" y="483.6" textLength="61" 
clip-path="url(#breeze-help-line-19)">-host</text><text class="breeze-help-r1" 
x="2 [...]
+</text><text class="breeze-help-r5" x="0" y="483.6" textLength="12.2" 
clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r4" 
x="24.4" y="483.6" textLength="158.6" 
clip-path="url(#breeze-help-line-19)">--docker-host</text><text 
class="breeze-help-r1" x="244" y="483.6" textLength="915" 
clip-path="url(#breeze-help-line-19)">Optional&#160;-&#160;docker&#160;host&#160;to&#160;use&#160;when&#160;running&#160;docker&#160;commands.&#160;When&#160;set,&#160;the&#160;`</text><t
 [...]
 </text><text class="breeze-help-r5" x="0" y="508" textLength="12.2" 
clip-path="url(#breeze-help-line-20)">│</text><text class="breeze-help-r1" 
x="244" y="508" textLength="1195.6" 
clip-path="url(#breeze-help-line-20)">ignored&#160;when&#160;building&#160;images.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="532.4" textLength="12.2" 
clip-path="url(#breeze-help-line-21)">│</text><text class="breeze-help-r7" 
x="244" y="532.4" textLength="1195.6" 
clip-path="url(#breeze-help-line-21)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
 </text><text class="breeze-help-r5" x="0" y="556.8" textLength="1464" 
clip-path="url(#breeze-help-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="556.8" textLength="12.2" 
clip-path="url(#breeze-help-line-22)">
 </text><text class="breeze-help-r5" x="0" y="581.2" textLength="24.4" 
clip-path="url(#breeze-help-line-23)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="581.2" textLength="122" 
clip-path="url(#breeze-help-line-23)">&#160;Database&#160;</text><text 
class="breeze-help-r5" x="146.4" y="581.2" textLength="1293.2" 
clip-path="url(#breeze-help-line-23)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-help- [...]
-</text><text class="breeze-help-r5" x="0" y="605.6" textLength="12.2" 
clip-path="url(#breeze-help-line-24)">│</text><text class="breeze-help-r4" 
x="24.4" y="605.6" textLength="12.2" 
clip-path="url(#breeze-help-line-24)">-</text><text class="breeze-help-r4" 
x="36.6" y="605.6" textLength="97.6" 
clip-path="url(#breeze-help-line-24)">-backend</text><text 
class="breeze-help-r6" x="268.4" y="605.6" textLength="24.4" 
clip-path="url(#breeze-help-line-24)">-b</text><text class="breeze-help-r1" x= 
[...]
+</text><text class="breeze-help-r5" x="0" y="605.6" textLength="12.2" 
clip-path="url(#breeze-help-line-24)">│</text><text class="breeze-help-r4" 
x="24.4" y="605.6" textLength="109.8" 
clip-path="url(#breeze-help-line-24)">--backend</text><text 
class="breeze-help-r6" x="268.4" y="605.6" textLength="24.4" 
clip-path="url(#breeze-help-line-24)">-b</text><text class="breeze-help-r1" 
x="317.2" y="605.6" textLength="1122.4" 
clip-path="url(#breeze-help-line-24)">Database&#160;backend&#160;to&#160 [...]
 </text><text class="breeze-help-r5" x="0" y="630" textLength="12.2" 
clip-path="url(#breeze-help-line-25)">│</text><text class="breeze-help-r1" 
x="317.2" y="630" textLength="1122.4" 
clip-path="url(#breeze-help-line-25)">configuration,&#160;meaning&#160;there&#160;will&#160;be&#160;no&#160;database&#160;available,&#160;and&#160;any&#160;attempts&#160;to&#160;connect&#160;to&#160;&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="630" textLength="12.2" 
clip-path="url(#breeze-help-line- [...]
 </text><text class="breeze-help-r5" x="0" y="654.4" textLength="12.2" 
clip-path="url(#breeze-help-line-26)">│</text><text class="breeze-help-r1" 
x="317.2" y="654.4" textLength="1122.4" 
clip-path="url(#breeze-help-line-26)">the&#160;Airflow&#160;database&#160;will&#160;fail.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-help-r5" x="0" y="678.8" textLength="12.2" 
clip-path="url(#breeze-help-line-27)">│</text><text class="breeze-help-r7" 
x="317.2" y="678.8" textLength="1122.4" 
clip-path="url(#breeze-help-line-27)">(&gt;sqlite&lt;&#160;|&#160;mysql&#160;|&#160;postgres&#160;|&#160;none)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
 </text><text class="breeze-help-r5" x="0" y="703.2" textLength="12.2" 
clip-path="url(#breeze-help-line-28)">│</text><text class="breeze-help-r5" 
x="317.2" y="703.2" textLength="1122.4" 
clip-path="url(#breeze-help-line-28)">[default:&#160;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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-help-r5" x="0" y="727.6" textLength="12.2" 
clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r4" 
x="24.4" y="727.6" textLength="12.2" 
clip-path="url(#breeze-help-line-29)">-</text><text class="breeze-help-r4" 
x="36.6" y="727.6" textLength="109.8" 
clip-path="url(#breeze-help-line-29)">-postgres</text><text 
class="breeze-help-r4" x="146.4" y="727.6" textLength="97.6" 
clip-path="url(#breeze-help-line-29)">-version</text><text class="breeze-hel 
[...]
-</text><text class="breeze-help-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r4" 
x="24.4" y="752" textLength="12.2" 
clip-path="url(#breeze-help-line-30)">-</text><text class="breeze-help-r4" 
x="36.6" y="752" textLength="73.2" 
clip-path="url(#breeze-help-line-30)">-mysql</text><text class="breeze-help-r4" 
x="109.8" y="752" textLength="97.6" 
clip-path="url(#breeze-help-line-30)">-version</text><text 
class="breeze-help-r6" x="268 [...]
-</text><text class="breeze-help-r5" x="0" y="776.4" textLength="12.2" 
clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r4" 
x="24.4" y="776.4" textLength="12.2" 
clip-path="url(#breeze-help-line-31)">-</text><text class="breeze-help-r4" 
x="36.6" y="776.4" textLength="36.6" 
clip-path="url(#breeze-help-line-31)">-db</text><text class="breeze-help-r4" 
x="73.2" y="776.4" textLength="73.2" 
clip-path="url(#breeze-help-line-31)">-reset</text><text class="breeze-help-r6" 
x="2 [...]
+</text><text class="breeze-help-r5" x="0" y="727.6" textLength="12.2" 
clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r4" 
x="24.4" y="727.6" textLength="219.6" 
clip-path="url(#breeze-help-line-29)">--postgres-version</text><text 
class="breeze-help-r6" x="268.4" y="727.6" textLength="24.4" 
clip-path="url(#breeze-help-line-29)">-P</text><text class="breeze-help-r1" 
x="317.2" y="727.6" textLength="305" 
clip-path="url(#breeze-help-line-29)">Version&#160;of&#160;Postgre [...]
+</text><text class="breeze-help-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r4" 
x="24.4" y="752" textLength="183" 
clip-path="url(#breeze-help-line-30)">--mysql-version</text><text 
class="breeze-help-r6" x="268.4" y="752" textLength="24.4" 
clip-path="url(#breeze-help-line-30)">-M</text><text class="breeze-help-r1" 
x="317.2" y="752" textLength="268.4" 
clip-path="url(#breeze-help-line-30)">Version&#160;of&#160;MySQL&#160;used.</ 
[...]
+</text><text class="breeze-help-r5" x="0" y="776.4" textLength="12.2" 
clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r4" 
x="24.4" y="776.4" textLength="122" 
clip-path="url(#breeze-help-line-31)">--db-reset</text><text 
class="breeze-help-r6" x="268.4" y="776.4" textLength="24.4" 
clip-path="url(#breeze-help-line-31)">-d</text><text class="breeze-help-r1" 
x="317.2" y="776.4" textLength="451.4" 
clip-path="url(#breeze-help-line-31)">Reset&#160;DB&#160;when&#160;enterin [...]
 </text><text class="breeze-help-r5" x="0" y="800.8" textLength="1464" 
clip-path="url(#breeze-help-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="800.8" textLength="12.2" 
clip-path="url(#breeze-help-line-32)">
 </text><text class="breeze-help-r5" x="0" y="825.2" textLength="24.4" 
clip-path="url(#breeze-help-line-33)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="825.2" textLength="488" 
clip-path="url(#breeze-help-line-33)">&#160;Build&#160;CI&#160;image&#160;(before&#160;entering&#160;shell)&#160;</text><text
 class="breeze-help-r5" x="512.4" y="825.2" textLength="927.2" 
clip-path="url(#breeze-help-line-33)">────────────────────────────────────────────────────────────────────────────</text><
 [...]
-</text><text class="breeze-help-r5" x="0" y="849.6" textLength="12.2" 
clip-path="url(#breeze-help-line-34)">│</text><text class="breeze-help-r4" 
x="24.4" y="849.6" textLength="12.2" 
clip-path="url(#breeze-help-line-34)">-</text><text class="breeze-help-r4" 
x="36.6" y="849.6" textLength="85.4" 
clip-path="url(#breeze-help-line-34)">-github</text><text 
class="breeze-help-r4" x="122" y="849.6" textLength="134.2" 
clip-path="url(#breeze-help-line-34)">-repository</text><text 
class="breeze-help [...]
-</text><text class="breeze-help-r5" x="0" y="874" textLength="12.2" 
clip-path="url(#breeze-help-line-35)">│</text><text class="breeze-help-r4" 
x="24.4" y="874" textLength="12.2" 
clip-path="url(#breeze-help-line-35)">-</text><text class="breeze-help-r4" 
x="36.6" y="874" textLength="97.6" 
clip-path="url(#breeze-help-line-35)">-builder</text><text 
class="breeze-help-r1" x="341.6" y="874" textLength="756.4" 
clip-path="url(#breeze-help-line-35)">Buildx&#160;builder&#160;used&#160;to&#160;perf
 [...]
+</text><text class="breeze-help-r5" x="0" y="849.6" textLength="12.2" 
clip-path="url(#breeze-help-line-34)">│</text><text class="breeze-help-r4" 
x="24.4" y="849.6" textLength="231.8" 
clip-path="url(#breeze-help-line-34)">--github-repository</text><text 
class="breeze-help-r6" x="292.8" y="849.6" textLength="24.4" 
clip-path="url(#breeze-help-line-34)">-g</text><text class="breeze-help-r1" 
x="341.6" y="849.6" textLength="585.6" 
clip-path="url(#breeze-help-line-34)">GitHub&#160;repository&#1 [...]
+</text><text class="breeze-help-r5" x="0" y="874" textLength="12.2" 
clip-path="url(#breeze-help-line-35)">│</text><text class="breeze-help-r4" 
x="24.4" y="874" textLength="109.8" 
clip-path="url(#breeze-help-line-35)">--builder</text><text 
class="breeze-help-r1" x="341.6" y="874" textLength="756.4" 
clip-path="url(#breeze-help-line-35)">Buildx&#160;builder&#160;used&#160;to&#160;perform&#160;`docker&#160;buildx&#160;build`&#160;commands.</text><text
 class="breeze-help-r7" x="1110.2" y="874 [...]
 </text><text class="breeze-help-r5" x="0" y="898.4" textLength="12.2" 
clip-path="url(#breeze-help-line-36)">│</text><text class="breeze-help-r5" 
x="341.6" y="898.4" textLength="756.4" 
clip-path="url(#breeze-help-line-36)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-help-r5" x="0" y="922.8" textLength="12.2" 
clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r4" 
x="24.4" y="922.8" textLength="12.2" 
clip-path="url(#breeze-help-line-37)">-</text><text class="breeze-help-r4" 
x="36.6" y="922.8" textLength="48.8" 
clip-path="url(#breeze-help-line-37)">-use</text><text class="breeze-help-r4" 
x="85.4" y="922.8" textLength="36.6" 
clip-path="url(#breeze-help-line-37)">-uv</text><text class="breeze-help-r1" 
x="122 [...]
-</text><text class="breeze-help-r5" x="0" y="947.2" textLength="12.2" 
clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r4" 
x="24.4" y="947.2" textLength="12.2" 
clip-path="url(#breeze-help-line-38)">-</text><text class="breeze-help-r4" 
x="36.6" y="947.2" textLength="36.6" 
clip-path="url(#breeze-help-line-38)">-uv</text><text class="breeze-help-r4" 
x="73.2" y="947.2" textLength="158.6" 
clip-path="url(#breeze-help-line-38)">-http-timeout</text><text 
class="breeze-help- [...]
+</text><text class="breeze-help-r5" x="0" y="922.8" textLength="12.2" 
clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r4" 
x="24.4" y="922.8" textLength="97.6" 
clip-path="url(#breeze-help-line-37)">--use-uv</text><text 
class="breeze-help-r1" x="122" y="922.8" textLength="12.2" 
clip-path="url(#breeze-help-line-37)">/</text><text class="breeze-help-r4" 
x="134.2" y="922.8" textLength="134.2" 
clip-path="url(#breeze-help-line-37)">--no-use-uv</text><text class="breeze-he 
[...]
+</text><text class="breeze-help-r5" x="0" y="947.2" textLength="12.2" 
clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r4" 
x="24.4" y="947.2" textLength="207.4" 
clip-path="url(#breeze-help-line-38)">--uv-http-timeout</text><text 
class="breeze-help-r1" x="341.6" y="947.2" textLength="829.6" 
clip-path="url(#breeze-help-line-38)">Timeout&#160;for&#160;requests&#160;that&#160;UV&#160;makes&#160;(only&#160;used&#160;in&#160;case&#160;of&#160;UV&#160;builds).</text><text
  [...]
 </text><text class="breeze-help-r5" x="0" y="971.6" textLength="12.2" 
clip-path="url(#breeze-help-line-39)">│</text><text class="breeze-help-r5" 
x="341.6" y="971.6" textLength="829.6" 
clip-path="url(#breeze-help-line-39)">[default:&#160;300;&#160;x&gt;=1]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="996" textLength="1464" 
clip-path="url(#breeze-help-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="996" textLength="12.2" 
clip-path="url(#breeze-help-line-40)">
 </text><text class="breeze-help-r5" x="0" y="1020.4" textLength="24.4" 
clip-path="url(#breeze-help-line-41)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1020.4" textLength="183" 
clip-path="url(#breeze-help-line-41)">&#160;Other&#160;options&#160;</text><text
 class="breeze-help-r5" x="207.4" y="1020.4" textLength="1232.2" 
clip-path="url(#breeze-help-line-41)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
-</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4" 
x="24.4" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-help-line-42)">-</text><text class="breeze-help-r4" 
x="36.6" y="1044.8" textLength="97.6" 
clip-path="url(#breeze-help-line-42)">-forward</text><text 
class="breeze-help-r4" x="134.2" y="1044.8" textLength="146.4" 
clip-path="url(#breeze-help-line-42)">-credentials</text><text class="bre [...]
-</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-help-line-43)">│</text><text class="breeze-help-r4" 
x="24.4" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-help-line-43)">-</text><text class="breeze-help-r4" 
x="36.6" y="1069.2" textLength="48.8" 
clip-path="url(#breeze-help-line-43)">-max</text><text class="breeze-help-r4" 
x="85.4" y="1069.2" textLength="61" 
clip-path="url(#breeze-help-line-43)">-time</text><text class="breeze-help-r1" 
x= [...]
+</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4" 
x="24.4" y="1044.8" textLength="256.2" 
clip-path="url(#breeze-help-line-42)">--forward-credentials</text><text 
class="breeze-help-r6" x="305" y="1044.8" textLength="24.4" 
clip-path="url(#breeze-help-line-42)">-f</text><text class="breeze-help-r1" 
x="353.8" y="1044.8" textLength="634.4" 
clip-path="url(#breeze-help-line-42)">Forward&#160;local&#1 [...]
+</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-help-line-43)">│</text><text class="breeze-help-r4" 
x="24.4" y="1069.2" textLength="122" 
clip-path="url(#breeze-help-line-43)">--max-time</text><text 
class="breeze-help-r1" x="353.8" y="1069.2" textLength="1049.2" 
clip-path="url(#breeze-help-line-43)">Maximum&#160;time&#160;that&#160;the&#160;command&#160;should&#160;take&#160;-&#160;if&#160;it&#160;takes&#160;longer,&#160;the&#160;command&#160;
 [...]
 </text><text class="breeze-help-r5" x="0" y="1093.6" textLength="12.2" 
clip-path="url(#breeze-help-line-44)">│</text><text class="breeze-help-r7" 
x="353.8" y="1093.6" textLength="1049.2" 
clip-path="url(#breeze-help-line-44)">(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;&#160;&#160;&#160;&#160;&
 [...]
 </text><text class="breeze-help-r5" x="0" y="1118" textLength="1464" 
clip-path="url(#breeze-help-line-45)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1118" textLength="12.2" 
clip-path="url(#breeze-help-line-45)">
 </text><text class="breeze-help-r5" x="0" y="1142.4" textLength="24.4" 
clip-path="url(#breeze-help-line-46)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1142.4" textLength="195.2" 
clip-path="url(#breeze-help-line-46)">&#160;Common&#160;options&#160;</text><text
 class="breeze-help-r5" x="219.6" y="1142.4" textLength="1220" 
clip-path="url(#breeze-help-line-46)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
-</text><text class="breeze-help-r5" x="0" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-help-line-47)">│</text><text class="breeze-help-r4" 
x="24.4" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-help-line-47)">-</text><text class="breeze-help-r4" 
x="36.6" y="1166.8" textLength="85.4" 
clip-path="url(#breeze-help-line-47)">-answer</text><text 
class="breeze-help-r6" x="158.6" y="1166.8" textLength="24.4" 
clip-path="url(#breeze-help-line-47)">-a</text><text class="breeze-help-r1" 
[...]
-</text><text class="breeze-help-r5" x="0" y="1191.2" textLength="12.2" 
clip-path="url(#breeze-help-line-48)">│</text><text class="breeze-help-r4" 
x="24.4" y="1191.2" textLength="12.2" 
clip-path="url(#breeze-help-line-48)">-</text><text class="breeze-help-r4" 
x="36.6" y="1191.2" textLength="48.8" 
clip-path="url(#breeze-help-line-48)">-dry</text><text class="breeze-help-r4" 
x="85.4" y="1191.2" textLength="48.8" 
clip-path="url(#breeze-help-line-48)">-run</text><text class="breeze-help-r6" x 
[...]
-</text><text class="breeze-help-r5" x="0" y="1215.6" textLength="12.2" 
clip-path="url(#breeze-help-line-49)">│</text><text class="breeze-help-r4" 
x="24.4" y="1215.6" textLength="12.2" 
clip-path="url(#breeze-help-line-49)">-</text><text class="breeze-help-r4" 
x="36.6" y="1215.6" textLength="97.6" 
clip-path="url(#breeze-help-line-49)">-verbose</text><text 
class="breeze-help-r6" x="158.6" y="1215.6" textLength="24.4" 
clip-path="url(#breeze-help-line-49)">-v</text><text class="breeze-help-r1 [...]
-</text><text class="breeze-help-r5" x="0" y="1240" textLength="12.2" 
clip-path="url(#breeze-help-line-50)">│</text><text class="breeze-help-r4" 
x="24.4" y="1240" textLength="12.2" 
clip-path="url(#breeze-help-line-50)">-</text><text class="breeze-help-r4" 
x="36.6" y="1240" textLength="61" 
clip-path="url(#breeze-help-line-50)">-help</text><text class="breeze-help-r6" 
x="158.6" y="1240" textLength="24.4" 
clip-path="url(#breeze-help-line-50)">-h</text><text class="breeze-help-r1" 
x="207.4" y [...]
+</text><text class="breeze-help-r5" x="0" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-help-line-47)">│</text><text class="breeze-help-r4" 
x="24.4" y="1166.8" textLength="97.6" 
clip-path="url(#breeze-help-line-47)">--answer</text><text 
class="breeze-help-r6" x="158.6" y="1166.8" textLength="24.4" 
clip-path="url(#breeze-help-line-47)">-a</text><text class="breeze-help-r1" 
x="207.4" y="1166.8" textLength="317.2" 
clip-path="url(#breeze-help-line-47)">Force&#160;answer&#160;to&#160;qu [...]
+</text><text class="breeze-help-r5" x="0" y="1191.2" textLength="12.2" 
clip-path="url(#breeze-help-line-48)">│</text><text class="breeze-help-r4" 
x="24.4" y="1191.2" textLength="109.8" 
clip-path="url(#breeze-help-line-48)">--dry-run</text><text 
class="breeze-help-r6" x="158.6" y="1191.2" textLength="24.4" 
clip-path="url(#breeze-help-line-48)">-D</text><text class="breeze-help-r1" 
x="207.4" y="1191.2" textLength="719.8" 
clip-path="url(#breeze-help-line-48)">If&#160;dry-run&#160;is&#160;se [...]
+</text><text class="breeze-help-r5" x="0" y="1215.6" textLength="12.2" 
clip-path="url(#breeze-help-line-49)">│</text><text class="breeze-help-r4" 
x="24.4" y="1215.6" textLength="109.8" 
clip-path="url(#breeze-help-line-49)">--verbose</text><text 
class="breeze-help-r6" x="158.6" y="1215.6" textLength="24.4" 
clip-path="url(#breeze-help-line-49)">-v</text><text class="breeze-help-r1" 
x="207.4" y="1215.6" textLength="585.6" 
clip-path="url(#breeze-help-line-49)">Print&#160;verbose&#160;informa [...]
+</text><text class="breeze-help-r5" x="0" y="1240" textLength="12.2" 
clip-path="url(#breeze-help-line-50)">│</text><text class="breeze-help-r4" 
x="24.4" y="1240" textLength="73.2" 
clip-path="url(#breeze-help-line-50)">--help</text><text class="breeze-help-r6" 
x="158.6" y="1240" textLength="24.4" 
clip-path="url(#breeze-help-line-50)">-h</text><text class="breeze-help-r1" 
x="207.4" y="1240" textLength="329.4" 
clip-path="url(#breeze-help-line-50)">Show&#160;this&#160;message&#160;and&#160;e
 [...]
 </text><text class="breeze-help-r5" x="0" y="1264.4" textLength="1464" 
clip-path="url(#breeze-help-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-help-line-51)">
 </text><text class="breeze-help-r5" x="0" y="1288.8" textLength="24.4" 
clip-path="url(#breeze-help-line-52)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1288.8" textLength="244" 
clip-path="url(#breeze-help-line-52)">&#160;Developer&#160;commands&#160;</text><text
 class="breeze-help-r5" x="268.4" y="1288.8" textLength="1171.2" 
clip-path="url(#breeze-help-line-52)">────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
 </text><text class="breeze-help-r5" x="0" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-help-line-53)">│</text><text class="breeze-help-r4" 
x="24.4" y="1313.2" textLength="280.6" 
clip-path="url(#breeze-help-line-53)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1313.2" textLength="1110.2" 
clip-path="url(#breeze-help-line-53)">Enter&#160;breeze&#160;environment&#160;and&#160;starts&#160;all&#160;Airflow&#16
 [...]
diff --git a/dev/breeze/doc/images/output_setup_config.svg 
b/dev/breeze/doc/images/output_setup_config.svg
index 9a42467ea52..5a44bb20030 100644
--- a/dev/breeze/doc/images/output_setup_config.svg
+++ b/dev/breeze/doc/images/output_setup_config.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 611.1999999999999" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 635.5999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-setup-config-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="560.1999999999999" />
+      <rect x="0" y="0" width="1463.0" height="584.5999999999999" />
     </clipPath>
     <clipPath id="breeze-setup-config-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -111,9 +111,12 @@
 <clipPath id="breeze-setup-config-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-setup-config-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="609.2" rx="8"/><text 
class="breeze-setup-config-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;config</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="633.6" rx="8"/><text 
class="breeze-setup-config-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;config</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -129,23 +132,24 @@
 </text><text class="breeze-setup-config-r1" x="12.2" y="93.2" 
textLength="805.2" 
clip-path="url(#breeze-setup-config-line-3)">Show/update&#160;configuration&#160;(Python,&#160;Backend,&#160;Cheatsheet,&#160;ASCIIART).</text><text
 class="breeze-setup-config-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-3)">
 </text><text class="breeze-setup-config-r1" x="1464" y="117.6" 
textLength="12.2" clip-path="url(#breeze-setup-config-line-4)">
 </text><text class="breeze-setup-config-r5" x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-5)">╭─</text><text 
class="breeze-setup-config-r5" x="24.4" y="142" textLength="170.8" 
clip-path="url(#breeze-setup-config-line-5)">&#160;Config&#160;flags&#160;</text><text
 class="breeze-setup-config-r5" x="195.2" y="142" textLength="1244.4" 
clip-path="url(#breeze-setup-config-line-5)">────────────────────────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-setup-config-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-6)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-6)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="166.4" textLength="85.4" 
clip-path="url(#breeze-setup-config-line-6)">-python</text><text 
class="breeze-setup-config-r6" x="390.4" y="166.4" textLength="24.4" 
clip-path="url(#breeze-set [...]
+</text><text class="breeze-setup-config-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-6)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="166.4" textLength="97.6" 
clip-path="url(#breeze-setup-config-line-6)">--python</text><text 
class="breeze-setup-config-r6" x="390.4" y="166.4" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-6)">-p</text><text 
class="breeze-setup-config-r1" x="475.8" y="166.4" textLength="732" 
clip-path="url(#breeze-s [...]
 </text><text class="breeze-setup-config-r5" x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-7)">│</text><text 
class="breeze-setup-config-r7" x="475.8" y="190.8" textLength="732" 
clip-path="url(#breeze-setup-config-line-7)">(&gt;3.8&lt;&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#160;&#160;&#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="breeze-setup-config-r5" x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-8)">│</text><text 
class="breeze-setup-config-r5" x="475.8" y="215.2" textLength="732" 
clip-path="url(#breeze-setup-config-line-8)">[default:&#160;3.8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-setup-config-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-9)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="239.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-9)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="239.6" textLength="97.6" 
clip-path="url(#breeze-setup-config-line-9)">-backend</text><text 
class="breeze-setup-config-r6" x="390.4" y="239.6" textLength="24.4" 
clip-path="url(#breeze-se [...]
+</text><text class="breeze-setup-config-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-9)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="239.6" textLength="109.8" 
clip-path="url(#breeze-setup-config-line-9)">--backend</text><text 
class="breeze-setup-config-r6" x="390.4" y="239.6" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-9)">-b</text><text 
class="breeze-setup-config-r1" x="475.8" y="239.6" textLength="963.8" 
clip-path="url(#bree [...]
 </text><text class="breeze-setup-config-r5" x="0" y="264" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-10)">│</text><text 
class="breeze-setup-config-r1" x="475.8" y="264" textLength="963.8" 
clip-path="url(#breeze-setup-config-line-10)">database&#160;configuration,&#160;meaning&#160;there&#160;will&#160;be&#160;no&#160;database&#160;available,&#160;and&#160;any&#160;&#160;&#160;</text><text
 class="breeze-setup-config-r5" x="1451.8" y="264" textLength="12.2" 
clip-path="url(#b [...]
 </text><text class="breeze-setup-config-r5" x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-11)">│</text><text 
class="breeze-setup-config-r1" x="475.8" y="288.4" textLength="963.8" 
clip-path="url(#breeze-setup-config-line-11)">attempts&#160;to&#160;connect&#160;to&#160;the&#160;Airflow&#160;database&#160;will&#160;fail.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
 </text><text class="breeze-setup-config-r5" x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-12)">│</text><text 
class="breeze-setup-config-r7" x="475.8" y="312.8" textLength="963.8" 
clip-path="url(#breeze-setup-config-line-12)">(&gt;sqlite&lt;&#160;|&#160;mysql&#160;|&#160;postgres&#160;|&#160;none)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
 </text><text class="breeze-setup-config-r5" x="0" y="337.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-13)">│</text><text 
class="breeze-setup-config-r5" x="475.8" y="337.2" textLength="963.8" 
clip-path="url(#breeze-setup-config-line-13)">[default:&#160;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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-setup-config-r5" x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-14)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="361.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-14)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="361.6" textLength="109.8" 
clip-path="url(#breeze-setup-config-line-14)">-postgres</text><text 
class="breeze-setup-config-r4" x="146.4" y="361.6" textLength="97.6" 
clip-path="url(#bree [...]
-</text><text class="breeze-setup-config-r5" x="0" y="386" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-15)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="386" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-15)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="386" textLength="73.2" 
clip-path="url(#breeze-setup-config-line-15)">-mysql</text><text 
class="breeze-setup-config-r4" x="109.8" y="386" textLength="97.6" 
clip-path="url(#breeze-setup-con [...]
-</text><text class="breeze-setup-config-r5" x="0" y="410.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-16)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="410.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-16)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="410.4" textLength="134.2" 
clip-path="url(#breeze-setup-config-line-16)">-cheatsheet</text><text 
class="breeze-setup-config-r1" x="170.8" y="410.4" textLength="12.2" 
clip-path="url(#br [...]
-</text><text class="breeze-setup-config-r5" x="0" y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-17)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-17)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="434.8" textLength="109.8" 
clip-path="url(#breeze-setup-config-line-17)">-asciiart</text><text 
class="breeze-setup-config-r1" x="146.4" y="434.8" textLength="12.2" 
clip-path="url(#bree [...]
-</text><text class="breeze-setup-config-r5" x="0" y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-18)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-18)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="459.2" textLength="85.4" 
clip-path="url(#breeze-setup-config-line-18)">-colour</text><text 
class="breeze-setup-config-r1" x="122" y="459.2" textLength="12.2" 
clip-path="url(#breeze-se [...]
-</text><text class="breeze-setup-config-r5" x="0" y="483.6" textLength="1464" 
clip-path="url(#breeze-setup-config-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-config-r1" x="1464" y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-19)">
-</text><text class="breeze-setup-config-r5" x="0" y="508" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-20)">╭─</text><text 
class="breeze-setup-config-r5" x="24.4" y="508" textLength="195.2" 
clip-path="url(#breeze-setup-config-line-20)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-config-r5" x="219.6" y="508" textLength="1220" 
clip-path="url(#breeze-setup-config-line-20)">─────────────────────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-setup-config-r5" x="0" y="532.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-21)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="532.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-21)">-</text><text 
class="breeze-setup-config-r4" x="36.6" y="532.4" textLength="61" 
clip-path="url(#breeze-setup-config-line-21)">-help</text><text 
class="breeze-setup-config-r6" x="122" y="532.4" textLength="24.4" 
clip-path="url(#breeze-setup- [...]
-</text><text class="breeze-setup-config-r5" x="0" y="556.8" textLength="1464" 
clip-path="url(#breeze-setup-config-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-config-r1" x="1464" y="556.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-22)">
+</text><text class="breeze-setup-config-r5" x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-14)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="361.6" textLength="219.6" 
clip-path="url(#breeze-setup-config-line-14)">--postgres-version</text><text 
class="breeze-setup-config-r6" x="390.4" y="361.6" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-14)">-P</text><text 
class="breeze-setup-config-r1" x="475.8" y="361.6" textLength="305" clip-path= 
[...]
+</text><text class="breeze-setup-config-r5" x="0" y="386" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-15)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="386" textLength="183" 
clip-path="url(#breeze-setup-config-line-15)">--mysql-version</text><text 
class="breeze-setup-config-r6" x="390.4" y="386" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-15)">-M</text><text 
class="breeze-setup-config-r1" x="475.8" y="386" textLength="268.4" 
clip-path="url(#breez [...]
+</text><text class="breeze-setup-config-r5" x="0" y="410.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-16)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="410.4" textLength="97.6" 
clip-path="url(#breeze-setup-config-line-16)">--use-uv</text><text 
class="breeze-setup-config-r1" x="122" y="410.4" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-16)">/</text><text 
class="breeze-setup-config-r4" x="134.2" y="410.4" textLength="134.2" 
clip-path="url(#breeze [...]
+</text><text class="breeze-setup-config-r5" x="0" y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-17)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="434.8" textLength="146.4" 
clip-path="url(#breeze-setup-config-line-17)">--cheatsheet</text><text 
class="breeze-setup-config-r1" x="170.8" y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-17)">/</text><text 
class="breeze-setup-config-r4" x="183" y="434.8" textLength="183" 
clip-path="url(#bre [...]
+</text><text class="breeze-setup-config-r5" x="0" y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-18)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="459.2" textLength="122" 
clip-path="url(#breeze-setup-config-line-18)">--asciiart</text><text 
class="breeze-setup-config-r1" x="146.4" y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-18)">/</text><text 
class="breeze-setup-config-r4" x="158.6" y="459.2" textLength="158.6" 
clip-path="url(#bre [...]
+</text><text class="breeze-setup-config-r5" x="0" y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-19)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="483.6" textLength="97.6" 
clip-path="url(#breeze-setup-config-line-19)">--colour</text><text 
class="breeze-setup-config-r1" x="122" y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-19)">/</text><text 
class="breeze-setup-config-r4" x="134.2" y="483.6" textLength="134.2" 
clip-path="url(#breeze [...]
+</text><text class="breeze-setup-config-r5" x="0" y="508" textLength="1464" 
clip-path="url(#breeze-setup-config-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-config-r1" x="1464" y="508" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-20)">
+</text><text class="breeze-setup-config-r5" x="0" y="532.4" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-21)">╭─</text><text 
class="breeze-setup-config-r5" x="24.4" y="532.4" textLength="195.2" 
clip-path="url(#breeze-setup-config-line-21)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-config-r5" x="219.6" y="532.4" textLength="1220" 
clip-path="url(#breeze-setup-config-line-21)">───────────────────────────────────────────────────────────────────────────────
 [...]
+</text><text class="breeze-setup-config-r5" x="0" y="556.8" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-22)">│</text><text 
class="breeze-setup-config-r4" x="24.4" y="556.8" textLength="73.2" 
clip-path="url(#breeze-setup-config-line-22)">--help</text><text 
class="breeze-setup-config-r6" x="122" y="556.8" textLength="24.4" 
clip-path="url(#breeze-setup-config-line-22)">-h</text><text 
class="breeze-setup-config-r1" x="170.8" y="556.8" textLength="329.4" 
clip-path="url(#breeze- [...]
+</text><text class="breeze-setup-config-r5" x="0" y="581.2" textLength="1464" 
clip-path="url(#breeze-setup-config-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-config-r1" x="1464" y="581.2" textLength="12.2" 
clip-path="url(#breeze-setup-config-line-23)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_setup_config.txt 
b/dev/breeze/doc/images/output_setup_config.txt
index f47fa38e42c..3b2da9a9c04 100644
--- a/dev/breeze/doc/images/output_setup_config.txt
+++ b/dev/breeze/doc/images/output_setup_config.txt
@@ -1 +1 @@
-422c8c524b557fcf5924da4c8590935d
+96e10564034b282769a2c48ebf7176e2
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 33f3dd338e4..648a13d4246 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -226,8 +226,8 @@ class VersionedFile(NamedTuple):
     file_name: str
 
 
-AIRFLOW_PIP_VERSION = "24.0"
-AIRFLOW_UV_VERSION = "0.1.10"
+AIRFLOW_PIP_VERSION = "24.3.1"
+AIRFLOW_UV_VERSION = "0.4.29"
 AIRFLOW_USE_UV = False
 WHEEL_VERSION = "0.36.2"
 GITPYTHON_VERSION = "3.1.40"
@@ -451,7 +451,11 @@ def _check_sdist_to_wheel_dists(dists_info: 
tuple[DistributionPackageInfo, ...])
                 continue
 
             if not venv_created:
-                python_path = create_venv(Path(tmp_dir_name) / ".venv", 
pip_version=AIRFLOW_PIP_VERSION)
+                python_path = create_venv(
+                    Path(tmp_dir_name) / ".venv",
+                    pip_version=AIRFLOW_PIP_VERSION,
+                    uv_version=AIRFLOW_UV_VERSION,
+                )
                 pip_command = create_pip_command(python_path)
                 venv_created = True
 
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands.py 
b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
index 407ff7f8cdf..bc1ac4f1fa5 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
@@ -192,6 +192,12 @@ def version():
 @option_mysql_version
 @click.option("-C/-c", "--cheatsheet/--no-cheatsheet", help="Enable/disable 
cheatsheet.", default=None)
 @click.option("-A/-a", "--asciiart/--no-asciiart", help="Enable/disable 
ASCIIart.", default=None)
[email protected](
+    "-U/-u",
+    "--use-uv/--no-use-uv",
+    help="Enable/disable using uv for creating venvs by breeze.",
+    default=None,
+)
 @click.option(
     "--colour/--no-colour",
     help="Enable/disable Colour mode (useful for colour blind-friendly 
communication).",
@@ -200,6 +206,7 @@ def version():
 def change_config(
     python: str,
     backend: str,
+    use_uv: bool,
     postgres_version: str,
     mysql_version: str,
     cheatsheet: bool,
@@ -212,14 +219,22 @@ def change_config(
     asciiart_file = "suppress_asciiart"
     cheatsheet_file = "suppress_cheatsheet"
     colour_file = "suppress_colour"
+    use_uv_file = "use_uv"
 
+    if use_uv is not None:
+        if use_uv:
+            touch_cache_file(use_uv_file)
+            get_console().print("[info]Enable using uv[/]")
+        else:
+            delete_cache(use_uv_file)
+            get_console().print("[info]Disable using uv[/]")
     if asciiart is not None:
         if asciiart:
             delete_cache(asciiart_file)
-            get_console().print("[info]Enable ASCIIART![/]")
+            get_console().print("[info]Enable ASCIIART[/]")
         else:
             touch_cache_file(asciiart_file)
-            get_console().print("[info]Disable ASCIIART![/]")
+            get_console().print("[info]Disable ASCIIART[/]")
     if cheatsheet is not None:
         if cheatsheet:
             delete_cache(cheatsheet_file)
@@ -235,23 +250,27 @@ def change_config(
             touch_cache_file(colour_file)
             get_console().print("[info]Disable Colour[/]")
 
-    def get_status(file: str):
+    def get_supress_status(file: str):
         return "disabled" if check_if_cache_exists(file) else "enabled"
 
+    def get_status(file: str):
+        return "enabled" if check_if_cache_exists(file) else "disabled"
+
     get_console().print()
     get_console().print("[info]Current configuration:[/]")
     get_console().print()
     get_console().print(f"[info]* Python: {python}[/]")
     get_console().print(f"[info]* Backend: {backend}[/]")
+    get_console().print(f"[info]* Use uv: {get_status(use_uv_file)}[/]")
     get_console().print()
     get_console().print(f"[info]* Postgres version: {postgres_version}[/]")
     get_console().print(f"[info]* MySQL version: {mysql_version}[/]")
     get_console().print()
-    get_console().print(f"[info]* ASCIIART: {get_status(asciiart_file)}[/]")
-    get_console().print(f"[info]* Cheatsheet: 
{get_status(cheatsheet_file)}[/]")
+    get_console().print(f"[info]* ASCIIART: 
{get_supress_status(asciiart_file)}[/]")
+    get_console().print(f"[info]* Cheatsheet: 
{get_supress_status(cheatsheet_file)}[/]")
     get_console().print()
     get_console().print()
-    get_console().print(f"[info]* Colour: {get_status(colour_file)}[/]")
+    get_console().print(f"[info]* Colour: 
{get_supress_status(colour_file)}[/]")
     get_console().print()
 
 
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/setup_commands_config.py
index 61460f004ec..802a41fc273 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands_config.py
@@ -63,6 +63,7 @@ SETUP_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] 
= {
                 "--backend",
                 "--postgres-version",
                 "--mysql-version",
+                "--use-uv",
                 "--cheatsheet",
                 "--asciiart",
                 "--colour",
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py 
b/dev/breeze/src/airflow_breeze/global_constants.py
index 94487012274..791e07cfe71 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -155,7 +155,8 @@ if MYSQL_INNOVATION_RELEASE:
 
 ALLOWED_INSTALL_MYSQL_CLIENT_TYPES = ["mariadb", "mysql"]
 
-PIP_VERSION = "24.0"
+PIP_VERSION = "24.3.1"
+UV_VERSION = "0.4.29"
 
 DEFAULT_UV_HTTP_TIMEOUT = 300
 DEFAULT_WSL2_HTTP_TIMEOUT = 900
diff --git a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py 
b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
index 69703b4692b..3aca9d51c13 100644
--- a/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/kubernetes_utils.py
@@ -41,12 +41,15 @@ from airflow_breeze.global_constants import (
     HELM_VERSION,
     KIND_VERSION,
     PIP_VERSION,
+    UV_VERSION,
 )
+from airflow_breeze.utils.cache import check_if_cache_exists
 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
 from airflow_breeze.utils.shared_options import get_dry_run, get_verbose
+from airflow_breeze.utils.virtualenv_utils import create_pip_command, 
create_uv_command
 
 K8S_ENV_PATH = BUILD_CACHE_DIR / ".k8s-env"
 K8S_CLUSTERS_PATH = BUILD_CACHE_DIR / ".k8s-clusters"
@@ -301,10 +304,12 @@ def _requirements_changed() -> bool:
 
 
 def _install_packages_in_k8s_virtualenv():
+    if check_if_cache_exists("use_uv"):
+        command = create_uv_command(PYTHON_BIN_PATH)
+    else:
+        command = create_pip_command(PYTHON_BIN_PATH)
     install_command_no_constraints = [
-        str(PYTHON_BIN_PATH),
-        "-m",
-        "pip",
+        *command,
         "install",
         "-r",
         str(K8S_REQUIREMENTS_PATH.resolve()),
@@ -405,8 +410,9 @@ def create_virtualenv(force_venv_setup: bool) -> 
RunCommandResult:
         )
         return venv_command_result
     get_console().print(f"[info]Reinstalling PIP version in {K8S_ENV_PATH}")
+    command = create_pip_command(PYTHON_BIN_PATH)
     pip_reinstall_result = run_command(
-        [str(PYTHON_BIN_PATH), "-m", "pip", "install", f"pip=={PIP_VERSION}"],
+        [*command, "install", f"pip=={PIP_VERSION}"],
         check=False,
         capture_output=True,
     )
@@ -416,8 +422,19 @@ def create_virtualenv(force_venv_setup: bool) -> 
RunCommandResult:
             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}")
+    uv_reinstall_result = run_command(
+        [*command, "install", f"uv=={UV_VERSION}"],
+        check=False,
+        capture_output=True,
+    )
+    if uv_reinstall_result.returncode != 0:
+        get_console().print(
+            f"[error]Error when updating uv to {UV_VERSION}:[/]\n"
+            f"{uv_reinstall_result.stdout}\n{uv_reinstall_result.stderr}"
+        )
+        return uv_reinstall_result
 
+    get_console().print(f"[info]Installing necessary packages in 
{K8S_ENV_PATH}")
     install_packages_result = _install_packages_in_k8s_virtualenv()
     if install_packages_result.returncode == 0:
         if get_dry_run():
diff --git a/dev/breeze/src/airflow_breeze/utils/run_tests.py 
b/dev/breeze/src/airflow_breeze/utils/run_tests.py
index 73cbb430817..b34fa3b3410 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_tests.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_tests.py
@@ -22,7 +22,7 @@ import sys
 from itertools import chain
 from subprocess import DEVNULL
 
-from airflow_breeze.global_constants import PIP_VERSION
+from airflow_breeze.global_constants import PIP_VERSION, UV_VERSION
 from airflow_breeze.utils.console import Output, get_console
 from airflow_breeze.utils.packages import get_excluded_provider_folders, 
get_suspended_provider_folders
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
@@ -59,7 +59,9 @@ def verify_an_image(
     env["DOCKER_IMAGE"] = image_name
     if slim_image:
         env["TEST_SLIM_IMAGE"] = "true"
-    with create_temp_venv(pip_version=PIP_VERSION, 
requirements_file=DOCKER_TESTS_REQUIREMENTS) as py_exe:
+    with create_temp_venv(
+        pip_version=PIP_VERSION, uv_version=UV_VERSION, 
requirements_file=DOCKER_TESTS_REQUIREMENTS
+    ) as py_exe:
         command_result = run_command(
             [py_exe, "-m", "pytest", str(test_path), *pytest_args, 
*extra_pytest_args],
             env=env,
diff --git a/dev/breeze/src/airflow_breeze/utils/virtualenv_utils.py 
b/dev/breeze/src/airflow_breeze/utils/virtualenv_utils.py
index 0288e49b909..3c6a175a0fc 100644
--- a/dev/breeze/src/airflow_breeze/utils/virtualenv_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/virtualenv_utils.py
@@ -23,6 +23,7 @@ import tempfile
 from pathlib import Path
 from typing import Generator
 
+from airflow_breeze.utils.cache import check_if_cache_exists
 from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.run_utils import run_command
 
@@ -31,10 +32,15 @@ def create_pip_command(python: str | Path) -> list[str]:
     return [python.as_posix() if hasattr(python, "as_posix") else str(python), 
"-m", "pip"]
 
 
+def create_uv_command(python: str | Path) -> list[str]:
+    return [python.as_posix() if hasattr(python, "as_posix") else str(python), 
"-m", "uv", "pip"]
+
+
 def create_venv(
     venv_path: str | Path,
     python: str | None = None,
     pip_version: str | None = None,
+    uv_version: str | None = None,
     requirements_file: str | Path | None = None,
 ) -> str:
     venv_path = Path(venv_path).resolve().absolute()
@@ -53,10 +59,13 @@ def create_venv(
     if not python_path.exists():
         get_console().print(f"\n[errors]Python interpreter is not exist in 
path {python_path}. Exiting!\n")
         sys.exit(1)
-    pip_command = create_pip_command(python_path)
+    if check_if_cache_exists("use_uv"):
+        command = create_uv_command(python_path)
+    else:
+        command = create_pip_command(python_path)
     if pip_version:
         result = run_command(
-            [*pip_command, "install", f"pip=={pip_version}", "-q"],
+            [*command, "install", f"pip=={pip_version}", "-q"],
             check=False,
             capture_output=False,
             text=True,
@@ -67,10 +76,23 @@ def create_venv(
                 f"{result.stdout}\n{result.stderr}"
             )
             sys.exit(result.returncode)
+    if uv_version:
+        result = run_command(
+            [*command, "install", f"uv=={uv_version}", "-q"],
+            check=False,
+            capture_output=False,
+            text=True,
+        )
+        if result.returncode != 0:
+            get_console().print(
+                f"[error]Error when installing uv in 
{venv_path.as_posix()}[/]\n"
+                f"{result.stdout}\n{result.stderr}"
+            )
+            sys.exit(result.returncode)
     if requirements_file:
         requirements_file = Path(requirements_file).absolute().as_posix()
         result = run_command(
-            [*pip_command, "install", "-r", requirements_file, "-q"],
+            [*command, "install", "-r", requirements_file, "-q"],
             check=True,
             capture_output=False,
             text=True,
@@ -88,6 +110,7 @@ def create_venv(
 def create_temp_venv(
     python: str | None = None,
     pip_version: str | None = None,
+    uv_version: str | None = None,
     requirements_file: str | Path | None = None,
     prefix: str | None = None,
 ) -> Generator[str, None, None]:
@@ -96,5 +119,6 @@ def create_temp_venv(
             Path(tmp_dir_name) / ".venv",
             python=python,
             pip_version=pip_version,
+            uv_version=uv_version,
             requirements_file=requirements_file,
         )
diff --git a/scripts/ci/install_breeze.sh b/scripts/ci/install_breeze.sh
index 5ffd604670b..aa5a3160060 100755
--- a/scripts/ci/install_breeze.sh
+++ b/scripts/ci/install_breeze.sh
@@ -25,7 +25,7 @@ if [[ ${PYTHON_VERSION=} != "" ]]; then
     PYTHON_ARG="--python=$(which python"${PYTHON_VERSION}") "
 fi
 
-python -m pip install --upgrade pip==24.0
+python -m pip install --upgrade pip==24.3.1
 python -m pip install "pipx>=1.4.1"
 python -m pipx uninstall apache-airflow-breeze >/dev/null 2>&1 || true
 # shellcheck disable=SC2086
diff --git a/scripts/ci/pre_commit/update_installers.py 
b/scripts/ci/pre_commit/update_installers.py
index a90e07d38c9..f55a937df0c 100755
--- a/scripts/ci/pre_commit/update_installers.py
+++ b/scripts/ci/pre_commit/update_installers.py
@@ -65,6 +65,7 @@ AIRFLOW_PIP_UPGRADE_PATTERN = re.compile(r"(python -m pip 
install --upgrade pip=
 
 AIRFLOW_UV_PATTERN = re.compile(r"(AIRFLOW_UV_VERSION=)([0-9.]+)")
 AIRFLOW_UV_QUOTED_PATTERN = re.compile(r"(AIRFLOW_UV_VERSION = )(\"[0-9.]+\")")
+UV_QUOTED_PATTERN = re.compile(r"(UV_VERSION = )(\"[0-9.]+\")")
 AIRFLOW_UV_DOC_PATTERN = re.compile(r"(\| *`AIRFLOW_UV_VERSION` *\| 
*)(`[0-9.]+`)( *\|)")
 UV_GREATER_PATTERN = re.compile(r'"(uv>=)([0-9]+)"')
 
@@ -118,11 +119,14 @@ if __name__ == "__main__":
             new_content = replace_group_2_while_keeping_total_length(
                 AIRFLOW_UV_PATTERN, uv_version, new_content
             )
+            new_content = replace_group_2_while_keeping_total_length(
+                UV_GREATER_PATTERN, uv_version, new_content
+            )
             new_content = replace_group_2_while_keeping_total_length(
                 AIRFLOW_UV_QUOTED_PATTERN, f'"{uv_version}"', new_content
             )
             new_content = replace_group_2_while_keeping_total_length(
-                UV_GREATER_PATTERN, uv_version, new_content
+                UV_QUOTED_PATTERN, f'"{uv_version}"', new_content
             )
         if new_content != file_content:
             file.write_text(new_content)

Reply via email to