use serde::Deserialize;
use std::path::Path;
use crate::paths::{agent_toml_path, agents_dir};
#[path = "claude_code/setup.rs"]
mod claude_code;
#[path = "codex/setup.rs"]
mod codex;
#[derive(Debug, Clone, Deserialize)]
pub struct AgentCommand {
pub command: String,
#[serde(default)]
pub args: Vec<String>,
#[serde(default)]
pub setup: Option<String>,
}
pub fn load_agent_command(name: &str) -> Option<AgentCommand> {
let text = std::fs::read_to_string(agent_toml_path(name)).ok()?;
toml::from_str(&text).ok()
}
const DEFAULT_AGENT_CONFIGS: &[(&str, &str)] = &[
(claude_code::NAME, claude_code::CONFIG),
(codex::NAME, codex::CONFIG),
];
pub fn ensure_default_agents() {
ensure_default_agents_in(&agents_dir());
}
pub(crate) fn ensure_default_agents_in(dir: &Path) {
if let Err(e) = std::fs::create_dir_all(dir) {
log::warn!("ensure_default_agents: failed to create {dir:?}: {e}");
return;
}
for (name, contents) in DEFAULT_AGENT_CONFIGS {
let path = dir.join(format!("{name}.toml"));
if path.exists() {
continue;
}
if let Err(e) = std::fs::write(&path, contents) {
log::warn!("ensure_default_agents: failed to write {path:?}: {e}");
}
}
}