falsegreen 0.1.30

FalseGreen client — independent verification for coding agents
mod shim;

use clap::Parser;
use shim::cli::{Cli, Commands};

fn main() {
    let cli = Cli::parse();

    match cli.command {
        Commands::Mcp => {
            // This never returns — it's a STDIO pipe loop.
            shim::mcp::run();
        }
        Commands::Login { token } => {
            let token = match token {
                Some(t) => t,
                None => {
                    eprintln!("Enter your FalseGreen key: ");
                    let mut input = String::new();
                    std::io::stdin()
                        .read_line(&mut input)
                        .expect("failed to read input");
                    input.trim().to_string()
                }
            };
            if token.is_empty() {
                eprintln!("Key cannot be empty.");
                std::process::exit(1);
            }

            println!("Establishing an individual FalseGreen session...");

            match shim::device::login(&token) {
                Ok(session) => {
                    match shim::config::save_credentials(&session.access_token, &session.session_id)
                    {
                        Ok(_) => {
                            println!("Logged in.");
                            println!(
                                "Credentials stored in {:?}.",
                                shim::config::credentials_path()
                            );
                        }
                        Err(e) => {
                            eprintln!("Failed to store credentials: {}", e);
                            std::process::exit(1);
                        }
                    }
                }
                Err(e) => {
                    eprintln!("Login failed: {}", e);
                    std::process::exit(1);
                }
            }
        }
        Commands::Logout => {
            if let Some(token) = shim::config::load_token() {
                print!("Revoking session... ");
                match shim::device::logout(&token) {
                    Ok(_) => println!("done."),
                    Err(e) => {
                        println!("failed: {}", e);
                        eprintln!("Removing local credentials anyway.");
                    }
                }
            }
            match shim::config::clear_token() {
                Ok(_) => println!("Logged out."),
                Err(e) => {
                    eprintln!("Failed to remove credentials: {}", e);
                    std::process::exit(1);
                }
            }
        }
        Commands::Status => {
            match shim::config::load_token() {
                Some(_) => {
                    println!(
                        "Authenticated. Key stored in {:?}.",
                        shim::config::credentials_path()
                    );
                    if let Some(id) = shim::config::load_session_id() {
                        println!("Session: {}", id);
                    }
                }
                None => println!("Not authenticated. Run `falsegreen login` to set up."),
            }
            println!("API endpoint: {}", shim::config::api_url());
        }
        Commands::Terraform { command } => match shim::iac::run(command) {
            Ok(output) => println!("{output}"),
            Err(error) => {
                eprintln!("Terraform operation failed: {error}");
                std::process::exit(1);
            }
        },
        Commands::Install { agent } => match shim::install::install(&agent) {
            Ok(_) => {}
            Err(e) => {
                eprintln!("Install failed: {}", e);
                std::process::exit(1);
            }
        },
    }
}