[P2604] Fase 15: Optimización IA e integración de herramienta candados. Sincronización de bitácoras y actualización de planes de proyecto.

This commit is contained in:
Ricardo Monla
2026-03-19 09:52:29 -03:00
parent 183dbf6fb6
commit 5aa37e7221
138 changed files with 8777 additions and 464 deletions
+58
View File
@@ -0,0 +1,58 @@
# frozen_string_literal: true
require_relative 'plantillas'
module ADN
class GeneradorProy
def self.nuevo(tipo, titulo, opciones)
unless Plantillas.existe?(tipo)
puts "✗ Tipo inválido: #{tipo}"
return
end
titulo_base = titulo
titulo_base = tipo.capitalize if titulo_base.nil? || titulo_base.empty?
# Remover espacios para el filename manteniendo legibilidad
titulo_archivo = titulo_base.gsub(/\s+/, '-')
proy_id = opciones[:proy]
fase_id = opciones[:fase]
# Construir el prefijo del nombre del archivo
prefijos = []
prefijos << proy_id if proy_id && proy_id.is_a?(String) && !proy_id.empty?
prefijos << fase_id if fase_id && fase_id.is_a?(String) && !fase_id.empty?
prefijo_str = prefijos.empty? ? "" : "#{prefijos.join('.')}_"
nombre_archivo = "#{prefijo_str}#{titulo_archivo}.md"
# Determinar el directorio de destino
dir_base = File.expand_path('../../../docs/proy', __dir__)
FileUtils.mkdir_p(dir_base) unless Dir.exist?(dir_base)
destino_dir = dir_base
if proy_id && proy_id.is_a?(String) && !proy_id.empty?
# Buscar carpetas que coincidan con el patrón P2601*
require 'fileutils'
coincidencias = Dir.glob(File.join(dir_base, "#{proy_id}*")).select { |f| File.directory?(f) }
if coincidencias.any?
destino_dir = coincidencias.first
else
# Crear directorio P2601_Nombre (si hay titulo le ponemos el titulo, sino solo P2601)
destino_dir = File.join(dir_base, "#{proy_id}_#{titulo_archivo}")
FileUtils.mkdir_p(destino_dir)
end
end
ruta_completa = File.join(destino_dir, nombre_archivo)
contenido = Plantillas.obtener(tipo)
File.write(ruta_completa, contenido)
puts "✓ Archivo generado: #{ruta_completa}"
end
end
end
+109
View File
@@ -0,0 +1,109 @@
# frozen_string_literal: true
module ADN
module Plantillas
def self.existe?(tipo)
plantillas.key?(tipo)
end
def self.obtener(tipo)
plantillas[tipo]
end
def self.plantillas
{
"plan" => template_plan,
"subplan" => template_subplan,
"mejora" => template_mejora,
"incidente" => template_incidente,
"tarea" => template_tarea
}
end
def self.template_plan
<<~MD
# [Código] - Plan
## Objetivo
...
## Fases
- [ ] Tarea
---
## 📊 Progreso
```
Fase 1: ██████░░░░ 60% Nombre de la Fase
```
---
MD
end
def self.template_subplan
<<~MD
# [Código] - Subplan Técnico
## Contexto Técnico
...
## Procedimiento
...
MD
end
def self.template_mejora
<<~MD
# [Código] - Mejora
## Objetivo
...
## Implementación
...
---
## 📊 Progreso
```
En curso: ██████░░░░ 60% Implementación
```
---
MD
end
def self.template_incidente
<<~MD
# [Código] - Incidente
## Descripción
...
## Resolución
...
MD
end
def self.template_tarea
<<~MD
# [Código] - Tarea
## Descripción
...
## Estado
---
## 📊 Progreso
```
Fase 1: ██████░░░░ 60% Nombre de la Fase
```
---
MD
end
end
end
+64
View File
@@ -0,0 +1,64 @@
# frozen_string_literal: true
require_relative '../core/help_formatter'
require_relative 'generador'
module ADN
class SubcomandoProy
def initialize(args, logger)
@args = args
@logger = logger
end
def ejecutar
if @args.empty?
mostrar_ayuda
return
end
accion = @args.shift
case accion
when 'nuevo'
tipo = @args.shift
titulo = nil
opciones = {}
while (arg = @args.shift)
if arg =~ /^--(\w+)[:=](.+)$/
opciones[$1.to_sym] = $2.gsub(/^['"]|['"]$/, '')
elsif arg =~ /^--(\w+)$/
opciones[$1.to_sym] = true
else
titulo = arg unless titulo
end
end
GeneradorProy.nuevo(tipo, titulo, opciones)
when 'ayuda', 'help', '-h', '--help'
mostrar_ayuda
else
puts "✗ Acción desconocida: #{accion}"
mostrar_ayuda
exit 1
end
end
private
def mostrar_ayuda
puts ADN::HelpFormatter.generar_help(
titulo: "Gestión de Proyectos",
descripcion: "Creación de estructuras basadas en plantillas",
uso: "./adn/tools/run proy nuevo [tipo]",
opciones: [
{ names: ['nuevo [plan|subplan|mejora|incidente|tarea]'], desc: "Crear estructura desde plantilla" }
],
ejemplos: [
{ cmd: "./adn/tools/run proy nuevo plan", desc: "Crear un plan nuevo" },
{ cmd: "./adn/tools/run proy nuevo mejora", desc: "Crear mejora" }
]
)
end
end
end