use std::{
fs,
path::{Path, PathBuf},
process::ExitCode,
};
use anyhow::Result;
use crate::cli::{SkillsArgs, SkillsCommand};
pub const SKILL_DOC: &str = include_str!("../assets/SKILL.md");
const SKILL_DIR_NAME: &str = "truth-mirror";
const SKILL_FILE_NAME: &str = "SKILL.md";
pub fn run(args: SkillsArgs) -> Result<ExitCode> {
match args.command {
SkillsCommand::Echo => {
print!("{SKILL_DOC}");
Ok(ExitCode::SUCCESS)
}
SkillsCommand::Install { dir, force } => {
let base_dir = dir.unwrap_or_else(default_dir);
install(&base_dir, force)
}
}
}
fn default_dir() -> PathBuf {
PathBuf::from(".agents/skills")
}
fn install(base_dir: &Path, force: bool) -> Result<ExitCode> {
let skill_dir = base_dir.join(SKILL_DIR_NAME);
let target = skill_dir.join(SKILL_FILE_NAME);
if target.exists() && !force {
eprintln!(
"error: refusing to overwrite existing file: {} (pass --force to overwrite)",
target.display()
);
return Ok(ExitCode::from(1));
}
fs::create_dir_all(&skill_dir)?;
fs::write(&target, SKILL_DOC)?;
println!("{}", target.display());
Ok(ExitCode::SUCCESS)
}