Files
codex/codex-rs/cli/src/queue_cmd.rs
Benjamin Carlsson eb5a00b068 Add managed worktrees to codex exec (#42652)
## What changed

- Add the experimental `worktrees` feature and a shared `--worktree` flag for new and forked `codex exec` sessions.
- Create each enabled session in a managed Git worktree, use that checkout as the session working directory, and bind the checkout to the new thread.
- Share the configured worktree pool with Desktop while leaving automatic cleanup disabled for CLI allocations.
- Reject unsupported commands, remote execution, ignored user configuration, ephemeral sessions, and use without the feature enabled before allocating a worktree.

## Testing

- Cover flag placement and inheritance, supported and rejected command combinations, worktree allocation and thread ownership, configuration gating, and compatibility with existing worktree-backed sessions.

GitOrigin-RevId: 011ff4639b09e8992c50d7b823df23e71798670e
2026-09-04 01:56:38 +00:00

64 lines
1.8 KiB
Rust

use clap::Parser;
use clap::builder::NonEmptyStringValueParser;
use codex_arg0::Arg0DispatchPaths;
use codex_tui::Cli as TuiCli;
use codex_utils_cli::CliConfigOverrides;
use crate::InteractiveRemoteOptions;
use crate::SessionArchiveConfigOverrides;
use crate::finalize_session_archive_interactive;
use crate::resolve_remote_endpoint;
#[derive(Debug, Parser)]
pub(crate) struct QueueCommand {
/// Session UUID or exact session name.
#[arg(long, value_name = "THREAD")]
thread: String,
/// Message text to queue.
#[arg(long, value_name = "TEXT", value_parser = NonEmptyStringValueParser::new())]
message: String,
#[clap(flatten)]
remote: InteractiveRemoteOptions,
#[clap(flatten)]
pub(crate) config_overrides: SessionArchiveConfigOverrides,
}
pub(crate) async fn run_queue_command(
command: QueueCommand,
interactive: TuiCli,
root_config_overrides: CliConfigOverrides,
root_remote: Option<String>,
root_remote_auth_token_env: Option<String>,
arg0_paths: Arg0DispatchPaths,
) -> anyhow::Result<String> {
let QueueCommand {
thread,
message,
remote,
config_overrides,
} = command;
let cli =
finalize_session_archive_interactive(interactive, root_config_overrides, config_overrides);
if !cli.images.is_empty() {
anyhow::bail!("`codex queue` does not support image attachments");
}
let explicit_remote_endpoint = resolve_remote_endpoint(
remote.remote.or(root_remote),
remote.remote_auth_token_env.or(root_remote_auth_token_env),
)?;
codex_tui::run_session_queue_command(
thread,
message,
codex_tui::SessionArchiveCommandOptions {
cli,
arg0_paths,
explicit_remote_endpoint,
},
)
.await
.map_err(|error| anyhow::anyhow!("{error:#}"))
}