cueloop 0.4.0

A Rust CLI for managing AI agent loops with a structured JSON task queue
Documentation
//! Queue burndown subcommand.
//!
//! Purpose:
//! - Queue burndown subcommand.
//!
//! Responsibilities:
//! - Provide focused implementation or regression coverage for this file's owning feature.
//!
//! Scope:
//! - Limited to this file's owning feature boundary.
//!
//!
//! Usage:
//! - Used through the crate module tree or integration test harness.
//!
//! Invariants/Assumptions:
//! - Keep behavior aligned with CueLoop's canonical CLI, machine-contract, and queue semantics.

use anyhow::Result;
use clap::Args;

use crate::cli::load_and_validate_queues_read_only;
use crate::config::Resolved;
use crate::reports;

use super::QueueReportFormat;

/// Arguments for `cueloop queue burndown`.
#[derive(Args)]
#[command(
    after_long_help = "Examples:\n  cueloop queue burndown\n  cueloop queue burndown --days 30\n  cueloop queue burndown --format json"
)]
pub struct QueueBurndownArgs {
    /// Number of days to show (default: 7).
    #[arg(long, default_value_t = 7)]
    pub days: u32,

    /// Output format.
    #[arg(long, value_enum, default_value_t = QueueReportFormat::Text)]
    pub format: QueueReportFormat,
}

pub(crate) fn handle(resolved: &Resolved, args: QueueBurndownArgs) -> Result<()> {
    let (queue_file, done_file) = load_and_validate_queues_read_only(resolved, true)?;
    let done_ref = done_file
        .as_ref()
        .filter(|d| !d.tasks.is_empty() || resolved.done_path.exists());
    reports::print_burndown(&queue_file, done_ref, args.days, args.format.into())?;
    Ok(())
}