fur-cli 1.9.0

Turn your AI chats into a durable, local-first diary. Save messages, attach notes, organize conversations, and stop losing context every time the model forgets you exist.
Documentation
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::tempdir;

// Helper: bootstrap a `.fur` directory in a temp folder
fn setup_fur(tmp: &std::path::Path) {
    let fur_dir = tmp.join(".fur");
    fs::create_dir_all(&fur_dir).unwrap();
    fs::write(
        fur_dir.join("avatars.json"),
        r#"{
        "main": "andrew",
        "andrew": "🦊",
        "ai": "🤖"
    }"#,
    )
    .unwrap();
    fs::write(
        fur_dir.join("index.json"),
        r#"{
        "threads": [],
        "active_thread": null,
        "current_message": null,
        "schema_version": "0.2"
    }"#,
    )
    .unwrap();
}

#[test]
fn avatar_view_lists_main_and_secondary() {
    let tmp = tempdir().unwrap();
    std::env::set_current_dir(&tmp).unwrap();
    setup_fur(tmp.path());

    // Run `fur avatar --view` (same as `fur avatar`)
    Command::cargo_bin("fur")
        .unwrap()
        .args(&["avatar", "--view"])
        .assert()
        .success()
        .stdout(predicate::str::contains("Avatars")) // sleek header
        .stdout(predicate::str::contains("⭐ main"))
        .stdout(predicate::str::contains("ai"))
        .stdout(predicate::str::contains("andrew"));
}