4.2 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Comandos
Ejecutar la aplicación:
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)
{
"version": 2,
"active_profile": "Default",
"profiles": [
{
"name": "Default",
"esde_src": "...",
"roms_src": "...",
"esde_dst": "...",
"roms_dst": "...",
"selected": ["arcade", "nes"]
}
]
}
Flujo de la aplicación
- Al iniciar:
ConfigManager.load()restaura perfiles desdeconfig.json(con migración automática de v1 → v2). - El usuario selecciona o crea un perfil en
ProfileBar. - Configura 4 rutas (ES-DE origen/destino, ROMs origen/destino) y selecciona los sistemas.
- Al pulsar "Sync Now": hilo daemon →
_sync_threadenapp.py. - Por cada sistema: 3 fases usando
SyncEngine.sync_folder(). - Al cambiar de perfil: se guarda el estado actual en el perfil activo antes de cargar el nuevo.
- 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)
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
.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.