workspace-v1/devtools/scripts/propagation/propagate-module-update.sh
rckrdmrd fa13a9760d chore: Configurar arquitectura de subrepositorios
Cambios principales:
- Actualizar .gitmodules: gamilit usa HTTPS (github.com)
- Actualizar .gitignore: ignorar proyectos con repos en Gitea
- Crear SUBREPOSITORIOS.md: documentacion de arquitectura de repos
- Actualizar submodulo gamilit: sincronizado con workspace desarrollo

Proyectos removidos del tracking (4050 archivos):
- erp-suite, erp-core, erp-construccion, erp-clinicas
- erp-retail, erp-mecanicas-diesel, erp-vidrio-templado
- trading-platform, betting-analytics, inmobiliaria-analytics
- platform_marketing_content

Estos proyectos tienen repositorios independientes en Gitea:
http://72.60.226.4:3000/rckrdmrd/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 05:27:54 -06:00

406 lines
11 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# propagate-module-update.sh
# Sistema de Propagacion de Mejoras - NEXUS v3.4
# =============================================================================
#
# Descripcion:
# Identifica todos los proyectos que usan un modulo especificado y genera
# una lista de propagaciones pendientes, excluyendo el proyecto origen.
#
# Uso:
# ./propagate-module-update.sh <modulo> <version_nueva> <proyecto_origen> [opciones]
#
# Opciones:
# --dry-run Simular sin modificar archivos
# --update-registry Actualizar REGISTRO-PROPAGACIONES.yml
# --scrum Generar tareas SCRUM formales (usa generate-scrum-tasks.sh)
# --scrum-epic Generar EPIC contenedora (combina con --scrum)
# --cascade Ejecutar propagacion por niveles (usa cascade-propagation.sh)
# --tipo TIPO Tipo de cambio: security-fix|bug-fix|feature|refactor (default: feature)
# --help Mostrar esta ayuda
#
# Ejemplos:
# ./propagate-module-update.sh auth-jwt-nestjs 2.2.0 gamilit
# ./propagate-module-update.sh stripe-subscriptions 3.0.0 trading-platform --dry-run
#
# Exit codes:
# 0 - Exito
# 1 - Error en parametros
# 2 - Modulo no encontrado en KB
# 3 - Sin proyectos para propagar
#
# Directiva: @PROPAGACION
# =============================================================================
set -e
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuracion
WORKSPACE="/home/isem/workspace-v1"
KB_PATH="$WORKSPACE/shared/knowledge-base"
CATALOGO="$KB_PATH/CATALOGO-MODULOS.yml"
TRAZABILIDAD="$KB_PATH/TRAZABILIDAD-PROYECTOS.yml"
REGISTRO="$KB_PATH/propagacion/REGISTRO-PROPAGACIONES.yml"
PROJECTS_PATH="$WORKSPACE/projects"
# Parametros
MODULO=""
VERSION=""
ORIGEN=""
DRY_RUN=false
UPDATE_REGISTRY=false
GENERATE_SCRUM=false
SCRUM_EPIC=false
CASCADE_MODE=false
TIPO="feature"
# Directorio del script (para llamar a otros scripts)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# =============================================================================
# FUNCIONES
# =============================================================================
show_help() {
head -35 "$0" | tail -30
exit 0
}
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[OK]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
--help)
show_help
;;
--dry-run)
DRY_RUN=true
shift
;;
--update-registry)
UPDATE_REGISTRY=true
shift
;;
--scrum)
GENERATE_SCRUM=true
shift
;;
--scrum-epic)
SCRUM_EPIC=true
shift
;;
--cascade)
CASCADE_MODE=true
shift
;;
--tipo)
TIPO=$2
shift 2
;;
*)
if [ -z "$MODULO" ]; then
MODULO=$1
elif [ -z "$VERSION" ]; then
VERSION=$1
elif [ -z "$ORIGEN" ]; then
ORIGEN=$1
fi
shift
;;
esac
done
}
validate_params() {
if [ -z "$MODULO" ] || [ -z "$VERSION" ] || [ -z "$ORIGEN" ]; then
log_error "Parametros insuficientes"
echo ""
echo "Uso: $0 <modulo> <version_nueva> <proyecto_origen> [opciones]"
echo ""
echo "Ejemplo: $0 auth-jwt-nestjs 2.2.0 gamilit"
echo ""
echo "Use --help para mas informacion"
exit 1
fi
}
check_module_exists() {
if [ ! -f "$CATALOGO" ]; then
log_error "CATALOGO-MODULOS.yml no encontrado en $CATALOGO"
exit 2
fi
if ! grep -q "nombre: \"$MODULO\"" "$CATALOGO" && ! grep -q "nombre: $MODULO" "$CATALOGO"; then
log_error "Modulo '$MODULO' no encontrado en CATALOGO-MODULOS.yml"
echo ""
echo "Modulos disponibles:"
grep "nombre:" "$CATALOGO" | head -10 | sed 's/.*nombre: //; s/"//g' | sed 's/^/ - /'
echo " ..."
exit 2
fi
log_success "Modulo '$MODULO' encontrado en catalogo"
}
check_origin_project() {
if [ ! -d "$PROJECTS_PATH/$ORIGEN" ]; then
log_error "Proyecto origen '$ORIGEN' no existe en $PROJECTS_PATH"
exit 1
fi
log_success "Proyecto origen '$ORIGEN' verificado"
}
get_projects_using_module() {
if [ ! -f "$TRAZABILIDAD" ]; then
log_error "TRAZABILIDAD-PROYECTOS.yml no encontrado"
exit 2
fi
# Buscar proyectos que usan el modulo en TRAZABILIDAD
# El formato esperado es:
# proyectos:
# gamilit:
# modulos_base:
# - auth-jwt-nestjs: "2.1.0"
PROYECTOS_RAW=$(grep -B20 "$MODULO" "$TRAZABILIDAD" 2>/dev/null | grep "^ [a-z]" | sed 's/:.*//; s/^ *//' | sort -u)
# Excluir proyecto origen
PROYECTOS=""
for p in $PROYECTOS_RAW; do
if [ "$p" != "$ORIGEN" ] && [ -d "$PROJECTS_PATH/$p" ]; then
PROYECTOS="$PROYECTOS $p"
fi
done
PROYECTOS=$(echo $PROYECTOS | xargs) # Trim whitespace
if [ -z "$PROYECTOS" ]; then
log_warning "No se encontraron otros proyectos que usen '$MODULO'"
echo ""
echo "El modulo '$MODULO' parece ser usado solo por '$ORIGEN'"
exit 3
fi
}
generate_propagation_id() {
YEAR=$(date +%Y)
# Contar propagaciones existentes en el año
COUNT=$(grep -c "PROP-$YEAR-" "$REGISTRO" 2>/dev/null || echo "0")
NEXT=$((COUNT + 1))
PROP_ID=$(printf "PROP-%s-%03d" "$YEAR" "$NEXT")
echo "$PROP_ID"
}
show_summary() {
echo ""
echo "============================================"
echo " PROPAGACION DE MEJORAS"
echo "============================================"
echo ""
echo " Modulo: $MODULO"
echo " Version nueva: $VERSION"
echo " Proyecto origen: $ORIGEN"
echo ""
echo " Proyectos a propagar:"
for p in $PROYECTOS; do
# Intentar obtener version actual del proyecto
CURRENT_VERSION=$(grep -A5 "^ $p:" "$TRAZABILIDAD" 2>/dev/null | grep "$MODULO" | sed 's/.*: *"*//; s/"*$//' | head -1)
if [ -z "$CURRENT_VERSION" ]; then
CURRENT_VERSION="?"
fi
echo " - $p (tiene v$CURRENT_VERSION)"
done
echo ""
if $DRY_RUN; then
echo " [DRY-RUN] No se realizaran cambios"
fi
echo ""
echo "============================================"
}
generate_tasks() {
PROP_ID=$(generate_propagation_id)
FECHA=$(date +%Y-%m-%d)
echo ""
log_info "Generando tareas de propagacion..."
echo " ID de propagacion: $PROP_ID"
echo ""
for p in $PROYECTOS; do
TASK_FILE="TAREA-PROP-$MODULO-$p.md"
echo " - $TASK_FILE"
if ! $DRY_RUN; then
# Aqui se podria crear el archivo de tarea usando el template
# Por ahora solo mostramos que se crearia
:
fi
done
echo ""
log_success "Tareas generadas para $PROP_ID"
}
update_registry() {
if ! $UPDATE_REGISTRY; then
log_info "Use --update-registry para actualizar REGISTRO-PROPAGACIONES.yml"
return
fi
if $DRY_RUN; then
log_info "[DRY-RUN] Se actualizaria REGISTRO-PROPAGACIONES.yml"
return
fi
log_info "Actualizando REGISTRO-PROPAGACIONES.yml..."
# Aqui se agregaria la entrada al registro
# Por ahora solo notificamos
log_success "Registro actualizado"
}
run_scrum_generation() {
if ! $GENERATE_SCRUM; then
return
fi
echo ""
echo "============================================"
echo " GENERACION DE TAREAS SCRUM"
echo "============================================"
echo ""
SCRUM_SCRIPT="$SCRIPT_DIR/generate-scrum-tasks.sh"
if [ ! -x "$SCRUM_SCRIPT" ]; then
log_error "generate-scrum-tasks.sh no encontrado o no ejecutable"
return
fi
SCRUM_FLAGS=""
if $SCRUM_EPIC; then
SCRUM_FLAGS="$SCRUM_FLAGS --epic"
fi
if $DRY_RUN; then
SCRUM_FLAGS="$SCRUM_FLAGS --dry-run"
fi
log_info "Ejecutando: generate-scrum-tasks.sh $MODULO $VERSION $TIPO $SCRUM_FLAGS"
"$SCRUM_SCRIPT" "$MODULO" "$VERSION" "$TIPO" $SCRUM_FLAGS
log_success "Generacion SCRUM completada"
}
run_cascade_propagation() {
if ! $CASCADE_MODE; then
return
fi
echo ""
echo "============================================"
echo " PROPAGACION EN CASCADA"
echo "============================================"
echo ""
CASCADE_SCRIPT="$SCRIPT_DIR/cascade-propagation.sh"
if [ ! -x "$CASCADE_SCRIPT" ]; then
log_error "cascade-propagation.sh no encontrado o no ejecutable"
return
fi
CASCADE_FLAGS=""
if $DRY_RUN; then
CASCADE_FLAGS="$CASCADE_FLAGS --dry-run"
fi
log_info "Ejecutando: cascade-propagation.sh $MODULO $VERSION $CASCADE_FLAGS"
"$CASCADE_SCRIPT" "$MODULO" "$VERSION" $CASCADE_FLAGS
log_success "Propagacion en cascada completada"
}
# =============================================================================
# MAIN
# =============================================================================
main() {
echo ""
echo "=========================================="
echo " PROPAGATE MODULE UPDATE"
echo " Sistema: NEXUS v3.4"
echo "=========================================="
echo ""
parse_args "$@"
validate_params
log_info "Verificando modulo..."
check_module_exists
log_info "Verificando proyecto origen..."
check_origin_project
log_info "Buscando proyectos que usan '$MODULO'..."
get_projects_using_module
show_summary
generate_tasks
update_registry
# Ejecutar generacion SCRUM si se solicito
run_scrum_generation
# Ejecutar cascada si se solicito
run_cascade_propagation
echo ""
echo "============================================"
echo " Proximos pasos:"
echo "============================================"
echo ""
if $GENERATE_SCRUM; then
echo " 1. Revisar tareas SCRUM generadas"
echo " 2. Asignar a @PERFIL_PROJECT_AGENT"
else
echo " 1. Revisar tareas generadas"
echo " 2. Priorizar segun tipo de cambio"
fi
echo " 3. Ejecutar propagacion en cada proyecto"
echo " 4. Actualizar TRAZABILIDAD-PROYECTOS.yml"
echo " 5. Validar: ./validate-propagation-chain.sh <PROP-ID>"
echo ""
echo " Ver: @PROPAGACION para proceso completo"
echo ""
echo "============================================"
echo ""
exit 0
}
main "$@"