claudy 0.2.0

Modern multi-provider launcher for Claude CLI
use std::io::Write;
use std::path::Path;

pub fn write_atomic(path: &str, data: &[u8], mode: u32) -> anyhow::Result<()> {
    let target = Path::new(path);
    let parent = target
        .parent()
        .ok_or_else(|| anyhow::anyhow!("path has no parent directory: {path}"))?;
    std::fs::create_dir_all(parent)?;

    let mut tmp = tempfile::NamedTempFile::new_in(parent)?;
    tmp.write_all(data)?;

    #[cfg(unix)]
    {
        use std::os::unix::fs::PermissionsExt;
        tmp.as_file_mut()
            .set_permissions(std::fs::Permissions::from_mode(mode))?;
    }

    tmp.persist(target)?;
    Ok(())
}