#!/bin/bash # ═══════════════════════════════════════════════════════════════════════════════ # VALIDADOR DE ESTRUCTURA DE REPOSITORIOS - NEXUS WORKSPACE # ═══════════════════════════════════════════════════════════════════════════════ # # Version: 1.0.0 # Fecha: 2026-01-03 # Proposito: Validar que proyectos, verticales y modulos cumplan estructura SIMCO # # Uso: # ./validate-repo-structure.sh [opciones] # # Opciones: # --workspace-path PATH Ruta al workspace (default: /home/isem/workspace-v1) # --verbose Mostrar detalles de cada verificacion # --only-projects Solo validar proyectos # --only-modules Solo validar modulos # --only-verticales Solo validar verticales # --help Mostrar esta ayuda # # Exit codes: # 0 - Todas las validaciones pasaron # 1 - Una o mas validaciones fallaron # # ═══════════════════════════════════════════════════════════════════════════════ set -e # ───────────────────────────────────────────────────────────────────────────────── # CONFIGURACION # ───────────────────────────────────────────────────────────────────────────────── WORKSPACE_PATH="/home/isem/workspace-v1" VERBOSE=false ONLY_PROJECTS=false ONLY_MODULES=false ONLY_VERTICALES=false # Contadores TOTAL_CHECKS=0 PASSED_CHECKS=0 FAILED_CHECKS=0 WARNINGS=0 # Colores (si terminal soporta) if [ -t 1 ]; then RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color else RED='' GREEN='' YELLOW='' BLUE='' NC='' fi # ───────────────────────────────────────────────────────────────────────────────── # FUNCIONES AUXILIARES # ───────────────────────────────────────────────────────────────────────────────── print_header() { echo "" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo -e "${BLUE} $1${NC}" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo "" } print_section() { echo "" echo -e "${BLUE}[CHECK] $1${NC}" echo "─────────────────────────────────────────────────────────────────" } log_ok() { echo -e " ${GREEN}[OK]${NC} $1" ((PASSED_CHECKS++)) ((TOTAL_CHECKS++)) } log_fail() { echo -e " ${RED}[FAIL]${NC} $1" ((FAILED_CHECKS++)) ((TOTAL_CHECKS++)) } log_warn() { echo -e " ${YELLOW}[WARN]${NC} $1" ((WARNINGS++)) } log_info() { if [ "$VERBOSE" = true ]; then echo -e " ${BLUE}[INFO]${NC} $1" fi } show_help() { head -30 "$0" | tail -25 exit 0 } # ───────────────────────────────────────────────────────────────────────────────── # PARSEO DE ARGUMENTOS # ───────────────────────────────────────────────────────────────────────────────── while [[ $# -gt 0 ]]; do case $1 in --workspace-path) WORKSPACE_PATH="$2" shift 2 ;; --verbose) VERBOSE=true shift ;; --only-projects) ONLY_PROJECTS=true shift ;; --only-modules) ONLY_MODULES=true shift ;; --only-verticales) ONLY_VERTICALES=true shift ;; --help|-h) show_help ;; *) echo "Opcion desconocida: $1" show_help ;; esac done # ───────────────────────────────────────────────────────────────────────────────── # VALIDACION DE PREREQUISITOS # ───────────────────────────────────────────────────────────────────────────────── if [ ! -d "$WORKSPACE_PATH" ]; then echo -e "${RED}ERROR: Workspace no encontrado en $WORKSPACE_PATH${NC}" exit 1 fi # ───────────────────────────────────────────────────────────────────────────────── # VALIDACION DE PROYECTOS # ───────────────────────────────────────────────────────────────────────────────── validate_projects() { print_section "Proyectos con orchestration/" local projects_path="$WORKSPACE_PATH/projects" if [ ! -d "$projects_path" ]; then log_warn "Directorio projects/ no encontrado" return fi for project_dir in "$projects_path"/*/; do if [ -d "$project_dir" ]; then local project_name=$(basename "$project_dir") local orch_path="$project_dir/orchestration" local guidelines_path="$orch_path/00-guidelines" # Verificar orchestration/ if [ -d "$orch_path" ]; then log_ok "$project_name - orchestration/ existe" # Verificar 00-guidelines/ if [ -d "$guidelines_path" ]; then log_info "$project_name - 00-guidelines/ existe" # Verificar CONTEXTO-PROYECTO.md if [ -f "$guidelines_path/CONTEXTO-PROYECTO.md" ]; then log_ok "$project_name - CONTEXTO-PROYECTO.md existe" else log_fail "$project_name - Falta CONTEXTO-PROYECTO.md" fi # Verificar HERENCIA-SIMCO.md if [ -f "$guidelines_path/HERENCIA-SIMCO.md" ]; then log_ok "$project_name - HERENCIA-SIMCO.md existe" else log_fail "$project_name - Falta HERENCIA-SIMCO.md" fi else log_fail "$project_name - Falta 00-guidelines/" fi # Verificar inventarios/ if [ -d "$orch_path/inventarios" ]; then log_info "$project_name - inventarios/ existe" else log_warn "$project_name - Falta inventarios/" fi # Verificar trazas/ if [ -d "$orch_path/trazas" ]; then log_info "$project_name - trazas/ existe" else log_warn "$project_name - Falta trazas/" fi else log_fail "$project_name - Falta orchestration/" fi fi done } # ───────────────────────────────────────────────────────────────────────────────── # VALIDACION DE VERTICALES # ───────────────────────────────────────────────────────────────────────────────── validate_verticales() { print_section "Verticales con estructura correcta" local suites_with_verticales=() # Buscar suites que tengan verticales for project_dir in "$WORKSPACE_PATH/projects"/*/; do local verticales_path="$project_dir/apps/verticales" if [ -d "$verticales_path" ]; then suites_with_verticales+=("$project_dir") fi done if [ ${#suites_with_verticales[@]} -eq 0 ]; then log_info "No se encontraron suites con verticales" return fi for suite_dir in "${suites_with_verticales[@]}"; do local suite_name=$(basename "$suite_dir") local verticales_path="$suite_dir/apps/verticales" for vertical_dir in "$verticales_path"/*/; do if [ -d "$vertical_dir" ]; then local vertical_name=$(basename "$vertical_dir") local orch_path="$vertical_dir/orchestration" local guidelines_path="$orch_path/00-guidelines" echo "" echo " Vertical: $suite_name/$vertical_name" # Verificar orchestration/ if [ -d "$orch_path" ]; then log_ok "$vertical_name - orchestration/ existe" # Verificar HERENCIA-ERP-CORE.md (especifico de verticales) if [ -f "$guidelines_path/HERENCIA-ERP-CORE.md" ]; then log_ok "$vertical_name - HERENCIA-ERP-CORE.md existe" else log_fail "$vertical_name - Falta HERENCIA-ERP-CORE.md" fi # Verificar CONTEXTO-PROYECTO.md if [ -f "$guidelines_path/CONTEXTO-PROYECTO.md" ]; then log_ok "$vertical_name - CONTEXTO-PROYECTO.md existe" else log_fail "$vertical_name - Falta CONTEXTO-PROYECTO.md" fi # Verificar DEPENDENCIAS-CORE.yml if [ -f "$orch_path/referencias/DEPENDENCIAS-CORE.yml" ]; then log_ok "$vertical_name - DEPENDENCIAS-CORE.yml existe" else log_warn "$vertical_name - Falta DEPENDENCIAS-CORE.yml" fi else log_fail "$vertical_name - Falta orchestration/" fi fi done done } # ───────────────────────────────────────────────────────────────────────────────── # VALIDACION DE MODULOS # ───────────────────────────────────────────────────────────────────────────────── validate_modules() { print_section "Modulos en core/modules/ con README.md" local modules_path="$WORKSPACE_PATH/core/modules" if [ ! -d "$modules_path" ]; then log_warn "Directorio core/modules/ no encontrado" return fi for module_dir in "$modules_path"/*/; do if [ -d "$module_dir" ]; then local module_name=$(basename "$module_dir") # Verificar README.md if [ -f "$module_dir/README.md" ]; then log_ok "$module_name - README.md existe" else log_fail "$module_name - Falta README.md" fi # Verificar index.ts if [ -f "$module_dir/index.ts" ]; then log_info "$module_name - index.ts existe" else log_warn "$module_name - Falta index.ts (punto de entrada)" fi fi done } # ───────────────────────────────────────────────────────────────────────────────── # VALIDACION DE CORE/ORCHESTRATION # ───────────────────────────────────────────────────────────────────────────────── validate_core_orchestration() { print_section "Core orchestration estructura" local core_orch="$WORKSPACE_PATH/core/orchestration" if [ ! -d "$core_orch" ]; then # Intentar en orchestration/ del workspace core_orch="$WORKSPACE_PATH/orchestration" fi if [ ! -d "$core_orch" ]; then log_fail "No se encontro core/orchestration/ ni orchestration/" return fi # Verificar directivas/simco/ if [ -d "$core_orch/directivas/simco" ]; then log_ok "directivas/simco/ existe" # Verificar _INDEX.md if [ -f "$core_orch/directivas/simco/_INDEX.md" ]; then log_ok "directivas/simco/_INDEX.md existe" else log_fail "Falta directivas/simco/_INDEX.md" fi else log_fail "Falta directivas/simco/" fi # Verificar directivas/principios/ if [ -d "$core_orch/directivas/principios" ]; then log_ok "directivas/principios/ existe" local principios=("PRINCIPIO-CAPVED.md" "PRINCIPIO-DOC-PRIMERO.md" "PRINCIPIO-ANTI-DUPLICACION.md" "PRINCIPIO-VALIDACION-OBLIGATORIA.md" "PRINCIPIO-ECONOMIA-TOKENS.md" "PRINCIPIO-NO-ASUMIR.md") for principio in "${principios[@]}"; do if [ -f "$core_orch/directivas/principios/$principio" ]; then log_info "$principio existe" else log_fail "Falta $principio" fi done else log_fail "Falta directivas/principios/" fi # Verificar agents/perfiles/ if [ -d "$core_orch/agents/perfiles" ]; then log_ok "agents/perfiles/ existe" else log_warn "Falta agents/perfiles/" fi # Verificar templates/ if [ -d "$core_orch/templates" ]; then log_ok "templates/ existe" else log_warn "Falta templates/" fi # Verificar referencias/ALIASES.yml if [ -f "$core_orch/referencias/ALIASES.yml" ]; then log_ok "referencias/ALIASES.yml existe" else log_fail "Falta referencias/ALIASES.yml" fi } # ───────────────────────────────────────────────────────────────────────────────── # REPORTE FINAL # ───────────────────────────────────────────────────────────────────────────────── print_report() { print_header "REPORTE FINAL" echo " Total de verificaciones: $TOTAL_CHECKS" echo -e " ${GREEN}Exitosas:${NC} $PASSED_CHECKS" echo -e " ${RED}Fallidas:${NC} $FAILED_CHECKS" echo -e " ${YELLOW}Advertencias:${NC} $WARNINGS" echo "" if [ $FAILED_CHECKS -eq 0 ]; then echo -e "${GREEN}═══════════════════════════════════════════════════════════════${NC}" echo -e "${GREEN} RESULTADO: TODAS LAS VALIDACIONES PASARON${NC}" echo -e "${GREEN}═══════════════════════════════════════════════════════════════${NC}" return 0 else echo -e "${RED}═══════════════════════════════════════════════════════════════${NC}" echo -e "${RED} RESULTADO: $FAILED_CHECKS ERRORES ENCONTRADOS${NC}" echo -e "${RED}═══════════════════════════════════════════════════════════════${NC}" return 1 fi } # ───────────────────────────────────────────────────────────────────────────────── # EJECUCION PRINCIPAL # ───────────────────────────────────────────────────────────────────────────────── main() { print_header "VALIDACION DE ESTRUCTURA DE REPOSITORIOS" echo " Workspace: $WORKSPACE_PATH" echo " Fecha: $(date '+%Y-%m-%d %H:%M:%S')" # Ejecutar validaciones segun filtros if [ "$ONLY_PROJECTS" = true ]; then validate_projects elif [ "$ONLY_MODULES" = true ]; then validate_modules elif [ "$ONLY_VERTICALES" = true ]; then validate_verticales else # Todas las validaciones validate_core_orchestration validate_projects validate_verticales validate_modules fi # Mostrar reporte print_report exit_code=$? exit $exit_code } # Ejecutar main