#!/bin/bash # validate-code-integrity.sh - EPIC-008 # Valida que el codigo funcional permanece intacto durante purga # Version: 1.0.0 set -e PROJECT=$1 MODE=$2 PROJECT_PATH="/home/isem/workspace-v1/projects/$PROJECT" BACKUP_PATH="/home/isem/workspace-v1-bckp/projects/$PROJECT" BASELINE_FILE="$PROJECT_PATH/.code-checksums.txt" # Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # Validar argumento if [ -z "$PROJECT" ]; then echo -e "${RED}ERROR: Uso: $0 [--generate-baseline]${NC}" echo "Ejemplo: $0 gamilit" echo "Ejemplo: $0 gamilit --generate-baseline" exit 1 fi # Validar proyecto existe if [ ! -d "$PROJECT_PATH" ]; then echo -e "${RED}ERROR: Proyecto '$PROJECT' no existe${NC}" exit 1 fi # Funcion para generar checksums de codigo generate_checksums() { local path=$1 local checksums="" # Archivos TypeScript/JavaScript en apps/ if [ -d "$path/apps" ]; then checksums+=$(find "$path/apps" -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) \ ! -path "*/node_modules/*" ! -path "*/.next/*" ! -path "*/dist/*" ! -path "*/.turbo/*" \ -exec md5sum {} \; 2>/dev/null | sort) checksums+=$'\n' fi # Archivos SQL en database/ if [ -d "$path/database" ]; then checksums+=$(find "$path/database" -type f \( -name "*.sql" -o -name "*.ts" \) \ -exec md5sum {} \; 2>/dev/null | sort) fi echo "$checksums" } # Modo: Generar baseline if [ "$MODE" == "--generate-baseline" ]; then echo "=== GENERANDO BASELINE DE CHECKSUMS: $PROJECT ===" echo "" generate_checksums "$PROJECT_PATH" > "$BASELINE_FILE" total=$(wc -l < "$BASELINE_FILE" 2>/dev/null || echo 0) echo -e "${GREEN}Baseline guardado: $BASELINE_FILE${NC}" echo "Total archivos: $total" exit 0 fi # Modo: Validacion echo "=== VALIDACION DE INTEGRIDAD: $PROJECT ===" echo "" APPS_OK=true DB_OK=true CONFIGS_OK=true TOTAL_DIFFS=0 # 1. Comparar apps/ con backup echo "Comparando apps/..." if [ -d "$BACKUP_PATH/apps" ] && [ -d "$PROJECT_PATH/apps" ]; then diff_output=$(diff -rq "$BACKUP_PATH/apps" "$PROJECT_PATH/apps" \ --exclude="node_modules" --exclude=".next" --exclude="dist" --exclude=".turbo" \ --exclude=".cache" --exclude="coverage" --exclude=".nyc_output" 2>&1 || true) if [ -z "$diff_output" ]; then echo -e " apps/: ${GREEN}IDENTICO${NC}" else echo -e " apps/: ${RED}DIFERENCIAS DETECTADAS${NC}" APPS_OK=false diff_count=$(echo "$diff_output" | wc -l) TOTAL_DIFFS=$((TOTAL_DIFFS + diff_count)) fi elif [ ! -d "$BACKUP_PATH/apps" ]; then echo -e " apps/: ${YELLOW}NO EXISTE EN BACKUP${NC}" else echo -e " apps/: ${YELLOW}NO EXISTE EN PROYECTO${NC}" fi # 2. Comparar database/ con backup echo "Comparando database/..." if [ -d "$BACKUP_PATH/database" ] && [ -d "$PROJECT_PATH/database" ]; then diff_output=$(diff -rq "$BACKUP_PATH/database" "$PROJECT_PATH/database" 2>&1 || true) if [ -z "$diff_output" ]; then echo -e " database/: ${GREEN}IDENTICO${NC}" else echo -e " database/: ${RED}DIFERENCIAS DETECTADAS${NC}" DB_OK=false diff_count=$(echo "$diff_output" | wc -l) TOTAL_DIFFS=$((TOTAL_DIFFS + diff_count)) fi elif [ ! -d "$BACKUP_PATH/database" ]; then echo -e " database/: ${YELLOW}NO EXISTE EN BACKUP (OK)${NC}" else echo -e " database/: ${YELLOW}NO EXISTE EN PROYECTO${NC}" fi # 3. Comparar archivos de configuracion echo "Comparando configuraciones..." for config in package.json tsconfig.json docker-compose.yml; do if [ -f "$BACKUP_PATH/$config" ] && [ -f "$PROJECT_PATH/$config" ]; then if diff -q "$BACKUP_PATH/$config" "$PROJECT_PATH/$config" > /dev/null 2>&1; then echo -e " $config: ${GREEN}IDENTICO${NC}" else echo -e " $config: ${YELLOW}DIFERENTE${NC}" # No marcamos como error, solo warning fi elif [ -f "$BACKUP_PATH/$config" ]; then echo -e " $config: ${YELLOW}FALTA EN PROYECTO${NC}" fi done # Resultado final echo "" echo "=== RESULTADO ===" if [ "$APPS_OK" = true ] && [ "$DB_OK" = true ]; then echo -e "${GREEN}PASS: Codigo funcional intacto${NC}" echo "" echo "Resumen:" echo " apps/: OK" echo " database/: OK" echo " diferencias: 0" exit 0 else echo -e "${RED}FAIL: Se detectaron diferencias en codigo funcional${NC}" echo "" echo "Resumen:" echo " apps/: $([ "$APPS_OK" = true ] && echo "OK" || echo "DIFERENCIAS")" echo " database/: $([ "$DB_OK" = true ] && echo "OK" || echo "DIFERENCIAS")" echo " total_diferencias: $TOTAL_DIFFS" echo "" echo -e "${YELLOW}ADVERTENCIA: Verificar manualmente antes de continuar${NC}" exit 1 fi