apm-cli 0.1.9

CLI project manager for running AI coding agents in parallel, isolated by design.
Documentation
use anyhow::Result;
use std::path::Path;

pub fn run(root: &Path, id_arg: &str, no_aggressive: bool, spawn: bool, skip_permissions: bool, agent_name: &str) -> Result<()> {
    let out = apm_core::start::run(root, id_arg, no_aggressive, spawn, skip_permissions, agent_name)?;
    for w in &out.warnings {
        eprintln!("{w}");
    }
    if let Some(ref msg) = out.merge_message {
        println!("{msg}");
    }
    println!("{}: {}{} (agent: {}, branch: {})", out.id, out.old_state, out.new_state, out.agent_name, out.branch);
    println!("Worktree: {}", out.worktree_path.display());
    if let (Some(pid), Some(ref log)) = (out.worker_pid, out.log_path.as_ref()) {
        println!("Worker spawned: PID={pid}, log={}", log.display());
    }
    if let Some(ref wn) = out.worker_name {
        println!("Agent name: {wn}");
    }
    Ok(())
}

pub fn run_next(root: &Path, no_aggressive: bool, spawn: bool, skip_permissions: bool) -> Result<()> {
    let out = apm_core::start::run_next(root, no_aggressive, spawn, skip_permissions)?;
    for w in &out.warnings {
        eprintln!("{w}");
    }
    for msg in &out.messages {
        println!("{msg}");
    }
    Ok(())
}

pub fn spawn_next_worker(
    root: &Path,
    no_aggressive: bool,
    skip_permissions: bool,
    epic_filter: Option<&str>,
    blocked_epics: &[String],
) -> Result<Option<(String, Option<String>, std::process::Child, std::path::PathBuf)>> {
    let mut messages = Vec::new();
    let mut warnings = Vec::new();
    let result = apm_core::start::spawn_next_worker(root, no_aggressive, skip_permissions, epic_filter, blocked_epics, &mut messages, &mut warnings)?;
    for w in &warnings {
        eprintln!("{w}");
    }
    for msg in &messages {
        println!("{msg}");
    }
    Ok(result)
}