# Protección de Archivos del Sistema Base

## 🎯 Objetivo

Mantener la identidad del sistema base **CD-System** intacta durante los merges de proyectos externos. Los archivos protegidos representan la configuración y assets del sistema base y **NO deben ser sobrescritos** por cambios de proyectos específicos.

## 📋 Archivos Protegidos

### Configuración del Sistema

- **`config/cd-system.php`**: Configuración base del sistema (versión, módulos, seguridad, etc.)
- **`config/site.php`**: Configuración base del sitio (identidad del sistema CD-System)

### Assets de Identidad del Sistema

Los siguientes assets en `public/cd-project/assets/` representan la identidad visual del sistema base:

- `apple-touch-icon.png` - Icono para dispositivos Apple
- `favicon-96x96.png` - Favicon 96x96
- `favicon.ico` - Favicon principal
- `favicon.svg` - Favicon en formato SVG
- `logo-2.png` - Logo alternativo
- `logo-alternative.png` - Logo alternativo para footer
- `logo.png` - Logo principal del sistema
- `web-app-manifest-192x192.png` - Icono para PWA (192x192)
- `web-app-manifest-512x512.png` - Icono para PWA (512x512)

## 🔒 Estrategia de Protección

### `.gitattributes` con Merge Strategy "ours"

Se utiliza la estrategia `merge=ours` en `.gitattributes` para que Git **siempre mantenga la versión del sistema base** durante los merges, ignorando automáticamente los cambios de proyectos externos.

```gitattributes
# Configuración del sistema base
config/cd-system.php merge=ours
config/site.php merge=ours

# Assets de identidad del sistema base
public/cd-project/assets/apple-touch-icon.png merge=ours
public/cd-project/assets/favicon-96x96.png merge=ours
# ... etc
```

### ¿Cómo Funciona?

1. **Durante un merge**: Git detecta conflictos en estos archivos
2. **Estrategia automática**: Git usa `merge=ours` y mantiene la versión del sistema base
3. **Sin intervención**: No se requiere resolver conflictos manualmente
4. **Resultado**: La identidad del sistema base se preserva automáticamente

## 🔄 Flujo de Trabajo con Proyectos Externos

### Proceso de Merge desde Proyecto Externo

```bash
# 1. Agregar remote del proyecto
git remote add proyecto-x https://github.com/usuario/proyecto-x.git

# 2. Fetch de la rama del proyecto
git fetch proyecto-x cd-system

# 3. Crear rama temporal para normalización
git checkout -b proyecto-x-sync proyecto-x/cd-system

# 4. Normalizar y limpiar cambios específicos del proyecto
# (remover referencias específicas, neutralizar configuraciones, etc.)

# 5. Volver a rama cd-system y hacer merge
git checkout cd-system
git merge --no-ff proyecto-x-sync

# ✅ Los archivos protegidos NO serán afectados gracias a .gitattributes
```

### Qué se Preserva Automáticamente

- ✅ `config/cd-system.php` - Siempre mantiene la versión del sistema base
- ✅ `config/site.php` - Siempre mantiene la identidad del sistema base
- ✅ Todos los assets en `public/cd-project/assets/` - Mantienen la identidad visual del sistema

### Qué se Integra del Proyecto

- ✅ Nuevos módulos y funcionalidades
- ✅ Mejoras en código reutilizable
- ✅ Nuevos assets en `public/cd-project/img/demos/[demo-name]/`
- ✅ Nuevas vistas y layouts específicos del demo
- ✅ Configuraciones de demos en `config/demos/`

## 📝 Notas Importantes

### ⚠️ Cambios en Archivos Protegidos

Si necesitas modificar un archivo protegido en el sistema base:

1. **Hacer el cambio directamente en la rama `cd-system`**
2. **Commit y push normal**
3. **Los proyectos externos NO sobrescribirán estos cambios** gracias a `merge=ours`

### 🔧 Personalización de Proyectos

Los proyectos externos **NO deben** modificar los archivos protegidos. En su lugar:

- **Configuración específica**: Usar archivos en `config/demos/[demo-name]/`
- **Assets específicos**: Usar `public/cd-project/img/demos/[demo-name]/`
- **Vistas específicas**: Usar `resources/views/modules/cd-base/frontend/demos/[demo-name]/`

## 🧪 Verificación

Para verificar que la protección funciona:

```bash
# Simular un merge conflictivo
git checkout -b test-merge
# Modificar un archivo protegido
echo "test" >> config/site.php
git add config/site.php
git commit -m "test: modificar archivo protegido"

# Volver a cd-system y hacer merge
git checkout cd-system
git merge test-merge

# Verificar que config/site.php mantiene su versión original
git diff HEAD config/site.php
# No debería mostrar cambios si la protección funciona
```

## 📚 Referencias

- [Git Attributes Documentation](https://git-scm.com/docs/gitattributes)
- [Git Merge Strategies](https://git-scm.com/docs/merge-strategies)

