truth-mirror 0.3.0

Truthfulness gate and adversarial reviewer harness for AI coding agents.
Documentation
//! Embedded skill document: print (`echo`) or install it into a skills directory.

use std::{
    fs,
    path::{Path, PathBuf},
    process::ExitCode,
};

use anyhow::Result;

use crate::cli::{SkillsArgs, SkillsCommand};

/// The embedded `truth-mirror` skill document.
pub const SKILL_DOC: &str = include_str!("../assets/SKILL.md");

/// Directory name the skill is written under inside `--dir`.
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)
        }
    }
}

/// Default install target: `.agents/skills` relative to the current directory.
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)
}