# frozen_string_literal: true require 'date' require_relative '../core/colores' require_relative '../core/help_formatter' class SubcomandoGenerar def initialize(args, logger) @args = args @logger = logger end def ejecutar # Envolvemos todo en un manejador de eventos del sistema ADN.eventos.publicar(:sistema_iniciado, { subcomando: 'generar' }, silencioso: true) if @args.empty? @logger.error("Se requiere tipo de generación") mostrar_ayuda_generar exit 1 end tipo = @args[0] @args.shift case tipo when 'bitacora' generar_bitacora when 'nodo' generar_nodo when 'proyecto' generar_proyecto else @logger.error("Tipo de generación desconocido: #{tipo}") mostrar_ayuda_generar exit 1 end end private def mostrar_ayuda_generar ayuda = ADN::HelpFormatter.generar_help( titulo: "Generador de Componentes ADN", descripcion: "Genera nuevos componentes en el ecosistema ADN", uso: "./adn/tools/run generar [argumentos]", opciones: [ { names: ['bitacora [fecha]'], desc: "Crea nueva bitácora (fecha: YYYY-MM-DD, default: hoy)" }, { names: ['nodo '], desc: "Crea ficha de nodo" }, { names: ['proyecto '], desc: "Crea manifiesto de proyecto" } ], ejemplos: [ { cmd: "./adn/tools/run generar bitacora", desc: "Crear bitácora para hoy" }, { cmd: "./adn/tools/run generar bitacora 2026-03-08", desc: "Crear bitácora para el 8 de marzo de 2026" }, { cmd: "./adn/tools/run generar nodo srv-nuevo", desc: "Crear ficha para el nodo srv-nuevo" }, { cmd: "./adn/tools/run generar proyecto P2604", desc: "Crear manifiesto para el proyecto P2604" } ] ) puts ayuda end def generar_bitacora fecha = @args[0] || Date.today.iso8601 # Validar formato de fecha unless fecha.match?(/^\d{4}-\d{2}-\d{2}$/) @logger.error("Formato de fecha inválido. Usar YYYY-MM-DD") exit 1 end ruta_bitacora = File.join(ADN::BITACORAS_DIR, "#{fecha}.md") if File.exist?(ruta_bitacora) @logger.advertencia("La bitácora para #{fecha} ya existe") puts "#{Color::YELLOW}⚠ La bitácora #{fecha}.md ya existe#{Color::RESET}" exit 0 end # Plantilla de bitácora plantilla = <<~PLANTILLA_BITACORA # Bitácora #{fecha} --- ## 📋 Control de Gestión ### Pendientes | ID | Nodo | Detalle | | :--- | :--- | :--- | ### En Proceso | ID | Nodo | Detalle | | :--- | :--- | :--- | ### Resumen de Actividades | Nodo | Resumen Integral | | :--- | :--- | --- ## 📝 Actividades Detalladas --- PLANTILLA_BITACORA File.write(ruta_bitacora, plantilla) @logger.exito("Bitácora creada: #{fecha}.md") puts "#{Color::GREEN}✓ Bitácora creada en: #{ruta_bitacora}#{Color::RESET}" puts "#{Color::DIM}Para editarla: vim #{ruta_bitacora}#{Color::RESET}" end def generar_nodo if @args.empty? @logger.error("Se requiere nombre para el nodo") puts "Uso: ./adn/tools/run generar nodo " exit 1 end nombre = @args[0].downcase # Forzar minúsculas según gobernanza ruta_nodo = File.join(ADN::NODOS_DIR, "#{nombre}.md") if File.exist?(ruta_nodo) @logger.advertencia("La ficha para el nodo #{nombre} ya existe") puts "#{Color::YELLOW}⚠ La ficha #{nombre}.md ya existe#{Color::RESET}" exit 0 end # Plantilla de nodo plantilla = <<~PLANTILLA_NODO # Ficha de Nodo: #{nombre} | Atributo | Valor | | :--- | :--- | | **Hostname** | `#{nombre}` | | **IP LAN** | `10.0.10.X` | | **Sistema Operativo** | *Especificar* | | **Rol** | *Describir función* | ## Especificaciones de Hardware - **CPU**: *Especificar* - **RAM**: *Especificar* - **Disco**: *Especificar* ## Servicios y Responsabilidades 1. *Listar servicios críticos* ## Acceso y Mantenimiento - **Gestión**: *SSH, Web, etc.* - **Backup**: *Estrategia de respaldo* - **Monitorización**: *Herramientas de monitoreo* ## Dependencias - *Listar nodos/proyectos dependientes* ## Historial de Cambios Relevantes - #{Date.today}: Ficha creada automáticamente PLANTILLA_NODO File.write(ruta_nodo, plantilla) @logger.exito("Ficha de nodo creada: #{nombre}.md") puts "#{Color::GREEN}✓ Ficha de nodo creada en: #{ruta_nodo}#{Color::RESET}" end def generar_proyecto if @args.empty? @logger.error("Se requiere código para el proyecto") puts "Uso: ./adn/tools/run generar proyecto [nombre]" exit 1 end codigo = @args[0].upcase nombre = @args[1] || "Proyecto #{codigo}" ruta_proyecto = File.join(ADN::PROYECTOS_DIR, "#{codigo}_#{nombre.downcase.gsub(/\s+/, '_')}.md") if File.exist?(ruta_proyecto) @logger.advertencia("El manifiesto para el proyecto #{codigo} ya existe") puts "#{Color::YELLOW}⚠ El manifiesto #{codigo}_*.md ya existe#{Color::RESET}" exit 0 end # Plantilla de proyecto plantilla = <<~PLANTILLA_PROYECTO # #{codigo} - #{nombre} **Estado:** 📍 Definido **Fecha Inicio:** #{Date.today} **Fecha Fin Estimada:** *Especificar* ## Objetivo *Describir el propósito y qué problema resuelve* ## Stakeholders | Rol | Nombre | Contacto | | :--- | :--- | :--- | | *Ej: Coordinador* | *Nombre* | *email/tel* | ## 🌐 Topología y Contexto de Red *Describir ubicación de nodos, subredes, requisitos de acceso* ## Nodos Involucrados ### Nodos Exclusivos (Core) - *Listar nodos centrales del proyecto* ### Nodos de Soporte/Infraestructura - *Listar nodos de infraestructura compartida* ## Herramientas - *Software, scripts y servicios utilizados* ## Hitos Clave | ID | Hito | Estado | Fecha | | :--- | :--- | :---: | :--- | | 1 | *Primer hito* | 📍 | *Fecha* | --- ## 📊 Progreso ``` Fase 1: ░░░░░░░░░░ 0% Nombre de la Fase ``` --- ## Dashboard *URL del panel de seguimiento web (si aplica)* ## Referencias - [ADN del Proyecto](../adn/00_indice.md) - *Otras referencias relevantes* --- *Manifiesto generado automáticamente el #{Date.today}* PLANTILLA_PROYECTO File.write(ruta_proyecto, plantilla) @logger.exito("Manifiesto de proyecto creado: #{codigo}") puts "#{Color::GREEN}✓ Manifiesto creado en: #{ruta_proyecto}#{Color::RESET}" end end