magi-code 0.63.1

Repository-aware CLI coding agent for terminal work
Documentation
use std::path::{Path, PathBuf};

pub(super) fn resolve_child_cwd(
    parent_cwd: &Path,
    child_cwd: Option<&Path>,
    allow_absolute_paths: bool,
) -> anyhow::Result<PathBuf> {
    let parent_canonical = parent_cwd.canonicalize()?;
    if !parent_canonical.is_dir() {
        anyhow::bail!(
            "parent cwd is not a directory: {}",
            parent_canonical.display()
        );
    }
    let child_is_absolute = child_cwd.is_some_and(Path::is_absolute);
    let cwd = match child_cwd {
        Some(path) if path.is_absolute() => path.to_path_buf(),
        Some(path) => parent_canonical.join(path),
        None => parent_canonical.clone(),
    };
    let canonical = cwd.canonicalize()?;
    if !canonical.is_dir() {
        anyhow::bail!("subagent cwd is not a directory: {}", canonical.display());
    }
    if (!child_is_absolute || !allow_absolute_paths) && !canonical.starts_with(&parent_canonical) {
        anyhow::bail!(
            "subagent cwd '{}' escapes parent cwd '{}' (tools.subagents.absolute_paths is false)",
            canonical.display(),
            parent_canonical.display()
        );
    }
    Ok(canonical)
}