# L1 — Composition root & IPC **Binôme :** `dev-ipc-bridge` / `test-ipc-bridge` **Zones :** `crates/app-tauri`, `frontend/ports`, `frontend/adapters` **Dépendances amont :** L0 (ports figés). **Statut :** suivant (enchaîné après L0). ## Objectif Mettre en place le **squelette Tauri qui tourne** : composition root (DI), pont IPC bidirectionnel, et la couche ports/adapters du frontend (avec mocks) — pour que le front soit développable **sans backend** dès les lots suivants. ## Périmètre (DEV) ### Backend `app-tauri` (driving adapter + composition root) - **Composition root** : instancier les adapters concrets (au départ : `LocalFileSystem`, `TokioBroadcastEventBus`, `SystemClock`, `UuidGenerator`) et les injecter dans les use cases via `tauri::State` (`Arc`). - Registre des `#[tauri::command]` (squelette, mapping DTO ↔ use case) et `ErrorDTO`. - **`TauriEventRelay`** : souscrit l'`EventBus` domaine → relaie en events/Channels Tauri. - **Bridge PTY ↔ Tauri Channel** (`tauri::ipc::Channel`) : infrastructure générique de flux d'octets par session (sera consommée par L3). - App Tauri v2 minimale qui démarre (fenêtre vide). ### Frontend (hexagonal côté UI) - `frontend/ports` : gateways TS (`AgentGateway`, `TerminalGateway`, `ProjectGateway`, `LayoutGateway`, `GitGateway`, `RemoteGateway`). - `frontend/adapters` : impl via `@tauri-apps/api` (`invoke`/`listen`/`Channel`). - `frontend/adapters/mock` : impl mock de chaque gateway. - `frontend/app` : bootstrap React + Vite, provider de DI des adapters (réel vs mock). ## Périmètre (TEST) - Backend : mapping commands ↔ use cases (un use case in-memory simple validant le wiring). - Relais `EventBus` → events Tauri (un `DomainEvent` publié arrive bien côté relais). - Front : chaque gateway mock satisfait l'interface du port (typecheck + tests Vitest). - Provider de DI : bascule réel/mock fonctionnelle. ## Definition of Done - L'app Tauri démarre (fenêtre vide) sur Linux. - `cargo test -p app-tauri` et `vitest` verts. - Front compile et tourne en mode **mock** sans backend. - Aucun `invoke()` direct dans les composants (uniquement via gateways). ## Points d'attention / spikes - Forme du bridge PTY↔Channel (backpressure) — préparé ici, stressé en L3. - Convention de (dé)sérialisation DTO Rust ↔ TS (serde camelCase ?). À figer ici.