synaps 0.1.0

Terminal-native AI agent runtime — parallel orchestration, reactive subagents, MCP, autonomous supervision
#[test]
fn plugin_builder_extension_contract_matches_synaps_contract() {
    let synaps = std::fs::read_to_string("docs/extensions/contract.json")
        .expect("Synaps extension contract should exist");
    let manifest_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR"));
    let worktrees_dir = manifest_dir
        .parent()
        .expect("SynapsCLI should live under a parent directory");
    let monorepo_dir = worktrees_dir
        .parent()
        .expect("worktree parent should have a parent directory");

    let candidates = [
        worktrees_dir.join("synaps-skills-skill-extension-builder/plugin-builder-plugin/contracts/extensions.json"),
        worktrees_dir.join("synaps-skills/plugin-builder-plugin/contracts/extensions.json"),
        monorepo_dir.join("synaps-skills/plugin-builder-plugin/contracts/extensions.json"),
    ];
    let plugin_builder_contract = candidates
        .iter()
        .find(|path| path.exists())
        .unwrap_or_else(|| {
            panic!(
                "plugin-builder extension contract should exist at one of: {}",
                candidates
                    .iter()
                    .map(|path| path.display().to_string())
                    .collect::<Vec<_>>()
                    .join(", ")
            )
        });

    let builder = std::fs::read_to_string(plugin_builder_contract).unwrap_or_else(|err| {
        panic!(
            "failed to read plugin-builder extension contract at {}: {}",
            plugin_builder_contract.display(),
            err
        )
    });

    let synaps_json: serde_json::Value = serde_json::from_str(&synaps).unwrap();
    let builder_json: serde_json::Value = serde_json::from_str(&builder).unwrap();
    assert_eq!(builder_json, synaps_json);
}