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

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

  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)

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.