#!/bin/bash # ============================================================================= # validate-propagation-chain.sh # Valida integridad post-propagacion # Version: 1.0.0 # Sistema: NEXUS v3.4 + SIMCO + CAPVED # EPIC: EPIC-012 # ============================================================================= # # Uso: # ./validate-propagation-chain.sh # ./validate-propagation-chain.sh --all # ./validate-propagation-chain.sh --last # # Parametros: # propagacion_id ID de propagacion (ej: PROP-2026-001) # --all Validar todas las propagaciones recientes # --last Validar ultima propagacion registrada # # Validaciones: # 1. REGISTRO-PROPAGACIONES.yml tiene entrada # 2. TRAZABILIDAD-PROYECTOS.yml versiones actualizadas # 3. HERENCIA-SIMCO.md de proyectos actualizados # 4. PROJECT-STATUS.md menciona propagacion (opcional) # 5. Versiones consistentes entre archivos # # Ejemplo: # ./validate-propagation-chain.sh PROP-2026-001 # # ============================================================================= set -e # Configuracion SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" KB_PATH="/home/isem/workspace-v1/shared/knowledge-base" REGISTRO="$KB_PATH/propagacion/REGISTRO-PROPAGACIONES.yml" TRAZABILIDAD="$KB_PATH/TRAZABILIDAD-PROYECTOS.yml" PROJECTS_PATH="/home/isem/workspace-v1/projects" # Colores GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Contadores PASS=0 FAIL=0 WARN=0 # Funciones de logging check_pass() { ((PASS++)); echo -e " ${GREEN}[PASS]${NC} $1"; } check_fail() { ((FAIL++)); echo -e " ${RED}[FAIL]${NC} $1"; } check_warn() { ((WARN++)); echo -e " ${YELLOW}[WARN]${NC} $1"; } log_info() { echo -e " ${BLUE}[INFO]${NC} $1"; } # Funcion de ayuda show_help() { head -32 "$0" | tail -25 exit 0 } # Parsear argumentos if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then show_help fi PROP_ID="${1:-}" if [ -z "$PROP_ID" ]; then echo -e "${RED}ERROR:${NC} Debe especificar un ID de propagacion" echo "Uso: $0 | --all | --last" exit 1 fi # Manejar --last if [ "$PROP_ID" == "--last" ]; then if [ -f "$REGISTRO" ]; then PROP_ID=$(grep -E "^ - id:" "$REGISTRO" 2>/dev/null | tail -1 | sed 's/.*id: *//' | tr -d '"' || echo "") if [ -z "$PROP_ID" ]; then echo -e "${RED}ERROR:${NC} No se encontraron propagaciones en el registro" exit 1 fi echo "Usando ultima propagacion: $PROP_ID" else echo -e "${RED}ERROR:${NC} REGISTRO-PROPAGACIONES.yml no existe" exit 1 fi fi # Manejar --all (simplificado - solo muestra resumen) if [ "$PROP_ID" == "--all" ]; then echo "╔═══════════════════════════════════════════════════════════════╗" echo "║ VALIDACION DE TODAS LAS PROPAGACIONES ║" echo "╚═══════════════════════════════════════════════════════════════╝" echo "" if [ -f "$REGISTRO" ]; then PROP_IDS=$(grep -E "^ - id:" "$REGISTRO" 2>/dev/null | sed 's/.*id: *//' | tr -d '"' || echo "") if [ -z "$PROP_IDS" ]; then echo "No se encontraron propagaciones en el registro" exit 0 fi echo "$PROP_IDS" | while read -r pid; do if [ -n "$pid" ]; then echo " - $pid" fi done echo "" echo "Para validar una especifica: $0 " else echo "REGISTRO-PROPAGACIONES.yml no existe" fi exit 0 fi echo "╔═══════════════════════════════════════════════════════════════╗" echo "║ VALIDACION DE CADENA DE PROPAGACION ║" echo "║ ID: $PROP_ID" echo "╚═══════════════════════════════════════════════════════════════╝" echo "" # ============================================================================= # 1. Verificar REGISTRO-PROPAGACIONES.yml # ============================================================================= echo "=== 1. REGISTRO-PROPAGACIONES.yml ===" if [ -f "$REGISTRO" ]; then if grep -q "$PROP_ID" "$REGISTRO" 2>/dev/null; then check_pass "Propagacion registrada en REGISTRO-PROPAGACIONES.yml" # Extraer informacion de la propagacion MODULO=$(grep -A10 "$PROP_ID" "$REGISTRO" | grep "modulo:" | head -1 | sed 's/.*modulo: *//' | tr -d '"' || echo "desconocido") VERSION=$(grep -A10 "$PROP_ID" "$REGISTRO" | grep "version:" | head -1 | sed 's/.*version: *//' | tr -d '"' || echo "desconocida") log_info "Modulo: $MODULO, Version: $VERSION" else check_fail "Propagacion NO encontrada en registro" MODULO="desconocido" VERSION="desconocida" fi else check_fail "REGISTRO-PROPAGACIONES.yml no existe" MODULO="desconocido" VERSION="desconocida" fi echo "" # ============================================================================= # 2. Verificar TRAZABILIDAD-PROYECTOS.yml # ============================================================================= echo "=== 2. TRAZABILIDAD-PROYECTOS.yml ===" if [ -f "$TRAZABILIDAD" ]; then check_pass "Archivo existe" if [ "$MODULO" != "desconocido" ]; then if grep -q "$MODULO" "$TRAZABILIDAD" 2>/dev/null; then check_pass "Modulo $MODULO referenciado en trazabilidad" else check_warn "Modulo $MODULO no encontrado en trazabilidad" fi fi else check_fail "TRAZABILIDAD-PROYECTOS.yml no existe" fi echo "" # ============================================================================= # 3. Verificar HERENCIA-SIMCO.md de proyectos # ============================================================================= echo "=== 3. HERENCIA-SIMCO.md de proyectos ===" PROYECTOS=("gamilit" "trading-platform" "erp-core" "erp-suite") for proj in "${PROYECTOS[@]}"; do HERENCIA="$PROJECTS_PATH/$proj/orchestration/00-guidelines/HERENCIA-SIMCO.md" if [ -f "$HERENCIA" ]; then # Verificar si tiene seccion de propagacion if grep -qi "propagacion" "$HERENCIA" 2>/dev/null; then check_pass "$proj: Seccion de propagacion existe" else check_warn "$proj: Sin seccion de propagacion" fi else # Intentar ruta alternativa HERENCIA_ALT="$PROJECTS_PATH/$proj/orchestration/HERENCIA-SIMCO.md" if [ -f "$HERENCIA_ALT" ]; then check_pass "$proj: HERENCIA-SIMCO.md existe (ruta alternativa)" else check_warn "$proj: HERENCIA-SIMCO.md no encontrado" fi fi done echo "" # ============================================================================= # 4. Verificar PROJECT-STATUS.md (opcional) # ============================================================================= echo "=== 4. PROJECT-STATUS.md (opcional) ===" for proj in "${PROYECTOS[@]}"; do STATUS="$PROJECTS_PATH/$proj/orchestration/00-guidelines/PROJECT-STATUS.md" if [ -f "$STATUS" ]; then log_info "$proj: PROJECT-STATUS.md existe" else # No es error, es opcional log_info "$proj: Sin PROJECT-STATUS.md (opcional)" fi done echo "" # ============================================================================= # 5. Verificar consistencia de versiones # ============================================================================= echo "=== 5. Consistencia de versiones ===" if [ "$MODULO" != "desconocido" ] && [ "$VERSION" != "desconocida" ]; then # Verificar en NIVELES-PROPAGACION.yml NIVELES_FILE="$KB_PATH/propagacion/NIVELES-PROPAGACION.yml" if [ -f "$NIVELES_FILE" ]; then check_pass "NIVELES-PROPAGACION.yml existe" else check_warn "NIVELES-PROPAGACION.yml no existe" fi # Verificar PROTOCOLO-COORDINACION.yml PROTOCOLO_FILE="$KB_PATH/propagacion/PROTOCOLO-COORDINACION.yml" if [ -f "$PROTOCOLO_FILE" ]; then check_pass "PROTOCOLO-COORDINACION.yml existe" else check_warn "PROTOCOLO-COORDINACION.yml no existe" fi else check_warn "No se puede verificar versiones (modulo/version desconocidos)" fi echo "" # ============================================================================= # 6. Verificar scripts de propagacion # ============================================================================= echo "=== 6. Scripts de propagacion ===" SCRIPTS=( "$SCRIPT_DIR/propagate-module-update.sh" "$SCRIPT_DIR/generate-scrum-tasks.sh" "$SCRIPT_DIR/cascade-propagation.sh" "$SCRIPT_DIR/validate-propagation-chain.sh" ) for script in "${SCRIPTS[@]}"; do SCRIPT_NAME=$(basename "$script") if [ -f "$script" ]; then if [ -x "$script" ]; then check_pass "$SCRIPT_NAME ejecutable" else check_warn "$SCRIPT_NAME existe pero no es ejecutable" fi else check_fail "$SCRIPT_NAME no existe" fi done echo "" # ============================================================================= # Resumen # ============================================================================= echo "═══════════════════════════════════════════════════════════════" echo " RESUMEN DE VALIDACION" echo "═══════════════════════════════════════════════════════════════" echo "" echo -e " ${GREEN}PASS:${NC} $PASS" echo -e " ${YELLOW}WARN:${NC} $WARN" echo -e " ${RED}FAIL:${NC} $FAIL" echo "" # Calcular porcentaje TOTAL=$((PASS + WARN + FAIL)) if [ $TOTAL -gt 0 ]; then PERCENT=$((PASS * 100 / TOTAL)) echo " Porcentaje de exito: ${PERCENT}%" echo "" fi # Resultado final if [ $FAIL -eq 0 ]; then if [ $WARN -eq 0 ]; then echo -e "${GREEN}[VALIDACION EXITOSA]${NC} Cadena de propagacion integra" else echo -e "${YELLOW}[VALIDACION CON ADVERTENCIAS]${NC} Revisar warnings" fi exit 0 else echo -e "${RED}[VALIDACION FALLIDA]${NC} Hay errores que corregir" exit 1 fi