rae 0.1.4

Renderer-neutral widget, layout, state, and GLSL shader primitives for agentic Rust desktop tools.
Documentation
use rae::flow::completion_gate;
use rae::{
    default_validation_profiles, AgentPhase, AgentTask, EditPlan, KanbanBoard, KanbanCard,
    RunRecord, RunStatus, TaskStatus,
};

fn main() {
    let task = AgentTask {
        goal: "Grow rae's examples like KnottTUI".into(),
        phase: AgentPhase::ValidateChanges,
        decisions: vec![
            "examples are renderer-neutral stdout snapshots".into(),
            "each major module gets one demo".into(),
        ],
        blockers: Vec::new(),
        next_steps: vec![
            "cargo test --examples".into(),
            "publish next crate patch".into(),
        ],
    };

    let plan = EditPlan {
        objective: task.goal.clone(),
        steps: vec![
            "inspect KnottTUI examples".into(),
            "add rae examples".into(),
            "update docs".into(),
            "verify".into(),
        ],
        touched_paths: vec![
            "examples/*.rs".into(),
            "README.md".into(),
            "implementations.md".into(),
        ],
        validation_commands: vec!["cargo test --examples".into(), "cargo test".into()],
    };

    let board = KanbanBoard {
        cards: vec![
            card(1, "inventory examples", TaskStatus::Done),
            card(2, "write demos", TaskStatus::Doing),
            card(3, "publish package", TaskStatus::Todo),
        ],
    };

    let latest = RunRecord {
        profile: "examples".into(),
        command: "cargo test --examples".into(),
        status: RunStatus::Passed,
        exit_code: Some(0),
        output_preview: "all examples compiled".into(),
    };

    println!("agent task: {}", task.goal);
    println!("phase: {}", task.phase.label());
    println!("plan objective: {}", plan.objective);
    println!("validation profiles:");
    for profile in default_validation_profiles() {
        println!(
            "  - {:<6} {:<46} destructive:{}",
            profile.name, profile.command, profile.destructive
        );
    }
    println!("kanban counts:");
    for status in [
        TaskStatus::Todo,
        TaskStatus::Doing,
        TaskStatus::Done,
        TaskStatus::Blocked,
    ] {
        println!("  {} -> {}", status.label(), board.count_for(status));
    }
    println!(
        "completion gate after writes: {:?}",
        completion_gate(true, Some(&latest))
    );
}

fn card(id: u64, title: &str, status: TaskStatus) -> KanbanCard {
    KanbanCard {
        id,
        title: title.into(),
        status,
        context_refs: vec!["../KnottTUI/examples".into()],
        agent_notes: vec!["keep examples practical and evolving".into()],
    }
}