claudy 0.2.2

Modern multi-provider launcher for Claude CLI
use claudy::adapters::analytics::sqlite_store::SqliteAnalyticsStore;
use claudy::ports::analytics_ports::AnalyticsStore;

fn main() {
    let db_path = dirs::home_dir()
        .unwrap()
        .join("Library")
        .join("Application Support")
        .join("com.claudy.analytics")
        .join("analytics.db");

    eprintln!("DB: {:?}", db_path);

    let store = SqliteAnalyticsStore::open(db_path.to_str().unwrap()).unwrap();
    store.initialize_schema().unwrap();

    let mut ok = true;

    macro_rules! check {
        ($label:expr, $expr:expr) => {
            match $expr {
                Ok(_) => eprintln!("  OK  {}", $label),
                Err(e) => {
                    eprintln!("  FAIL {}{}", $label, e);
                    ok = false;
                }
            }
        };
    }

    check!(
        "get_sessions (30d)",
        store.get_sessions(100, Some(30), None).map(|_| ())
    );
    check!(
        "get_recommendations",
        store.get_recommendations().map(|_| ())
    );
    check!(
        "aggregate_token_trends",
        store.aggregate_token_trends(30, None).map(|_| ())
    );
    check!(
        "aggregate_tool_distribution",
        store
            .aggregate_tool_distribution(Some(30), None)
            .map(|_| ())
    );
    check!(
        "aggregate_cost_metrics",
        store.aggregate_cost_metrics(30, None).map(|_| ())
    );
    check!(
        "aggregate_dashboard_stats",
        store.aggregate_dashboard_stats(30, None).map(|_| ())
    );

    if ok {
        eprintln!("\nAll checks passed.");
    } else {
        eprintln!("\nSome checks FAILED.");
        std::process::exit(1);
    }
}