1use anyhow::Result;
2use std::path::Path;
3
4pub fn run(root: &Path, id_arg: &str, no_aggressive: bool, spawn: bool, skip_permissions: bool, agent_name: &str) -> Result<()> {
5 let out = apm_core::start::run(root, id_arg, no_aggressive, spawn, skip_permissions, agent_name)?;
6 for w in &out.warnings {
7 eprintln!("{w}");
8 }
9 if let Some(ref msg) = out.merge_message {
10 println!("{msg}");
11 }
12 println!("{}: {} → {} (agent: {}, branch: {})", out.id, out.old_state, out.new_state, out.agent_name, out.branch);
13 println!("Worktree: {}", out.worktree_path.display());
14 if let (Some(pid), Some(ref log)) = (out.worker_pid, out.log_path.as_ref()) {
15 println!("Worker spawned: PID={pid}, log={}", log.display());
16 }
17 if let Some(ref wn) = out.worker_name {
18 println!("Agent name: {wn}");
19 }
20 Ok(())
21}
22
23pub fn run_next(root: &Path, no_aggressive: bool, spawn: bool, skip_permissions: bool) -> Result<()> {
24 let out = apm_core::start::run_next(root, no_aggressive, spawn, skip_permissions)?;
25 for w in &out.warnings {
26 eprintln!("{w}");
27 }
28 for msg in &out.messages {
29 println!("{msg}");
30 }
31 Ok(())
32}
33
34pub fn spawn_next_worker(
35 root: &Path,
36 no_aggressive: bool,
37 skip_permissions: bool,
38 epic_filter: Option<&str>,
39 blocked_epics: &[String],
40 default_blocked: bool,
41) -> Result<Option<(String, Option<String>, apm_core::start::ManagedChild, std::path::PathBuf)>> {
42 let mut messages = Vec::new();
43 let mut warnings = Vec::new();
44 let result = apm_core::start::spawn_next_worker(root, no_aggressive, skip_permissions, epic_filter, blocked_epics, default_blocked, &mut messages, &mut warnings)?;
45 for w in &warnings {
46 eprintln!("{w}");
47 }
48 for msg in &messages {
49 println!("{msg}");
50 }
51 Ok(result)
52}