From d47e93b3c39b0e5deac06a1f187de8ace92ff0f1 Mon Sep 17 00:00:00 2001 From: Gato Date: Fri, 19 Jun 2026 14:27:25 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20r=C3=A8gle=20architecture=20Clean=20Arc?= =?UTF-8?q?hitecture=20pour=20Pena-tauri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/rules/architecture.md | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .claude/rules/architecture.md diff --git a/.claude/rules/architecture.md b/.claude/rules/architecture.md new file mode 100644 index 0000000..91bbe6f --- /dev/null +++ b/.claude/rules/architecture.md @@ -0,0 +1,52 @@ +# Règles — Architecture (Pena-tauri) + +## Principe + +L'architecture est **Clean Architecture**. Toute nouvelle fonctionnalité doit respecter ce découpage sans exception. + +## Structure Rust (`src-tauri/src/`) + +``` +domain/ — entités et traits purs, zéro dépendance externe +application/ — services métier, dépend uniquement de domain/ +infrastructure/ — implémentations concrètes des traits de domain/ +commands/ — points d'entrée Tauri (#[tauri::command]), orchestrent application/ +``` + +## Structure JS (`src/`) + +``` +services/ — appels Tauri (invoke), logique de données +state/ — état global de l'application +ui/ — composants d'affichage, sans logique métier +``` + +## Règles de dépendance + +| Couche | Peut dépendre de | Ne peut PAS dépendre de | +|---|---|---| +| `domain` | rien | `application`, `infrastructure`, `commands` | +| `application` | `domain` | `infrastructure`, `commands` | +| `infrastructure` | `domain` | `application`, `commands` | +| `commands` | `application`, `domain` | `infrastructure` directement | +| `ui/` (JS) | `services/`, `state/` | rien d'externe hors Tauri | +| `services/` (JS) | invoke Tauri | `ui/` | + +## Ce qui est interdit + +- Instancier une implémentation concrète (`ComrakRenderer`, `FileRepository`, etc.) depuis `application/` ou `commands/` — passer par injection de dépendance ou par le point d'assemblage (`lib.rs`). +- Mettre de la logique métier dans `commands/` ou `ui/`. +- Mettre des appels Tauri (`invoke`) dans `ui/` — les déléguer à `services/`. +- Créer un module hors de ces quatre couches Rust sans justification explicite. + +## Point d'assemblage + +`lib.rs` est le seul endroit où les implémentations concrètes sont instanciées et câblées aux services. + +## Nouveau code + +Avant d'ajouter un fichier, se poser la question : **dans quelle couche appartient cette responsabilité ?** +- Règle métier / contrat → `domain/` +- Orchestration d'un cas d'usage → `application/` +- Accès I/O, filesystem, bibliothèque tierce → `infrastructure/` +- Commande exposée à Tauri → `commands/`