You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by je...@apache.org on 2025/03/25 19:22:15 UTC

(airflow) branch main updated: AIP-81: Flatten core CLI commands (#48224)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 6f76326c266 AIP-81: Flatten core CLI commands (#48224)
6f76326c266 is described below

commit 6f76326c2668ac4e748737bab9101ae86b953287
Author: Jed Cunningham <66...@users.noreply.github.com>
AuthorDate: Tue Mar 25 13:22:07 2025 -0600

    AIP-81: Flatten core CLI commands (#48224)
    
    With the remote commands being added to a separate distribution, we no
    longer need to distinguish between local and remote commands in core -
    they are all local commands!
---
 .github/CODEOWNERS                                 |   2 +-
 .github/boring-cyborg.yml                          |   8 +-
 .../src/airflow/api_fastapi/gunicorn_config.py     |   2 +-
 airflow-core/src/airflow/cli/cli_config.py         | 178 ++++++++++-----------
 .../{local_commands => }/api_server_command.py     |   0
 .../{remote_commands => }/asset_command.py         |   0
 .../{remote_commands => }/backfill_command.py      |   0
 .../{local_commands => }/cheat_sheet_command.py    |   0
 .../{remote_commands => }/config_command.py        |   0
 .../{remote_commands => }/connection_command.py    |   0
 .../commands/{local_commands => }/daemon_utils.py  |   0
 .../commands/{remote_commands => }/dag_command.py  |   0
 .../{local_commands => }/dag_processor_command.py  |   2 +-
 .../commands/{local_commands => }/db_command.py    |   0
 .../commands/{local_commands => }/info_command.py  |   0
 .../commands/{remote_commands => }/jobs_command.py |   0
 .../{local_commands => }/kerberos_command.py       |   2 +-
 .../cli/commands/local_commands/__init__.py        |  16 --
 .../{local_commands => }/plugins_command.py        |   0
 .../commands/{remote_commands => }/pool_command.py |   0
 .../{remote_commands => }/provider_command.py      |   0
 .../cli/commands/remote_commands/__init__.py       |  16 --
 .../rotate_fernet_key_command.py                   |   0
 .../{local_commands => }/scheduler_command.py      |   2 +-
 .../{local_commands => }/standalone_command.py     |   0
 .../commands/{remote_commands => }/task_command.py |   0
 .../{local_commands => }/triggerer_command.py      |   2 +-
 .../{remote_commands => }/variable_command.py      |   0
 .../{remote_commands => }/version_command.py       |   0
 .../api_fastapi/core_api/routes/public/test_job.py |   2 +-
 .../unit/cli/commands/local_commands/__init__.py   |  16 --
 .../unit/cli/commands/remote_commands/__init__.py  |  16 --
 .../test_api_server_command.py                     |   2 +-
 .../{remote_commands => }/test_asset_command.py    |   2 +-
 .../{remote_commands => }/test_backfill_command.py |  10 +-
 .../test_cheat_sheet_command.py                    |   0
 .../{remote_commands => }/test_config_command.py   |  14 +-
 .../test_connection_command.py                     |   4 +-
 .../{remote_commands => }/test_dag_command.py      |  30 ++--
 .../test_dag_processor_command.py                  |   6 +-
 .../{local_commands => }/test_db_command.py        |  70 ++++----
 .../{local_commands => }/test_info_command.py      |   4 +-
 .../{remote_commands => }/test_jobs_command.py     |   2 +-
 .../{local_commands => }/test_kerberos_command.py  |  18 +--
 .../unit/cli/commands/test_legacy_commands.py      |   2 +-
 .../{local_commands => }/test_plugins_command.py   |   6 +-
 .../{remote_commands => }/test_pool_command.py     |   2 +-
 .../test_rotate_fernet_key_command.py              |   2 +-
 .../{local_commands => }/test_scheduler_command.py |  36 ++---
 .../test_standalone_command.py                     |   2 +-
 .../{remote_commands => }/test_task_command.py     |   8 +-
 .../{local_commands => }/test_triggerer_command.py |  12 +-
 .../{remote_commands => }/test_variable_command.py |   2 +-
 .../{remote_commands => }/test_version_command.py  |   4 +-
 .../tests/unit/listeners/file_write_listener.py    |   2 +-
 .../airflow/providers/celery/cli/celery_command.py |   6 +-
 .../tests/unit/celery/cli/test_celery_command.py   |   8 +-
 .../fab/auth_manager/cli_commands/db_command.py    |   2 +-
 scripts/cov/cli_coverage.py                        |  28 ++--
 .../in_container/run_provider_yaml_files_check.py  |   2 +-
 60 files changed, 236 insertions(+), 314 deletions(-)

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 875abb3798e..433517a6909 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -52,7 +52,7 @@
 /docs/apache-airflow/concepts/dynamic-task-mapping.rst @uranusjr
 
 # Async Operators & Triggerer
-/airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py @dstandish @hussein-awala
+/airflow-core/src/airflow/cli/commands/triggerer_command.py @dstandish @hussein-awala
 /airflow-core/src/airflow/jobs/triggerer_job.py @dstandish @hussein-awala
 /airflow-core/src/airflow/jobs/triggerer_job_runner.py @dstandish @hussein-awala
 /docs/apache-airflow/authoring-and-scheduling/deferring.rst @dstandish @hussein-awala
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index b7da63728ae..7120ac1a54d 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -352,9 +352,9 @@ labelPRBasedOnFilePath:
     - providers/**/log/*
 
   area:Plugins:
-    - airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py
+    - airflow-core/src/airflow/cli/commands/plugins_command.py
     - airflow-core/src/airflow/plugins_manager.py
-    - airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py
+    - airflow-core/tests/unit/cli/commands/test_plugins_command.py
     - airflow-core/tests/unit/plugins/**/*
     - airflow-core/docs/administration-and-deployment/plugins.rst
 
@@ -381,11 +381,11 @@ labelPRBasedOnFilePath:
     - airflow-core/docs/security/secrets/**/*
 
   area:Triggerer:
-    - airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py
+    - airflow-core/src/airflow/cli/commands/triggerer_command.py
     - airflow-core/src/airflow/jobs/triggerer_job_runner.py
     - airflow-core/src/airflow/models/trigger.py
     - providers/standard/src/airflow/providers/standard/triggers/**/*
-    - airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py
+    - airflow-core/tests/unit/cli/commands/test_triggerer_command.py
     - airflow-core/tests/unit/jobs/test_triggerer_job.py
     - airflow-core/tests/unit/models/test_trigger.py
     - providers/standard/tests/unit/standard/triggers/**/*
diff --git a/airflow-core/src/airflow/api_fastapi/gunicorn_config.py b/airflow-core/src/airflow/api_fastapi/gunicorn_config.py
index d9e8a9f7351..f2c17eef76d 100644
--- a/airflow-core/src/airflow/api_fastapi/gunicorn_config.py
+++ b/airflow-core/src/airflow/api_fastapi/gunicorn_config.py
@@ -27,7 +27,7 @@ def post_worker_init(_):
     """
     Set process title.
 
-    This is used by airflow.cli.commands.local_commands.api_server_command to track the status of the worker.
+    This is used by airflow.cli.commands.api_server_command to track the status of the worker.
     """
     old_title = setproctitle.getproctitle()
     setproctitle.setproctitle(settings.GUNICORN_WORKER_READY_PREFIX + old_title)
diff --git a/airflow-core/src/airflow/cli/cli_config.py b/airflow-core/src/airflow/cli/cli_config.py
index 717bd8b3b3e..ee34d083ab5 100644
--- a/airflow-core/src/airflow/cli/cli_config.py
+++ b/airflow-core/src/airflow/cli/cli_config.py
@@ -434,7 +434,7 @@ ARG_DB_TABLES = Arg(
     ("-t", "--tables"),
     help=lazy_object_proxy.Proxy(
         lambda: f"Table names to perform maintenance on (use comma-separated list).\n"
-        f"Options: {import_string('airflow.cli.commands.local_commands.db_command.all_tables')}"
+        f"Options: {import_string('airflow.cli.commands.db_command.all_tables')}"
     ),
     type=string_list_type,
 )
@@ -891,13 +891,13 @@ ASSETS_COMMANDS = (
     ActionCommand(
         name="list",
         help="List assets",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.asset_command.asset_list"),
+        func=lazy_load_command("airflow.cli.commands.asset_command.asset_list"),
         args=(ARG_ASSET_ALIAS, ARG_OUTPUT, ARG_VERBOSE, ARG_ASSET_LIST_COLUMNS),
     ),
     ActionCommand(
         name="details",
         help="Show asset details",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.asset_command.asset_details"),
+        func=lazy_load_command("airflow.cli.commands.asset_command.asset_details"),
         args=(ARG_ASSET_ALIAS, ARG_ASSET_NAME, ARG_ASSET_URI, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -912,7 +912,7 @@ BACKFILL_COMMANDS = (
         name="create",
         help="Create a backfill for a dag.",
         description="Run subsections of a DAG for a specified date range.",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.backfill_command.create_backfill"),
+        func=lazy_load_command("airflow.cli.commands.backfill_command.create_backfill"),
         args=(
             ARG_BACKFILL_DAG,
             ARG_BACKFILL_FROM_DATE,
@@ -929,25 +929,25 @@ DAGS_COMMANDS = (
     ActionCommand(
         name="details",
         help="Get DAG details given a DAG id",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_details"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_details"),
         args=(ARG_DAG_ID, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="list",
         help="List all the DAGs",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_list_dags"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_list_dags"),
         args=(ARG_OUTPUT, ARG_VERBOSE, ARG_DAG_LIST_COLUMNS, ARG_BUNDLE_NAME),
     ),
     ActionCommand(
         name="list-import-errors",
         help="List all the DAGs that have import errors",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_list_import_errors"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_list_import_errors"),
         args=(ARG_BUNDLE_NAME, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="report",
         help="Show DagBag loading report",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_report"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_report"),
         args=(ARG_BUNDLE_NAME, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -960,7 +960,7 @@ DAGS_COMMANDS = (
             "dagruns that were executed before this date. If end_date is given, it will filter out "
             "all the dagruns that were executed after this date. "
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_list_dag_runs"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_list_dag_runs"),
         args=(
             ARG_DAG_ID,
             ARG_NO_BACKFILL,
@@ -974,13 +974,13 @@ DAGS_COMMANDS = (
     ActionCommand(
         name="list-jobs",
         help="List the jobs",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_list_jobs"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_list_jobs"),
         args=(ARG_DAG_ID_OPT, ARG_JOB_STATE, ARG_LIMIT, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="state",
         help="Get the status of a dag run",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_state"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_state"),
         args=(ARG_DAG_ID, ARG_LOGICAL_DATE_OR_RUN_ID, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -990,7 +990,7 @@ DAGS_COMMANDS = (
             "Get the next logical datetimes of a DAG. It returns one execution unless the "
             "num-executions option is given"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_next_execution"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_next_execution"),
         args=(ARG_DAG_ID, ARG_NUM_EXECUTIONS, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1001,7 +1001,7 @@ DAGS_COMMANDS = (
             "disabling further task scheduling. Use `--treat-dag-id-as-regex` to target multiple DAGs by "
             "treating the `--dag-id` as a regex pattern."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_pause"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_pause"),
         args=(ARG_DAG_ID, ARG_TREAT_DAG_ID_AS_REGEX, ARG_YES, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1012,7 +1012,7 @@ DAGS_COMMANDS = (
             "DAGs, enabling further task scheduling. Use `--treat-dag-id-as-regex` to target multiple DAGs "
             "treating the `--dag-id` as a regex pattern."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_unpause"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_unpause"),
         args=(ARG_DAG_ID, ARG_TREAT_DAG_ID_AS_REGEX, ARG_YES, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1021,7 +1021,7 @@ DAGS_COMMANDS = (
             "Trigger a new DAG run. If DAG is paused then dagrun state will remain queued, "
             "and the task won't run."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_trigger"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_trigger"),
         args=(
             ARG_DAG_ID,
             ARG_RUN_ID,
@@ -1035,7 +1035,7 @@ DAGS_COMMANDS = (
     ActionCommand(
         name="delete",
         help="Delete all DB records related to the specified DAG",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_delete"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_delete"),
         args=(ARG_DAG_ID, ARG_YES, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1058,7 +1058,7 @@ DAGS_COMMANDS = (
             "If you want to create a DOT file then you should execute the following command:\n"
             "airflow dags show <DAG_ID> --save output.dot\n"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_show"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_show"),
         args=(ARG_DAG_ID, ARG_SAVE, ARG_IMGCAT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1081,7 +1081,7 @@ DAGS_COMMANDS = (
             "If you want to create a DOT file then you should execute the following command:\n"
             "airflow dags show-dependencies --save output.dot\n"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_dependencies_show"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_dependencies_show"),
         args=(
             ARG_SAVE,
             ARG_IMGCAT,
@@ -1110,7 +1110,7 @@ DAGS_COMMANDS = (
             "If you want to create a DOT file then you should execute the following command:\n"
             "airflow dags test <DAG_ID> <LOGICAL_DATE> --save-dagrun output.dot\n"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_test"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_test"),
         args=(
             ARG_DAG_ID,
             ARG_LOGICAL_DATE_OPTIONAL,
@@ -1131,7 +1131,7 @@ DAGS_COMMANDS = (
             "particularly useful if your serialized DAGs become out of sync with the Airflow "
             "version you are using."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.dag_command.dag_reserialize"),
+        func=lazy_load_command("airflow.cli.commands.dag_command.dag_reserialize"),
         args=(
             ARG_BUNDLE_NAME,
             ARG_VERBOSE,
@@ -1142,13 +1142,13 @@ TASKS_COMMANDS = (
     ActionCommand(
         name="list",
         help="List the tasks within a DAG",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_list"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_list"),
         args=(ARG_DAG_ID, ARG_SUBDIR, ARG_VERBOSE),
     ),
     ActionCommand(
         name="clear",
         help="Clear a set of task instance, as if they never ran",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_clear"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_clear"),
         args=(
             ARG_DAG_ID,
             ARG_TASK_REGEX,
@@ -1167,7 +1167,7 @@ TASKS_COMMANDS = (
     ActionCommand(
         name="state",
         help="Get the status of a task instance",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_state"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_state"),
         args=(
             ARG_DAG_ID,
             ARG_TASK_ID,
@@ -1185,13 +1185,13 @@ TASKS_COMMANDS = (
             "In other words, why a task instance doesn't get scheduled and then queued by the scheduler, "
             "and then run by an executor."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_failed_deps"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_failed_deps"),
         args=(ARG_DAG_ID, ARG_TASK_ID, ARG_LOGICAL_DATE_OR_RUN_ID, ARG_SUBDIR, ARG_MAP_INDEX, ARG_VERBOSE),
     ),
     ActionCommand(
         name="render",
         help="Render a task instance's template(s)",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_render"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_render"),
         args=(
             ARG_DAG_ID,
             ARG_TASK_ID,
@@ -1208,7 +1208,7 @@ TASKS_COMMANDS = (
             "Test a task instance. This will run a task without checking for dependencies or recording "
             "its state in the database"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_test"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_test"),
         args=(
             ARG_DAG_ID,
             ARG_TASK_ID,
@@ -1225,7 +1225,7 @@ TASKS_COMMANDS = (
     ActionCommand(
         name="states-for-dag-run",
         help="Get the status of all task instances in a dag run",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.task_command.task_states_for_dag_run"),
+        func=lazy_load_command("airflow.cli.commands.task_command.task_states_for_dag_run"),
         args=(ARG_DAG_ID, ARG_LOGICAL_DATE_OR_RUN_ID, ARG_OUTPUT, ARG_VERBOSE),
     ),
 )
@@ -1233,19 +1233,19 @@ POOLS_COMMANDS = (
     ActionCommand(
         name="list",
         help="List pools",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_list"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="get",
         help="Get pool size",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_get"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_get"),
         args=(ARG_POOL_NAME, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="set",
         help="Configure pool",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_set"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_set"),
         args=(
             ARG_POOL_NAME,
             ARG_POOL_SLOTS,
@@ -1258,19 +1258,19 @@ POOLS_COMMANDS = (
     ActionCommand(
         name="delete",
         help="Delete pool",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_delete"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_delete"),
         args=(ARG_POOL_NAME, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="import",
         help="Import pools",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_import"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_import"),
         args=(ARG_POOL_IMPORT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="export",
         help="Export all pools",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.pool_command.pool_export"),
+        func=lazy_load_command("airflow.cli.commands.pool_command.pool_export"),
         args=(ARG_POOL_EXPORT, ARG_VERBOSE),
     ),
 )
@@ -1278,31 +1278,31 @@ VARIABLES_COMMANDS = (
     ActionCommand(
         name="list",
         help="List variables",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_list"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="get",
         help="Get variable",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_get"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_get"),
         args=(ARG_VAR, ARG_DESERIALIZE_JSON, ARG_DEFAULT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="set",
         help="Set variable",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_set"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_set"),
         args=(ARG_VAR, ARG_VAR_VALUE, ARG_VAR_DESCRIPTION, ARG_SERIALIZE_JSON, ARG_VERBOSE),
     ),
     ActionCommand(
         name="delete",
         help="Delete variable",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_delete"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_delete"),
         args=(ARG_VAR, ARG_VERBOSE),
     ),
     ActionCommand(
         name="import",
         help="Import variables",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_import"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_import"),
         args=(ARG_VAR_IMPORT, ARG_VAR_ACTION_ON_EXISTING_KEY, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1312,7 +1312,7 @@ VARIABLES_COMMANDS = (
             "All variables can be exported in STDOUT using the following command:\n"
             "airflow variables export -\n"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.variable_command.variables_export"),
+        func=lazy_load_command("airflow.cli.commands.variable_command.variables_export"),
         args=(ARG_VAR_EXPORT, ARG_VERBOSE),
     ),
 )
@@ -1321,13 +1321,13 @@ DB_COMMANDS = (
         name="check-migrations",
         help="Check if migration have finished",
         description="Check if migration have finished (or continually check until timeout)",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.check_migrations"),
+        func=lazy_load_command("airflow.cli.commands.db_command.check_migrations"),
         args=(ARG_MIGRATION_TIMEOUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="reset",
         help="Burn down and rebuild the metadata database",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.resetdb"),
+        func=lazy_load_command("airflow.cli.commands.db_command.resetdb"),
         args=(ARG_YES, ARG_DB_SKIP_INIT, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1341,7 +1341,7 @@ DB_COMMANDS = (
             "``--show-sql-only``, because if actually *running* migrations, we should only "
             "migrate from the *current* Alembic revision."
         ),
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.migratedb"),
+        func=lazy_load_command("airflow.cli.commands.db_command.migratedb"),
         args=(
             ARG_DB_REVISION__UPGRADE,
             ARG_DB_VERSION__UPGRADE,
@@ -1362,7 +1362,7 @@ DB_COMMANDS = (
             "because if actually *running* migrations, we should only migrate from the *current* Alembic "
             "revision."
         ),
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.downgrade"),
+        func=lazy_load_command("airflow.cli.commands.db_command.downgrade"),
         args=(
             ARG_DB_REVISION__DOWNGRADE,
             ARG_DB_VERSION__DOWNGRADE,
@@ -1376,19 +1376,19 @@ DB_COMMANDS = (
     ActionCommand(
         name="shell",
         help="Runs a shell to access the database",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.shell"),
+        func=lazy_load_command("airflow.cli.commands.db_command.shell"),
         args=(ARG_VERBOSE,),
     ),
     ActionCommand(
         name="check",
         help="Check if the database can be reached",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.check"),
+        func=lazy_load_command("airflow.cli.commands.db_command.check"),
         args=(ARG_VERBOSE, ARG_DB_RETRY, ARG_DB_RETRY_DELAY),
     ),
     ActionCommand(
         name="clean",
         help="Purge old records in metastore tables",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.cleanup_tables"),
+        func=lazy_load_command("airflow.cli.commands.db_command.cleanup_tables"),
         args=(
             ARG_DB_TABLES,
             ARG_DB_DRY_RUN,
@@ -1401,7 +1401,7 @@ DB_COMMANDS = (
     ActionCommand(
         name="export-archived",
         help="Export archived data from the archive tables",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.export_archived"),
+        func=lazy_load_command("airflow.cli.commands.db_command.export_archived"),
         args=(
             ARG_DB_EXPORT_FORMAT,
             ARG_DB_OUTPUT_PATH,
@@ -1413,7 +1413,7 @@ DB_COMMANDS = (
     ActionCommand(
         name="drop-archived",
         help="Drop archived tables created through the db clean command",
-        func=lazy_load_command("airflow.cli.commands.local_commands.db_command.drop_archived"),
+        func=lazy_load_command("airflow.cli.commands.db_command.drop_archived"),
         args=(ARG_DB_TABLES, ARG_YES),
     ),
 )
@@ -1421,25 +1421,25 @@ CONNECTIONS_COMMANDS = (
     ActionCommand(
         name="get",
         help="Get a connection",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_get"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_get"),
         args=(ARG_CONN_ID, ARG_COLOR, ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="list",
         help="List connections",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_list"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE, ARG_CONN_ID_FILTER),
     ),
     ActionCommand(
         name="add",
         help="Add a connection",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_add"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_add"),
         args=(ARG_CONN_ID, ARG_CONN_URI, ARG_CONN_JSON, ARG_CONN_EXTRA, *ALTERNATIVE_CONN_SPECS_ARGS),
     ),
     ActionCommand(
         name="delete",
         help="Delete a connection",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_delete"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_delete"),
         args=(ARG_CONN_ID, ARG_COLOR, ARG_VERBOSE),
     ),
     ActionCommand(
@@ -1460,7 +1460,7 @@ CONNECTIONS_COMMANDS = (
             "is used to serialize the connection by passing `uri` or `json` with option "
             "`--serialization-format`.\n"
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_export"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_export"),
         args=(
             ARG_CONN_EXPORT,
             ARG_CONN_EXPORT_FORMAT,
@@ -1476,7 +1476,7 @@ CONNECTIONS_COMMANDS = (
             "Connections can be imported from the output of the export command.\n"
             "The filetype must by json, yaml or env and will be automatically inferred."
         ),
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_import"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_import"),
         args=(
             ARG_CONN_IMPORT,
             ARG_CONN_OVERWRITE,
@@ -1486,15 +1486,13 @@ CONNECTIONS_COMMANDS = (
     ActionCommand(
         name="test",
         help="Test a connection",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.connection_command.connections_test"),
+        func=lazy_load_command("airflow.cli.commands.connection_command.connections_test"),
         args=(ARG_CONN_ID, ARG_VERBOSE),
     ),
     ActionCommand(
         name="create-default-connections",
         help="Creates all the default connections from all the providers",
-        func=lazy_load_command(
-            "airflow.cli.commands.remote_commands.connection_command.create_default_connections"
-        ),
+        func=lazy_load_command("airflow.cli.commands.connection_command.create_default_connections"),
         args=(ARG_VERBOSE,),
     ),
 )
@@ -1502,27 +1500,25 @@ PROVIDERS_COMMANDS = (
     ActionCommand(
         name="list",
         help="List installed providers",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.providers_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.providers_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="get",
         help="Get detailed information about a provider",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.provider_get"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.provider_get"),
         args=(ARG_OUTPUT, ARG_VERBOSE, ARG_FULL, ARG_COLOR, ARG_PROVIDER_NAME),
     ),
     ActionCommand(
         name="links",
         help="List extra links registered by the providers",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.extra_links_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.extra_links_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="widgets",
         help="Get information about registered connection form widgets",
-        func=lazy_load_command(
-            "airflow.cli.commands.remote_commands.provider_command.connection_form_widget_list"
-        ),
+        func=lazy_load_command("airflow.cli.commands.provider_command.connection_form_widget_list"),
         args=(
             ARG_OUTPUT,
             ARG_VERBOSE,
@@ -1531,63 +1527,61 @@ PROVIDERS_COMMANDS = (
     ActionCommand(
         name="hooks",
         help="List registered provider hooks",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.hooks_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.hooks_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="triggers",
         help="List registered provider triggers",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.triggers_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.triggers_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="behaviours",
         help="Get information about registered connection types with custom behaviours",
-        func=lazy_load_command(
-            "airflow.cli.commands.remote_commands.provider_command.connection_field_behaviours"
-        ),
+        func=lazy_load_command("airflow.cli.commands.provider_command.connection_field_behaviours"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="logging",
         help="Get information about task logging handlers provided",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.logging_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.logging_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="secrets",
         help="Get information about secrets backends provided",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.secrets_backends_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.secrets_backends_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="executors",
         help="Get information about executors provided",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.executors_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.executors_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="notifications",
         help="Get information about notifications provided",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.notifications_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.notifications_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="configs",
         help="Get information about provider configuration",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.config_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.config_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="lazy-loaded",
         help="Checks that provider configuration is lazy loaded",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.lazy_loaded"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.lazy_loaded"),
         args=(ARG_VERBOSE,),
     ),
     ActionCommand(
         name="auth-managers",
         help="Get information about auth managers provided",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.provider_command.auth_managers_list"),
+        func=lazy_load_command("airflow.cli.commands.provider_command.auth_managers_list"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
 )
@@ -1597,7 +1591,7 @@ CONFIG_COMMANDS = (
     ActionCommand(
         name="get-value",
         help="Print the value of the configuration",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.config_command.get_value"),
+        func=lazy_load_command("airflow.cli.commands.config_command.get_value"),
         args=(
             ARG_SECTION,
             ARG_OPTION,
@@ -1607,7 +1601,7 @@ CONFIG_COMMANDS = (
     ActionCommand(
         name="list",
         help="List options for the configuration",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.config_command.show_config"),
+        func=lazy_load_command("airflow.cli.commands.config_command.show_config"),
         args=(
             ARG_OPTIONAL_SECTION,
             ARG_COLOR,
@@ -1624,7 +1618,7 @@ CONFIG_COMMANDS = (
     ActionCommand(
         name="lint",
         help="lint options for the configuration changes while migrating from Airflow 2.x to Airflow 3.0",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.config_command.lint_config"),
+        func=lazy_load_command("airflow.cli.commands.config_command.lint_config"),
         args=(
             ARG_LINT_CONFIG_SECTION,
             ARG_LINT_CONFIG_OPTION,
@@ -1639,7 +1633,7 @@ JOBS_COMMANDS = (
     ActionCommand(
         name="check",
         help="Checks if job(s) are still alive",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.jobs_command.check"),
+        func=lazy_load_command("airflow.cli.commands.jobs_command.check"),
         args=(
             ARG_JOB_TYPE_FILTER,
             ARG_JOB_HOSTNAME_FILTER,
@@ -1705,7 +1699,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="kerberos",
         help="Start a kerberos ticket renewer",
-        func=lazy_load_command("airflow.cli.commands.local_commands.kerberos_command.kerberos"),
+        func=lazy_load_command("airflow.cli.commands.kerberos_command.kerberos"),
         args=(
             ARG_PRINCIPAL,
             ARG_KEYTAB,
@@ -1721,7 +1715,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="api-server",
         help="Start an Airflow API server instance",
-        func=lazy_load_command("airflow.cli.commands.local_commands.api_server_command.api_server"),
+        func=lazy_load_command("airflow.cli.commands.api_server_command.api_server"),
         args=(
             ARG_API_SERVER_PORT,
             ARG_API_SERVER_WORKERS,
@@ -1743,7 +1737,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="scheduler",
         help="Start a scheduler instance",
-        func=lazy_load_command("airflow.cli.commands.local_commands.scheduler_command.scheduler"),
+        func=lazy_load_command("airflow.cli.commands.scheduler_command.scheduler"),
         args=(
             ARG_NUM_RUNS,
             ARG_PID,
@@ -1766,7 +1760,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="triggerer",
         help="Start a triggerer instance",
-        func=lazy_load_command("airflow.cli.commands.local_commands.triggerer_command.triggerer"),
+        func=lazy_load_command("airflow.cli.commands.triggerer_command.triggerer"),
         args=(
             ARG_PID,
             ARG_DAEMON,
@@ -1781,7 +1775,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="dag-processor",
         help="Start a dag processor instance",
-        func=lazy_load_command("airflow.cli.commands.local_commands.dag_processor_command.dag_processor"),
+        func=lazy_load_command("airflow.cli.commands.dag_processor_command.dag_processor"),
         args=(
             ARG_PID,
             ARG_DAEMON,
@@ -1796,13 +1790,13 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="version",
         help="Show the version",
-        func=lazy_load_command("airflow.cli.commands.remote_commands.version_command.version"),
+        func=lazy_load_command("airflow.cli.commands.version_command.version"),
         args=(),
     ),
     ActionCommand(
         name="cheat-sheet",
         help="Display cheat sheet",
-        func=lazy_load_command("airflow.cli.commands.local_commands.cheat_sheet_command.cheat_sheet"),
+        func=lazy_load_command("airflow.cli.commands.cheat_sheet_command.cheat_sheet"),
         args=(ARG_VERBOSE,),
     ),
     GroupCommand(
@@ -1817,9 +1811,7 @@ core_commands: list[CLICommand] = [
     ),
     ActionCommand(
         name="rotate-fernet-key",
-        func=lazy_load_command(
-            "airflow.cli.commands.local_commands.rotate_fernet_key_command.rotate_fernet_key"
-        ),
+        func=lazy_load_command("airflow.cli.commands.rotate_fernet_key_command.rotate_fernet_key"),
         help="Rotate encrypted connection credentials and variables",
         description=(
             "Rotate all encrypted connection credentials and variables; see "
@@ -1832,7 +1824,7 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="info",
         help="Show information about current Airflow and environment",
-        func=lazy_load_command("airflow.cli.commands.local_commands.info_command.show_info"),
+        func=lazy_load_command("airflow.cli.commands.info_command.show_info"),
         args=(
             ARG_ANONYMIZE,
             ARG_FILE_IO,
@@ -1843,13 +1835,13 @@ core_commands: list[CLICommand] = [
     ActionCommand(
         name="plugins",
         help="Dump information about loaded plugins",
-        func=lazy_load_command("airflow.cli.commands.local_commands.plugins_command.dump_plugins"),
+        func=lazy_load_command("airflow.cli.commands.plugins_command.dump_plugins"),
         args=(ARG_OUTPUT, ARG_VERBOSE),
     ),
     ActionCommand(
         name="standalone",
         help="Run an all-in-one copy of Airflow",
-        func=lazy_load_command("airflow.cli.commands.local_commands.standalone_command.standalone"),
+        func=lazy_load_command("airflow.cli.commands.standalone_command.standalone"),
         args=(),
     ),
 ]
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/api_server_command.py b/airflow-core/src/airflow/cli/commands/api_server_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/api_server_command.py
rename to airflow-core/src/airflow/cli/commands/api_server_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/asset_command.py b/airflow-core/src/airflow/cli/commands/asset_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/asset_command.py
rename to airflow-core/src/airflow/cli/commands/asset_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/backfill_command.py b/airflow-core/src/airflow/cli/commands/backfill_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/backfill_command.py
rename to airflow-core/src/airflow/cli/commands/backfill_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/cheat_sheet_command.py b/airflow-core/src/airflow/cli/commands/cheat_sheet_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/cheat_sheet_command.py
rename to airflow-core/src/airflow/cli/commands/cheat_sheet_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/config_command.py b/airflow-core/src/airflow/cli/commands/config_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/config_command.py
rename to airflow-core/src/airflow/cli/commands/config_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/connection_command.py b/airflow-core/src/airflow/cli/commands/connection_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/connection_command.py
rename to airflow-core/src/airflow/cli/commands/connection_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/daemon_utils.py b/airflow-core/src/airflow/cli/commands/daemon_utils.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/daemon_utils.py
rename to airflow-core/src/airflow/cli/commands/daemon_utils.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/dag_command.py b/airflow-core/src/airflow/cli/commands/dag_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/dag_command.py
rename to airflow-core/src/airflow/cli/commands/dag_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/dag_processor_command.py b/airflow-core/src/airflow/cli/commands/dag_processor_command.py
similarity index 95%
rename from airflow-core/src/airflow/cli/commands/local_commands/dag_processor_command.py
rename to airflow-core/src/airflow/cli/commands/dag_processor_command.py
index cfd7fa65b97..c866763338f 100644
--- a/airflow-core/src/airflow/cli/commands/local_commands/dag_processor_command.py
+++ b/airflow-core/src/airflow/cli/commands/dag_processor_command.py
@@ -21,7 +21,7 @@ from __future__ import annotations
 import logging
 from typing import Any
 
-from airflow.cli.commands.local_commands.daemon_utils import run_command_with_daemon_option
+from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
 from airflow.dag_processing.manager import DagFileProcessorManager, reload_configuration_for_dag_processing
 from airflow.jobs.dag_processor_job_runner import DagProcessorJobRunner
 from airflow.jobs.job import Job, run_job
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/db_command.py b/airflow-core/src/airflow/cli/commands/db_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/db_command.py
rename to airflow-core/src/airflow/cli/commands/db_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/info_command.py b/airflow-core/src/airflow/cli/commands/info_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/info_command.py
rename to airflow-core/src/airflow/cli/commands/info_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/jobs_command.py b/airflow-core/src/airflow/cli/commands/jobs_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/jobs_command.py
rename to airflow-core/src/airflow/cli/commands/jobs_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/kerberos_command.py b/airflow-core/src/airflow/cli/commands/kerberos_command.py
similarity index 94%
rename from airflow-core/src/airflow/cli/commands/local_commands/kerberos_command.py
rename to airflow-core/src/airflow/cli/commands/kerberos_command.py
index 6e3ed83ae83..827f2d6a9d0 100644
--- a/airflow-core/src/airflow/cli/commands/local_commands/kerberos_command.py
+++ b/airflow-core/src/airflow/cli/commands/kerberos_command.py
@@ -19,7 +19,7 @@
 from __future__ import annotations
 
 from airflow import settings
-from airflow.cli.commands.local_commands.daemon_utils import run_command_with_daemon_option
+from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
 from airflow.security import kerberos as krb
 from airflow.security.kerberos import KerberosMode
 from airflow.utils import cli as cli_utils
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/__init__.py b/airflow-core/src/airflow/cli/commands/local_commands/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/src/airflow/cli/commands/local_commands/__init__.py
+++ /dev/null
@@ -1,16 +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.
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py b/airflow-core/src/airflow/cli/commands/plugins_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/plugins_command.py
rename to airflow-core/src/airflow/cli/commands/plugins_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/pool_command.py b/airflow-core/src/airflow/cli/commands/pool_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/pool_command.py
rename to airflow-core/src/airflow/cli/commands/pool_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/provider_command.py b/airflow-core/src/airflow/cli/commands/provider_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/provider_command.py
rename to airflow-core/src/airflow/cli/commands/provider_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/__init__.py b/airflow-core/src/airflow/cli/commands/remote_commands/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/src/airflow/cli/commands/remote_commands/__init__.py
+++ /dev/null
@@ -1,16 +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.
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/rotate_fernet_key_command.py b/airflow-core/src/airflow/cli/commands/rotate_fernet_key_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/rotate_fernet_key_command.py
rename to airflow-core/src/airflow/cli/commands/rotate_fernet_key_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/scheduler_command.py b/airflow-core/src/airflow/cli/commands/scheduler_command.py
similarity index 96%
rename from airflow-core/src/airflow/cli/commands/local_commands/scheduler_command.py
rename to airflow-core/src/airflow/cli/commands/scheduler_command.py
index 35a9ca8703b..88206c76ba1 100644
--- a/airflow-core/src/airflow/cli/commands/local_commands/scheduler_command.py
+++ b/airflow-core/src/airflow/cli/commands/scheduler_command.py
@@ -24,7 +24,7 @@ from contextlib import contextmanager
 from multiprocessing import Process
 
 from airflow import settings
-from airflow.cli.commands.local_commands.daemon_utils import run_command_with_daemon_option
+from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
 from airflow.configuration import conf
 from airflow.executors.executor_loader import ExecutorLoader
 from airflow.jobs.job import Job, run_job
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/standalone_command.py b/airflow-core/src/airflow/cli/commands/standalone_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/local_commands/standalone_command.py
rename to airflow-core/src/airflow/cli/commands/standalone_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/task_command.py b/airflow-core/src/airflow/cli/commands/task_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/task_command.py
rename to airflow-core/src/airflow/cli/commands/task_command.py
diff --git a/airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py b/airflow-core/src/airflow/cli/commands/triggerer_command.py
similarity index 96%
rename from airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py
rename to airflow-core/src/airflow/cli/commands/triggerer_command.py
index 48306743f8b..7b935e160ca 100644
--- a/airflow-core/src/airflow/cli/commands/local_commands/triggerer_command.py
+++ b/airflow-core/src/airflow/cli/commands/triggerer_command.py
@@ -24,7 +24,7 @@ from functools import partial
 from multiprocessing import Process
 
 from airflow import settings
-from airflow.cli.commands.local_commands.daemon_utils import run_command_with_daemon_option
+from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
 from airflow.configuration import conf
 from airflow.jobs.job import Job, run_job
 from airflow.jobs.triggerer_job_runner import TriggererJobRunner
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/variable_command.py b/airflow-core/src/airflow/cli/commands/variable_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/variable_command.py
rename to airflow-core/src/airflow/cli/commands/variable_command.py
diff --git a/airflow-core/src/airflow/cli/commands/remote_commands/version_command.py b/airflow-core/src/airflow/cli/commands/version_command.py
similarity index 100%
rename from airflow-core/src/airflow/cli/commands/remote_commands/version_command.py
rename to airflow-core/src/airflow/cli/commands/version_command.py
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py
index 7cff95f9539..b3e86ec8f23 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_job.py
@@ -129,7 +129,7 @@ class TestGetJobs(TestJobEndpoint):
     @pytest.mark.parametrize(
         "testcase, query_params, expected_status_code, expected_total_entries",
         [
-            # original testcases refactor from tests/cli/commands/remote_commands/test_jobs_command.py
+            # original testcases refactor from tests/cli/commands/test_jobs_command.py
             (TESTCASE_ONE_SCHEDULER, {}, 200, 1),
             (TESTCASE_ONE_SCHEDULER_WITH_HOSTNAME, {"hostname": "HOSTNAME"}, 200, 1),
             (TESTCASE_HA_SCHEDULERS, {"limit": 100}, 200, 3),
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/__init__.py b/airflow-core/tests/unit/cli/commands/local_commands/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/tests/unit/cli/commands/local_commands/__init__.py
+++ /dev/null
@@ -1,16 +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.
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/__init__.py b/airflow-core/tests/unit/cli/commands/remote_commands/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/tests/unit/cli/commands/remote_commands/__init__.py
+++ /dev/null
@@ -1,16 +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.
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py b/airflow-core/tests/unit/cli/commands/test_api_server_command.py
similarity index 98%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py
rename to airflow-core/tests/unit/cli/commands/test_api_server_command.py
index 4ea314bf826..837ee0f61bd 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_api_server_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_api_server_command.py
@@ -21,7 +21,7 @@ from unittest import mock
 import pytest
 from rich.console import Console
 
-from airflow.cli.commands.local_commands import api_server_command
+from airflow.cli.commands import api_server_command
 from airflow.exceptions import AirflowConfigException
 
 from unit.cli.commands._common_cli_classes import _CommonCLIGunicornTestClass
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_asset_command.py b/airflow-core/tests/unit/cli/commands/test_asset_command.py
similarity index 98%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_asset_command.py
rename to airflow-core/tests/unit/cli/commands/test_asset_command.py
index 32fb07124de..64ae74ed8ff 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_asset_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_asset_command.py
@@ -27,7 +27,7 @@ import typing
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import asset_command
+from airflow.cli.commands import asset_command
 
 from tests_common.test_utils.db import clear_db_dags, clear_db_runs, parse_and_sync_to_db
 
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_backfill_command.py b/airflow-core/tests/unit/cli/commands/test_backfill_command.py
similarity index 89%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_backfill_command.py
rename to airflow-core/tests/unit/cli/commands/test_backfill_command.py
index d74f44b06b5..d14f447e7d1 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_backfill_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_backfill_command.py
@@ -25,7 +25,7 @@ from unittest import mock
 import pendulum
 import pytest
 
-import airflow.cli.commands.remote_commands.backfill_command
+import airflow.cli.commands.backfill_command
 from airflow.cli import cli_parser
 from airflow.models.backfill import ReprocessBehavior
 from airflow.utils import timezone
@@ -62,7 +62,7 @@ class TestCliBackfill:
         clear_db_dags()
         clear_db_backfills()
 
-    @mock.patch("airflow.cli.commands.remote_commands.backfill_command._create_backfill")
+    @mock.patch("airflow.cli.commands.backfill_command._create_backfill")
     @pytest.mark.parametrize(
         "repro, expected_repro",
         [
@@ -90,7 +90,7 @@ class TestCliBackfill:
                     repro,
                 ]
             )
-        airflow.cli.commands.remote_commands.backfill_command.create_backfill(self.parser.parse_args(args))
+        airflow.cli.commands.backfill_command.create_backfill(self.parser.parse_args(args))
 
         mock_create.assert_called_once_with(
             dag_id="example_bash_operator",
@@ -102,7 +102,7 @@ class TestCliBackfill:
             reprocess_behavior=expected_repro,
         )
 
-    @mock.patch("airflow.cli.commands.remote_commands.backfill_command._do_dry_run")
+    @mock.patch("airflow.cli.commands.backfill_command._do_dry_run")
     @pytest.mark.parametrize(
         "reverse",
         [False, True],
@@ -123,7 +123,7 @@ class TestCliBackfill:
         ]
         if reverse:
             args.append("--run-backwards")
-        airflow.cli.commands.remote_commands.backfill_command.create_backfill(self.parser.parse_args(args))
+        airflow.cli.commands.backfill_command.create_backfill(self.parser.parse_args(args))
 
         mock_dry_run.assert_called_once_with(
             dag_id="example_bash_operator",
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_cheat_sheet_command.py b/airflow-core/tests/unit/cli/commands/test_cheat_sheet_command.py
similarity index 100%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_cheat_sheet_command.py
rename to airflow-core/tests/unit/cli/commands/test_cheat_sheet_command.py
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_config_command.py b/airflow-core/tests/unit/cli/commands/test_config_command.py
similarity index 97%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_config_command.py
rename to airflow-core/tests/unit/cli/commands/test_config_command.py
index aa0137f89e1..75dd395964e 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_config_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_config_command.py
@@ -25,8 +25,8 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import config_command
-from airflow.cli.commands.remote_commands.config_command import ConfigChange, ConfigParameter
+from airflow.cli.commands import config_command
+from airflow.cli.commands.config_command import ConfigChange, ConfigParameter
 
 from tests_common.test_utils.config import conf_vars
 
@@ -38,8 +38,8 @@ class TestCliConfigList:
     def setup_class(cls):
         cls.parser = cli_parser.get_parser()
 
-    @mock.patch("airflow.cli.commands.remote_commands.config_command.StringIO")
-    @mock.patch("airflow.cli.commands.remote_commands.config_command.conf")
+    @mock.patch("airflow.cli.commands.config_command.StringIO")
+    @mock.patch("airflow.cli.commands.config_command.conf")
     def test_cli_show_config_should_write_data(self, mock_conf, mock_stringio):
         config_command.show_config(self.parser.parse_args(["config", "list", "--color", "off"]))
         mock_conf.write.assert_called_once_with(
@@ -54,8 +54,8 @@ class TestCliConfigList:
             only_defaults=False,
         )
 
-    @mock.patch("airflow.cli.commands.remote_commands.config_command.StringIO")
-    @mock.patch("airflow.cli.commands.remote_commands.config_command.conf")
+    @mock.patch("airflow.cli.commands.config_command.StringIO")
+    @mock.patch("airflow.cli.commands.config_command.conf")
     def test_cli_show_config_should_write_data_specific_section(self, mock_conf, mock_stringio):
         config_command.show_config(
             self.parser.parse_args(["config", "list", "--section", "core", "--color", "off"])
@@ -222,7 +222,7 @@ class TestCliConfigGetValue:
 
         assert temp_stdout.getvalue().strip() == "test_value"
 
-    @mock.patch("airflow.cli.commands.remote_commands.config_command.conf")
+    @mock.patch("airflow.cli.commands.config_command.conf")
     def test_should_not_raise_exception_when_section_for_config_with_value_defined_elsewhere_is_missing(
         self, mock_conf
     ):
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py b/airflow-core/tests/unit/cli/commands/test_connection_command.py
similarity index 99%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py
rename to airflow-core/tests/unit/cli/commands/test_connection_command.py
index ccfe38880b3..2222362f2bb 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_connection_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_connection_command.py
@@ -28,7 +28,7 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_config, cli_parser
-from airflow.cli.commands.remote_commands import connection_command
+from airflow.cli.commands import connection_command
 from airflow.exceptions import AirflowException
 from airflow.models import Connection
 from airflow.utils.db import merge_conn
@@ -986,7 +986,7 @@ class TestCliTestConnections:
 
 
 class TestCliCreateDefaultConnection:
-    @mock.patch("airflow.cli.commands.remote_commands.connection_command.db_create_default_connections")
+    @mock.patch("airflow.cli.commands.connection_command.db_create_default_connections")
     def test_cli_create_default_connections(self, mock_db_create_default_connections):
         create_default_connection_fnc = dict(
             (db_command.name, db_command.func) for db_command in cli_config.CONNECTIONS_COMMANDS
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py b/airflow-core/tests/unit/cli/commands/test_dag_command.py
similarity index 96%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py
rename to airflow-core/tests/unit/cli/commands/test_dag_command.py
index 9b6c231e62f..33d33fac5bd 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_dag_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_dag_command.py
@@ -34,7 +34,7 @@ from sqlalchemy import select
 
 from airflow import settings
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import dag_command
+from airflow.cli.commands import dag_command
 from airflow.decorators import task
 from airflow.exceptions import AirflowException
 from airflow.models import DagBag, DagModel, DagRun
@@ -95,7 +95,7 @@ class TestCliDags:
         assert "digraph" in out
         assert "graph [rankdir=LR]" in out
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.render_dag_dependencies")
+    @mock.patch("airflow.cli.commands.dag_command.render_dag_dependencies")
     def test_show_dag_dependencies_save(self, mock_render_dag_dependencies):
         with contextlib.redirect_stdout(StringIO()) as temp_stdout:
             dag_command.dag_dependencies_show(
@@ -115,7 +115,7 @@ class TestCliDags:
         assert "graph [label=example_bash_operator labelloc=t rankdir=LR]" in out
         assert "runme_2 -> run_after_loop" in out
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.render_dag")
+    @mock.patch("airflow.cli.commands.dag_command.render_dag")
     def test_show_dag_save(self, mock_render_dag):
         with contextlib.redirect_stdout(StringIO()) as temp_stdout:
             dag_command.dag_show(
@@ -127,8 +127,8 @@ class TestCliDags:
         )
         assert "File awesome.png saved" in out
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.subprocess.Popen")
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.render_dag")
+    @mock.patch("airflow.cli.commands.dag_command.subprocess.Popen")
+    @mock.patch("airflow.cli.commands.dag_command.render_dag")
     def test_show_dag_imgcat(self, mock_render_dag, mock_popen):
         mock_render_dag.return_value.pipe.return_value = b"DOT_DATA"
         mock_proc = mock.MagicMock()
@@ -381,7 +381,7 @@ class TestCliDags:
         dag_command.dag_unpause(args)
         assert not DagModel.get_dagmodel("example_bash_operator").is_paused
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.ask_yesno")
+    @mock.patch("airflow.cli.commands.dag_command.ask_yesno")
     def test_pause_regex(self, mock_yesno):
         args = self.parser.parse_args(["dags", "pause", "^example_.*$", "--treat-dag-id-as-regex"])
         dag_command.dag_pause(args)
@@ -396,7 +396,7 @@ class TestCliDags:
         assert not DagModel.get_dagmodel("example_kubernetes_executor").is_paused
         assert not DagModel.get_dagmodel("example_xcom_args").is_paused
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.ask_yesno")
+    @mock.patch("airflow.cli.commands.dag_command.ask_yesno")
     def test_pause_regex_operation_cancelled(self, ask_yesno, capsys):
         args = self.parser.parse_args(["dags", "pause", "example_bash_operator", "--treat-dag-id-as-regex"])
         ask_yesno.return_value = False
@@ -404,7 +404,7 @@ class TestCliDags:
         stdout = capsys.readouterr().out
         assert "Operation cancelled by user" in stdout
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command.ask_yesno")
+    @mock.patch("airflow.cli.commands.dag_command.ask_yesno")
     def test_pause_regex_yes(self, mock_yesno):
         args = self.parser.parse_args(["dags", "pause", ".*", "--treat-dag-id-as-regex", "--yes"])
         dag_command.dag_pause(args)
@@ -564,7 +564,7 @@ class TestCliDags:
             is None
         )
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command._parse_and_get_dag")
+    @mock.patch("airflow.cli.commands.dag_command._parse_and_get_dag")
     def test_dag_test(self, mock_parse_and_get_dag):
         cli_args = self.parser.parse_args(["dags", "test", "example_bash_operator", DEFAULT_DATE.isoformat()])
         dag_command.dag_test(cli_args)
@@ -583,7 +583,7 @@ class TestCliDags:
             ]
         )
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command._parse_and_get_dag")
+    @mock.patch("airflow.cli.commands.dag_command._parse_and_get_dag")
     def test_dag_test_fail_raise_error(self, mock_parse_and_get_dag):
         logical_date_str = DEFAULT_DATE.isoformat()
         mock_parse_and_get_dag.return_value.test.return_value = DagRun(
@@ -593,7 +593,7 @@ class TestCliDags:
         with pytest.raises(SystemExit, match=r"DagRun failed"):
             dag_command.dag_test(cli_args)
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command._parse_and_get_dag")
+    @mock.patch("airflow.cli.commands.dag_command._parse_and_get_dag")
     @mock.patch("airflow.utils.timezone.utcnow")
     def test_dag_test_no_logical_date(self, mock_utcnow, mock_parse_and_get_dag):
         now = pendulum.now()
@@ -618,7 +618,7 @@ class TestCliDags:
             ]
         )
 
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command._parse_and_get_dag")
+    @mock.patch("airflow.cli.commands.dag_command._parse_and_get_dag")
     def test_dag_test_conf(self, mock_parse_and_get_dag):
         cli_args = self.parser.parse_args(
             [
@@ -646,10 +646,8 @@ class TestCliDags:
             ]
         )
 
-    @mock.patch(
-        "airflow.cli.commands.remote_commands.dag_command.render_dag", return_value=MagicMock(source="SOURCE")
-    )
-    @mock.patch("airflow.cli.commands.remote_commands.dag_command._parse_and_get_dag")
+    @mock.patch("airflow.cli.commands.dag_command.render_dag", return_value=MagicMock(source="SOURCE"))
+    @mock.patch("airflow.cli.commands.dag_command._parse_and_get_dag")
     def test_dag_test_show_dag(self, mock_parse_and_get_dag, mock_render_dag):
         mock_parse_and_get_dag.return_value.test.return_value.run_id = (
             "__test_dag_test_show_dag_fake_dag_run_run_id__"
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_dag_processor_command.py b/airflow-core/tests/unit/cli/commands/test_dag_processor_command.py
similarity index 88%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_dag_processor_command.py
rename to airflow-core/tests/unit/cli/commands/test_dag_processor_command.py
index 9a78d57c017..3e0e931587c 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_dag_processor_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_dag_processor_command.py
@@ -23,7 +23,7 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import dag_processor_command
+from airflow.cli.commands import dag_processor_command
 
 from tests_common.test_utils.config import conf_vars
 
@@ -40,7 +40,7 @@ class TestDagProcessorCommand:
         cls.parser = cli_parser.get_parser()
 
     @conf_vars({("core", "load_examples"): "False"})
-    @mock.patch("airflow.cli.commands.local_commands.dag_processor_command.DagProcessorJobRunner")
+    @mock.patch("airflow.cli.commands.dag_processor_command.DagProcessorJobRunner")
     def test_start_job(self, mock_runner):
         """Ensure that DagProcessorJobRunner is started"""
         mock_runner.return_value.job_type = "DagProcessorJob"
@@ -49,7 +49,7 @@ class TestDagProcessorCommand:
         mock_runner.return_value._execute.assert_called()
 
     @conf_vars({("core", "load_examples"): "False"})
-    @mock.patch("airflow.cli.commands.local_commands.dag_processor_command.DagProcessorJobRunner")
+    @mock.patch("airflow.cli.commands.dag_processor_command.DagProcessorJobRunner")
     def test_bundle_names_passed(self, mock_runner, configure_testing_dag_bundle):
         mock_runner.return_value.job_type = "DagProcessorJob"
         args = self.parser.parse_args(["dag-processor", "--bundle-name", "testing"])
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py b/airflow-core/tests/unit/cli/commands/test_db_command.py
similarity index 88%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py
rename to airflow-core/tests/unit/cli/commands/test_db_command.py
index d1821f37dc1..bc71b7b1d3d 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_db_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_db_command.py
@@ -25,7 +25,7 @@ from sqlalchemy.engine.url import make_url
 from sqlalchemy.exc import OperationalError
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import db_command
+from airflow.cli.commands import db_command
 from airflow.exceptions import AirflowException
 
 pytestmark = pytest.mark.db_test
@@ -36,18 +36,18 @@ class TestCliDb:
     def setup_class(cls):
         cls.parser = cli_parser.get_parser()
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.db.resetdb")
+    @mock.patch("airflow.cli.commands.db_command.db.resetdb")
     def test_cli_resetdb(self, mock_resetdb):
         db_command.resetdb(self.parser.parse_args(["db", "reset", "--yes"]))
 
         mock_resetdb.assert_called_once_with(skip_init=False)
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.db.resetdb")
+    @mock.patch("airflow.cli.commands.db_command.db.resetdb")
     def test_cli_resetdb_skip_init(self, mock_resetdb):
         db_command.resetdb(self.parser.parse_args(["db", "reset", "--yes", "--skip-init"]))
         mock_resetdb.assert_called_once_with(skip_init=True)
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.db.check_migrations")
+    @mock.patch("airflow.cli.commands.db_command.db.check_migrations")
     def test_cli_check_migrations(self, mock_wait_for_migrations):
         db_command.check_migrations(self.parser.parse_args(["db", "check-migrations"]))
 
@@ -134,7 +134,7 @@ class TestCliDb:
             ),
         ],
     )
-    @mock.patch("airflow.cli.commands.local_commands.db_command.db.upgradedb")
+    @mock.patch("airflow.cli.commands.db_command.db.upgradedb")
     def test_cli_upgrade_success(self, mock_upgradedb, args, called_with):
         # TODO(ephraimbuddy): Revisit this when we add more migration files and use other versions/revisions other than 2.10.0/22ed7efa9da2
         db_command.migratedb(self.parser.parse_args(["db", "migrate", *args]))
@@ -177,15 +177,15 @@ class TestCliDb:
             ),
         ],
     )
-    @mock.patch("airflow.cli.commands.local_commands.db_command.db.upgradedb")
+    @mock.patch("airflow.cli.commands.db_command.db.upgradedb")
     def test_cli_sync_failure(self, mock_upgradedb, args, pattern):
         with pytest.raises(SystemExit, match=pattern):
             db_command.migratedb(self.parser.parse_args(["db", "migrate", *args]))
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.execute_interactive")
-    @mock.patch("airflow.cli.commands.local_commands.db_command.NamedTemporaryFile")
+    @mock.patch("airflow.cli.commands.db_command.execute_interactive")
+    @mock.patch("airflow.cli.commands.db_command.NamedTemporaryFile")
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("mysql://root@mysql:3306/airflow"),
     )
     def test_cli_shell_mysql(self, mock_tmp_file, mock_execute_interactive):
@@ -197,10 +197,10 @@ class TestCliDb:
             b"\ndatabase = airflow"
         )
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.execute_interactive")
-    @mock.patch("airflow.cli.commands.local_commands.db_command.NamedTemporaryFile")
+    @mock.patch("airflow.cli.commands.db_command.execute_interactive")
+    @mock.patch("airflow.cli.commands.db_command.NamedTemporaryFile")
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("mysql://root@mysql/airflow"),
     )
     def test_cli_shell_mysql_without_port(self, mock_tmp_file, mock_execute_interactive):
@@ -212,18 +212,18 @@ class TestCliDb:
             b"\ndatabase = airflow"
         )
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.execute_interactive")
+    @mock.patch("airflow.cli.commands.db_command.execute_interactive")
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("sqlite:////root/airflow/airflow.db"),
     )
     def test_cli_shell_sqlite(self, mock_execute_interactive):
         db_command.shell(self.parser.parse_args(["db", "shell"]))
         mock_execute_interactive.assert_called_once_with(["sqlite3", "/root/airflow/airflow.db"])
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.execute_interactive")
+    @mock.patch("airflow.cli.commands.db_command.execute_interactive")
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("postgresql+psycopg2://postgres:airflow@postgres:5432/airflow"),
     )
     def test_cli_shell_postgres(self, mock_execute_interactive):
@@ -240,9 +240,9 @@ class TestCliDb:
             "PGUSER": "postgres",
         }
 
-    @mock.patch("airflow.cli.commands.local_commands.db_command.execute_interactive")
+    @mock.patch("airflow.cli.commands.db_command.execute_interactive")
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("postgresql+psycopg2://postgres:airflow@postgres/airflow"),
     )
     def test_cli_shell_postgres_without_port(self, mock_execute_interactive):
@@ -260,7 +260,7 @@ class TestCliDb:
         }
 
     @mock.patch(
-        "airflow.cli.commands.local_commands.db_command.settings.engine.url",
+        "airflow.cli.commands.db_command.settings.engine.url",
         make_url("invalid+psycopg2://postgres:airflow@postgres/airflow"),
     )
     def test_cli_shell_invalid(self):
@@ -323,7 +323,7 @@ class TestCliDb:
         ],
     )
     @mock.patch("airflow.utils.db.downgrade")
-    @mock.patch("airflow.cli.commands.local_commands.db_command.input")
+    @mock.patch("airflow.cli.commands.db_command.input")
     def test_cli_downgrade_confirm(self, mock_input, mock_dg, resp, raise_):
         mock_input.return_value = resp
         if raise_:
@@ -361,7 +361,7 @@ class TestCLIDBClean:
         cls.parser = cli_parser.get_parser()
 
     @pytest.mark.parametrize("timezone", ["UTC", "Europe/Berlin", "America/Los_Angeles"])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_date_timezone_omitted(self, run_cleanup_mock, timezone):
         """
         When timezone omitted we should always expect that the timestamp is
@@ -381,7 +381,7 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("timezone", ["UTC", "Europe/Berlin", "America/Los_Angeles"])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_date_timezone_supplied(self, run_cleanup_mock, timezone):
         """
         When tz included in the string then default timezone should not be used.
@@ -401,7 +401,7 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("confirm_arg, expected", [(["-y"], False), ([], True)])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_confirm(self, run_cleanup_mock, confirm_arg, expected):
         """
         When ``-y`` provided, ``confirm`` should be false.
@@ -427,7 +427,7 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("extra_arg, expected", [(["--skip-archive"], True), ([], False)])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_skip_archive(self, run_cleanup_mock, extra_arg, expected):
         """
         When ``--skip-archive`` provided, ``skip_archive`` should be True (False otherwise).
@@ -453,7 +453,7 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("dry_run_arg, expected", [(["--dry-run"], True), ([], False)])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_dry_run(self, run_cleanup_mock, dry_run_arg, expected):
         """
         When tz included in the string then default timezone should not be used.
@@ -481,7 +481,7 @@ class TestCLIDBClean:
     @pytest.mark.parametrize(
         "extra_args, expected", [(["--tables", "hello, goodbye"], ["hello", "goodbye"]), ([], None)]
     )
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_tables(self, run_cleanup_mock, extra_args, expected):
         """
         When tz included in the string then default timezone should not be used.
@@ -507,7 +507,7 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("extra_args, expected", [(["--verbose"], True), ([], False)])
-    @patch("airflow.cli.commands.local_commands.db_command.run_cleanup")
+    @patch("airflow.cli.commands.db_command.run_cleanup")
     def test_verbose(self, run_cleanup_mock, extra_args, expected):
         """
         When tz included in the string then default timezone should not be used.
@@ -532,8 +532,8 @@ class TestCLIDBClean:
             skip_archive=False,
         )
 
-    @patch("airflow.cli.commands.local_commands.db_command.export_archived_records")
-    @patch("airflow.cli.commands.local_commands.db_command.os.path.isdir", return_value=True)
+    @patch("airflow.cli.commands.db_command.export_archived_records")
+    @patch("airflow.cli.commands.db_command.os.path.isdir", return_value=True)
     def test_export_archived_records(self, os_mock, export_archived_mock):
         args = self.parser.parse_args(
             [
@@ -552,8 +552,8 @@ class TestCLIDBClean:
     @pytest.mark.parametrize(
         "extra_args, expected", [(["--tables", "hello, goodbye"], ["hello", "goodbye"]), ([], None)]
     )
-    @patch("airflow.cli.commands.local_commands.db_command.export_archived_records")
-    @patch("airflow.cli.commands.local_commands.db_command.os.path.isdir", return_value=True)
+    @patch("airflow.cli.commands.db_command.export_archived_records")
+    @patch("airflow.cli.commands.db_command.os.path.isdir", return_value=True)
     def test_tables_in_export_archived_records_command(
         self, os_mock, export_archived_mock, extra_args, expected
     ):
@@ -576,8 +576,8 @@ class TestCLIDBClean:
         )
 
     @pytest.mark.parametrize("extra_args, expected", [(["--drop-archives"], True), ([], False)])
-    @patch("airflow.cli.commands.local_commands.db_command.export_archived_records")
-    @patch("airflow.cli.commands.local_commands.db_command.os.path.isdir", return_value=True)
+    @patch("airflow.cli.commands.db_command.export_archived_records")
+    @patch("airflow.cli.commands.db_command.os.path.isdir", return_value=True)
     def test_drop_archives_in_export_archived_records_command(
         self, os_mock, export_archived_mock, extra_args, expected
     ):
@@ -602,7 +602,7 @@ class TestCLIDBClean:
     @pytest.mark.parametrize(
         "extra_args, expected", [(["--tables", "hello, goodbye"], ["hello", "goodbye"]), ([], None)]
     )
-    @patch("airflow.cli.commands.local_commands.db_command.drop_archived_tables")
+    @patch("airflow.cli.commands.db_command.drop_archived_tables")
     def test_tables_in_drop_archived_records_command(self, mock_drop_archived_records, extra_args, expected):
         args = self.parser.parse_args(
             [
@@ -615,7 +615,7 @@ class TestCLIDBClean:
         mock_drop_archived_records.assert_called_once_with(table_names=expected, needs_confirm=True)
 
     @pytest.mark.parametrize("extra_args, expected", [(["-y"], False), ([], True)])
-    @patch("airflow.cli.commands.local_commands.db_command.drop_archived_tables")
+    @patch("airflow.cli.commands.db_command.drop_archived_tables")
     def test_confirm_in_drop_archived_records_command(self, mock_drop_archived_records, extra_args, expected):
         args = self.parser.parse_args(
             [
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_info_command.py b/airflow-core/tests/unit/cli/commands/test_info_command.py
similarity index 97%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_info_command.py
rename to airflow-core/tests/unit/cli/commands/test_info_command.py
index 634eee083b7..1db61aa6346 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_info_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_info_command.py
@@ -28,7 +28,7 @@ import pytest
 from rich.console import Console
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import info_command
+from airflow.cli.commands import info_command
 from airflow.config_templates import airflow_local_settings
 from airflow.logging_config import configure_logging
 from airflow.version import version as airflow_version
@@ -185,7 +185,7 @@ class TestInfoCommandMockHttpx:
         }
     )
     def test_show_info_anonymize_fileio(self, setup_parser, cleanup_providers_manager):
-        with mock.patch("airflow.cli.commands.local_commands.info_command.httpx.post") as post:
+        with mock.patch("airflow.cli.commands.info_command.httpx.post") as post:
             post.return_value = httpx.Response(
                 status_code=200,
                 json={
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_jobs_command.py b/airflow-core/tests/unit/cli/commands/test_jobs_command.py
similarity index 99%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_jobs_command.py
rename to airflow-core/tests/unit/cli/commands/test_jobs_command.py
index c97a62da806..fa575e7917f 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_jobs_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_jobs_command.py
@@ -22,7 +22,7 @@ from io import StringIO
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import jobs_command
+from airflow.cli.commands import jobs_command
 from airflow.jobs.job import Job
 from airflow.jobs.scheduler_job_runner import SchedulerJobRunner
 from airflow.utils.session import create_session
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_kerberos_command.py b/airflow-core/tests/unit/cli/commands/test_kerberos_command.py
similarity index 87%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_kerberos_command.py
rename to airflow-core/tests/unit/cli/commands/test_kerberos_command.py
index d99b4096c2f..39695ff51a8 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_kerberos_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_kerberos_command.py
@@ -21,7 +21,7 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import kerberos_command
+from airflow.cli.commands import kerberos_command
 from airflow.security.kerberos import KerberosMode
 
 from tests_common.test_utils.config import conf_vars
@@ -34,7 +34,7 @@ class TestKerberosCommand:
     def setup_class(cls):
         cls.parser = cli_parser.get_parser()
 
-    @mock.patch("airflow.cli.commands.local_commands.kerberos_command.krb")
+    @mock.patch("airflow.cli.commands.kerberos_command.krb")
     @conf_vars({("core", "executor"): "CeleryExecutor"})
     def test_run_command(self, mock_krb):
         args = self.parser.parse_args(["kerberos", "PRINCIPAL", "--keytab", "/tmp/airflow.keytab"])
@@ -44,10 +44,10 @@ class TestKerberosCommand:
             keytab="/tmp/airflow.keytab", principal="PRINCIPAL", mode=KerberosMode.STANDARD
         )
 
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.TimeoutPIDLockFile")
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.setup_locations")
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.daemon")
-    @mock.patch("airflow.cli.commands.local_commands.kerberos_command.krb")
+    @mock.patch("airflow.cli.commands.daemon_utils.TimeoutPIDLockFile")
+    @mock.patch("airflow.cli.commands.daemon_utils.setup_locations")
+    @mock.patch("airflow.cli.commands.daemon_utils.daemon")
+    @mock.patch("airflow.cli.commands.kerberos_command.krb")
     @conf_vars({("core", "executor"): "CeleryExecutor"})
     def test_run_command_daemon(self, mock_krb, mock_daemon, mock_setup_locations, mock_pid_file):
         mock_setup_locations.return_value = (
@@ -74,7 +74,7 @@ class TestKerberosCommand:
             ]
         )
         mock_open = mock.mock_open()
-        with mock.patch("airflow.cli.commands.local_commands.daemon_utils.open", mock_open):
+        with mock.patch("airflow.cli.commands.daemon_utils.open", mock_open):
             kerberos_command.kerberos(args)
 
         mock_krb.run.assert_called_once_with(
@@ -112,7 +112,7 @@ class TestKerberosCommand:
             mock.call().__exit__(None, None, None),
         ]
 
-    @mock.patch("airflow.cli.commands.local_commands.kerberos_command.krb")
+    @mock.patch("airflow.cli.commands.kerberos_command.krb")
     @conf_vars({("core", "executor"): "CeleryExecutor"})
     def test_run_command_with_mode_standard(self, mock_krb):
         args = self.parser.parse_args(["kerberos", "PRINCIPAL", "--keytab", "/tmp/airflow.keytab"])
@@ -122,7 +122,7 @@ class TestKerberosCommand:
             keytab="/tmp/airflow.keytab", principal="PRINCIPAL", mode=KerberosMode.STANDARD
         )
 
-    @mock.patch("airflow.cli.commands.local_commands.kerberos_command.krb")
+    @mock.patch("airflow.cli.commands.kerberos_command.krb")
     @conf_vars({("core", "executor"): "CeleryExecutor"})
     def test_run_command_with_mode_one_time(self, mock_krb):
         args = self.parser.parse_args(
diff --git a/airflow-core/tests/unit/cli/commands/test_legacy_commands.py b/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
index 8fb7df7efcc..f4550146e4e 100644
--- a/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
+++ b/airflow-core/tests/unit/cli/commands/test_legacy_commands.py
@@ -24,8 +24,8 @@ from unittest.mock import MagicMock
 import pytest
 
 from airflow.cli import cli_parser
+from airflow.cli.commands import config_command
 from airflow.cli.commands.legacy_commands import check_legacy_command
-from airflow.cli.commands.remote_commands import config_command
 
 
 class TestCliDeprecatedCommandsValue:
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py b/airflow-core/tests/unit/cli/commands/test_plugins_command.py
similarity index 96%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py
rename to airflow-core/tests/unit/cli/commands/test_plugins_command.py
index 2621e39b9d3..1f7278d9091 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_plugins_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_plugins_command.py
@@ -24,7 +24,7 @@ from contextlib import redirect_stdout
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import plugins_command
+from airflow.cli.commands import plugins_command
 from airflow.listeners.listener import get_listener_manager
 from airflow.plugins_manager import AirflowPlugin
 from airflow.sdk import BaseOperatorLink
@@ -133,8 +133,8 @@ class TestPluginsCommand:
         expected_output = textwrap.dedent(
             """\
             name            | global_operator_extra_links
-            ================+==============================================================================
-            test-plugin-cli | <unit.cli.commands.local_commands.test_plugins_command.AirflowNewLink object>
+            ================+===============================================================
+            test-plugin-cli | <unit.cli.commands.test_plugins_command.AirflowNewLink object>
             """
         )
         assert stdout == expected_output
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_pool_command.py b/airflow-core/tests/unit/cli/commands/test_pool_command.py
similarity index 99%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_pool_command.py
rename to airflow-core/tests/unit/cli/commands/test_pool_command.py
index 8cd47314102..67cc39dec4c 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_pool_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_pool_command.py
@@ -25,7 +25,7 @@ import pytest
 
 from airflow import models, settings
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import pool_command
+from airflow.cli.commands import pool_command
 from airflow.models import Pool
 from airflow.settings import Session
 from airflow.utils.db import add_default_pool_if_not_exists
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_rotate_fernet_key_command.py b/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
similarity index 98%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_rotate_fernet_key_command.py
rename to airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
index 7f124e2ca46..5ec4502962e 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_rotate_fernet_key_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
@@ -22,7 +22,7 @@ import pytest
 from cryptography.fernet import Fernet
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import rotate_fernet_key_command
+from airflow.cli.commands import rotate_fernet_key_command
 from airflow.hooks.base import BaseHook
 from airflow.models import Connection, Variable
 from airflow.utils.session import provide_session
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_scheduler_command.py b/airflow-core/tests/unit/cli/commands/test_scheduler_command.py
similarity index 81%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_scheduler_command.py
rename to airflow-core/tests/unit/cli/commands/test_scheduler_command.py
index 8da375b2b14..fc1ced044f5 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_scheduler_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_scheduler_command.py
@@ -23,7 +23,7 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import scheduler_command
+from airflow.cli.commands import scheduler_command
 from airflow.executors import executor_loader
 from airflow.utils.scheduler_health import serve_health_check
 from airflow.utils.serve_logs import serve_logs
@@ -47,8 +47,8 @@ class TestSchedulerCommand:
             ("KubernetesExecutor", False),
         ],
     )
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     def test_serve_logs_on_scheduler(self, mock_process, mock_scheduler_job, executor, expect_serve_logs):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
         args = self.parser.parse_args(["scheduler"])
@@ -62,8 +62,8 @@ class TestSchedulerCommand:
                 with pytest.raises(AssertionError):
                     mock_process.assert_has_calls([mock.call(target=serve_logs)])
 
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     @pytest.mark.parametrize("executor", ["LocalExecutor", "SequentialExecutor"])
     def test_skip_serve_logs(self, mock_process, mock_scheduler_job, executor):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
@@ -76,8 +76,8 @@ class TestSchedulerCommand:
 
     @mock.patch("airflow.utils.db.check_and_run_migrations")
     @mock.patch("airflow.utils.db.synchronize_log_template")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     def test_check_migrations_is_false(self, mock_process, mock_scheduler_job, mock_log, mock_run_migration):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
         args = self.parser.parse_args(["scheduler"])
@@ -88,8 +88,8 @@ class TestSchedulerCommand:
 
     @mock.patch("airflow.utils.db.check_and_run_migrations")
     @mock.patch("airflow.utils.db.synchronize_log_template")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     def test_check_migrations_is_true(self, mock_process, mock_scheduler_job, mock_log, mock_run_migration):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
         args = self.parser.parse_args(["scheduler"])
@@ -98,8 +98,8 @@ class TestSchedulerCommand:
             mock_run_migration.assert_called_once()
             mock_log.assert_called_once()
 
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     @pytest.mark.parametrize("executor", ["LocalExecutor", "SequentialExecutor"])
     def test_graceful_shutdown(self, mock_process, mock_scheduler_job, executor):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
@@ -112,8 +112,8 @@ class TestSchedulerCommand:
             finally:
                 mock_process().terminate.assert_called()
 
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     def test_enable_scheduler_health(self, mock_process, mock_scheduler_job):
         with conf_vars({("scheduler", "enable_health_check"): "True"}):
             mock_scheduler_job.return_value.job_type = "SchedulerJob"
@@ -121,8 +121,8 @@ class TestSchedulerCommand:
             scheduler_command.scheduler(args)
             mock_process.assert_has_calls([mock.call(target=serve_health_check)])
 
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     def test_disable_scheduler_health(self, mock_process, mock_scheduler_job):
         mock_scheduler_job.return_value.job_type = "SchedulerJob"
         args = self.parser.parse_args(["scheduler"])
@@ -146,10 +146,10 @@ class TestSchedulerCommand:
             serve_health_check()
         assert http_server_mock.call_args.args[0] == (health_check_host, health_check_port)
 
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.SchedulerJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.scheduler_command.Process")
+    @mock.patch("airflow.cli.commands.scheduler_command.SchedulerJobRunner")
+    @mock.patch("airflow.cli.commands.scheduler_command.Process")
     @mock.patch(
-        "airflow.cli.commands.local_commands.scheduler_command.run_job",
+        "airflow.cli.commands.scheduler_command.run_job",
         side_effect=Exception("run_job failed"),
     )
     def test_run_job_exception_handling(self, mock_run_job, mock_process, mock_scheduler_job):
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_standalone_command.py b/airflow-core/tests/unit/cli/commands/test_standalone_command.py
similarity index 96%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_standalone_command.py
rename to airflow-core/tests/unit/cli/commands/test_standalone_command.py
index 484596529f2..6151493ee6e 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_standalone_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_standalone_command.py
@@ -22,7 +22,7 @@ from unittest import mock
 
 import pytest
 
-from airflow.cli.commands.local_commands.standalone_command import StandaloneCommand
+from airflow.cli.commands.standalone_command import StandaloneCommand
 from airflow.executors import executor_loader
 from airflow.executors.executor_constants import (
     CELERY_EXECUTOR,
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py b/airflow-core/tests/unit/cli/commands/test_task_command.py
similarity index 98%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py
rename to airflow-core/tests/unit/cli/commands/test_task_command.py
index 2ed3a60b3b6..57534bd978b 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_task_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_task_command.py
@@ -34,8 +34,8 @@ from unittest.mock import sentinel
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import task_command
-from airflow.cli.commands.remote_commands.task_command import LoggerMutationHelper
+from airflow.cli.commands import task_command
+from airflow.cli.commands.task_command import LoggerMutationHelper
 from airflow.config_templates.airflow_local_settings import DEFAULT_LOGGING_CONFIG
 from airflow.configuration import conf
 from airflow.exceptions import DagRunNotFound
@@ -137,9 +137,7 @@ class TestCliTasks:
         assert "example_python_operator" in stdout.getvalue()
         assert "print_the_context" in stdout.getvalue()
 
-    @mock.patch(
-        "airflow.cli.commands.remote_commands.task_command.fetch_dag_run_from_run_id_or_logical_date_string"
-    )
+    @mock.patch("airflow.cli.commands.task_command.fetch_dag_run_from_run_id_or_logical_date_string")
     def test_task_render_with_custom_timetable(self, mock_fetch_dag_run_from_run_id_or_logical_date_string):
         """
         Test that the `tasks render` CLI command queries the database correctly
diff --git a/airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py b/airflow-core/tests/unit/cli/commands/test_triggerer_command.py
similarity index 81%
rename from airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py
rename to airflow-core/tests/unit/cli/commands/test_triggerer_command.py
index 5f1f6afa35c..b5222038f2d 100644
--- a/airflow-core/tests/unit/cli/commands/local_commands/test_triggerer_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_triggerer_command.py
@@ -22,7 +22,7 @@ from unittest import mock
 import pytest
 
 from airflow.cli import cli_parser
-from airflow.cli.commands.local_commands import triggerer_command
+from airflow.cli.commands import triggerer_command
 
 pytestmark = pytest.mark.db_test
 
@@ -36,8 +36,8 @@ class TestTriggererCommand:
     def setup_class(cls):
         cls.parser = cli_parser.get_parser()
 
-    @mock.patch("airflow.cli.commands.local_commands.triggerer_command.TriggererJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.triggerer_command._serve_logs")
+    @mock.patch("airflow.cli.commands.triggerer_command.TriggererJobRunner")
+    @mock.patch("airflow.cli.commands.triggerer_command._serve_logs")
     def test_capacity_argument(
         self,
         mock_serve,
@@ -51,9 +51,9 @@ class TestTriggererCommand:
         mock_serve.return_value.__exit__.assert_called_once()
         mock_triggerer_job_runner.assert_called_once_with(job=mock.ANY, capacity=42)
 
-    @mock.patch("airflow.cli.commands.local_commands.triggerer_command.TriggererJobRunner")
-    @mock.patch("airflow.cli.commands.local_commands.triggerer_command.run_job")
-    @mock.patch("airflow.cli.commands.local_commands.triggerer_command.Process")
+    @mock.patch("airflow.cli.commands.triggerer_command.TriggererJobRunner")
+    @mock.patch("airflow.cli.commands.triggerer_command.run_job")
+    @mock.patch("airflow.cli.commands.triggerer_command.Process")
     def test_trigger_run_serve_logs(self, mock_process, mock_run_job, mock_trigger_job_runner):
         """Ensure that trigger runner and server log functions execute as intended"""
         triggerer_command.triggerer_run(False, 1, 10.3)
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_variable_command.py b/airflow-core/tests/unit/cli/commands/test_variable_command.py
similarity index 99%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_variable_command.py
rename to airflow-core/tests/unit/cli/commands/test_variable_command.py
index a03f99940b0..1d86b1068d5 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_variable_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_variable_command.py
@@ -27,7 +27,7 @@ from sqlalchemy import select
 
 from airflow import models
 from airflow.cli import cli_parser
-from airflow.cli.commands.remote_commands import variable_command
+from airflow.cli.commands import variable_command
 from airflow.models import Variable
 from airflow.utils.session import create_session
 
diff --git a/airflow-core/tests/unit/cli/commands/remote_commands/test_version_command.py b/airflow-core/tests/unit/cli/commands/test_version_command.py
similarity index 87%
rename from airflow-core/tests/unit/cli/commands/remote_commands/test_version_command.py
rename to airflow-core/tests/unit/cli/commands/test_version_command.py
index 1aa17828bfa..bcf2e303c1f 100644
--- a/airflow-core/tests/unit/cli/commands/remote_commands/test_version_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_version_command.py
@@ -19,7 +19,7 @@ from __future__ import annotations
 from contextlib import redirect_stdout
 from io import StringIO
 
-import airflow.cli.commands.remote_commands.version_command
+import airflow.cli.commands.version_command
 from airflow.cli import cli_parser
 from airflow.version import version
 
@@ -31,5 +31,5 @@ class TestCliVersion:
 
     def test_cli_version(self):
         with redirect_stdout(StringIO()) as stdout:
-            airflow.cli.commands.remote_commands.version_command.version(self.parser.parse_args(["version"]))
+            airflow.cli.commands.version_command.version(self.parser.parse_args(["version"]))
         assert version in stdout.getvalue()
diff --git a/airflow-core/tests/unit/listeners/file_write_listener.py b/airflow-core/tests/unit/listeners/file_write_listener.py
index c542ccacab5..660412f464c 100644
--- a/airflow-core/tests/unit/listeners/file_write_listener.py
+++ b/airflow-core/tests/unit/listeners/file_write_listener.py
@@ -19,7 +19,7 @@ from __future__ import annotations
 
 import logging
 
-from airflow.cli.commands.remote_commands.task_command import TaskCommandMarker
+from airflow.cli.commands.task_command import TaskCommandMarker
 from airflow.listeners import hookimpl
 
 log = logging.getLogger(__name__)
diff --git a/providers/celery/src/airflow/providers/celery/cli/celery_command.py b/providers/celery/src/airflow/providers/celery/cli/celery_command.py
index 8381886f702..e65f924f5a1 100644
--- a/providers/celery/src/airflow/providers/celery/cli/celery_command.py
+++ b/providers/celery/src/airflow/providers/celery/cli/celery_command.py
@@ -47,10 +47,8 @@ log = logging.getLogger(__name__)
 
 def _run_command_with_daemon_option(*args, **kwargs):
     try:
-        if AIRFLOW_V_3_0_PLUS:
-            from airflow.cli.commands.local_commands.daemon_utils import run_command_with_daemon_option
-        else:
-            from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
+        from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
+
         run_command_with_daemon_option(*args, **kwargs)
     except ImportError:
         from airflow.exceptions import AirflowOptionalProviderFeatureException
diff --git a/providers/celery/tests/unit/celery/cli/test_celery_command.py b/providers/celery/tests/unit/celery/cli/test_celery_command.py
index 06f96876a1f..b10a7afa126 100644
--- a/providers/celery/tests/unit/celery/cli/test_celery_command.py
+++ b/providers/celery/tests/unit/celery/cli/test_celery_command.py
@@ -278,7 +278,7 @@ class TestFlowerCommand:
             ]
         )
         mock_open = mock.mock_open()
-        with mock.patch("airflow.cli.commands.local_commands.daemon_utils.open", mock_open):
+        with mock.patch("airflow.cli.commands.daemon_utils.open", mock_open):
             celery_command.flower(args)
 
         mock_celery_app.start.assert_called_once_with(
@@ -344,9 +344,9 @@ class TestFlowerCommand:
         self._test_run_command_daemon(mock_celery_app, mock_daemon, mock_setup_locations, mock_pid_file)
 
     @pytest.mark.skipif(not AIRFLOW_V_3_0_PLUS, reason="Test requires Airflow 3.0+")
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.TimeoutPIDLockFile")
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.setup_locations")
-    @mock.patch("airflow.cli.commands.local_commands.daemon_utils.daemon")
+    @mock.patch("airflow.cli.commands.daemon_utils.TimeoutPIDLockFile")
+    @mock.patch("airflow.cli.commands.daemon_utils.setup_locations")
+    @mock.patch("airflow.cli.commands.daemon_utils.daemon")
     @mock.patch("airflow.providers.celery.executors.celery_executor.app")
     def test_run_command_daemon_v3_above(
         self, mock_celery_app, mock_daemon, mock_setup_locations, mock_pid_file
diff --git a/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py b/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py
index d6d019ab203..38d2617f78f 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py
@@ -17,7 +17,7 @@
 from __future__ import annotations
 
 from airflow import settings
-from airflow.cli.commands.local_commands.db_command import run_db_downgrade_command, run_db_migrate_command
+from airflow.cli.commands.db_command import run_db_downgrade_command, run_db_migrate_command
 from airflow.providers.fab.auth_manager.models.db import _REVISION_HEADS_MAP, FABDBManager
 from airflow.utils import cli as cli_utils
 from airflow.utils.providers_configuration_loader import providers_configuration_loaded
diff --git a/scripts/cov/cli_coverage.py b/scripts/cov/cli_coverage.py
index 46dcd0607a5..ca85d2e41ea 100644
--- a/scripts/cov/cli_coverage.py
+++ b/scripts/cov/cli_coverage.py
@@ -30,20 +30,20 @@ cli_files = ["tests/cli"]
 files_not_fully_covered = [
     "airflow/cli/cli_config.py",
     "airflow/cli/cli_parser.py",
-    "airflow/cli/commands/remote_commands/config_command.py",
-    "airflow/cli/commands/remote_commands/connection_command.py",
-    "airflow/cli/commands/remote_commands/dag_command.py",
-    "airflow/cli/commands/local_commands/dag_processor_command.py",
-    "airflow/cli/commands/local_commands/db_command.py",
-    "airflow/cli/commands/local_commands/info_command.py",
-    "airflow/cli/commands/remote_commands/jobs_command.py",
-    "airflow/cli/commands/local_commands/plugins_command.py",
-    "airflow/cli/commands/remote_commands/pool_command.py",
-    "airflow/cli/commands/remote_commands/provider_command.py",
-    "airflow/cli/commands/local_commands/scheduler_command.py",
-    "airflow/cli/commands/local_commands/standalone_command.py",
-    "airflow/cli/commands/remote_commands/task_command.py",
-    "airflow/cli/commands/remote_commands/variable_command.py",
+    "airflow/cli/commands/config_command.py",
+    "airflow/cli/commands/connection_command.py",
+    "airflow/cli/commands/dag_command.py",
+    "airflow/cli/commands/dag_processor_command.py",
+    "airflow/cli/commands/db_command.py",
+    "airflow/cli/commands/info_command.py",
+    "airflow/cli/commands/jobs_command.py",
+    "airflow/cli/commands/plugins_command.py",
+    "airflow/cli/commands/pool_command.py",
+    "airflow/cli/commands/provider_command.py",
+    "airflow/cli/commands/scheduler_command.py",
+    "airflow/cli/commands/standalone_command.py",
+    "airflow/cli/commands/task_command.py",
+    "airflow/cli/commands/variable_command.py",
     "airflow/cli/simple_table.py",
 ]
 
diff --git a/scripts/in_container/run_provider_yaml_files_check.py b/scripts/in_container/run_provider_yaml_files_check.py
index 1d17a8422c6..3f9a3671fc1 100755
--- a/scripts/in_container/run_provider_yaml_files_check.py
+++ b/scripts/in_container/run_provider_yaml_files_check.py
@@ -40,7 +40,7 @@ from jsonpath_ng.ext import parse
 from rich.console import Console
 from tabulate import tabulate
 
-from airflow.cli.commands.local_commands.info_command import Architecture
+from airflow.cli.commands.info_command import Architecture
 from airflow.exceptions import AirflowProviderDeprecationWarning
 from airflow.providers_manager import ProvidersManager