framewatch 0.6.0

Event-driven, change-triggered window capture that emits timestamped screenshots + metadata for AI agents.
use std::fs;
use std::path::Path;

#[test]
fn codex_skill_is_discoverable_and_matches_the_manifest() {
    let root = Path::new(env!("CARGO_MANIFEST_DIR"));
    let manifest: serde_json::Value = serde_json::from_str(
        &fs::read_to_string(root.join("dist/framewatch.json"))
            .expect("dist/framewatch.json should be packaged"),
    )
    .expect("dist/framewatch.json should be valid JSON");

    let skill_path = manifest["codex"]["skill"]
        .as_str()
        .expect("manifest should declare codex.skill");
    assert_eq!(skill_path, ".agents/skills/framewatch/SKILL.md");

    let skill = fs::read_to_string(root.join(skill_path))
        .expect("the declared repo-scoped Codex skill should exist");
    assert!(skill.starts_with("---\nname: framewatch\ndescription: "));
    assert!(!skill.contains("TODO"));
    assert!(skill.contains("framewatch shot"));
    assert!(skill.contains("framewatch watch"));
    assert!(skill.contains("Managed whisper.cpp"));

    let managed = &manifest["commands"]
        .as_array()
        .unwrap()
        .iter()
        .find(|command| command["name"] == "record")
        .unwrap()["managed_transcription"];
    assert_eq!(managed["engine"], "whisper.cpp");
    assert_eq!(managed["version"], "1.9.2");
    assert_eq!(managed["model"], "base.en");
    assert_eq!(managed["cache_override_env"], "FRAMEWATCH_WHISPER_DIR");

    let metadata = fs::read_to_string(root.join(".agents/skills/framewatch/agents/openai.yaml"))
        .expect("the Codex skill UI metadata should exist");
    assert!(metadata.contains("$framewatch"));

    let agents = fs::read_to_string(root.join("AGENTS.md"))
        .expect("repository-level Codex guidance should exist");
    assert!(agents.contains(".agents/skills/framewatch/"));
}