# 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.