From 963b3bd7e15aa013656585e6bfcb28e08b87c995 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Mon, 8 Jun 2026 21:12:56 +0200 Subject: [PATCH] fix(install): enlazar hooks y CLAUDE.md, reparar symlinks rotos install.sh ahora gestiona los hooks goal_*.sh y CLAUDE.md ademas de skills/agents/commands/settings. Antes quedaban fuera del script, por lo que al mover repo_Claude de ~/DataProyects a fn_registry/external los symlinks de hooks/ quedaban colgando y los hooks goal_* fallaban con "not found". Cambios: - Enlace simbolico por archivo de todos los hooks .sh del repo. - Enlace simbolico de CLAUDE.md (preferencias globales). - statusline.sh pasa de copia a symlink (elimina backups basura por corrida). - Logica de relink idempotente: symlink roto o mal-apuntado se borra y recrea; solo los archivos reales se respaldan en backup. Co-Authored-By: Claude Opus 4.8 (1M context) --- install.sh | 86 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/install.sh b/install.sh index 09c1c63..4033294 100755 --- a/install.sh +++ b/install.sh @@ -54,20 +54,26 @@ done echo "" echo "=== Instalando archivos de configuración ===" -# 1. Status Line Script +# 1. Status Line Script (enlace simbólico) STATUSLINE_SOURCE="$REPO_DIR/.claude/statusline.sh" STATUSLINE_TARGET="$CLAUDE_DIR/statusline.sh" if [ -f "$STATUSLINE_SOURCE" ]; then - if [ -f "$STATUSLINE_TARGET" ]; then - BACKUP="$STATUSLINE_TARGET.backup.$(date +%Y%m%d_%H%M%S)" - echo "Backup: statusline.sh -> $BACKUP" - mv "$STATUSLINE_TARGET" "$BACKUP" + chmod +x "$STATUSLINE_SOURCE" + if [ -L "$STATUSLINE_TARGET" ] && [ "$(readlink "$STATUSLINE_TARGET")" = "$STATUSLINE_SOURCE" ]; then + echo "OK: statusline.sh ya está enlazado correctamente" + else + # Symlink (roto o apuntando mal): borrar; archivo real: backup + if [ -L "$STATUSLINE_TARGET" ]; then + rm -f "$STATUSLINE_TARGET" + elif [ -e "$STATUSLINE_TARGET" ]; then + BACKUP="$STATUSLINE_TARGET.backup.$(date +%Y%m%d_%H%M%S)" + echo "Backup: statusline.sh -> $BACKUP" + mv "$STATUSLINE_TARGET" "$BACKUP" + fi + ln -s "$STATUSLINE_SOURCE" "$STATUSLINE_TARGET" + echo "Enlazado: statusline.sh -> $STATUSLINE_SOURCE" fi - - cp "$STATUSLINE_SOURCE" "$STATUSLINE_TARGET" - chmod +x "$STATUSLINE_TARGET" - echo "Copiado: statusline.sh (ejecutable)" else echo "WARN: statusline.sh no encontrado en el repo" fi @@ -96,6 +102,66 @@ else echo "WARN: settings.json no encontrado en el repo" fi +# 3. CLAUDE.md (enlace simbólico - preferencias globales) +CLAUDEMD_SOURCE="$REPO_DIR/.claude/CLAUDE.md" +CLAUDEMD_TARGET="$CLAUDE_DIR/CLAUDE.md" + +if [ -f "$CLAUDEMD_SOURCE" ]; then + if [ -L "$CLAUDEMD_TARGET" ] && [ "$(readlink "$CLAUDEMD_TARGET")" = "$CLAUDEMD_SOURCE" ]; then + echo "OK: CLAUDE.md ya está enlazado correctamente" + else + # Symlink (roto o apuntando mal): borrar; archivo real: backup + if [ -L "$CLAUDEMD_TARGET" ]; then + rm -f "$CLAUDEMD_TARGET" + elif [ -e "$CLAUDEMD_TARGET" ]; then + BACKUP="$CLAUDEMD_TARGET.backup.$(date +%Y%m%d_%H%M%S)" + echo "Backup: CLAUDE.md -> $BACKUP" + mv "$CLAUDEMD_TARGET" "$BACKUP" + fi + ln -s "$CLAUDEMD_SOURCE" "$CLAUDEMD_TARGET" + echo "Enlazado: CLAUDE.md -> $CLAUDEMD_SOURCE" + fi +else + echo "WARN: CLAUDE.md no encontrado en el repo" +fi + +# === Instalando hooks (enlace simbólico por archivo) === +echo "" +echo "=== Instalando hooks ===" + +HOOKS_SOURCE_DIR="$REPO_DIR/.claude/hooks" +HOOKS_TARGET_DIR="$CLAUDE_DIR/hooks" + +if [ -d "$HOOKS_SOURCE_DIR" ]; then + mkdir -p "$HOOKS_TARGET_DIR" + for hook in "$HOOKS_SOURCE_DIR"/*.sh; do + [ -e "$hook" ] || continue + chmod +x "$hook" + HOOK_NAME="$(basename "$hook")" + HOOK_TARGET="$HOOKS_TARGET_DIR/$HOOK_NAME" + + # Si ya es symlink correcto, saltar + if [ -L "$HOOK_TARGET" ] && [ "$(readlink "$HOOK_TARGET")" = "$hook" ]; then + echo "OK: hooks/$HOOK_NAME ya está enlazado correctamente" + continue + fi + + # Symlink (roto o apuntando mal): borrar sin backup; archivo real: backup + if [ -L "$HOOK_TARGET" ]; then + rm -f "$HOOK_TARGET" + elif [ -e "$HOOK_TARGET" ]; then + BACKUP="$HOOK_TARGET.backup.$(date +%Y%m%d_%H%M%S)" + echo "Backup: hooks/$HOOK_NAME -> $BACKUP" + mv "$HOOK_TARGET" "$BACKUP" + fi + + ln -s "$hook" "$HOOK_TARGET" + echo "Enlazado: hooks/$HOOK_NAME -> $hook" + done +else + echo "WARN: $HOOKS_SOURCE_DIR no existe, saltando hooks" +fi + # === Limpieza de configuración que no debe cambiar === echo "" echo "=== Limpiando configuración inmutable ===" @@ -189,6 +255,8 @@ echo "Tus comandos y configuración ahora están sincronizados con el repositori echo "" echo "Configuración instalada:" echo " • Skills, Agents y Commands enlazados simbólicamente" +echo " • Hooks (goal_*.sh) enlazados simbólicamente" +echo " • CLAUDE.md (preferencias globales) enlazado" echo " • Status Line configurada con vibecoding setup" echo " • Settings.json enlazado (compartido entre repos)" echo " • Backups viejos limpiados (>7 días)"