Files
dtic-DIIAA/adn/tools/cli/salud.rb
T
Ricardo Monla f608924c6a [P2604-S10,S15] SubcomandoSalud→ADN:: + README actualizado
S10: Migrar SubcomandoSalud al namespace ADN:: (consistencia)
S15: Actualizar README.md con estructura real de tools/
  - Tabla de subcomandos: nodos info, ssh --listar
  - Estructura cli/: submódulos (nodos/, ssh/, triggers/, backup/)
  - core/ limpio: solo infraestructura genuina
  - Directiva 5 actualizada: submódulos CLI en vez de core/
  - Eliminados archivos obsoletos del árbol (cierre.rb, inicio.rb)

Fase 10: 100% completada (S1-S15)
- 15 tests, 0 failures
- Evento 1080 (17:32→17:36)
2026-03-15 17:35:08 -03:00

124 lines
3.2 KiB
Ruby

# frozen_string_literal: true
require 'optparse'
require 'json'
require_relative '../core/colores'
module ADN
class SubcomandoSalud
def initialize(args, logger)
@args = args
@logger = logger
@opciones = { dashboard: false, json: false }
end
def ejecutar
parser = OptionParser.new do |opts|
opts.banner = "Uso: ./adn/tools/run salud [OPCIONES]"
opts.separator ""
opts.separator "Muestra salud general del sistema ADN"
opts.separator ""
opts.separator "Opciones:"
opts.on("--dashboard", "Mostrar en formato dashboard (no implementado)") do
@opciones[:dashboard] = true
end
opts.on("--json", "Salida en formato JSON") do
@opciones[:json] = true
end
opts.on("-h", "--help", "Mostrar esta ayuda") do
puts opts
exit
end
end
begin
parser.parse!(@args)
rescue OptionParser::InvalidOption => e
@logger.error("Opción inválida: #{e.message}")
puts parser
exit 1
end
mostrar_salud
end
private
def mostrar_salud
@logger.info("Generando reporte de salud del ADN")
datos = {
timestamp: Time.now.utc.iso8601,
hebras_adn: contar_hebras_adn,
bitacoras: contar_bitacoras,
nodos: contar_nodos,
proyectos: contar_proyectos,
errores_recientes: buscar_errores_recientes
}
if @opciones[:json]
puts JSON.pretty_generate(datos)
return
end
if @opciones[:dashboard]
puts "#{Color::YELLOW}⚠ El dashboard será implementado en Fase 3#{Color::RESET}"
# TODO: Implementar dashboard en Fase 3
end
# Mostrar en formato legible
puts "#{Color::CYAN}🧬 Salud del Sistema ADN#{Color::RESET}"
puts "#{Color::DIM}#{'-' * 60}#{Color::RESET}"
puts " #{Color::GREEN}Hebras ADN:#{Color::RESET} #{datos[:hebras_adn]} / 7"
puts " #{Color::GREEN}Bitácoras:#{Color::RESET} #{datos[:bitacoras]}"
puts " #{Color::GREEN}Nodos registrados:#{Color::RESET} #{datos[:nodos]}"
puts " #{Color::GREEN}Proyectos activos:#{Color::RESET} #{datos[:proyectos]}"
if datos[:errores_recientes] > 0
puts " #{Color::RED}Errores recientes:#{Color::RESET} #{datos[:errores_recientes]}"
else
puts " #{Color::GREEN}Errores recientes:#{Color::RESET} 0"
end
puts "#{Color::DIM}#{'-' * 60}#{Color::RESET}"
puts "#{Color::DIM}Para más detalles: ./adn/tools/run salud --json#{Color::RESET}"
@logger.exito("Reporte de salud generado")
end
def contar_hebras_adn
Dir.glob(File.join(ADN::PROJECT_ROOT, 'adn', "*.md")).count
end
def contar_bitacoras
Dir.glob(File.join(ADN::BITACORAS_DIR, "*.md")).count
end
def contar_nodos
Dir.glob(File.join(ADN::NODOS_DIR, "*.md")).count
end
def contar_proyectos
Dir.glob(File.join(ADN::PROYECTOS_DIR, "*.md")).count
end
def buscar_errores_recientes
# Buscar en logs de hoy
log_hoy = File.join(ADN::LOGS_DIR, "#{Date.today}.log")
return 0 unless File.exist?(log_hoy)
errores = 0
File.foreach(log_hoy) do |linea|
begin
entrada = JSON.parse(linea)
errores += 1 if entrada['nivel'] == 'ERROR'
rescue JSON::ParserError
next
end
end
errores
end
end
end