xbp 10.17.2

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
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;
use colored::Colorize;

/// Print a stylized help banner and quick usage guide.
pub async fn print_help() {
    println!("\n{}", "XBP - XYLEX BUILD PACK".bright_magenta().bold());
    println!("{}", "".repeat(60).bright_black());
    println!(
        "\n{} {}",
        "Usage:".bright_blue().bold(),
        "xbp <command> [options]".bright_white()
    );

    println!("\n{}", "Core Commands".bright_blue().bold());
    println!("{}", "".repeat(40).bright_black());
    println!(
        "  {} - List active ports and processes",
        "ports".bright_cyan()
    );
    println!("  {} - Run initial setup", "setup".bright_cyan());
    println!("  {} - Redeploy services", "redeploy".bright_cyan());
    println!("  {} - Show configuration", "config".bright_cyan());
    println!("  {} - Install packages", "install".bright_cyan());
    println!("  {} - View logs", "logs".bright_cyan());
    println!("  {} - List PM2 processes", "list".bright_cyan());
    println!("  {} - Start PM2 process", "start".bright_cyan());
    println!("  {} - Manage Nginx", "nginx".bright_cyan());
    println!(
        "  {} - Manage floating IP and network config",
        "network".bright_cyan()
    );
    println!("  {} - Run diagnostics", "diag".bright_cyan());
    println!("  {} - Monitor services", "monitor".bright_cyan());
    println!(
        "  {} - Save a PM2 restore snapshot",
        "snapshot".bright_cyan()
    );
    println!(
        "  {} - Inspect and sync project versions",
        "version".bright_cyan()
    );
    println!("  {} - Generation commands", "generate".bright_cyan());

    if is_xbp_project().await {
        println!("\n{}", "Service Commands".bright_blue().bold());
        println!("{}", "".repeat(40).bright_black());
        println!("  services              - List all services");
        println!("  service <cmd> <name>  - Run service command");
        println!("    Commands: build, install, start, dev");

        if let Ok(config) = load_xbp_config().await {
            let services: Vec<crate::strategies::ServiceConfig> = get_all_services(&config);
            if !services.is_empty() {
                println!("\n{}", "Available Services".bright_green().bold());
                println!("{}", "".repeat(40).bright_black());
                for service in services.iter().take(5) {
                    println!(
                        "{} {}:{}",
                        service.name.bright_cyan(),
                        service.target.dimmed(),
                        service.port.to_string().yellow()
                    );
                }
                if services.len() > 5 {
                    println!(
                        "  {} {} more",
                        "...and".dimmed(),
                        (services.len() - 5).to_string().dimmed()
                    );
                }
            }
        }
    }

    println!("\n{}", "Options".bright_blue().bold());
    println!("{}", "".repeat(40).bright_black());
    println!("  {} - Enable debug output", "--debug".yellow());
    println!("  {} - Show help message", "--help".yellow());
    println!("  {} - Open logs directory", "--logs".yellow());

    println!("\n{}", "Examples".bright_blue().bold());
    println!("{}", "".repeat(40).bright_black());
    println!(
        "  {} - Kill processes on port 3000",
        "xbp ports -p 3000 --kill".dimmed()
    );
    println!("  {} - Install Docker", "xbp install docker".dimmed());
    println!(
        "  {} - Start a process with PM2",
        "xbp start \"npm start\" --name my-app".dimmed()
    );
    println!("  {} - Save the current PM2 state", "xbp snapshot".dimmed());
    println!("  {} - Show local and git versions", "xbp version".dimmed());
    println!(
        "  {} - Bump the patch version locally",
        "xbp version patch".dimmed()
    );
    println!(
        "  {} - Tag and publish a GitHub release",
        "xbp version release".dimmed()
    );
    println!(
        "  {} - Store OpenRouter API key globally",
        "xbp config openrouter set-key".dimmed()
    );
    println!(
        "  {} - Store GitHub OAuth2 token globally",
        "xbp config github set-key".dimmed()
    );
    if is_xbp_project().await {
        println!("  {} - Build a service", "xbp service build zeus".dimmed());
        println!("  {} - Redeploy a service", "xbp redeploy zeus".dimmed());
    }
    println!(
        "\n{} {}",
        "More info:".bright_blue().bold(),
        "https://github.com/xylex-group/xbp".cyan()
    );
}