claudex-cli 0.10.1

Query, search, and analyze agent coding sessions from the command line
Documentation
use anyhow::Result;

use crate::cli::ResolvedFilter;
use crate::ui;
use claudex::index::IndexStore;
use claudex::providers::enabled_default;

pub fn run(
    force: bool,
    status: bool,
    prune_retained_days: Option<u64>,
    vacuum: bool,
) -> Result<()> {
    let providers = enabled_default()?;
    let mut idx = IndexStore::open()?;

    if force {
        eprintln!("Rebuilding index (full)...");
        let count = idx.force_rebuild(&providers)?;
        println!("Indexed {count} sessions.");
    } else if let Some(days) = prune_retained_days {
        let secs = (days as i64).saturating_mul(86_400);
        let pruned = idx.prune_retained(secs, &ResolvedFilter::default())?;
        println!("Pruned {pruned} retained sessions older than {days} days.");
    } else {
        eprintln!("Updating index...");
        let count = idx.sync_now(&providers)?;
        println!("Updated {count} sessions.");
    }

    if vacuum {
        idx.vacuum()?;
        println!("Vacuumed index database.");
    }

    if status {
        let stats = idx.retention_stats(&ResolvedFilter::default())?;
        let mut table = ui::table();
        table.set_header(ui::header(["Total", "Live", "Retained", "Archived"]));
        ui::right_align(&mut table, &[0, 1, 2, 3]);
        table.add_row([
            ui::cell_count(stats.total_sessions as u64),
            ui::cell_count(stats.live_sessions as u64),
            ui::cell_count(stats.retained_sessions as u64),
            ui::cell_count(stats.archived_sessions as u64),
        ]);
        println!("{table}");
    }
    Ok(())
}