55import logging
66import os
77import sys
8+ from importlib .metadata import PackageNotFoundError
9+ from importlib .metadata import version as _get_version
810from typing import Any
911
1012import click
1113
12- from apcore_cli import __version__
1314from apcore_cli .cli import GroupedModuleGroup , set_audit_logger , set_verbose_help
1415from apcore_cli .config import ConfigResolver
1516from apcore_cli .discovery import register_discovery_commands
1617from apcore_cli .security .audit import AuditLogger
1718from apcore_cli .shell import configure_man_help , register_shell_commands
1819
20+ try :
21+ __version__ = _get_version ("apcore-cli" )
22+ except PackageNotFoundError :
23+ __version__ = "unknown"
24+
1925logger = logging .getLogger ("apcore_cli" )
2026
2127EXIT_CONFIG_NOT_FOUND = 47
@@ -64,6 +70,7 @@ def create_cli(
6470 binding_path : str | None = None ,
6571 registry : Any | None = None ,
6672 executor : Any | None = None ,
73+ extra_commands : list [Any ] | None = None ,
6774) -> click .Group :
6875 """Create the CLI application.
6976
@@ -223,6 +230,22 @@ def create_cli(
223230 except Exception as e :
224231 logger .warning ("Failed to initialize audit logger: %s" , e )
225232
233+ # Wire CliApprovalHandler to Executor (FE-11 §3.5)
234+ try :
235+ import contextlib
236+
237+ from apcore_cli .approval import CliApprovalHandler
238+
239+ approval_timeout = 60
240+ with contextlib .suppress (TypeError , ValueError ):
241+ approval_timeout = int (config .resolve ("cli.approval_timeout" , env_var = "APCORE_CLI_APPROVAL_TIMEOUT" ) or 60 )
242+ handler = CliApprovalHandler (auto_approve = False , timeout = approval_timeout )
243+ if hasattr (executor , "set_approval_handler" ):
244+ executor .set_approval_handler (handler )
245+ logger .debug ("CliApprovalHandler wired to Executor (timeout=%ds)." , approval_timeout )
246+ except Exception as e :
247+ logger .debug ("Could not wire CliApprovalHandler: %s" , e )
248+
226249 @click .group (
227250 cls = GroupedModuleGroup ,
228251 registry = registry ,
@@ -286,9 +309,24 @@ def cli(
286309 ctx .obj ["extensions_dir" ] = ext_dir
287310 ctx .obj ["verbose_help" ] = verbose_help
288311
289- # Register discovery commands
312+ # Register discovery commands (list, describe)
290313 register_discovery_commands (cli , registry )
291314
315+ # Register validate command (FE-11 §3.1)
316+ from apcore_cli .discovery import register_validate_command
317+
318+ register_validate_command (cli , registry , executor )
319+
320+ # Register system management commands (FE-11 §3.2) — no-op if system modules unavailable
321+ from apcore_cli .system_cmd import register_system_commands
322+
323+ register_system_commands (cli , executor )
324+
325+ # Register pipeline introspection command (FE-11 §3.8)
326+ from apcore_cli .strategy import register_pipeline_command
327+
328+ register_pipeline_command (cli , executor )
329+
292330 # Register shell integration commands
293331 register_shell_commands (cli , prog_name = prog_name )
294332
@@ -300,6 +338,17 @@ def cli(
300338
301339 register_init_command (cli )
302340
341+ # Register extra commands from downstream projects (FE-11 §3.11)
342+ if extra_commands :
343+ from apcore_cli .cli import BUILTIN_COMMANDS
344+
345+ for cmd in extra_commands :
346+ cmd_name = getattr (cmd , "name" , None )
347+ if cmd_name and cmd_name in BUILTIN_COMMANDS :
348+ msg = f"Extra command '{ cmd_name } ' conflicts with built-in command."
349+ raise ValueError (msg )
350+ cli .add_command (cmd )
351+
303352 return cli
304353
305354
0 commit comments