[ADN] Mejora de hook pre-commit - Mayor robustez y aplicación de principios rectores

This commit is contained in:
Ricardo Monla
2026-03-12 05:35:27 -03:00
parent 2b8c4a9916
commit 28803f3b24
+81 -16
View File
@@ -7,7 +7,7 @@
# ─── Configuración ───────────────────────────────────────────────────────
PROYECTO_ROOT="$(git rev-parse --show-toplevel)"
ADN_TOOLS_DIR="${PROYECTO_ROOT}/adn/tools"
ADN_CLI="${PROYECTO_ROOT}/adn/tools/run"
ADN_CLI="${ADN_TOOLS_DIR}/run"
CONFIG_FILE="${ADN_TOOLS_DIR}/config/config.yml"
HOOK_NAME="pre-commit ADN"
@@ -50,13 +50,40 @@ verificar_prerequisitos() {
return 1
fi
# Verificar CLI ADN
if [[ ! -f "${ADN_CLI}" ]]; then
log_error "Herramienta ADN no encontrada: ${ADN_CLI}"
# Verificar CLI ADN (con múltiples rutas posibles)
local cli_encontrada=0
local posibles_rutas=(
"${ADN_CLI}"
"${PROYECTO_ROOT}/adn/tools/run"
"./adn/tools/run"
"adn/tools/run"
)
for ruta in "${posibles_rutas[@]}"; do
if [[ -f "$ruta" ]]; then
ADN_CLI="$ruta"
cli_encontrada=1
break
fi
done
if [[ $cli_encontrada -eq 0 ]]; then
log_error "Herramienta ADN no encontrada en ninguna ruta esperada."
log_info "Rutas probadas:"
for ruta in "${posibles_rutas[@]}"; do
log_info " - $ruta"
done
log_info "Ejecuta desde la raíz del proyecto o instala las herramientas ADN."
return 1
fi
# Verificar que la CLI sea ejecutable
if [[ ! -x "${ADN_CLI}" ]]; then
log_error "Herramienta ADN no es ejecutable: ${ADN_CLI}"
log_info "Ejecuta: chmod +x ${ADN_CLI}"
return 1
fi
return 0
}
@@ -92,8 +119,8 @@ validar_archivo() {
log_info "Validando $tipo: $nombre_archivo"
# Por ahora usamos el validador general (en el futuro podría haber validación por tipo)
# El validador general ya filtra por tipo de archivo
# Según el principio "Menos es Más", usamos el validador general unificado
# El validador ya filtra por tipo de archivo internamente
return 0
}
@@ -108,32 +135,56 @@ ejecutar_validacion() {
fi
log_info "Validando $cantidad_archivos archivo(s) del ADN..."
log_info "Principio aplicado: Armonía Integral - validando coherencia entre componentes"
# Ejecutar validador general
cd "${PROYECTO_ROOT}" || exit 1
# Ejecutar validador con opción --fix automática para correcciones menores
# Según "Mejora Continua", el validador ayuda a evolucionar el ADN
local output
if output=$(ruby "${ADN_CLI}" validador --fix 2>&1); then
local exit_code=0
log_info "Ejecutando: ruby ${ADN_CLI} validador --fix"
# Cambiar al directorio del proyecto para rutas relativas correctas
cd "${PROYECTO_ROOT}" || {
log_error "No se pudo cambiar al directorio del proyecto: ${PROYECTO_ROOT}"
return 1
}
output=$(ruby "${ADN_CLI}" validador --fix 2>&1)
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
# El validador exitó con éxito
if echo "$output" | grep -q "Con errores: 0"; then
if echo "$output" | grep -q "Con advertencias: 0"; then
log_exito "Validación del ADN completada sin errores ni advertencias."
log_exito "Validación del ADN completada sin errores ni advertencias."
log_exito "Principio aplicado: Armonía Integral - todos los componentes son coherentes"
else
log_advertencia "Validación del ADN completada con advertencias (revisa arriba)."
# Permitir commit a pesar de advertencias
log_advertencia "Validación del ADN completada con advertencias (revisa arriba)."
log_info "Principio aplicado: Mejora Continua - oportunidades de mejora identificadas"
# Permitir commit a pesar de advertencias (son oportunidades de mejora)
fi
return 0
else
log_error "Validación del ADN encontró errores. Corrígelos antes de commit."
log_error "Validación del ADN encontró errores. Corrígelos antes de commit."
log_info "Principio aplicado: Armonía Integral - se requiere coherencia antes de avanzar"
echo ""
echo "$output" | tail -20 # Mostrar últimas líneas del output
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "$output" | tail -30 # Mostrar más contexto del output
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
return 1
fi
else
# Error en la ejecución del validador
log_error "Error ejecutando el validador del ADN:"
log_error "Error ejecutando el validador del ADN (código: $exit_code):"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "$output"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info "Sugerencia: Ejecuta manualmente: ./adn/tools/run validador --fix"
return 1
fi
}
@@ -150,10 +201,12 @@ instalar_hook() {
log_info "Instalando hook pre-commit para validación ADN..."
# Copiar hook
# Copiar hook (seguir principio "Menos es Más" - reutilizar componente existente)
cp "${hook_source}" "${hook_dest}"
chmod +x "${hook_dest}"
log_info "Hook instalado como componente reutilizable en: ${hook_dest}"
# Verificar si ya existe un hook pre-commit previo
if [[ -f "${PROYECTO_ROOT}/.git/hooks/pre-commit" && ! -L "${PROYECTO_ROOT}/.git/hooks/pre-commit" ]] && \
! cmp -s "${hook_source}" "${hook_dest}"; then
@@ -161,8 +214,12 @@ instalar_hook() {
log_info "Si necesitas múltiples hooks, considera usar un gestor de hooks."
fi
log_exito "Hook pre-commit instalado en ${hook_dest}"
log_exito "Hook pre-commit instalado en ${hook_dest}"
log_info "Se ejecutará automáticamente en cada 'git commit'."
log_info "Principios aplicados:"
log_info " • Menos es Más - componente atómico y reutilizable"
log_info " • Armonía Integral - valida coherencia antes de cada commit"
log_info " • Mejora Continua - identifica oportunidades de mejora"
}
# ─── Ayuda ───────────────────────────────────────────────────────────────
@@ -184,6 +241,11 @@ mostrar_ayuda() {
echo " - Advertencias: Muestra alerta pero permite el commit"
echo " - Correcciones automáticas: Intenta corregir errores simples (--fix)"
echo ""
echo "Principios ADN aplicados:"
echo " • Menos es Más: Validador unificado, sin duplicación"
echo " • Armonía Integral: Valida coherencia entre componentes"
echo " • Mejora Continua: Identifica oportunidades de mejora"
echo ""
echo "Configuración: ${CONFIG_FILE}"
}
@@ -209,7 +271,10 @@ main() {
"")
# Modo hook normal (sin argumentos)
if ! verificar_prerequisitos; then
exit 0 # No fallar el commit si falta Ruby, solo advertir
# Según "Mejora Continua", no bloquear pero advertir para permitir evolución
log_advertencia "Prerequisitos incompletos, pero permitiendo commit para no bloquear trabajo."
log_info "Sugerencia: Ejecuta './adn/tools/hooks/pre-commit --install' para configurar correctamente."
exit 0
fi
ejecutar_validacion
exit $?