use crate::app::config_init::{self, initialize_config};
use crate::app::runner::command_handlers::handle_listing_commands;
use crate::app::validation::{resolve_required_agents, validate_agent_chains};
use crate::cli::{handle_diagnose, Args};
use crate::logger::{Colors, Logger};
use crate::prompts::TemplateContext;
use crate::ProcessExecutor;
use crate::app::pipeline_setup::{PipelineAndRepoRoot, RunPipelineWithHandlerParams};
pub fn run(args: Args, executor: std::sync::Arc<dyn ProcessExecutor>) -> anyhow::Result<()> {
let colors = Colors::new();
let logger = Logger::new(colors);
if let Some(ref override_dir) = args.working_dir_override {
crate::app::env_access::set_current_dir(override_dir)?;
}
let Some(init_result) = initialize_config(&args, colors, &logger)? else {
return Ok(()); };
let config_init::ConfigInitResult {
config,
registry,
config_path,
config_sources,
agent_resolution_sources,
} = init_result;
let validated = resolve_required_agents(&config, &agent_resolution_sources)?;
let developer_agent = validated.developer_agent;
let reviewer_agent = validated.reviewer_agent;
if handle_listing_commands(&args, ®istry, colors) {
return Ok(());
}
if args.recovery.diagnose {
let diagnose_workspace =
crate::workspace::WorkspaceFs::new(crate::app::env_access::get_current_dir());
handle_diagnose(
&mut std::io::stdout(),
colors,
&config,
®istry,
crate::cli::ConfigInfo {
path: &config_path,
sources: &config_sources,
},
&*executor,
&diagnose_workspace,
);
return Ok(());
}
validate_agent_chains(®istry, &agent_resolution_sources, &logger);
let template_context = crate::prompts::TemplateContext::from_user_templates_dir(
config.user_templates_dir().cloned(),
);
let developer_display = registry.display_name(&developer_agent);
let reviewer_display = registry.display_name(&reviewer_agent);
let params = RunPipelineWithHandlerParams {
args,
config,
registry,
developer_agent,
reviewer_agent,
developer_display,
reviewer_display,
config_path,
colors,
logger,
executor,
template_context,
};
let PipelineAndRepoRoot { ctx, repo_root: _ } =
crate::app::pipeline_setup::run_pipeline_with_handler_boundary(params)?;
if ctx.args.recovery.inspect_checkpoint {
crate::app::resume::inspect_checkpoint(ctx.workspace.as_ref(), &ctx.logger)?;
return Ok(());
}
run_pipeline(&ctx)
}