a0ef53922e
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
88 lines
3.2 KiB
Markdown
88 lines
3.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.
|
|
|
|
## Plataforma
|
|
|
|
Windows 10/11 obligatorio (depende de `robocopy`). Python 3.6+, sin dependencias externas.
|