Appearance
CLI 调度器 — 概念
参数解析
CLI 使用 clap crate(cli/src/main.rs,约 3773 行)解析命令行参数,MultitoolCli 是顶层 Parser:
MultitoolCli 的顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
config_overrides | CliConfigOverrides | --model、--sandbox 等配置覆盖 |
feature_toggles | FeatureToggles | --enable/--disable 特性开关 |
remote | InteractiveRemoteOptions | 远程连接参数 |
interactive | TuiCli | 交互模式专属参数 |
subcommand | Option<Subcommand> | 子命令(None = 交互模式) |
模式调度
CLI 是 Codex 的统一入口,根据子命令将执行分发到不同模式:
调度逻辑的核心代码结构:
rust
fn cli_main(cli: MultitoolCli, paths: Arg0DispatchPaths) -> Result<()> {
let config_overrides = cli.fold_config_overrides();
match cli.subcommand {
Some(Subcommand::Exec(args)) => exec::run_main(args, paths),
Some(Subcommand::AppServer(args)) => app_server::run_main(args, paths),
Some(Subcommand::Login) => login_flow(),
Some(Subcommand::Review(args)) => review_flow(args),
// ... 25+ 子命令
None => run_interactive_tui(cli), // 默认:交互式 TUI
}
}子命令管理
Subcommand 枚举定义了 25+ 个子命令,按功能分组:
| 功能组 | 子命令 | 说明 |
|---|---|---|
| 执行 | Exec | 非交互执行(CI/CD) |
| 审查 | Review | 代码审查模式 |
| 认证 | Login, Logout | 登录/登出 |
| MCP | Mcp, McpServer, Plugin | MCP 和插件管理 |
| 服务器 | AppServer, ExecServer(隐藏) | 后台服务 |
| 会话 | Resume, Archive, Unarchive, Fork | 会话生命周期 |
| 诊断 | Doctor, Debug, Sandbox | 系统诊断 |
| 工具 | Apply, Execpolicy | 补丁应用、策略查看 |
| 平台 | App(隐藏, macOS/Windows), RemoteControl | 平台集成 |
| 配置 | Completion, Update, Features(隐藏), Cloud | Shell 补全、更新、特性 |
特殊的 arg0_dispatch 机制:
rust
fn main() -> Result<()> {
// 根据 argv[0] 分发:
// - "codex" -> cli_main()
// - "codex-tui" -> tui::run_main()
// - "codex-exec" -> exec::run_main()
// - "codex-linux-sandbox" -> linux_sandbox::run_main()
arg0_dispatch_or_else(cli, cli_main)
}这种设计允许通过符号链接创建不同的入口点,直接跳过子命令解析。
配置集成
CLI 参数与配置系统的集成方式:
配置优先级:CLI 覆盖 > Cloud 配置 > 项目 config.toml > 全局 config.toml > 默认值
CliConfigOverrides 通过 fold_config_overrides() 合并 --enable/--disable 开关到配置覆盖中,统一传递给配置加载器。
相关概念
- Cargo Workspace — CLI 在 workspace 中的位置
- Config.toml — CLI 参数覆盖配置文件
- ExecPolicy —
execpolicy子命令查看策略 - App Server Protocol — CLI 通过协议与核心通信