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

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


The following commit(s) were added to refs/heads/v3-0-test by this push:
     new f4db9ec5a2f [v3-0-test] Do not run FAB pre-commits in release branches 
(#50875) (#50886)
f4db9ec5a2f is described below

commit f4db9ec5a2fa09a705d0085d6e1794065fd4c1f3
Author: Jarek Potiuk <[email protected]>
AuthorDate: Wed May 21 08:39:15 2025 -0400

    [v3-0-test] Do not run FAB pre-commits in release branches (#50875) (#50886)
    
    The openapi generation scripts were run together for FAB and main
    openapi from core - however we do not want to re-run those scripts at
    all in non-main branch - i.e. branch we prepare providers from.
    
    This PR splits the openapi script and removes all fab pre-commits from
    running in non-main branch.
    (cherry picked from commit 611270abdf3fe4806fbe5b5efc33780ded58c7dd)
---
 .pre-commit-config.yaml                            |  10 +-
 contributing-docs/08_static_code_checks.rst        |   2 +
 dev/breeze/doc/images/output-commands.svg          | 341 ++++++++++++++++++++-
 dev/breeze/doc/images/output_static-checks.svg     |   6 +-
 dev/breeze/doc/images/output_static-checks.txt     |   2 +-
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |   1 +
 .../src/airflow_breeze/utils/selective_checks.py   |   2 +
 dev/breeze/tests/test_selective_checks.py          |   3 +-
 ...astapi_api_spec.py => generate_openapi_spec.py} |   2 +-
 ...pi_api_spec.py => generate_openapi_spec_fab.py} |   2 +-
 scripts/in_container/in_container_utils.py         |  51 +++
 ...pi_api_spec.py => run_generate_openapi_spec.py} |  78 +----
 .../run_generate_openapi_spec_fab.py}              |  29 +-
 13 files changed, 445 insertions(+), 84 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6d9321e4eb7..910d32f753c 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1331,7 +1331,15 @@ repos:
       - id: generate-openapi-spec
         name: Generate the FastAPI API spec
         language: python
-        entry: ./scripts/ci/pre_commit/update_fastapi_api_spec.py
+        entry: ./scripts/ci/pre_commit/generate_openapi_spec.py
+        pass_filenames: false
+        files: 
^airflow-core/src/airflow/api_fastapi/.*\.py$|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/.*\.py$|^providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$
+        exclude: ^airflow-core/src/airflow/api_fastapi/execution_api/.*
+        additional_dependencies: ['rich>=12.4.4', 
'openapi-spec-validator>=0.7.1']
+      - id: generate-openapi-spec-fab
+        name: Generate the FastAPI API spec for FAB
+        language: python
+        entry: ./scripts/ci/pre_commit/generate_openapi_spec_fab.py
         pass_filenames: false
         files: 
^airflow-core/src/airflow/api_fastapi/.*\.py$|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/.*\.py$|^providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$
         exclude: ^airflow-core/src/airflow/api_fastapi/execution_api/.*
diff --git a/contributing-docs/08_static_code_checks.rst 
b/contributing-docs/08_static_code_checks.rst
index 452a94d26f2..9e4a4fbd5a5 100644
--- a/contributing-docs/08_static_code_checks.rst
+++ b/contributing-docs/08_static_code_checks.rst
@@ -275,6 +275,8 @@ require Breeze Docker image to be built locally.
 
+-----------------------------------------------------------+--------------------------------------------------------+---------+
 | generate-openapi-spec                                     | Generate the 
FastAPI API spec                          | *       |
 
+-----------------------------------------------------------+--------------------------------------------------------+---------+
+| generate-openapi-spec-fab                                 | Generate the 
FastAPI API spec for FAB                  | *       |
++-----------------------------------------------------------+--------------------------------------------------------+---------+
 | generate-pypi-readme                                      | Generate PyPI 
README                                   |         |
 
+-----------------------------------------------------------+--------------------------------------------------------+---------+
 | generate-tasksdk-datamodels                               | Generate 
