lean-ctx 3.9.19

Context Runtime for AI Agents with CCP. 79 MCP tools, 10 read modes, 95+ compression patterns, cross-session memory (CCP), persistent AI knowledge with temporal facts + contradiction detection, multi-agent context sharing, LITM-aware positioning, AAAK compact format, adaptive compression with Thompson Sampling bandits. Supports 24+ AI tools. Reduces LLM token consumption by up to 99%.
use crate::core::measurement::{MeasurementFramework, MeasurementMode, report};

pub(crate) fn cmd_measure(args: &[String]) {
    if args
        .iter()
        .any(|arg| matches!(arg.as_str(), "-h" | "--help"))
    {
        print_usage();
        return;
    }
    let framework = MeasurementFramework::from_data_dir();
    match args.first().map(String::as_str) {
        Some("baseline-start") => set_mode(&framework, MeasurementMode::Baseline),
        Some("baseline-stop" | "treatment-stop") => {
            set_mode(&framework, MeasurementMode::Off);
        }
        Some("treatment-start") => set_mode(&framework, MeasurementMode::Treatment),
        Some("compare") if args.len() == 1 => print_report(&framework, "markdown"),
        Some("report") => match parse_format(&args[1..]) {
            Some(format) => print_report(&framework, format),
            None => usage_error(),
        },
        _ => usage_error(),
    }
}

fn set_mode(framework: &MeasurementFramework, mode: MeasurementMode) {
    if let Err(error) = framework.set_mode(mode) {
        eprintln!("measure: {error}");
        std::process::exit(1);
    }
    println!("Measurement mode: {}", mode.as_str());
}

fn print_report(framework: &MeasurementFramework, format: &str) {
    match framework.comparison() {
        Ok(comparison) => match format {
            "markdown" => print!("{}", report::markdown(&comparison)),
            "json" => println!("{}", report::json(&comparison)),
            _ => usage_error(),
        },
        Err(error) => {
            eprintln!("measure: {error}");
            std::process::exit(1);
        }
    }
}

fn parse_format(args: &[String]) -> Option<&str> {
    match args {
        [] => Some("markdown"),
        [flag, format] if flag == "--format" && matches!(format.as_str(), "markdown" | "json") => {
            Some(format)
        }
        _ => None,
    }
}

fn usage_error() {
    print_usage();
    std::process::exit(2);
}
fn print_usage() {
    eprintln!(
        "Usage: lean-ctx measure <baseline-start|baseline-stop|treatment-start|treatment-stop|compare|report> [--format markdown|json]"
    );
}