# L7 — Templates & synchronisation **Binôme :** `dev-templates` / `test-templates` **Zones :** `application/template`, `infrastructure/store`, `frontend/features/templates` **Dépendances amont :** L0, L1, L5, L6. ## Objectif Templates d'agents (store global IDE), versioning, création d'agent depuis template, **détection de drift** et **synchronisation template → agents**. ## Périmètre (DEV) - Adapter `FsTemplateStore` (md + `index.json`) avec versioning monotone + `content_hash`. - Use cases : `CreateTemplate`, `UpdateTemplate` (bump version), `CreateAgentFromTemplate`, `DetectAgentDrift`, `SyncAgentWithTemplate` (remplacement du `.md` si `synchronized`). - Front : gestion des templates, badge « MAJ disponible », action de sync. ## Périmètre (TEST) - `UpdateTemplate` incrémente la version ; `DetectAgentDrift` détecte `version > synced_template_version`. - `SyncAgentWithTemplate` : applique aux `synchronized==true`, ignore `false` et `scratch` ; met à jour `synced_template_version`. - Front : badge drift + flux de sync avec gateway mock. ## Definition of Done - `cargo test` (template/store) + `vitest` verts ; cycle MAJ template → propagation aux agents synchronisés (dev manuel). ## Avancement ### ✅ Backend (vert) - **Infra** : `FsTemplateStore` (`infrastructure/store/template.rs`) — store global `/templates/{index.json, md/.md}`, versioning persisté, `contentHash` (digest stable, sans dépendance) pour détection d'édition hors-app. 6 tests d'intégration (tmpdir). - **Application** (`application/template/usecases.rs`) : `CreateTemplate`, `UpdateTemplate` (bump version + event `TemplateUpdated`), `ListTemplates`, `DeleteTemplate`, `CreateAgentFromTemplate` (origine `FromTemplate` + seed du `.md`, réutilise le helper de nommage L6), `DetectAgentDrift` (ne flague que les `synchronized` en retard ; ignore non-sync/scratch/à-jour/template supprimé ; émet `AgentDriftDetected`), `SyncAgentWithTemplate` (remplace le `.md`, avance `synced_template_version`, émet `AgentSynced` ; laisse intacts non-sync/scratch). 8 tests use cases. - `cargo test --workspace` : **270 verts, 0 régression** ; clippy clean. ### ✅ IPC `app-tauri` (vert) - Composition root : `FsTemplateStore` construit, 7 use cases injectés (réutilise `contexts_port`/`ids`/`events_port`). - 7 commands : `create_template`, `update_template`, `list_templates`, `delete_template`, `create_agent_from_template`, `detect_agent_drift`, `sync_agent_with_template` (shells fins, `resolve_project` réutilisé). DTOs camelCase (`TemplateDto` transparent, `AgentDriftDto`, `SyncResultDto`, `parse_template_id`). - Tests `tests/dto_templates.rs` (18) ; `cargo test -p app-tauri` 62 verts ; workspace **288 verts, 0 régression** ; clippy clean. ### ✅ Front (vert) - Port `TemplateGateway` (7 méthodes) + types `Template`/`AgentDrift` ; adapter Tauri `TauriTemplateGateway` ; `MockTemplateGateway` stateful **partageant le registre d'agents** du `MockAgentGateway` (helpers internes `_insertAgent`/`_updateAgent`/`_rawAgents`) pour faire vivre le drift offline. - Feature `features/templates` : `useTemplates` (CRUD), `useDrift(projectId)` (détection + sync), `TemplatesPanel` (liste nom+version, création, édition, suppression, « Create agent from template »), monté dans l'onglet projet. - `AgentsPanel` : **badge « update available »** + bouton **Sync** par agent en drift. - Tests : 20 ajoutés ; suite front **140 verts** ; `tsc` clean ; garde-fou « no direct invoke » respecté. ### ⏳ Hors périmètre L7 - Intégration front du terminal d'agent depuis un agent créé via template (réutilise le fil L6).