From a2a3edcbbde3e71a458309d60dc69a503dcf33b7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 21 Aug 2026 10:16:44 +0900 Subject: [PATCH] fix: pass explicit argv to CLI entrypoint --- contextual_orchestrator/__main__.py | 15 ++++++++------- tests/test_cli_auth.py | 10 ++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/contextual_orchestrator/__main__.py b/contextual_orchestrator/__main__.py index 622d2642c..f2d357a42 100644 --- a/contextual_orchestrator/__main__.py +++ b/contextual_orchestrator/__main__.py @@ -249,15 +249,16 @@ def _discover_models_command(argv: list[str]) -> None: raise SystemExit(1) -def main() -> None: +def main(argv: list[str] | None = None) -> None: """Parse CLI options and run bootstrap, prompt completion, or the HTTP server.""" - if len(sys.argv) > 1 and sys.argv[1] == "register-credential": - _register_credential_command(sys.argv[2:]) + arguments = list(sys.argv[1:] if argv is None else argv) + if arguments and arguments[0] == "register-credential": + _register_credential_command(arguments[1:]) return - if len(sys.argv) > 1 and sys.argv[1] == "discover-models": - _discover_models_command(sys.argv[2:]) + if arguments and arguments[0] == "discover-models": + _discover_models_command(arguments[1:]) return - if len(sys.argv) > 1 and sys.argv[1] == "check-fast-mlsirm": + if arguments and arguments[0] == "check-fast-mlsirm": _check_fast_mlsirm_command() return @@ -318,7 +319,7 @@ def main() -> None: help="Seconds to cache identical requests (default 0 = disabled).") parser.add_argument("--eval", nargs="+", metavar="PROMPT", help="Measure orchestration vs a single-worker baseline on these prompts and print the report.") - args = parser.parse_args() + args = parser.parse_args(arguments) client = ModelClient( ca_bundle=args.provider_ca_bundle, diff --git a/tests/test_cli_auth.py b/tests/test_cli_auth.py index b89d47748..0ff86ee15 100644 --- a/tests/test_cli_auth.py +++ b/tests/test_cli_auth.py @@ -81,6 +81,16 @@ def test_key_only_split_tokens_select_split_mode() -> None: set_backend(None) +def test_main_accepts_explicit_argv_without_mutating_process_arguments() -> None: + original_argv = sys.argv[:] + with patch("contextual_orchestrator.__main__.serve") as serve: + main(["--serve", "--auth-token", "argv-token"]) + + assert sys.argv == original_argv + security = serve.call_args.kwargs["security"] + assert security.auth_token == "argv-token" + + def test_invalid_local_provider_options_fail_at_parser_boundary() -> None: invalid_options = ( (["--local-concurrency", "0"], "positive integer"),