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

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


The following commit(s) were added to refs/heads/main by this push:
     new fe15f590e0 Add generating recommended actions for projects and 
dependency depth (#41920)
fe15f590e0 is described below

commit fe15f590e0cb564f8f09a5c946152a3cf29ff303
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun Sep 1 01:17:13 2024 +0200

    Add generating recommended actions for projects and dependency depth 
(#41920)
    
    The SBON export dependencies command now supports generating
    recommended actions and dependency depth information. recommended
    actions and dependency depth information.
---
 dev/breeze/doc/images/output-commands.svg          |  42 +-
 .../output_sbom_export-dependency-information.svg  |  54 +-
 .../output_sbom_export-dependency-information.txt  |   2 +-
 .../src/airflow_breeze/commands/sbom_commands.py   |  46 +-
 .../commands/sbom_commands_config.py               |   1 +
 dev/breeze/src/airflow_breeze/utils/cdxgen.py      |  52 +-
 generated/README.md                                |  14 +
 generated/dep_tree.txt                             | 579 +++++++++++++++++++++
 generated/dependency_depth.json                    | 146 ++++++
 scripts/in_container/get_dependency_status.py      |  46 ++
 10 files changed, 926 insertions(+), 56 deletions(-)

diff --git a/dev/breeze/doc/images/output-commands.svg 
b/dev/breeze/doc/images/output-commands.svg
index 1556dfef6f..e5150fbab5 100644
--- a/dev/breeze/doc/images/output-commands.svg
+++ b/dev/breeze/doc/images/output-commands.svg
@@ -301,53 +301,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_sbom_export-dependency-information.svg 
b/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
index 0f525cd60a..e191e88155 100644
--- a/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
+++ b/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 904.0" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -45,7 +45,7 @@
 
     <defs>
     <clipPath id="breeze-sbom-export-dependency-information-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+      <rect x="0" y="0" width="1463.0" height="853.0" />
     </clipPath>
     <clipPath id="breeze-sbom-export-dependency-information-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -146,9 +146,12 @@
 <clipPath id="breeze-sbom-export-dependency-information-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-sbom-export-dependency-information-line-33">
+    <rect x="0" y="806.7" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="877.6" rx="8"/><text 
class="breeze-sbom-export-dependency-information-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;export-dependency-information</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="902" rx="8"/><text 
class="breeze-sbom-export-dependency-information-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;sbom&#160;export-dependency-information</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -170,28 +173,29 @@
 </text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-9)">│</text><text
 class="breeze-sbom-export-dependency-information-r5" x="475.8" y="239.6" 
textLength="732" 
clip-path="url(#breeze-sbom-export-dependency-information-line-9)">[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;&#1
 [...]
 </text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="264" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-10)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="61" y="264" 
textLength="341.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-10)">--include-open-psf-scorecard</text><text
 class="breeze-sbom-export-dependency-information-r7" x="427" y="264" 
textLength="24.4" clip-path="url(#breeze-sbom-e [...]
 </text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="288.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-11)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="61" y="288.4" 
textLength="268.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-11)">--include-github-stats</text><text
 class="breeze-sbom-export-dependency-information-r7" x="427" y="288.4" 
textLength="24.4" clip-path="url(#breeze-sbom-e [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="312.8" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="337.2" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="337.2" 
textLength="134.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">&#160;CSV&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="158.6" y="337.2" 
textLength="1281" clip-path="url(#bree [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="361.6" 
textLength="122" 
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">--csv-file</text><text
 class="breeze-sbom-export-dependency-information-r7" x="170.8" y="361.6" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depe [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="386" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="386" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="410.4" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="410.4" 
textLength="231.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">&#160;Github&#160;auth&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="256.2" y="410.4" 
textLength="1183.4" clip- [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="434.8" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">--github-token</text><text
 class="breeze-sbom-export-dependency-information-r1" x="244" y="434.8" 
textLength="500.2" clip-path="url(#breeze-sbom-export [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="459.2" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="483.6" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="483.6" 
textLength="317.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">&#160;Google&#160;spreadsheet&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="341.6" y="483.6" 
textLength="1098"  [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="508" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="508" 
textLength="280.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">--json-credentials-file</text><text
 class="breeze-sbom-export-dependency-information-r1" x="378.2" y="508" 
textLength="915" clip-path="url(#breeze-sbom-exp [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="532.4" 
textLength="280.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">--google-spreadsheet-id</text><text
 class="breeze-sbom-export-dependency-information-r7" x="329.4" y="532.4" 
textLength="24.4" clip-path="url(#breeze-s [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="556.8" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="581.2" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="581.2" 
textLength="207.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">&#160;Debugging&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="231.8" y="581.2" 
textLength="1207.8" clip-path="u [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="605.6" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="605.6" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">--limit-output</text><text
 class="breeze-sbom-export-dependency-information-r7" x="219.6" y="605.6" 
textLength="24.4" clip-path="url(#breeze-sbom-expor [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">│</text><text
 class="breeze-sbom-export-dependency-information-r1" x="268.4" y="630" 
textLength="1171.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">to&#160;output&#160;all&#160;dependencies,&#160;do&#160;not&#160;specify&#160;this&#160;option.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">│</text><text
 class="breeze-sbom-export-dependency-information-r8" x="268.4" y="654.4" 
textLength="1171.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">(INTEGER)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="678.8" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">--project-name</text><text
 class="breeze-sbom-export-dependency-information-r1" x="268.4" y="678.8" 
textLength="1012.6" clip-path="url(#breeze-sbom-exp [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="703.2" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="727.6" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="727.6" 
textLength="195.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="219.6" y="727.6" 
textLength="1220" clip-path="url( [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="752" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="752" 
textLength="109.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">--dry-run</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="752" 
textLength="24.4" clip-path="url(#breeze-sbom-export-dependenc [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="776.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="776.4" 
textLength="97.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">--answer</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="776.4" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depen [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="800.8" 
textLength="73.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">--help</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="800.8" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depende [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="825.2" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="312.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="61" y="312.8" 
textLength="207.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">--include-actions</text><text
 class="breeze-sbom-export-dependency-information-r1" x="475.8" y="312.8" 
textLength="524.6" clip-path="url(#breeze-sbom-exp [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="337.2" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="361.6" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="361.6" 
textLength="134.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">&#160;CSV&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="158.6" y="361.6" 
textLength="1281" clip-path="url(#bree [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="386" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="386" 
textLength="122" 
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">--csv-file</text><text
 class="breeze-sbom-export-dependency-information-r7" x="170.8" y="386" 
textLength="24.4" clip-path="url(#breeze-sbom-export-dependency [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="410.4" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="434.8" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="434.8" 
textLength="231.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">&#160;Github&#160;auth&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="256.2" y="434.8" 
textLength="1183.4" clip- [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="459.2" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">--github-token</text><text
 class="breeze-sbom-export-dependency-information-r1" x="244" y="459.2" 
textLength="500.2" clip-path="url(#breeze-sbom-export [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="483.6" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="508" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="508" 
textLength="317.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">&#160;Google&#160;spreadsheet&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="341.6" y="508" 
textLength="1098" clip-p [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="532.4" 
textLength="280.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">--json-credentials-file</text><text
 class="breeze-sbom-export-dependency-information-r1" x="378.2" y="532.4" 
textLength="915" clip-path="url(#breeze-sb [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="556.8" 
textLength="280.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">--google-spreadsheet-id</text><text
 class="breeze-sbom-export-dependency-information-r7" x="329.4" y="556.8" 
textLength="24.4" clip-path="url(#breeze-s [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="581.2" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="605.6" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="605.6" 
textLength="207.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">&#160;Debugging&#160;flags&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="231.8" y="605.6" 
textLength="1207.8" clip-path="u [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="630" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="630" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">--limit-output</text><text
 class="breeze-sbom-export-dependency-information-r7" x="219.6" y="630" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depe [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="654.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">│</text><text
 class="breeze-sbom-export-dependency-information-r1" x="268.4" y="654.4" 
textLength="1171.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">to&#160;output&#160;all&#160;dependencies,&#160;do&#160;not&#160;specify&#160;this&#160;option.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="678.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">│</text><text
 class="breeze-sbom-export-dependency-information-r8" x="268.4" y="678.8" 
textLength="1171.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">(INTEGER)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="703.2" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="703.2" 
textLength="170.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">--project-name</text><text
 class="breeze-sbom-export-dependency-information-r1" x="268.4" y="703.2" 
textLength="1012.6" clip-path="url(#breeze-sbom-exp [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="727.6" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="752" textLength="24.4" 
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">╭─</text><text
 class="breeze-sbom-export-dependency-information-r5" x="24.4" y="752" 
textLength="195.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">&#160;Common&#160;options&#160;</text><text
 class="breeze-sbom-export-dependency-information-r5" x="219.6" y="752" 
textLength="1220" clip-path="url(#breez [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="776.4" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="776.4" 
textLength="109.8" 
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">--dry-run</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="776.4" 
textLength="24.4" clip-path="url(#breeze-sbom-export-dep [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="800.8" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="800.8" 
textLength="97.6" 
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">--answer</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="800.8" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depen [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="825.2" textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">│</text><text
 class="breeze-sbom-export-dependency-information-r4" x="24.4" y="825.2" 
textLength="73.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">--help</text><text
 class="breeze-sbom-export-dependency-information-r7" x="158.6" y="825.2" 
textLength="24.4" clip-path="url(#breeze-sbom-export-depende [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0" 
y="849.6" textLength="1464" 
clip-path="url(#breeze-sbom-export-dependency-information-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-sbom-export-dependency-information-r1" x="1464" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-sbom-export-dependency-information-line-34)">
 </text>
     </g>
     </g>
diff --git 
a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt 
b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
index 0097771912..af7e5bcc29 100644
--- a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
+++ b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
@@ -1 +1 @@
-04ba24ba16920575bec41722d612f0a4
+b66a78c14ba8a90c256d630d5246fc5d
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index db17120fda..1cc9a21c23 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -72,7 +72,11 @@ from airflow_breeze.utils.parallel import (
     check_async_run_results,
     run_with_pool,
 )
-from airflow_breeze.utils.path_utils import FILES_SBOM_DIR, 
PROVIDER_METADATA_JSON_FILE_PATH
+from airflow_breeze.utils.path_utils import (
+    AIRFLOW_SOURCES_ROOT,
+    FILES_SBOM_DIR,
+    PROVIDER_METADATA_JSON_FILE_PATH,
+)
 from airflow_breeze.utils.recording import generating_command_images
 from airflow_breeze.utils.shared_options import get_dry_run
 
@@ -662,7 +666,7 @@ def generate_providers_requirements(
 @option_github_token
 @click.option(
     "--json-credentials-file",
-    type=click.Path(file_okay=True, dir_okay=False, path_type=Path, 
writable=False),
+    type=click.Path(file_okay=True, dir_okay=False, path_type=Path, 
writable=False, exists=False),
     help="Gsheet JSON credentials file (defaults to 
~/.config/gsheet/credentials.json",
     envvar="JSON_CREDENTIALS_FILE",
     default=Path.home() / ".config" / "gsheet" / "credentials.json"
@@ -684,6 +688,12 @@ def generate_providers_requirements(
     is_flag=True,
     default=False,
 )
[email protected](
+    "--include-actions",
+    help="Include Actions recommended for the project",
+    is_flag=True,
+    default=False,
+)
 @click.option(
     "-l",
     "--limit-output",
@@ -709,6 +719,7 @@ def export_dependency_information(
     json_credentials_file: Path,
     include_open_psf_scorecard: bool,
     include_github_stats: bool,
+    include_actions: bool,
     limit_output: int | None,
     project_name: str | None,
 ):
@@ -721,7 +732,14 @@ def export_dependency_information(
     if google_spreadsheet_id and not json_credentials_file.exists():
         get_console().print(
             f"[error]The JSON credentials file {json_credentials_file} does 
not exist. "
-            "Please specify a valid path to the JSON credentials file."
+            "Please specify a valid path to the JSON credentials file.[/]\n"
+            "You can download credentials file from your google developer 
console:"
+            "https://console.cloud.google.com/apis/credentials after creating 
a Desktop Client ID."
+        )
+        sys.exit(1)
+    if include_actions and not include_open_psf_scorecard:
+        get_console().print(
+            "[error]You cannot specify --include-actions without 
--include-open-psf-scorecard"
         )
         sys.exit(1)
     import requests
@@ -744,13 +762,18 @@ def export_dependency_information(
         full_sbom=full_sbom,
         include_open_psf_scorecard=include_open_psf_scorecard,
         include_github_stats=include_github_stats,
+        include_actions=include_actions,
         limit_output=limit_output,
         github_token=github_token,
         project_name=project_name,
     )
     all_dependency_value_dicts = sorted(all_dependency_value_dicts, 
key=sort_deps_key)
 
-    fieldnames = get_field_names(include_open_psf_scorecard, 
include_github_stats)
+    fieldnames = get_field_names(
+        include_open_psf_scorecard=include_open_psf_scorecard,
+        include_github_stats=include_github_stats,
+        include_actions=include_actions,
+    )
 
     if csv_file:
         write_to_csv_file(
@@ -762,6 +785,7 @@ def export_dependency_information(
             json_credentials_file=json_credentials_file,
             all_dependencies=all_dependency_value_dicts,
             fieldnames=fieldnames,
+            include_opsf_scorecard=include_open_psf_scorecard,
         )
 
 
@@ -801,6 +825,7 @@ def write_to_google_spreadsheet(
     json_credentials_file: Path,
     all_dependencies: list[dict[str, Any]],
     fieldnames: list[str],
+    include_opsf_scorecard: bool = False,
 ):
     token_path = Path.home() / ".config" / "gsheet" / "token.json"
 
@@ -814,7 +839,8 @@ def write_to_google_spreadsheet(
     ]
 
     num_rows = update_field_values(all_dependencies, cell_field_names, 
google_spreadsheet_id, sheet)
-    update_opsf_detailed_comments(all_dependencies, fieldnames, num_rows, 
google_spreadsheet_id, sheet)
+    if include_opsf_scorecard:
+        update_opsf_detailed_comments(all_dependencies, fieldnames, num_rows, 
google_spreadsheet_id, sheet)
 
 
 def update_opsf_detailed_comments(
@@ -935,6 +961,7 @@ def convert_all_sbom_to_value_dictionaries(
     full_sbom: dict[str, Any],
     include_open_psf_scorecard: bool,
     include_github_stats: bool,
+    include_actions: bool,
     limit_output: int | None,
     github_token: str | None = None,
     project_name: str | None = None,
@@ -943,6 +970,11 @@ def convert_all_sbom_to_value_dictionaries(
     dev_deps = set(normalize_package_name(name) for name in 
DEVEL_DEPS_PATH.read_text().splitlines())
     num_deps = 0
     all_dependency_value_dicts = []
+    dependency_depth: dict[str, int] = json.loads(
+        (AIRFLOW_SOURCES_ROOT / "generated" / 
"dependency_depth.json").read_text()
+    )
+    for key, value in dependency_depth.items():
+        dependency_depth[normalize_package_name(key)] = value
     for dependency in core_sbom["components"]:
         normalized_name = normalize_package_name(dependency["name"])
         if project_name and normalized_name != project_name:
@@ -951,10 +983,12 @@ def convert_all_sbom_to_value_dictionaries(
         is_devel = normalized_name in dev_deps
         value_dict = convert_sbom_entry_to_dict(
             dependency,
+            dependency_depth=dependency_depth,
             is_core=True,
             is_devel=is_devel,
             include_open_psf_scorecard=include_open_psf_scorecard,
             include_github_stats=include_github_stats,
+            include_actions=include_actions,
             github_token=github_token,
         )
         if value_dict:
@@ -970,10 +1004,12 @@ def convert_all_sbom_to_value_dictionaries(
             is_devel = normalized_name in dev_deps
             value_dict = convert_sbom_entry_to_dict(
                 dependency,
+                dependency_depth=dependency_depth,
                 is_core=False,
                 is_devel=is_devel,
                 include_open_psf_scorecard=include_open_psf_scorecard,
                 include_github_stats=include_github_stats,
+                include_actions=include_actions,
                 github_token=github_token,
             )
             if value_dict:
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index bb0936b99b..0e1b6d5fb8 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -100,6 +100,7 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str | 
list[str]]]] = {
                 "--python",
                 "--include-open-psf-scorecard",
                 "--include-github-stats",
+                "--include-actions",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py 
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index 00256f8f10..06476df396 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -638,6 +638,8 @@ RELATIONSHIP_PROJECT = [
     "universal-pathlib",
 ]
 
+CONTACTED_PROJECTS: list[str] = []
+
 
 def get_github_stats(vcs: str, project_name: str, github_token: str | None) -> 
dict[str, Any]:
     import requests
@@ -725,12 +727,23 @@ def get_governance(vcs: str | None):
     return "Loose community/ Single Person"
 
 
+ACTIONS: dict[str, tuple[int, str]] = {
+    "Security-Policy": (9, "Add Security Policy to the repository"),
+    "Vulnerabilities": (10, "Follow up with vulnerabilities"),
+    "Packaging": (10, "Propose Trusted Publishing"),
+    "Dangerous-Workflow": (10, "Follow up with dangerous workflow"),
+    "Code-Review": (7, "Propose mandatory code review"),
+}
+
+
 def convert_sbom_entry_to_dict(
     dependency: dict[str, Any],
+    dependency_depth: dict[str, int],
     is_core: bool,
     is_devel: bool,
     include_open_psf_scorecard: bool,
     include_github_stats: bool,
+    include_actions: bool,
     github_token: str | None,
 ) -> dict[str, Any] | None:
     """
@@ -745,13 +758,15 @@ def convert_sbom_entry_to_dict(
     name = dependency.get("name", "")
     if name.startswith("apache-airflow"):
         return None
+    normalized_name = normalize_package_name(dependency.get("name", ""))
     row = {
-        "Name": normalize_package_name(dependency.get("name", "")),
+        "Name": normalized_name,
         "Author": dependency.get("author", ""),
         "Version": dependency.get("version", ""),
         "Description": dependency.get("description"),
         "Core": is_core,
         "Devel": is_devel,
+        "Depth": dependency_depth.get(normalized_name, "Extra"),
         "Licenses": convert_licenses(dependency.get("licenses", [])),
         "Purl": dependency.get("purl"),
         "Pypi": get_pypi_link(dependency),
@@ -766,11 +781,35 @@ def convert_sbom_entry_to_dict(
         row.update(github_stats)
     if name in RELATIONSHIP_PROJECT:
         row["Relationship"] = "Yes"
+    if include_actions:
+        if name in CONTACTED_PROJECTS:
+            row["Contacted"] = "Yes"
+        num_actions = 0
+        for action, (threshold, action_text) in ACTIONS.items():
+            opsf_action = "OPSF-" + action
+            if opsf_action in row and int(row[opsf_action]) < threshold:
+                row[action_text] = "Yes"
+                num_actions += 1
+        row["Num Actions"] = num_actions
     return row
 
 
-def get_field_names(include_open_psf_scorecard: bool, include_github_stats: 
bool) -> list[str]:
-    names = ["Name", "Author", "Version", "Description", "Core", "Devel", 
"Licenses", "Purl", "Pypi", "Vcs"]
+def get_field_names(
+    include_open_psf_scorecard: bool, include_github_stats: bool, 
include_actions: bool
+) -> list[str]:
+    names = [
+        "Name",
+        "Author",
+        "Version",
+        "Description",
+        "Core",
+        "Devel",
+        "Depth",
+        "Licenses",
+        "Purl",
+        "Pypi",
+        "Vcs",
+    ]
     if include_open_psf_scorecard:
         names.append("OPSF-Score")
         for check in OPEN_PSF_CHECKS:
@@ -781,7 +820,12 @@ def get_field_names(include_open_psf_scorecard: bool, 
include_github_stats: bool
         names.extend(["Lifecycle status", "Unpatched Vulns"])
     if include_github_stats:
         names.append("Industry importance")
-    names.append("Relationship")
+    if include_actions:
+        names.append("Relationship")
+        names.append("Contacted")
+        for action in ACTIONS.values():
+            names.append(action[1])
+        names.append("Num Actions")
     return names
 
 
diff --git a/generated/README.md b/generated/README.md
index 6544ce34d2..a52ac1934d 100644
--- a/generated/README.md
+++ b/generated/README.md
@@ -39,3 +39,17 @@ You can read more about pre-commit hooks 
[here](../contributing-docs/08_static_c
 
 * `devel_deps.txt` is a file containing development-only dependencies of 
Airflow. They were generated
   for Airflow 2.9.3 by running `./dev/get_devel_deps.sh` script.
+
+* `dep_tree.txt` is a file containing the dependency tree of Airflow. It was 
generated for Airflow 2.9.3
+  by running this inside breeze:
+
+```bash
+uv tree --no-dedupe  > /opt/airflow/generated/dep_tree.txt
+```
+
+* `dependency_depth.json` is a fie containing the dependency depth of Airflow. 
It was generated for Airflow 2.9.3
+  by running this inside breeze:
+
+```bash
+cat /opt/airflow/generated/dep_tree.txt | python 
/opt/airflow/scripts/in_container/get_dependency_status.py 
>/opt/airflow/generated/dependency_depth.json
+```
diff --git a/generated/dep_tree.txt b/generated/dep_tree.txt
new file mode 100644
index 0000000000..a2c2f59f5b
--- /dev/null
+++ b/generated/dep_tree.txt
@@ -0,0 +1,579 @@
+apache-airflow v3.0.0.dev0
+├── aiohttp v3.10.5
+│   ├── aiohappyeyeballs v2.4.0
+│   ├── aiosignal v1.3.1
+│   │   └── frozenlist v1.4.1
+│   ├── async-timeout v4.0.3
+│   ├── attrs v24.2.0
+│   ├── frozenlist v1.4.1
+│   ├── multidict v6.0.5
+│   └── yarl v1.9.6
+│       ├── idna v3.8
+│       └── multidict v6.0.5
+├── alembic v1.13.2
+│   ├── importlib-metadata v8.4.0
+│   │   └── zipp v3.20.1
+│   ├── importlib-resources v6.4.4
+│   │   └── zipp v3.20.1
+│   ├── mako v1.3.5
+│   │   └── markupsafe v2.1.5
+│   ├── sqlalchemy v1.4.53
+│   │   └── greenlet v3.0.3
+│   └── typing-extensions v4.12.2
+├── argcomplete v3.5.0
+├── asgiref v3.8.1
+│   └── typing-extensions v4.12.2
+├── attrs v24.2.0
+├── blinker v1.8.2
+├── colorlog v6.8.2
+├── configupdater v3.2
+├── connexion[flask] v2.14.2
+│   ├── clickclick v20.10.2
+│   │   ├── click v8.1.7
+│   │   └── pyyaml v6.0.2
+│   ├── flask v2.2.5
+│   │   ├── click v8.1.7
+│   │   ├── importlib-metadata v8.4.0
+│   │   │   └── zipp v3.20.1
+│   │   ├── itsdangerous v2.2.0
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   ├── inflection v0.5.1
+│   ├── itsdangerous v2.2.0
+│   ├── jsonschema v4.23.0
+│   │   ├── attrs v24.2.0
+│   │   ├── importlib-resources v6.4.4
+│   │   │   └── zipp v3.20.1
+│   │   ├── jsonschema-specifications v2023.12.1
+│   │   │   ├── importlib-resources v6.4.4
+│   │   │   │   └── zipp v3.20.1
+│   │   │   └── referencing v0.35.1
+│   │   │       ├── attrs v24.2.0
+│   │   │       └── rpds-py v0.20.0
+│   │   ├── pkgutil-resolve-name v1.3.10
+│   │   ├── referencing v0.35.1
+│   │   │   ├── attrs v24.2.0
+│   │   │   └── rpds-py v0.20.0
+│   │   └── rpds-py v0.20.0
+│   ├── packaging v24.1
+│   ├── pyyaml v6.0.2
+│   ├── requests v2.32.3
+│   │   ├── certifi v2024.8.30
+│   │   ├── charset-normalizer v3.3.2
+│   │   ├── idna v3.8
+│   │   └── urllib3 v2.2.2
+│   ├── werkzeug v2.2.3
+│   │   └── markupsafe v2.1.5
+│   ├── flask v2.2.5 (extra: flask)
+│   │   ├── click v8.1.7
+│   │   ├── importlib-metadata v8.4.0
+│   │   │   └── zipp v3.20.1
+│   │   ├── itsdangerous v2.2.0
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   └── itsdangerous v2.2.0 (extra: flask)
+├── cron-descriptor v1.4.5
+├── croniter v3.0.3
+│   ├── python-dateutil v2.9.0.post0
+│   │   └── six v1.16.0
+│   └── pytz v2024.1
+├── cryptography v43.0.0
+│   └── cffi v1.17.0
+│       └── pycparser v2.22
+├── deprecated v1.2.14
+│   └── wrapt v1.16.0
+├── dill v0.3.8
+├── fastapi[standard] v0.112.2
+│   ├── pydantic v2.8.2
+│   │   ├── annotated-types v0.7.0
+│   │   │   └── typing-extensions v4.12.2
+│   │   ├── pydantic-core v2.20.1
+│   │   │   └── typing-extensions v4.12.2
+│   │   └── typing-extensions v4.12.2
+│   ├── starlette v0.38.2
+│   │   ├── anyio v4.4.0
+│   │   │   ├── exceptiongroup v1.2.2
+│   │   │   ├── idna v3.8
+│   │   │   ├── sniffio v1.3.1
+│   │   │   └── typing-extensions v4.12.2
+│   │   └── typing-extensions v4.12.2
+│   ├── typing-extensions v4.12.2
+│   ├── email-validator v2.2.0 (extra: standard)
+│   │   ├── dnspython v2.6.1
+│   │   └── idna v3.8
+│   ├── fastapi-cli[standard] v0.0.5 (extra: standard)
+│   │   ├── typer v0.12.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── rich v13.8.0
+│   │   │   │   ├── markdown-it-py v3.0.0
+│   │   │   │   │   └── mdurl v0.1.2
+│   │   │   │   ├── pygments v2.18.0
+│   │   │   │   └── typing-extensions v4.12.2
+│   │   │   ├── shellingham v1.5.4
+│   │   │   └── typing-extensions v4.12.2
+│   │   ├── uvicorn[standard] v0.30.6
+│   │   │   ├── click v8.1.7
+│   │   │   ├── h11 v0.14.0
+│   │   │   ├── typing-extensions v4.12.2
+│   │   │   ├── httptools v0.6.1 (extra: standard)
+│   │   │   ├── python-dotenv v1.0.1 (extra: standard)
+│   │   │   ├── pyyaml v6.0.2 (extra: standard)
+│   │   │   ├── uvloop v0.20.0 (extra: standard)
+│   │   │   ├── watchfiles v0.24.0 (extra: standard)
+│   │   │   │   └── anyio v4.4.0
+│   │   │   │       ├── exceptiongroup v1.2.2
+│   │   │   │       ├── idna v3.8
+│   │   │   │       ├── sniffio v1.3.1
+│   │   │   │       └── typing-extensions v4.12.2
+│   │   │   └── websockets v13.0.1 (extra: standard)
+│   │   └── uvicorn[standard] v0.30.6 (extra: standard)
+│   │       ├── click v8.1.7
+│   │       ├── h11 v0.14.0
+│   │       ├── typing-extensions v4.12.2
+│   │       ├── httptools v0.6.1 (extra: standard)
+│   │       ├── python-dotenv v1.0.1 (extra: standard)
+│   │       ├── pyyaml v6.0.2 (extra: standard)
+│   │       ├── uvloop v0.20.0 (extra: standard)
+│   │       ├── watchfiles v0.24.0 (extra: standard)
+│   │       │   └── anyio v4.4.0
+│   │       │       ├── exceptiongroup v1.2.2
+│   │       │       ├── idna v3.8
+│   │       │       ├── sniffio v1.3.1
+│   │       │       └── typing-extensions v4.12.2
+│   │       └── websockets v13.0.1 (extra: standard)
+│   ├── httpx v0.27.2 (extra: standard)
+│   │   ├── anyio v4.4.0
+│   │   │   ├── exceptiongroup v1.2.2
+│   │   │   ├── idna v3.8
+│   │   │   ├── sniffio v1.3.1
+│   │   │   └── typing-extensions v4.12.2
+│   │   ├── certifi v2024.8.30
+│   │   ├── httpcore v1.0.5
+│   │   │   ├── certifi v2024.8.30
+│   │   │   └── h11 v0.14.0
+│   │   ├── idna v3.8
+│   │   └── sniffio v1.3.1
+│   ├── jinja2 v3.1.4 (extra: standard)
+│   │   └── markupsafe v2.1.5
+│   ├── python-multipart v0.0.9 (extra: standard)
+│   └── uvicorn[standard] v0.30.6 (extra: standard)
+│       ├── click v8.1.7
+│       ├── h11 v0.14.0
+│       ├── typing-extensions v4.12.2
+│       ├── httptools v0.6.1 (extra: standard)
+│       ├── python-dotenv v1.0.1 (extra: standard)
+│       ├── pyyaml v6.0.2 (extra: standard)
+│       ├── uvloop v0.20.0 (extra: standard)
+│       ├── watchfiles v0.24.0 (extra: standard)
+│       │   └── anyio v4.4.0
+│       │       ├── exceptiongroup v1.2.2
+│       │       ├── idna v3.8
+│       │       ├── sniffio v1.3.1
+│       │       └── typing-extensions v4.12.2
+│       └── websockets v13.0.1 (extra: standard)
+├── flask v2.2.5
+│   ├── click v8.1.7
+│   ├── importlib-metadata v8.4.0
+│   │   └── zipp v3.20.1
+│   ├── itsdangerous v2.2.0
+│   ├── jinja2 v3.1.4
+│   │   └── markupsafe v2.1.5
+│   └── werkzeug v2.2.3
+│       └── markupsafe v2.1.5
+├── flask-appbuilder v4.5.0
+│   ├── apispec[yaml] v6.6.1
+│   │   ├── packaging v24.1
+│   │   └── pyyaml v6.0.2 (extra: yaml)
+│   ├── click v8.1.7
+│   ├── colorama v0.4.6
+│   ├── email-validator v2.2.0
+│   │   ├── dnspython v2.6.1
+│   │   └── idna v3.8
+│   ├── flask v2.2.5
+│   │   ├── click v8.1.7
+│   │   ├── importlib-metadata v8.4.0
+│   │   │   └── zipp v3.20.1
+│   │   ├── itsdangerous v2.2.0
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   ├── flask-babel v2.0.0
+│   │   ├── babel v2.16.0
+│   │   │   └── pytz v2024.1
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── pytz v2024.1
+│   ├── flask-jwt-extended v4.6.0
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   ├── pyjwt v2.9.0
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   ├── flask-limiter v3.8.0
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   ├── limits v3.13.0
+│   │   │   ├── deprecated v1.2.14
+│   │   │   │   └── wrapt v1.16.0
+│   │   │   ├── importlib-resources v6.4.4
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── packaging v24.1
+│   │   │   └── typing-extensions v4.12.2
+│   │   ├── ordered-set v4.1.0
+│   │   ├── rich v13.8.0
+│   │   │   ├── markdown-it-py v3.0.0
+│   │   │   │   └── mdurl v0.1.2
+│   │   │   ├── pygments v2.18.0
+│   │   │   └── typing-extensions v4.12.2
+│   │   └── typing-extensions v4.12.2
+│   ├── flask-login v0.6.3
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   ├── flask-sqlalchemy v2.5.1
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   └── sqlalchemy v1.4.53
+│   │       └── greenlet v3.0.3
+│   ├── flask-wtf v1.2.1
+│   │   ├── flask v2.2.5
+│   │   │   ├── click v8.1.7
+│   │   │   ├── importlib-metadata v8.4.0
+│   │   │   │   └── zipp v3.20.1
+│   │   │   ├── itsdangerous v2.2.0
+│   │   │   ├── jinja2 v3.1.4
+│   │   │   │   └── markupsafe v2.1.5
+│   │   │   └── werkzeug v2.2.3
+│   │   │       └── markupsafe v2.1.5
+│   │   ├── itsdangerous v2.2.0
+│   │   └── wtforms v3.1.2
+│   │       └── markupsafe v2.1.5
+│   ├── jsonschema v4.23.0
+│   │   ├── attrs v24.2.0
+│   │   ├── importlib-resources v6.4.4
+│   │   │   └── zipp v3.20.1
+│   │   ├── jsonschema-specifications v2023.12.1
+│   │   │   ├── importlib-resources v6.4.4
+│   │   │   │   └── zipp v3.20.1
+│   │   │   └── referencing v0.35.1
+│   │   │       ├── attrs v24.2.0
+│   │   │       └── rpds-py v0.20.0
+│   │   ├── pkgutil-resolve-name v1.3.10
+│   │   ├── referencing v0.35.1
+│   │   │   ├── attrs v24.2.0
+│   │   │   └── rpds-py v0.20.0
+│   │   └── rpds-py v0.20.0
+│   ├── marshmallow v3.22.0
+│   │   └── packaging v24.1
+│   ├── marshmallow-sqlalchemy v0.28.2
+│   │   ├── marshmallow v3.22.0
+│   │   │   └── packaging v24.1
+│   │   ├── packaging v24.1
+│   │   └── sqlalchemy v1.4.53
+│   │       └── greenlet v3.0.3
+│   ├── prison v0.2.1
+│   │   └── six v1.16.0
+│   ├── pyjwt v2.9.0
+│   ├── python-dateutil v2.9.0.post0
+│   │   └── six v1.16.0
+│   ├── sqlalchemy v1.4.53
+│   │   └── greenlet v3.0.3
+│   ├── sqlalchemy-utils v0.41.2
+│   │   └── sqlalchemy v1.4.53
+│   │       └── greenlet v3.0.3
+│   ├── werkzeug v2.2.3
+│   │   └── markupsafe v2.1.5
+│   └── wtforms v3.1.2
+│       └── markupsafe v2.1.5
+├── flask-caching v2.3.0
+│   ├── cachelib v0.9.0
+│   └── flask v2.2.5
+│       ├── click v8.1.7
+│       ├── importlib-metadata v8.4.0
+│       │   └── zipp v3.20.1
+│       ├── itsdangerous v2.2.0
+│       ├── jinja2 v3.1.4
+│       │   └── markupsafe v2.1.5
+│       └── werkzeug v2.2.3
+│           └── markupsafe v2.1.5
+├── flask-login v0.6.3
+│   ├── flask v2.2.5
+│   │   ├── click v8.1.7
+│   │   ├── importlib-metadata v8.4.0
+│   │   │   └── zipp v3.20.1
+│   │   ├── itsdangerous v2.2.0
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   └── werkzeug v2.2.3
+│       └── markupsafe v2.1.5
+├── flask-session v0.5.0
+│   ├── cachelib v0.9.0
+│   └── flask v2.2.5
+│       ├── click v8.1.7
+│       ├── importlib-metadata v8.4.0
+│       │   └── zipp v3.20.1
+│       ├── itsdangerous v2.2.0
+│       ├── jinja2 v3.1.4
+│       │   └── markupsafe v2.1.5
+│       └── werkzeug v2.2.3
+│           └── markupsafe v2.1.5
+├── flask-wtf v1.2.1
+│   ├── flask v2.2.5
+│   │   ├── click v8.1.7
+│   │   ├── importlib-metadata v8.4.0
+│   │   │   └── zipp v3.20.1
+│   │   ├── itsdangerous v2.2.0
+│   │   ├── jinja2 v3.1.4
+│   │   │   └── markupsafe v2.1.5
+│   │   └── werkzeug v2.2.3
+│   │       └── markupsafe v2.1.5
+│   ├── itsdangerous v2.2.0
+│   └── wtforms v3.1.2
+│       └── markupsafe v2.1.5
+├── fsspec v2024.6.1
+├── google-re2 v1.1.20240702
+├── gunicorn v23.0.0
+│   └── packaging v24.1
+├── httpx v0.27.2
+│   ├── anyio v4.4.0
+│   │   ├── exceptiongroup v1.2.2
+│   │   ├── idna v3.8
+│   │   ├── sniffio v1.3.1
+│   │   └── typing-extensions v4.12.2
+│   ├── certifi v2024.8.30
+│   ├── httpcore v1.0.5
+│   │   ├── certifi v2024.8.30
+│   │   └── h11 v0.14.0
+│   ├── idna v3.8
+│   └── sniffio v1.3.1
+├── importlib-metadata v8.4.0
+│   └── zipp v3.20.1
+├── importlib-resources v6.4.4
+│   └── zipp v3.20.1
+├── itsdangerous v2.2.0
+├── jinja2 v3.1.4
+│   └── markupsafe v2.1.5
+├── jmespath v1.0.1
+├── jsonschema v4.23.0
+│   ├── attrs v24.2.0
+│   ├── importlib-resources v6.4.4
+│   │   └── zipp v3.20.1
+│   ├── jsonschema-specifications v2023.12.1
+│   │   ├── importlib-resources v6.4.4
+│   │   │   └── zipp v3.20.1
+│   │   └── referencing v0.35.1
+│   │       ├── attrs v24.2.0
+│   │       └── rpds-py v0.20.0
+│   ├── pkgutil-resolve-name v1.3.10
+│   ├── referencing v0.35.1
+│   │   ├── attrs v24.2.0
+│   │   └── rpds-py v0.20.0
+│   └── rpds-py v0.20.0
+├── lazy-object-proxy v1.10.0
+├── linkify-it-py v2.0.3
+│   └── uc-micro-py v1.0.3
+├── lockfile v0.12.2
+├── markdown-it-py v3.0.0
+│   └── mdurl v0.1.2
+├── markupsafe v2.1.5
+├── marshmallow-oneofschema v3.1.1
+│   └── marshmallow v3.22.0
+│       └── packaging v24.1
+├── mdit-py-plugins v0.4.1
+│   └── markdown-it-py v3.0.0
+│       └── mdurl v0.1.2
+├── methodtools v0.4.7
+│   └── wirerope v0.4.7
+│       └── six v1.16.0
+├── more-itertools v10.4.0
+├── opentelemetry-api v1.27.0
+│   ├── deprecated v1.2.14
+│   │   └── wrapt v1.16.0
+│   └── importlib-metadata v8.4.0
+│       └── zipp v3.20.1
+├── opentelemetry-exporter-otlp v1.27.0
+│   ├── opentelemetry-exporter-otlp-proto-grpc v1.27.0
+│   │   ├── deprecated v1.2.14
+│   │   │   └── wrapt v1.16.0
+│   │   ├── googleapis-common-protos v1.65.0
+│   │   │   └── protobuf v4.25.4
+│   │   ├── grpcio v1.66.1
+│   │   ├── opentelemetry-api v1.27.0
+│   │   │   ├── deprecated v1.2.14
+│   │   │   │   └── wrapt v1.16.0
+│   │   │   └── importlib-metadata v8.4.0
+│   │   │       └── zipp v3.20.1
+│   │   ├── opentelemetry-exporter-otlp-proto-common v1.27.0
+│   │   │   └── opentelemetry-proto v1.27.0
+│   │   │       └── protobuf v4.25.4
+│   │   ├── opentelemetry-proto v1.27.0
+│   │   │   └── protobuf v4.25.4
+│   │   └── opentelemetry-sdk v1.27.0
+│   │       ├── opentelemetry-api v1.27.0
+│   │       │   ├── deprecated v1.2.14
+│   │       │   │   └── wrapt v1.16.0
+│   │       │   └── importlib-metadata v8.4.0
+│   │       │       └── zipp v3.20.1
+│   │       ├── opentelemetry-semantic-conventions v0.48b0
+│   │       │   ├── deprecated v1.2.14
+│   │       │   │   └── wrapt v1.16.0
+│   │       │   └── opentelemetry-api v1.27.0
+│   │       │       ├── deprecated v1.2.14
+│   │       │       │   └── wrapt v1.16.0
+│   │       │       └── importlib-metadata v8.4.0
+│   │       │           └── zipp v3.20.1
+│   │       └── typing-extensions v4.12.2
+│   └── opentelemetry-exporter-otlp-proto-http v1.27.0
+│       ├── deprecated v1.2.14
+│       │   └── wrapt v1.16.0
+│       ├── googleapis-common-protos v1.65.0
+│       │   └── protobuf v4.25.4
+│       ├── opentelemetry-api v1.27.0
+│       │   ├── deprecated v1.2.14
+│       │   │   └── wrapt v1.16.0
+│       │   └── importlib-metadata v8.4.0
+│       │       └── zipp v3.20.1
+│       ├── opentelemetry-exporter-otlp-proto-common v1.27.0
+│       │   └── opentelemetry-proto v1.27.0
+│       │       └── protobuf v4.25.4
+│       ├── opentelemetry-proto v1.27.0
+│       │   └── protobuf v4.25.4
+│       ├── opentelemetry-sdk v1.27.0
+│       │   ├── opentelemetry-api v1.27.0
+│       │   │   ├── deprecated v1.2.14
+│       │   │   │   └── wrapt v1.16.0
+│       │   │   └── importlib-metadata v8.4.0
+│       │   │       └── zipp v3.20.1
+│       │   ├── opentelemetry-semantic-conventions v0.48b0
+│       │   │   ├── deprecated v1.2.14
+│       │   │   │   └── wrapt v1.16.0
+│       │   │   └── opentelemetry-api v1.27.0
+│       │   │       ├── deprecated v1.2.14
+│       │   │       │   └── wrapt v1.16.0
+│       │   │       └── importlib-metadata v8.4.0
+│       │   │           └── zipp v3.20.1
+│       │   └── typing-extensions v4.12.2
+│       └── requests v2.32.3
+│           ├── certifi v2024.8.30
+│           ├── charset-normalizer v3.3.2
+│           ├── idna v3.8
+│           └── urllib3 v2.2.2
+├── packaging v24.1
+├── pathspec v0.12.1
+├── pendulum v3.0.0
+│   ├── backports-zoneinfo v0.2.1
+│   ├── importlib-resources v6.4.4
+│   │   └── zipp v3.20.1
+│   ├── python-dateutil v2.9.0.post0
+│   │   └── six v1.16.0
+│   ├── time-machine v2.15.0
+│   │   └── python-dateutil v2.9.0.post0
+│   │       └── six v1.16.0
+│   └── tzdata v2024.1
+├── pluggy v1.5.0
+├── psutil v6.0.0
+├── pydantic v2.8.2
+│   ├── annotated-types v0.7.0
+│   │   └── typing-extensions v4.12.2
+│   ├── pydantic-core v2.20.1
+│   │   └── typing-extensions v4.12.2
+│   └── typing-extensions v4.12.2
+├── pygments v2.18.0
+├── pyjwt v2.9.0
+├── python-daemon v3.0.1
+│   ├── docutils v0.20.1
+│   ├── lockfile v0.12.2
+│   └── setuptools v74.0.0
+├── python-dateutil v2.9.0.post0
+│   └── six v1.16.0
+├── python-nvd3 v0.16.0
+│   ├── jinja2 v3.1.4
+│   │   └── markupsafe v2.1.5
+│   └── python-slugify v8.0.4
+│       └── text-unidecode v1.3
+├── python-slugify v8.0.4
+│   └── text-unidecode v1.3
+├── requests v2.32.3
+│   ├── certifi v2024.8.30
+│   ├── charset-normalizer v3.3.2
+│   ├── idna v3.8
+│   └── urllib3 v2.2.2
+├── requests-toolbelt v1.0.0
+│   └── requests v2.32.3
+│       ├── certifi v2024.8.30
+│       ├── charset-normalizer v3.3.2
+│       ├── idna v3.8
+│       └── urllib3 v2.2.2
+├── rfc3339-validator v0.1.4
+│   └── six v1.16.0
+├── rich v13.8.0
+│   ├── markdown-it-py v3.0.0
+│   │   └── mdurl v0.1.2
+│   ├── pygments v2.18.0
+│   └── typing-extensions v4.12.2
+├── rich-argparse v1.5.2
+│   └── rich v13.8.0
+│       ├── markdown-it-py v3.0.0
+│       │   └── mdurl v0.1.2
+│       ├── pygments v2.18.0
+│       └── typing-extensions v4.12.2
+├── setproctitle v1.3.3
+├── sqlalchemy v1.4.53
+│   └── greenlet v3.0.3
+├── sqlalchemy-jsonfield v1.0.2
+│   └── sqlalchemy v1.4.53
+│       └── greenlet v3.0.3
+├── sqlparse v0.5.1
+├── tabulate v0.9.0
+├── tenacity v9.0.0
+├── termcolor v2.4.0
+├── unicodecsv v0.14.1
+├── universal-pathlib v0.2.2
+│   └── fsspec v2024.6.1
+└── werkzeug v2.2.3
+    └── markupsafe v2.1.5
diff --git a/generated/dependency_depth.json b/generated/dependency_depth.json
new file mode 100644
index 0000000000..593e791ae0
--- /dev/null
+++ b/generated/dependency_depth.json
@@ -0,0 +1,146 @@
+{
+    "apache-airflow": 0,
+    "aiohttp": 1,
+    "aiohappyeyeballs": 2,
+    "aiosignal": 2,
+    "frozenlist": 3,
+    "async-timeout": 2,
+    "attrs": 2,
+    "multidict": 2,
+    "yarl": 2,
+    "idna": 2,
+    "alembic": 1,
+    "importlib-metadata": 2,
+    "zipp": 3,
+    "importlib-resources": 2,
+    "mako": 2,
+    "markupsafe": 3,
+    "sqlalchemy": 2,
+    "greenlet": 3,
+    "typing-extensions": 2,
+    "argcomplete": 1,
+    "asgiref": 1,
+    "blinker": 1,
+    "colorlog": 1,
+    "configupdater": 1,
+    "connexion[flask]": 1,
+    "clickclick": 2,
+    "click": 3,
+    "pyyaml": 3,
+    "flask": 2,
+    "itsdangerous": 3,
+    "jinja2": 3,
+    "werkzeug": 3,
+    "inflection": 2,
+    "jsonschema": 2,
+    "jsonschema-specifications": 3,
+    "referencing": 4,
+    "rpds-py": 4,
+    "pkgutil-resolve-name": 3,
+    "packaging": 2,
+    "requests": 2,
+    "certifi": 3,
+    "charset-normalizer": 3,
+    "urllib3": 3,
+    "(extra:": 4,
+    "cron-descriptor": 1,
+    "croniter": 1,
+    "python-dateutil": 2,
+    "six": 3,
+    "pytz": 2,
+    "cryptography": 1,
+    "cffi": 2,
+    "pycparser": 2,
+    "deprecated": 1,
+    "wrapt": 2,
+    "dill": 1,
+    "fastapi[standard]": 1,
+    "pydantic": 2,
+    "annotated-types": 3,
+    "pydantic-core": 3,
+    "starlette": 2,
+    "anyio": 3,
+    "exceptiongroup": 4,
+    "sniffio": 4,
+    "dnspython": 3,
+    "typer": 3,
+    "rich": 4,
+    "markdown-it-py": 5,
+    "mdurl": 6,
+    "pygments": 5,
+    "shellingham": 4,
+    "uvicorn[standard]": 3,
+    "h11": 4,
+    "httpcore": 3,
+    "flask-appbuilder": 1,
+    "apispec[yaml]": 2,
+    "colorama": 2,
+    "email-validator": 2,
+    "flask-babel": 2,
+    "babel": 3,
+    "flask-jwt-extended": 2,
+    "pyjwt": 3,
+    "flask-limiter": 2,
+    "limits": 3,
+    "ordered-set": 3,
+    "flask-login": 2,
+    "flask-sqlalchemy": 2,
+    "flask-wtf": 2,
+    "wtforms": 3,
+    "marshmallow": 2,
+    "marshmallow-sqlalchemy": 2,
+    "prison": 2,
+    "sqlalchemy-utils": 2,
+    "flask-caching": 1,
+    "cachelib": 2,
+    "flask-session": 1,
+    "fsspec": 1,
+    "google-re2": 1,
+    "gunicorn": 1,
+    "httpx": 1,
+    "jmespath": 1,
+    "lazy-object-proxy": 1,
+    "linkify-it-py": 1,
+    "uc-micro-py": 2,
+    "lockfile": 1,
+    "marshmallow-oneofschema": 1,
+    "mdit-py-plugins": 1,
+    "methodtools": 1,
+    "wirerope": 2,
+    "more-itertools": 1,
+    "opentelemetry-api": 1,
+    "opentelemetry-exporter-otlp": 1,
+    "opentelemetry-exporter-otlp-proto-grpc": 2,
+    "googleapis-common-protos": 3,
+    "protobuf": 4,
+    "grpcio": 3,
+    "opentelemetry-exporter-otlp-proto-common": 3,
+    "opentelemetry-proto": 4,
+    "opentelemetry-sdk": 3,
+    "opentelemetry-semantic-conventions": 3,
+    "opentelemetry-exporter-otlp-proto-http": 2,
+    "pathspec": 1,
+    "pendulum": 1,
+    "backports-zoneinfo": 2,
+    "time-machine": 2,
+    "tzdata": 2,
+    "pluggy": 1,
+    "psutil": 1,
+    "python-daemon": 1,
+    "docutils": 2,
+    "setuptools": 2,
+    "python-nvd3": 1,
+    "python-slugify": 2,
+    "text-unidecode": 2,
+    "requests-toolbelt": 1,
+    "rfc3339-validator": 1,
+    "rich-argparse": 1,
+    "setproctitle": 1,
+    "sqlalchemy-jsonfield": 1,
+    "sqlparse": 1,
+    "tabulate": 1,
+    "tenacity": 1,
+    "termcolor": 1,
+    "unicodecsv": 1,
+    "universal-pathlib": 1
+}
diff --git a/scripts/in_container/get_dependency_status.py 
b/scripts/in_container/get_dependency_status.py
new file mode 100644
index 0000000000..961f66d8d6
--- /dev/null
+++ b/scripts/in_container/get_dependency_status.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import json
+import sys
+
+
+def read_input():
+    input_data = sys.stdin.read()
+    return input_data
+
+
+DEPS_DEPTH: dict[str, int] = {}
+
+
+def get_dep_level(line: str):
+    split_line = line.split()
+    level = len(split_line) - 2
+    package = split_line[level]
+    if package not in DEPS_DEPTH:
+        DEPS_DEPTH[package] = level
+
+
+if __name__ == "__main__":
+    input_data = read_input()
+    lines = input_data.splitlines()
+    for line in lines:
+        get_dep_level(line)
+
+    print(json.dumps(DEPS_DEPTH, indent=4))

Reply via email to