Files
2026-02-21 19:53:38 +01:00

122 lines
4.2 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Comandos
**Ejecutar la aplicación:**
```bash
python pocketsync.py
```
No hay proceso de build, instalación de dependencias, ni tests automatizados. Todo depende de la librería estándar de Python 3 y del comando `robocopy` de Windows.
## Arquitectura
Aplicación de escritorio en Python/Tkinter para sincronizar archivos de emulación retro (ES-DE y ROMs) hacia almacenamiento externo usando Robocopy. Soporta múltiples perfiles nombrados (uno por consola/dispositivo).
### Estructura de archivos
```
pocketsync.py # Entry point (~20 líneas)
config.json # Config v2 con perfiles
CLAUDE.md
core/
__init__.py
config.py # Profile dataclass + ConfigManager (load/save/migrate v1→v2)
sync_engine.py # ABC SyncEngine
robocopy_engine.py # RobocopySyncEngine (subprocess + parsing)
ui/
__init__.py
app.py # PocketSyncApp — orquestación y loop de sync
profile_bar.py # Widget: dropdown de perfiles + New/Rename/Delete
path_panel.py # Widget: los 2 selectores de ruta (ES-DE + ROMs)
system_list.py # Widget: listbox de sistemas + Select All/None
status_bar.py # Widget: barra de estado (sistema/fase/archivo)
summary_panel.py # Widget: área de texto de resumen
styles.py # Constantes visuales (colores, fuentes)
```
**Entry point:** `pocketsync.py` — instancia `ConfigManager` y `PocketSyncApp`.
**Persistencia:** `config.json` (versión 2) guarda todos los perfiles. Si existe un config v1 (plano), se migra automáticamente a un perfil "Default" al primer arranque.
### Esquema config.json (v2)
```json
{
"version": 2,
"active_profile": "Default",
"profiles": [
{
"name": "Default",
"esde_src": "...",
"roms_src": "...",
"esde_dst": "...",
"roms_dst": "...",
"selected": ["arcade", "nes"]
}
]
}
```
### Flujo de la aplicación
1. Al iniciar: `ConfigManager.load()` restaura perfiles desde `config.json` (con migración automática de v1 → v2).
2. El usuario selecciona o crea un perfil en `ProfileBar`.
3. Configura 4 rutas (ES-DE origen/destino, ROMs origen/destino) y selecciona los sistemas.
4. Al pulsar "Sync Now": hilo daemon → `_sync_thread` en `app.py`.
5. Por cada sistema: 3 fases usando `SyncEngine.sync_folder()`.
6. Al cambiar de perfil: se guarda el estado actual en el perfil activo antes de cargar el nuevo.
7. Al cerrar: `ConfigManager.save()` persiste todos los perfiles.
### Flags de Robocopy usados
- `/MIR` — modo espejo (sincroniza origen → destino)
- `/NP` — sin porcentaje de progreso en la salida
### Threading
Las operaciones de copia corren en un hilo daemon separado para no bloquear la UI. Las actualizaciones de widgets se hacen desde ese hilo directamente.
### Extensibilidad de backends
`core/sync_engine.py` define la ABC `SyncEngine`. `RobocopySyncEngine` es la implementación concreta. Para añadir rsync u otro backend: crear un nuevo archivo en `core/` que implemente la misma interfaz.
## Build (generar PocketSync.exe)
### Requisitos previos (una sola vez)
```bash
py -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
```
### Icono (opcional pero recomendado)
Coloca tu icono en `assets\pocketsync.ico` antes de empaquetar. Sin él, el `.exe` usará el icono genérico de Python. El `.spec` detecta automáticamente si el archivo existe.
### Empaquetar
```bash
.venv\Scripts\activate
pyinstaller pocketsync.spec
```
El ejecutable final queda en `dist\PocketSync.exe`. No requiere Python instalado en el equipo destino.
### Archivos de build
| Archivo | Descripción |
|---|---|
| `requirements.txt` | Solo `pyinstaller>=6.0` |
| `pocketsync.spec` | Configuración de PyInstaller (versionado) |
| `assets/pocketsync.ico` | Icono del `.exe` (no versionado, añadir manualmente) |
| `dist/` | Salida del build (ignorado por git) |
| `build/` | Archivos temporales de PyInstaller (ignorado por git) |
| `.venv/` | Entorno virtual (ignorado por git) |
## Plataforma
Windows 10/11 obligatorio (depende de `robocopy`). Python 3.6+, sin dependencias externas.