ralph_workflow/app/runner/pipeline_execution/entry_points/
main.rs1pub fn run(args: Args, executor: std::sync::Arc<dyn ProcessExecutor>) -> anyhow::Result<()> {
34 let colors = Colors::new();
35 let logger = Logger::new(colors);
36
37 if let Some(ref override_dir) = args.working_dir_override {
40 std::env::set_current_dir(override_dir)?;
41 }
42
43 let Some(init_result) = initialize_config(&args, colors, &logger)? else {
45 return Ok(()); };
47
48 let config_init::ConfigInitResult {
49 config,
50 registry,
51 config_path,
52 config_sources,
53 agent_resolution_sources,
54 } = init_result;
55
56 let validated = resolve_required_agents(&config, &agent_resolution_sources)?;
58 let developer_agent = validated.developer_agent;
59 let reviewer_agent = validated.reviewer_agent;
60
61 if handle_listing_commands(&args, ®istry, colors) {
63 return Ok(());
64 }
65
66 if args.recovery.diagnose {
68 let diagnose_workspace = crate::workspace::WorkspaceFs::new(
69 std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from(".")),
70 );
71 handle_diagnose(
72 colors,
73 &config,
74 ®istry,
75 &config_path,
76 &config_sources,
77 &*executor,
78 &diagnose_workspace,
79 );
80 return Ok(());
81 }
82
83 validate_agent_chains(®istry, &agent_resolution_sources, colors);
85
86 let mut handler = effect_handler::RealAppEffectHandler::new();
88
89 let early_repo_root =
92 discover_repo_root_for_workspace(args.working_dir_override.as_deref(), &mut handler)?;
93
94 let workspace: std::sync::Arc<dyn crate::workspace::Workspace> =
96 std::sync::Arc::new(crate::workspace::WorkspaceFs::new(early_repo_root));
97
98 if handle_plumbing_commands(
100 &args,
101 &logger,
102 colors,
103 &mut handler,
104 Some(workspace.as_ref()),
105 )? {
106 return Ok(());
107 }
108
109 if !command_requires_prompt_setup(&args)
110 && handle_repo_commands_without_prompt_setup(RepoCommandParams {
111 args: &args,
112 config: &config,
113 registry: ®istry,
114 developer_agent: &developer_agent,
115 reviewer_agent: &reviewer_agent,
116 logger: &logger,
117 colors,
118 executor: &executor,
119 repo_root: workspace.root(),
120 workspace: &workspace,
121 })?
122 {
123 return Ok(());
124 }
125
126 if args.recovery.inspect_checkpoint {
127 crate::app::resume::inspect_checkpoint(workspace.as_ref(), &logger)?;
128 return Ok(());
129 }
130
131 let Some(repo_root) = validate_and_setup_agents(
135 &AgentSetupParams {
136 config: &config,
137 registry: ®istry,
138 developer_agent: &developer_agent,
139 reviewer_agent: &reviewer_agent,
140 config_path: &config_path,
141 colors,
142 logger: &logger,
143 working_dir_override: args.working_dir_override.as_deref(),
144 },
145 &mut handler,
146 )?
147 else {
148 return Ok(());
149 };
150
151 (prepare_pipeline_or_exit(PipelinePreparationParams {
154 args,
155 config,
156 registry,
157 developer_agent,
158 reviewer_agent,
159 repo_root,
160 logger,
161 colors,
162 executor,
163 handler: &mut handler,
164 workspace,
165 })?)
166 .map_or_else(|| Ok(()), |ctx| run_pipeline(&ctx))
167}