diff --git a/adn/tools/hooks/pre-commit b/adn/tools/hooks/pre-commit index 05344b3f..6b5f6632 100755 --- a/adn/tools/hooks/pre-commit +++ b/adn/tools/hooks/pre-commit @@ -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 $?