# Propagación de Mejoras del Core

## 🎯 Objetivo

Propagar mejoras y actualizaciones del sistema base **CD-System** a proyectos existentes que utilizan el sistema, manteniendo automáticamente la identidad y configuración específica de cada proyecto.

## 📋 Flujo de Propagación

### 1. Desarrollo en el Core

Las mejoras se desarrollan y commitean en la rama `cd-system` del repositorio central:

```bash
# En el repositorio cd-system
git checkout cd-system
# ... hacer mejoras ...
git add .
git commit -m "feat: Nueva funcionalidad X"
git push origin cd-system
```

### 2. Propagación a Proyectos

Usar el script `propagate-core-improvements.sh` para propagar las mejoras:

```bash
# Desde el repositorio cd-system
./scripts/propagate-core-improvements.sh <url_repositorio_proyecto> [opciones]
```

#### Opciones Disponibles

- `--core-url URL`: URL del repo CD-System (default: repositorio central)
- `--core-branch NAME`: Rama en CD-System (default: `cd-system`)
- `--project-branch NAME`: Rama en el proyecto (default: `cd-system`)
- `--push yes|no`: Hacer push después de propagar (default: `no`)
- `--dry-run`: Simular sin hacer cambios
- `--selective`: Seleccionar qué propagar interactivamente

#### Ejemplos

```bash
# Propagación básica (sin push)
./scripts/propagate-core-improvements.sh https://github.com/LACOMPANIADIGITAL/proyecto.git

# Propagación con push automático
./scripts/propagate-core-improvements.sh https://github.com/LACOMPANIADIGITAL/proyecto.git --push yes

# Simulación (dry-run)
./scripts/propagate-core-improvements.sh https://github.com/LACOMPANIADIGITAL/proyecto.git --dry-run
```

## 🔒 Protección Automática

Durante la propagación, los archivos protegidos se mantienen automáticamente gracias a `.gitattributes`:

### Archivos Protegidos (No se Sobrescriben)

- ✅ `config/cd-system.php` - Configuración base del sistema
- ✅ `config/site.php` - Configuración del sitio (identidad del proyecto)
- ✅ `public/cd-project/assets/*` - Assets de identidad del proyecto

### Archivos que se Actualizan

- ✅ Nuevos módulos y funcionalidades
- ✅ Mejoras en código reutilizable
- ✅ Actualizaciones de dependencias
- ✅ Nuevas migraciones y seeders
- ✅ Mejoras en helpers y utilidades
- ✅ Actualizaciones de documentación

## 🔄 Proceso Detallado

### Paso 1: Clonación Temporal

El script clona el repositorio del proyecto en un directorio temporal para no afectar el repositorio local.

### Paso 2: Configuración de Remotes

Se agrega el repositorio CD-System como remote temporal para poder hacer fetch y merge.

### Paso 3: Verificación de .gitattributes

El script verifica que `.gitattributes` esté presente. Si no existe, lo copia desde el core.

### Paso 4: Merge Inteligente

Se hace merge de la rama `cd-system` del core hacia la rama del proyecto. Los archivos protegidos se mantienen automáticamente.

### Paso 5: Resolución de Conflictos (si aplica)

Si hay conflictos en archivos no protegidos:
1. El script detecta los conflictos
2. Muestra instrucciones para resolverlos
3. Espera resolución manual antes de hacer push

### Paso 6: Push (Opcional)

Si se especifica `--push yes`, el script hace push automático. De lo contrario, se puede hacer push manualmente.

## 📝 Mejores Prácticas

### Antes de Propagar

1. **Verificar cambios en el core**: Asegurarse de que los cambios estén commiteados y pusheados
2. **Revisar impacto**: Considerar qué cambios se propagarán y su impacto en los proyectos
3. **Backup**: Los proyectos deberían tener backups antes de recibir actualizaciones importantes

### Durante la Propagación

1. **Usar --dry-run primero**: Simular la propagación para ver qué cambios se aplicarían
2. **Revisar conflictos**: Si hay conflictos, resolverlos cuidadosamente
3. **Verificar archivos protegidos**: Confirmar que los archivos protegidos se mantuvieron correctamente

### Después de Propagar

1. **Probar el proyecto**: Verificar que todo funcione correctamente
2. **Revisar logs**: Revisar los cambios aplicados
3. **Documentar**: Si hay cambios importantes, documentarlos en el proyecto

## 🚨 Manejo de Conflictos

### Conflictos en Archivos Protegidos

Los archivos protegidos **NO deberían** tener conflictos gracias a `.gitattributes`. Si los hay:

1. Verificar que `.gitattributes` esté correctamente configurado
2. Usar `git checkout --ours <archivo>` para mantener la versión del proyecto
3. Commitear la resolución

### Conflictos en Archivos No Protegidos

Para archivos no protegidos:

1. Revisar los cambios del core
2. Decidir si mantener los cambios del core o del proyecto
3. Resolver manualmente
4. Commitear la resolución

## 🔧 Scripts Relacionados

- **`clone-to-new-repo.sh`**: Clonar CD-System hacia un nuevo repositorio
- **`update_cd_system_from_origin.sh`**: Actualizar un proyecto desde el core (método alternativo)
- **`propagate_module_from_json.sh`**: Propagación selectiva de módulos específicos

## 📚 Referencias

- [Protección de Archivos del Sistema](./proteccion-archivos-sistema.md)
- [Git Attributes Documentation](https://git-scm.com/docs/gitattributes)
- [Git Merge Strategies](https://git-scm.com/docs/merge-strategies)

