Arquitectura del Sistema

La aplicación impone estrictamente un modelo de cuatro capas inspirado en Clean Architecture.

Arquitectura en Capas

  1. Capa UI (src/routes/, src/lib/components/)
    Presentación pura. Renderiza datos de la capa de Estado y dispara métodos del Estado en las interacciones. No realiza I/O.
  2. Capa de Estado (src/lib/state/)
    Svelte 5 runes (.svelte.ts). Actúa como la única fuente de verdad para la UI (issuesStore, modeStore). Orquesta llamadas a la capa de Servicios y mantiene la cola de commits.
  3. Capa de Servicios (src/lib/services/)
    Lógica de dominio pura. Parsea YAML, valida issues, maneja relaciones y calcula hashes de integridad. Nunca toca el DOM, la red o el sistema de archivos.
  4. Capa de Adaptadores (src/lib/adapters/)
    La única capa que realiza I/O. Expone una interfaz unificada WritableDirectoryAdapter implementada por estrategias Locales y Remotas.

Contexto del Sistema

A continuación se presenta una representación en Mermaid del Contexto del Sistema. El Usuario puede conectarse directamente a su sistema de archivos local, o enrutarse a través del navegador a un Proveedor Git mediante REST.

flowchart TD
    User([Usuario]) -->|"Edición Local"| Browser("SPA quill.md")
    User -->|"Edición Remota"| Browser
    
    subgraph BrowserEnv ["Entorno del Navegador"]
      Browser --> LocalAdapter["LocalFsAdapter"]
      Browser --> RemoteAdapter["RemoteWritableAdapter"]
    end
    
    LocalAdapter -->|"File System Access API"| LocalDisk[("Disco Local .quill.md/")]
    RemoteAdapter -->|"API REST"| GitHub[("API GitHub/GitLab")]
  

Servicios de Dominio

Los servicios de dominio están aislados del framework (SvelteKit) y del I/O. Toman entradas de strings en crudo y retornan objetos Issue fuertemente tipados.

Límite Estricto
Un Servicio nunca debe importar desde src/lib/adapters/. La capa de Estado es responsable de obtener los datos mediante los Adaptadores y pasarlos a los Servicios.