Skip to main content

apm/cmd/
start.rs

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) -> Result<Option<(String, Option<String>, std::process::Child, std::path::PathBuf)>> {
41    let mut messages = Vec::new();
42    let mut warnings = Vec::new();
43    let result = apm_core::start::spawn_next_worker(root, no_aggressive, skip_permissions, epic_filter, blocked_epics, &mut messages, &mut warnings)?;
44    for w in &warnings {
45        eprintln!("{w}");
46    }
47    for msg in &messages {
48        println!("{msg}");
49    }
50    Ok(result)
51}