workspace-v1/devtools/scripts/validation/validate-repo-structure.sh
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

449 lines
18 KiB
Bash
Executable File

#!/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