use super::parse::CliArgs;
use claude_runner_core::{ ClaudeCommand, EffortLevel };
fn session_exists
(
session_dir : Option< &std::path::Path >,
effective_dir : Option< &std::path::Path >,
) -> bool
{
if let Some( dir ) = session_dir
{
std::fs::read_dir( dir ).is_ok_and( | mut entries | entries.next().is_some() )
}
else
{
let cwd = effective_dir.map_or_else(
|| std::env::current_dir().unwrap_or_else( | _ | std::path::PathBuf::from( "." ) ),
std::path::Path::to_path_buf,
);
claude_storage_core::continuation::check_continuation( &cwd )
}
}
fn resolve_effective_dir( cli : &CliArgs ) -> Option< std::path::PathBuf >
{
let base_dir = cli.dir.as_deref().map( std::path::PathBuf::from );
match cli.subdir.as_deref()
{
Some( sub ) if sub != "." && !sub.is_empty() =>
{
let base = base_dir.unwrap_or_else( ||
std::env::current_dir().unwrap_or_else( | _ | std::path::PathBuf::from( "." ) )
);
let effective = base.join( format!( "-{sub}" ) );
if !cli.dry_run
{
let _ = std::fs::create_dir_all( &effective );
}
Some( effective )
}
_ => base_dir,
}
}
pub( crate ) fn build_claude_command( cli : &CliArgs ) -> ClaudeCommand
{
let mut builder = ClaudeCommand::new();
let effective_working_dir = resolve_effective_dir( cli );
if let Some( ref dir ) = effective_working_dir
{
builder = builder.with_working_directory( dir.to_string_lossy().into_owned() );
}
if let Some( n ) = cli.max_tokens
{
builder = builder.with_max_output_tokens( n );
}
if !cli.new_session && session_exists(
cli.session_dir.as_deref().map( std::path::Path::new ),
effective_working_dir.as_deref(),
)
{
builder = builder.with_continue_conversation( true );
}
if !cli.no_skip_permissions
{
builder = builder.with_skip_permissions( true );
}
if !cli.no_effort_max
{
builder = builder.with_effort(
cli.effort.unwrap_or( EffortLevel::Max )
);
}
if cli.no_chrome
{
builder = builder.with_chrome( None );
}
if cli.no_persist
{
builder = builder.with_no_session_persistence( true );
}
if let Some( ref schema ) = cli.json_schema
{
builder = builder.with_json_schema( schema.as_str() );
}
if !cli.mcp_config.is_empty()
{
builder = builder.with_mcp_config( cli.mcp_config.iter().map( String::as_str ) );
}
if let Some( ref path ) = cli.file
{
builder = builder.with_stdin_file( std::path::PathBuf::from( path ) );
}
if cli.keep_claudecode
{
builder = builder.with_unset_claudecode( false );
}
if cli.verbose
{
builder = builder.with_verbose( true );
}
if let Some( ref model ) = cli.model
{
builder = builder.with_model( model.clone() );
}
if let Some( ref sd ) = cli.session_dir
{
builder = builder.with_session_dir( sd.clone() );
}
if let Some( ref sp ) = cli.system_prompt
{
builder = builder.with_system_prompt( sp.clone() );
}
if let Some( ref asp ) = cli.append_system_prompt
{
builder = builder.with_append_system_prompt( asp.clone() );
}
let use_print = cli.print_mode || ( cli.message.is_some() && !cli.interactive );
if use_print
{
builder = builder.with_arg( "--print" );
}
if let Some( ref msg ) = cli.message
{
let effective_msg = if cli.no_ultrathink || msg.trim_end().ends_with( "ultrathink" )
{
msg.clone()
}
else
{
format!( "{msg}\n\nultrathink" )
};
builder = builder.with_message( effective_msg );
}
builder
}