clawgarden-agent 0.11.1

Agent runtime with persona/memory loader, judge, and pi RPC for ClawGarden
Documentation
//! Role loader - loads agent role definition from filesystem

use anyhow::Result;
use std::path::Path;

/// Load role for an agent from <workspace>/agents/<name>/role.md
///
/// Returns the role content as a String.
/// Logs a warning if the file is missing and returns an empty string.
pub async fn load_role(agent_name: &str) -> Result<String> {
    let config = clawgarden_proto::AppConfig::load();
    let path = Path::new(&config.agents_dir())
        .join(agent_name)
        .join("role.md");

    match tokio::fs::read_to_string(&path).await {
        Ok(content) => {
            log::info!(
                "Loaded role for agent '{}' from {}",
                agent_name,
                path.display()
            );
            Ok(content)
        }
        Err(e) => {
            log::warn!(
                "Role file not found for agent '{}' at {}: {}",
                agent_name,
                path.display(),
                e
            );
            Ok(String::new())
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    async fn test_load_role_missing_file() {
        let result = load_role("nonexistent_agent").await;
        assert!(result.is_ok());
        assert!(result.unwrap().is_empty());
    }
}