- CLAUDE.md devient un index concis : contexte, stack, regles absolues numerotees, pointeurs vers les fichiers de regles detaillees via references @.claude/rules/*.md - Les conventions detaillees (architecture, backend, frontend, testing, naming, git, workflow) sont extraites dans .claude/rules/ pour rester chargees a la demande sans gonfler le context du CLAUDE.md principal - Ajoute la regle absolue "Ne jamais mentionner Claude/IA dans commits ou PR" (point 10) pour garder l'historique git signe par l'utilisateur
2.9 KiB
2.9 KiB
Architecture — Modular Monolith DDD
Principe fondamental
Le backend est la source de verite unique. Il dicte :
- Quels modules sont actifs (
config/modules.php) - L'organisation de la sidebar (
config/sidebar.php, decouplee des modules)
Le frontend scanne modules/*/ comme layers Nuxt et consomme l'API pour la navigation. Il ne decide rien.
Endpoints API cles
GET /api/version(public) — version de l'appGET /api/modules(public) — IDs des modules actifsGET /api/sidebar(public) — sections filtrees par modules actifs +disabledRoutes(items dont le module owner est inactif)GET /api/me(auth) — user courant
Arborescence minimale (detail complet : @README.md)
src/
Shared/ # Noyau technique partage (Domain/, Application/Bus/, Infrastructure/ApiPlatform/)
Module/
Core/ # Module obligatoire (auth, users)
CoreModule.php # ID, LABEL, REQUIRED, permissions()
Domain/ Application/ Infrastructure/
Commercial/ # Exemple d'autre module
frontend/
app/ # Shell (layouts, middlewares)
shared/ # Code inter-modules (composables, stores, utils)
modules/ # Layers Nuxt auto-detectes
core/ commercial/
Declaration d'un module
Chaque module expose un *Module.php avec :
ID(snake_case, ex:commercial,gestion_rh)LABELREQUIRED(bool)- Methode statique
permissions()retournant les RBAC du module
Activer / desactiver un module
Editer uniquement config/modules.php (commenter la ligne). Cascade automatique :
/api/modulesne retourne plus l'ID/api/sidebarfiltre les itemsmodule: '<id>'et supprime les sections vides- Middleware front
modules.global.tsredirige toute navigation vers une route desactivee - Le code reste dans le bundle (layer auto-detecte) → reactivation instantanee sans rebuild
Reorganiser la sidebar
Editer uniquement config/sidebar.php. Le code des modules n'est pas touche — seule la place des items change. Chaque item reference son module owner via la cle module.
Communication inter-modules
Interdit : import direct d'une classe d'un autre module. Autorise :
- Via
Shared/Domain/Contract/(interfaces :UserResolverInterface,TenantAwareInterface...) - Via domain events (
Shared/Domain/Event/DomainEventInterface)
Migrations
- Par defaut :
src/Module/<Module>/Infrastructure/Doctrine/Migrations/(namespace modulaire) - Exception : les migrations d'initialisation critiques (setup user, RBAC, seed de base) vivent au namespace racine
DoctrineMigrationsdansmigrations/.- Raison : avec plusieurs
migrations_paths, Doctrine Migrations 3.x trie par FQCN alphabetique et non par version timestamp → ordre incorrect entre namespaces sur base vide. - A supprimer quand un
MigrationsComparatorcustom ou un upgrade Doctrine resoudra le tri.
- Raison : avec plusieurs