systemprompt-sync 0.1.22

Sync services for systemprompt.io - file, database, and crate deployment synchronization
Documentation
use super::escape_yaml;
use anyhow::Result;
use std::fs;
use std::path::Path;
use systemprompt_agent::models::Agent;

pub fn generate_agent_system_prompt(agent: &Agent) -> Option<String> {
    agent.system_prompt.as_ref().map(|sp| {
        format!(
            "---\ndescription: \"{}\"\n---\n\n{}",
            escape_yaml(&agent.description),
            sp
        )
    })
}

pub fn generate_agent_config(agent: &Agent) -> String {
    let tags_yaml = if agent.tags.is_empty() {
        "[]".to_string()
    } else {
        agent
            .tags
            .iter()
            .map(|t| format!("  - {}", t))
            .collect::<Vec<_>>()
            .join("\n")
    };

    let mcp_servers_yaml = if agent.mcp_servers.is_empty() {
        "[]".to_string()
    } else {
        agent
            .mcp_servers
            .iter()
            .map(|s| format!("  - {}", s))
            .collect::<Vec<_>>()
            .join("\n")
    };

    let skills_yaml = if agent.skills.is_empty() {
        "[]".to_string()
    } else {
        agent
            .skills
            .iter()
            .map(|s| format!("  - {}", s))
            .collect::<Vec<_>>()
            .join("\n")
    };

    format!(
        r#"id: {}
name: "{}"
display_name: "{}"
description: "{}"
version: "{}"
enabled: {}
port: {}
tags:
{}
mcp_servers:
{}
skills:
{}"#,
        agent.id.as_str(),
        escape_yaml(&agent.name),
        escape_yaml(&agent.display_name),
        escape_yaml(&agent.description),
        escape_yaml(&agent.version),
        agent.enabled,
        agent.port,
        tags_yaml,
        mcp_servers_yaml,
        skills_yaml
    )
}

pub fn export_agent_to_disk(agent: &Agent, base_path: &Path) -> Result<()> {
    let agent_dir = base_path.join(&agent.name);
    fs::create_dir_all(&agent_dir)?;

    let config_content = generate_agent_config(agent);
    fs::write(agent_dir.join("config.yaml"), config_content)?;

    if let Some(system_prompt) = generate_agent_system_prompt(agent) {
        fs::write(agent_dir.join("system_prompt.md"), system_prompt)?;
    }

    Ok(())
}