defmodule Argos.CLI.Formatter do @moduledoc """ Módulo para formatear la salida del CLI (help, examples, version). """ alias Aurora.{Color, Printer} alias Aurora.Structs.{ChunkText, EffectInfo} @app_name Mix.Project.config()[:app] |> to_string() |> String.capitalize() @app_version "2.0.0" @doc """ Muestra la ayuda del CLI. """ @spec show_help() :: :ok def show_help do Printer.header( [ [message: "🚀 ARGOS CLI v#{@app_version}", color: :primary, align: :center], [ message: "Ejecución paralela de comandos del sistema", color: :secondary, align: :center, italic: true ], [ message: "Ejecuta múltiples comandos en paralelo preservando códigos ANSI", color: :info, align: :center, dim: true ] ], length: :full, char: "─", color: :ternary, align: :left ) Printer.message( chunks: [ %ChunkText{text: "⚙️ argos [", color: Color.to_color_info(:primary)}, %ChunkText{text: "OPCIONES", color: Color.to_color_info(:success)}, %ChunkText{text: "]", color: Color.to_color_info(:primary)} ] ) Printer.separator(char: "─", length: :full, color: :ternary) Printer.table( ["Opción", "Descripción"], [ ["-c, --command=\"COMANDO\"", "Ejecutar un comando (puede especificarse múltiples veces)"], ["--load-config", "Cargar archivo de configuración del shell (.zshrc, .bashrc, etc.)"], ["--no-config", "No cargar archivo de configuración del shell"], ["--no-login", "(Deprecated) Equivalente a --no-config"], ["--asdf-local", "Usar versiones de asdf del .tool-versions local del proyecto"], ["-h, --help", "Mostrar esta ayuda"], ["-e, --examples", "Mostrar ejemplos de uso"], ["-v, --version", "Mostrar la versión"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "primary;secondary", row_color: "ternary;no_color" ) Printer.header( [[message: "📝 NOTAS IMPORTANTES", color: :warning, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Nota", "Descripción"], [ ["Ejecución paralela", "Los comandos se ejecutan en paralelo usando Tasks"], ["Preservación ANSI", "La salida de cada comando se muestra preservando los códigos ANSI"], ["Código de salida", "Será 0 si todos los comandos tienen éxito, o 1 si alguno falla"], [ "Configuración del shell", "Por defecto se carga el archivo de configuración del shell (.zshrc, .bashrc, etc.) para permitir usar aliases y funciones personalizadas" ], ["Sin configuración", "Usa --no-config si no quieres cargar la configuración del shell"], ["Detección automática", "El archivo de configuración se detecta automáticamente según el shell usado"], [ "--asdf-local", "Detecta automáticamente el directorio del proyecto desde el comando (aliases como tdlm, tdaudit, etc.) y usa las versiones del .tool-versions local" ] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "warning;secondary", row_color: "info;no_color" ) Printer.message(message: "💡 Tip: Usa --examples para ver ejemplos de uso", color: :info, align: :center, italic: true) end @doc """ Muestra ejemplos de uso del CLI. """ @spec show_examples() :: :ok def show_examples do Printer.header( [[message: "✨ ARGOS CLI - EJEMPLOS DE USO", color: :primary, align: :center]], length: :full, char: "─", color: :ternary, align: :left ) Printer.message(message: "Ejemplos concretos de uso de Argos", color: :secondary, align: :center, italic: true) Printer.header( [[message: "📝 EJEMPLOS BÁSICOS", color: :info, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ ["argos --command=\"echo 'Hello World'\"", "Ejecutar un único comando"], ["argos --command=\"ls -la\"", "Ejecutar comando con argumentos"], ["argos --command=\"pwd\"", "Ejecutar comando simple"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "info;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "⚡ EJEMPLOS: Ejecución Paralela", color: :warning, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ ["argos --command=\"echo 'First'\" --command=\"echo 'Second'\"", "Ejecutar 2 comandos en paralelo"], [ "argos --command=\"sleep 2 && echo 'Done 1'\" --command=\"sleep 1 && echo 'Done 2'\"", "Comandos complejos en paralelo (el segundo terminará antes)" ], ["argos --command=\"echo 'A'\" --command=\"echo 'B'\" --command=\"echo 'C'\"", "Ejecutar 3 comandos en paralelo"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "warning;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "🎨 EJEMPLOS: Comandos con ANSI (Aurora)", color: :happy, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ ["argos --command=\"echo \\\"$(aurora --text='Hola' --color=primary)\\\"\"", "Comando con Aurora (texto simple)"], [ "argos --command=\"echo \\\"$(aurora --text='Éxito' --color=success --bold)\\\"\"", "Comando con Aurora (texto con efectos)" ], ["argos --command=\"aurora --success='Operación completada'\"", "Comando Aurora directo"], ["argos --command=\"aurora --table --headers='A;B' --row='1;2'\"", "Comando Aurora con tabla"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "happy;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "⚙️ EJEMPLOS: Configuración del Shell", color: :secondary, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ ["argos --command=\"mi_alias argumentos\"", "Usar alias definido en .zshrc (carga config por defecto)"], ["argos --load-config --command=\"mi_alias\"", "Cargar configuración explícitamente"], ["argos --no-config --command=\"comando_sin_config\"", "Ejecutar sin cargar configuración del shell"], ["argos --no-login --command=\"comando\"", "(Deprecated) Equivalente a --no-config"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "secondary;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "🔧 EJEMPLOS: --asdf-local", color: :menu, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ [ "argos --asdf-local --command=\"tdlm && mix test\"", "Usar versiones del .tool-versions del proyecto (detecta desde alias tdlm)" ], [ "argos --asdf-local --command=\"cd /path/to/project && mix test\"", "Usar versiones del .tool-versions del proyecto (detecta desde cd)" ], [ "argos --asdf-local --command=\"tdaudit && mix compile\"", "Usar versiones del .tool-versions del proyecto (detecta desde alias tdaudit)" ] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "menu;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "🚀 EJEMPLOS AVANZADOS", color: :primary, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Comando", "Descripción"], [ [ "argos --command=\"cd /proj1 && mix test\" --command=\"cd /proj2 && mix test\"", "Ejecutar tests en múltiples proyectos en paralelo" ], [ "argos --command=\"aurora --success='Proceso 1'\" --command=\"aurora --info='Proceso 2'\"", "Múltiples comandos Aurora en paralelo" ], ["argos --no-config --command=\"comando_limpio\"", "Ejecutar comando sin interferencias del shell config"], [ "argos --command=\"sleep 1\" --command=\"sleep 2\" --command=\"sleep 3\"", "Comandos con diferentes duraciones (todos se ejecutan en paralelo)" ] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "primary;secondary", row_color: "primary;no_color" ) Printer.separator(char: "─", length: :full, color: :ternary) Printer.message( message: "💡 Tip: Usa --help para ver todas las opciones disponibles", color: :info, align: :center, italic: true ) end @doc """ Muestra la versión del CLI. """ @spec show_version() :: :ok def show_version do Printer.message( chunks: [ %ChunkText{ text: "#{@app_name} version #{@app_version}", color: Color.to_color_info(:primary), effects: %EffectInfo{bold: true} } ] ) end @doc """ Shows help for a specific command. Since Argos executes system commands, this provides contextual help about how to use Argos with that specific command. """ @spec show_command_help(String.t()) :: :ok def show_command_help(command) do Printer.header( [ [message: "📖 ARGOS - Command Help", color: :primary, align: :center], [ message: "Help for: #{command}", color: :secondary, align: :center, italic: true ] ], length: :full, char: "─", color: :ternary, align: :left ) Printer.message( message: "Argos executes system commands in parallel. Here's how to use it with this command:", color: :info, align: :left ) Printer.separator(char: "─", length: :full, color: :ternary) Printer.header( [[message: "💡 USAGE EXAMPLES", color: :success, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Example", "Description"], [ [ "argos --command=\"#{command}\"", "Execute this command once" ], [ "argos --command=\"#{command}\" --command=\"other_command\"", "Execute this command in parallel with another command" ], [ "argos --no-config --command=\"#{command}\"", "Execute without loading shell configuration" ], [ "argos --asdf-local --command=\"#{command}\"", "Execute using ASDF versions from project's .tool-versions" ] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "success;secondary", row_color: "primary;no_color" ) Printer.header( [[message: "⚙️ OPTIONS", color: :info, align: :left]], length: :full, char: "─", color: :ternary, align: :left ) Printer.table( ["Option", "Description"], [ ["--command=\"#{command}\"", "Execute this command (can be specified multiple times)"], ["--load-config", "Load shell configuration file (.zshrc, .bashrc, etc.)"], ["--no-config", "Don't load shell configuration file"], ["--asdf-local", "Use ASDF versions from project's .tool-versions file"] ], table_align: :left, header_align: [:left, :left], col_align: [:left, :left], headers_color: "info;secondary", row_color: "primary;no_color" ) Printer.separator(char: "─", length: :full, color: :ternary) Printer.message( message: "💡 Tip: Use 'argos --help' for complete help and all available options", color: :info, align: :center, italic: true ) end end