patina-ai 0.23.0

Context orchestration for AI development - captures and evolves patterns over time
Documentation
use anyhow::Result;
use std::fs;
use std::path::Path;

pub fn execute(fixture: Option<&str>) -> Result<()> {
    println!("๐Ÿงช Updating test fixtures...");
    println!();

    let fixtures = match fixture {
        Some(name) => vec![name],
        None => vec![
            "project_design",
            "environment",
            "claude_context",
            "version_manifest",
        ],
    };

    for fixture_name in fixtures {
        update_fixture(fixture_name)?;
    }

    println!();
    println!("โœ… Fixtures updated!");
    println!();
    println!("Next steps:");
    println!("1. Run tests: cargo test");
    println!("2. Verify fixtures are correct");
    println!("3. Commit if satisfied");

    Ok(())
}

fn update_fixture(name: &str) -> Result<()> {
    println!("๐Ÿ“„ Updating {} fixture...", name);

    match name {
        "project_design" => update_project_design_fixture()?,
        "environment" => update_environment_fixture()?,
        "claude_context" => update_claude_context_fixture()?,
        "version_manifest" => update_version_manifest_fixture()?,
        _ => {
            println!("   โŒ Unknown fixture: {}", name);
        }
    }

    Ok(())
}

fn update_project_design_fixture() -> Result<()> {
    let fixture_path = "tests/fixtures/PROJECT_DESIGN.toml";

    // Create fixtures directory if it doesn't exist
    fs::create_dir_all("tests/fixtures")?;

    // Use the actual PROJECT_DESIGN.toml as the fixture
    if Path::new("PROJECT_DESIGN.toml").exists() {
        let content = fs::read_to_string("PROJECT_DESIGN.toml")?;
        fs::write(fixture_path, content)?;
        println!("   โœ“ Updated from current PROJECT_DESIGN.toml");
    } else {
        println!("   โš ๏ธ  No PROJECT_DESIGN.toml found");
    }

    Ok(())
}

fn update_environment_fixture() -> Result<()> {
    let fixture_path = "tests/fixtures/environment.json";

    // Create a sample environment fixture
    let env_fixture = serde_json::json!({
        "os": "macos",
        "arch": "aarch64",
        "tools": {
            "cargo": {
                "available": true,
                "version": "1.88.0"
            },
            "docker": {
                "available": true,
                "version": "28.3.0"
            },
            "git": {
                "available": true,
                "version": "2.39.5"
            }
        },
        "languages": {
            "rust": {
                "available": true,
                "version": "1.88.0"
            }
        }
    });

    fs::create_dir_all("tests/fixtures")?;
    fs::write(fixture_path, serde_json::to_string_pretty(&env_fixture)?)?;
    println!("   โœ“ Created sample environment fixture");

    Ok(())
}

fn update_claude_context_fixture() -> Result<()> {
    let fixture_path = "tests/fixtures/CLAUDE.md";

    // Create a sample CLAUDE.md fixture
    let claude_fixture = r#"# patina - Claude Context

This is a test fixture for CLAUDE.md generation.

## Environment
- OS: macos
- Rust: 1.88.0

## Project Design
Test project for Patina development.

## Patterns
- Core patterns loaded
- Topic patterns available
"#;

    fs::create_dir_all("tests/fixtures")?;
    fs::write(fixture_path, claude_fixture)?;
    println!("   โœ“ Created sample CLAUDE.md fixture");

    Ok(())
}

fn update_version_manifest_fixture() -> Result<()> {
    let fixture_path = "tests/fixtures/version_manifest.json";

    let manifest_fixture = serde_json::json!({
        "patina": "0.1.0",
        "components": {
            "claude-adapter": "0.6.0",
            "gemini-adapter": "0.1.0",
            "openai-adapter": "0.1.0",
            "docker-templates": "0.1.0"
        },
        "updated": "2025-08-06T00:00:00Z"
    });

    fs::create_dir_all("tests/fixtures")?;
    fs::write(
        fixture_path,
        serde_json::to_string_pretty(&manifest_fixture)?,
    )?;
    println!("   โœ“ Created sample version manifest fixture");

    Ok(())
}