mirror of
https://github.com/openai/codex.git
synced 2026-09-14 11:57:03 +00:00
## 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
64 lines
1.8 KiB
Rust
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:#}"))
|
|
}
|