Datamodels for TaskSDK client                 | *       |
diff --git a/dev/breeze/doc/images/output-commands.svg 
b/dev/breeze/doc/images/output-commands.svg
index 1a4becaa2d6..2d9668f5a21 100644
--- a/dev/breeze/doc/images/output-commands.svg
+++ b/dev/breeze/doc/images/output-commands.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 123.19999999999999" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2148.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -36,11 +36,14 @@
 .breeze-help-r2 { fill: #d0b344 }
 .breeze-help-r3 { fill: #c5c8c6;font-weight: bold }
 .breeze-help-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-help-r5 { fill: #868887 }
+.breeze-help-r6 { fill: #98a84b;font-weight: bold }
+.breeze-help-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
     <clipPath id="breeze-help-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="72.19999999999999" />
+      <rect x="0" y="0" width="1463.0" height="2097.4" />
     </clipPath>
     <clipPath id="breeze-help-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -48,9 +51,258 @@
 <clipPath id="breeze-help-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-help-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-28">
+    <rect x="0" y="684.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-29">
+    <rect x="0" y="709.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-30">
+    <rect x="0" y="733.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-31">
+    <rect x="0" y="757.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-32">
+    <rect x="0" y="782.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-33">
+    <rect x="0" y="806.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-34">
+    <rect x="0" y="831.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-35">
+    <rect x="0" y="855.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-36">
+    <rect x="0" y="879.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-37">
+    <rect x="0" y="904.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-38">
+    <rect x="0" y="928.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-39">
+    <rect x="0" y="953.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-40">
+    <rect x="0" y="977.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-41">
+    <rect x="0" y="1001.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-42">
+    <rect x="0" y="1026.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-43">
+    <rect x="0" y="1050.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-44">
+    <rect x="0" y="1075.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-45">
+    <rect x="0" y="1099.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-46">
+    <rect x="0" y="1123.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-47">
+    <rect x="0" y="1148.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-48">
+    <rect x="0" y="1172.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-49">
+    <rect x="0" y="1197.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-50">
+    <rect x="0" y="1221.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-51">
+    <rect x="0" y="1245.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-52">
+    <rect x="0" y="1270.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-53">
+    <rect x="0" y="1294.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-54">
+    <rect x="0" y="1319.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-55">
+    <rect x="0" y="1343.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-56">
+    <rect x="0" y="1367.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-57">
+    <rect x="0" y="1392.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-58">
+    <rect x="0" y="1416.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-59">
+    <rect x="0" y="1441.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-60">
+    <rect x="0" y="1465.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-61">
+    <rect x="0" y="1489.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-62">
+    <rect x="0" y="1514.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-63">
+    <rect x="0" y="1538.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-64">
+    <rect x="0" y="1563.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-65">
+    <rect x="0" y="1587.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-66">
+    <rect x="0" y="1611.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-67">
+    <rect x="0" y="1636.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-68">
+    <rect x="0" y="1660.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-69">
+    <rect x="0" y="1685.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-70">
+    <rect x="0" y="1709.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-71">
+    <rect x="0" y="1733.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-72">
+    <rect x="0" y="1758.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-73">
+    <rect x="0" y="1782.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-74">
+    <rect x="0" y="1807.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-75">
+    <rect x="0" y="1831.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-76">
+    <rect x="0" y="1855.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-77">
+    <rect x="0" y="1880.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-78">
+    <rect x="0" y="1904.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-79">
+    <rect x="0" y="1929.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-80">
+    <rect x="0" y="1953.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-81">
+    <rect x="0" y="1977.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-82">
+    <rect x="0" y="2002.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-83">
+    <rect x="0" y="2026.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-help-line-84">
+    <rect x="0" y="2051.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="121.2" rx="8"/><text class="breeze-help-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="2146.4" rx="8"/><text 
class="breeze-help-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"/>
@@ -63,6 +315,89 @@
     <text class="breeze-help-r1" x="1464" y="20" textLength="12.2" 
clip-path="url(#breeze-help-line-0)">
 </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="97.6" 
clip-path="url(#breeze-help-line-4)">--python</text><text 
class="breeze-help-r6" x="719.8" y="117.6" textLength="24.4" 
clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r1" 
x="768.6" y="117.6" textLength="671" 
clip-path="url(#breeze-help-line-4)">Python&#160;major/minor&#160;version&#160;u
 [...]
+</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-r1" 
x="768.6" y="142" textLength="671" 
clip-path="url(#breeze-help-line-5)">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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</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-r7" 
x="768.6" y="166.4" textLength="671" 
clip-path="url(#breeze-help-line-6)">(&gt;3.9&lt;&#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;&#160;</text><text
 class="breeze-help-r5" x="1451.8" y [...]
+</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-r5" 
x="768.6" y="190.8" textLength="671" 
clip-path="url(#breeze-help-line-7)">[default:&#160;3.9]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-help-r5" x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-help-line-8)">│</text><text class="breeze-help-r4" 
x="24.4" y="215.2" textLength="158.6" 
clip-path="url(#breeze-help-line-8)">--integration</text><text 
class="breeze-help-r1" x="768.6" y="215.2" textLength="671" 
clip-path="url(#breeze-help-line-8)">Core&#160;Integrations&#160;to&#160;enable&#160;when&#160;running&#160;(can&#160;be&#160;more&#160;&#160;</text><text
 class="breeze-help-r5" x="1451.8 [...]
+</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-r1" 
x="768.6" y="239.6" textLength="671" 
clip-path="url(#breeze-help-line-9)">than&#160;one).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="264" textLength="12.2" 
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r7" 
x="768.6" y="264" textLength="671" 
clip-path="url(#breeze-help-line-10)">(all&#160;|&#160;all-testable&#160;|&#160;cassandra&#160;|&#160;celery&#160;|&#160;drill&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="264" textLength="12.2" 
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r1" x=" 
[...]
+</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-r7" 
x="768.6" y="288.4" textLength="671" 
clip-path="url(#breeze-help-line-11)">kafka&#160;|&#160;kerberos&#160;|&#160;keycloak&#160;|&#160;mongo&#160;|&#160;mssql&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="288.4" textLength="12.2" 
clip-path="url(#breeze-help-line-11)">│</text>< [...]
+</text><text class="breeze-help-r5" x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-help-line-12)">│</text><text class="breeze-help-r7" 
x="768.6" y="312.8" textLength="671" 
clip-path="url(#breeze-help-line-12)">openlineage&#160;|&#160;otel&#160;|&#160;pinot&#160;|&#160;qdrant&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="312.8" textLength="12.2" 
clip-path="url(#breeze-help-line-12)">│</text><text class="breeze-help-r1" 
x="1464 [...]
+</text><text class="breeze-help-r5" x="0" y="337.2" textLength="12.2" 
clip-path="url(#breeze-help-line-13)">│</text><text class="breeze-help-r7" 
x="768.6" y="337.2" textLength="671" 
clip-path="url(#breeze-help-line-13)">trino&#160;|&#160;ydb)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="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="317.2" 
clip-path="url(#breeze-help-line-14)">--standalone-dag-processor</text><text 
class="breeze-help-r1" x="341.6" y="361.6" textLength="12.2" 
clip-path="url(#breeze-help-line-14)">/</text><text class="breeze-help-r4" 
x="353.8" y="361.6" textLength="341.6" 
clip-path="url(#breeze-help-line-14)">--no-standalone-dag [...]
+</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-r4" 
x="24.4" y="386" textLength="12.2" 
clip-path="url(#breeze-help-line-15)">r</text><text class="breeze-help-r1" 
x="768.6" y="386" textLength="671" 
clip-path="url(#breeze-help-line-15)">(required&#160;for&#160;Airflow&#160;3).&#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="410.4" textLength="12.2" 
clip-path="url(#breeze-help-line-16)">│</text><text class="breeze-help-r5" 
x="768.6" y="410.4" textLength="671" 
clip-path="url(#breeze-help-line-16)">[default:&#160;standalone-dag-processor]&#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="1451.8" y="410.4" textLength="12.2" 
clip-path="url(#breeze-help-line-16)" [...]
+</text><text class="breeze-help-r5" x="0" y="434.8" textLength="1464" 
clip-path="url(#breeze-help-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="434.8" textLength="12.2" 
clip-path="url(#breeze-help-line-17)">
+</text><text class="breeze-help-r5" x="0" y="459.2" textLength="24.4" 
clip-path="url(#breeze-help-line-18)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="459.2" textLength="463.6" 
clip-path="url(#breeze-help-line-18)">&#160;Docker&#160;Compose&#160;selection&#160;and&#160;cleanup&#160;</text><text
 class="breeze-help-r5" x="488" y="459.2" textLength="951.6" 
clip-path="url(#breeze-help-line-18)">──────────────────────────────────────────────────────────────────────────────</text><text
  [...]
+</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="170.8" 
clip-path="url(#breeze-help-line-19)">--project-name</text><text 
class="breeze-help-r1" x="244" y="483.6" textLength="1195.6" 
clip-path="url(#breeze-help-line-19)">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="508" textLength="12.2" 
clip-path="url(#breeze-help-line-20)">│</text><text class="breeze-help-r1" 
x="244" y="508" textLength="512.4" 
clip-path="url(#breeze-help-line-20)">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="508" textLength="170.8" 
clip-path="url(#breeze-help-line-20)">--project-name</text><text 
class="breeze-help-r1" x="927.2" y="508" textLength="512 [...]
+</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-r1" 
x="244" y="532.4" textLength="1195.6" 
clip-path="url(#breeze-help-line-21)">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="556.8" textLength="12.2" 
clip-path="url(#breeze-help-line-22)">│</text><text class="breeze-help-r7" 
x="244" y="556.8" textLength="1195.6" 
clip-path="url(#breeze-help-line-22)">(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="581.2" textLength="12.2" 
clip-path="url(#breeze-help-line-23)">│</text><text class="breeze-help-r5" 
x="244" y="581.2" textLength="1195.6" 
clip-path="url(#breeze-help-line-23)">[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="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="158.6" 
clip-path="url(#breeze-help-line-24)">--docker-host</text><text 
class="breeze-help-r1" x="244" y="605.6" textLength="915" 
clip-path="url(#breeze-help-line-24)">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="630" textLength="12.2" 
clip-path="url(#breeze-help-line-25)">│</text><text class="breeze-help-r1" 
x="244" y="630" textLength="1195.6" 
clip-path="url(#breeze-help-line-25)">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="654.4" textLength="12.2" 
clip-path="url(#breeze-help-line-26)">│</text><text class="breeze-help-r7" 
x="244" y="654.4" textLength="1195.6" 
clip-path="url(#breeze-help-line-26)">(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="678.8" textLength="1464" 
clip-path="url(#breeze-help-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="678.8" textLength="12.2" 
clip-path="url(#breeze-help-line-27)">
+</text><text class="breeze-help-r5" x="0" y="703.2" textLength="24.4" 
clip-path="url(#breeze-help-line-28)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="703.2" textLength="122" 
clip-path="url(#breeze-help-line-28)">&#160;Database&#160;</text><text 
class="breeze-help-r5" x="146.4" y="703.2" textLength="1293.2" 
clip-path="url(#breeze-help-line-28)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-help- [...]
+</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="109.8" 
clip-path="url(#breeze-help-line-29)">--backend</text><text 
class="breeze-help-r6" x="268.4" y="727.6" textLength="24.4" 
clip-path="url(#breeze-help-line-29)">-b</text><text class="breeze-help-r1" 
x="488" y="727.6" textLength="951.6" 
clip-path="url(#breeze-help-line-29)">Database&#160;backend&#160;to&#160;us 
[...]
+</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-r1" 
x="488" y="752" textLength="951.6" 
clip-path="url(#breeze-help-line-30)">invalid&#160;database&#160;configuration,&#160;meaning&#160;there&#160;will&#160;be&#160;no&#160;database&#160;available,&#160;&#160;</text><text
 class="breeze-help-r5" x="1451.8" y="752" textLength="12.2" 
clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help [...]
+</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-r1" 
x="488" y="776.4" textLength="951.6" 
clip-path="url(#breeze-help-line-31)">and&#160;any&#160;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;</text><text
 class="breeze-help-r5" x="1451.8" y="776.4" textLen [...]
+</text><text class="breeze-help-r5" x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-help-line-32)">│</text><text class="breeze-help-r7" 
x="488" y="800.8" textLength="951.6" 
clip-path="url(#breeze-help-line-32)">(&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="825.2" textLength="12.2" 
clip-path="url(#breeze-help-line-33)">│</text><text class="breeze-help-r5" 
x="488" y="825.2" textLength="951.6" 
clip-path="url(#breeze-help-line-33)">[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;&#16
 [...]
+</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="219.6" 
clip-path="url(#breeze-help-line-34)">--postgres-version</text><text 
class="breeze-help-r6" x="268.4" y="849.6" textLength="24.4" 
clip-path="url(#breeze-help-line-34)">-P</text><text class="breeze-help-r1" 
x="488" y="849.6" textLength="305" 
clip-path="url(#breeze-help-line-34)">Version&#160;of&#160;Postgres& [...]
+</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="183" 
clip-path="url(#breeze-help-line-35)">--mysql-version</text><text 
class="breeze-help-r6" x="268.4" y="874" textLength="24.4" 
clip-path="url(#breeze-help-line-35)">-M</text><text class="breeze-help-r1" 
x="488" y="874" textLength="268.4" 
clip-path="url(#breeze-help-line-35)">Version&#160;of&#160;MySQL&#160;used.</te 
[...]
+</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-r4" 
x="24.4" y="898.4" textLength="122" 
clip-path="url(#breeze-help-line-36)">--db-reset</text><text 
class="breeze-help-r6" x="268.4" y="898.4" textLength="24.4" 
clip-path="url(#breeze-help-line-36)">-d</text><text class="breeze-help-r1" 
x="292.8" y="898.4" textLength="12.2" 
clip-path="url(#breeze-help-line-36)">/</text><text class="breeze-help-r4"  
[...]
+</text><text class="breeze-help-r5" x="0" y="922.8" textLength="1464" 
clip-path="url(#breeze-help-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="922.8" textLength="12.2" 
clip-path="url(#breeze-help-line-37)">
+</text><text class="breeze-help-r5" x="0" y="947.2" textLength="24.4" 
clip-path="url(#breeze-help-line-38)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="947.2" textLength="488" 
clip-path="url(#breeze-help-line-38)">&#160;Build&#160;CI&#160;image&#160;(before&#160;entering&#160;shell)&#160;</text><text
 class="breeze-help-r5" x="512.4" y="947.2" textLength="927.2" 
clip-path="url(#breeze-help-line-38)">────────────────────────────────────────────────────────────────────────────</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-r4" 
x="24.4" y="971.6" textLength="231.8" 
clip-path="url(#breeze-help-line-39)">--github-repository</text><text 
class="breeze-help-r6" x="292.8" y="971.6" textLength="24.4" 
clip-path="url(#breeze-help-line-39)">-g</text><text class="breeze-help-r1" 
x="341.6" y="971.6" textLength="585.6" 
clip-path="url(#breeze-help-line-39)">GitHub&#160;repository&#1 [...]
+</text><text class="breeze-help-r5" x="0" y="996" textLength="12.2" 
clip-path="url(#breeze-help-line-40)">│</text><text class="breeze-help-r4" 
x="24.4" y="996" textLength="109.8" 
clip-path="url(#breeze-help-line-40)">--builder</text><text 
class="breeze-help-r1" x="341.6" y="996" textLength="756.4" 
clip-path="url(#breeze-help-line-40)">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="996 [...]
+</text><text class="breeze-help-r5" x="0" y="1020.4" textLength="12.2" 
clip-path="url(#breeze-help-line-41)">│</text><text class="breeze-help-r5" 
x="341.6" y="1020.4" textLength="756.4" 
clip-path="url(#breeze-help-line-41)">[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;&#
 [...]
+</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="97.6" 
clip-path="url(#breeze-help-line-42)">--use-uv</text><text 
class="breeze-help-r1" x="122" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-help-line-42)">/</text><text class="breeze-help-r4" 
x="134.2" y="1044.8" textLength="134.2" 
clip-path="url(#breeze-help-line-42)">--no-use-uv</text><text class="breez [...]
+</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="207.4" 
clip-path="url(#breeze-help-line-43)">--uv-http-timeout</text><text 
class="breeze-help-r1" x="341.6" y="1069.2" textLength="829.6" 
clip-path="url(#breeze-help-line-43)">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><te
 [...]
+</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-r5" 
x="341.6" y="1093.6" textLength="829.6" 
clip-path="url(#breeze-help-line-44)">[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;&
 [...]
+</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="183" 
clip-path="url(#breeze-help-line-46)">&#160;Other&#160;options&#160;</text><text
 class="breeze-help-r5" x="207.4" y="1142.4" textLength="1232.2" 
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="256.2" 
clip-path="url(#breeze-help-line-47)">--forward-credentials</text><text 
class="breeze-help-r6" x="305" y="1166.8" textLength="24.4" 
clip-path="url(#breeze-help-line-47)">-f</text><text class="breeze-help-r1" 
x="353.8" y="1166.8" textLength="634.4" 
clip-path="url(#breeze-help-line-47)">Forward&#160;local&#1 [...]
+</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="122" 
clip-path="url(#breeze-help-line-48)">--max-time</text><text 
class="breeze-help-r1" x="353.8" y="1191.2" textLength="1049.2" 
clip-path="url(#breeze-help-line-48)">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="1215.6" textLength="12.2" 
clip-path="url(#breeze-help-line-49)">│</text><text class="breeze-help-r7" 
x="353.8" y="1215.6" textLength="1049.2" 
clip-path="url(#breeze-help-line-49)">(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="1240" textLength="1464" 
clip-path="url(#breeze-help-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1240" textLength="12.2" 
clip-path="url(#breeze-help-line-50)">
+</text><text class="breeze-help-r5" x="0" y="1264.4" textLength="24.4" 
clip-path="url(#breeze-help-line-51)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1264.4" textLength="195.2" 
clip-path="url(#breeze-help-line-51)">&#160;Common&#160;options&#160;</text><text
 class="breeze-help-r5" x="219.6" y="1264.4" textLength="1220" 
clip-path="url(#breeze-help-line-51)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
+</text><text class="breeze-help-r5" x="0" y="1288.8" textLength="12.2" 
clip-path="url(#breeze-help-line-52)">│</text><text class="breeze-help-r4" 
x="24.4" y="1288.8" textLength="97.6" 
clip-path="url(#breeze-help-line-52)">--answer</text><text 
class="breeze-help-r6" x="158.6" y="1288.8" textLength="24.4" 
clip-path="url(#breeze-help-line-52)">-a</text><text class="breeze-help-r1" 
x="207.4" y="1288.8" textLength="317.2" 
clip-path="url(#breeze-help-line-52)">Force&#160;answer&#160;to&#160;qu [...]
+</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="109.8" 
clip-path="url(#breeze-help-line-53)">--dry-run</text><text 
class="breeze-help-r6" x="158.6" y="1313.2" textLength="24.4" 
clip-path="url(#breeze-help-line-53)">-D</text><text class="breeze-help-r1" 
x="207.4" y="1313.2" textLength="719.8" 
clip-path="url(#breeze-help-line-53)">If&#160;dry-run&#160;is&#160;se [...]
+</text><text class="breeze-help-r5" x="0" y="1337.6" textLength="12.2" 
clip-path="url(#breeze-help-line-54)">│</text><text class="breeze-help-r4" 
x="24.4" y="1337.6" textLength="109.8" 
clip-path="url(#breeze-help-line-54)">--verbose</text><text 
class="breeze-help-r6" x="158.6" y="1337.6" textLength="24.4" 
clip-path="url(#breeze-help-line-54)">-v</text><text class="breeze-help-r1" 
x="207.4" y="1337.6" textLength="585.6" 
clip-path="url(#breeze-help-line-54)">Print&#160;verbose&#160;informa [...]
+</text><text class="breeze-help-r5" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-help-line-55)">│</text><text class="breeze-help-r4" 
x="24.4" y="1362" textLength="73.2" 
clip-path="url(#breeze-help-line-55)">--help</text><text class="breeze-help-r6" 
x="158.6" y="1362" textLength="24.4" 
clip-path="url(#breeze-help-line-55)">-h</text><text class="breeze-help-r1" 
x="207.4" y="1362" textLength="329.4" 
clip-path="url(#breeze-help-line-55)">Show&#160;this&#160;message&#160;and&#160;e
 [...]
+</text><text class="breeze-help-r5" x="0" y="1386.4" textLength="1464" 
clip-path="url(#breeze-help-line-56)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1386.4" textLength="12.2" 
clip-path="url(#breeze-help-line-56)">
+</text><text class="breeze-help-r5" x="0" y="1410.8" textLength="24.4" 
clip-path="url(#breeze-help-line-57)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1410.8" textLength="244" 
clip-path="url(#breeze-help-line-57)">&#160;Developer&#160;commands&#160;</text><text
 class="breeze-help-r5" x="268.4" y="1410.8" textLength="1171.2" 
clip-path="url(#breeze-help-line-57)">────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
+</text><text class="breeze-help-r5" x="0" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-help-line-58)">│</text><text class="breeze-help-r4" 
x="24.4" y="1435.2" textLength="280.6" 
clip-path="url(#breeze-help-line-58)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1435.2" textLength="1110.2" 
clip-path="url(#breeze-help-line-58)">Enter&#160;breeze&#160;environment&#160;and&#160;starts&#160;all&#160;Airflow&#16
 [...]
+</text><text class="breeze-help-r5" x="0" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-help-line-59)">│</text><text class="breeze-help-r1" 
x="329.4" y="1459.6" textLength="1110.2" 
clip-path="url(#breeze-help-line-59)">assets&#160;if&#160;contents&#160;of&#160;www&#160;directory&#160;changed.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="1484" textLength="12.2" 
clip-path="url(#breeze-help-line-60)">│</text><text class="breeze-help-r4" 
x="24.4" y="1484" textLength="280.6" 
clip-path="url(#breeze-help-line-60)">static-checks&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1484" textLength="1110.2" 
clip-path="url(#breeze-help-line-60)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-help-r5" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-help-line-61)">│</text><text class="breeze-help-r4" 
x="24.4" y="1508.4" textLength="280.6" 
clip-path="url(#breeze-help-line-61)">build-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1508.4" textLength="1110.2" 
clip-path="url(#breeze-help-line-61)">Build&#160;documents.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</text><text class="breeze-help-r5" x="0" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-help-line-62)">│</text><text class="breeze-help-r4" 
x="24.4" y="1532.8" textLength="280.6" 
clip-path="url(#breeze-help-line-62)">down&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1532.8" textLength="1110.2" 
clip-path="url(#breeze-help-line-62)">Stop&#160;running&#160;breeze&#160;e [...]
+</text><text class="breeze-help-r5" x="0" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-help-line-63)">│</text><text class="breeze-help-r4" 
x="24.4" y="1557.2" textLength="280.6" 
clip-path="url(#breeze-help-line-63)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1557.2" textLength="1110.2" 
clip-path="url(#breeze-help-line-63)">Enter&#160;breeze&#160;environment.&#160; 
[...]
+</text><text class="breeze-help-r5" x="0" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-help-line-64)">│</text><text class="breeze-help-r4" 
x="24.4" y="1581.6" textLength="280.6" 
clip-path="url(#breeze-help-line-64)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1581.6" textLength="1110.2" 
clip-path="url(#breeze-help-line-64)">Joins&#160;the&#160;interactive&#160 [...]
+</text><text class="breeze-help-r5" x="0" y="1606" textLength="12.2" 
clip-path="url(#breeze-help-line-65)">│</text><text class="breeze-help-r4" 
x="24.4" y="1606" textLength="280.6" 
clip-path="url(#breeze-help-line-65)">compile-ui-assets&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1606" textLength="1110.2" 
clip-path="url(#breeze-help-line-65)">Compiles&#160;ui&#160;assets.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-help-r5" x="0" y="1630.4" textLength="12.2" 
clip-path="url(#breeze-help-line-66)">│</text><text class="breeze-help-r4" 
x="24.4" y="1630.4" textLength="280.6" 
clip-path="url(#breeze-help-line-66)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1630.4" textLength="1110.2" 
clip-path="url(#breeze-help-line-66)">Cleans&#160;the&#160;cache&#160;of&#160;parameters,
 [...]
+</text><text class="breeze-help-r5" x="0" y="1654.8" textLength="12.2" 
clip-path="url(#breeze-help-line-67)">│</text><text class="breeze-help-r4" 
x="24.4" y="1654.8" textLength="280.6" 
clip-path="url(#breeze-help-line-67)">generate-migration-file</text><text 
class="breeze-help-r1" x="329.4" y="1654.8" textLength="1110.2" 
clip-path="url(#breeze-help-line-67)">Autogenerate&#160;the&#160;alembic&#160;migration&#160;file&#160;for&#160;the&#160;ORM&#160;changes.&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-help-r5" x="0" y="1679.2" textLength="12.2" 
clip-path="url(#breeze-help-line-68)">│</text><text class="breeze-help-r4" 
x="24.4" y="1679.2" textLength="280.6" 
clip-path="url(#breeze-help-line-68)">doctor&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1679.2" textLength="1110.2" 
clip-path="url(#breeze-help-line-68)">Auto-healing&#160;of&#160;breeze&#160;&#160;&#
 [...]
+</text><text class="breeze-help-r5" x="0" y="1703.6" textLength="1464" 
clip-path="url(#breeze-help-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1703.6" textLength="12.2" 
clip-path="url(#breeze-help-line-69)">
+</text><text class="breeze-help-r5" x="0" y="1728" textLength="24.4" 
clip-path="url(#breeze-help-line-70)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1728" textLength="219.6" 
clip-path="url(#breeze-help-line-70)">&#160;Testing&#160;commands&#160;</text><text
 class="breeze-help-r5" x="244" y="1728" textLength="1195.6" 
clip-path="url(#breeze-help-line-70)">──────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-hel [...]
+</text><text class="breeze-help-r5" x="0" y="1752.4" textLength="12.2" 
clip-path="url(#breeze-help-line-71)">│</text><text class="breeze-help-r4" 
x="24.4" y="1752.4" textLength="183" 
clip-path="url(#breeze-help-line-71)">testing&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="231.8" y="1752.4" textLength="1207.8" 
clip-path="url(#breeze-help-line-71)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;run&#160;tests&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-help-r5" x="0" y="1776.8" textLength="12.2" 
clip-path="url(#breeze-help-line-72)">│</text><text class="breeze-help-r4" 
x="24.4" y="1776.8" textLength="183" 
clip-path="url(#breeze-help-line-72)">k8s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="231.8" y="1776.8" textLength="1207.8" 
clip-path="url(#breeze-help-line-72)">Tools&#160;that&#160;developers&#160;use&#160;to&#160;run&#160;Kubernetes&#160;te
 [...]
+</text><text class="breeze-help-r5" x="0" y="1801.2" textLength="1464" 
clip-path="url(#breeze-help-line-73)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-help-line-73)">
+</text><text class="breeze-help-r5" x="0" y="1825.6" textLength="24.4" 
clip-path="url(#breeze-help-line-74)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1825.6" textLength="195.2" 
clip-path="url(#breeze-help-line-74)">&#160;Image&#160;commands&#160;</text><text
 class="breeze-help-r5" x="219.6" y="1825.6" textLength="1220" 
clip-path="url(#breeze-help-line-74)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
+</text><text class="breeze-help-r5" x="0" y="1850" textLength="12.2" 
clip-path="url(#breeze-help-line-75)">│</text><text class="breeze-help-r4" 
x="24.4" y="1850" textLength="207.4" 
clip-path="url(#breeze-help-line-75)">ci-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="256.2" y="1850" textLength="1183.4" 
clip-path="url(#breeze-help-line-75)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;manually&#160;manage&#160;CI&#160;i
 [...]
+</text><text class="breeze-help-r5" x="0" y="1874.4" textLength="12.2" 
clip-path="url(#breeze-help-line-76)">│</text><text class="breeze-help-r4" 
x="24.4" y="1874.4" textLength="207.4" 
clip-path="url(#breeze-help-line-76)">prod-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="256.2" y="1874.4" textLength="1183.4" 
clip-path="url(#breeze-help-line-76)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;manually&#160;manage&#160;PROD&#160;ima
 [...]
+</text><text class="breeze-help-r5" x="0" y="1898.8" textLength="1464" 
clip-path="url(#breeze-help-line-77)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-help-line-77)">
+</text><text class="breeze-help-r5" x="0" y="1923.2" textLength="24.4" 
clip-path="url(#breeze-help-line-78)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="1923.2" textLength="353.8" 
clip-path="url(#breeze-help-line-78)">&#160;Release&#160;management&#160;commands&#160;</text><text
 class="breeze-help-r5" x="378.2" y="1923.2" textLength="1061.4" 
clip-path="url(#breeze-help-line-78)">───────────────────────────────────────────────────────────────────────────────────────</text><text
 clas [...]
+</text><text class="breeze-help-r5" x="0" y="1947.6" textLength="12.2" 
clip-path="url(#breeze-help-line-79)">│</text><text class="breeze-help-r4" 
x="24.4" y="1947.6" textLength="280.6" 
clip-path="url(#breeze-help-line-79)">release-management&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1947.6" textLength="1110.2" 
clip-path="url(#breeze-help-line-79)">Tools&#160;that&#160;release&#160;managers&#160;can&#160;use&#160;to&#160;prepare&#160;and&#160;manage&#16
 [...]
+</text><text class="breeze-help-r5" x="0" y="1972" textLength="12.2" 
clip-path="url(#breeze-help-line-80)">│</text><text class="breeze-help-r4" 
x="24.4" y="1972" textLength="280.6" 
clip-path="url(#breeze-help-line-80)">sbom&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="329.4" y="1972" textLength="1110.2" 
clip-path="url(#breeze-help-line-80)">Tools&#160;that&#160;release&#160;managers
 [...]
+</text><text class="breeze-help-r5" x="0" y="1996.4" textLength="1464" 
clip-path="url(#breeze-help-line-81)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-help-line-81)">
+</text><text class="breeze-help-r5" x="0" y="2020.8" textLength="24.4" 
clip-path="url(#breeze-help-line-82)">╭─</text><text class="breeze-help-r5" 
x="24.4" y="2020.8" textLength="195.2" 
clip-path="url(#breeze-help-line-82)">&#160;Other&#160;commands&#160;</text><text
 class="breeze-help-r5" x="219.6" y="2020.8" textLength="1220" 
clip-path="url(#breeze-help-line-82)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="bree [...]
+</text><text class="breeze-help-r5" x="0" y="2045.2" textLength="12.2" 
clip-path="url(#breeze-help-line-83)">│</text><text class="breeze-help-r4" 
x="24.4" y="2045.2" textLength="122" 
clip-path="url(#breeze-help-line-83)">setup&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="170.8" y="2045.2" textLength="1268.8" 
clip-path="url(#breeze-help-line-83)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;configure&#160;Breeze&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-help-r5" x="0" y="2069.6" textLength="12.2" 
clip-path="url(#breeze-help-line-84)">│</text><text class="breeze-help-r4" 
x="24.4" y="2069.6" textLength="122" 
clip-path="url(#breeze-help-line-84)">ci&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-help-r1" x="170.8" y="2069.6" textLength="1268.8" 
clip-path="url(#breeze-help-line-84)">Tools&#160;that&#160;CI&#160;workflows&#160;use&#160;to&#160;cleanup/manage&#160;CI&#160;environment&#160;
 [...]
+</text><text class="breeze-help-r5" x="0" y="2094" textLength="1464" 
clip-path="url(#breeze-help-line-85)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-help-r1" x="1464" y="2094" textLength="12.2" 
clip-path="url(#breeze-help-line-85)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_static-checks.svg 
b/dev/breeze/doc/images/output_static-checks.svg
index b2aab5fd8eb..4dd66c187ff 100644
--- a/dev/breeze/doc/images/output_static-checks.svg
+++ b/dev/breeze/doc/images/output_static-checks.svg
@@ -357,9 +357,9 @@
 </text><text class="breeze-static-checks-r5" x="0" y="971.6" textLength="12.2" 
clip-path="url(#breeze-static-checks-line-39)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="971.6" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-39)">codespell&#160;|&#160;compile-fab-assets&#160;|&#160;compile-ui-assets&#160;|&#160;compile-ui-assets-dev&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="971.6" textLength="12.2" 
clip-path [...]
 </text><text class="breeze-static-checks-r5" x="0" y="996" textLength="12.2" 
clip-path="url(#breeze-static-checks-line-40)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="996" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-40)">create-missing-init-py-files-tests&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="996" textLength="12.2" 
clip-path="url(#breeze-st [...]
 </text><text class="breeze-static-checks-r5" x="0" y="1020.4" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1020.4" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-41)">doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;fix-encoding-pragma&#160;|&#160;flynt&#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-static-checks-r5" x="0" y="1044.8" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-42)">generate-airflow-diagrams&#160;|&#160;generate-openapi-spec&#160;|&#160;generate-pypi-readme&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" clip-p 
[...]
-</text><text class="breeze-static-checks-r5" x="0" y="1069.2" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1069.2" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-43)">generate-tasksdk-datamodels&#160;|&#160;generate-volumes-for-sources&#160;|&#160;identity&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1069.2" textLengt [...]
-</text><text class="breeze-static-checks-r5" x="0" y="1093.6" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1093.6" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-44)">insert-license&#160;|&#160;kubeconform&#160;|&#160;lint-chart-schema&#160;|&#160;lint-dockerfile&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="145 [...]
+</text><text class="breeze-static-checks-r5" x="0" y="1044.8" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-42)">generate-airflow-diagrams&#160;|&#160;generate-openapi-spec&#160;|&#160;generate-openapi-spec-fab&#160;|&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-static-c [...]
+</text><text class="breeze-static-checks-r5" x="0" y="1069.2" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1069.2" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-43)">generate-pypi-readme&#160;|&#160;generate-tasksdk-datamodels&#160;|&#160;generate-volumes-for-sources</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-static-checks-line-43)" [...]
+</text><text class="breeze-static-checks-r5" x="0" y="1093.6" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1093.6" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-44)">|&#160;identity&#160;|&#160;insert-license&#160;|&#160;kubeconform&#160;|&#160;lint-chart-schema&#160;|&#160;lint-dockerfile&#160;|</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1093.6" textLength="12.2" 
clip-path="url(# [...]
 </text><text class="breeze-static-checks-r5" x="0" y="1118" textLength="12.2" 
clip-path="url(#breeze-static-checks-line-45)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1118" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-45)">lint-helm-chart&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;mixed-line-ending&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1118" textLength [...]
 </text><text class="breeze-static-checks-r5" x="0" y="1142.4" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1142.4" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-46)">mypy-airflow-core&#160;|&#160;mypy-airflow-ctl&#160;|&#160;mypy-dev&#160;|&#160;mypy-devel-common&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-static-checks-r5" x="1451.8"  [...]
 </text><text class="breeze-static-checks-r5" x="0" y="1166.8" 
textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text 
class="breeze-static-checks-r7" x="451.4" y="1166.8" textLength="988.2" 
clip-path="url(#breeze-static-checks-line-47)">mypy-providers&#160;|&#160;mypy-task-sdk&#160;|&#160;pretty-format-json&#160;|&#160;pylint&#160;|&#160;python-no-log-warn</text><text
 class="breeze-static-checks-r5" x="1451.8" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-sta [...]
diff --git a/dev/breeze/doc/images/output_static-checks.txt 
b/dev/breeze/doc/images/output_static-checks.txt
index 5ba1d4efcba..3f8a96af044 100644
--- a/dev/breeze/doc/images/output_static-checks.txt
+++ b/dev/breeze/doc/images/output_static-checks.txt
@@ -1 +1 @@
-7f396adad6b3df5ee04aeef4fc62f6ad
+f90752bd76c0617a4f6e9eb1d208e4f5
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py 
b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index a62664c814f..acaa592acd5 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -101,6 +101,7 @@ PRE_COMMIT_LIST = [
     "flynt",
     "generate-airflow-diagrams",
     "generate-openapi-spec",
+    "generate-openapi-spec-fab",
     "generate-pypi-readme",
     "generate-tasksdk-datamodels",
     "generate-volumes-for-sources",
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py 
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index ecf4b72d13d..6bdb8cf7450 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -1182,6 +1182,8 @@ class SelectiveChecks:
             # Skip those tests on all "release" branches
             pre_commits_to_skip.update(
                 (
+                    "compile-fab-assets",
+                    "generate-openapi-spec-fab",
                     "check-airflow-provider-compatibility",
                     "check-extra-packages-references",
                     "check-provider-yaml-valid",
diff --git a/dev/breeze/tests/test_selective_checks.py 
b/dev/breeze/tests/test_selective_checks.py
index 11997e9fdfd..2b90a3e2d9e 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -162,7 +162,8 @@ ALL_SKIPPED_COMMITS_IF_NOT_IMPORTANT_FILES_CHANGED = (
 
 All_SKIPPED_COMMITS_IF_NON_MAIN_BRANCH = (
     
"check-airflow-provider-compatibility,check-extra-packages-references,check-provider-yaml-valid,"
-    "identity,lint-helm-chart,mypy-airflow-core,mypy-airflow-ctl,mypy-dev,"
+    "compile-fab-assets,generate-openapi-spec-fab,identity,"
+    "lint-helm-chart,mypy-airflow-core,mypy-airflow-ctl,mypy-dev,"
     "mypy-devel-common,mypy-providers,mypy-task-sdk,validate-operators-init"
 )
 
diff --git a/scripts/ci/pre_commit/update_fastapi_api_spec.py 
b/scripts/ci/pre_commit/generate_openapi_spec.py
similarity index 93%
copy from scripts/ci/pre_commit/update_fastapi_api_spec.py
copy to scripts/ci/pre_commit/generate_openapi_spec.py
index 3d7731c7ef2..1dc3aa6f8c7 100755
--- a/scripts/ci/pre_commit/update_fastapi_api_spec.py
+++ b/scripts/ci/pre_commit/generate_openapi_spec.py
@@ -30,7 +30,7 @@ from common_precommit_utils import (
 initialize_breeze_precommit(__name__, __file__)
 
 cmd_result = run_command_via_breeze_shell(
-    ["python3", 
"/opt/airflow/scripts/in_container/run_update_fastapi_api_spec.py"],
+    ["python3", 
"/opt/airflow/scripts/in_container/run_generate_openapi_spec.py"],
     backend="postgres",
     skip_environment_initialization=False,
 )
diff --git a/scripts/ci/pre_commit/update_fastapi_api_spec.py 
b/scripts/ci/pre_commit/generate_openapi_spec_fab.py
similarity index 93%
copy from scripts/ci/pre_commit/update_fastapi_api_spec.py
copy to scripts/ci/pre_commit/generate_openapi_spec_fab.py
index 3d7731c7ef2..5e087eca8b5 100755
--- a/scripts/ci/pre_commit/update_fastapi_api_spec.py
+++ b/scripts/ci/pre_commit/generate_openapi_spec_fab.py
@@ -30,7 +30,7 @@ from common_precommit_utils import (
 initialize_breeze_precommit(__name__, __file__)
 
 cmd_result = run_command_via_breeze_shell(
-    ["python3", 
"/opt/airflow/scripts/in_container/run_update_fastapi_api_spec.py"],
+    ["python3", 
"/opt/airflow/scripts/in_container/run_generate_openapi_spec_fab.py"],
     backend="postgres",
     skip_environment_initialization=False,
 )
diff --git a/scripts/in_container/in_container_utils.py 
b/scripts/in_container/in_container_utils.py
index ad19e7bfa1a..2de8bd82646 100644
--- a/scripts/in_container/in_container_utils.py
+++ b/scripts/in_container/in_container_utils.py
@@ -18,13 +18,19 @@ from __future__ import annotations
 
 import shlex
 import subprocess
+import sys
 import textwrap
 from contextlib import contextmanager
 from pathlib import Path
+from typing import TYPE_CHECKING
 
 import rich_click as click
 from rich.console import Console
 
+if TYPE_CHECKING:
+    from fastapi import FastAPI
+
+
 click.rich_click.COLOR_SYSTEM = "standard"
 console = Console(width=400, color_system="standard")
 
@@ -56,3 +62,48 @@ def run_command(cmd: list[str], github_actions: bool, 
**kwargs) -> subprocess.Co
         console.print(f"[red]Command failed: {' '.join([shlex.quote(entry) for 
entry in cmd])}[/]")
         console.print("[red]Please unfold the above group and to investigate 
the issue[/]")
     return result
+
+
+def generate_openapi_file(app: FastAPI, file_path: Path, prefix: str = "", 
only_ui: bool = False):
+    import yaml
+    from fastapi.openapi.utils import get_openapi
+    from fastapi.routing import APIRoute
+
+    if only_ui:
+        for route in app.routes:
+            if not isinstance(route, APIRoute):
+                continue
+            route.include_in_schema = route.path.startswith("/ui/")
+
+    with file_path.open("w+") as f:
+        openapi_schema = get_openapi(
+            title=app.title,
+            version=app.version,
+            openapi_version=app.openapi_version,
+            description=app.description,
+            routes=app.routes,
+        )
+        if prefix:
+            openapi_schema["paths"] = {
+                prefix + path: path_dict for path, path_dict in 
openapi_schema["paths"].items()
+            }
+        yaml.dump(
+            openapi_schema,
+            f,
+            default_flow_style=False,
+            sort_keys=False,
+        )
+
+
+def validate_openapi_file(file_path: Path) -> bool:
+    import yaml
+    from openapi_spec_validator import validate_spec
+
+    with file_path.open() as f:
+        openapi_schema = yaml.safe_load(f)
+    try:
+        validate_spec(openapi_schema)
+    except Exception as e:
+        print(f"[ERROR] OpenAPI validation failed for {file_path}: {e}", 
file=sys.stderr)
+        sys.exit(1)
+    return True
diff --git a/scripts/in_container/run_update_fastapi_api_spec.py 
b/scripts/in_container/run_generate_openapi_spec.py
similarity index 50%
rename from scripts/in_container/run_update_fastapi_api_spec.py
rename to scripts/in_container/run_generate_openapi_spec.py
index 1dd692280c4..1caea62e67d 100755
--- a/scripts/in_container/run_update_fastapi_api_spec.py
+++ b/scripts/in_container/run_generate_openapi_spec.py
@@ -17,24 +17,17 @@
 # under the License.
 from __future__ import annotations
 
+import os
 import sys
 from pathlib import Path
-from typing import TYPE_CHECKING
-
-import yaml
-from fastapi.openapi.utils import get_openapi
-from fastapi.routing import APIRoute
-from openapi_spec_validator import validate_spec
 
 from airflow.api_fastapi.app import AUTH_MANAGER_FASTAPI_APP_PREFIX, create_app
 from airflow.api_fastapi.auth.managers.simple import __file__ as 
SIMPLE_AUTH_MANAGER_PATH
 from airflow.api_fastapi.auth.managers.simple.simple_auth_manager import 
SimpleAuthManager
 from airflow.api_fastapi.core_api import __file__ as CORE_API_PATH
-from airflow.providers.fab.auth_manager.api_fastapi import __file__ as 
FAB_AUTH_MANAGER_API_PATH
-from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
 
-if TYPE_CHECKING:
-    from fastapi import FastAPI
+sys.path.insert(0, str(Path(__file__).parent.resolve()))
+from in_container_utils import console, generate_openapi_file, 
validate_openapi_file
 
 OPENAPI_SPEC_FILE = Path(CORE_API_PATH).parent / "openapi" / 
"v1-rest-api-generated.yaml"
 # We need a "combined" spec file to generate the UI code with, but we don't 
want to include this in the repo
@@ -43,68 +36,31 @@ OPENAPI_UI_SPEC_FILE = Path(CORE_API_PATH).parent / 
"openapi" / "_private_ui.yam
 SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE = (
     Path(SIMPLE_AUTH_MANAGER_PATH).parent / "openapi" / 
"v1-simple-auth-manager-generated.yaml"
 )
-FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE = (
-    Path(FAB_AUTH_MANAGER_API_PATH).parent / "openapi" / 
"v1-fab-auth-manager-generated.yaml"
-)
-
-
-def generate_file(app: FastAPI, file_path: Path, prefix: str = "", only_ui: 
bool = False):
-    if only_ui:
-        for route in app.routes:
-            if not isinstance(route, APIRoute):
-                continue
-            route.include_in_schema = route.path.startswith("/ui/")
-
-    with file_path.open("w+") as f:
-        openapi_schema = get_openapi(
-            title=app.title,
-            version=app.version,
-            openapi_version=app.openapi_version,
-            description=app.description,
-            routes=app.routes,
-        )
-        if prefix:
-            openapi_schema["paths"] = {
-                prefix + path: path_dict for path, path_dict in 
openapi_schema["paths"].items()
-            }
-        yaml.dump(
-            openapi_schema,
-            f,
-            default_flow_style=False,
-            sort_keys=False,
-        )
-
-
-def validate_openapi_file(file_path: Path) -> bool:
-    with file_path.open() as f:
-        openapi_schema = yaml.safe_load(f)
-    try:
-        validate_spec(openapi_schema)
-    except Exception as e:
-        print(f"[ERROR] OpenAPI validation failed for {file_path}: {e}", 
file=sys.stderr)
-        sys.exit(1)
-    return True
-
 
 # Generate main application openapi spec
-generate_file(app=create_app(), file_path=OPENAPI_SPEC_FILE)
+# Set the auth manager as SAM. No need to use another one to generate fastapi 
spec
+os.environ["AIRFLOW__CORE__AUTH_MANAGER"] = (
+    
"airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager"
+)
+generate_openapi_file(app=create_app(), file_path=OPENAPI_SPEC_FILE)
 validate_openapi_file(OPENAPI_SPEC_FILE)
 
-generate_file(app=create_app(), file_path=OPENAPI_UI_SPEC_FILE, only_ui=True)
+generate_openapi_file(app=create_app(), file_path=OPENAPI_UI_SPEC_FILE, 
only_ui=True)
 validate_openapi_file(OPENAPI_UI_SPEC_FILE)
 
 # Generate simple auth manager openapi spec
 simple_auth_manager_app = SimpleAuthManager().get_fastapi_app()
 if simple_auth_manager_app:
-    generate_file(
+    generate_openapi_file(
         app=simple_auth_manager_app,
         file_path=SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE,
         prefix=AUTH_MANAGER_FASTAPI_APP_PREFIX,
     )
     validate_openapi_file(SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE)
-
-# Generate FAB auth manager openapi spec
-fab_auth_manager_app = FabAuthManager().get_fastapi_app()
-if fab_auth_manager_app:
-    generate_file(app=fab_auth_manager_app, 
file_path=FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE)
-    validate_openapi_file(FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE)
+    console.print("[green]OpenAPI spec for SimpleAuthManager generated 
successfully.[/]")
+else:
+    console.print(
+        "[red]Failed to generate OpenAPI spec for SimpleAuthManager. "
+        "The app is not available or the generation failed.[/]"
+    )
+    sys.exit(1)
diff --git a/scripts/ci/pre_commit/update_fastapi_api_spec.py 
b/scripts/in_container/run_generate_openapi_spec_fab.py
similarity index 50%
rename from scripts/ci/pre_commit/update_fastapi_api_spec.py
rename to scripts/in_container/run_generate_openapi_spec_fab.py
index 3d7731c7ef2..271b1a593e9 100755
--- a/scripts/ci/pre_commit/update_fastapi_api_spec.py
+++ b/scripts/in_container/run_generate_openapi_spec_fab.py
@@ -20,19 +20,24 @@ from __future__ import annotations
 import sys
 from pathlib import Path
 
-sys.path.insert(0, str(Path(__file__).parent.resolve()))
-from common_precommit_utils import (
-    initialize_breeze_precommit,
-    run_command_via_breeze_shell,
-    validate_cmd_result,
-)
+from airflow.providers.fab.auth_manager.api_fastapi import __file__ as 
FAB_AUTH_MANAGER_API_PATH
+from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager
+from airflow.providers_manager import ProvidersManager
 
-initialize_breeze_precommit(__name__, __file__)
+sys.path.insert(0, str(Path(__file__).parent.resolve()))
+from in_container_utils import console, generate_openapi_file, 
validate_openapi_file
 
-cmd_result = run_command_via_breeze_shell(
-    ["python3", 
"/opt/airflow/scripts/in_container/run_update_fastapi_api_spec.py"],
-    backend="postgres",
-    skip_environment_initialization=False,
+FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE = (
+    Path(FAB_AUTH_MANAGER_API_PATH).parent / "openapi" / 
"v2-fab-auth-manager-generated.yaml"
 )
 
-validate_cmd_result(cmd_result)
+ProvidersManager().initialize_providers_configuration()
+
+# Generate FAB auth manager openapi spec
+fab_auth_manager_app = FabAuthManager().get_fastapi_app()
+if fab_auth_manager_app:
+    generate_openapi_file(app=fab_auth_manager_app, 
file_path=FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE)
+    validate_openapi_file(FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE)
+else:
+    console.print("[red]FAB auth manager app not found. Skipping OpenAPI spec 
generation.[/]")
+    sys.exit(1)

Reply via email to