Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 6 additions & 11 deletions codex-rs/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1477,7 +1477,7 @@ fn profile_v2_for_subcommand<'a>(
subcommand: DebugSubcommand::PromptInput(_),
}) => Ok(Some(profile_v2)),
_ => anyhow::bail!(
"--profile-v2 only applies to runtime commands: `codex`, `codex exec`, `codex review`, `codex resume`, `codex fork`, and `codex debug prompt-input`."
"--profile only applies to runtime commands: `codex`, `codex exec`, `codex review`, `codex resume`, `codex fork`, and `codex debug prompt-input`."
),
}
}
Expand Down Expand Up @@ -2286,21 +2286,19 @@ mod tests {

#[test]
fn profile_v2_is_rejected_for_config_management_subcommands() {
assert!(
profile_v2_for_args(&["codex", "--profile-v2", "work", "features", "list"]).is_err()
);
assert!(profile_v2_for_args(&["codex", "--profile", "work", "features", "list"]).is_err());
}

#[test]
fn profile_v2_is_allowed_for_runtime_subcommands() {
assert_eq!(
profile_v2_for_args(&["codex", "--profile-v2", "work", "resume"])
profile_v2_for_args(&["codex", "--profile", "work", "resume"])
.expect("resume supports profile-v2")
.as_deref(),
Some("work")
);
assert_eq!(
profile_v2_for_args(&["codex", "--profile-v2", "work", "debug", "prompt-input"])
profile_v2_for_args(&["codex", "--profile", "work", "debug", "prompt-input"])
.expect("debug prompt-input supports profile-v2")
.as_deref(),
Some("work")
Expand All @@ -2310,8 +2308,7 @@ mod tests {
#[test]
fn profile_v2_rejects_non_plain_names_at_parse_time() {
assert!(
MultitoolCli::try_parse_from(["codex", "--profile-v2", "nested/work", "resume"])
.is_err()
MultitoolCli::try_parse_from(["codex", "--profile", "nested/work", "resume"]).is_err()
);
}

Expand Down Expand Up @@ -2762,8 +2759,6 @@ mod tests {
"-m",
"gpt-5.1-test",
"-p",
"my-profile",
"--profile-v2",
"my-config",
"-C",
"/tmp",
Expand All @@ -2776,7 +2771,7 @@ mod tests {

assert_eq!(interactive.model.as_deref(), Some("gpt-5.1-test"));
assert!(interactive.oss);
assert_eq!(interactive.config_profile.as_deref(), Some("my-profile"));
assert_eq!(interactive.config_profile.as_deref(), None);
assert_eq!(interactive.config_profile_v2.as_deref(), Some("my-config"));
assert_matches!(
interactive.sandbox_mode,
Expand Down
10 changes: 5 additions & 5 deletions codex-rs/core/tests/suite/cli_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,9 @@ async fn exec_cli_applies_model_instructions_file() {
);
}

/// Verify that `codex exec --profile ...` preserves the active profile when it
/// starts the in-process app-server thread, so profile-scoped
/// `model_instructions_file` is applied to the outbound request.
/// Verify that `codex exec --profile ...` preserves the active user config
/// profile when it starts the in-process app-server thread, so the selected
/// profile's `model_instructions_file` reaches the outbound request.
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn exec_cli_profile_applies_model_instructions_file() {
skip_if_no_network!();
Expand All @@ -223,8 +223,8 @@ async fn exec_cli_profile_applies_model_instructions_file() {

let home = TempDir::new().unwrap();
std::fs::write(
home.path().join("config.toml"),
format!("[profiles.default]\nmodel_instructions_file = \"{custom_path_str}\"\n",),
home.path().join("default.config.toml"),
format!("model_instructions_file = \"{custom_path_str}\"\n"),
)
.unwrap();

Expand Down
2 changes: 1 addition & 1 deletion codex-rs/protocol/src/config_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ impl fmt::Display for ProfileV2NameParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"invalid --profile-v2 value `{}`; pass a plain name such as `work`",
"invalid --profile value `{}`; pass a plain name such as `work`",
self.value
)
}
Expand Down
4 changes: 2 additions & 2 deletions codex-rs/utils/cli/src/shared_options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ pub struct SharedCliOptions {
pub oss_provider: Option<String>,

/// Configuration profile from config.toml to specify default options.
#[arg(long = "profile", short = 'p')]
#[arg(skip)]
pub config_profile: Option<String>,

/// Layer $CODEX_HOME/<name>.config.toml on top of the base user config.
#[arg(long = "profile-v2")]
#[arg(long = "profile", short = 'p')]
Comment thread
jif-oai marked this conversation as resolved.
Comment thread
jif-oai marked this conversation as resolved.
pub config_profile_v2: Option<ProfileV2Name>,

/// Select the sandbox policy to use when executing model-generated shell
Expand Down
Loading