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

[airflow] branch v2-3-test updated (acc3df56c4 -> 06e4976aaf)

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

potiuk pushed a change to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


    omit acc3df56c4 Also compile assets in non-main (#25220)
    omit d8ed1975f2 Fix asset compilation via setup.py (#25201)
    omit fcd9836ba1 Fix missing space for breeze build-image hint command (#25204)
    omit b5501dea38 Move javascript compilation to host (#25169)
    omit a6a883f26a Update description of branch creation to include the new Breeze (#25155)
    omit 730a4d8b69 Speed up Kubernetes upgrade tests at least 2x (#25159)
    omit 8c20eb0ac5 Retrieve airflow branch/constraints from env variables (#25053)
    omit f70f5cdcdf Disable provider packages building for non-main branch builds (#25056)
    omit 4fe1dabd30 Speed up Kubernetes tests ~30% on main. (#25143)
    omit b932b1e62c Fix PR label detection in CI (#25148)
    omit ec8ea0e200 Bump typing-extensions and mypy for ParamSpec (#25088)
     new ce0caa0038 Bump typing-extensions and mypy for ParamSpec (#25088)
     new 436fe2d848 Fix PR label detection in CI (#25148)
     new fa0b5b73c2 Speed up Kubernetes tests ~30% on main. (#25143)
     new bf6c0ce300 Disable provider packages building for non-main branch builds (#25056)
     new 218711e601 Retrieve airflow branch/constraints from env variables (#25053)
     new 81dd5c88f0 Speed up Kubernetes upgrade tests at least 2x (#25159)
     new f18e165749 Update description of branch creation to include the new Breeze (#25155)
     new 60bc1ce6d6 Move javascript compilation to host (#25169)
     new 994a0410f4 Fix missing space for breeze build-image hint command (#25204)
     new 17f6105aad Fix asset compilation via setup.py (#25201)
     new 8de0ac7a75 Also compile assets in non-main (#25220)
     new 06e4976aaf Limit astroid version to < 2.12 (#24982)

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (acc3df56c4)
            \
             N -- N -- N   refs/heads/v2-3-test (06e4976aaf)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 airflow/utils/context.py                       | 4 ++--
 docs/apache-airflow-providers-github/index.rst | 7 +++++++
 setup.py                                       | 5 +++++
 3 files changed, 14 insertions(+), 2 deletions(-)


[airflow] 01/12: Bump typing-extensions and mypy for ParamSpec (#25088)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ce0caa0038d0d56d1850e2d0217e07b26bceca24
Author: Tzu-ping Chung <ur...@gmail.com>
AuthorDate: Mon Jul 18 17:20:35 2022 +0800

    Bump typing-extensions and mypy for ParamSpec (#25088)
    
    * Bump typing-extensions and mypy for ParamSpec
    
    I want to use them in some @task signature improvements. Mypy added this
    in 0.950, but let's just bump to latest since why not.
    
    Changelog of typing-extensions is spotty before 4.0, but ParamSpec was
    introduced some time before that (likely some time in 2021), and it
    seems to be a reasonble minimum to bump to.
    
    For more about ParamSpec, read PEP 612: https://peps.python.org/pep-0612/
    
    (cherry picked from commit e32e9c58802fe9363cc87ea283a59218df7cec3a)
---
 airflow/jobs/scheduler_job.py                      |  4 +-
 airflow/mypy/plugin/decorators.py                  |  5 +-
 .../amazon/aws/transfers/dynamodb_to_s3.py         |  1 +
 .../providers/amazon/aws/transfers/sql_to_s3.py    | 19 ++++---
 .../providers/google/cloud/operators/cloud_sql.py  |  2 +-
 airflow/providers/microsoft/azure/hooks/cosmos.py  | 62 +++++++++++++---------
 airflow/utils/context.py                           |  6 +--
 .../airflow_breeze/commands/testing_commands.py    |  8 +--
 scripts/in_container/run_migration_reference.py    |  1 +
 setup.cfg                                          |  2 +-
 setup.py                                           |  2 +-
 .../microsoft/azure/hooks/test_azure_cosmos.py     |  8 ++-
 12 files changed, 73 insertions(+), 47 deletions(-)

diff --git a/airflow/jobs/scheduler_job.py b/airflow/jobs/scheduler_job.py
index 3440832275..3613b9be47 100644
--- a/airflow/jobs/scheduler_job.py
+++ b/airflow/jobs/scheduler_job.py
@@ -170,7 +170,7 @@ class SchedulerJob(BaseJob):
         signal.signal(signal.SIGTERM, self._exit_gracefully)
         signal.signal(signal.SIGUSR2, self._debug_dump)
 
-    def _exit_gracefully(self, signum, frame) -> None:
+    def _exit_gracefully(self, signum: int, frame) -> None:
         """Helper method to clean up processor_agent to avoid leaving orphan processes."""
         if not _is_parent_process():
             # Only the parent process should perform the cleanup.
@@ -181,7 +181,7 @@ class SchedulerJob(BaseJob):
             self.processor_agent.end()
         sys.exit(os.EX_OK)
 
-    def _debug_dump(self, signum, frame):
+    def _debug_dump(self, signum: int, frame) -> None:
         if not _is_parent_process():
             # Only the parent process should perform the debug dump.
             return
diff --git a/airflow/mypy/plugin/decorators.py b/airflow/mypy/plugin/decorators.py
index 76f1af54cd..32e1113876 100644
--- a/airflow/mypy/plugin/decorators.py
+++ b/airflow/mypy/plugin/decorators.py
@@ -68,7 +68,10 @@ def _change_decorator_function_type(
     # Mark provided arguments as optional
     decorator.arg_types = copy.copy(decorated.arg_types)
     for argument in provided_arguments:
-        index = decorated.arg_names.index(argument)
+        try:
+            index = decorated.arg_names.index(argument)
+        except ValueError:
+            continue
         decorated_type = decorated.arg_types[index]
         decorator.arg_types[index] = UnionType.make_union([decorated_type, NoneType()])
         decorated.arg_kinds[index] = ARG_NAMED_OPT
diff --git a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
index a6f5f8da21..218f4dc16c 100644
--- a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
+++ b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
@@ -114,6 +114,7 @@ class DynamoDBToS3Operator(BaseOperator):
 
         scan_kwargs = copy(self.dynamodb_scan_kwargs) if self.dynamodb_scan_kwargs else {}
         err = None
+        f: IO[Any]
         with NamedTemporaryFile() as f:
             try:
                 f = self._scan_dynamodb_and_upload_to_s3(f, scan_kwargs, table)
diff --git a/airflow/providers/amazon/aws/transfers/sql_to_s3.py b/airflow/providers/amazon/aws/transfers/sql_to_s3.py
index f399c27141..d9bebf5a39 100644
--- a/airflow/providers/amazon/aws/transfers/sql_to_s3.py
+++ b/airflow/providers/amazon/aws/transfers/sql_to_s3.py
@@ -16,8 +16,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+import enum
 from collections import namedtuple
-from enum import Enum
 from tempfile import NamedTemporaryFile
 from typing import TYPE_CHECKING, Iterable, Mapping, Optional, Sequence, Union
 
@@ -35,10 +35,13 @@ if TYPE_CHECKING:
     from airflow.utils.context import Context
 
 
-FILE_FORMAT = Enum(
-    "FILE_FORMAT",
-    "CSV, JSON, PARQUET",
-)
+class FILE_FORMAT(enum.Enum):
+    """Possible file formats."""
+
+    CSV = enum.auto()
+    JSON = enum.auto()
+    PARQUET = enum.auto()
+
 
 FileOptions = namedtuple('FileOptions', ['mode', 'suffix', 'function'])
 
@@ -118,9 +121,9 @@ class SqlToS3Operator(BaseOperator):
         if "path_or_buf" in self.pd_kwargs:
             raise AirflowException('The argument path_or_buf is not allowed, please remove it')
 
-        self.file_format = getattr(FILE_FORMAT, file_format.upper(), None)
-
-        if self.file_format is None:
+        try:
+            self.file_format = FILE_FORMAT[file_format.upper()]
+        except KeyError:
             raise AirflowException(f"The argument file_format doesn't support {file_format} value.")
 
     @staticmethod
diff --git a/airflow/providers/google/cloud/operators/cloud_sql.py b/airflow/providers/google/cloud/operators/cloud_sql.py
index 1441f518b4..fb5a88593e 100644
--- a/airflow/providers/google/cloud/operators/cloud_sql.py
+++ b/airflow/providers/google/cloud/operators/cloud_sql.py
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
 SETTINGS = 'settings'
 SETTINGS_VERSION = 'settingsVersion'
 
-CLOUD_SQL_CREATE_VALIDATION = [
+CLOUD_SQL_CREATE_VALIDATION: Sequence[dict] = [
     dict(name="name", allow_empty=False),
     dict(
         name="settings",
diff --git a/airflow/providers/microsoft/azure/hooks/cosmos.py b/airflow/providers/microsoft/azure/hooks/cosmos.py
index ed475978b0..954b584846 100644
--- a/airflow/providers/microsoft/azure/hooks/cosmos.py
+++ b/airflow/providers/microsoft/azure/hooks/cosmos.py
@@ -23,6 +23,7 @@ Airflow connection of type `azure_cosmos` exists. Authorization can be done by s
 login (=Endpoint uri), password (=secret key) and extra fields database_name and collection_name to specify
 the default database and collection to use (see connection `azure_cosmos_default` for an example).
 """
+import json
 import uuid
 from typing import Any, Dict, Optional
 
@@ -140,14 +141,22 @@ class AzureCosmosDBHook(BaseHook):
         existing_container = list(
             self.get_conn()
             .get_database_client(self.__get_database_name(database_name))
-            .query_containers("SELECT * FROM r WHERE r.id=@id", [{"name": "@id", "value": collection_name}])
+            .query_containers(
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": collection_name})],
+            )
         )
         if len(existing_container) == 0:
             return False
 
         return True
 
-    def create_collection(self, collection_name: str, database_name: Optional[str] = None) -> None:
+    def create_collection(
+        self,
+        collection_name: str,
+        database_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
+    ) -> None:
         """Creates a new collection in the CosmosDB database."""
         if collection_name is None:
             raise AirflowBadRequest("Collection name cannot be None.")
@@ -157,13 +166,16 @@ class AzureCosmosDBHook(BaseHook):
         existing_container = list(
             self.get_conn()
             .get_database_client(self.__get_database_name(database_name))
-            .query_containers("SELECT * FROM r WHERE r.id=@id", [{"name": "@id", "value": collection_name}])
+            .query_containers(
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": collection_name})],
+            )
         )
 
         # Only create if we did not find it already existing
         if len(existing_container) == 0:
             self.get_conn().get_database_client(self.__get_database_name(database_name)).create_container(
-                collection_name
+                collection_name, partition_key=partition_key
             )
 
     def does_database_exist(self, database_name: str) -> bool:
@@ -173,10 +185,8 @@ class AzureCosmosDBHook(BaseHook):
 
         existing_database = list(
             self.get_conn().query_databases(
-                {
-                    "query": "SELECT * FROM r WHERE r.id=@id",
-                    "parameters": [{"name": "@id", "value": database_name}],
-                }
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": database_name})],
             )
         )
         if len(existing_database) == 0:
@@ -193,10 +203,8 @@ class AzureCosmosDBHook(BaseHook):
         # to create it twice
         existing_database = list(
             self.get_conn().query_databases(
-                {
-                    "query": "SELECT * FROM r WHERE r.id=@id",
-                    "parameters": [{"name": "@id", "value": database_name}],
-                }
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": database_name})],
             )
         )
 
@@ -267,18 +275,28 @@ class AzureCosmosDBHook(BaseHook):
         return created_documents
 
     def delete_document(
-        self, document_id: str, database_name: Optional[str] = None, collection_name: Optional[str] = None
+        self,
+        document_id: str,
+        database_name: Optional[str] = None,
+        collection_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
     ) -> None:
         """Delete an existing document out of a collection in the CosmosDB database."""
         if document_id is None:
             raise AirflowBadRequest("Cannot delete a document without an id")
-
-        self.get_conn().get_database_client(self.__get_database_name(database_name)).get_container_client(
-            self.__get_collection_name(collection_name)
-        ).delete_item(document_id)
+        (
+            self.get_conn()
+            .get_database_client(self.__get_database_name(database_name))
+            .get_container_client(self.__get_collection_name(collection_name))
+            .delete_item(document_id, partition_key=partition_key)
+        )
 
     def get_document(
-        self, document_id: str, database_name: Optional[str] = None, collection_name: Optional[str] = None
+        self,
+        document_id: str,
+        database_name: Optional[str] = None,
+        collection_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
     ):
         """Get a document from an existing collection in the CosmosDB database."""
         if document_id is None:
@@ -289,7 +307,7 @@ class AzureCosmosDBHook(BaseHook):
                 self.get_conn()
                 .get_database_client(self.__get_database_name(database_name))
                 .get_container_client(self.__get_collection_name(collection_name))
-                .read_item(document_id)
+                .read_item(document_id, partition_key=partition_key)
             )
         except CosmosHttpResponseError:
             return None
@@ -305,17 +323,13 @@ class AzureCosmosDBHook(BaseHook):
         if sql_string is None:
             raise AirflowBadRequest("SQL query string cannot be None")
 
-        # Query them in SQL
-        query = {'query': sql_string}
-
         try:
             result_iterable = (
                 self.get_conn()
                 .get_database_client(self.__get_database_name(database_name))
                 .get_container_client(self.__get_collection_name(collection_name))
-                .query_items(query, partition_key)
+                .query_items(sql_string, partition_key=partition_key)
             )
-
             return list(result_iterable)
         except CosmosHttpResponseError:
             return None
diff --git a/airflow/utils/context.py b/airflow/utils/context.py
index 04dababa24..ffa0e6b95c 100644
--- a/airflow/utils/context.py
+++ b/airflow/utils/context.py
@@ -23,12 +23,12 @@ import copy
 import functools
 import warnings
 from typing import (
-    AbstractSet,
     Any,
     Container,
     Dict,
     ItemsView,
     Iterator,
+    KeysView,
     List,
     Mapping,
     MutableMapping,
@@ -175,7 +175,7 @@ class Context(MutableMapping[str, Any]):
     }
 
     def __init__(self, context: Optional[MutableMapping[str, Any]] = None, **kwargs: Any) -> None:
-        self._context = context or {}
+        self._context: MutableMapping[str, Any] = context or {}
         if kwargs:
             self._context.update(kwargs)
         self._deprecation_replacements = self._DEPRECATION_REPLACEMENTS.copy()
@@ -231,7 +231,7 @@ class Context(MutableMapping[str, Any]):
             return NotImplemented
         return self._context != other._context
 
-    def keys(self) -> AbstractSet[str]:
+    def keys(self) -> KeysView[str]:
         return self._context.keys()
 
     def items(self):
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index b53333ea64..05aa3aa7e8 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -197,9 +197,9 @@ def run_with_progress(
 ) -> RunCommandResult:
     title = f"Running tests: {test_type}, Python: {python}, Backend: {backend}:{version}"
     try:
-        with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as f:
+        with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as tf:
             get_console().print(f"[info]Starting test = {title}[/]")
-            thread = MonitoringThread(title=title, file_name=f.name)
+            thread = MonitoringThread(title=title, file_name=tf.name)
             thread.start()
             try:
                 result = run_command(
@@ -208,14 +208,14 @@ def run_with_progress(
                     dry_run=dry_run,
                     env=env_variables,
                     check=False,
-                    stdout=f,
+                    stdout=tf,
                     stderr=subprocess.STDOUT,
                 )
             finally:
                 thread.stop()
                 thread.join()
         with ci_group(f"Result of {title}", message_type=message_type_from_return_code(result.returncode)):
-            with open(f.name) as f:
+            with open(tf.name) as f:
                 shutil.copyfileobj(f, sys.stdout)
     finally:
         os.unlink(f.name)
diff --git a/scripts/in_container/run_migration_reference.py b/scripts/in_container/run_migration_reference.py
index cc05408c2a..12ff265c55 100755
--- a/scripts/in_container/run_migration_reference.py
+++ b/scripts/in_container/run_migration_reference.py
@@ -102,6 +102,7 @@ def revision_suffix(rev: "Script"):
 
 def ensure_airflow_version(revisions: Iterable["Script"]):
     for rev in revisions:
+        assert rev.module.__file__ is not None  # For Mypy.
         file = Path(rev.module.__file__)
         content = file.read_text()
         if not has_version(content):
diff --git a/setup.cfg b/setup.cfg
index 0e1e9f7b84..2c96a0de42 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -146,7 +146,7 @@ install_requires =
     tabulate>=0.7.5
     tenacity>=6.2.0
     termcolor>=1.1.0
-    typing-extensions>=3.7.4
+    typing-extensions>=4.0.0
     unicodecsv>=0.14.1
     werkzeug>=2.0
 
diff --git a/setup.py b/setup.py
index 4d5dbd1bb8..6447281e5d 100644
--- a/setup.py
+++ b/setup.py
@@ -578,7 +578,7 @@ zendesk = [
 # mypyd which does not support installing the types dynamically with --install-types
 mypy_dependencies = [
     # TODO: upgrade to newer versions of MyPy continuously as they are released
-    'mypy==0.910',
+    'mypy==0.950',
     'types-boto',
     'types-certifi',
     'types-croniter',
diff --git a/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py b/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
index b407fbdb3c..e157a5276b 100644
--- a/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
+++ b/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
@@ -90,7 +90,9 @@ class TestAzureCosmosDbHook(unittest.TestCase):
         hook = AzureCosmosDBHook(azure_cosmos_conn_id='azure_cosmos_test_key_id')
         hook.create_collection(self.test_collection_name, self.test_database_name)
         expected_calls = [
-            mock.call().get_database_client('test_database_name').create_container('test_collection_name')
+            mock.call()
+            .get_database_client('test_database_name')
+            .create_container('test_collection_name', partition_key=None)
         ]
         mock_cosmos.assert_any_call(self.test_end_point, {'masterKey': self.test_master_key})
         mock_cosmos.assert_has_calls(expected_calls)
@@ -100,7 +102,9 @@ class TestAzureCosmosDbHook(unittest.TestCase):
         hook = AzureCosmosDBHook(azure_cosmos_conn_id='azure_cosmos_test_key_id')
         hook.create_collection(self.test_collection_name)
         expected_calls = [
-            mock.call().get_database_client('test_database_name').create_container('test_collection_name')
+            mock.call()
+            .get_database_client('test_database_name')
+            .create_container('test_collection_name', partition_key=None)
         ]
         mock_cosmos.assert_any_call(self.test_end_point, {'masterKey': self.test_master_key})
         mock_cosmos.assert_has_calls(expected_calls)


[airflow] 06/12: Speed up Kubernetes upgrade tests at least 2x (#25159)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 81dd5c88f0e6ad9437305b9fd21d48027fffe846
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 22:30:42 2022 +0200

    Speed up Kubernetes upgrade tests at least 2x (#25159)
    
    We do not need to run upgrade kubernetes tests for all python
    versions and all kubernetes versions. It is enough to run them
    for the minimum and maximum versions. We already run all k8s tests
    in main for all executors, so they "generally" work, and it
    is very, very unlikely that if it works for Python 3.7, and 3.10,
    it will not work for 3.8 or 3.9 (similarly for K8S version).
    
    This will speed up the build at least 2 times.
    
    (cherry picked from commit 907e720b9e312e9da1e645973a747ddbd3ba69f5)
---
 .github/workflows/ci.yml                           | 23 +++++++++++++---------
 .../src/airflow_breeze/utils/selective_checks.py   | 16 +++++++++++++++
 2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd056e4238..c459b7001d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -134,8 +134,13 @@ jobs:
       all-python-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.all-python-versions-list-as-string }}
       default-python-version: ${{ steps.selective-checks.outputs.default-python-version }}
+      min-max-python-versions-as-string: >-
+        ${{ steps.selective-checks.outputs.min-max-python-versions-as-string }}
       kubernetes-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.kubernetes-versions-list-as-string }}
+      default-kubernetes-version: ${{ steps.selective-checks.outputs.default-kubernetes-version }}
+      min-max-kubernetes-versions-as-string: >-
+        ${{ steps.selective-checks.outputs.min-max-kubernetes-versions-as-string }}
       postgres-versions: ${{ steps.selective-checks.outputs.postgres-versions }}
       default-postgres-version: ${{ steps.selective-checks.outputs.default-postgres-version }}
       mysql-versions: ${{ steps.selective-checks.outputs.mysql-versions }}
@@ -1524,7 +1529,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-helm-executor-upgrade:
     timeout-minutes: 150
-    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     env:
@@ -1536,10 +1541,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       EXECUTOR: "KubernetesExecutor"
       KIND_VERSION: "${{ needs.build-info.outputs.default-kind-version }}"
       HELM_VERSION: "${{ needs.build-info.outputs.default-helm-version }}"
-      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.python-versions-list-as-string}}
-      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >-
+        ${{needs.build-info.outputs.min-max-python-versions-as-string}}
+      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >-
+        ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
     if: >
       needs.build-info.outputs.run-kubernetes-tests == 'true' &&
       needs.build-info.outputs.default-branch == 'main'
@@ -1569,12 +1574,12 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         with:
           path: ".build/.kubernetes_venv"
           key: "kubernetes-${{ needs.build-info.outputs.default-python-version }}\
-  -${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
-  -${{needs.build-info.outputs.python-versions-list-as-string}}
+  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
+  -${{needs.build-info.outputs.min-max-python-versions-as-string}}
   -${{ hashFiles('setup.py','setup.cfg') }}"
           restore-keys: "kubernetes-${{ needs.build-info.outputs.default-python-version }}-\
-  -${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
-  -${{needs.build-info.outputs.python-versions-list-as-string}}"
+  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}} \
+  -${{needs.build-info.outputs.min-max-python-versions-as-string}}"
       - name: "Cache bin folder with tools for kubernetes testing"
         uses: actions/cache@v3
         with:
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 642bb75043..af5b7a154d 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -330,6 +330,14 @@ class SelectiveChecks:
     def python_versions_list_as_string(self) -> str:
         return " ".join(self.python_versions)
 
+    @cached_property
+    def min_max_python_versions_as_string(self) -> str:
+        return " ".join(
+            [CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[0], CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[-1]]
+            if self._full_tests_needed
+            else [DEFAULT_PYTHON_MAJOR_MINOR_VERSION]
+        )
+
     @cached_property
     def all_python_versions(self) -> list[str]:
         return (
@@ -386,6 +394,14 @@ class SelectiveChecks:
     def kubernetes_versions(self) -> list[str]:
         return CURRENT_KUBERNETES_VERSIONS if self._full_tests_needed else [DEFAULT_KUBERNETES_VERSION]
 
+    @cached_property
+    def min_max_kubernetes_versions_as_string(self) -> str:
+        return " ".join(
+            [CURRENT_KUBERNETES_VERSIONS[0], CURRENT_KUBERNETES_VERSIONS[-1]]
+            if self._full_tests_needed
+            else [DEFAULT_KUBERNETES_VERSION]
+        )
+
     @cached_property
     def kubernetes_versions_list_as_string(self) -> str:
         return " ".join(self.kubernetes_versions)


[airflow] 11/12: Also compile assets in non-main (#25220)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8de0ac7a753dc7409a54df9aac2ecfaa508e5af9
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Thu Jul 21 17:58:22 2022 +0200

    Also compile assets in non-main (#25220)
    
    Assets compilation when CI and PROD images are prepared should
    also be run in non-main branch.
    
    (cherry picked from commit 6839813bc75e62e154fe4163ffa1bda1c8e8cc8f)
---
 .github/workflows/ci.yml | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 78ef756b4f..4677ae5d47 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -339,9 +339,7 @@ jobs:
           key: "pre-commit-${{steps.host-python-version.outputs.host-python-version}}-\
 ${{ hashFiles('.pre-commit-config.yaml') }}"
           restore-keys: pre-commit-${{steps.host-python-version.outputs.host-python-version}}
-        if: >
-          needs.build-info.outputs.in-workflow-build == 'true' &&
-          needs.build-info.outputs.default-branch == 'main'
+        if: needs.build-info.outputs.in-workflow-build == 'true'
       - name: "Regenerate dependencies in case they was modified manually so that we can build an image"
         run: >
           breeze static-checks --type update-providers-dependencies --all-files
@@ -351,9 +349,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           needs.build-info.outputs.default-branch == 'main'
       - name: Compile www assets
         run: breeze compile-www-assets
-        if: >
-          needs.build-info.outputs.in-workflow-build == 'true' &&
-          needs.build-info.outputs.default-branch == 'main'
+        if: needs.build-info.outputs.in-workflow-build == 'true'
       - name: >
           Build & Push CI images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}


[airflow] 04/12: Disable provider packages building for non-main branch builds (#25056)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit bf6c0ce300cf3425b6529b39db6ec1c578987c9c
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 14:37:44 2022 +0200

    Disable provider packages building for non-main branch builds (#25056)
    
    * Disable provider packages building for non-main branch builds
    
    When running the builds from non-main, we do not want to use
    provider packages built locally, but we want to install those from
    PyPI. This is achieved by skipping the step of building providers
    in case default branch is not main.
    
    During this change it was also discovered that we do not need
    AIRFLOW_FROM_CONTEXT flag to indicate whether airflow is
    among those being installed from docker-context files. This is
    now detected automatically and airflow is installed from Pypi
    if not installed from docker context files. Providers
    and airflow are automatically detected and installed if they are
    present.
    
    Installing pre-cached dependencies from GitHub is skipped in
    case docker-context-files are used.
    
    (cherry picked from commit 67a24aed68c74aee2706d2c7b6b029a5846f0d55)
---
 .../airflow_providers_bug_report.yml               |   2 -
 .github/workflows/build-images.yml                 |   5 +-
 .github/workflows/ci.yml                           |  19 +-
 Dockerfile                                         |  29 +-
 IMAGES.rst                                         |   3 +-
 .../commands/production_image_commands.py          |   9 +-
 .../src/airflow_breeze/params/build_prod_params.py |  22 +-
 dev/refresh_images.sh                              |   2 -
 docs/docker-stack/build-arg-ref.rst                |   5 -
 docs/docker-stack/changelog.rst                    |   3 +-
 generated/README.md                                |  25 +
 generated/provider_dependencies.json               | 734 +++++++++++++++++++++
 images/breeze/output-build-prod-image.svg          | 352 +++++-----
 images/breeze/output-commands-hash.txt             |   2 +-
 scripts/ci/libraries/_initialization.sh            |   7 -
 15 files changed, 967 insertions(+), 252 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
index 20845ea0c7..665093a84e 100644
--- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
@@ -43,7 +43,6 @@ body:
         - celery
         - cloudant
         - cncf-kubernetes
-        - common-sql
         - databricks
         - datadog
         - dbt-cloud
@@ -93,7 +92,6 @@ body:
         - sqlite
         - ssh
         - tableau
-        - tabular
         - telegram
         - trino
         - vertica
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index dc758877f7..4485e5c68d 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -318,12 +318,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           key: "pre-commit-${{steps.host-python-version.outputs.host-python-version}}-\
 ${{ hashFiles('.pre-commit-config.yaml') }}"
           restore-keys: pre-commit-${{steps.host-python-version.outputs.host-python-version}}
-        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Regenerate dependencies in case they was modified manually so that we can build an image"
         run: >
           breeze static-checks --type update-providers-dependencies --all-files
           --show-diff-on-failure --color always || true
-        if: needs.build-info.outputs.default-branch == 'main'
       - name: >
           Pull CI image for PROD build:
           ${{ needs.build-info.outputs.default-python-version }}:${{ env.IMAGE_TAG_FOR_THE_BUILD }}
@@ -340,6 +338,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --package-list-file ./scripts/ci/installed_providers.txt
           --package-format wheel
           --version-suffix-for-pypi dev0
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Prepare airflow package"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
       - name: "Move dist packages to docker-context files"
@@ -353,8 +352,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --tag-as-latest
           --push-image
           --install-packages-from-context
-          --disable-airflow-repo-cache
-          --airflow-is-in-context
         env:
           UPGRADE_TO_NEWER_DEPENDENCIES: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
           DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 86666cf17a..cd056e4238 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -434,7 +434,9 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           breeze prepare-provider-packages
           --package-list-file ./scripts/ci/installed_providers.txt
           --package-format wheel --version-suffix-for-pypi dev0
-        if: needs.build-info.outputs.in-workflow-build == 'true'
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
       - name: "Prepare airflow package"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
         if: needs.build-info.outputs.in-workflow-build == 'true'
@@ -450,8 +452,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --run-in-parallel
           --push-image
           --install-packages-from-context
-          --disable-airflow-repo-cache
-          --airflow-is-in-context
         env:
           UPGRADE_TO_NEWER_DEPENDENCIES: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
           DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
@@ -1719,6 +1719,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           IMAGE_TAG: ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
       - name: "Cleanup dist and context file"
         run: rm -fv ./dist/* ./docker-context-files/*
+      - name: "Prepare airflow package for PROD build"
+        run: breeze prepare-airflow-package --package-format wheel
+        env:
+          VERSION_SUFFIX_FOR_PYPI: "dev0"
       - name: "Prepare providers packages for PROD build"
         run: >
           breeze prepare-provider-packages
@@ -1726,10 +1730,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --package-format wheel
         env:
           VERSION_SUFFIX_FOR_PYPI: "dev0"
-      - name: "Prepare airflow package for PROD build"
-        run: breeze prepare-airflow-package --package-format wheel
-        env:
-          VERSION_SUFFIX_FOR_PYPI: "dev0"
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Start ARM instance"
         run: ./scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
         if: matrix.platform == 'linux/arm64'
@@ -1745,17 +1746,17 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Push PROD cache ${{ matrix.python-version }} ${{ matrix.platform }}"
         run: >
           breeze build-prod-image
           --builder airflow_cache
-          --airflow-is-in-context
           --install-packages-from-context
           --prepare-buildx-cache
-          --disable-airflow-repo-cache
           --platform ${{ matrix.platform }}
         env:
           PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Stop ARM instance"
         run: ./scripts/ci/images/ci_stop_arm_instance.sh
         if: always() && matrix.platform == 'linux/arm64'
diff --git a/Dockerfile b/Dockerfile
index fdcbb6fa11..b4ddddef80 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1283,16 +1283,23 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
 COPY --from=scripts common.sh install_pip_version.sh \
      install_airflow_dependencies_from_branch_tip.sh /scripts/docker/
 
+# We can set this value to true in case we want to install .whl/.tar.gz packages placed in the
+# docker-context-files folder. This can be done for both additional packages you want to install
+# as well as Airflow and Provider packages (it will be automatically detected if airflow
+# is installed from docker-context files rather than from PyPI)
+ARG INSTALL_PACKAGES_FROM_CONTEXT="false"
+
 # In case of Production build image segment we want to pre-install main version of airflow
 # dependencies from GitHub so that we do not have to always reinstall it from the scratch.
 # The Airflow (and providers in case INSTALL_PROVIDERS_FROM_SOURCES is "false")
 # are uninstalled, only dependencies remain
 # the cache is only used when "upgrade to newer dependencies" is not set to automatically
-# account for removed dependencies (we do not install them in the first place)
-# Upgrade to specific PIP version
+# account for removed dependencies (we do not install them in the first place) and in case
+# INSTALL_PACKAGES_FROM_CONTEXT is not set (because then caching it from main makes no sense).
 RUN bash /scripts/docker/install_pip_version.sh; \
     if [[ ${AIRFLOW_PRE_CACHED_PIP_PACKAGES} == "true" && \
-          ${UPGRADE_TO_NEWER_DEPENDENCIES} == "false" ]]; then \
+        ${INSTALL_PACKAGES_FROM_CONTEXT} == "false" && \
+        ${UPGRADE_TO_NEWER_DEPENDENCIES} == "false" ]]; then \
         bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
     fi
 
@@ -1302,8 +1309,7 @@ COPY --chown=airflow:0 ${AIRFLOW_SOURCES_WWW_FROM} ${AIRFLOW_SOURCES_WWW_TO}
 # hadolint ignore=SC2086, SC2010
 RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
         # only prepare node modules and compile assets if the prod image is build from sources
-        # otherwise they are already compiled-in. We should do it in one step with removing artifacts \
-        # as we want to keep the final image small
+        # otherwise they are already compiled-in the package.
         bash /scripts/docker/prepare_node_modules.sh; \
         REMOVE_ARTIFACTS="true" BUILD_TYPE="prod" bash /scripts/docker/compile_www_assets.sh; \
         # Copy generated dist folder (otherwise it will be overridden by the COPY step below)
@@ -1319,14 +1325,7 @@ RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
 
 # Add extra python dependencies
 ARG ADDITIONAL_PYTHON_DEPS=""
-# We can set this value to true in case we want to install .whl .tar.gz packages placed in the
-# docker-context-files folder. This can be done for both - additional packages you want to install
-# and for airflow as well (you have to set AIRFLOW_IS_IN_CONTEXT to true in this case)
-ARG INSTALL_PACKAGES_FROM_CONTEXT="false"
-# By default we install latest airflow from PyPI or sources. You can set this parameter to false
-# if Airflow is in the .whl or .tar.gz packages placed in `docker-context-files` folder and you want
-# to skip installing Airflow/Providers from PyPI or sources.
-ARG AIRFLOW_IS_IN_CONTEXT="false"
+
 # Those are additional constraints that are needed for some extras but we do not want to
 # Force them on the main Airflow package.
 # * dill<0.3.3 required by apache-beam
@@ -1334,7 +1333,6 @@ ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3"
 
 ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS} \
     INSTALL_PACKAGES_FROM_CONTEXT=${INSTALL_PACKAGES_FROM_CONTEXT} \
-    AIRFLOW_IS_IN_CONTEXT=${AIRFLOW_IS_IN_CONTEXT} \
     EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
 
 WORKDIR ${AIRFLOW_HOME}
@@ -1345,7 +1343,8 @@ COPY --from=scripts install_from_docker_context_files.sh install_airflow.sh \
 # hadolint ignore=SC2086, SC2010
 RUN if [[ ${INSTALL_PACKAGES_FROM_CONTEXT} == "true" ]]; then \
         bash /scripts/docker/install_from_docker_context_files.sh; \
-    elif [[ ${AIRFLOW_IS_IN_CONTEXT} == "false" ]]; then \
+    fi; \
+    if ! airflow version 2>/dev/null >/dev/null; then \
         bash /scripts/docker/install_airflow.sh; \
     fi; \
     if [[ -n "${ADDITIONAL_PYTHON_DEPS}" ]]; then \
diff --git a/IMAGES.rst b/IMAGES.rst
index 634c4ac8a0..f72f5bb58e 100644
--- a/IMAGES.rst
+++ b/IMAGES.rst
@@ -165,8 +165,7 @@ You can also skip installing airflow and install it from locally provided files
 
 .. code-block:: bash
 
-  breeze build-prod-image --python 3.7 --additional-extras=trino \
-     --airflow-is-in-context-pypi --install-packages-from-context
+  breeze build-prod-image --python 3.7 --additional-extras=trino --install-packages-from-context
 
 In this case you airflow and all packages (.whl files) should be placed in ``docker-context-files`` folder.
 
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
index 2ee164645d..cafca59fde 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -143,7 +143,6 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS = {
             "name": "Customization options (for specific customization needs)",
             "options": [
                 "--install-packages-from-context",
-                "--airflow-is-in-context",
                 "--cleanup-context",
                 "--disable-mysql-client-installation",
                 "--disable-mssql-client-installation",
@@ -266,14 +265,10 @@ def run_build_in_parallel(
     type=BetterChoice(ALLOWED_INSTALLATION_METHODS),
 )
 @option_install_providers_from_sources
-@click.option(
-    '--airflow-is-in-context',
-    help="If set Airflow is installed from docker-context-files only rather than from PyPI or sources.",
-    is_flag=True,
-)
 @click.option(
     '--install-packages-from-context',
-    help='Install wheels from local docker-context-files when building image.',
+    help='Install wheels from local docker-context-files when building image. '
+    'Implies --disable-airflow-repo-cache.',
     is_flag=True,
 )
 @click.option(
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index c37569f85f..65e92400c4 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -43,7 +43,6 @@ class BuildProdParams(CommonBuildParams):
     airflow_constraints_mode: str = "constraints"
     default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
     airflow_constraints_reference: str = ""
-    airflow_is_in_context: bool = False
     cleanup_context: bool = False
     disable_airflow_repo_cache: bool = False
     disable_mssql_client_installation: bool = False
@@ -186,31 +185,19 @@ class BuildProdParams(CommonBuildParams):
 
     @property
     def airflow_pre_cached_pip_packages(self) -> str:
-        airflow_pre_cached_pip = 'true'
-        if not self.airflow_is_in_context or self.disable_airflow_repo_cache:
-            airflow_pre_cached_pip = 'false'
-        return airflow_pre_cached_pip
+        return 'false' if self.disable_airflow_repo_cache else 'true'
 
     @property
     def install_mssql_client(self) -> str:
-        install_mssql = 'true'
-        if self.disable_mssql_client_installation:
-            install_mssql = 'false'
-        return install_mssql
+        return 'false' if self.disable_mssql_client_installation else 'true'
 
     @property
     def install_mysql_client(self) -> str:
-        install_mysql = 'true'
-        if self.disable_mysql_client_installation:
-            install_mysql = 'false'
-        return install_mysql
+        return 'false' if self.disable_mysql_client_installation else 'true'
 
     @property
     def install_postgres_client(self) -> str:
-        install_postgres = 'true'
-        if self.disable_postgres_client_installation:
-            install_postgres = 'false'
-        return install_postgres
+        return 'false' if self.disable_postgres_client_installation else 'true'
 
     @property
     def docker_context_files(self) -> str:
@@ -233,7 +220,6 @@ class BuildProdParams(CommonBuildParams):
             "airflow_image_date_created",
             "airflow_image_readme_url",
             "airflow_image_repository",
-            "airflow_is_in_context",
             "airflow_pre_cached_pip_packages",
             "airflow_version",
             "build_id",
diff --git a/dev/refresh_images.sh b/dev/refresh_images.sh
index 596997d831..7675db65b2 100755
--- a/dev/refresh_images.sh
+++ b/dev/refresh_images.sh
@@ -47,9 +47,7 @@ mv -v ./dist/*.whl ./docker-context-files
 breeze build-prod-image \
      --builder airflow_cache \
      --run-in-parallel \
-     --airflow-is-in-context \
      --install-packages-from-context \
      --prepare-buildx-cache \
-     --disable-airflow-repo-cache \
      --platform linux/amd64,linux/arm64 \
      --verbose
diff --git a/docs/docker-stack/build-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst
index f8e30c02ce..d38dc585fe 100644
--- a/docs/docker-stack/build-arg-ref.rst
+++ b/docs/docker-stack/build-arg-ref.rst
@@ -252,11 +252,6 @@ You can see some examples of those in:
 |                                    |                                          | .whl and .tar.gz files placed in the     |
 |                                    |                                          | ``docker-context-files``.                |
 +------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_IS_IN_CONTEXT``          | ``false``                                | If set to true, it means that Airflow    |
-|                                    |                                          | and providers are available in context   |
-|                                    |                                          | and the image will not attempt to        |
-|                                    |                                          | install Airflow from PyPI or sources.    |
-+------------------------------------+------------------------------------------+------------------------------------------+
 
 Pre-caching PIP dependencies
 ............................
diff --git a/docs/docker-stack/changelog.rst b/docs/docker-stack/changelog.rst
index 9f53bf9987..fc4dcd6847 100644
--- a/docs/docker-stack/changelog.rst
+++ b/docs/docker-stack/changelog.rst
@@ -73,8 +73,7 @@ Airflow 2.3
   * Add Multi-Platform support (AMD64/ARM64) in order to accommodate MacOS M1 users
   * Build parameters which control if packages and Airflow should be installed from context file were
     unified
-  * The ``INSTALL_FROM_PYPI`` arg was replaced to ``AIRFLOW_IS_IN_CONTEXT`` (with reverse meaning and
-    default changed to false)
+  * The ``INSTALL_FROM_PYPI`` arg was removed - it is automatically detected now.
   * The ``INSTALL_FROM_DOCKER_CONTEXT_FILES`` arg changed to ``INSTALL_PACKAGES_FROM_CONTEXT``
 
 Airflow 2.2
diff --git a/generated/README.md b/generated/README.md
new file mode 100644
index 0000000000..f87a767da4
--- /dev/null
+++ b/generated/README.md
@@ -0,0 +1,25 @@
+<!--
+ 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.
+ -->
+
+NOTE! The files in this folder are generated by pre-commit based on airflow sources. They are not
+supposed to be manually modified.
+
+* `provider_dependencies.json` - is generated based on `provider.yaml` files in `airflow/providers` and
+  based on the imports in the provider code. If you want to add new dependency to a provider, you
+  need to modify the corresponding `provider.yaml` file
diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json
new file mode 100644
index 0000000000..203fa5e22a
--- /dev/null
+++ b/generated/provider_dependencies.json
@@ -0,0 +1,734 @@
+{
+  "airbyte": {
+    "deps": [
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "http"
+    ]
+  },
+  "alibaba": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "oss2>=2.14.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "amazon": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "boto3>=1.15.0",
+      "jsonpath_ng>=1.5.3",
+      "mypy-boto3-appflow>=1.21.0",
+      "mypy-boto3-rds>=1.21.0",
+      "mypy-boto3-redshift-data>=1.21.0",
+      "pandas>=0.17.1",
+      "redshift_connector>=2.0.888",
+      "sqlalchemy_redshift>=0.8.6",
+      "watchtower~=2.0.1"
+    ],
+    "cross-providers-deps": [
+      "apache.hive",
+      "cncf.kubernetes",
+      "common.sql",
+      "exasol",
+      "ftp",
+      "google",
+      "imap",
+      "mongo",
+      "salesforce",
+      "ssh"
+    ]
+  },
+  "apache.beam": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "apache-beam>=2.39.0"
+    ],
+    "cross-providers-deps": [
+      "google"
+    ]
+  },
+  "apache.cassandra": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "cassandra-driver>=3.13.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "apache.drill": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "sqlalchemy-drill>=1.1.0",
+      "sqlparse>=0.4.1"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "apache.druid": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pydruid>=0.4.1"
+    ],
+    "cross-providers-deps": [
+      "apache.hive",
+      "common.sql"
+    ]
+  },
+  "apache.hdfs": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "hdfs[avro,dataframe,kerberos]>=2.0.4",
+      "snakebite-py3"
+    ],
+    "cross-providers-deps": []
+  },
+  "apache.hive": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "hmsclient>=0.1.0",
+      "pandas>=0.17.1",
+      "pyhive[hive]>=0.6.0",
+      "sasl>=0.3.1; python_version>=\"3.9\"",
+      "thrift>=0.9.2"
+    ],
+    "cross-providers-deps": [
+      "amazon",
+      "common.sql",
+      "microsoft.mssql",
+      "mysql",
+      "presto",
+      "samba",
+      "vertica"
+    ]
+  },
+  "apache.kylin": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "kylinpy>=2.6"
+    ],
+    "cross-providers-deps": []
+  },
+  "apache.livy": {
+    "deps": [
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "http"
+    ]
+  },
+  "apache.pig": {
+    "deps": [
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "apache.pinot": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pinotdb>0.1.2"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "apache.spark": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "pyspark"
+    ],
+    "cross-providers-deps": []
+  },
+  "apache.sqoop": {
+    "deps": [
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "arangodb": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "python-arango>=7.3.2"
+    ],
+    "cross-providers-deps": []
+  },
+  "asana": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "asana>=0.10"
+    ],
+    "cross-providers-deps": []
+  },
+  "celery": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "celery>=5.2.3,<6",
+      "flower>=1.0.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "cloudant": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "cloudant>=2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "cncf.kubernetes": {
+    "deps": [
+      "apache-airflow>=2.3.0",
+      "cryptography>=2.0.0",
+      "kubernetes>=21.7.0,<24"
+    ],
+    "cross-providers-deps": []
+  },
+  "common.sql": {
+    "deps": [],
+    "cross-providers-deps": []
+  },
+  "databricks": {
+    "deps": [
+      "aiohttp>=3.6.3, <4",
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "databricks-sql-connector>=2.0.0, <3.0.0",
+      "requests>=2.27,<3"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "datadog": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "datadog>=0.14.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "dbt.cloud": {
+    "deps": [
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "http"
+    ]
+  },
+  "dingding": {
+    "deps": [
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "http"
+    ]
+  },
+  "discord": {
+    "deps": [
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "http"
+    ]
+  },
+  "docker": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "docker>=5.0.3"
+    ],
+    "cross-providers-deps": []
+  },
+  "elasticsearch": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "elasticsearch-dbapi",
+      "elasticsearch-dsl>=5.0.0",
+      "elasticsearch>7"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "exasol": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pandas>=0.17.1",
+      "pyexasol>=0.5.1"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "facebook": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "facebook-business>=6.0.2"
+    ],
+    "cross-providers-deps": []
+  },
+  "ftp": {
+    "deps": [],
+    "cross-providers-deps": []
+  },
+  "github": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "pygithub"
+    ],
+    "cross-providers-deps": []
+  },
+  "google": {
+    "deps": [
+      "PyOpenSSL",
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "google-ads>=15.1.1",
+      "google-api-core>=2.7.0,<3.0.0",
+      "google-api-python-client>=1.6.0,<2.0.0",
+      "google-auth-httplib2>=0.0.1",
+      "google-auth>=1.0.0",
+      "google-cloud-aiplatform>=1.7.1,<2.0.0",
+      "google-cloud-automl>=2.1.0",
+      "google-cloud-bigquery-datatransfer>=3.0.0",
+      "google-cloud-bigtable>=1.0.0,<2.0.0",
+      "google-cloud-build>=3.0.0",
+      "google-cloud-container>=2.2.0,<3.0.0",
+      "google-cloud-datacatalog>=3.0.0",
+      "google-cloud-dataplex>=0.1.0",
+      "google-cloud-dataproc-metastore>=1.2.0,<2.0.0",
+      "google-cloud-dataproc>=3.1.0",
+      "google-cloud-dlp>=0.11.0,<2.0.0",
+      "google-cloud-kms>=2.0.0",
+      "google-cloud-language>=1.1.1,<2.0.0",
+      "google-cloud-logging>=2.1.1",
+      "google-cloud-memcache>=0.2.0",
+      "google-cloud-monitoring>=2.0.0",
+      "google-cloud-orchestration-airflow>=1.0.0,<2.0.0",
+      "google-cloud-os-login>=2.0.0",
+      "google-cloud-pubsub>=2.0.0",
+      "google-cloud-redis>=2.0.0",
+      "google-cloud-secret-manager>=0.2.0,<2.0.0",
+      "google-cloud-spanner>=1.10.0,<2.0.0",
+      "google-cloud-speech>=0.36.3,<2.0.0",
+      "google-cloud-storage>=1.30,<2.0.0",
+      "google-cloud-tasks>=2.0.0",
+      "google-cloud-texttospeech>=0.4.0,<2.0.0",
+      "google-cloud-translate>=1.5.0,<2.0.0",
+      "google-cloud-videointelligence>=1.7.0,<2.0.0",
+      "google-cloud-vision>=0.35.2,<2.0.0",
+      "google-cloud-workflows>=0.1.0,<2.0.0",
+      "grpcio-gcp>=0.2.2",
+      "httpx",
+      "json-merge-patch>=0.2",
+      "looker-sdk>=22.2.0",
+      "pandas-gbq",
+      "pandas>=0.17.1",
+      "proto-plus>=1.19.6",
+      "sqlalchemy-bigquery>=1.2.1"
+    ],
+    "cross-providers-deps": [
+      "amazon",
+      "apache.beam",
+      "apache.cassandra",
+      "cncf.kubernetes",
+      "common.sql",
+      "facebook",
+      "microsoft.azure",
+      "microsoft.mssql",
+      "mysql",
+      "oracle",
+      "postgres",
+      "presto",
+      "salesforce",
+      "sftp",
+      "ssh",
+      "trino"
+    ]
+  },
+  "grpc": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "google-auth-httplib2>=0.0.1",
+      "google-auth>=1.0.0, <3.0.0",
+      "grpcio>=1.15.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "hashicorp": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "hvac>=0.10"
+    ],
+    "cross-providers-deps": [
+      "google"
+    ]
+  },
+  "http": {
+    "deps": [
+      "requests>=2.26.0",
+      "requests_toolbelt"
+    ],
+    "cross-providers-deps": []
+  },
+  "imap": {
+    "deps": [],
+    "cross-providers-deps": []
+  },
+  "influxdb": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "influxdb-client>=1.19.0",
+      "requests>=2.26.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "jdbc": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "jaydebeapi>=1.1.1"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "jenkins": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "python-jenkins>=1.0.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "jira": {
+    "deps": [
+      "JIRA>1.0.7",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "microsoft.azure": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "azure-batch>=8.0.0",
+      "azure-cosmos>=4.0.0",
+      "azure-datalake-store>=0.0.45",
+      "azure-identity>=1.3.1",
+      "azure-keyvault-secrets>=4.1.0,<5.0",
+      "azure-kusto-data>=0.0.43,<0.1",
+      "azure-mgmt-containerinstance>=1.5.0,<2.0",
+      "azure-mgmt-datafactory>=1.0.0,<2.0",
+      "azure-mgmt-datalake-store>=0.5.0",
+      "azure-mgmt-resource>=2.2.0",
+      "azure-servicebus>=7.6.1; platform_machine != \"aarch64\"",
+      "azure-storage-blob>=12.7.0,<12.9.0",
+      "azure-storage-common>=2.1.0",
+      "azure-storage-file>=2.1.0"
+    ],
+    "cross-providers-deps": [
+      "google",
+      "oracle",
+      "sftp"
+    ]
+  },
+  "microsoft.mssql": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pymssql>=2.1.5; platform_machine != \"aarch64\""
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "microsoft.psrp": {
+    "deps": [
+      "pypsrp>=0.8.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "microsoft.winrm": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "pywinrm>=0.4"
+    ],
+    "cross-providers-deps": []
+  },
+  "mongo": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "dnspython>=1.13.0",
+      "pymongo>=3.6.0,<4.0.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "mysql": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "mysql-connector-python>=8.0.11; platform_machine != \"aarch64\"",
+      "mysqlclient>=1.3.6; platform_machine != \"aarch64\""
+    ],
+    "cross-providers-deps": [
+      "amazon",
+      "common.sql",
+      "presto",
+      "trino",
+      "vertica"
+    ]
+  },
+  "neo4j": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "neo4j>=4.2.1"
+    ],
+    "cross-providers-deps": []
+  },
+  "odbc": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pyodbc"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "openfaas": {
+    "deps": [
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "opsgenie": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "opsgenie-sdk>=2.1.5"
+    ],
+    "cross-providers-deps": []
+  },
+  "oracle": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "oracledb>=1.0.0"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "pagerduty": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "pdpyras>=4.1.2"
+    ],
+    "cross-providers-deps": []
+  },
+  "papermill": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "papermill[all]>=1.2.1",
+      "scrapbook[all]"
+    ],
+    "cross-providers-deps": []
+  },
+  "plexus": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "arrow>=0.16.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "postgres": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "psycopg2-binary>=2.7.4"
+    ],
+    "cross-providers-deps": [
+      "amazon",
+      "common.sql"
+    ]
+  },
+  "presto": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pandas>=0.17.1",
+      "presto-python-client>=0.8.2"
+    ],
+    "cross-providers-deps": [
+      "common.sql",
+      "google",
+      "slack"
+    ]
+  },
+  "qubole": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "qds-sdk>=1.10.4"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "redis": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "redis~=3.2"
+    ],
+    "cross-providers-deps": []
+  },
+  "salesforce": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "pandas>=0.17.1",
+      "simple-salesforce>=1.0.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "samba": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "smbprotocol>=1.5.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "segment": {
+    "deps": [
+      "analytics-python>=1.2.9",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "sendgrid": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "sendgrid>=6.0.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "sftp": {
+    "deps": [
+      "apache-airflow-providers-ssh>=2.1.0",
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": [
+      "ssh"
+    ]
+  },
+  "singularity": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "spython>=0.0.56"
+    ],
+    "cross-providers-deps": []
+  },
+  "slack": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow-providers-http",
+      "apache-airflow>=2.2.0",
+      "slack_sdk>=3.0.0"
+    ],
+    "cross-providers-deps": [
+      "common.sql",
+      "http"
+    ]
+  },
+  "snowflake": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "snowflake-connector-python>=2.4.1",
+      "snowflake-sqlalchemy>=1.1.0"
+    ],
+    "cross-providers-deps": [
+      "common.sql",
+      "slack"
+    ]
+  },
+  "sqlite": {
+    "deps": [
+      "apache-airflow-providers-common-sql"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "ssh": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "paramiko>=2.6.0",
+      "sshtunnel>=0.3.2"
+    ],
+    "cross-providers-deps": []
+  },
+  "tableau": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "tableauserverclient"
+    ],
+    "cross-providers-deps": []
+  },
+  "tabular": {
+    "deps": [
+      "apache-airflow>=2.2.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "telegram": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "python-telegram-bot>=13.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "trino": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "pandas>=0.17.1",
+      "trino>=0.301.0"
+    ],
+    "cross-providers-deps": [
+      "common.sql",
+      "google"
+    ]
+  },
+  "vertica": {
+    "deps": [
+      "apache-airflow-providers-common-sql",
+      "apache-airflow>=2.2.0",
+      "vertica-python>=0.5.1"
+    ],
+    "cross-providers-deps": [
+      "common.sql"
+    ]
+  },
+  "yandex": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "yandexcloud>=0.146.0"
+    ],
+    "cross-providers-deps": []
+  },
+  "zendesk": {
+    "deps": [
+      "apache-airflow>=2.2.0",
+      "zenpy>=2.0.24"
+    ],
+    "cross-providers-deps": []
+  }
+}
diff --git a/images/breeze/output-build-prod-image.svg b/images/breeze/output-build-prod-image.svg
index 3d6122bc3f..dbb2b1d56e 100644
--- a/images/breeze/output-build-prod-image.svg
+++ b/images/breeze/output-build-prod-image.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2026.3999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2002.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,365 +19,361 @@
         font-weight: 700;
     }
 
-    .terminal-1181880005-matrix {
+    .terminal-4196591838-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-1181880005-title {
+    .terminal-4196591838-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-1181880005-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-1181880005-r2 { fill: #c5c8c6 }
-.terminal-1181880005-r3 { fill: #d0b344;font-weight: bold }
-.terminal-1181880005-r4 { fill: #868887 }
-.terminal-1181880005-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-1181880005-r6 { fill: #98a84b;font-weight: bold }
-.terminal-1181880005-r7 { fill: #8d7b39 }
+    .terminal-4196591838-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-4196591838-r2 { fill: #c5c8c6 }
+.terminal-4196591838-r3 { fill: #d0b344;font-weight: bold }
+.terminal-4196591838-r4 { fill: #868887 }
+.terminal-4196591838-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-4196591838-r6 { fill: #98a84b;font-weight: bold }
+.terminal-4196591838-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-1181880005-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1975.3999999999999" />
+    <clipPath id="terminal-4196591838-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1951.0" />
     </clipPath>
-    <clipPath id="terminal-1181880005-line-0">
+    <clipPath id="terminal-4196591838-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-1">
+<clipPath id="terminal-4196591838-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-2">
+<clipPath id="terminal-4196591838-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-3">
+<clipPath id="terminal-4196591838-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-4">
+<clipPath id="terminal-4196591838-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-5">
+<clipPath id="terminal-4196591838-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-6">
+<clipPath id="terminal-4196591838-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-7">
+<clipPath id="terminal-4196591838-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-8">
+<clipPath id="terminal-4196591838-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-9">
+<clipPath id="terminal-4196591838-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-10">
+<clipPath id="terminal-4196591838-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-11">
+<clipPath id="terminal-4196591838-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-12">
+<clipPath id="terminal-4196591838-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-13">
+<clipPath id="terminal-4196591838-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-14">
+<clipPath id="terminal-4196591838-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-15">
+<clipPath id="terminal-4196591838-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-16">
+<clipPath id="terminal-4196591838-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-17">
+<clipPath id="terminal-4196591838-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-18">
+<clipPath id="terminal-4196591838-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-19">
+<clipPath id="terminal-4196591838-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-20">
+<clipPath id="terminal-4196591838-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-21">
+<clipPath id="terminal-4196591838-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-22">
+<clipPath id="terminal-4196591838-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-23">
+<clipPath id="terminal-4196591838-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-24">
+<clipPath id="terminal-4196591838-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-25">
+<clipPath id="terminal-4196591838-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-26">
+<clipPath id="terminal-4196591838-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-27">
+<clipPath id="terminal-4196591838-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-28">
+<clipPath id="terminal-4196591838-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-29">
+<clipPath id="terminal-4196591838-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-30">
+<clipPath id="terminal-4196591838-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-31">
+<clipPath id="terminal-4196591838-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-32">
+<clipPath id="terminal-4196591838-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-33">
+<clipPath id="terminal-4196591838-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-34">
+<clipPath id="terminal-4196591838-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-35">
+<clipPath id="terminal-4196591838-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-36">
+<clipPath id="terminal-4196591838-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-37">
+<clipPath id="terminal-4196591838-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-38">
+<clipPath id="terminal-4196591838-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-39">
+<clipPath id="terminal-4196591838-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-40">
+<clipPath id="terminal-4196591838-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-41">
+<clipPath id="terminal-4196591838-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-42">
+<clipPath id="terminal-4196591838-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-43">
+<clipPath id="terminal-4196591838-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-44">
+<clipPath id="terminal-4196591838-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-45">
+<clipPath id="terminal-4196591838-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-46">
+<clipPath id="terminal-4196591838-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-47">
+<clipPath id="terminal-4196591838-line-47">
     <rect x="0" y="1148.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-48">
+<clipPath id="terminal-4196591838-line-48">
     <rect x="0" y="1172.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-49">
+<clipPath id="terminal-4196591838-line-49">
     <rect x="0" y="1197.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-50">
+<clipPath id="terminal-4196591838-line-50">
     <rect x="0" y="1221.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-51">
+<clipPath id="terminal-4196591838-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-52">
+<clipPath id="terminal-4196591838-line-52">
     <rect x="0" y="1270.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-53">
+<clipPath id="terminal-4196591838-line-53">
     <rect x="0" y="1294.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-54">
+<clipPath id="terminal-4196591838-line-54">
     <rect x="0" y="1319.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-55">
+<clipPath id="terminal-4196591838-line-55">
     <rect x="0" y="1343.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-56">
+<clipPath id="terminal-4196591838-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-57">
+<clipPath id="terminal-4196591838-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-58">
+<clipPath id="terminal-4196591838-line-58">
     <rect x="0" y="1416.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-59">
+<clipPath id="terminal-4196591838-line-59">
     <rect x="0" y="1441.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-60">
+<clipPath id="terminal-4196591838-line-60">
     <rect x="0" y="1465.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-61">
+<clipPath id="terminal-4196591838-line-61">
     <rect x="0" y="1489.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-62">
+<clipPath id="terminal-4196591838-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-63">
+<clipPath id="terminal-4196591838-line-63">
     <rect x="0" y="1538.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-64">
+<clipPath id="terminal-4196591838-line-64">
     <rect x="0" y="1563.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-65">
+<clipPath id="terminal-4196591838-line-65">
     <rect x="0" y="1587.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-66">
+<clipPath id="terminal-4196591838-line-66">
     <rect x="0" y="1611.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-67">
+<clipPath id="terminal-4196591838-line-67">
     <rect x="0" y="1636.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-68">
+<clipPath id="terminal-4196591838-line-68">
     <rect x="0" y="1660.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-69">
+<clipPath id="terminal-4196591838-line-69">
     <rect x="0" y="1685.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-70">
+<clipPath id="terminal-4196591838-line-70">
     <rect x="0" y="1709.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-71">
+<clipPath id="terminal-4196591838-line-71">
     <rect x="0" y="1733.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-72">
+<clipPath id="terminal-4196591838-line-72">
     <rect x="0" y="1758.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-73">
+<clipPath id="terminal-4196591838-line-73">
     <rect x="0" y="1782.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-74">
+<clipPath id="terminal-4196591838-line-74">
     <rect x="0" y="1807.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-75">
+<clipPath id="terminal-4196591838-line-75">
     <rect x="0" y="1831.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-76">
+<clipPath id="terminal-4196591838-line-76">
     <rect x="0" y="1855.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-77">
+<clipPath id="terminal-4196591838-line-77">
     <rect x="0" y="1880.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-78">
+<clipPath id="terminal-4196591838-line-78">
     <rect x="0" y="1904.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-79">
-    <rect x="0" y="1929.1" width="1464" height="24.65"/>
-            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2024.4" rx="8"/><text class="terminal-1181880005-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;build-prod-image</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2000" rx="8"/><text class="terminal-4196591838-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;build-prod-image</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-1181880005-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-4196591838-clip-terminal)">
     
-    <g class="terminal-1181880005-matrix">
-    <text class="terminal-1181880005-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1181880005-line-0)">
-</text><text class="terminal-1181880005-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-1)">Usage:&#160;</text><text class="terminal-1181880005-r1" x="97.6" y="44.4" textLength="402.6" clip-path="url(#terminal-1181880005-line-1)">breeze&#160;build-prod-image&#160;[OPTIONS]</text><text class="terminal-1181880005-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-1)">
-</text><text class="terminal-1181880005-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-2)">
-</text><text class="terminal-1181880005-r2" x="12.2" y="93.2" textLength="1293.2" clip-path="url(#terminal-1181880005-line-3)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;for&#160;all&#160;or&#160;selected&#160;Python&#160;versions&#160;sequentially.</text><text class="terminal-1181880005-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-3)">
-</text><text class="terminal-1181880005-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-4)">
-</text><text class="terminal-1181880005-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1181880005-line-5)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1181880005-line-5)">&#160;Basic&#160;usage&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-118188 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-6)">│</text><text class="terminal-1181880005-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-6)">-</text><text class="terminal-1181880005-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-6)">-python</text><text class="terminal-1181880005-r6" x="427" y="166.4" textLength="24.4" clip-path="url(#terminal-118 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-7)">│</text><text class="terminal-1181880005-r7" x="475.8" y="190.8" textLength="732" clip-path="url(#terminal-1181880005-line-7)">(&gt;3.7&lt;&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-8)">│</text><text class="terminal-1181880005-r4" x="475.8" y="215.2" textLength="732" clip-path="url(#terminal-1181880005-line-8)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-1181880005-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-9)">│</text><text class="terminal-1181880005-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-9)">-</text><text class="terminal-1181880005-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-9)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="239.6" textLength="195.2" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1181880005-line-10)">│</text><text class="terminal-1181880005-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-1181880005-line-10)">-</text><text class="terminal-1181880005-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#terminal-1181880005-line-10)">-upgrade</text><text class="terminal-1181880005-r5" x="134.2" y="264" textLength="268.4" clip-path="url(#terminal-1181 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-11)">│</text><text class="terminal-1181880005-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-11)">-</text><text class="terminal-1181880005-r5" x="36.6" y="288.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-11)">-debian</text><text class="terminal-1181880005-r5" x="122" y="288.4" textLength="97.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-12)">│</text><text class="terminal-1181880005-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-12)">-</text><text class="terminal-1181880005-r5" x="36.6" y="312.8" textLength="73.2" clip-path="url(#terminal-1181880005-line-12)">-image</text><text class="terminal-1181880005-r5" x="109.8" y="312.8" textLength="48.8" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-13)">│</text><text class="terminal-1181880005-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-13)">-</text><text class="terminal-1181880005-r5" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-1181880005-line-13)">-tag</text><text class="terminal-1181880005-r5" x="85.4" y="337.2" textLength="122" clip-path="url(#terminal-118 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-14)">│</text><text class="terminal-1181880005-r2" x="475.8" y="361.6" textLength="414.8" clip-path="url(#terminal-1181880005-line-14)">when&#160;you&#160;build&#160;or&#160;pull&#160;image&#160;with&#160;</text><text class="terminal-1181880005-r5" x="890.6" y="361.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-14)">-</text><text class="terminal-1181880005- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1181880005-line-15)">│</text><text class="terminal-1181880005-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-1181880005-line-15)">-</text><text class="terminal-1181880005-r5" x="36.6" y="386" textLength="85.4" clip-path="url(#terminal-1181880005-line-15)">-docker</text><text class="terminal-1181880005-r5" x="122" y="386" textLength="73.2" clip-path="url(#terminal-11818800 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-16)">│</text><text class="terminal-1181880005-r4" x="475.8" y="410.4" textLength="549" clip-path="url(#terminal-1181880005-line-16)">[default:&#160;registry]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1181880005-r4" x="1451.8" y="41 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="434.8" textLength="1464" clip-path="url(#terminal-1181880005-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-17)">
-</text><text class="terminal-1181880005-r4" x="0" y="459.2" textLength="24.4" clip-path="url(#terminal-1181880005-line-18)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="459.2" textLength="1415.2" clip-path="url(#terminal-1181880005-line-18)">&#160;Building&#160;images&#160;in&#160;parallel&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="459.2" textLength="24.4" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-19)">│</text><text class="terminal-1181880005-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-19)">-</text><text class="terminal-1181880005-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-1181880005-line-19)">-run</text><text class="terminal-1181880005-r5" x="85.4" y="483.6" textLength="146.4" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1181880005-line-20)">│</text><text class="terminal-1181880005-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-1181880005-line-20)">-</text><text class="terminal-1181880005-r5" x="36.6" y="508" textLength="146.4" clip-path="url(#terminal-1181880005-line-20)">-parallelism</text><text class="terminal-1181880005-r2" x="280.6" y="508" textLength="915" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-21)">│</text><text class="terminal-1181880005-r4" x="280.6" y="532.4" textLength="915" clip-path="url(#terminal-1181880005-line-21)">[default:&#160;4;&#160;1&lt;=x&lt;=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 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-22)">│</text><text class="terminal-1181880005-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-22)">-</text><text class="terminal-1181880005-r5" x="36.6" y="556.8" textLength="85.4" clip-path="url(#terminal-1181880005-line-22)">-python</text><text class="terminal-1181880005-r5" x="122" y="556.8" textLength="109.8" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-23)">│</text><text class="terminal-1181880005-r4" x="280.6" y="581.2" textLength="951.6" clip-path="url(#terminal-1181880005-line-23)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="605.6" textLength="1464" clip-path="url(#terminal-1181880005-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-24)">
-</text><text class="terminal-1181880005-r4" x="0" y="630" textLength="24.4" clip-path="url(#terminal-1181880005-line-25)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="630" textLength="1415.2" clip-path="url(#terminal-1181880005-line-25)">&#160;Options&#160;for&#160;customizing&#160;images&#160;────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="630" textLength="24.4" clip-path="url(#ter [...]
-</text><text class="terminal-1181880005-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-26)">│</text><text class="terminal-1181880005-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-26)">-</text><text class="terminal-1181880005-r5" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-26)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="654.4" textLength="280.6" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-27)">│</text><text class="terminal-1181880005-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-27)">-</text><text class="terminal-1181880005-r5" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-27)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="678.8" textLength="85.4" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-28)">│</text><text class="terminal-1181880005-r7" x="463.6" y="703.2" textLength="976" clip-path="url(#terminal-1181880005-line-28)">(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; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-29)">│</text><text class="terminal-1181880005-r4" x="463.6" y="727.6" textLength="976" clip-path="url(#terminal-1181880005-line-29)">[default:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1181880005-line-30)">│</text><text class="terminal-1181880005-r4" x="463.6" y="752" textLength="976" clip-path="url(#terminal-1181880005-line-30)">amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google…</text><text class="terminal-1181880005-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-1181880005-line-30)">│</text><text class="terminal-1181880 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-31)">│</text><text class="terminal-1181880005-r5" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-31)">-</text><text class="terminal-1181880005-r5" x="36.6" y="776.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-31)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="776.4" textLength="207.4" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-32)">│</text><text class="terminal-1181880005-r7" x="463.6" y="800.8" textLength="866.2" clip-path="url(#terminal-1181880005-line-32)">(constraints&#160;|&#160;constraints-no-providers&#160;|&#160;constraints-source-providers)</text><text class="terminal-1181880005-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-32)">│</text><text clas [...]
-</text><text class="terminal-1181880005-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-33)">│</text><text class="terminal-1181880005-r4" x="463.6" y="825.2" textLength="866.2" clip-path="url(#terminal-1181880005-line-33)">[default:&#160;constraints]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-1181880005-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-34)">│</text><text class="terminal-1181880005-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-34)">-</text><text class="terminal-1181880005-r5" x="36.6" y="849.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-34)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="849.6" textLength="268.4" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1181880005-line-35)">│</text><text class="terminal-1181880005-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-1181880005-line-35)">-</text><text class="terminal-1181880005-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-1181880005-line-35)">-python</text><text class="terminal-1181880005-r5" x="122" y="874" textLength="73.2" clip-path="url(#terminal-11818800 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-36)">│</text><text class="terminal-1181880005-r2" x="463.6" y="898.4" textLength="976" clip-path="url(#terminal-1181880005-line-36)">something&#160;like:&#160;python:VERSION-slim-bullseye&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-37)">│</text><text class="terminal-1181880005-r7" x="463.6" y="922.8" textLength="976" clip-path="url(#terminal-1181880005-line-37)">(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; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-38)">│</text><text class="terminal-1181880005-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-38)">-</text><text class="terminal-1181880005-r5" x="36.6" y="947.2" textLength="134.2" clip-path="url(#terminal-1181880005-line-38)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="947.2" textLength="146.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-39)">│</text><text class="terminal-1181880005-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-39)">-</text><text class="terminal-1181880005-r5" x="36.6" y="971.6" textLength="134.2" clip-path="url(#terminal-1181880005-line-39)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="971.6" textLength="85.4" clip-path="url(#te [...]
-</text><text class="terminal-1181880005-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-1181880005-line-40)">│</text><text class="terminal-1181880005-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-1181880005-line-40)">-</text><text class="terminal-1181880005-r5" x="36.6" y="996" textLength="134.2" clip-path="url(#terminal-1181880005-line-40)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="996" textLength="207.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-41)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-41)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1020.4" textLength="134.2" clip-path="url(#terminal-1181880005-line-41)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1020.4" textLength="195.2" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-42)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-42)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1044.8" textLength="134.2" clip-path="url(#terminal-1181880005-line-42)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1044.8" textLength="244" clip-path="url( [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-43)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-43)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1069.2" textLength="134.2" clip-path="url(#terminal-1181880005-line-43)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1069.2" textLength="158.6" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-44)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-44)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1093.6" textLength="134.2" clip-path="url(#terminal-1181880005-line-44)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1093.6" textLength="146.4" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1181880005-line-45)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-1181880005-line-45)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1118" textLength="134.2" clip-path="url(#terminal-1181880005-line-45)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1118" textLength="195.2" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-46)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-46)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1142.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-46)">-runtime</text><text class="terminal-1181880005-r5" x="134.2" y="1142.4" textLength="109.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-47)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-47)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1166.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-47)">-runtime</text><text class="terminal-1181880005-r5" x="134.2" y="1166.8" textLength="146.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-48)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-48)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1191.2" textLength="48.8" clip-path="url(#terminal-1181880005-line-48)">-dev</text><text class="terminal-1181880005-r5" x="85.4" y="1191.2" textLength="109.8" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-49)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-49)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1215.6" textLength="48.8" clip-path="url(#terminal-1181880005-line-49)">-dev</text><text class="terminal-1181880005-r5" x="85.4" y="1215.6" textLength="146.4" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-1181880005-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-1181880005-line-50)">
-</text><text class="terminal-1181880005-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-1181880005-line-51)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-1181880005-line-51)">&#160;Customization&#160;options&#160;(for&#160;specific&#160;customization&#160;needs)&#160;──────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1264.4" textLength="24.4"  [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-52)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-52)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1288.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-52)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="1288.8" textLength="268.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-53)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-53)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1313.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-53)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="1313.2" textLength="170.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-54)">│</text><text class="terminal-1181880005-r2" x="536.8" y="1337.6" textLength="902.8" clip-path="url(#terminal-1181880005-line-54)">from&#160;PyPI&#160;or&#160;sources.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-1181880005-line-55)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#terminal-1181880005-line-55)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1362" textLength="97.6" clip-path="url(#terminal-1181880005-line-55)">-cleanup</text><text class="terminal-1181880005-r5" x="134.2" y="1362" textLength="97.6" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-56)">│</text><text class="terminal-1181880005-r2" x="536.8" y="1386.4" textLength="170.8" clip-path="url(#terminal-1181880005-line-56)">together&#160;with&#160;</text><text class="terminal-1181880005-r5" x="707.6" y="1386.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-56)">-</text><text class="terminal-1181880005-r5" x="719.8" y="1386.4" textLength="97.6" [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-57)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-57)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1410.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-57)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1410.8" textLength="317.2" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-58)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-58)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1435.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-58)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1435.2" textLength="317.2" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-59)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-59)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-59)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1459.6" textLength="353.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-1181880005-line-60)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#terminal-1181880005-line-60)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1484" textLength="97.6" clip-path="url(#terminal-1181880005-line-60)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1484" textLength="231.8" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-61)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-61)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1508.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-61)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="1508.4" textLength="219.6" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1532.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-62)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-62)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1532.8" textLength="158.6" clip-path="url(#terminal-1181880005-line-62)">-installation</text><text class="terminal-1181880005-r5" x="195.2" y="1532.8" textLength="85.4" clip-path="u [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1557.2" textLength="1464" clip-path="url(#terminal-1181880005-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-63)">
-</text><text class="terminal-1181880005-r4" x="0" y="1581.6" textLength="24.4" clip-path="url(#terminal-1181880005-line-64)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1581.6" textLength="1415.2" clip-path="url(#terminal-1181880005-line-64)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;─────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1581.6" textLeng [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-1181880005-line-65)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1606" textLength="12.2" clip-path="url(#terminal-1181880005-line-65)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1606" textLength="85.4" clip-path="url(#terminal-1181880005-line-65)">-github</text><text class="terminal-1181880005-r5" x="122" y="1606" textLength="73.2" clip-path="url(#terminal-1181 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-66)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-66)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1630.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-66)">-github</text><text class="terminal-1181880005-r5" x="122" y="1630.4" textLength="109.8" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1654.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-67)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1654.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-67)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1654.8" textLength="109.8" clip-path="url(#terminal-1181880005-line-67)">-platform</text><text class="terminal-1181880005-r2" x="341.6" y="1654.8" textLength="329.4" clip-path="url( [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-68)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1679.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-68)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1679.2" textLength="61" clip-path="url(#terminal-1181880005-line-68)">-push</text><text class="terminal-1181880005-r5" x="97.6" y="1679.2" textLength="73.2" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-69)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1703.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-69)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1703.6" textLength="73.2" clip-path="url(#terminal-1181880005-line-69)">-empty</text><text class="terminal-1181880005-r5" x="109.8" y="1703.6" textLength="73.2" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-1181880005-line-70)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1728" textLength="12.2" clip-path="url(#terminal-1181880005-line-70)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1728" textLength="97.6" clip-path="url(#terminal-1181880005-line-70)">-prepare</text><text class="terminal-1181880005-r5" x="134.2" y="1728" textLength="158.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-71)">│</text><text class="terminal-1181880005-r2" x="341.6" y="1752.4" textLength="1098" clip-path="url(#terminal-1181880005-line-71)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1776.8" textLength="1464" clip-path="url(#terminal-1181880005-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1776.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-72)">
-</text><text class="terminal-1181880005-r4" x="0" y="1801.2" textLength="24.4" clip-path="url(#terminal-1181880005-line-73)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1801.2" textLength="1415.2" clip-path="url(#terminal-1181880005-line-73)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1801.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-74)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-74)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1825.6" textLength="85.4" clip-path="url(#terminal-1181880005-line-74)">-github</text><text class="terminal-1181880005-r5" x="122" y="1825.6" textLength="134.2" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-1181880005-line-75)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1850" textLength="12.2" clip-path="url(#terminal-1181880005-line-75)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1850" textLength="97.6" clip-path="url(#terminal-1181880005-line-75)">-builder</text><text class="terminal-1181880005-r2" x="329.4" y="1850" textLength="744.2" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-76)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-76)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1874.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-76)">-answer</text><text class="terminal-1181880005-r6" x="280.6" y="1874.4" textLength="24.4" clip-path="url(#ter [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-77)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-77)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1898.8" textLength="48.8" clip-path="url(#terminal-1181880005-line-77)">-dry</text><text class="terminal-1181880005-r5" x="85.4" y="1898.8" textLength="48.8" clip-path="url(#termina [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-78)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-78)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1923.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-78)">-verbose</text><text class="terminal-1181880005-r6" x="280.6" y="1923.2" textLength="24.4" clip-path="url(#te [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1947.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-79)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-79)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1947.6" textLength="61" clip-path="url(#terminal-1181880005-line-79)">-help</text><text class="terminal-1181880005-r6" x="280.6" y="1947.6" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1972" textLength="1464" clip-path="url(#terminal-1181880005-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1972" textLength="12.2" clip-path="url(#terminal-1181880005-line-80)">
+    <g class="terminal-4196591838-matrix">
+    <text class="terminal-4196591838-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-4196591838-line-0)">
+</text><text class="terminal-4196591838-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-1)">Usage:&#160;</text><text class="terminal-4196591838-r1" x="97.6" y="44.4" textLength="402.6" clip-path="url(#terminal-4196591838-line-1)">breeze&#160;build-prod-image&#160;[OPTIONS]</text><text class="terminal-4196591838-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-1)">
+</text><text class="terminal-4196591838-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-2)">
+</text><text class="terminal-4196591838-r2" x="12.2" y="93.2" textLength="1293.2" clip-path="url(#terminal-4196591838-line-3)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;for&#160;all&#160;or&#160;selected&#160;Python&#160;versions&#160;sequentially.</text><text class="terminal-4196591838-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-3)">
+</text><text class="terminal-4196591838-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-4)">
+</text><text class="terminal-4196591838-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-4196591838-line-5)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-4196591838-line-5)">&#160;Basic&#160;usage&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-419659 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-6)">│</text><text class="terminal-4196591838-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-6)">-</text><text class="terminal-4196591838-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-6)">-python</text><text class="terminal-4196591838-r6" x="427" y="166.4" textLength="24.4" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-7)">│</text><text class="terminal-4196591838-r7" x="475.8" y="190.8" textLength="732" clip-path="url(#terminal-4196591838-line-7)">(&gt;3.7&lt;&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-8)">│</text><text class="terminal-4196591838-r4" x="475.8" y="215.2" textLength="732" clip-path="url(#terminal-4196591838-line-8)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4196591838-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-9)">│</text><text class="terminal-4196591838-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-9)">-</text><text class="terminal-4196591838-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-9)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="239.6" textLength="195.2" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-4196591838-line-10)">│</text><text class="terminal-4196591838-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-4196591838-line-10)">-</text><text class="terminal-4196591838-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#terminal-4196591838-line-10)">-upgrade</text><text class="terminal-4196591838-r5" x="134.2" y="264" textLength="268.4" clip-path="url(#terminal-4196 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-11)">│</text><text class="terminal-4196591838-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-11)">-</text><text class="terminal-4196591838-r5" x="36.6" y="288.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-11)">-debian</text><text class="terminal-4196591838-r5" x="122" y="288.4" textLength="97.6" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-12)">│</text><text class="terminal-4196591838-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-12)">-</text><text class="terminal-4196591838-r5" x="36.6" y="312.8" textLength="73.2" clip-path="url(#terminal-4196591838-line-12)">-image</text><text class="terminal-4196591838-r5" x="109.8" y="312.8" textLength="48.8" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-13)">│</text><text class="terminal-4196591838-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-13)">-</text><text class="terminal-4196591838-r5" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-4196591838-line-13)">-tag</text><text class="terminal-4196591838-r5" x="85.4" y="337.2" textLength="122" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-14)">│</text><text class="terminal-4196591838-r2" x="475.8" y="361.6" textLength="414.8" clip-path="url(#terminal-4196591838-line-14)">when&#160;you&#160;build&#160;or&#160;pull&#160;image&#160;with&#160;</text><text class="terminal-4196591838-r5" x="890.6" y="361.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-14)">-</text><text class="terminal-4196591838- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-4196591838-line-15)">│</text><text class="terminal-4196591838-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-4196591838-line-15)">-</text><text class="terminal-4196591838-r5" x="36.6" y="386" textLength="85.4" clip-path="url(#terminal-4196591838-line-15)">-docker</text><text class="terminal-4196591838-r5" x="122" y="386" textLength="73.2" clip-path="url(#terminal-41965918 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-16)">│</text><text class="terminal-4196591838-r4" x="475.8" y="410.4" textLength="549" clip-path="url(#terminal-4196591838-line-16)">[default:&#160;registry]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4196591838-r4" x="1451.8" y="41 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="434.8" textLength="1464" clip-path="url(#terminal-4196591838-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-17)">
+</text><text class="terminal-4196591838-r4" x="0" y="459.2" textLength="24.4" clip-path="url(#terminal-4196591838-line-18)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="459.2" textLength="1415.2" clip-path="url(#terminal-4196591838-line-18)">&#160;Building&#160;images&#160;in&#160;parallel&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="459.2" textLength="24.4" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-19)">│</text><text class="terminal-4196591838-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-19)">-</text><text class="terminal-4196591838-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-4196591838-line-19)">-run</text><text class="terminal-4196591838-r5" x="85.4" y="483.6" textLength="146.4" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-4196591838-line-20)">│</text><text class="terminal-4196591838-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-4196591838-line-20)">-</text><text class="terminal-4196591838-r5" x="36.6" y="508" textLength="146.4" clip-path="url(#terminal-4196591838-line-20)">-parallelism</text><text class="terminal-4196591838-r2" x="280.6" y="508" textLength="915" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-21)">│</text><text class="terminal-4196591838-r4" x="280.6" y="532.4" textLength="915" clip-path="url(#terminal-4196591838-line-21)">[default:&#160;4;&#160;1&lt;=x&lt;=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 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-22)">│</text><text class="terminal-4196591838-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-22)">-</text><text class="terminal-4196591838-r5" x="36.6" y="556.8" textLength="85.4" clip-path="url(#terminal-4196591838-line-22)">-python</text><text class="terminal-4196591838-r5" x="122" y="556.8" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-23)">│</text><text class="terminal-4196591838-r4" x="280.6" y="581.2" textLength="951.6" clip-path="url(#terminal-4196591838-line-23)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="605.6" textLength="1464" clip-path="url(#terminal-4196591838-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-24)">
+</text><text class="terminal-4196591838-r4" x="0" y="630" textLength="24.4" clip-path="url(#terminal-4196591838-line-25)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="630" textLength="1415.2" clip-path="url(#terminal-4196591838-line-25)">&#160;Options&#160;for&#160;customizing&#160;images&#160;────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="630" textLength="24.4" clip-path="url(#ter [...]
+</text><text class="terminal-4196591838-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-26)">│</text><text class="terminal-4196591838-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-26)">-</text><text class="terminal-4196591838-r5" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-26)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="654.4" textLength="280.6" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-27)">│</text><text class="terminal-4196591838-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-27)">-</text><text class="terminal-4196591838-r5" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-27)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="678.8" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-28)">│</text><text class="terminal-4196591838-r7" x="463.6" y="703.2" textLength="976" clip-path="url(#terminal-4196591838-line-28)">(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; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-29)">│</text><text class="terminal-4196591838-r4" x="463.6" y="727.6" textLength="976" clip-path="url(#terminal-4196591838-line-29)">[default:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-4196591838-line-30)">│</text><text class="terminal-4196591838-r4" x="463.6" y="752" textLength="976" clip-path="url(#terminal-4196591838-line-30)">amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google…</text><text class="terminal-4196591838-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-4196591838-line-30)">│</text><text class="terminal-4196591 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-31)">│</text><text class="terminal-4196591838-r5" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-31)">-</text><text class="terminal-4196591838-r5" x="36.6" y="776.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-31)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="776.4" textLength="207.4" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-32)">│</text><text class="terminal-4196591838-r7" x="463.6" y="800.8" textLength="866.2" clip-path="url(#terminal-4196591838-line-32)">(constraints&#160;|&#160;constraints-no-providers&#160;|&#160;constraints-source-providers)</text><text class="terminal-4196591838-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-32)">│</text><text clas [...]
+</text><text class="terminal-4196591838-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-33)">│</text><text class="terminal-4196591838-r4" x="463.6" y="825.2" textLength="866.2" clip-path="url(#terminal-4196591838-line-33)">[default:&#160;constraints]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4196591838-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-34)">│</text><text class="terminal-4196591838-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-34)">-</text><text class="terminal-4196591838-r5" x="36.6" y="849.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-34)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="849.6" textLength="268.4" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-4196591838-line-35)">│</text><text class="terminal-4196591838-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-4196591838-line-35)">-</text><text class="terminal-4196591838-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-4196591838-line-35)">-python</text><text class="terminal-4196591838-r5" x="122" y="874" textLength="73.2" clip-path="url(#terminal-41965918 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-36)">│</text><text class="terminal-4196591838-r2" x="463.6" y="898.4" textLength="976" clip-path="url(#terminal-4196591838-line-36)">something&#160;like:&#160;python:VERSION-slim-bullseye&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-37)">│</text><text class="terminal-4196591838-r7" x="463.6" y="922.8" textLength="976" clip-path="url(#terminal-4196591838-line-37)">(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; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-38)">│</text><text class="terminal-4196591838-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-38)">-</text><text class="terminal-4196591838-r5" x="36.6" y="947.2" textLength="134.2" clip-path="url(#terminal-4196591838-line-38)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="947.2" textLength="146.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-39)">│</text><text class="terminal-4196591838-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-39)">-</text><text class="terminal-4196591838-r5" x="36.6" y="971.6" textLength="134.2" clip-path="url(#terminal-4196591838-line-39)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="971.6" textLength="85.4" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-4196591838-line-40)">│</text><text class="terminal-4196591838-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-4196591838-line-40)">-</text><text class="terminal-4196591838-r5" x="36.6" y="996" textLength="134.2" clip-path="url(#terminal-4196591838-line-40)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="996" textLength="207.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-41)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-41)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1020.4" textLength="134.2" clip-path="url(#terminal-4196591838-line-41)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1020.4" textLength="195.2" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-42)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-42)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1044.8" textLength="134.2" clip-path="url(#terminal-4196591838-line-42)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1044.8" textLength="244" clip-path="url( [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-43)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-43)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1069.2" textLength="134.2" clip-path="url(#terminal-4196591838-line-43)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1069.2" textLength="158.6" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-44)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-44)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1093.6" textLength="134.2" clip-path="url(#terminal-4196591838-line-44)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1093.6" textLength="146.4" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-4196591838-line-45)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-4196591838-line-45)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1118" textLength="134.2" clip-path="url(#terminal-4196591838-line-45)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1118" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-46)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-46)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1142.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-46)">-runtime</text><text class="terminal-4196591838-r5" x="134.2" y="1142.4" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-47)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-47)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1166.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-47)">-runtime</text><text class="terminal-4196591838-r5" x="134.2" y="1166.8" textLength="146.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-48)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-48)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1191.2" textLength="48.8" clip-path="url(#terminal-4196591838-line-48)">-dev</text><text class="terminal-4196591838-r5" x="85.4" y="1191.2" textLength="109.8" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-49)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-49)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1215.6" textLength="48.8" clip-path="url(#terminal-4196591838-line-49)">-dev</text><text class="terminal-4196591838-r5" x="85.4" y="1215.6" textLength="146.4" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-4196591838-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-4196591838-line-50)">
+</text><text class="terminal-4196591838-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-4196591838-line-51)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-4196591838-line-51)">&#160;Customization&#160;options&#160;(for&#160;specific&#160;customization&#160;needs)&#160;──────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1264.4" textLength="24.4"  [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-52)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-52)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1288.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-52)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="1288.8" textLength="268.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-53)">│</text><text class="terminal-4196591838-r2" x="536.8" y="1313.2" textLength="97.6" clip-path="url(#terminal-4196591838-line-53)">Implies&#160;</text><text class="terminal-4196591838-r5" x="634.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-53)">-</text><text class="terminal-4196591838-r5" x="646.6" y="1313.2" textLength="97.6" clip-path=" [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-54)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-54)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1337.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-54)">-cleanup</text><text class="terminal-4196591838-r5" x="134.2" y="1337.6" textLength="97.6" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-4196591838-line-55)">│</text><text class="terminal-4196591838-r2" x="536.8" y="1362" textLength="170.8" clip-path="url(#terminal-4196591838-line-55)">together&#160;with&#160;</text><text class="terminal-4196591838-r5" x="707.6" y="1362" textLength="12.2" clip-path="url(#terminal-4196591838-line-55)">-</text><text class="terminal-4196591838-r5" x="719.8" y="1362" textLength="97.6" clip-pa [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-56)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-56)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1386.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-56)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1386.4" textLength="317.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-57)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-57)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1410.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-57)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1410.8" textLength="317.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-58)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-58)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1435.2" textLength="97.6" clip-path="url(#terminal-4196591838-line-58)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1435.2" textLength="353.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-59)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-59)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-59)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1459.6" textLength="231.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-4196591838-line-60)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#terminal-4196591838-line-60)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1484" textLength="97.6" clip-path="url(#terminal-4196591838-line-60)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="1484" textLength="219.6" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-61)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-61)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1508.4" textLength="158.6" clip-path="url(#terminal-4196591838-line-61)">-installation</text><text class="terminal-4196591838-r5" x="195.2" y="1508.4" textLength="85.4" clip-path="u [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1532.8" textLength="1464" clip-path="url(#terminal-4196591838-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-62)">
+</text><text class="terminal-4196591838-r4" x="0" y="1557.2" textLength="24.4" clip-path="url(#terminal-4196591838-line-63)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1557.2" textLength="1415.2" clip-path="url(#terminal-4196591838-line-63)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;─────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1557.2" textLeng [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-64)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1581.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-64)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1581.6" textLength="85.4" clip-path="url(#terminal-4196591838-line-64)">-github</text><text class="terminal-4196591838-r5" x="122" y="1581.6" textLength="73.2" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-4196591838-line-65)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1606" textLength="12.2" clip-path="url(#terminal-4196591838-line-65)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1606" textLength="85.4" clip-path="url(#terminal-4196591838-line-65)">-github</text><text class="terminal-4196591838-r5" x="122" y="1606" textLength="109.8" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-66)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-66)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1630.4" textLength="109.8" clip-path="url(#terminal-4196591838-line-66)">-platform</text><text class="terminal-4196591838-r2" x="341.6" y="1630.4" textLength="329.4" clip-path="url( [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1654.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-67)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1654.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-67)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1654.8" textLength="61" clip-path="url(#terminal-4196591838-line-67)">-push</text><text class="terminal-4196591838-r5" x="97.6" y="1654.8" textLength="73.2" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-68)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1679.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-68)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1679.2" textLength="73.2" clip-path="url(#terminal-4196591838-line-68)">-empty</text><text class="terminal-4196591838-r5" x="109.8" y="1679.2" textLength="73.2" clip-path="url(#term [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-69)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1703.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-69)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1703.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-69)">-prepare</text><text class="terminal-4196591838-r5" x="134.2" y="1703.6" textLength="158.6" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-4196591838-line-70)">│</text><text class="terminal-4196591838-r2" x="341.6" y="1728" textLength="1098" clip-path="url(#terminal-4196591838-line-70)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1752.4" textLength="1464" clip-path="url(#terminal-4196591838-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1752.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-71)">
+</text><text class="terminal-4196591838-r4" x="0" y="1776.8" textLength="24.4" clip-path="url(#terminal-4196591838-line-72)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1776.8" textLength="1415.2" clip-path="url(#terminal-4196591838-line-72)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1776.8" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1801.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-73)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1801.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-73)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1801.2" textLength="85.4" clip-path="url(#terminal-4196591838-line-73)">-github</text><text class="terminal-4196591838-r5" x="122" y="1801.2" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-74)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-74)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1825.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-74)">-builder</text><text class="terminal-4196591838-r2" x="329.4" y="1825.6" textLength="744.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-4196591838-line-75)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1850" textLength="12.2" clip-path="url(#terminal-4196591838-line-75)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1850" textLength="85.4" clip-path="url(#terminal-4196591838-line-75)">-answer</text><text class="terminal-4196591838-r6" x="280.6" y="1850" textLength="24.4" clip-path="url(#terminal-41 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-76)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-76)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1874.4" textLength="48.8" clip-path="url(#terminal-4196591838-line-76)">-dry</text><text class="terminal-4196591838-r5" x="85.4" y="1874.4" textLength="48.8" clip-path="url(#termina [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-77)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-77)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1898.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-77)">-verbose</text><text class="terminal-4196591838-r6" x="280.6" y="1898.8" textLength="24.4" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-78)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-78)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1923.2" textLength="61" clip-path="url(#terminal-4196591838-line-78)">-help</text><text class="terminal-4196591838-r6" x="280.6" y="1923.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1947.6" textLength="1464" clip-path="url(#terminal-4196591838-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1947.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-79)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index a3b911c335..774cb26c3f 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -5,7 +5,7 @@
 main:fa4319079b275ce966502346f083f2e3
 build-docs:20b1a171a93c8ae1a62a0f3a804501f2
 build-image:b00ae014f9c45c116e8dd0ea72b61d19
-build-prod-image:4a3950d1a61aeb61218eb45659574139
+build-prod-image:6c614f9c76e776912dc1cf4506d2b6f5
 cleanup:9a94bd1063296ea86e895f671db0b330
 command-hash-export:83bc6a4a8c60b62da3d0f00e81d2c3ea
 config:92653afc11889e1b78e3a2e38f41107f
diff --git a/scripts/ci/libraries/_initialization.sh b/scripts/ci/libraries/_initialization.sh
index e7c96b20b5..96d3a65bf7 100644
--- a/scripts/ci/libraries/_initialization.sh
+++ b/scripts/ci/libraries/_initialization.sh
@@ -459,11 +459,6 @@ function initialization::initialize_image_build_variables() {
     # Determines which providers are used to generate constraints - source, pypi or no providers
     export AIRFLOW_CONSTRAINTS_MODE=${AIRFLOW_CONSTRAINTS_MODE:="constraints-source-providers"}
 
-    # By default we install latest airflow from PyPI or sources. You can set this parameter to false
-    # if Airflow is in the .whl or .tar.gz packages placed in `docker-context-files` folder and you want
-    # to skip installing Airflow/Providers from PyPI or sources.
-    export AIRFLOW_IS_IN_CONTEXT="${AIRFLOW_IS_IN_CONTEXT:="false"}"
-
     # whether installation should be performed from the local wheel packages in "docker-context-files" folder
     export INSTALL_PACKAGES_FROM_CONTEXT="${INSTALL_PACKAGES_FROM_CONTEXT:="false"}"
 
@@ -715,7 +710,6 @@ Common image build variables:
 
     INSTALL_AIRFLOW_VERSION: '${INSTALL_AIRFLOW_VERSION}'
     INSTALL_AIRFLOW_REFERENCE: '${INSTALL_AIRFLOW_REFERENCE}'
-    AIRFLOW_IS_IN_CONTEXT: '${AIRFLOW_IS_IN_CONTEXT}'
     AIRFLOW_PRE_CACHED_PIP_PACKAGES: '${AIRFLOW_PRE_CACHED_PIP_PACKAGES}'
     UPGRADE_TO_NEWER_DEPENDENCIES: '${UPGRADE_TO_NEWER_DEPENDENCIES}'
     CHECK_IMAGE_FOR_REBUILD: '${CHECK_IMAGE_FOR_REBUILD}'
@@ -858,7 +852,6 @@ function initialization::make_constants_read_only() {
     readonly IMAGE_TAG
 
     readonly AIRFLOW_PRE_CACHED_PIP_PACKAGES
-    readonly AIRFLOW_IS_IN_CONTEXT
     readonly INSTALL_PACKAGES_FROM_CONTEXT
     readonly AIRFLOW_CONSTRAINTS_REFERENCE
     readonly AIRFLOW_CONSTRAINTS_LOCATION


[airflow] 12/12: Limit astroid version to < 2.12 (#24982)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 06e4976aaf3236d06b7e6ec85a796f82718ddfcd
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 12 02:32:41 2022 +0200

    Limit astroid version to < 2.12 (#24982)
    
    Astroid 2.12 released 9th of July breaks documentation building
    with sphinx-autoapi.
    
    Issue about it has been opened in
    https://github.com/PyCQA/astroid/issues/1708
    
    Until it is fixed, we should limit astroid.
    
    (cherry picked from commit ee564ef9e57707ef07db1c3353a1406e47d8e3db)
---
 docs/apache-airflow-providers-github/index.rst | 7 +++++++
 setup.py                                       | 5 +++++
 2 files changed, 12 insertions(+)

diff --git a/docs/apache-airflow-providers-github/index.rst b/docs/apache-airflow-providers-github/index.rst
index 3f3d7d5478..abd5d901d3 100644
--- a/docs/apache-airflow-providers-github/index.rst
+++ b/docs/apache-airflow-providers-github/index.rst
@@ -60,6 +60,13 @@ Content
 
     Detailed list of commits <commits>
 
+.. toctree::
+    :hidden:
+    :caption: System tests
+
+    System Tests <_api/tests/system/providers/github/index>
+
+
 .. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN AT RELEASE TIME!
 
 
diff --git a/setup.py b/setup.py
index 3eb2673042..0c31292513 100644
--- a/setup.py
+++ b/setup.py
@@ -24,6 +24,7 @@ import sys
 import unittest
 from copy import deepcopy
 from os.path import dirname, relpath
+from pathlib import Path
 from textwrap import wrap
 from typing import Dict, List
 
@@ -46,6 +47,7 @@ logger = logging.getLogger(__name__)
 
 version = '2.3.3'
 
+AIRFLOW_SOURCES_ROOT = Path(__file__).parent.resolve()
 my_dir = dirname(__file__)
 
 
@@ -278,6 +280,9 @@ deprecated_api = [
     'requests>=2.26.0',
 ]
 doc = [
+    # Astroid 2.12.* breaks documentation building
+    # We can remove the limit here after https://github.com/PyCQA/astroid/issues/1708 is solved
+    'astroid<2.12.0',
     'click>=8.0',
     'sphinx>=4.4.0',
     # Docutils 0.17.0 converts generated <div class="section"> into <section> and breaks our doc formatting


[airflow] 07/12: Update description of branch creation to include the new Breeze (#25155)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f18e1657496239f8d0ae91124f2670605d97badd
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 23:08:39 2022 +0200

    Update description of branch creation to include the new Breeze (#25155)
    
    * Update description of branch creation to include the new Breeze
    
    The new Breeze has a different place where default branch and
    constraints branch are kept.
    
    When we create a new "release" branch we should update it here
    as well as in the bash legacy breeze (until the bash breeze has
    stil some zombies around)
    
    (cherry picked from commit 8923e3ab0304caafd011253b52e2d644066f58fc)
---
 dev/README_RELEASE_AIRFLOW.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 287b642d69..f699e04ab2 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -341,6 +341,8 @@ Run script to re-tag images from the ``main`` branch to the  ``vX-Y-test`` branc
 
 ### Update default branches
 
+#### In the legacy, bash breeze (to be removed when the bash breeze is entirely gone)
+
 In ``./scripts/ci/libraries/_intialization.sh`` update branches to reflect the new branch:
 
 ```bash
@@ -363,6 +365,22 @@ values for comparison and regexp):
         AIRFLOW_BRANCH_FOR_PYPI_PRELOADING="vX-Y-stable"
 ```
 
+#### In the new breeze
+
+In ``./dev/breeze/src/airflow_breeze/branch_defaults.py`` update branches to reflect the new branch:
+
+```python
+AIRFLOW_BRANCH = "main"
+DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-main"
+```
+
+should become this, where ``X-Y`` is your new branch version:
+
+```python
+AIRFLOW_BRANCH = "vX-Y-test"
+DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-X-Y"
+```
+
 ### Commit the changes to the test branch
 
 ```bash


[airflow] 03/12: Speed up Kubernetes tests ~30% on main. (#25143)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fa0b5b73c248a9aec8d6b407cc35840dd8ae4058
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 13:37:00 2022 +0200

    Speed up Kubernetes tests ~30% on main. (#25143)
    
    We should have enough resources - we were limiting them to 2 parallel
    runs (we assumed 4 CPUs are needed for full K8S tests). However
    monitoring shows that ~20/30% memory and up to 4 CPUs are used
    when 2 tests are running in parallel (on a big instance) but the tests
    have also some peaks that might cause more than 3 parallel tests to fail.
    
    We currently run 5 tests so increasing the limit to 3 for self-hosted
    runners should actually speed it up quite a bit (generally speaking we
    had to run 2 tests in parallel twice and 5th test was run as standalone.
    By increasing the limit to 3 we switch to 3x, 2x mode - which not only
    will safe 30% of the time, but also has a free "slot" for one more
    K8S version.
    
    (cherry picked from commit b97d9b068368c76c52abdfbf972af5b7c93ea314)
---
 .github/workflows/ci.yml          |  4 ++--
 scripts/ci/libraries/_parallel.sh | 14 ++++----------
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 71514b8245..86666cf17a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1454,7 +1454,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-kubernetes:
     timeout-minutes: 240
-    name: Helm Chart; ${{matrix.executor}}
+    name: Helm Chart; ${{matrix.executor}} - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     strategy:
@@ -1524,7 +1524,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-helm-executor-upgrade:
     timeout-minutes: 150
-    name: Helm Chart Executor Upgrade
+    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     env:
diff --git a/scripts/ci/libraries/_parallel.sh b/scripts/ci/libraries/_parallel.sh
index c09ca656c7..e3bf5acb0e 100644
--- a/scripts/ci/libraries/_parallel.sh
+++ b/scripts/ci/libraries/_parallel.sh
@@ -252,16 +252,10 @@ function parallel::get_maximum_parallel_k8s_jobs() {
         echo
         export MAX_PARALLEL_K8S_JOBS="1"
     else
-        if [[ ${MAX_PARALLEL_K8S_JOBS=} != "" ]]; then
-            echo
-            echo "${COLOR_YELLOW}Maximum parallel k8s jobs forced vi MAX_PARALLEL_K8S_JOBS = ${MAX_PARALLEL_K8S_JOBS}${COLOR_RESET}"
-            echo
-        else
-            MAX_PARALLEL_K8S_JOBS=$((CPUS_AVAILABLE_FOR_DOCKER / 4))
-            echo
-            echo "${COLOR_YELLOW}Maximum parallel k8s jobs set to number of CPUs available for Docker = ${MAX_PARALLEL_K8S_JOBS}${COLOR_RESET}"
-            echo
-        fi
+        echo
+        echo "${COLOR_YELLOW}This is a Self-Hosted runner - forcing max parallel jobs to 5${COLOR_RESET}"
+        echo
+        export MAX_PARALLEL_K8S_JOBS="3"
     fi
     export MAX_PARALLEL_K8S_JOBS
 }


[airflow] 09/12: Fix missing space for breeze build-image hint command (#25204)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 994a0410f44064fee083f1576b084cff59c3cb32
Author: Gabriel Machado <ga...@hotmail.com>
AuthorDate: Thu Jul 21 00:23:49 2022 +0200

    Fix missing space for breeze build-image hint command (#25204)
    
    (cherry picked from commit 88b529d5ccf60a2394eb68c001fd782f4f9a60d5)
---
 dev/breeze/src/airflow_breeze/commands/release_management_commands.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 87dae0c9a2..ed62f68cb8 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -445,7 +445,7 @@ def generate_constraints(
             )
             get_console().print("\n[info]Use this command to build the image:[/]\n")
             get_console().print(
-                f"     breeze build-image --python'{shell_params.python}' "
+                f"     breeze build-image --python '{shell_params.python}' "
                 f"--upgrade-to-newer-dependencies\n"
             )
         sys.exit(1)


[airflow] 08/12: Move javascript compilation to host (#25169)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 60bc1ce6d66418bfe9eed3a010af90bd4388b80a
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Jul 20 19:30:03 2022 +0200

    Move javascript compilation to host (#25169)
    
    Previously, in order to keep consistent development environment
    we've compiled javascript in the CI image. However we can utilise
    power of pre-commmit for setting the node environment for all
    contributors automatically. Instead of compiling the javascript
    in the image, we can compile it via pre-commit in the host.
    
    This can be done thanks to the new python breeze which is far more
    flexible and can now add execution of compilation of the javascript when
    needed and using pre-commit environments.
    
    Thanks to that, we can vastly simplify the Dockerfiles and scripts that
    are used to automatically build or signal that the assets need
    recompilation. We can basically assume that the assets were prepared
    outside of the image building (and breeze makes sure it happens)
    
    The changes:
    
    * node.js is not needed in images (neither PROD build nor CI)
    * no need for multiple asset compilation scripts. All is done
      via pre-commit environment with `breeze compile-www-assets``
      command
    * lint checks for UI do not need the docker image any more
      (they are also based on pre-commit environment)
    * no more checks/warnings when you enter the image
    * start-airflow command builds the compilation before entering
    * prepare-airflow-package runs asset compilation before entering
      docker airflow building.
    
    (cherry picked from commit acff1296886d222cc411a99bb3276465ab03e36b)
---
 .dockerignore                                      |   9 +-
 .github/boring-cyborg.yml                          |   1 -
 .github/workflows/build-images.yml                 |   4 +
 .github/workflows/ci.yml                           |   8 +
 .gitignore                                         |   2 +-
 .pre-commit-config.yaml                            |  65 +++-
 BREEZE.rst                                         |  36 +-
 CONTRIBUTING.rst                                   |  32 +-
 Dockerfile                                         | 128 +------
 Dockerfile.ci                                      | 135 +-------
 STATIC_CODE_CHECKS.rst                             |   8 +-
 airflow/www/ask_for_recompile_assets_if_needed.sh  |  56 ---
 breeze-legacy                                      |   8 -
 .../airflow_breeze/commands/developer_commands.py  |  24 ++
 .../commands/release_management_commands.py        |   3 +-
 dev/breeze/src/airflow_breeze/global_constants.py  |   8 -
 .../src/airflow_breeze/params/build_prod_params.py |  10 -
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |   3 +
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |  31 ++
 docs/docker-stack/build-arg-ref.rst                |  10 -
 images/breeze/output-commands-hash.txt             |   3 +-
 images/breeze/output-commands.svg                  | 384 +++++++++++----------
 images/breeze/output-compile-www-assets.svg        |  99 ++++++
 images/breeze/output-static-checks.svg             | 228 ++++++------
 scripts/ci/libraries/_initialization.sh            |  28 --
 .../ci/pre_commit/pre_commit_compile_www_assets.py |  28 +-
 scripts/ci/pre_commit/pre_commit_ui_lint.py        |  40 +--
 scripts/ci/pre_commit/pre_commit_www_lint.py       |  41 +--
 scripts/docker/compile_www_assets.sh               |  71 ----
 scripts/docker/entrypoint_ci.sh                    |   7 +-
 scripts/docker/prepare_node_modules.sh             |  52 ---
 scripts/in_container/_in_container_utils.sh        |  24 +-
 .../in_container/run_prepare_airflow_packages.sh   |   2 +-
 .../internal_api/__init__.py                       |  18 -
 .../compile_assets.sh => tests/system/__init__.py  |  18 -
 .../system/providers/__init__.py                   |  18 -
 .../system/providers/apache/__init__.py            |  18 -
 .../system/providers/google/__init__.py            |  18 -
 38 files changed, 611 insertions(+), 1067 deletions(-)

diff --git a/.dockerignore b/.dockerignore
index 69a3bbfca6..f412505e99 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -74,18 +74,15 @@
 !setup.cfg
 !setup.py
 !manifests
+!generated
 # Now - ignore unnecessary files inside allowed directories
 # This goes after the allowed directories
 
 # Git version is dynamically generated
 airflow/git_version
 
-# Exclude static www files generated by NPM
-airflow/www/static/coverage
-airflow/www/static/dist
+# Exclude mode_modules pulled by "yarn" for compilation of www files generated by NPM
 airflow/www/node_modules
-# Exclude static ui files generated by NPM
-airflow/ui/build
 airflow/ui/node_modules
 
 # Exclude link to docs
@@ -99,7 +96,7 @@ airflow/www/static/docs
 **/env/
 **/build/
 **/develop-eggs/
-**/dist/
+/dist/
 **/downloads/
 **/eggs/
 **/.eggs/
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index 607d4fb6cd..39d7718d7b 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -119,7 +119,6 @@ labelPRBasedOnFilePath:
     - airflow/www/.eslintrc
     - airflow/www/.stylelintignore
     - airflow/www/.stylelintrc
-    - airflow/www/compile_assets.sh
     - airflow/www/package.json
     - airflow/www/webpack.config.js
     - airflow/www/yarn.lock
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index 4485e5c68d..2757646887 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -232,6 +232,8 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           breeze static-checks --type update-providers-dependencies --all-files
           --show-diff-on-failure --color always || true
         if: needs.build-info.outputs.default-branch == 'main'
+      - name: Compile www assets
+        run: breeze compile-www-assets
       - name: >-
           Build & Push AMD64 CI images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
@@ -343,6 +345,8 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
+      - name: Compile www assets
+        run: breeze compile-www-assets
       - name: >-
           Build & Push PROD images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c459b7001d..78ef756b4f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -349,6 +349,11 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         if: >
           needs.build-info.outputs.in-workflow-build == 'true' &&
           needs.build-info.outputs.default-branch == 'main'
+      - name: Compile www assets
+        run: breeze compile-www-assets
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
       - name: >
           Build & Push CI images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
@@ -448,6 +453,9 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
         if: needs.build-info.outputs.in-workflow-build == 'true'
+      - name: Compile www assets
+        run: breeze compile-www-assets
+        if: needs.build-info.outputs.in-workflow-build == 'true'
       - name: >
           Build & Push PROD images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
diff --git a/.gitignore b/.gitignore
index fe3d74aa23..694e3ecf17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,7 @@ unittests.db
 # Airflow temporary artifacts
 airflow/git_version
 airflow/www/static/coverage/
-airflow/www/static/dist
+airflow/www/*.log
 
 /logs/
 airflow-webserver.pid
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 77da7b91ec..0efe856658 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -298,7 +298,7 @@ repos:
         exclude: ^airflow/_vendor/|^RELEASE_NOTES\.txt$|^airflow/www/static/css/material-icons\.css$|^images/.*$
         args:
           - --ignore-words=docs/spelling_wordlist.txt
-          - --skip=docs/*/commits.rst,airflow/providers/*/*.rst,*.lock,INTHEWILD.md,*.min.js,docs/apache-airflow/pipeline_example.csv
+          - --skip=docs/*/commits.rst,airflow/providers/*/*.rst,*.lock,INTHEWILD.md,*.min.js,docs/apache-airflow/pipeline_example.csv,airflow/www/*.log
           - --exclude-file=.codespellignorelines
   - repo: local
     hooks:
@@ -582,9 +582,20 @@ repos:
         name: stylelint
         entry: "stylelint"
         language: node
+        language_version: 18.6.0
         files: ^airflow/www/.*\.(css|scss|sass)$
         # Keep dependency versions in sync w/ airflow/www/package.json
         additional_dependencies: ['stylelint@13.3.1', 'stylelint-config-standard@20.0.0']
+      - id: compile-www-assets
+        name: Compile www assets
+        language: node
+        language_version: 18.6.0
+        stages: ['manual']
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/www/
+        entry: ./scripts/ci/pre_commit/pre_commit_compile_www_assets.py
+        pass_filenames: false
+        additional_dependencies: ['yarn@1.22.19']
       - id: check-providers-init-file-missing
         name: Provider init file is missing
         pass_filenames: false
@@ -657,6 +668,7 @@ repos:
         description: Checks the style of Markdown files.
         entry: markdownlint
         language: node
+        language_version: 18.6.0
         types: [markdown]
         files: \.(md|mdown|markdown)$
         additional_dependencies: ['markdownlint-cli']
@@ -777,6 +789,41 @@ repos:
         files: newsfragments/.*\.rst
         entry: ./scripts/ci/pre_commit/pre_commit_newsfragments.py
         pass_filenames: true
+        # We sometimes won't have newsfragments in the repo, so always run it so `check-hooks-apply` passes
+        # This is fast, so not too much downside
+        always_run: true
+      - id: check-system-tests-tocs
+        name: Check that system tests is properly added
+        entry: ./scripts/ci/pre_commit/pre_commit_check_system_tests_hidden_in_index.py
+        language: python
+        pass_filenames: true
+        files: ^docs/apache-airflow-providers-[^/]*/index\.rst$
+        additional_dependencies: ['rich>=12.4.4', 'pyyaml']
+      - id: create-missing-init-py-files-tests
+        name: Create missing init.py files in tests
+        entry: ./scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
+        language: python
+        additional_dependencies: ['rich>=12.4.4']
+        pass_filenames: false
+        files: ^tests/.*\.py$
+      - id: lint-javascript
+        name: ESLint against airflow/ui
+        language: node
+        language_version: 18.6.0
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/ui/
+        entry: ./scripts/ci/pre_commit/pre_commit_ui_lint.py
+        pass_filenames: false
+        additional_dependencies: ['yarn@1.22.19']
+      - id: lint-javascript
+        name: ESLint against current UI JavaScript files
+        language: node
+        language_version: 18.6.0
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/www/static/js/
+        entry: ./scripts/ci/pre_commit/pre_commit_www_lint.py
+        additional_dependencies: ['yarn@1.22.19']
+        pass_filenames: false
         ## ADD MOST PRE-COMMITS ABOVE THAT LINE
         # The below pre-commits are those requiring CI image to be built
       - id: run-mypy
@@ -817,22 +864,6 @@ repos:
         pass_filenames: true
         exclude: ^airflow/_vendor/
         additional_dependencies: ['rich>=12.4.4', 'inputimeout']
-      - id: lint-javascript
-        name: ESLint against airflow/ui
-        language: python
-        'types_or': [javascript, tsx, ts]
-        files: ^airflow/ui/
-        entry: ./scripts/ci/pre_commit/pre_commit_ui_lint.py
-        pass_filenames: false
-        additional_dependencies: ['rich>=12.4.4', 'inputimeout']
-      - id: lint-javascript
-        name: ESLint against current UI JavaScript files
-        language: python
-        'types_or': [javascript]
-        files: ^airflow/www/static/js/
-        entry: ./scripts/ci/pre_commit/pre_commit_www_lint.py
-        pass_filenames: false
-        additional_dependencies: ['rich>=12.4.4', 'inputimeout']
       - id: update-migration-references
         name: Update migration ref doc
         language: python
diff --git a/BREEZE.rst b/BREEZE.rst
index 3a3034b06f..1489e2158c 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -438,6 +438,16 @@ regenerate all those images (which might be needed in case new version of rich i
   :alt: Breeze regenerate-command-images
 
 
+Compiling www assets
+====================
+
+Airflow webserver needs to prepare www assets - compiled with node and yarn. The ``compile-www-assets``
+command takes care about it. This is needed when you want to run webserver inside of the breeze.
+
+.. image:: ./images/breeze/output-compile-www-assets.svg
+  :width: 100%
+  :alt: Breeze compile-www-assets
+
 Starting complete Airflow installation
 ======================================
 
@@ -445,6 +455,13 @@ For testing Airflow oyou often want to start multiple components (in multiple te
 built-in ``start-airflow`` command that start breeze container, launches multiple terminals using tmux
 and launches all Airflow necessary components in those terminals.
 
+When you are starting airflow from local sources, www asset compilation is automatically executed before.
+
+.. code-block:: bash
+
+    breeze --python 3.7 --backend mysql start-airflow
+
+
 You can also use it to start any released version of Airflow from ``PyPI`` with the
 ``--use-airflow-version`` flag.
 
@@ -496,6 +513,7 @@ Those are commands mostly used by contributors:
 * Execute arbitrary command in the test environment with ``breeze shell`` command
 * Enter interactive shell in CI container when ``shell`` (or no command) is specified
 * Start containerised, development-friendly airflow installation with ``breeze start-airflow`` command
+* Compile www assets for webserver ``breeze compile-www-assets`` command
 * Build documentation with ``breeze build-docs`` command
 * Initialize local virtualenv with ``./scripts/tools/initialize_virtualenv.py`` command
 * Run static checks with autocomplete support ``breeze static-checks`` command
@@ -1575,24 +1593,14 @@ If you set these variables, next time when you enter the environment the new por
 Managing Dependencies
 ---------------------
 
-If you need to change apt dependencies in the ``Dockerfile.ci``, add Python packages in ``setup.py`` or
-add JavaScript dependencies in ``package.json``, you can either add dependencies temporarily for a single
-Breeze session or permanently in ``setup.py``, ``Dockerfile.ci``, or ``package.json`` files.
-
-Installing Dependencies for a Single Breeze Session
-...................................................
-
-You can install dependencies inside the container using ``sudo apt install``, ``pip install`` or
-``yarn install`` (in ``airflow/www`` folder) respectively. This is useful if you want to test something
-quickly while you are in the container. However, these changes are not retained: they disappear once you
-exit the container (except for the node.js dependencies if your sources are mounted to the container).
-Therefore, if you want to retain a new dependency, follow the second option described below.
+If you need to change apt dependencies in the ``Dockerfile.ci``, add Python packages in ``setup.py``
+for airflow and in provider.yaml for packages. If you add any "node" dependencies in ``airflow/www``
+or ``airflow/ui``, you need to compile them in the host with ``breeze compile-www-assets`` command.
 
 Adding Dependencies Permanently
 ...............................
 
-You can add dependencies to the ``Dockerfile.ci``, ``setup.py`` or ``package.json`` and rebuild the image.
-This should happen automatically if you modify any of these files.
+You can add dependencies to the ``Dockerfile.ci``, ``setup.py``.
 After you exit the container and re-run ``breeze``, Breeze detects changes in dependencies,
 asks you to confirm rebuilding the image and proceeds with rebuilding if you confirm (or skip it
 if you do not confirm). After rebuilding is done, Breeze drops you to shell. You may also use the
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 1904c15abe..facd5d9863 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -1162,12 +1162,12 @@ itself comes bundled with jQuery and bootstrap. While they may be phased out
 over time, these packages are currently not managed with yarn.
 
 Make sure you are using recent versions of node and yarn. No problems have been
-found with node\>=8.11.3 and yarn\>=1.19.1.
+found with node\>=8.11.3 and yarn\>=1.19.1. The pre-commit framework of ours install
+node and yarn automatically when installed - if you use ``breeze`` you do not need to install
+neither node nor yarn.
 
-Installing yarn and its packages
---------------------------------
-
-Make sure yarn is available in your environment.
+Installing yarn and its packages manually
+-----------------------------------------
 
 To install yarn on macOS:
 
@@ -1191,27 +1191,6 @@ To install yarn on macOS:
     export PATH="$HOME/.yarn/bin:$PATH"
 
 4.  Install third-party libraries defined in ``package.json`` by running the
-    following commands within the ``airflow/www/`` directory:
-
-
-.. code-block:: bash
-
-    # from the root of the repository, move to where our JS package.json lives
-    cd airflow/www/
-    # run yarn install to fetch all the dependencies
-    yarn install
-
-
-These commands install the libraries in a new ``node_modules/`` folder within
-``www/``.
-
-Should you add or upgrade a node package, run
-``yarn add --dev <package>`` for packages needed in development or
-``yarn add <package>`` for packages used by the code.
-Then push the newly generated ``package.json`` and ``yarn.lock`` file so that we
-could get a reproducible build. See the `Yarn docs
-<https://yarnpkg.com/en/docs/cli/add#adding-dependencies->`_ for more details.
-
 
 Generate Bundled Files with yarn
 --------------------------------
@@ -1225,6 +1204,7 @@ commands:
     yarn run prod
 
     # Starts a web server that manages and updates your assets as you modify them
+    # You'll need to run the webserver in debug mode too: ``airflow webserver -d``
     yarn run dev
 
 
diff --git a/Dockerfile b/Dockerfile
index b4ddddef80..7fd6b8bbf6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -397,101 +397,6 @@ function common::show_pip_version_and_location() {
 }
 EOF
 
-# The content below is automatically copied from scripts/docker/prepare_node_modules.sh
-COPY <<"EOF" /prepare_node_modules.sh
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
-EOF
-
-# The content below is automatically copied from scripts/docker/compile_www_assets.sh
-COPY <<"EOF" /compile_www_assets.sh
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
-EOF
-
 # The content below is automatically copied from scripts/docker/pip
 COPY <<"EOF" /pip
 #!/usr/bin/env bash
@@ -1120,7 +1025,6 @@ ARG DEV_APT_DEPS="\
      libssl-dev \
      locales  \
      lsb-release \
-     nodejs \
      openssh-client \
      sasl2-bin \
      software-properties-common \
@@ -1132,9 +1036,7 @@ ARG DEV_APT_DEPS="\
 
 ARG ADDITIONAL_DEV_APT_DEPS=""
 ARG DEV_APT_COMMAND="\
-    curl --silent --fail --location https://deb.nodesource.com/setup_14.x | \
-        bash -o pipefail -o errexit -o nolog - \
-    && curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \
+    curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \
     apt-key add - >/dev/null 2>&1\
     && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list"
 ARG ADDITIONAL_DEV_APT_COMMAND="echo"
@@ -1196,18 +1098,10 @@ ARG INSTALL_PROVIDERS_FROM_SOURCES="false"
 # But it also can be `.` from local installation or GitHub URL pointing to specific branch or tag
 # Of Airflow. Note That for local source installation you need to have local sources of
 # Airflow checked out together with the Dockerfile and AIRFLOW_SOURCES_FROM and AIRFLOW_SOURCES_TO
-# set to "." and "/opt/airflow" respectively. Similarly AIRFLOW_SOURCES_WWW_FROM/TO are set to right source
-# and destination
+# set to "." and "/opt/airflow" respectively.
 ARG AIRFLOW_INSTALLATION_METHOD="apache-airflow"
 # By default we do not upgrade to latest dependencies
 ARG UPGRADE_TO_NEWER_DEPENDENCIES="false"
-# By default we install latest airflow from PyPI so we do not need to copy sources of Airflow
-# www to compile the assets but in case of breeze/CI builds we use latest sources and we override those
-# those SOURCES_FROM/TO with "airflow/www" and "/opt/airflow/airflow/www" respectively.
-# This is to rebuild the assets only when any of the www sources change
-ARG AIRFLOW_SOURCES_WWW_FROM="Dockerfile"
-ARG AIRFLOW_SOURCES_WWW_TO="/Dockerfile"
-
 # By default we install latest airflow from PyPI so we do not need to copy sources of Airflow
 # but in case of breeze/CI builds we use latest sources and we override those
 # those SOURCES_FROM/TO with "." and "/opt/airflow" respectively
@@ -1303,26 +1197,8 @@ RUN bash /scripts/docker/install_pip_version.sh; \
         bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
     fi
 
-COPY --from=scripts compile_www_assets.sh prepare_node_modules.sh /scripts/docker/
-COPY --chown=airflow:0 ${AIRFLOW_SOURCES_WWW_FROM} ${AIRFLOW_SOURCES_WWW_TO}
-
-# hadolint ignore=SC2086, SC2010
-RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
-        # only prepare node modules and compile assets if the prod image is build from sources
-        # otherwise they are already compiled-in the package.
-        bash /scripts/docker/prepare_node_modules.sh; \
-        REMOVE_ARTIFACTS="true" BUILD_TYPE="prod" bash /scripts/docker/compile_www_assets.sh; \
-        # Copy generated dist folder (otherwise it will be overridden by the COPY step below)
-        mv -f /opt/airflow/airflow/www/static/dist /tmp/dist; \
-    fi;
-
 COPY --chown=airflow:0 ${AIRFLOW_SOURCES_FROM} ${AIRFLOW_SOURCES_TO}
 
-# Copy back the generated dist folder
-RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
-        mv -f /tmp/dist /opt/airflow/airflow/www/static/dist; \
-    fi;
-
 # Add extra python dependencies
 ARG ADDITIONAL_PYTHON_DEPS=""
 
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 4abaa4ad44..c06534357d 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -384,101 +384,6 @@ common::get_colors
 install_pipx_tools
 EOF
 
-# The content below is automatically copied from scripts/docker/prepare_node_modules.sh
-COPY <<"EOF" /prepare_node_modules.sh
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
-EOF
-
-# The content below is automatically copied from scripts/docker/compile_www_assets.sh
-COPY <<"EOF" /compile_www_assets.sh
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
-EOF
-
 # The content below is automatically copied from scripts/docker/install_airflow.sh
 COPY <<"EOF" /install_airflow.sh
 
@@ -663,11 +568,6 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
         echo
         echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
         echo
-        if [[ -d "${AIRFLOW_SOURCES}/airflow/www/" ]]; then
-            pushd "${AIRFLOW_SOURCES}/airflow/www/" >/dev/null
-            ./ask_for_recompile_assets_if_needed.sh
-            popd >/dev/null
-        fi
         # Cleanup the logs, tmp when entering the environment
         sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
         sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
@@ -795,6 +695,8 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
     touch /usr/lib/google-cloud-sdk/bin/gcloud
     ln -s -f /usr/bin/gcloud /usr/lib/google-cloud-sdk/bin/gcloud
 
+    in_container_fix_ownership
+
     if [[ ${SKIP_SSH_SETUP="false"} == "false" ]]; then
         # Set up ssh keys
         echo 'yes' | ssh-keygen -t rsa -C your_email@youremail.com -m PEM -P '' -f ~/.ssh/id_rsa \
@@ -1025,16 +927,6 @@ COPY <<"EOF" /entrypoint_exec.sh
 exec /bin/bash "${@}"
 EOF
 
-##############################################################################################
-# This is the www image where we keep all inlined files needed to build ui
-# It is copied separately to volume to speed up building and avoid cache miss on changed
-# file permissions.
-# We use PYTHON_BASE_IMAGE to make sure that the scripts are different for different platforms.
-##############################################################################################
-FROM ${PYTHON_BASE_IMAGE} as www
-COPY airflow/www/package.json airflow/www/yarn.lock airflow/www/webpack.config.js /
-COPY airflow/www/static/ /static
-
 FROM ${PYTHON_BASE_IMAGE} as main
 
 # Nolog bash flag is currently ignored - but you can replace it with other flags (for example
@@ -1060,8 +952,7 @@ RUN echo "Base image version: ${PYTHON_BASE_IMAGE}"
 
 ARG ADDITIONAL_DEV_APT_DEPS=""
 ARG DEV_APT_COMMAND="\
-    curl --silent --fail --location https://deb.nodesource.com/setup_14.x | bash - \
-    && curl --silent --fail https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >/dev/null 2>&1 \
+    curl --silent --fail https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >/dev/null 2>&1 \
     && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list"
 ARG ADDITIONAL_DEV_APT_COMMAND=""
 ARG ADDITIONAL_DEV_ENV_VARS=""
@@ -1104,7 +995,6 @@ RUN apt-get update \
            "${DISTRO_LIBENCHANT}" \
            locales  \
            netcat \
-           nodejs \
            rsync \
            sasl2-bin \
            sudo \
@@ -1307,25 +1197,6 @@ COPY --from=scripts install_pipx_tools.sh /scripts/docker/
 # dependencies installed in Airflow
 RUN bash /scripts/docker/install_pipx_tools.sh
 
-# Copy package.json and yarn.lock to install node modules
-# this way even if other static check files change, node modules will not need to be installed
-# we want to keep node_modules so we can do this step separately from compiling assets
-COPY --from=www package.json yarn.lock ${AIRFLOW_SOURCES}/airflow/www/
-COPY --from=scripts prepare_node_modules.sh /scripts/docker/
-
-# Package JS/css for production
-RUN bash /scripts/docker/prepare_node_modules.sh
-
-# Copy all the needed www/ for assets compilation. Done as two separate COPY
-# commands so as otherwise it copies the _contents_ of static/ in to www/
-COPY --from=www webpack.config.js ${AIRFLOW_SOURCES}/airflow/www/
-COPY --from=www static ${AIRFLOW_SOURCES}/airflow/www/static/
-COPY --from=scripts compile_www_assets.sh /scripts/docker/
-
-# Build artifacts without removing temporary artifacts (we will need them for incremental changes)
-# in build  mode
-RUN REMOVE_ARTIFACTS="false" BUILD_TYPE="build" bash /scripts/docker/compile_www_assets.sh
-
 # Airflow sources change frequently but dependency configuration won't change that often
 # We copy setup.py and other files needed to perform setup of dependencies
 # So in case setup.py changes we can install latest dependencies required.
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index b5b5e37ecb..cb05efa4e2 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -205,10 +205,16 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-system-tests-present                             | Check if system tests have required segments of code             |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
+| check-system-tests-tocs                                | Check that system tests is properly added                        |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-xml                                              | Check XML files with xmllint                                     |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | codespell                                              | Run codespell to check for common misspellings in files          |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
+| compile-www-assets                                     | Compile www assets                                               |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
+| create-missing-init-py-files-tests                     | Create missing init.py files in tests                            |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
 | debug-statements                                       | Detect accidentally committed debug statements                   |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | detect-private-key                                     | Detect if private key is added to the repository                 |         |
@@ -246,7 +252,7 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-helm-chart                                        | Lint Helm Chart                                                  |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
-| lint-javascript                                        | * ESLint against airflow/ui                                      | *       |
+| lint-javascript                                        | * ESLint against airflow/ui                                      |         |
 |                                                        | * ESLint against current UI JavaScript files                     |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-json-schema                                       | * Lint JSON Schema files with JSON Schema                        |         |
diff --git a/airflow/www/ask_for_recompile_assets_if_needed.sh b/airflow/www/ask_for_recompile_assets_if_needed.sh
deleted file mode 100755
index 8342ae7631..0000000000
--- a/airflow/www/ask_for_recompile_assets_if_needed.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-set -e
-
-if [[ ${GITHUB_ACTIONS:="false"} == "true" ]]; then
-    echo
-    echo -e "${BLUE}Skipping asset compilation check in CI.${NO_COLOR}"
-    echo
-    exit 0
-fi
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-GREEN='\033[1;32m'
-YELLOW='\033[1;33m'
-NO_COLOR='\033[0m'
-
-md5sum=$(find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum)
-old_md5sum=$(cat "${MD5SUM_FILE}" 2>/dev/null || true)
-if [[ ${old_md5sum} != "${md5sum}" ]]; then
-    if [[ ( ${START_AIRFLOW:="false"} == "true" || ${START_AIRFLOW} == "True" )  && ${USE_AIRFLOW_VERSION:=} == "" ]]; then
-        echo
-        echo -e "${YELLOW}Recompiling assets as they have changed and you need them for 'start_airflow' command${NO_COLOR}"
-        echo
-        ./compile_assets.sh
-    else
-        echo
-        echo -e "${YELLOW}WARNING: It seems that the generated assets files do not match the content of the sources.${NO_COLOR}"
-        echo "To recompile assets, run:"
-        echo ""
-        echo "   ./airflow/www/compile_assets.sh"
-        echo ""
-    fi
-else
-    echo
-    echo -e "${GREEN}No need for www assets recompilation.${NO_COLOR}"
-    echo
-fi
diff --git a/breeze-legacy b/breeze-legacy
index 0bb257494c..b03f5ae18f 100755
--- a/breeze-legacy
+++ b/breeze-legacy
@@ -136,14 +136,6 @@ function breeze::setup_default_breeze_constants() {
     AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES_TO:="/opt/airflow"}
     export AIRFLOW_SOURCES_TO
 
-    # Sources by default are installed from local sources when using breeze
-    AIRFLOW_SOURCES_WWW_FROM=${AIRFLOW_SOURCES_WWW_FROM:="./airflow/www"}
-    export AIRFLOW_SOURCES_WWW_FROM
-
-    # They are copied to /opt/airflow by default in breeze
-    AIRFLOW_SOURCES_WWW_TO=${AIRFLOW_SOURCES_WWW_TO:="/opt/airflow/airflow/www"}
-    export AIRFLOW_SOURCES_WWW_TO
-
     # Unlike in CI scripts, in breeze by default production image is installed from sources
     export AIRFLOW_INSTALLATION_METHOD="."
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 268dad01a8..404c2e2863 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -75,6 +75,7 @@ from airflow_breeze.utils.run_utils import (
     assert_pre_commit_installed,
     filter_out_none,
     run_command,
+    run_compile_www_assets,
 )
 from airflow_breeze.utils.visuals import ASCIIART, ASCIIART_STYLE, CHEATSHEET, CHEATSHEET_STYLE
 
@@ -83,6 +84,7 @@ DEVELOPER_COMMANDS = {
     "commands": [
         "shell",
         "start-airflow",
+        "compile-www-assets",
         "exec",
         "stop",
         "build-docs",
@@ -357,6 +359,8 @@ def start_airflow(
     extra_args: Tuple,
 ):
     """Enter breeze.py environment and starts all Airflow components in the tmux session."""
+    if use_airflow_version is None:
+        run_compile_www_assets(verbose=verbose, dry_run=dry_run)
     enter_shell(
         verbose=verbose,
         dry_run=dry_run,
@@ -546,6 +550,26 @@ def static_checks(
     sys.exit(static_checks_result.returncode)
 
 
+@main.command(
+    name="compile-www-assets",
+    help="Compiles www assets.",
+    context_settings=dict(
+        ignore_unknown_options=True,
+        allow_extra_args=True,
+    ),
+)
+@option_verbose
+@option_dry_run
+def compile_www_assets(
+    verbose: bool,
+    dry_run: bool,
+):
+    compile_www_assets_result = run_compile_www_assets(verbose=verbose, dry_run=dry_run)
+    if compile_www_assets_result.returncode != 0:
+        get_console().print("[warn]New assets were generated[/]")
+    sys.exit(0)
+
+
 @main.command(name="stop", help="Stop running breeze environment.")
 @option_verbose
 @option_dry_run
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 6a2c331e6d..87dae0c9a2 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -65,7 +65,7 @@ from airflow_breeze.utils.docker_command_utils import (
 )
 from airflow_breeze.utils.parallel import check_async_run_results
 from airflow_breeze.utils.python_versions import get_python_version_list
-from airflow_breeze.utils.run_utils import RunCommandResult, run_command
+from airflow_breeze.utils.run_utils import RunCommandResult, run_command, run_compile_www_assets
 
 RELEASE_MANAGEMENT_PARAMETERS = {
     "breeze prepare-airflow-package": [
@@ -234,6 +234,7 @@ def prepare_airflow_packages(
     debug: bool,
 ):
     perform_environment_checks(verbose=verbose)
+    run_compile_www_assets(verbose=verbose, dry_run=dry_run)
     shell_params = ShellParams(
         verbose=verbose,
         github_repository=github_repository,
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 5ba825e71f..1b724974ae 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -225,18 +225,12 @@ FILES_FOR_REBUILD_CHECK = [
     'setup.cfg',
     'Dockerfile.ci',
     '.dockerignore',
-    'scripts/docker/compile_www_assets.sh',
     'scripts/docker/common.sh',
     'scripts/docker/install_additional_dependencies.sh',
     'scripts/docker/install_airflow.sh',
     'scripts/docker/install_airflow_dependencies_from_branch_tip.sh',
     'scripts/docker/install_from_docker_context_files.sh',
     'scripts/docker/install_mysql.sh',
-    'airflow/www/package.json',
-    'airflow/www/yarn.lock',
-    'airflow/www/webpack.config.js',
-    'airflow/ui/package.json',
-    'airflow/ui/yarn.lock',
 ]
 
 ENABLED_SYSTEMS = ""
@@ -265,8 +259,6 @@ MIN_DOCKER_COMPOSE_VERSION = "1.29.0"
 
 AIRFLOW_SOURCES_FROM = "."
 AIRFLOW_SOURCES_TO = "/opt/airflow"
-AIRFLOW_SOURCES_WWW_FROM = "./airflow/www"
-AIRFLOW_SOURCES_WWW_TO = "/opt/airflow/airflow/www"
 
 DEFAULT_EXTRAS = [
     # BEGINNING OF EXTRAS LIST UPDATED BY PRE COMMIT
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index 86a25b6999..9e30b95f69 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -26,8 +26,6 @@ from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, DEFAULT_AIRFLOW_CONST
 from airflow_breeze.global_constants import (
     AIRFLOW_SOURCES_FROM,
     AIRFLOW_SOURCES_TO,
-    AIRFLOW_SOURCES_WWW_FROM,
-    AIRFLOW_SOURCES_WWW_TO,
     get_airflow_extras,
     get_airflow_version,
 )
@@ -73,10 +71,6 @@ class BuildProdParams(CommonBuildParams):
         build_args = []
         build_args.extend(
             [
-                "--build-arg",
-                "AIRFLOW_SOURCES_WWW_FROM=empty",
-                "--build-arg",
-                "AIRFLOW_SOURCES_WWW_TO=/empty",
                 "--build-arg",
                 "AIRFLOW_SOURCES_FROM=empty",
                 "--build-arg",
@@ -159,10 +153,6 @@ class BuildProdParams(CommonBuildParams):
                     "--build-arg",
                     f"AIRFLOW_SOURCES_TO={AIRFLOW_SOURCES_TO}",
                     "--build-arg",
-                    f"AIRFLOW_SOURCES_WWW_FROM={AIRFLOW_SOURCES_WWW_FROM}",
-                    "--build-arg",
-                    f"AIRFLOW_SOURCES_WWW_TO={AIRFLOW_SOURCES_WWW_TO}",
-                    "--build-arg",
                     f"AIRFLOW_INSTALLATION_METHOD={self.installation_method}",
                     "--build-arg",
                     f"AIRFLOW_CONSTRAINTS_REFERENCE={self.airflow_constraints_reference}",
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index a5f998ddef..b77f1931dc 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -59,8 +59,11 @@ PRE_COMMIT_LIST = [
     'check-setup-order',
     'check-start-date-not-used-in-defaults',
     'check-system-tests-present',
+    'check-system-tests-tocs',
     'check-xml',
     'codespell',
+    'compile-www-assets',
+    'create-missing-init-py-files-tests',
     'debug-statements',
     'detect-private-key',
     'doctoc',
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 29268be8b3..36c5c6fa93 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -354,3 +354,34 @@ def get_runnable_ci_image(verbose: bool, dry_run: bool) -> str:
         instruction=f"breeze build-image --python {python_version}",
     )
     return airflow_image
+
+
+def run_compile_www_assets(
+    verbose: bool,
+    dry_run: bool,
+):
+    from airflow_breeze.utils.docker_command_utils import perform_environment_checks
+
+    assert_pre_commit_installed(verbose=verbose)
+    perform_environment_checks(verbose=verbose)
+    command_to_execute = [
+        sys.executable,
+        "-m",
+        "pre_commit",
+        'run',
+        "--hook-stage",
+        "manual",
+        'compile-www-assets',
+        '--all-files',
+    ]
+    env = os.environ.copy()
+    compile_www_assets_result = run_command(
+        command_to_execute,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        no_output_dump_on_exception=True,
+        text=True,
+        env=env,
+    )
+    return compile_www_assets_result
diff --git a/docs/docker-stack/build-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst
index d38dc585fe..3b5745e1e3 100644
--- a/docs/docker-stack/build-arg-ref.rst
+++ b/docs/docker-stack/build-arg-ref.rst
@@ -208,16 +208,6 @@ You can see some examples of those in:
 |                                    |                                          | "/opt/airflow" when you install Airflow  |
 |                                    |                                          | from local sources.                      |
 +------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_SOURCES_WWW_FROM``       | ``Dockerfile``                           | Sources of Airflow WWW files used for    |
-|                                    |                                          | asset compilation. Set it to             |
-|                                    |                                          | "./airflow/www" when                     |
-|                                    |                                          | you install Airflow from local sources   |
-+------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_SOURCES_WWW_TO``         | ``/Dockerfile``                          | Target for Airflow files used for        |
-|                                    |                                          | asset compilation. Set it to             |
-|                                    |                                          | "/opt/airflow/airflow/www" when          |
-|                                    |                                          | you install Airflow from local sources.  |
-+------------------------------------+------------------------------------------+------------------------------------------+
 | ``AIRFLOW_VERSION_SPECIFICATION``  |                                          | Optional - might be used for using limit |
 |                                    |                                          | for Airflow version installation - for   |
 |                                    |                                          | example ``<2.0.2`` for automated builds. |
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index df2aa32c0a..a0ca87ce90 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -8,6 +8,7 @@ build-image:b00ae014f9c45c116e8dd0ea72b61d19
 build-prod-image:6c614f9c76e776912dc1cf4506d2b6f5
 cleanup:9a94bd1063296ea86e895f671db0b330
 command-hash-export:83bc6a4a8c60b62da3d0f00e81d2c3ea
+compile-www-assets:5f0d8af0a2a074f2ee577604662598c8
 config:92653afc11889e1b78e3a2e38f41107f
 docker-compose-tests:8ae3b6211fd31db81a750d1c6b96ec3d
 exec:e4329909b8b2a610fa4fad5116c4b896
@@ -28,7 +29,7 @@ self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786
 start-airflow:30caa077555bef44e5bdf76dfeca092c
-static-checks:69bbef8c50c452faf58403d7a06f34b6
+static-checks:0166657e80e91b83e1cf69b022c4e864
 stop:8ebd8a42f1003495d37b884de5ac7ce6
 tests:e39111ecbd33a65ababb3cbfbac2b069
 verify-image:a6b3c70957aea96a5d4d261f23359a2d
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index 2e21ac9804..77e487bfd1 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2197.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2221.6" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,393 +19,397 @@
         font-weight: 700;
     }
 
-    .terminal-460130354-matrix {
+    .terminal-4069008649-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-460130354-title {
+    .terminal-4069008649-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-460130354-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-460130354-r2 { fill: #c5c8c6 }
-.terminal-460130354-r3 { fill: #d0b344;font-weight: bold }
-.terminal-460130354-r4 { fill: #868887 }
-.terminal-460130354-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-460130354-r6 { fill: #98a84b;font-weight: bold }
-.terminal-460130354-r7 { fill: #8d7b39 }
+    .terminal-4069008649-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-4069008649-r2 { fill: #c5c8c6 }
+.terminal-4069008649-r3 { fill: #d0b344;font-weight: bold }
+.terminal-4069008649-r4 { fill: #868887 }
+.terminal-4069008649-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-4069008649-r6 { fill: #98a84b;font-weight: bold }
+.terminal-4069008649-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-460130354-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="2146.2" />
+    <clipPath id="terminal-4069008649-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="2170.6" />
     </clipPath>
-    <clipPath id="terminal-460130354-line-0">
+    <clipPath id="terminal-4069008649-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-1">
+<clipPath id="terminal-4069008649-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-2">
+<clipPath id="terminal-4069008649-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-3">
+<clipPath id="terminal-4069008649-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-4">
+<clipPath id="terminal-4069008649-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-5">
+<clipPath id="terminal-4069008649-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-6">
+<clipPath id="terminal-4069008649-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-7">
+<clipPath id="terminal-4069008649-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-8">
+<clipPath id="terminal-4069008649-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-9">
+<clipPath id="terminal-4069008649-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-10">
+<clipPath id="terminal-4069008649-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-11">
+<clipPath id="terminal-4069008649-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-12">
+<clipPath id="terminal-4069008649-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-13">
+<clipPath id="terminal-4069008649-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-14">
+<clipPath id="terminal-4069008649-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-15">
+<clipPath id="terminal-4069008649-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-16">
+<clipPath id="terminal-4069008649-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-17">
+<clipPath id="terminal-4069008649-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-18">
+<clipPath id="terminal-4069008649-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-19">
+<clipPath id="terminal-4069008649-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-20">
+<clipPath id="terminal-4069008649-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-21">
+<clipPath id="terminal-4069008649-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-22">
+<clipPath id="terminal-4069008649-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-23">
+<clipPath id="terminal-4069008649-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-24">
+<clipPath id="terminal-4069008649-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-25">
+<clipPath id="terminal-4069008649-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-26">
+<clipPath id="terminal-4069008649-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-27">
+<clipPath id="terminal-4069008649-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-28">
+<clipPath id="terminal-4069008649-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-29">
+<clipPath id="terminal-4069008649-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-30">
+<clipPath id="terminal-4069008649-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-31">
+<clipPath id="terminal-4069008649-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-32">
+<clipPath id="terminal-4069008649-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-33">
+<clipPath id="terminal-4069008649-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-34">
+<clipPath id="terminal-4069008649-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-35">
+<clipPath id="terminal-4069008649-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-36">
+<clipPath id="terminal-4069008649-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-37">
+<clipPath id="terminal-4069008649-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-38">
+<clipPath id="terminal-4069008649-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-39">
+<clipPath id="terminal-4069008649-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-40">
+<clipPath id="terminal-4069008649-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-41">
+<clipPath id="terminal-4069008649-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-42">
+<clipPath id="terminal-4069008649-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-43">
+<clipPath id="terminal-4069008649-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-44">
+<clipPath id="terminal-4069008649-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-45">
+<clipPath id="terminal-4069008649-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-46">
+<clipPath id="terminal-4069008649-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-47">
+<clipPath id="terminal-4069008649-line-47">
     <rect x="0" y="1148.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-48">
+<clipPath id="terminal-4069008649-line-48">
     <rect x="0" y="1172.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-49">
+<clipPath id="terminal-4069008649-line-49">
     <rect x="0" y="1197.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-50">
+<clipPath id="terminal-4069008649-line-50">
     <rect x="0" y="1221.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-51">
+<clipPath id="terminal-4069008649-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-52">
+<clipPath id="terminal-4069008649-line-52">
     <rect x="0" y="1270.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-53">
+<clipPath id="terminal-4069008649-line-53">
     <rect x="0" y="1294.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-54">
+<clipPath id="terminal-4069008649-line-54">
     <rect x="0" y="1319.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-55">
+<clipPath id="terminal-4069008649-line-55">
     <rect x="0" y="1343.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-56">
+<clipPath id="terminal-4069008649-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-57">
+<clipPath id="terminal-4069008649-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-58">
+<clipPath id="terminal-4069008649-line-58">
     <rect x="0" y="1416.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-59">
+<clipPath id="terminal-4069008649-line-59">
     <rect x="0" y="1441.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-60">
+<clipPath id="terminal-4069008649-line-60">
     <rect x="0" y="1465.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-61">
+<clipPath id="terminal-4069008649-line-61">
     <rect x="0" y="1489.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-62">
+<clipPath id="terminal-4069008649-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-63">
+<clipPath id="terminal-4069008649-line-63">
     <rect x="0" y="1538.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-64">
+<clipPath id="terminal-4069008649-line-64">
     <rect x="0" y="1563.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-65">
+<clipPath id="terminal-4069008649-line-65">
     <rect x="0" y="1587.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-66">
+<clipPath id="terminal-4069008649-line-66">
     <rect x="0" y="1611.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-67">
+<clipPath id="terminal-4069008649-line-67">
     <rect x="0" y="1636.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-68">
+<clipPath id="terminal-4069008649-line-68">
     <rect x="0" y="1660.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-69">
+<clipPath id="terminal-4069008649-line-69">
     <rect x="0" y="1685.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-70">
+<clipPath id="terminal-4069008649-line-70">
     <rect x="0" y="1709.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-71">
+<clipPath id="terminal-4069008649-line-71">
     <rect x="0" y="1733.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-72">
+<clipPath id="terminal-4069008649-line-72">
     <rect x="0" y="1758.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-73">
+<clipPath id="terminal-4069008649-line-73">
     <rect x="0" y="1782.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-74">
+<clipPath id="terminal-4069008649-line-74">
     <rect x="0" y="1807.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-75">
+<clipPath id="terminal-4069008649-line-75">
     <rect x="0" y="1831.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-76">
+<clipPath id="terminal-4069008649-line-76">
     <rect x="0" y="1855.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-77">
+<clipPath id="terminal-4069008649-line-77">
     <rect x="0" y="1880.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-78">
+<clipPath id="terminal-4069008649-line-78">
     <rect x="0" y="1904.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-79">
+<clipPath id="terminal-4069008649-line-79">
     <rect x="0" y="1929.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-80">
+<clipPath id="terminal-4069008649-line-80">
     <rect x="0" y="1953.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-81">
+<clipPath id="terminal-4069008649-line-81">
     <rect x="0" y="1977.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-82">
+<clipPath id="terminal-4069008649-line-82">
     <rect x="0" y="2002.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-83">
+<clipPath id="terminal-4069008649-line-83">
     <rect x="0" y="2026.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-84">
+<clipPath id="terminal-4069008649-line-84">
     <rect x="0" y="2051.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-85">
+<clipPath id="terminal-4069008649-line-85">
     <rect x="0" y="2075.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-86">
+<clipPath id="terminal-4069008649-line-86">
     <rect x="0" y="2099.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-4069008649-line-87">
+    <rect x="0" y="2124.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2195.2" rx="8"/><text class="terminal-460130354-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;commands</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2219.6" rx="8"/><text class="terminal-4069008649-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;commands</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-460130354-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-4069008649-clip-terminal)">
     
-    <g class="terminal-460130354-matrix">
-    <text class="terminal-460130354-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-460130354-line-0)">
-</text><text class="terminal-460130354-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-460130354-line-1)">Usage:&#160;</text><text class="terminal-460130354-r1" x="97.6" y="44.4" textLength="414.8" clip-path="url(#terminal-460130354-line-1)">breeze&#160;[OPTIONS]&#160;COMMAND&#160;[ARGS]...</text><text class="terminal-460130354-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-460130354-line-1)">
-</text><text class="terminal-460130354-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-460130354-line-2)">
-</text><text class="terminal-460130354-r4" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-460130354-line-3)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-460130354-line-3)">&#160;Basic&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;───────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="93.2" textLength="24.4" clip-pat [...]
-</text><text class="terminal-460130354-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-460130354-line-4)">│</text><text class="terminal-460130354-r5" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-460130354-line-4)">-</text><text class="terminal-460130354-r5" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-460130354-line-4)">-python</text><text class="terminal-460130354-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-460130354- [...]
-</text><text class="terminal-460130354-r4" x="0" y="142" textLength="12.2" clip-path="url(#terminal-460130354-line-5)">│</text><text class="terminal-460130354-r4" x="353.8" y="142" textLength="732" clip-path="url(#terminal-460130354-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-460130354-line-6)">│</text><text class="terminal-460130354-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-460130354-line-6)">-</text><text class="terminal-460130354-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-460130354-line-6)">-backend</text><text class="terminal-460130354-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-460130354-line-7)">│</text><text class="terminal-460130354-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-460130354-line-7)">-</text><text class="terminal-460130354-r5" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-460130354-line-7)">-postgres</text><text class="terminal-460130354-r5" x="146.4" y="190.8" textLength="97.6" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-460130354-line-8)">│</text><text class="terminal-460130354-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-460130354-line-8)">-</text><text class="terminal-460130354-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-460130354-line-8)">-mysql</text><text class="terminal-460130354-r5" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-460130354-line-9)">│</text><text class="terminal-460130354-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-460130354-line-9)">-</text><text class="terminal-460130354-r5" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-460130354-line-9)">-mssql</text><text class="terminal-460130354-r5" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-460130354-line-10)">│</text><text class="terminal-460130354-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-460130354-line-10)">-</text><text class="terminal-460130354-r5" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-460130354-line-10)">-integration</text><text class="terminal-460130354-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-460130354-line-11)">│</text><text class="terminal-460130354-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-460130354-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-460130354-r4" x="1451.8 [...]
-</text><text class="terminal-460130354-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-460130354-line-12)">│</text><text class="terminal-460130354-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-460130354-line-13)">│</text><text class="terminal-460130354-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-460130354-line-13)">-</text><text class="terminal-460130354-r5" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-460130354-line-13)">-forward</text><text class="terminal-460130354-r5" x="134.2" y="337.2" textLength="146.4" clip-path="url(#terminal-460 [...]
-</text><text class="terminal-460130354-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-460130354-line-14)">│</text><text class="terminal-460130354-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-460130354-line-14)">-</text><text class="terminal-460130354-r5" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-460130354-line-14)">-db</text><text class="terminal-460130354-r5" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-460130354- [...]
-</text><text class="terminal-460130354-r4" x="0" y="386" textLength="1464" clip-path="url(#terminal-460130354-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-460130354-line-15)">
-</text><text class="terminal-460130354-r4" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-460130354-line-16)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-460130354-line-16)">&#160;Advanced&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="410.4" textLength="24.4" cli [...]
-</text><text class="terminal-460130354-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-460130354-line-17)">│</text><text class="terminal-460130354-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-460130354-line-17)">-</text><text class="terminal-460130354-r5" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-460130354-line-17)">-use</text><text class="terminal-460130354-r5" x="85.4" y="434.8" textLength="195.2" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-460130354-line-18)">│</text><text class="terminal-460130354-r2" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-18)">`sdist`&#160;if&#160;Airflow&#160;should&#160;be&#160;removed,&#160;installed&#160;from&#160;wheel&#160;packages&#160;or&#160;sdist&#160;packages&#160;&#160;&#160;</text><text class="terminal-460130354-r4" x="1451.8" y="459.2" textLength="12.2 [...]
-</text><text class="terminal-460130354-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-460130354-line-19)">│</text><text class="terminal-460130354-r2" x="366" y="483.6" textLength="573.4" clip-path="url(#terminal-460130354-line-19)">available&#160;in&#160;dist&#160;folder&#160;respectively.&#160;Implies&#160;</text><text class="terminal-460130354-r5" x="939.4" y="483.6" textLength="12.2" clip-path="url(#terminal-460130354-line-19)">-</text><text class="terminal-460130354-r [...]
-</text><text class="terminal-460130354-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-460130354-line-20)">│</text><text class="terminal-460130354-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-460130354-line-20)">(none&#160;|&#160;wheel&#160;|&#160;sdist&#160;|&#160;&lt;airflow_version&gt;)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-460130354-line-21)">│</text><text class="terminal-460130354-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-460130354-line-21)">-</text><text class="terminal-460130354-r5" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-460130354-line-21)">-airflow</text><text class="terminal-460130354-r5" x="134.2" y="532.4" textLength="85.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-460130354-line-22)">│</text><text class="terminal-460130354-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-460130354-line-22)">-</text><text class="terminal-460130354-r5" x="36.6" y="556.8" textLength="48.8" clip-path="url(#terminal-460130354-line-22)">-use</text><text class="terminal-460130354-r5" x="85.4" y="556.8" textLength="231.8" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-460130354-line-23)">│</text><text class="terminal-460130354-r2" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-23)">entering&#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; [...]
-</text><text class="terminal-460130354-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-460130354-line-24)">│</text><text class="terminal-460130354-r5" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-460130354-line-24)">-</text><text class="terminal-460130354-r5" x="36.6" y="605.6" textLength="97.6" clip-path="url(#terminal-460130354-line-24)">-package</text><text class="terminal-460130354-r5" x="134.2" y="605.6" textLength="85.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-460130354-line-25)">│</text><text class="terminal-460130354-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-460130354-line-25)">-</text><text class="terminal-460130354-r5" x="36.6" y="630" textLength="73.2" clip-path="url(#terminal-460130354-line-25)">-force</text><text class="terminal-460130354-r5" x="109.8" y="630" textLength="73.2" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-460130354-line-26)">│</text><text class="terminal-460130354-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-460130354-line-26)">-</text><text class="terminal-460130354-r5" x="36.6" y="654.4" textLength="73.2" clip-path="url(#terminal-460130354-line-26)">-mount</text><text class="terminal-460130354-r5" x="109.8" y="654.4" textLength="97.6" clip-path="url(#terminal-460130 [...]
-</text><text class="terminal-460130354-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-460130354-line-27)">│</text><text class="terminal-460130354-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-460130354-line-27)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-460130354-line-28)">│</text><text class="terminal-460130354-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-28)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-460130354-line-29)">│</text><text class="terminal-460130354-r4" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-460130354-line-29)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-460130354-line-30)">│</text><text class="terminal-460130354-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-460130354-line-30)">-</text><text class="terminal-460130354-r5" x="36.6" y="752" textLength="85.4" clip-path="url(#terminal-460130354-line-30)">-debian</text><text class="terminal-460130354-r5" x="122" y="752" textLength="97.6" clip-path="url(#terminal-460130354-line- [...]
-</text><text class="terminal-460130354-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-460130354-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-460130354-line-31)">
-</text><text class="terminal-460130354-r4" x="0" y="800.8" textLength="24.4" clip-path="url(#terminal-460130354-line-32)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="800.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-32)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="800.8" textLength="24.4" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-460130354-line-33)">│</text><text class="terminal-460130354-r5" x="24.4" y="825.2" textLength="12.2" clip-path="url(#terminal-460130354-line-33)">-</text><text class="terminal-460130354-r5" x="36.6" y="825.2" textLength="97.6" clip-path="url(#terminal-460130354-line-33)">-verbose</text><text class="terminal-460130354-r6" x="280.6" y="825.2" textLength="24.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-460130354-line-34)">│</text><text class="terminal-460130354-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-460130354-line-34)">-</text><text class="terminal-460130354-r5" x="36.6" y="849.6" textLength="48.8" clip-path="url(#terminal-460130354-line-34)">-dry</text><text class="terminal-460130354-r5" x="85.4" y="849.6" textLength="48.8" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-460130354-line-35)">│</text><text class="terminal-460130354-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-460130354-line-35)">-</text><text class="terminal-460130354-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-460130354-line-35)">-github</text><text class="terminal-460130354-r5" x="122" y="874" textLength="134.2" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-460130354-line-36)">│</text><text class="terminal-460130354-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-460130354-line-36)">-</text><text class="terminal-460130354-r5" x="36.6" y="898.4" textLength="85.4" clip-path="url(#terminal-460130354-line-36)">-answer</text><text class="terminal-460130354-r6" x="280.6" y="898.4" textLength="24.4" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-460130354-line-37)">│</text><text class="terminal-460130354-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-460130354-line-37)">-</text><text class="terminal-460130354-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-460130354-line-37)">-help</text><text class="terminal-460130354-r6" x="280.6" y="922.8" textLength="24.4" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-460130354-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-460130354-line-38)">
-</text><text class="terminal-460130354-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-460130354-line-39)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-460130354-line-39)">&#160;Developer&#160;tools&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#terminal-460 [...]
-</text><text class="terminal-460130354-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-460130354-line-40)">│</text><text class="terminal-460130354-r5" x="24.4" y="996" textLength="183" clip-path="url(#terminal-460130354-line-40)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="996" textLength="1207.8" clip-path="url(#terminal-460130354-line-40)">Enter&#160;breeze.py&#160;environment.&#160;this&#160;is&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-460130354-line-41)">│</text><text class="terminal-460130354-r5" x="24.4" y="1020.4" textLength="183" clip-path="url(#terminal-460130354-line-41)">start-airflow&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1020.4" textLength="1207.8" clip-path="url(#terminal-460130354-line-41)">Enter&#160;breeze.py&#160;environment&#160;and&#160;starts&#160;all&#160;Airflow&#160;com [...]
-</text><text class="terminal-460130354-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-460130354-line-42)">│</text><text class="terminal-460130354-r5" x="24.4" y="1044.8" textLength="183" clip-path="url(#terminal-460130354-line-42)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1044.8" textLength="1207.8" clip-path="url(#terminal-460130354-line-42)">Joins&#160;the&#160;interactive&#160;shell&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-460130354-line-43)">│</text><text class="terminal-460130354-r5" x="24.4" y="1069.2" textLength="183" clip-path="url(#terminal-460130354-line-43)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1069.2" textLength="1207.8" clip-path="url(#terminal-460130354-line-43)">Stop&#160;running&#160;breeze&#160;environme [...]
-</text><text class="terminal-460130354-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-460130354-line-44)">│</text><text class="terminal-460130354-r5" x="24.4" y="1093.6" textLength="183" clip-path="url(#terminal-460130354-line-44)">build-docs&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1093.6" textLength="1207.8" clip-path="url(#terminal-460130354-line-44)">Build&#160;documentation&#160;in&#160;the&#160;container.&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-460130354-line-45)">│</text><text class="terminal-460130354-r5" x="24.4" y="1118" textLength="183" clip-path="url(#terminal-460130354-line-45)">static-checks&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1118" textLength="1207.8" clip-path="url(#terminal-460130354-line-45)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1142.4" textLength="1464" clip-path="url(#terminal-460130354-line-46)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#terminal-460130354-line-46)">
-</text><text class="terminal-460130354-r4" x="0" y="1166.8" textLength="24.4" clip-path="url(#terminal-460130354-line-47)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1166.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-47)">&#160;Testing&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1166.8" textLength="24.4" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-460130354-line-48)">│</text><text class="terminal-460130354-r5" x="24.4" y="1191.2" textLength="256.2" clip-path="url(#terminal-460130354-line-48)">docker-compose-tests&#160;</text><text class="terminal-460130354-r2" x="305" y="1191.2" textLength="1134.6" clip-path="url(#terminal-460130354-line-48)">Run&#160;docker-compose&#160;tests.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-460130354-line-49)">│</text><text class="terminal-460130354-r5" x="24.4" y="1215.6" textLength="256.2" clip-path="url(#terminal-460130354-line-49)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-460130354-line-49)">Run&#160;the& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-460130354-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-460130354-line-50)">
-</text><text class="terminal-460130354-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-460130354-line-51)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-460130354-line-51)">&#160;Configuration&#160;&amp;&#160;maintenance&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1264.4" textLength="24.4" clip-path="url(# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-460130354-line-52)">│</text><text class="terminal-460130354-r5" x="24.4" y="1288.8" textLength="305" clip-path="url(#terminal-460130354-line-52)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1288.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-52)" [...]
-</text><text class="terminal-460130354-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-460130354-line-53)">│</text><text class="terminal-460130354-r2" x="353.8" y="1313.2" textLength="1085.8" clip-path="url(#terminal-460130354-line-53)">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;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-460130354-line-54)">│</text><text class="terminal-460130354-r5" x="24.4" y="1337.6" textLength="305" clip-path="url(#terminal-460130354-line-54)">self-upgrade&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1337.6" textLength="1085.8" clip-path="url(#terminal-460130354-line-54)">Self&#160;upgrade&#160;B [...]
-</text><text class="terminal-460130354-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-460130354-line-55)">│</text><text class="terminal-460130354-r5" x="24.4" y="1362" textLength="305" clip-path="url(#terminal-460130354-line-55)">setup-autocomplete&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1362" textLength="1085.8" clip-path="url(#terminal-460130354-line-55)">Enables&#160;autocompletion&#160;of&#160;breeze&#160;command [...]
-</text><text class="terminal-460130354-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-460130354-line-56)">│</text><text class="terminal-460130354-r5" x="24.4" y="1386.4" textLength="305" clip-path="url(#terminal-460130354-line-56)">config&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1386.4" textLength="1085.8" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-460130354-line-57)">│</text><text class="terminal-460130354-r5" x="24.4" y="1410.8" textLength="305" clip-path="url(#terminal-460130354-line-57)">regenerate-command-images</text><text class="terminal-460130354-r2" x="353.8" y="1410.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-57)">Regenerate&#160;breeze&#160;command&#160;images.&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-460130354-line-58)">│</text><text class="terminal-460130354-r5" x="24.4" y="1435.2" textLength="305" clip-path="url(#terminal-460130354-line-58)">command-hash-export&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1435.2" textLength="1085.8" clip-path="url(#terminal-460130354-line-58)">Outputs&#160;hash&#160;of&#160;all&#160;click&#160;commands [...]
-</text><text class="terminal-460130354-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-460130354-line-59)">│</text><text class="terminal-460130354-r2" x="353.8" y="1459.6" textLength="1085.8" clip-path="url(#terminal-460130354-line-59)">images&#160;should&#160;be&#160;regenerated).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-460130354-line-60)">│</text><text class="terminal-460130354-r5" x="24.4" y="1484" textLength="305" clip-path="url(#terminal-460130354-line-60)">version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1484" textLength="1085.8" clip-path="url(#terminal-460130354-line-60)">Print [...]
-</text><text class="terminal-460130354-r4" x="0" y="1508.4" textLength="1464" clip-path="url(#terminal-460130354-line-61)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#terminal-460130354-line-61)">
-</text><text class="terminal-460130354-r4" x="0" y="1532.8" textLength="24.4" clip-path="url(#terminal-460130354-line-62)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1532.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-62)">&#160;CI&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1532.8" textLength="24.4" clip-path="url(#term [...]
-</text><text class="terminal-460130354-r4" x="0" y="1557.2" textLength="12.2" clip-path="url(#terminal-460130354-line-63)">│</text><text class="terminal-460130354-r5" x="24.4" y="1557.2" textLength="170.8" clip-path="url(#terminal-460130354-line-63)">build-image&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1557.2" textLength="1220" clip-path="url(#terminal-460130354-line-63)">Build&#160;CI&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;f [...]
-</text><text class="terminal-460130354-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-460130354-line-64)">│</text><text class="terminal-460130354-r5" x="24.4" y="1581.6" textLength="170.8" clip-path="url(#terminal-460130354-line-64)">pull-image&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1581.6" textLength="1220" clip-path="url(#terminal-460130354-line-64)">Pull&#160;and&#160;optionally&#160;verify&#160;CI&#160;images&#160;-&#160;possib [...]
-</text><text class="terminal-460130354-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-460130354-line-65)">│</text><text class="terminal-460130354-r5" x="24.4" y="1606" textLength="170.8" clip-path="url(#terminal-460130354-line-65)">verify-image&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1606" textLength="1220" clip-path="url(#terminal-460130354-line-65)">Verify&#160;CI&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1630.4" textLength="1464" clip-path="url(#terminal-460130354-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1630.4" textLength="12.2" clip-path="url(#terminal-460130354-line-66)">
-</text><text class="terminal-460130354-r4" x="0" y="1654.8" textLength="24.4" clip-path="url(#terminal-460130354-line-67)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1654.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-67)">&#160;Production&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1654.8" textLength="24.4" clip-path="url(#term [...]
-</text><text class="terminal-460130354-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-460130354-line-68)">│</text><text class="terminal-460130354-r5" x="24.4" y="1679.2" textLength="207.4" clip-path="url(#terminal-460130354-line-68)">build-prod-image&#160;</text><text class="terminal-460130354-r2" x="256.2" y="1679.2" textLength="1183.4" clip-path="url(#terminal-460130354-line-68)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-460130354-line-69)">│</text><text class="terminal-460130354-r2" x="256.2" y="1703.6" textLength="1183.4" clip-path="url(#terminal-460130354-line-69)">sequentially.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-460130354-line-70)">│</text><text class="terminal-460130354-r5" x="24.4" y="1728" textLength="207.4" clip-path="url(#terminal-460130354-line-70)">pull-prod-image&#160;&#160;</text><text class="terminal-460130354-r2" x="256.2" y="1728" textLength="1183.4" clip-path="url(#terminal-460130354-line-70)">Pull&#160;and&#160;optionally&#160;verify&#160;Production&#160;images&#160;-&#160;possibly& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-460130354-line-71)">│</text><text class="terminal-460130354-r5" x="24.4" y="1752.4" textLength="207.4" clip-path="url(#terminal-460130354-line-71)">verify-prod-image</text><text class="terminal-460130354-r2" x="256.2" y="1752.4" textLength="1183.4" clip-path="url(#terminal-460130354-line-71)">Verify&#160;Production&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1776.8" textLength="1464" clip-path="url(#terminal-460130354-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1776.8" textLength="12.2" clip-path="url(#terminal-460130354-line-72)">
-</text><text class="terminal-460130354-r4" x="0" y="1801.2" textLength="24.4" clip-path="url(#terminal-460130354-line-73)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1801.2" textLength="1415.2" clip-path="url(#terminal-460130354-line-73)">&#160;CI&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1801.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-460130354-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-460130354-line-74)">│</text><text class="terminal-460130354-r5" x="24.4" y="1825.6" textLength="378.2" clip-path="url(#terminal-460130354-line-74)">fix-ownership&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1825.6" textLength="1012.6" clip-path="url(#terminal-460130354-lin [...]
-</text><text class="terminal-460130354-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-460130354-line-75)">│</text><text class="terminal-460130354-r5" x="24.4" y="1850" textLength="378.2" clip-path="url(#terminal-460130354-line-75)">free-space&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1850" textLength="1012.6" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-460130354-line-76)">│</text><text class="terminal-460130354-r5" x="24.4" y="1874.4" textLength="378.2" clip-path="url(#terminal-460130354-line-76)">resource-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1874.4" textLength="1012.6" clip-path="url(#terminal-460130354-line-76) [...]
-</text><text class="terminal-460130354-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-460130354-line-77)">│</text><text class="terminal-460130354-r5" x="24.4" y="1898.8" textLength="378.2" clip-path="url(#terminal-460130354-line-77)">selective-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1898.8" textLength="1012.6" clip-path="url(#terminal-460130354-line-77)">Che [...]
-</text><text class="terminal-460130354-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-460130354-line-78)">│</text><text class="terminal-460130354-r5" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#terminal-460130354-line-78)">find-newer-dependencies&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1923.2" textLength="1012.6" clip-path="url(#terminal-460130354-line-78)">Finds&#160;which&#160;dependencies&#160;are [...]
-</text><text class="terminal-460130354-r4" x="0" y="1947.6" textLength="1464" clip-path="url(#terminal-460130354-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1947.6" textLength="12.2" clip-path="url(#terminal-460130354-line-79)">
-</text><text class="terminal-460130354-r4" x="0" y="1972" textLength="24.4" clip-path="url(#terminal-460130354-line-80)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1972" textLength="1415.2" clip-path="url(#terminal-460130354-line-80)">&#160;Release&#160;management&#160;────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1972" textLength="24.4" clip-path="url(#terminal-460130 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1996.4" textLength="12.2" clip-path="url(#terminal-460130354-line-81)">│</text><text class="terminal-460130354-r5" x="24.4" y="1996.4" textLength="402.6" clip-path="url(#terminal-460130354-line-81)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="1996.4" textLength="988.2" clip-path="url(#terminal-460130354-line-81)">Verifies&#160;if&#160;all&#160;prov [...]
-</text><text class="terminal-460130354-r4" x="0" y="2020.8" textLength="12.2" clip-path="url(#terminal-460130354-line-82)">│</text><text class="terminal-460130354-r5" x="24.4" y="2020.8" textLength="402.6" clip-path="url(#terminal-460130354-line-82)">prepare-provider-documentation&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2020.8" textLength="988.2" clip-path="url(#terminal-460130354-line-82)">Prepare&#160;CHANGELOG,&#160;README&#160;and&#160;COMMITS&#160;in [...]
-</text><text class="terminal-460130354-r4" x="0" y="2045.2" textLength="12.2" clip-path="url(#terminal-460130354-line-83)">│</text><text class="terminal-460130354-r5" x="24.4" y="2045.2" textLength="402.6" clip-path="url(#terminal-460130354-line-83)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2045.2" textLength="988.2" clip-path="url(#terminal-460130354-line-83)">Prepare&#160;sdist/whl&#160;packages&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="2069.6" textLength="12.2" clip-path="url(#terminal-460130354-line-84)">│</text><text class="terminal-460130354-r5" x="24.4" y="2069.6" textLength="402.6" clip-path="url(#terminal-460130354-line-84)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2069.6" textLength="988.2" clip-path="url(#terminal-460130354-line-84)">Prepare&#160;sdist/whl&#160;pa [...]
-</text><text class="terminal-460130354-r4" x="0" y="2094" textLength="12.2" clip-path="url(#terminal-460130354-line-85)">│</text><text class="terminal-460130354-r5" x="24.4" y="2094" textLength="402.6" clip-path="url(#terminal-460130354-line-85)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2094" textLength="988.2" clip-path="url(#terminal-460130354-line-85)">Release&#160;pro [...]
-</text><text class="terminal-460130354-r4" x="0" y="2118.4" textLength="12.2" clip-path="url(#terminal-460130354-line-86)">│</text><text class="terminal-460130354-r5" x="24.4" y="2118.4" textLength="402.6" clip-path="url(#terminal-460130354-line-86)">generate-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2118.4" textLength="988.2" clip-path="url(#terminal-460130354-line-86)">Generates&#160; [...]
-</text><text class="terminal-460130354-r4" x="0" y="2142.8" textLength="1464" clip-path="url(#terminal-460130354-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="2142.8" textLength="12.2" clip-path="url(#terminal-460130354-line-87)">
+    <g class="terminal-4069008649-matrix">
+    <text class="terminal-4069008649-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-4069008649-line-0)">
+</text><text class="terminal-4069008649-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-4069008649-line-1)">Usage:&#160;</text><text class="terminal-4069008649-r1" x="97.6" y="44.4" textLength="414.8" clip-path="url(#terminal-4069008649-line-1)">breeze&#160;[OPTIONS]&#160;COMMAND&#160;[ARGS]...</text><text class="terminal-4069008649-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-1)">
+</text><text class="terminal-4069008649-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-2)">
+</text><text class="terminal-4069008649-r4" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-3)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-3)">&#160;Basic&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;───────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="93.2" textLength="24.4" cli [...]
+</text><text class="terminal-4069008649-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-4)">│</text><text class="terminal-4069008649-r5" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-4)">-</text><text class="terminal-4069008649-r5" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-4069008649-line-4)">-python</text><text class="terminal-4069008649-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="142" textLength="12.2" clip-path="url(#terminal-4069008649-line-5)">│</text><text class="terminal-4069008649-r4" x="353.8" y="142" textLength="732" clip-path="url(#terminal-4069008649-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-6)">│</text><text class="terminal-4069008649-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-6)">-</text><text class="terminal-4069008649-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-4069008649-line-6)">-backend</text><text class="terminal-4069008649-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-7)">│</text><text class="terminal-4069008649-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-7)">-</text><text class="terminal-4069008649-r5" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-4069008649-line-7)">-postgres</text><text class="terminal-4069008649-r5" x="146.4" y="190.8" textLength="97.6" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-8)">│</text><text class="terminal-4069008649-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-8)">-</text><text class="terminal-4069008649-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-4069008649-line-8)">-mysql</text><text class="terminal-4069008649-r5" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-9)">│</text><text class="terminal-4069008649-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-9)">-</text><text class="terminal-4069008649-r5" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-4069008649-line-9)">-mssql</text><text class="terminal-4069008649-r5" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-4069008649-line-10)">│</text><text class="terminal-4069008649-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-4069008649-line-10)">-</text><text class="terminal-4069008649-r5" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-4069008649-line-10)">-integration</text><text class="terminal-4069008649-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-11)">│</text><text class="terminal-4069008649-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-4069008649-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-4069008649-r4" x="1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-12)">│</text><text class="terminal-4069008649-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-4069008649-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-13)">│</text><text class="terminal-4069008649-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-13)">-</text><text class="terminal-4069008649-r5" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-4069008649-line-13)">-forward</text><text class="terminal-4069008649-r5" x="134.2" y="337.2" textLength="146.4" clip-path="url(#termi [...]
+</text><text class="terminal-4069008649-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-14)">│</text><text class="terminal-4069008649-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-14)">-</text><text class="terminal-4069008649-r5" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-4069008649-line-14)">-db</text><text class="terminal-4069008649-r5" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="386" textLength="1464" clip-path="url(#terminal-4069008649-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-4069008649-line-15)">
+</text><text class="terminal-4069008649-r4" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-4069008649-line-16)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-4069008649-line-16)">&#160;Advanced&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="410.4" textLength="24.4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-17)">│</text><text class="terminal-4069008649-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-17)">-</text><text class="terminal-4069008649-r5" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-4069008649-line-17)">-use</text><text class="terminal-4069008649-r5" x="85.4" y="434.8" textLength="195.2" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-18)">│</text><text class="terminal-4069008649-r2" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-18)">`sdist`&#160;if&#160;Airflow&#160;should&#160;be&#160;removed,&#160;installed&#160;from&#160;wheel&#160;packages&#160;or&#160;sdist&#160;packages&#160;&#160;&#160;</text><text class="terminal-4069008649-r4" x="1451.8" y="459.2" textLength= [...]
+</text><text class="terminal-4069008649-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-19)">│</text><text class="terminal-4069008649-r2" x="366" y="483.6" textLength="573.4" clip-path="url(#terminal-4069008649-line-19)">available&#160;in&#160;dist&#160;folder&#160;respectively.&#160;Implies&#160;</text><text class="terminal-4069008649-r5" x="939.4" y="483.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-19)">-</text><text class="terminal-40690 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-4069008649-line-20)">│</text><text class="terminal-4069008649-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-4069008649-line-20)">(none&#160;|&#160;wheel&#160;|&#160;sdist&#160;|&#160;&lt;airflow_version&gt;)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-21)">│</text><text class="terminal-4069008649-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-21)">-</text><text class="terminal-4069008649-r5" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-4069008649-line-21)">-airflow</text><text class="terminal-4069008649-r5" x="134.2" y="532.4" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-22)">│</text><text class="terminal-4069008649-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-22)">-</text><text class="terminal-4069008649-r5" x="36.6" y="556.8" textLength="48.8" clip-path="url(#terminal-4069008649-line-22)">-use</text><text class="terminal-4069008649-r5" x="85.4" y="556.8" textLength="231.8" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-23)">│</text><text class="terminal-4069008649-r2" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-23)">entering&#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;&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-24)">│</text><text class="terminal-4069008649-r5" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-24)">-</text><text class="terminal-4069008649-r5" x="36.6" y="605.6" textLength="97.6" clip-path="url(#terminal-4069008649-line-24)">-package</text><text class="terminal-4069008649-r5" x="134.2" y="605.6" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-4069008649-line-25)">│</text><text class="terminal-4069008649-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-4069008649-line-25)">-</text><text class="terminal-4069008649-r5" x="36.6" y="630" textLength="73.2" clip-path="url(#terminal-4069008649-line-25)">-force</text><text class="terminal-4069008649-r5" x="109.8" y="630" textLength="73.2" clip-path="url(#terminal-4069008 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-26)">│</text><text class="terminal-4069008649-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-26)">-</text><text class="terminal-4069008649-r5" x="36.6" y="654.4" textLength="73.2" clip-path="url(#terminal-4069008649-line-26)">-mount</text><text class="terminal-4069008649-r5" x="109.8" y="654.4" textLength="97.6" clip-path="url(#terminal [...]
+</text><text class="terminal-4069008649-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-27)">│</text><text class="terminal-4069008649-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-4069008649-line-27)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-28)">│</text><text class="terminal-4069008649-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-28)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-29)">│</text><text class="terminal-4069008649-r4" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-4069008649-line-29)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-4069008649-line-30)">│</text><text class="terminal-4069008649-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-4069008649-line-30)">-</text><text class="terminal-4069008649-r5" x="36.6" y="752" textLength="85.4" clip-path="url(#terminal-4069008649-line-30)">-debian</text><text class="terminal-4069008649-r5" x="122" y="752" textLength="97.6" clip-path="url(#terminal-40690086 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-4069008649-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-31)">
+</text><text class="terminal-4069008649-r4" x="0" y="800.8" textLength="24.4" clip-path="url(#terminal-4069008649-line-32)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="800.8" textLength="1415.2" clip-path="url(#terminal-4069008649-line-32)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="800.8" textLength="24.4" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-33)">│</text><text class="terminal-4069008649-r5" x="24.4" y="825.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-33)">-</text><text class="terminal-4069008649-r5" x="36.6" y="825.2" textLength="97.6" clip-path="url(#terminal-4069008649-line-33)">-verbose</text><text class="terminal-4069008649-r6" x="280.6" y="825.2" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-34)">│</text><text class="terminal-4069008649-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-34)">-</text><text class="terminal-4069008649-r5" x="36.6" y="849.6" textLength="48.8" clip-path="url(#terminal-4069008649-line-34)">-dry</text><text class="terminal-4069008649-r5" x="85.4" y="849.6" textLength="48.8" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-4069008649-line-35)">│</text><text class="terminal-4069008649-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-4069008649-line-35)">-</text><text class="terminal-4069008649-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-4069008649-line-35)">-github</text><text class="terminal-4069008649-r5" x="122" y="874" textLength="134.2" clip-path="url(#terminal-4069008 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-36)">│</text><text class="terminal-4069008649-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-36)">-</text><text class="terminal-4069008649-r5" x="36.6" y="898.4" textLength="85.4" clip-path="url(#terminal-4069008649-line-36)">-answer</text><text class="terminal-4069008649-r6" x="280.6" y="898.4" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-37)">│</text><text class="terminal-4069008649-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-37)">-</text><text class="terminal-4069008649-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-4069008649-line-37)">-help</text><text class="terminal-4069008649-r6" x="280.6" y="922.8" textLength="24.4" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-4069008649-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-38)">
+</text><text class="terminal-4069008649-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-4069008649-line-39)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-4069008649-line-39)">&#160;Developer&#160;tools&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-4069008649-line-40)">│</text><text class="terminal-4069008649-r5" x="24.4" y="996" textLength="244" clip-path="url(#terminal-4069008649-line-40)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="996" textLength="1146.8" clip-path="url(#terminal-4069008649-line-40)">Enter&#160;breeze.py&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-41)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1020.4" textLength="244" clip-path="url(#terminal-4069008649-line-41)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1020.4" textLength="1146.8" clip-path="url(#terminal-4069008649-line-41)">Enter&#160;breeze.py&#160;environment&#160;and&#160;s [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-42)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1044.8" textLength="244" clip-path="url(#terminal-4069008649-line-42)">compile-www-assets&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1044.8" textLength="1146.8" clip-path="url(#terminal-4069008649-line-42)">Compiles&#160;www&#160;assets.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-43)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1069.2" textLength="244" clip-path="url(#terminal-4069008649-line-43)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1069.2" textLength="1146.8" clip-path="url(#terminal-4069008649-line-43)">Joins&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-44)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1093.6" textLength="244" clip-path="url(#terminal-4069008649-line-44)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1093.6" textLength="1146.8" clip-path="url(#terminal-4069008649-line-44)">Stop&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-4069008649-line-45)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1118" textLength="244" clip-path="url(#terminal-4069008649-line-45)">build-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1118" textLength="1146.8" clip-path="url(#terminal-4069008649-line-45)">Build&#160;documentation&#160;in&#160;the&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-46)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1142.4" textLength="244" clip-path="url(#terminal-4069008649-line-46)">static-checks&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1142.4" textLength="1146.8" clip-path="url(#terminal-4069008649-line-46)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1166.8" textLength="1464" clip-path="url(#terminal-4069008649-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-47)">
+</text><text class="terminal-4069008649-r4" x="0" y="1191.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-48)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1191.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-48)">&#160;Testing&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1191.2" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-49)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1215.6" textLength="256.2" clip-path="url(#terminal-4069008649-line-49)">docker-compose-tests&#160;</text><text class="terminal-4069008649-r2" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-4069008649-line-49)">Run&#160;docker-compose&#160;tests.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-4069008649-line-50)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1240" textLength="256.2" clip-path="url(#terminal-4069008649-line-50)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="305" y="1240" textLength="1134.6" clip-path="url(#terminal-4069008649-line-50)">Run&#160;the& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1264.4" textLength="1464" clip-path="url(#terminal-4069008649-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-51)">
+</text><text class="terminal-4069008649-r4" x="0" y="1288.8" textLength="24.4" clip-path="url(#terminal-4069008649-line-52)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1288.8" textLength="1415.2" clip-path="url(#terminal-4069008649-line-52)">&#160;Configuration&#160;&amp;&#160;maintenance&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1288.8" textLength="24.4" clip-path=" [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-53)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1313.2" textLength="305" clip-path="url(#terminal-4069008649-line-53)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1313.2" textLength="1085.8" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-54)">│</text><text class="terminal-4069008649-r2" x="353.8" y="1337.6" textLength="1085.8" clip-path="url(#terminal-4069008649-line-54)">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; [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-4069008649-line-55)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1362" textLength="305" clip-path="url(#terminal-4069008649-line-55)">self-upgrade&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1362" textLength="1085.8" clip-path="url(#terminal-4069008649-line-55)">Self&#160;upgrade&#160;B [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-56)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1386.4" textLength="305" clip-path="url(#terminal-4069008649-line-56)">setup-autocomplete&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1386.4" textLength="1085.8" clip-path="url(#terminal-4069008649-line-56)">Enables&#160;autocompletion&#160;of&#160;breeze& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-57)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1410.8" textLength="305" clip-path="url(#terminal-4069008649-line-57)">config&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1410.8" textLength="1085.8" clip-path="url(#terminal-406900864 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-58)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1435.2" textLength="305" clip-path="url(#terminal-4069008649-line-58)">regenerate-command-images</text><text class="terminal-4069008649-r2" x="353.8" y="1435.2" textLength="1085.8" clip-path="url(#terminal-4069008649-line-58)">Regenerate&#160;breeze&#160;command&#160;images.&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-59)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1459.6" textLength="305" clip-path="url(#terminal-4069008649-line-59)">command-hash-export&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1459.6" textLength="1085.8" clip-path="url(#terminal-4069008649-line-59)">Outputs&#160;hash&#160;of&#160;all&#160;click&#160;co [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-4069008649-line-60)">│</text><text class="terminal-4069008649-r2" x="353.8" y="1484" textLength="1085.8" clip-path="url(#terminal-4069008649-line-60)">images&#160;should&#160;be&#160;regenerated).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-61)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1508.4" textLength="305" clip-path="url(#terminal-4069008649-line-61)">version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1508.4" textLength="1085.8" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1532.8" textLength="1464" clip-path="url(#terminal-4069008649-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-62)">
+</text><text class="terminal-4069008649-r4" x="0" y="1557.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-63)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1557.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-63)">&#160;CI&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1557.2" textLength="24.4" clip-path="url( [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-64)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1581.6" textLength="170.8" clip-path="url(#terminal-4069008649-line-64)">build-image&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1581.6" textLength="1220" clip-path="url(#terminal-4069008649-line-64)">Build&#160;CI&#160;image.&#160;Include&#160;building&#160;multiple&#160;images& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-4069008649-line-65)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1606" textLength="170.8" clip-path="url(#terminal-4069008649-line-65)">pull-image&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1606" textLength="1220" clip-path="url(#terminal-4069008649-line-65)">Pull&#160;and&#160;optionally&#160;verify&#160;CI&#160;images&#160;-&#160;possib [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-66)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1630.4" textLength="170.8" clip-path="url(#terminal-4069008649-line-66)">verify-image&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1630.4" textLength="1220" clip-path="url(#terminal-4069008649-line-66)">Verify&#160;CI&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1654.8" textLength="1464" clip-path="url(#terminal-4069008649-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1654.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-67)">
+</text><text class="terminal-4069008649-r4" x="0" y="1679.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-68)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1679.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-68)">&#160;Production&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1679.2" textLength="24.4" clip-path="url( [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-69)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1703.6" textLength="207.4" clip-path="url(#terminal-4069008649-line-69)">build-prod-image&#160;</text><text class="terminal-4069008649-r2" x="256.2" y="1703.6" textLength="1183.4" clip-path="url(#terminal-4069008649-line-69)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;imag [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-4069008649-line-70)">│</text><text class="terminal-4069008649-r2" x="256.2" y="1728" textLength="1183.4" clip-path="url(#terminal-4069008649-line-70)">sequentially.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-71)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1752.4" textLength="207.4" clip-path="url(#terminal-4069008649-line-71)">pull-prod-image&#160;&#160;</text><text class="terminal-4069008649-r2" x="256.2" y="1752.4" textLength="1183.4" clip-path="url(#terminal-4069008649-line-71)">Pull&#160;and&#160;optionally&#160;verify&#160;Production&#160;images&#160;-&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1776.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-72)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1776.8" textLength="207.4" clip-path="url(#terminal-4069008649-line-72)">verify-prod-image</text><text class="terminal-4069008649-r2" x="256.2" y="1776.8" textLength="1183.4" clip-path="url(#terminal-4069008649-line-72)">Verify&#160;Production&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1801.2" textLength="1464" clip-path="url(#terminal-4069008649-line-73)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1801.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-73)">
+</text><text class="terminal-4069008649-r4" x="0" y="1825.6" textLength="24.4" clip-path="url(#terminal-4069008649-line-74)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1825.6" textLength="1415.2" clip-path="url(#terminal-4069008649-line-74)">&#160;CI&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1825.6" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-4069008649-line-75)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1850" textLength="378.2" clip-path="url(#terminal-4069008649-line-75)">fix-ownership&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1850" textLength="1012.6" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-76)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1874.4" textLength="378.2" clip-path="url(#terminal-4069008649-line-76)">free-space&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1874.4" textLength="1012.6" clip-path="url(#te [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-77)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1898.8" textLength="378.2" clip-path="url(#terminal-4069008649-line-77)">resource-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1898.8" textLength="1012.6" clip-path="url(#terminal-4069008649-li [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-78)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#terminal-4069008649-line-78)">selective-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1923.2" textLength="1012.6" clip-path="url(#terminal-4069008649-line-78 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1947.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-79)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1947.6" textLength="378.2" clip-path="url(#terminal-4069008649-line-79)">find-newer-dependencies&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1947.6" textLength="1012.6" clip-path="url(#terminal-4069008649-line-79)">Finds&#160;which&#160;dependencies&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1972" textLength="1464" clip-path="url(#terminal-4069008649-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1972" textLength="12.2" clip-path="url(#terminal-4069008649-line-80)">
+</text><text class="terminal-4069008649-r4" x="0" y="1996.4" textLength="24.4" clip-path="url(#terminal-4069008649-line-81)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1996.4" textLength="1415.2" clip-path="url(#terminal-4069008649-line-81)">&#160;Release&#160;management&#160;────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1996.4" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2020.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-82)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2020.8" textLength="402.6" clip-path="url(#terminal-4069008649-line-82)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2020.8" textLength="988.2" clip-path="url(#terminal-4069008649-line-82)">Verifies&#160;if&#160;all&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2045.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-83)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2045.2" textLength="402.6" clip-path="url(#terminal-4069008649-line-83)">prepare-provider-documentation&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2045.2" textLength="988.2" clip-path="url(#terminal-4069008649-line-83)">Prepare&#160;CHANGELOG,&#160;README&#160;and&#160;COMMITS&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2069.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-84)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2069.6" textLength="402.6" clip-path="url(#terminal-4069008649-line-84)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2069.6" textLength="988.2" clip-path="url(#terminal-4069008649-line-84)">Prepare&#160;sdist/whl&#160;packag [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2094" textLength="12.2" clip-path="url(#terminal-4069008649-line-85)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2094" textLength="402.6" clip-path="url(#terminal-4069008649-line-85)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2094" textLength="988.2" clip-path="url(#terminal-4069008649-line-85)">Prepare&#160;sdist/whl&#160;pa [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2118.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-86)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2118.4" textLength="402.6" clip-path="url(#terminal-4069008649-line-86)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2118.4" textLength="988.2" clip-path="url(#terminal-4069008649-line-86)">Rele [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2142.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-87)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2142.8" textLength="402.6" clip-path="url(#terminal-4069008649-line-87)">generate-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2142.8" textLength="988.2" clip-path="url(#terminal-4069008649-line-87)">Generates [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2167.2" textLength="1464" clip-path="url(#terminal-4069008649-line-88)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="2167.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-88)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output-compile-www-assets.svg b/images/breeze/output-compile-www-assets.svg
new file mode 100644
index 0000000000..5ffd5d828f
--- /dev/null
+++ b/images/breeze/output-compile-www-assets.svg
@@ -0,0 +1,99 @@
+<svg class="rich-terminal" viewBox="0 0 1482 294.0" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .terminal-2464517397-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-2464517397-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-2464517397-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-2464517397-r2 { fill: #c5c8c6 }
+.terminal-2464517397-r3 { fill: #d0b344;font-weight: bold }
+.terminal-2464517397-r4 { fill: #868887 }
+.terminal-2464517397-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-2464517397-r6 { fill: #98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-2464517397-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="243.0" />
+    </clipPath>
+    <clipPath id="terminal-2464517397-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-8">
+    <rect x="0" y="196.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="292" rx="8"/><text class="terminal-2464517397-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;compile-www-assets</text>
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2464517397-clip-terminal)">
+    
+    <g class="terminal-2464517397-matrix">
+    <text class="terminal-2464517397-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2464517397-line-0)">
+</text><text class="terminal-2464517397-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2464517397-line-1)">Usage:&#160;</text><text class="terminal-2464517397-r1" x="97.6" y="44.4" textLength="427" clip-path="url(#terminal-2464517397-line-1)">breeze&#160;compile-www-assets&#160;[OPTIONS]</text><text class="terminal-2464517397-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-1)">
+</text><text class="terminal-2464517397-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-2)">
+</text><text class="terminal-2464517397-r2" x="12.2" y="93.2" textLength="244" clip-path="url(#terminal-2464517397-line-3)">Compiles&#160;www&#160;assets.</text><text class="terminal-2464517397-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-3)">
+</text><text class="terminal-2464517397-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2464517397-line-4)">
+</text><text class="terminal-2464517397-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2464517397-line-5)">╭─</text><text class="terminal-2464517397-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2464517397-line-5)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2464517397-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-2464517397- [...]
+</text><text class="terminal-2464517397-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-6)">│</text><text class="terminal-2464517397-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-6)">-</text><text class="terminal-2464517397-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-2464517397-line-6)">-verbose</text><text class="terminal-2464517397-r6" x="158.6" y="166.4" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-2464517397-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-7)">│</text><text class="terminal-2464517397-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-7)">-</text><text class="terminal-2464517397-r5" x="36.6" y="190.8" textLength="48.8" clip-path="url(#terminal-2464517397-line-7)">-dry</text><text class="terminal-2464517397-r5" x="85.4" y="190.8" textLength="48.8" clip-path="url(#terminal-24645 [...]
+</text><text class="terminal-2464517397-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-8)">│</text><text class="terminal-2464517397-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-8)">-</text><text class="terminal-2464517397-r5" x="36.6" y="215.2" textLength="61" clip-path="url(#terminal-2464517397-line-8)">-help</text><text class="terminal-2464517397-r6" x="158.6" y="215.2" textLength="24.4" clip-path="url(#terminal-24645 [...]
+</text><text class="terminal-2464517397-r4" x="0" y="239.6" textLength="1464" clip-path="url(#terminal-2464517397-line-9)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2464517397-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-2464517397-line-9)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output-static-checks.svg b/images/breeze/output-static-checks.svg
index 75126bd608..e27e8489f1 100644
--- a/images/breeze/output-static-checks.svg
+++ b/images/breeze/output-static-checks.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1221.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1270.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,233 +19,241 @@
         font-weight: 700;
     }
 
-    .terminal-751396731-matrix {
+    .terminal-1542824486-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-751396731-title {
+    .terminal-1542824486-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-751396731-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-751396731-r2 { fill: #c5c8c6 }
-.terminal-751396731-r3 { fill: #d0b344;font-weight: bold }
-.terminal-751396731-r4 { fill: #868887 }
-.terminal-751396731-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-751396731-r6 { fill: #98a84b;font-weight: bold }
-.terminal-751396731-r7 { fill: #8d7b39 }
+    .terminal-1542824486-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-1542824486-r2 { fill: #c5c8c6 }
+.terminal-1542824486-r3 { fill: #d0b344;font-weight: bold }
+.terminal-1542824486-r4 { fill: #868887 }
+.terminal-1542824486-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-1542824486-r6 { fill: #98a84b;font-weight: bold }
+.terminal-1542824486-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-751396731-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1170.1999999999998" />
+    <clipPath id="terminal-1542824486-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1219.0" />
     </clipPath>
-    <clipPath id="terminal-751396731-line-0">
+    <clipPath id="terminal-1542824486-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-1">
+<clipPath id="terminal-1542824486-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-2">
+<clipPath id="terminal-1542824486-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-3">
+<clipPath id="terminal-1542824486-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-4">
+<clipPath id="terminal-1542824486-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-5">
+<clipPath id="terminal-1542824486-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-6">
+<clipPath id="terminal-1542824486-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-7">
+<clipPath id="terminal-1542824486-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-8">
+<clipPath id="terminal-1542824486-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-9">
+<clipPath id="terminal-1542824486-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-10">
+<clipPath id="terminal-1542824486-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-11">
+<clipPath id="terminal-1542824486-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-12">
+<clipPath id="terminal-1542824486-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-13">
+<clipPath id="terminal-1542824486-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-14">
+<clipPath id="terminal-1542824486-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-15">
+<clipPath id="terminal-1542824486-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-16">
+<clipPath id="terminal-1542824486-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-17">
+<clipPath id="terminal-1542824486-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-18">
+<clipPath id="terminal-1542824486-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-19">
+<clipPath id="terminal-1542824486-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-20">
+<clipPath id="terminal-1542824486-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-21">
+<clipPath id="terminal-1542824486-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-22">
+<clipPath id="terminal-1542824486-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-23">
+<clipPath id="terminal-1542824486-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-24">
+<clipPath id="terminal-1542824486-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-25">
+<clipPath id="terminal-1542824486-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-26">
+<clipPath id="terminal-1542824486-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-27">
+<clipPath id="terminal-1542824486-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-28">
+<clipPath id="terminal-1542824486-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-29">
+<clipPath id="terminal-1542824486-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-30">
+<clipPath id="terminal-1542824486-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-31">
+<clipPath id="terminal-1542824486-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-32">
+<clipPath id="terminal-1542824486-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-33">
+<clipPath id="terminal-1542824486-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-34">
+<clipPath id="terminal-1542824486-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-35">
+<clipPath id="terminal-1542824486-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-36">
+<clipPath id="terminal-1542824486-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-37">
+<clipPath id="terminal-1542824486-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-38">
+<clipPath id="terminal-1542824486-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-39">
+<clipPath id="terminal-1542824486-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-40">
+<clipPath id="terminal-1542824486-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-41">
+<clipPath id="terminal-1542824486-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-42">
+<clipPath id="terminal-1542824486-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-43">
+<clipPath id="terminal-1542824486-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-44">
+<clipPath id="terminal-1542824486-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-45">
+<clipPath id="terminal-1542824486-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-46">
+<clipPath id="terminal-1542824486-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-1542824486-line-47">
+    <rect x="0" y="1148.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-1542824486-line-48">
+    <rect x="0" y="1172.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="1219.2" rx="8"/><text class="terminal-751396731-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1268" rx="8"/><text class="terminal-1542824486-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-751396731-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-1542824486-clip-terminal)">
     
-    <g class="terminal-751396731-matrix">
-    <text class="terminal-751396731-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-751396731-line-0)">
-</text><text class="terminal-751396731-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-751396731-line-1)">Usage:&#160;</text><text class="terminal-751396731-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-751396731-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-751396731-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-751396731-line-1)">
-</text><text class="terminal-751396731-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-751396731-line-2)">
-</text><text class="terminal-751396731-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-751396731-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-751396731-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-751396731-line-3)">
-</text><text class="terminal-751396731-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-751396731-line-4)">
-</text><text class="terminal-751396731-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-751396731-line-5)">╭─</text><text class="terminal-751396731-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-751396731-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-751396731-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-751396731-l [...]
-</text><text class="terminal-751396731-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-751396731-line-6)">│</text><text class="terminal-751396731-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-751396731-line-6)">-</text><text class="terminal-751396731-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-751396731-line-6)">-type</text><text class="terminal-751396731-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-751396731-li [...]
-</text><text class="terminal-751396731-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-751396731-line-7)">│</text><text class="terminal-751396731-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-751396731-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-751396731-line-8)">│</text><text class="terminal-751396731-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-providers-have-extras&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="215.2" textLength="12.2"  [...]
-</text><text class="terminal-751396731-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-751396731-line-9)">│</text><text class="terminal-751396731-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-9)">check-apache-license-rat&#160;|&#160;check-base-operator-usage&#160;|&#160;check-boring-cyborg-configuration</text><text class="terminal-751396731-r4" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#terminal-751396731-line-9)">│</text><te [...]
-</text><text class="terminal-751396731-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-751396731-line-10)">│</text><text class="terminal-751396731-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-751396731-line-10)">|&#160;check-breeze-top-dependencies-limited&#160;|&#160;check-builtin-literals&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal- [...]
-</text><text class="terminal-751396731-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-751396731-line-11)">│</text><text class="terminal-751396731-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-11)">check-changelog-has-no-duplicates&#160;|&#160;check-daysago-import-from-utils&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x= [...]
-</text><text class="terminal-751396731-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-751396731-line-12)">│</text><text class="terminal-751396731-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-12)">check-docstring-param-types&#160;|&#160;check-executables-have-shebangs&#160;|&#160;&#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 cl [...]
-</text><text class="terminal-751396731-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-751396731-line-13)">│</text><text class="terminal-751396731-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-13)">check-extra-packages-references&#160;|&#160;check-extras-order&#160;|&#160;check-for-inclusive-language&#160;|&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-751396731-line-14)">│</text><text class="terminal-751396731-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-14)">check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-751396731-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-751396731-line-15)">│</text><text class="terminal-751396731-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-751396731-line-15)">check-integrations-are-consistent&#160;|&#160;check-merge-conflict&#160;|&#160;check-newsfragments-are-valid</text><text class="terminal-751396731-r4" x="1451.8" y="386" textLength="12.2" clip-path="url(#terminal-751396731-line-15)">│</text><text  [...]
-</text><text class="terminal-751396731-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-751396731-line-16)">│</text><text class="terminal-751396731-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-16)">|&#160;check-no-providers-in-core-examples&#160;|&#160;check-no-relative-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-7 [...]
-</text><text class="terminal-751396731-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-751396731-line-17)">│</text><text class="terminal-751396731-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-17)">check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-751396731-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-751396731-line-18)">│</text><text class="terminal-751396731-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#termina [...]
-</text><text class="terminal-751396731-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-751396731-line-19)">│</text><text class="terminal-751396731-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#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 cl [...]
-</text><text class="terminal-751396731-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-751396731-line-20)">│</text><text class="terminal-751396731-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-751396731-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="508" textLen [...]
-</text><text class="terminal-751396731-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-751396731-line-21)">│</text><text class="terminal-751396731-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="532.4" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-751396731-line-22)">│</text><text class="terminal-751396731-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;check-xml&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="556.8" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-751396731-line-23)">│</text><text class="terminal-751396731-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-23)">codespell&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="581.2" textLe [...]
-</text><text class="terminal-751396731-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-751396731-line-24)">│</text><text class="terminal-751396731-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-24)">fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&#160;identity&#160;|&#160;insert-license&#160;|&#160;isort&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y [...]
-</text><text class="terminal-751396731-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-751396731-line-25)">│</text><text class="terminal-751396731-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-751396731-line-25)">lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerfile&#160;|&#160;lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="630" textLength="12.2" clip-path="url [...]
-</text><text class="terminal-751396731-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-751396731-line-26)">│</text><text class="terminal-751396731-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-26)">lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-openapi&#160;|&#160;mixed-line-ending&#160;|&#160;pretty-format-json</text><text class="terminal-751396731-r4" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-751396731-line-27)">│</text><text class="terminal-751396731-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-27)">|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;|&#160;pyupgrade&#160;|&#160;rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="678.8" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-751396731-line-28)">│</text><text class="terminal-751396731-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-28)">run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;trailing-whitespace&#160;|&#160;update-breeze-cmd-output</text><text class="terminal-751396731-r4" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#terminal-751396731-line-28) [...]
-</text><text class="terminal-751396731-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-751396731-line-29)">│</text><text class="terminal-751396731-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-29)">|&#160;update-breeze-readme-config-hash&#160;|&#160;update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-751396731-line-30)">│</text><text class="terminal-751396731-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-751396731-line-30)">update-inlined-dockerfile-scripts&#160;|&#160;update-local-yml-file&#160;|&#160;update-migration-references&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-751396731-line-30)">│</text>< [...]
-</text><text class="terminal-751396731-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-751396731-line-31)">│</text><text class="terminal-751396731-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-31)">|&#160;update-providers-dependencies&#160;|&#160;update-setup-cfg-file&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-751396731-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-751396731-line-32)">│</text><text class="terminal-751396731-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-32)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396 [...]
-</text><text class="terminal-751396731-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-751396731-line-33)">│</text><text class="terminal-751396731-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-33)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r [...]
-</text><text class="terminal-751396731-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-751396731-line-34)">│</text><text class="terminal-751396731-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-751396731-line-34)">-</text><text class="terminal-751396731-r5" x="36.6" y="849.6" textLength="61" clip-path="url(#terminal-751396731-line-34)">-file</text><text class="terminal-751396731-r6" x="317.2" y="849.6" textLength="24.4" clip-path="url(#terminal-751396731 [...]
-</text><text class="terminal-751396731-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-751396731-line-35)">│</text><text class="terminal-751396731-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-751396731-line-35)">-</text><text class="terminal-751396731-r5" x="36.6" y="874" textLength="48.8" clip-path="url(#terminal-751396731-line-35)">-all</text><text class="terminal-751396731-r5" x="85.4" y="874" textLength="73.2" clip-path="url(#terminal-751396731-line-35 [...]
-</text><text class="terminal-751396731-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-751396731-line-36)">│</text><text class="terminal-751396731-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-751396731-line-36)">-</text><text class="terminal-751396731-r5" x="36.6" y="898.4" textLength="61" clip-path="url(#terminal-751396731-line-36)">-show</text><text class="terminal-751396731-r5" x="97.6" y="898.4" textLength="195.2" clip-path="url(#terminal-751396731 [...]
-</text><text class="terminal-751396731-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-751396731-line-37)">│</text><text class="terminal-751396731-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-751396731-line-37)">-</text><text class="terminal-751396731-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-751396731-line-37)">-last</text><text class="terminal-751396731-r5" x="97.6" y="922.8" textLength="85.4" clip-path="url(#terminal-751396731- [...]
-</text><text class="terminal-751396731-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-751396731-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-751396731-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-751396731-line-38)">
-</text><text class="terminal-751396731-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-751396731-line-39)">╭─</text><text class="terminal-751396731-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-751396731-line-39)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-751396731-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-751396731-line-40)">│</text><text class="terminal-751396731-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-751396731-line-40)">-</text><text class="terminal-751396731-r5" x="36.6" y="996" textLength="85.4" clip-path="url(#terminal-751396731-line-40)">-commit</text><text class="terminal-751396731-r5" x="122" y="996" textLength="48.8" clip-path="url(#terminal-751396731-line- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-751396731-line-41)">│</text><text class="terminal-751396731-r2" x="329.4" y="1020.4" textLength="183" clip-path="url(#terminal-751396731-line-41)">exclusive&#160;with&#160;</text><text class="terminal-751396731-r5" x="512.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-751396731-line-41)">-</text><text class="terminal-751396731-r5" x="524.6" y="1020.4" textLength="61" clip-path [...]
-</text><text class="terminal-751396731-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-751396731-line-42)">│</text><text class="terminal-751396731-r7" x="329.4" y="1044.8" textLength="1110.2" clip-path="url(#terminal-751396731-line-42)">(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 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-751396731-line-43)">│</text><text class="terminal-751396731-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-751396731-line-43)">-</text><text class="terminal-751396731-r5" x="36.6" y="1069.2" textLength="97.6" clip-path="url(#terminal-751396731-line-43)">-verbose</text><text class="terminal-751396731-r6" x="280.6" y="1069.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-751396731-line-44)">│</text><text class="terminal-751396731-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-751396731-line-44)">-</text><text class="terminal-751396731-r5" x="36.6" y="1093.6" textLength="48.8" clip-path="url(#terminal-751396731-line-44)">-dry</text><text class="terminal-751396731-r5" x="85.4" y="1093.6" textLength="48.8" clip-path="url(#terminal-75139 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-751396731-line-45)">│</text><text class="terminal-751396731-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-751396731-line-45)">-</text><text class="terminal-751396731-r5" x="36.6" y="1118" textLength="85.4" clip-path="url(#terminal-751396731-line-45)">-github</text><text class="terminal-751396731-r5" x="122" y="1118" textLength="134.2" clip-path="url(#terminal-751396731- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-751396731-line-46)">│</text><text class="terminal-751396731-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-751396731-line-46)">-</text><text class="terminal-751396731-r5" x="36.6" y="1142.4" textLength="61" clip-path="url(#terminal-751396731-line-46)">-help</text><text class="terminal-751396731-r6" x="280.6" y="1142.4" textLength="24.4" clip-path="url(#terminal-75139 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1166.8" textLength="1464" clip-path="url(#terminal-751396731-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-751396731-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#terminal-751396731-line-47)">
+    <g class="terminal-1542824486-matrix">
+    <text class="terminal-1542824486-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1542824486-line-0)">
+</text><text class="terminal-1542824486-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1542824486-line-1)">Usage:&#160;</text><text class="terminal-1542824486-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-1542824486-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-1542824486-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-1)">
+</text><text class="terminal-1542824486-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-2)">
+</text><text class="terminal-1542824486-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-1542824486-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-1542824486-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-3)">
+</text><text class="terminal-1542824486-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-4)">
+</text><text class="terminal-1542824486-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1542824486-line-5)">╭─</text><text class="terminal-1542824486-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1542824486-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1542824486-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-154282 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-6)">│</text><text class="terminal-1542824486-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-6)">-</text><text class="terminal-1542824486-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-1542824486-line-6)">-type</text><text class="terminal-1542824486-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-15428 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-7)">│</text><text class="terminal-1542824486-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-8)">│</text><text class="terminal-1542824486-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-providers-have-extras&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="215.2" textLength="1 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-9)">│</text><text class="terminal-1542824486-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-9)">check-apache-license-rat&#160;|&#160;check-base-operator-usage&#160;|&#160;check-boring-cyborg-configuration</text><text class="terminal-1542824486-r4" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-9)">│</te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1542824486-line-10)">│</text><text class="terminal-1542824486-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-1542824486-line-10)">|&#160;check-breeze-top-dependencies-limited&#160;|&#160;check-builtin-literals&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termi [...]
+</text><text class="terminal-1542824486-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-11)">│</text><text class="terminal-1542824486-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-11)">check-changelog-has-no-duplicates&#160;|&#160;check-daysago-import-from-utils&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r [...]
+</text><text class="terminal-1542824486-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-12)">│</text><text class="terminal-1542824486-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-12)">check-docstring-param-types&#160;|&#160;check-executables-have-shebangs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-13)">│</text><text class="terminal-1542824486-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-13)">check-extra-packages-references&#160;|&#160;check-extras-order&#160;|&#160;check-for-inclusive-language&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-14)">│</text><text class="terminal-1542824486-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-14)">check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1542824486-line-15)">│</text><text class="terminal-1542824486-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-1542824486-line-15)">check-integrations-are-consistent&#160;|&#160;check-merge-conflict&#160;|&#160;check-newsfragments-are-valid</text><text class="terminal-1542824486-r4" x="1451.8" y="386" textLength="12.2" clip-path="url(#terminal-1542824486-line-15)">│</text> [...]
+</text><text class="terminal-1542824486-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-16)">│</text><text class="terminal-1542824486-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-16)">|&#160;check-no-providers-in-core-examples&#160;|&#160;check-no-relative-imports&#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="termin [...]
+</text><text class="terminal-1542824486-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-17)">│</text><text class="terminal-1542824486-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-17)">check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-18)">│</text><text class="terminal-1542824486-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-19)">│</text><text class="terminal-1542824486-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1542824486-line-20)">│</text><text class="terminal-1542824486-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-1542824486-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="508" te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-21)">│</text><text class="terminal-1542824486-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="532.4" textLength="12.2" cli [...]
+</text><text class="terminal-1542824486-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-22)">│</text><text class="terminal-1542824486-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-23)">│</text><text class="terminal-1542824486-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-23)">check-system-tests-tocs&#160;|&#160;check-xml&#160;|&#160;codespell&#160;|&#160;compile-www-assets&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termin [...]
+</text><text class="terminal-1542824486-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-24)">│</text><text class="terminal-1542824486-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-24)">create-missing-init-py-files-tests&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-1542824486-line-25)">│</text><text class="terminal-1542824486-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-1542824486-line-25)">end-of-file-fixer&#160;|&#160;fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&#160;identity&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486- [...]
+</text><text class="terminal-1542824486-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-26)">│</text><text class="terminal-1542824486-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-26)">insert-license&#160;|&#160;isort&#160;|&#160;lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerfile&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-27)">│</text><text class="terminal-1542824486-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-27)">lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-openapi&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="678.8" textLength="12.2" clip-pat [...]
+</text><text class="terminal-1542824486-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-28)">│</text><text class="terminal-1542824486-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-28)">mixed-line-ending&#160;|&#160;pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;|&#160;pyupgrade&#160;|&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="703.2" textLength="12.2" clip-path="ur [...]
+</text><text class="terminal-1542824486-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-29)">│</text><text class="terminal-1542824486-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-29)">rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="727.6" textLe [...]
+</text><text class="terminal-1542824486-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1542824486-line-30)">│</text><text class="terminal-1542824486-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-1542824486-line-30)">trailing-whitespace&#160;|&#160;update-breeze-cmd-output&#160;|&#160;update-breeze-readme-config-hash&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal [...]
+</text><text class="terminal-1542824486-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-31)">│</text><text class="terminal-1542824486-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-31)">update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dockerfile-scripts&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-32)">│</text><text class="terminal-1542824486-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-32)">update-local-yml-file&#160;|&#160;update-migration-references&#160;|&#160;update-providers-dependencies&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-33)">│</text><text class="terminal-1542824486-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-33)">update-setup-cfg-file&#160;|&#160;update-spelling-wordlist-to-be-sorted&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-34)">│</text><text class="terminal-1542824486-r7" x="366" y="849.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-34)">update-supported-versions&#160;|&#160;update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="849.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-1542824486-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1542824486-line-35)">│</text><text class="terminal-1542824486-r7" x="366" y="874" textLength="1073.6" clip-path="url(#terminal-1542824486-line-35)">yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-1542824486-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-36)">│</text><text class="terminal-1542824486-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-36)">-</text><text class="terminal-1542824486-r5" x="36.6" y="898.4" textLength="61" clip-path="url(#terminal-1542824486-line-36)">-file</text><text class="terminal-1542824486-r6" x="317.2" y="898.4" textLength="24.4" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-37)">│</text><text class="terminal-1542824486-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-37)">-</text><text class="terminal-1542824486-r5" x="36.6" y="922.8" textLength="48.8" clip-path="url(#terminal-1542824486-line-37)">-all</text><text class="terminal-1542824486-r5" x="85.4" y="922.8" textLength="73.2" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-38)">│</text><text class="terminal-1542824486-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-38)">-</text><text class="terminal-1542824486-r5" x="36.6" y="947.2" textLength="61" clip-path="url(#terminal-1542824486-line-38)">-show</text><text class="terminal-1542824486-r5" x="97.6" y="947.2" textLength="195.2" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-39)">│</text><text class="terminal-1542824486-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-39)">-</text><text class="terminal-1542824486-r5" x="36.6" y="971.6" textLength="61" clip-path="url(#terminal-1542824486-line-39)">-last</text><text class="terminal-1542824486-r5" x="97.6" y="971.6" textLength="85.4" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="996" textLength="1464" clip-path="url(#terminal-1542824486-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1542824486-r2" x="1464" y="996" textLength="12.2" clip-path="url(#terminal-1542824486-line-40)">
+</text><text class="terminal-1542824486-r4" x="0" y="1020.4" textLength="24.4" clip-path="url(#terminal-1542824486-line-41)">╭─</text><text class="terminal-1542824486-r4" x="24.4" y="1020.4" textLength="1415.2" clip-path="url(#terminal-1542824486-line-41)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1542824486-r4" x="1439.6" y="1020.4" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-42)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-42)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1044.8" textLength="85.4" clip-path="url(#terminal-1542824486-line-42)">-commit</text><text class="terminal-1542824486-r5" x="122" y="1044.8" textLength="48.8" clip-path="url(#termi [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-43)">│</text><text class="terminal-1542824486-r2" x="329.4" y="1069.2" textLength="183" clip-path="url(#terminal-1542824486-line-43)">exclusive&#160;with&#160;</text><text class="terminal-1542824486-r5" x="512.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-43)">-</text><text class="terminal-1542824486-r5" x="524.6" y="1069.2" textLength="61" cl [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-44)">│</text><text class="terminal-1542824486-r7" x="329.4" y="1093.6" textLength="1110.2" clip-path="url(#terminal-1542824486-line-44)">(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;& [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1542824486-line-45)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-1542824486-line-45)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1118" textLength="97.6" clip-path="url(#terminal-1542824486-line-45)">-verbose</text><text class="terminal-1542824486-r6" x="280.6" y="1118" textLength="24.4" clip-path="url(#terminal-1 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-46)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-46)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1142.4" textLength="48.8" clip-path="url(#terminal-1542824486-line-46)">-dry</text><text class="terminal-1542824486-r5" x="85.4" y="1142.4" textLength="48.8" clip-path="url(#termina [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-47)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-47)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1166.8" textLength="85.4" clip-path="url(#terminal-1542824486-line-47)">-github</text><text class="terminal-1542824486-r5" x="122" y="1166.8" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-48)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-48)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1191.2" textLength="61" clip-path="url(#terminal-1542824486-line-48)">-help</text><text class="terminal-1542824486-r6" x="280.6" y="1191.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1215.6" textLength="1464" clip-path="url(#terminal-1542824486-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1542824486-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-49)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/libraries/_initialization.sh b/scripts/ci/libraries/_initialization.sh
index 96d3a65bf7..a7727f23eb 100644
--- a/scripts/ci/libraries/_initialization.sh
+++ b/scripts/ci/libraries/_initialization.sh
@@ -217,26 +217,12 @@ function initialization::initialize_available_integrations() {
 FILES_FOR_REBUILD_CHECK=()
 
 # Determine which files trigger rebuild check
-#
-# !!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!
-#  When you add files here, please make sure to not add files
-#  with the same name. And if you do - make sure that files with the
-#  same name are stored in directories with different name. For
-#  example we have two package.json files here, but they are in
-#  directories with different names (`www` and `ui`).
-#  The problem is that md5 hashes of those files are stored in
-#  `./build/directory` in the same directory as <PARENT_DIR>-<FILE>.md5sum.
-#  For example md5sum of the `airflow/www/package.json` file is stored
-#  as `www-package.json` and `airflow/ui/package.json` as `ui-package.json`,
-#  The file list here changes extremely rarely.
-# !!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!
 function initialization::initialize_files_for_rebuild_check() {
     FILES_FOR_REBUILD_CHECK+=(
         "setup.py"
         "setup.cfg"
         "Dockerfile.ci"
         ".dockerignore"
-        "scripts/docker/compile_www_assets.sh"
         "scripts/docker/common.sh"
         "scripts/docker/install_additional_dependencies.sh"
         "scripts/docker/install_airflow.sh"
@@ -244,11 +230,6 @@ function initialization::initialize_files_for_rebuild_check() {
         "scripts/docker/install_from_docker_context_files.sh"
         "scripts/docker/install_mysql.sh"
         "scripts/docker/install_postgres.sh"
-        "airflow/www/package.json"
-        "airflow/www/yarn.lock"
-        "airflow/www/webpack.config.js"
-        "airflow/ui/package.json"
-        "airflow/ui/yarn.lock"
     )
 }
 
@@ -440,13 +421,6 @@ function initialization::initialize_image_build_variables() {
     AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES_TO:="/Dockerfile"}
     export AIRFLOW_SOURCES_TO
 
-    # By default no sources are copied to image
-    AIRFLOW_SOURCES_WWW_FROM=${AIRFLOW_SOURCES_WWW_FROM:="Dockerfile"}
-    export AIRFLOW_SOURCES_WWW_FROM
-
-    AIRFLOW_SOURCES_WWW_TO=${AIRFLOW_SOURCES_WWW_TO:="/Dockerfile"}
-    export AIRFLOW_SOURCES_WWW_TO
-
     # By default in scripts production docker image is installed from PyPI package
     export AIRFLOW_INSTALLATION_METHOD=${AIRFLOW_INSTALLATION_METHOD:="apache-airflow"}
 
@@ -735,8 +709,6 @@ Production image build variables:
     AIRFLOW_VERSION_SPECIFICATION: '${AIRFLOW_VERSION_SPECIFICATION}'
     AIRFLOW_SOURCES_FROM: '${AIRFLOW_SOURCES_FROM}'
     AIRFLOW_SOURCES_TO: '${AIRFLOW_SOURCES_TO}'
-    AIRFLOW_SOURCES_WWW_FROM: '${AIRFLOW_SOURCES_WWW_FROM}'
-    AIRFLOW_SOURCES_WWW_TO: '${AIRFLOW_SOURCES_WWW_TO}'
 
 Detected GitHub environment:
 
diff --git a/airflow/www/compile_assets.sh b/scripts/ci/pre_commit/pre_commit_compile_www_assets.py
similarity index 60%
copy from airflow/www/compile_assets.sh
copy to scripts/ci/pre_commit/pre_commit_compile_www_assets.py
index ba4576614d..c7dfae9936 100755
--- a/airflow/www/compile_assets.sh
+++ b/scripts/ci/pre_commit/pre_commit_compile_www_assets.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/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
@@ -15,20 +15,16 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import subprocess
+from pathlib import Path
 
-set -e
+if __name__ not in ("__main__", "__mp_main__"):
+    raise SystemExit(
+        "This file is intended to be executed as an executable program. You cannot use it as a module."
+        f"To run this script, run the ./{__file__} command"
+    )
 
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
+if __name__ == '__main__':
+    dir = Path("airflow") / "www"
+    subprocess.check_call(['yarn', 'install', '--frozen-lockfile'], cwd=str(dir))
+    subprocess.check_call(['yarn', 'run', 'build'], cwd=str(dir))
diff --git a/scripts/ci/pre_commit/pre_commit_ui_lint.py b/scripts/ci/pre_commit/pre_commit_ui_lint.py
index 5812344a45..eee7526564 100755
--- a/scripts/ci/pre_commit/pre_commit_ui_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_ui_lint.py
@@ -15,8 +15,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-import os
-import sys
+import subprocess
 from pathlib import Path
 
 if __name__ not in ("__main__", "__mp_main__"):
@@ -25,38 +24,7 @@ if __name__ not in ("__main__", "__mp_main__"):
         f"To run this script, run the ./{__file__} command"
     )
 
-AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
-# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
-VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
-DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
-
 if __name__ == '__main__':
-    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
-    from airflow_breeze.global_constants import MOUNT_SELECTED
-    from airflow_breeze.utils.docker_command_utils import get_extra_docker_flags
-    from airflow_breeze.utils.path_utils import create_static_check_volumes
-    from airflow_breeze.utils.run_utils import get_runnable_ci_image, run_command
-
-    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
-    create_static_check_volumes()
-    cmd_result = run_command(
-        [
-            "docker",
-            "run",
-            "-t",
-            *get_extra_docker_flags(MOUNT_SELECTED),
-            "-e",
-            "SKIP_ENVIRONMENT_INITIALIZATION=true",
-            "-e",
-            "PRINT_INFO_FROM_SCRIPTS=false",
-            "--pull",
-            "never",
-            airflow_image,
-            "-c",
-            'cd airflow/ui && yarn --frozen-lockfile --non-interactive && yarn run lint',
-        ],
-        check=False,
-        verbose=VERBOSE,
-        dry_run=DRY_RUN,
-    )
-    sys.exit(cmd_result.returncode)
+    dir = Path("airflow") / "ui"
+    subprocess.check_call(['yarn', '--frozen-lockfile', '--non-interactive'], cwd=str(dir))
+    subprocess.check_call(['yarn', 'run', 'lint'], cwd=str(dir))
diff --git a/scripts/ci/pre_commit/pre_commit_www_lint.py b/scripts/ci/pre_commit/pre_commit_www_lint.py
index b22750c56d..472c20b98e 100755
--- a/scripts/ci/pre_commit/pre_commit_www_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_www_lint.py
@@ -15,8 +15,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-import os
-import sys
+import subprocess
 from pathlib import Path
 
 if __name__ not in ("__main__", "__mp_main__"):
@@ -25,39 +24,7 @@ if __name__ not in ("__main__", "__mp_main__"):
         f"To run this script, run the ./{__file__} command"
     )
 
-AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
-GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
-# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
-VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
-DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
-
 if __name__ == '__main__':
-    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
-    from airflow_breeze.global_constants import MOUNT_SELECTED
-    from airflow_breeze.utils.docker_command_utils import get_extra_docker_flags
-    from airflow_breeze.utils.path_utils import create_static_check_volumes
-    from airflow_breeze.utils.run_utils import get_runnable_ci_image, run_command
-
-    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
-    create_static_check_volumes()
-    cmd_result = run_command(
-        [
-            "docker",
-            "run",
-            "-t",
-            *get_extra_docker_flags(MOUNT_SELECTED),
-            "-e",
-            "SKIP_ENVIRONMENT_INITIALIZATION=true",
-            "-e",
-            "PRINT_INFO_FROM_SCRIPTS=false",
-            "--pull",
-            "never",
-            airflow_image,
-            "-c",
-            'cd airflow/www && yarn --frozen-lockfile --non-interactive && yarn run lint',
-        ],
-        check=False,
-        verbose=VERBOSE,
-        dry_run=DRY_RUN,
-    )
-    sys.exit(cmd_result.returncode)
+    dir = Path("airflow") / "www"
+    subprocess.check_call(['yarn', '--frozen-lockfile', '--non-interactive'], cwd=dir)
+    subprocess.check_call(['yarn', 'run', 'lint'], cwd=dir)
diff --git a/scripts/docker/compile_www_assets.sh b/scripts/docker/compile_www_assets.sh
deleted file mode 100644
index 7bc87d85e9..0000000000
--- a/scripts/docker/compile_www_assets.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-# 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.
-# shellcheck shell=bash disable=SC2086
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-# Installs additional dependencies passed as Argument to the Docker build command
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index ae4961ea64..ef6d092779 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -71,11 +71,6 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
         echo
         echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
         echo
-        if [[ -d "${AIRFLOW_SOURCES}/airflow/www/" ]]; then
-            pushd "${AIRFLOW_SOURCES}/airflow/www/" >/dev/null
-            ./ask_for_recompile_assets_if_needed.sh
-            popd >/dev/null
-        fi
         # Cleanup the logs, tmp when entering the environment
         sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
         sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
@@ -203,6 +198,8 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
     touch /usr/lib/google-cloud-sdk/bin/gcloud
     ln -s -f /usr/bin/gcloud /usr/lib/google-cloud-sdk/bin/gcloud
 
+    in_container_fix_ownership
+
     if [[ ${SKIP_SSH_SETUP="false"} == "false" ]]; then
         # Set up ssh keys
         echo 'yes' | ssh-keygen -t rsa -C your_email@youremail.com -m PEM -P '' -f ~/.ssh/id_rsa \
diff --git a/scripts/docker/prepare_node_modules.sh b/scripts/docker/prepare_node_modules.sh
deleted file mode 100644
index 6c39de9c4d..0000000000
--- a/scripts/docker/prepare_node_modules.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-# 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.
-# shellcheck shell=bash disable=SC2086
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-# Prepares node modules needed to compile WWW assets
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
diff --git a/scripts/in_container/_in_container_utils.sh b/scripts/in_container/_in_container_utils.sh
index 66f2e6b083..cf35acc943 100644
--- a/scripts/in_container/_in_container_utils.sh
+++ b/scripts/in_container/_in_container_utils.sh
@@ -127,23 +127,21 @@ function in_container_fix_ownership() {
         DIRECTORIES_TO_FIX=(
             "/dist"
             "/files"
-            "/root/.aws"
-            "/root/.azure"
-            "/root/.config/gcloud"
-            "/root/.docker"
             "/opt/airflow/logs"
             "/opt/airflow/docs"
             "/opt/airflow/dags"
-            "${AIRFLOW_SOURCES}"
+            "/opt/airflow/airflow/"
         )
-        echo
-        echo "${COLOR_BLUE}Fixing ownership of generated files as Host OS is ${HOST_OS}${COLOR_RESET}"
-        echo "${COLOR_BLUE}Directories: ${DIRECTORIES_TO_FIX[*]}${COLOR_RESET}"
-        echo
-        find "${DIRECTORIES_TO_FIX[@]}" -print0 -user root 2>/dev/null |
-            xargs --null chown "${HOST_USER_ID}.${HOST_GROUP_ID}" --no-dereference || true >/dev/null 2>&1
-        echo "${COLOR_BLUE}Fixed ownership of generated files."
-        echo
+        count_matching=$(find "${DIRECTORIES_TO_FIX[@]}" -mindepth 1 -user root -printf . 2>/dev/null | wc -m || true)
+        if [[ ${count_matching=} != "0" && ${count_matching=} != "" ]]; then
+            echo
+            echo "${COLOR_BLUE}Fixing ownership of ${count_matching} root owned files on ${HOST_OS}${COLOR_RESET}"
+            echo
+            find "${DIRECTORIES_TO_FIX[@]}" -mindepth 1 -user root -print0 2> /dev/null |
+                xargs --null chown "${HOST_USER_ID}.${HOST_GROUP_ID}" --no-dereference || true >/dev/null 2>&1
+            echo "${COLOR_BLUE}Fixed ownership of generated files${COLOR_RESET}."
+            echo
+        fi
      else
         echo
         echo "${COLOR_YELLOW}Skip fixing ownership of generated files as Host OS is ${HOST_OS}${COLOR_RESET}"
diff --git a/scripts/in_container/run_prepare_airflow_packages.sh b/scripts/in_container/run_prepare_airflow_packages.sh
index 791724d2bb..50d4fb8f8a 100755
--- a/scripts/in_container/run_prepare_airflow_packages.sh
+++ b/scripts/in_container/run_prepare_airflow_packages.sh
@@ -63,7 +63,7 @@ function prepare_airflow_packages() {
     fi
 
     # Prepare airflow's wheel
-    PYTHONUNBUFFERED=1 python setup.py compile_assets "${tag_build[@]}" "${packages[@]}"
+    PYTHONUNBUFFERED=1 python setup.py "${tag_build[@]}" "${packages[@]}"
 
     # clean-up
     rm -rf -- *egg-info*
diff --git a/airflow/www/compile_assets.sh b/tests/internal_api/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/internal_api/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/internal_api/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/providers/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/apache/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/providers/apache/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/apache/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/google/__init__.py
old mode 100755
new mode 100644
similarity index 67%
rename from airflow/www/compile_assets.sh
rename to tests/system/providers/google/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/google/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"


[airflow] 02/12: Fix PR label detection in CI (#25148)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 436fe2d84877501b21e21450cf1167ec2fbd5fce
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 12:25:17 2022 +0200

    Fix PR label detection in CI (#25148)
    
    Label detection for incoming PR had few bugs:
    
    * wrong name of output was used for Build Info
    * assumption in selective checks was that PR labels are
      space separated, but they were really array formatted.
    * there was a $ typo in build-images.yaml
    
    This PR fixes all that:
    * output name and typo is corrected
    * we use ast.literal_eval now to parse the PR labels.
    
    (cherry picked from commit 9a939150c3bb02180e68edcc5ba62f50a0a219f7)
---
 .github/workflows/build-images.yml                 |   2 +-
 .github/workflows/ci.yml                           |   6 +-
 .../src/airflow_breeze/commands/ci_commands.py     |   5 +-
 .../src/airflow_breeze/utils/selective_checks.py   |   5 +-
 images/breeze/output-commands-hash.txt             |   2 +-
 images/breeze/output-selective-check.svg           | 112 ++++++++++-----------
 6 files changed, 68 insertions(+), 64 deletions(-)

diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index d21aa522e4..dc758877f7 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -154,7 +154,7 @@ jobs:
       - name: Selective checks
         id: selective-checks
         env:
-          PR_LABELS: "$${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}"
           COMMIT_REF: "${{ env.TARGET_COMMIT_SHA }}"
         run: breeze selective-check
       - name: env
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aa6c21fd9b..71514b8245 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -230,7 +230,7 @@ jobs:
       - name: Selective checks
         id: selective-checks
         env:
-          PR_LABELS: "${{ steps.source-run-info.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.source-run-info.outputs.pullRequestLabels }}"
           COMMIT_REF: "${{ github.sha }}"
         run: breeze selective-check
       # Avoid having to specify the runs-on logic every time. We use the custom
@@ -239,7 +239,7 @@ jobs:
       - name: Set runs-on
         id: set-runs-on
         env:
-          PR_LABELS: "${{ steps.source-run-info.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.source-run-info.outputs.pullRequestLabels }}"
         run: |
           if [[ ${PR_LABELS=} == *"use public runners"* ]]; then
             echo "Forcing running on Public Runners via `use public runners` label"
@@ -290,7 +290,7 @@ jobs:
       - name: env
         run: printenv
         env:
-          PR_LABELS: ${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}
+          PR_LABELS: ${{ steps.source-run-info.outputs.pullRequestLabels }}
           GITHUB_CONTEXT: ${{ toJson(github) }}
 
   build-ci-images:
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index cb2d05f94d..cd9d05fa49 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import ast
 import os
 import platform
 import subprocess
@@ -244,7 +245,7 @@ def get_changed_files(commit_ref: Optional[str], dry_run: bool, verbose: bool) -
 )
 @click.option(
     '--pr-labels',
-    help="Space-separate list of labels which are valid for the PR",
+    help="Python array formatted PR labels assigned to the PR",
     default="",
     envvar="PR_LABELS",
 )
@@ -296,7 +297,7 @@ def selective_check(
         default_branch=default_branch,
         default_constraints_branch=default_constraints_branch,
         debian_version=debian_version,
-        pr_labels=tuple(" ".split(pr_labels)) if pr_labels else (),
+        pr_labels=tuple(ast.literal_eval(pr_labels)) if pr_labels else (),
         github_event=github_event,
     )
     print(str(sc))
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index d3277e7b7e..642bb75043 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -311,7 +311,10 @@ class SelectiveChecks:
             get_console().print(f"[warning]Full tests needed because event is {self._github_event}[/]")
             return True
         if FULL_TESTS_NEEDED_LABEL in self._pr_labels:
-            get_console().print(f"[warning]Full tests needed because labels are {self._pr_labels}[/]")
+            get_console().print(
+                "[warning]Full tests needed because "
+                f"label '{FULL_TESTS_NEEDED_LABEL}' is in  {self._pr_labels}[/]"
+            )
             return True
         return False
 
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index e3ddc61f81..a3b911c335 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -23,7 +23,7 @@ pull-prod-image:6e8467a2b8c833a392c8bdd65189363e
 regenerate-command-images:4fd2e7ecbfd6eebb18b854f3eb0f29c8
 release-prod-images:8858fe5a13989c7c65a79dc97a880928
 resource-check:0fb929ac3496dbbe97acfe99e35accd7
-selective-check:9b1cc2827b36be29141083dc9e9f6290
+selective-check:4be1ea17278fba654761531be0e3811a
 self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786
diff --git a/images/breeze/output-selective-check.svg b/images/breeze/output-selective-check.svg
index 02ab2644d7..a1e143b10c 100644
--- a/images/breeze/output-selective-check.svg
+++ b/images/breeze/output-selective-check.svg
@@ -19,129 +19,129 @@
         font-weight: 700;
     }
 
-    .terminal-3947339877-matrix {
+    .terminal-516398974-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-3947339877-title {
+    .terminal-516398974-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-3947339877-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-3947339877-r2 { fill: #c5c8c6 }
-.terminal-3947339877-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3947339877-r4 { fill: #868887 }
-.terminal-3947339877-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-3947339877-r6 { fill: #8d7b39 }
-.terminal-3947339877-r7 { fill: #98a84b;font-weight: bold }
+    .terminal-516398974-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-516398974-r2 { fill: #c5c8c6 }
+.terminal-516398974-r3 { fill: #d0b344;font-weight: bold }
+.terminal-516398974-r4 { fill: #868887 }
+.terminal-516398974-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-516398974-r6 { fill: #8d7b39 }
+.terminal-516398974-r7 { fill: #98a84b;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-3947339877-clip-terminal">
+    <clipPath id="terminal-516398974-clip-terminal">
       <rect x="0" y="0" width="1463.0" height="535.8" />
     </clipPath>
-    <clipPath id="terminal-3947339877-line-0">
+    <clipPath id="terminal-516398974-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-1">
+<clipPath id="terminal-516398974-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-2">
+<clipPath id="terminal-516398974-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-3">
+<clipPath id="terminal-516398974-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-4">
+<clipPath id="terminal-516398974-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-5">
+<clipPath id="terminal-516398974-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-6">
+<clipPath id="terminal-516398974-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-7">
+<clipPath id="terminal-516398974-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-8">
+<clipPath id="terminal-516398974-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-9">
+<clipPath id="terminal-516398974-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-10">
+<clipPath id="terminal-516398974-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-11">
+<clipPath id="terminal-516398974-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-12">
+<clipPath id="terminal-516398974-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-13">
+<clipPath id="terminal-516398974-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-14">
+<clipPath id="terminal-516398974-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-15">
+<clipPath id="terminal-516398974-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-16">
+<clipPath id="terminal-516398974-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-17">
+<clipPath id="terminal-516398974-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-18">
+<clipPath id="terminal-516398974-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-19">
+<clipPath id="terminal-516398974-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-20">
+<clipPath id="terminal-516398974-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="584.8" rx="8"/><text class="terminal-3947339877-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;selective-check</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="584.8" rx="8"/><text class="terminal-516398974-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;selective-check</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-3947339877-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-516398974-clip-terminal)">
     
-    <g class="terminal-3947339877-matrix">
-    <text class="terminal-3947339877-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3947339877-line-0)">
-</text><text class="terminal-3947339877-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3947339877-line-1)">Usage:&#160;</text><text class="terminal-3947339877-r1" x="97.6" y="44.4" textLength="390.4" clip-path="url(#terminal-3947339877-line-1)">breeze&#160;selective-check&#160;[OPTIONS]</text><text class="terminal-3947339877-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-1)">
-</text><text class="terminal-3947339877-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-2)">
-</text><text class="terminal-3947339877-r2" x="12.2" y="93.2" textLength="768.6" clip-path="url(#terminal-3947339877-line-3)">Checks&#160;what&#160;kind&#160;of&#160;tests&#160;should&#160;be&#160;run&#160;for&#160;an&#160;incoming&#160;commit.</text><text class="terminal-3947339877-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-3)">
-</text><text class="terminal-3947339877-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-4)">
-</text><text class="terminal-3947339877-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3947339877-line-5)">╭─</text><text class="terminal-3947339877-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3947339877-line-5)">&#160;Selective&#160;check&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3947339877-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-3 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-6)">│</text><text class="terminal-3947339877-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-6)">-</text><text class="terminal-3947339877-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-3947339877-line-6)">-commit</text><text class="terminal-3947339877-r5" x="122" y="166.4" textLength="48.8" clip-path="url(#terminal-394 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-7)">│</text><text class="terminal-3947339877-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-7)">-</text><text class="terminal-3947339877-r5" x="36.6" y="190.8" textLength="36.6" clip-path="url(#terminal-3947339877-line-7)">-pr</text><text class="terminal-3947339877-r5" x="73.2" y="190.8" textLength="85.4" clip-path="url(#terminal-394733 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-8)">│</text><text class="terminal-3947339877-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-8)">-</text><text class="terminal-3947339877-r5" x="36.6" y="215.2" textLength="97.6" clip-path="url(#terminal-3947339877-line-8)">-default</text><text class="terminal-3947339877-r5" x="134.2" y="215.2" textLength="85.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-3947339877-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-9)">│</text><text class="terminal-3947339877-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-9)">-</text><text class="terminal-3947339877-r5" x="36.6" y="239.6" textLength="85.4" clip-path="url(#terminal-3947339877-line-9)">-github</text><text class="terminal-3947339877-r5" x="122" y="239.6" textLength="134.2" clip-path="url(#terminal-39 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3947339877-line-10)">│</text><text class="terminal-3947339877-r6" x="305" y="264" textLength="1134.6" clip-path="url(#terminal-3947339877-line-10)">(pull_request&#160;|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;&#160;&#160;</text><text class="terminal-3947339877-r4" x="1451.8" y="264" textLength="12.2" clip-path [...]
-</text><text class="terminal-3947339877-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-11)">│</text><text class="terminal-3947339877-r6" x="305" y="288.4" textLength="1134.6" clip-path="url(#terminal-3947339877-line-11)">schedule&#160;|&#160;workflow_run)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3947339877-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-12)">│</text><text class="terminal-3947339877-r4" x="305" y="312.8" textLength="1134.6" clip-path="url(#terminal-3947339877-line-12)">[default:&#160;pull_request]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3947339877-r4" x="0" y="337.2" textLength="1464" clip-path="url(#terminal-3947339877-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3947339877-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-13)">
-</text><text class="terminal-3947339877-r4" x="0" y="361.6" textLength="24.4" clip-path="url(#terminal-3947339877-line-14)">╭─</text><text class="terminal-3947339877-r4" x="24.4" y="361.6" textLength="1415.2" clip-path="url(#terminal-3947339877-line-14)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3947339877-r4" x="1439.6" y="361.6" textLength="24.4" clip-path="url(#terminal-394 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3947339877-line-15)">│</text><text class="terminal-3947339877-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-3947339877-line-15)">-</text><text class="terminal-3947339877-r5" x="36.6" y="386" textLength="97.6" clip-path="url(#terminal-3947339877-line-15)">-default</text><text class="terminal-3947339877-r5" x="134.2" y="386" textLength="231.8" clip-path="url(#terminal-3947 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-16)">│</text><text class="terminal-3947339877-r4" x="439.2" y="410.4" textLength="756.4" clip-path="url(#terminal-3947339877-line-16)">[default:&#160;constraints-main]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-3947339877-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-17)">│</text><text class="terminal-3947339877-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-17)">-</text><text class="terminal-3947339877-r5" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-3947339877-line-17)">-debian</text><text class="terminal-3947339877-r5" x="122" y="434.8" textLength="97.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-3947339877-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-18)">│</text><text class="terminal-3947339877-r5" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-18)">-</text><text class="terminal-3947339877-r5" x="36.6" y="459.2" textLength="97.6" clip-path="url(#terminal-3947339877-line-18)">-verbose</text><text class="terminal-3947339877-r7" x="390.4" y="459.2" textLength="24.4" clip-path="url(#termin [...]
-</text><text class="terminal-3947339877-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-19)">│</text><text class="terminal-3947339877-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-19)">-</text><text class="terminal-3947339877-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-3947339877-line-19)">-dry</text><text class="terminal-3947339877-r5" x="85.4" y="483.6" textLength="48.8" clip-path="url(#terminal-39 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3947339877-line-20)">│</text><text class="terminal-3947339877-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-3947339877-line-20)">-</text><text class="terminal-3947339877-r5" x="36.6" y="508" textLength="61" clip-path="url(#terminal-3947339877-line-20)">-help</text><text class="terminal-3947339877-r7" x="390.4" y="508" textLength="24.4" clip-path="url(#terminal-3947339877 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="532.4" textLength="1464" clip-path="url(#terminal-3947339877-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3947339877-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-21)">
+    <g class="terminal-516398974-matrix">
+    <text class="terminal-516398974-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-516398974-line-0)">
+</text><text class="terminal-516398974-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-516398974-line-1)">Usage:&#160;</text><text class="terminal-516398974-r1" x="97.6" y="44.4" textLength="390.4" clip-path="url(#terminal-516398974-line-1)">breeze&#160;selective-check&#160;[OPTIONS]</text><text class="terminal-516398974-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-516398974-line-1)">
+</text><text class="terminal-516398974-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-516398974-line-2)">
+</text><text class="terminal-516398974-r2" x="12.2" y="93.2" textLength="768.6" clip-path="url(#terminal-516398974-line-3)">Checks&#160;what&#160;kind&#160;of&#160;tests&#160;should&#160;be&#160;run&#160;for&#160;an&#160;incoming&#160;commit.</text><text class="terminal-516398974-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-516398974-line-3)">
+</text><text class="terminal-516398974-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-516398974-line-4)">
+</text><text class="terminal-516398974-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-516398974-line-5)">╭─</text><text class="terminal-516398974-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-516398974-line-5)">&#160;Selective&#160;check&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-516398974-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-516398 [...]
+</text><text class="terminal-516398974-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-516398974-line-6)">│</text><text class="terminal-516398974-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-516398974-line-6)">-</text><text class="terminal-516398974-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-516398974-line-6)">-commit</text><text class="terminal-516398974-r5" x="122" y="166.4" textLength="48.8" clip-path="url(#terminal-516398974- [...]
+</text><text class="terminal-516398974-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-516398974-line-7)">│</text><text class="terminal-516398974-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-516398974-line-7)">-</text><text class="terminal-516398974-r5" x="36.6" y="190.8" textLength="36.6" clip-path="url(#terminal-516398974-line-7)">-pr</text><text class="terminal-516398974-r5" x="73.2" y="190.8" textLength="85.4" clip-path="url(#terminal-516398974-lin [...]
+</text><text class="terminal-516398974-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-516398974-line-8)">│</text><text class="terminal-516398974-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-516398974-line-8)">-</text><text class="terminal-516398974-r5" x="36.6" y="215.2" textLength="97.6" clip-path="url(#terminal-516398974-line-8)">-default</text><text class="terminal-516398974-r5" x="134.2" y="215.2" textLength="85.4" clip-path="url(#terminal-5163989 [...]
+</text><text class="terminal-516398974-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-516398974-line-9)">│</text><text class="terminal-516398974-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-516398974-line-9)">-</text><text class="terminal-516398974-r5" x="36.6" y="239.6" textLength="85.4" clip-path="url(#terminal-516398974-line-9)">-github</text><text class="terminal-516398974-r5" x="122" y="239.6" textLength="134.2" clip-path="url(#terminal-516398974 [...]
+</text><text class="terminal-516398974-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-516398974-line-10)">│</text><text class="terminal-516398974-r6" x="305" y="264" textLength="1134.6" clip-path="url(#terminal-516398974-line-10)">(pull_request&#160;|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;&#160;&#160;</text><text class="terminal-516398974-r4" x="1451.8" y="264" textLength="12.2" clip-path="url [...]
+</text><text class="terminal-516398974-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-516398974-line-11)">│</text><text class="terminal-516398974-r6" x="305" y="288.4" textLength="1134.6" clip-path="url(#terminal-516398974-line-11)">schedule&#160;|&#160;workflow_run)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-516398974-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-516398974-line-12)">│</text><text class="terminal-516398974-r4" x="305" y="312.8" textLength="1134.6" clip-path="url(#terminal-516398974-line-12)">[default:&#160;pull_request]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-516398974-r4" x="0" y="337.2" textLength="1464" clip-path="url(#terminal-516398974-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-516398974-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-516398974-line-13)">
+</text><text class="terminal-516398974-r4" x="0" y="361.6" textLength="24.4" clip-path="url(#terminal-516398974-line-14)">╭─</text><text class="terminal-516398974-r4" x="24.4" y="361.6" textLength="1415.2" clip-path="url(#terminal-516398974-line-14)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-516398974-r4" x="1439.6" y="361.6" textLength="24.4" clip-path="url(#terminal-51639897 [...]
+</text><text class="terminal-516398974-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-516398974-line-15)">│</text><text class="terminal-516398974-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-516398974-line-15)">-</text><text class="terminal-516398974-r5" x="36.6" y="386" textLength="97.6" clip-path="url(#terminal-516398974-line-15)">-default</text><text class="terminal-516398974-r5" x="134.2" y="386" textLength="231.8" clip-path="url(#terminal-516398974-l [...]
+</text><text class="terminal-516398974-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-516398974-line-16)">│</text><text class="terminal-516398974-r4" x="439.2" y="410.4" textLength="756.4" clip-path="url(#terminal-516398974-line-16)">[default:&#160;constraints-main]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-516398974-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-516398974-line-17)">│</text><text class="terminal-516398974-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-516398974-line-17)">-</text><text class="terminal-516398974-r5" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-516398974-line-17)">-debian</text><text class="terminal-516398974-r5" x="122" y="434.8" textLength="97.6" clip-path="url(#terminal-5163989 [...]
+</text><text class="terminal-516398974-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-516398974-line-18)">│</text><text class="terminal-516398974-r5" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-516398974-line-18)">-</text><text class="terminal-516398974-r5" x="36.6" y="459.2" textLength="97.6" clip-path="url(#terminal-516398974-line-18)">-verbose</text><text class="terminal-516398974-r7" x="390.4" y="459.2" textLength="24.4" clip-path="url(#terminal-5163 [...]
+</text><text class="terminal-516398974-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-516398974-line-19)">│</text><text class="terminal-516398974-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-516398974-line-19)">-</text><text class="terminal-516398974-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-516398974-line-19)">-dry</text><text class="terminal-516398974-r5" x="85.4" y="483.6" textLength="48.8" clip-path="url(#terminal-516398974 [...]
+</text><text class="terminal-516398974-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-516398974-line-20)">│</text><text class="terminal-516398974-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-516398974-line-20)">-</text><text class="terminal-516398974-r5" x="36.6" y="508" textLength="61" clip-path="url(#terminal-516398974-line-20)">-help</text><text class="terminal-516398974-r7" x="390.4" y="508" textLength="24.4" clip-path="url(#terminal-516398974-line-20 [...]
+</text><text class="terminal-516398974-r4" x="0" y="532.4" textLength="1464" clip-path="url(#terminal-516398974-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-516398974-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-516398974-line-21)">
 </text>
     </g>
     </g>


[airflow] 05/12: Retrieve airflow branch/constraints from env variables (#25053)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 218711e601b840838a25df0b938cb05c62871292
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 14:38:02 2022 +0200

    Retrieve airflow branch/constraints from env variables (#25053)
    
    We are using the "main" breeze to build even v2-3 images and
    it has to retrieve the branch and constraints not from the
    Python constants but from environment variables that are
    set by build-image.yaml. Otherwise "main" is used to push/pull
    image and constraints.
    
    This pr changes the retrieval in build image to retrieve
    branch, constraints branch (and debian version) from env
    variables if they are set.
    
    (cherry picked from commit f36f81efc48fb5af3e86597068c7bf9b4a419251)
---
 dev/breeze/src/airflow_breeze/commands/ci_commands.py       | 7 +++++++
 dev/breeze/src/airflow_breeze/params/build_ci_params.py     | 7 +++++--
 dev/breeze/src/airflow_breeze/params/build_prod_params.py   | 5 ++++-
 dev/breeze/src/airflow_breeze/params/common_build_params.py | 4 ++--
 images/breeze/output-commands-hash.txt                      | 2 +-
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index cd9d05fa49..9d4dda4297 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -263,6 +263,13 @@ def get_changed_files(commit_ref: Optional[str], dry_run: bool, verbose: bool) -
     envvar="DEFAULT_CONSTRAINTS_BRANCH",
     show_default=True,
 )
+@click.option(
+    '--default-constraints-branch',
+    help="Constraints Branch against which the PR should be run",
+    default="constraints-main",
+    envvar="DEFAULT_CONSTRAINTS_BRANCH",
+    show_default=True,
+)
 @click.option(
     '--github-event-name',
     type=BetterChoice(github_events()),
diff --git a/dev/breeze/src/airflow_breeze/params/build_ci_params.py b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
index 52c242b65a..ee63033ef6 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import os
 from dataclasses import dataclass
 from pathlib import Path
 from typing import List
@@ -31,8 +32,10 @@ class BuildCiParams(CommonBuildParams):
     """
 
     airflow_constraints_mode: str = "constraints-source-providers"
-    default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
-    airflow_constraints_reference: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    default_constraints_branch: str = os.environ.get(
+        'DEFAULT_CONSTRAINTS_BRANCH', DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    )
+    airflow_constraints_reference: str = ""
     airflow_extras: str = "devel_ci"
     airflow_pre_cached_pip_packages: bool = True
     force_build: bool = False
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index 65e92400c4..86a25b6999 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -16,6 +16,7 @@
 # under the License.
 
 import json
+import os
 import re
 import sys
 from dataclasses import dataclass
@@ -41,7 +42,9 @@ class BuildProdParams(CommonBuildParams):
     """
 
     airflow_constraints_mode: str = "constraints"
-    default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    default_constraints_branch: str = os.environ.get(
+        'DEFAULT_CONSTRAINTS_BRANCH', DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    )
     airflow_constraints_reference: str = ""
     cleanup_context: bool = False
     disable_airflow_repo_cache: bool = False
diff --git a/dev/breeze/src/airflow_breeze/params/common_build_params.py b/dev/breeze/src/airflow_breeze/params/common_build_params.py
index e6c2c70029..b4fc12e273 100644
--- a/dev/breeze/src/airflow_breeze/params/common_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/common_build_params.py
@@ -41,13 +41,13 @@ class CommonBuildParams:
     additional_runtime_apt_command: str = ""
     additional_runtime_apt_deps: str = ""
     additional_runtime_apt_env: str = ""
-    airflow_branch: str = AIRFLOW_BRANCH
+    airflow_branch: str = os.environ.get('DEFAULT_BRANCH', AIRFLOW_BRANCH)
     airflow_constraints_location: str = ""
     answer: Optional[str] = None
     build_id: int = 0
     builder: str = "default"
     constraints_github_repository: str = "apache/airflow"
-    debian_version: str = "bullseye"
+    debian_version: str = os.environ.get('DEBIAN_VERSION', "bullseye")
     dev_apt_command: str = ""
     dev_apt_deps: str = ""
     docker_cache: str = "registry"
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 774cb26c3f..df2aa32c0a 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -23,7 +23,7 @@ pull-prod-image:6e8467a2b8c833a392c8bdd65189363e
 regenerate-command-images:4fd2e7ecbfd6eebb18b854f3eb0f29c8
 release-prod-images:8858fe5a13989c7c65a79dc97a880928
 resource-check:0fb929ac3496dbbe97acfe99e35accd7
-selective-check:4be1ea17278fba654761531be0e3811a
+selective-check:46db58b67a3441d39a62ae23c1082f09
 self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786


[airflow] 10/12: Fix asset compilation via setup.py (#25201)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 17f6105aad82b01d7f9882bb34dc9c84514831f1
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Jul 20 23:06:16 2022 +0200

    Fix asset compilation via setup.py (#25201)
    
    Asset compilation via setup.py has been broken in #25169.
    
    This PR fixes it.
    
    (cherry picked from commit c3763f3be5245af8f2c13d89db648e67bad8c680)
---
 setup.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/setup.py b/setup.py
index 6447281e5d..3eb2673042 100644
--- a/setup.py
+++ b/setup.py
@@ -109,7 +109,9 @@ class CompileAssets(Command):
 
     def run(self) -> None:
         """Run a command to compile and build assets."""
-        subprocess.check_call('./airflow/www/compile_assets.sh')
+        www_dir = AIRFLOW_SOURCES_ROOT / "airflow" / "www"
+        subprocess.check_call(['yarn', 'install', '--frozen-lockfile'], cwd=str(www_dir))
+        subprocess.check_call(['yarn', 'run', 'build'], cwd=str(www_dir))
 
 
 class ListExtras(Command):