xbp 0.6.0

XBP is a build pack and deployment management tool to deploy, rust, nextjs etc and manage the NGINX configs below it
Documentation
//! custom help renderer
//!
//! provides stylized help banner and custom guidance
//! detects xbp projects and shows service specific commands
//! displays available services when in an xbp project directory

use crate::commands::service::{is_xbp_project, load_xbp_config};
use crate::strategies::get_all_services;

/// Print a stylized help banner and quick usage guide.
pub async fn print_help() {
    println!(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");
    println!(":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.::.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.::.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:");
    println!("::::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.");
    println!(":.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.::::::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.::::::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::::");
    println!("::.:::.:::::.:::.:::.:::.:::.:::.::::::.:::.:::.:::.:::.:.:.::.:::.:::.:::.:::.:::.:::.:::.:::.:::.::.:::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::::.:::::.:::.:::.:::.::####::.::.:::.:::.:*###=:.:::.::::::::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::::.:::.:::::=%%##-:.::.:::.:::#%%%+:::.:::.:.:.:.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:.:::.:::.:::.:::.:::.:::::.:::.:::.:::.:.:.:.:.:.:::.:.:::=%%%#::.::.:::.:*%#%+:.:::.::::::::::::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::::::.:::::.:.:=#%#%-:.::.:::#%#%+:::.:::.:.:.:.:.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::.:.::.:.:.:::::=%%#%::.::.:#%%%+:.:.:.:::::::.::::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::::.::::::.:.:.:=%%#%=:.:-#%#%+:::::::.:.:.:.:.:.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:.:.::.:.:.:::::::=#%%#=::.-#%%#+:.:.:.:::::::::::::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:.::.::.:.:.:.::::::.::.:::.:.:.:.:.::..::::.::::::.:.:.:=%%##-:.::::#%%%+:::.:.:.:.:.:.:.::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::.:.:.::::::=##%%-:::.:.::##%%+:.:::::::.:::.:.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::.:::::::.:.::=%%%#::.::::::::##%#+::.:.:.::.::::::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::.:.:.:.:::.=#%##-:::.:.:.:.::#%%%*::::.:.::.:.:.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::::::::.:::%%##::.:.::::::::::*#%#-.:.:::.:::::::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.::.:.:.:.::.::.::::::::.:.:.:.:.:::.:::::.:::.:.:.::::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::::::.:.::.::.:.:.:.::::::.:::.:::.:.:.:.:::::::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!("::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:::.:.:.:::::::.:.::.::.:.:.:.::::::.::.:::.:.:.:.:::::::.:::.:::.:::.:::.:::.:::.:::.:.::::.:::.:::.:::.::::");
    println!();
    println!("\x1b[93m📋 Usage:\x1b[0m \x1b[96mxbp <command> [options]\x1b[0m");
    println!();
    println!("\x1b[93m🚀 Commands:\x1b[0m");
    println!("  \x1b[92m🔌 ports\x1b[0m     [-p <port>] [--debug] [--kill] [-n]    List active ports and processes, optionally search NGINX configs");
    println!("  \x1b[92m⚙️  setup\x1b[0m                                      Run initial setup commands");
    println!("  \x1b[92m🔄 redeploy\x1b[0m   [<service-name>]                 Redeploy (legacy redeploy.sh or specific service)");
    println!("  \x1b[92m📡 redeploy_v2\x1b[0m [-p <password>] [-u <username>] [-h <host>] [-d <project_dir>]    Remotely redeploy using redeploy.sh");
    println!("  \x1b[92m📝 config\x1b[0m                                     Display xbp.json contents");
    println!("  \x1b[92m📦 install\x1b[0m    <package>                       Install a package");
    println!("  \x1b[92m📋 logs\x1b[0m                                        View XBP logs");
    
    // Show service-specific commands if in xbp project
    if is_xbp_project().await {
        println!();
        println!("\x1b[93m🔧 Service Commands:\x1b[0m");
        println!("  \x1b[92m📋 services\x1b[0m                                List all services");
        println!("  \x1b[92m⚙️  service\x1b[0m   <command> <service-name>      Run command for a service");
        println!("  \x1b[90m     Commands: build, install, start, dev\x1b[0m");
        println!("  \x1b[90m     Example: xbp service build zeus\x1b[0m");
        
        // Try to list services
        if let Ok(config) = load_xbp_config().await {
            let services = get_all_services(&config);
            if !services.is_empty() {
                println!();
                println!("\x1b[93m📦 Available Services:\x1b[0m");
                for service in services.iter().take(5) {
                    println!("  \x1b[96m  • {}\x1b[0m ({}:{})", service.name, service.target, service.port);
                }
                if services.len() > 5 {
                    println!("  \x1b[90m  ... and {} more\x1b[0m", services.len() - 5);
                }
            }
        }
    }
    
    println!();
    println!("\x1b[93m💡 Examples:\x1b[0m");
    println!("  \x1b[90mxbp ports -p 3000 --kill    # Kill processes on port 3000\x1b[0m");
    println!("  \x1b[90mxbp setup --debug           # Run setup with debug output\x1b[0m");
    println!("  \x1b[90mxbp install docker          # Install Docker package\x1b[0m");
    println!("  \x1b[90mxbp logs -c install         # View install command logs\x1b[0m");
    if is_xbp_project().await {
        println!("  \x1b[90mxbp services                  # List all services\x1b[0m");
        println!("  \x1b[90mxbp service build zeus         # Build zeus service\x1b[0m");
        println!("  \x1b[90mxbp redeploy zeus              # Redeploy zeus service\x1b[0m");
    }
    println!("  \x1b[90mxbp -v                      # Display XBP version\x1b[0m");
    println!();
}