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
449 lines
18 KiB
Bash
Executable File
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
|