#!/bin/bash # ============================================================================= # generate-propagation-report.sh # Genera dashboard visual de estado de modulos # Sistema: NEXUS v3.4 # ============================================================================= # # Descripcion: # Genera un reporte ASCII art formateado mostrando el estado de todos # los modulos del knowledge-base, que proyectos los usan, y cuales # estan desactualizados. # # Uso: # ./generate-propagation-report.sh [opciones] # # Opciones: # --no-color Output sin codigos ANSI # --markdown Generar reporte en formato Markdown # --output FILE Guardar reporte en archivo # --help Mostrar esta ayuda # # ============================================================================= set -e # Colores (se pueden desactivar con --no-color) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' WHITE='\033[1;37m' NC='\033[0m' # Configuracion WORKSPACE="/home/isem/workspace-v1" KB_PATH="$WORKSPACE/shared/knowledge-base" TRAZABILIDAD="$KB_PATH/TRAZABILIDAD-PROYECTOS.yml" REGISTRO="$KB_PATH/propagacion/REGISTRO-PROPAGACIONES.yml" # Parametros NO_COLOR=false MARKDOWN=false OUTPUT_FILE="" # Contadores TOTAL_MODULOS=0 TOTAL_PROYECTOS=0 PROPAGACIONES_PENDIENTES=0 EVALUACIONES_PENDIENTES=0 # ============================================================================= # FUNCIONES # ============================================================================= show_help() { head -25 "$0" | tail -20 exit 0 } parse_args() { while [[ $# -gt 0 ]]; do case $1 in --help) show_help ;; --no-color) NO_COLOR=true RED='' GREEN='' YELLOW='' BLUE='' CYAN='' WHITE='' NC='' shift ;; --markdown) MARKDOWN=true NO_COLOR=true RED='' GREEN='' YELLOW='' BLUE='' CYAN='' WHITE='' NC='' shift ;; --output) OUTPUT_FILE=$2 shift 2 ;; *) shift ;; esac done } check_files() { if [ ! -f "$TRAZABILIDAD" ]; then echo "ERROR: TRAZABILIDAD-PROYECTOS.yml no encontrado" exit 2 fi } print_header() { if $MARKDOWN; then echo "# Estado de Modulos - NEXUS v3.4" echo "" echo "**Generado:** $(date '+%Y-%m-%d %H:%M:%S')" echo "" else echo "" echo "====================================================================" echo " ESTADO DE MODULOS - NEXUS v3.4" echo "====================================================================" echo "" fi } get_kb_version() { local modulo=$1 grep "^ $modulo:" "$TRAZABILIDAD" 2>/dev/null | head -1 | sed 's/.*: *"*//; s/"*$//' } get_projects_for_module() { local modulo=$1 grep -A20 "^ $modulo:" "$TRAZABILIDAD" 2>/dev/null | grep "^ - " | sed 's/^ - //' } get_project_version() { local proyecto=$1 local modulo=$2 grep -A50 "^ $proyecto:" "$TRAZABILIDAD" 2>/dev/null | grep "$modulo:" | head -1 | sed 's/.*: *"*//; s/"*$//' } print_module_section() { local modulo=$1 local kb_version=$2 TOTAL_MODULOS=$((TOTAL_MODULOS + 1)) if $MARKDOWN; then echo "## $modulo (v$kb_version)" echo "" echo "| Proyecto | Version | Estado |" echo "|----------|---------|--------|" else echo -e " ${CYAN}$modulo${NC} (v$kb_version)" fi local proyectos=$(get_projects_for_module "$modulo") if [ -z "$proyectos" ]; then if $MARKDOWN; then echo "| - | - | Sin proyectos |" else echo " (sin proyectos usando este modulo)" fi echo "" return fi for proyecto in $proyectos; do TOTAL_PROYECTOS=$((TOTAL_PROYECTOS + 1)) local project_version=$(get_project_version "$proyecto" "$modulo") if [ -z "$project_version" ]; then project_version="?" fi local status_icon="" local status_text="" if [ "$kb_version" == "$project_version" ]; then status_icon="${GREEN}[OK]${NC}" status_text="OK" else PROPAGACIONES_PENDIENTES=$((PROPAGACIONES_PENDIENTES + 1)) status_icon="${YELLOW}[!!]${NC}" status_text="DESACTUALIZADO" fi if $MARKDOWN; then echo "| $proyecto | $project_version | $status_text |" else # Padding para alineacion local padding="................" local name_len=${#proyecto} local pad_len=$((20 - name_len)) if [ $pad_len -lt 1 ]; then pad_len=1; fi local dots="${padding:0:$pad_len}" echo -e " +-- $proyecto $dots $status_icon v$project_version" fi done echo "" } print_legend() { if $MARKDOWN; then echo "---" echo "" echo "**Leyenda:**" echo "- OK = Al dia" echo "- DESACTUALIZADO = Requiere propagacion" echo "- EVALUANDO = En evaluacion" echo "" else echo "--------------------------------------------------------------------" echo -e "LEYENDA: ${GREEN}[OK]${NC} Al dia ${YELLOW}[!!]${NC} Desactualizado ${BLUE}[??]${NC} Evaluando" echo "--------------------------------------------------------------------" fi } print_summary() { echo "" if $MARKDOWN; then echo "## Resumen" echo "" echo "| Metrica | Valor |" echo "|---------|-------|" echo "| Modulos trackeados | $TOTAL_MODULOS |" echo "| Relaciones proyecto-modulo | $TOTAL_PROYECTOS |" echo "| Propagaciones pendientes | $PROPAGACIONES_PENDIENTES |" echo "" else echo "RESUMEN:" echo " - Modulos trackeados: $TOTAL_MODULOS" echo " - Relaciones proyecto-modulo: $TOTAL_PROYECTOS" echo " - Propagaciones pendientes: $PROPAGACIONES_PENDIENTES" echo "" fi } print_footer() { if $MARKDOWN; then echo "---" echo "" echo "*Generado por generate-propagation-report.sh*" else echo "Ultima actualizacion: $(date '+%Y-%m-%d %H:%M:%S')" echo "====================================================================" echo "" fi } generate_report() { print_header # Obtener modulos principales del indice inverso local modulos="auth-jwt-nestjs payments-stripe-checkout payments-stripe-subscriptions users-roles-permissions ui-admin-dashboard" for modulo in $modulos; do local kb_version=$(get_kb_version "$modulo") if [ -n "$kb_version" ]; then print_module_section "$modulo" "$kb_version" fi done print_legend print_summary print_footer } # ============================================================================= # MAIN # ============================================================================= main() { parse_args "$@" check_files if [ -n "$OUTPUT_FILE" ]; then generate_report > "$OUTPUT_FILE" echo "Reporte guardado en: $OUTPUT_FILE" else generate_report fi exit 0 } main "$@"