claudex-cli 0.11.0

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;
use claudex::store::short_name;

pub fn run(project: Option<&str>, limit: usize, json: bool, filter: &ResolvedFilter) -> Result<()> {
    let providers: Vec<_> = enabled_default()?
        .into_iter()
        .filter(|p| filter.includes_provider(p.id()))
        .collect();
    let mut idx = IndexStore::open()?;
    idx.ensure_fresh(&providers)?;
    idx.ensure_pr_links_fresh(&providers)?;

    let rows = idx.query_pr_links(project, filter, limit)?;

    if json {
        let output: Vec<_> = rows
            .iter()
            .map(|r| {
                serde_json::json!({
                    "provider": r.provider,
                    "project": r.project,
                    "session_id": r.session_id,
                    "pr_number": r.pr_number,
                    "pr_url": r.pr_url,
                    "pr_repository": r.pr_repository,
                    "timestamp": r.timestamp,
                })
            })
            .collect();
        println!("{}", serde_json::to_string_pretty(&output)?);
        return Ok(());
    }

    if rows.is_empty() {
        println!("No PR links found.");
        return Ok(());
    }

    let mut table = ui::table();
    table.set_header(ui::header(["Project", "PR #", "Repository", "URL"]));
    ui::right_align(&mut table, &[1]);
    for r in &rows {
        let sid: String = r
            .session_id
            .as_deref()
            .unwrap_or("-")
            .chars()
            .take(8)
            .collect();
        let repo = if r.pr_repository.is_empty() {
            sid
        } else {
            r.pr_repository.clone()
        };
        table.add_row([
            ui::cell_project(&short_name(&r.project)),
            ui::cell_plain(format!("#{}", ui::fmt_count(r.pr_number as u64))),
            ui::cell_dim(&repo),
            ui::cell_plain(r.pr_url.clone()),
        ]);
    }
    println!("{table}");
    Ok(())
}