agent-sync 0.6.0

Safely synchronize coding-agent sessions and memories over SSH
use assert_cmd::Command;
use predicates::prelude::*;
use serde_json::Value;

#[test]
fn lists_built_in_adapters() {
    Command::cargo_bin("agent-sync")
        .unwrap()
        .arg("adapters")
        .assert()
        .success()
        .stdout(predicate::str::contains("codex"))
        .stdout(predicate::str::contains("claude"))
        .stdout(predicate::str::contains("opencode"));
}

#[test]
fn sync_requires_known_agent() {
    Command::cargo_bin("agent-sync")
        .unwrap()
        .args(["sync", "unknown", "mini"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("unknown agent \"unknown\""));
}

#[test]
fn yes_requires_apply() {
    Command::cargo_bin("agent-sync")
        .unwrap()
        .args(["sync", "codex", "mini", "--yes"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("--apply"));
}

#[test]
fn import_force_requires_apply() {
    Command::cargo_bin("agent-sync")
        .unwrap()
        .args(["import", "codex", "archive.tar.gz", "--force"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("--apply"));
}

#[test]
fn help_documents_read_only_default() {
    Command::cargo_bin("agent-sync")
        .unwrap()
        .args(["sync", "--help"])
        .assert()
        .success()
        .stdout(predicate::str::contains(
            "Without this flag the command is read-only",
        ));
}

#[test]
fn remote_helper_negotiates_the_typed_protocol() {
    let output = Command::cargo_bin("agent-sync")
        .unwrap()
        .args(["__remote", "--protocol", "3"])
        .write_stdin("{\"op\":\"ping\"}\n")
        .output()
        .unwrap();
    assert!(output.status.success());
    let response: Value = serde_json::from_slice(&output.stdout).unwrap();
    assert_eq!(response["protocol"], 3);
    assert_eq!(response["ok"], true);
    assert_eq!(response["value"]["protocol"], 3);
    assert!(response["value"]["executable_sha256"].as_str().is_some());
}