frame-cli 0.3.0

CLI for Frame — five intention-verbs over one application: frame new scaffolds it, frame run serves it, frame test proves it (real browser included), frame check verifies it statically, frame doctor walks the prerequisites
Documentation
//! Frame CLI — five intention-verbs over one application, without hiding
//! typed failures.

use clap::Parser;
use frame_cli::Cli;

fn main() -> std::process::ExitCode {
    // Without a tracing subscriber, the host library's own `tracing::warn!`
    // and `tracing::error!` calls (its documented LOUD failure surfaces,
    // reached through `frame host` and config loading) are silent no-ops —
    // so this binary always installs one.
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::try_from_default_env()
                .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
        )
        .init();
    match frame_cli::execute(Cli::parse()) {
        Ok(()) => std::process::ExitCode::SUCCESS,
        Err(error) => {
            eprintln!("frame: {error}");
            let mut source = std::error::Error::source(&error);
            while let Some(cause) = source {
                eprintln!("  caused by: {cause}");
                source = cause.source();
            }
            std::process::ExitCode::FAILURE
        }
    }
}