Current section
Files
Jump to
Current section
Files
lib/cli/formatter.ex
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