14 phases, 39 tasks covering: - Backend: security, code duplication, controllers, storage, tests - Frontend: mega-component split, duplication, TypeScript migration, tests Includes agent tracking system with status, journal, and rules. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
25 KiB
Plan de Refactoring - Inventory v1.2.0
Date de creation : 2026-02-03 Branche de travail :
refacto/v1.3.0Base :develop(commit8d83076)
Legende des statuts
| Statut | Signification |
|---|---|
[ ] |
A faire |
[~] |
En cours |
[x] |
Termine |
[!] |
Bloque / besoin d'info |
Phase 1 - Securite (CRITIQUE)
Priorite : MAXIMALE - A traiter en premier
1.1 Corriger la configuration de securite
- Statut :
[ ] - Fichier :
config/packages/security.yaml - Probleme :
PUBLIC_ACCESSapplique a toutes les routes/apiavant la regleIS_AUTHENTICATED_FULLY. Le pattern matching "first match wins" rend potentiellement tout public. - Action : Reordonner les regles
access_controlpour que les routes protegees soient listees AVANT les routes publiques. - Agent : -
- Notes : -
1.2 Ajouter les controles d'autorisation sur les controllers
- Statut :
[ ] - Fichiers :
src/Controller/MachineSkeletonController.phpsrc/Controller/CustomFieldValueController.phpsrc/Controller/DocumentQueryController.phpsrc/Controller/SessionProfileController.phpsrc/Controller/SessionProfilesController.php- Tous les
*HistoryController.php
- Probleme : Aucun attribut
#[IsGranted]sur les controllers custom. Pas de RBAC. - Action : Ajouter
#[IsGranted('IS_AUTHENTICATED_FULLY')]sur chaque controller (ou route). Definir des roles si necessaire. - Agent : -
- Notes : -
1.3 Securiser les secrets
- Statut :
[ ] - Fichiers :
.env(JWT_PASSPHRASE en dur, APP_SECRET vide)docker/.env.docker(credentialsroot:root)
- Action :
- Deplacer
JWT_PASSPHRASEdans.env.local(git-ignore) - Generer un
APP_SECRETvalide - Ajouter
.env.localdans.gitignoresi pas deja fait - Documenter la configuration des secrets pour les devs
- Deplacer
- Agent : -
- Notes : -
Phase 2 - Elimination de la duplication de code
Priorite : HAUTE - Impact direct sur la maintenabilite
2.1 Refactorer les 3 Audit Subscribers en un seul generique
- Statut :
[ ] - Fichiers concernes :
src/EventSubscriber/ProductAuditSubscriber.php(298 LOC)src/EventSubscriber/PieceAuditSubscriber.php(300 LOC)src/EventSubscriber/ComposantAuditSubscriber.php(300 LOC)
- Probleme : ~900 LOC dupliquees a ~95%. Les methodes
onFlush(),buildDiffFromChangeSet(),resolveActorProfileId(),mergeDiffs(),normalizeCollection()sont identiques. Seules les methodessnapshot*()different legerement. - Action :
- Creer un
AbstractAuditSubscriberou unGenericAuditSubscriberparametrable - Extraire la logique commune (onFlush, buildDiff, resolveActor, mergeDiffs, normalizeCollection)
- Utiliser un systeme de configuration par entite (map
entityClass => entityType + snapshotMethod) - Supprimer les 3 fichiers redondants
- Verifier que l'audit fonctionne toujours sur Product, Piece et Composant
- Creer un
- Agent : -
- Notes : Tester manuellement les logs d'audit apres refacto.
2.2 Extraire un CuidGenerator utilitaire
- Statut :
[ ] - Fichiers concernes : 18 entites contenant
generateCuid()en prive - Probleme : Methode
generateCuid()dupliquee dans chaque entite. De plus,AuditLog.phputilise une variante differente (base_convert). - Action :
- Creer
src/Util/CuidGenerator.phpavec une methode statiquegenerate(): string - Uniformiser l'implementation (choisir une seule methode)
- Remplacer tous les appels dans les 18 entites
- Supprimer les methodes privees devenues inutiles
- Creer
- Agent : -
- Notes : Attention a l'inconsistance entre AuditLog et les autres entites.
2.3 Factoriser la logique de liaison dans MachineSkeletonController
- Statut :
[ ] - Fichier :
src/Controller/MachineSkeletonController.php(756 LOC) - Probleme : Les methodes
applyComponentLinks(),applyPieceLinks(),applyProductLinks()sont quasi identiques (~90 LOC chacune). - Action :
- Extraire une methode generique
applyLinks(Machine $machine, array $links, string $type) - Parametrer par le type d'entite liee (Composant, Piece, Product)
- Reduire le controller a ~400 LOC max
- Extraire une methode generique
- Agent : -
- Notes : -
Phase 3 - Restructuration des controllers
Priorite : MOYENNE - Amelioration de la lisibilite et maintenabilite
3.1 Decouper MachineSkeletonController
- Statut :
[ ] - Fichier :
src/Controller/MachineSkeletonController.php(756 LOC) - Action :
- Extraire la logique metier dans un
MachineSkeletonService - Le controller ne doit gerer que la requete/reponse HTTP
- Le service gere la logique de skeleton (get, update, applyLinks)
- Extraire les helpers (
resolveIdentifier,indexLinksById,applyOverrides,normalizeMachineSkeletonResponse) dans le service
- Extraire la logique metier dans un
- Agent : -
- Notes : Depend de la phase 2.3 (factorisation des liens).
3.2 Ajouter un try-catch et du logging dans les controllers
- Statut :
[ ] - Fichiers : Tous les controllers dans
src/Controller/ - Probleme : Aucun try-catch autour des
flush()etpersist(). Pas de logging d'erreurs. - Action :
- Ajouter
try-catchautour des operations Doctrine dans chaque controller - Logger les erreurs avec le
LoggerInterfacede Symfony (Monolog) - Retourner des reponses JSON coherentes en cas d'erreur serveur (500)
- Ajouter
- Agent : -
- Notes : -
3.3 Renforcer la validation des entrees
- Statut :
[ ] - Fichiers :
src/Controller/CustomFieldValueController.phpsrc/Controller/MachineSkeletonController.php
- Probleme : Pas de validation de longueur max, pas de regex sur les IDs, pas de controle de profondeur JSON.
- Action :
- Valider le format des IDs (regex CUID :
/^cl[a-f0-9]{24}$/) - Ajouter des limites de longueur sur les champs string
- Utiliser le composant Validator de Symfony pour les DTOs si pertinent
- Valider le format des IDs (regex CUID :
- Agent : -
- Notes : -
Phase 4 - Amelioration du stockage
Priorite : MOYENNE - Performance et scalabilite
4.1 Migrer le stockage PDF de base64 vers le filesystem
- Statut :
[ ] - Fichiers :
src/Entity/Document.phpsrc/Command/CompressPdfCommand.phpsrc/Service/PdfCompressorService.php
- Probleme : Les PDFs sont stockes en base64 dans la colonne
path(TEXT) de la BDD. Risque de DoS et mauvaise perf sur des gros fichiers. - Action :
- Utiliser
vich/uploader-bundle(deja installe) pour le stockage fichier - Configurer un repertoire de stockage (
var/uploads/documents/) - Migrer les documents existants (script de migration)
- Adapter
PdfCompressorServicepour lire/ecrire sur le filesystem - Mettre a jour l'entite Document
- Utiliser
- Agent : -
- Notes : Prevoir une migration de donnees pour les documents existants.
4.2 Corriger les types de prix (string -> decimal)
- Statut :
[ ] - Fichiers :
src/Entity/Machine.php($prix)src/Entity/Product.php($supplierPrice)
- Probleme : Les prix sont types
?stringen PHP alors que la colonne estDECIMAL(10,2)en BDD. - Action :
- Changer le type PHP en
?floatou utiliserbrick/money - Adapter les getters/setters
- Verifier la serialisation API Platform
- Changer le type PHP en
- Agent : -
- Notes : Impact potentiel sur le frontend (format des nombres).
Phase 5 - Utilisation du Process Component
Priorite : BASSE - Bonne pratique
5.1 Remplacer exec() par Symfony Process
- Statut :
[ ] - Fichiers :
src/Command/CompressPdfCommand.php(lignes 42, 98-101)src/Service/PdfCompressorService.php(lignes 37-41)
- Probleme : Utilisation de
exec()directe pour appelerqpdf. - Action :
- Remplacer par
Symfony\Component\Process\Process - Gerer le timeout et les erreurs proprement
- Tester que la compression fonctionne toujours
- Remplacer par
- Agent : -
- Notes :
escapeshellarg()est deja utilise, donc pas de faille de securite immediate.
Phase 6 - Tests
Priorite : HAUTE - Indispensable avant toute refacto majeure
6.1 Mettre en place les tests unitaires
- Statut :
[ ] - Fichiers a creer :
tests/Unit/Util/CuidGeneratorTest.phptests/Unit/Entity/MachineTest.phptests/Unit/Entity/ProductTest.phptests/Unit/Service/PdfCompressorServiceTest.php
- Action :
- Tester le CuidGenerator (format, unicite)
- Tester les entites (validation, lifecycle callbacks)
- Tester le PdfCompressorService
- Agent : -
- Notes : -
6.2 Mettre en place les tests fonctionnels (API)
- Statut :
[ ] - Fichiers a creer :
tests/Functional/Api/MachineTest.phptests/Functional/Api/ProductTest.phptests/Functional/Api/AuthenticationTest.phptests/Functional/Api/MachineSkeletonTest.php
- Action :
- Configurer une base de test (SQLite ou PostgreSQL de test)
- Creer des fixtures de test
- Tester les endpoints CRUD
- Tester l'authentification JWT
- Tester les endpoints custom (skeleton, custom fields)
- Agent : -
- Notes : Utiliser
ApiTestCasede API Platform.
6.3 Tests des Audit Subscribers
- Statut :
[ ] - Fichiers a creer :
tests/Unit/EventSubscriber/AuditSubscriberTest.php
- Action :
- Tester la creation de logs sur insert/update/delete
- Tester le format des diffs et snapshots
- Tester la resolution de l'acteur
- Agent : -
- Notes : A faire APRES la phase 2.1 (refacto des subscribers).
Phase 7 - Nettoyage et conventions
Priorite : BASSE - Polish final
7.1 Supprimer les fichiers inutiles
- Statut :
[ ] - Fichiers a verifier :
frontend/(dossier legacy ? vsInventory_frontend/)src/ApiResource/(repertoire vide)- Fichiers SQL a la racine (
backup_v1.0.0.sql,data_norm.sql,fullasse.sql,fulldata.sql)
- Action : Confirmer avec l'equipe quels fichiers sont obsoletes et les supprimer.
- Agent : -
- Notes : Ne pas supprimer sans validation.
7.2 Uniformiser la gestion des null
- Statut :
[ ] - Fichiers : Toutes les entites dans
src/Entity/ - Action : S'assurer que les types nullable sont coherents entre PHP et la BDD (colonnes NOT NULL vs nullable).
- Agent : -
- Notes : -
FRONTEND (Inventory_frontend/)
Phase F1 - Decoupage des mega-composants (CRITIQUE)
Priorite : MAXIMALE - Les fichiers actuels sont inmaintenables
F1.1 Decouper machine/[id].vue (4308 LOC)
- Statut :
[ ] - Fichier :
Inventory_frontend/app/pages/machine/[id].vue - Probleme : Page monolithique de 4308 lignes. Contient la vue detail, l'edition, la gestion du skeleton, les composants, les pieces, les produits, les documents, l'historique.
- Action :
- Identifier les sections logiques (header, detail, skeleton, composants, pieces, produits, documents, historique)
- Extraire chaque section en composant dedie :
components/machine/MachineHeader.vuecomponents/machine/MachineDetail.vuecomponents/machine/MachineSkeletonEditor.vuecomponents/machine/MachineComponentsList.vuecomponents/machine/MachinePiecesList.vuecomponents/machine/MachineProductsList.vuecomponents/machine/MachineDocuments.vuecomponents/machine/MachineHistory.vue
- La page
[id].vuene doit plus etre qu'un orchestrateur (<300 LOC) - Utiliser
provide/injectou un composable partage pour l'etat machine
- Agent : -
- Notes : Tache la plus impactante du frontend. A faire en premier.
F1.2 Decouper machines/new.vue (2313 LOC)
- Statut :
[ ] - Fichier :
Inventory_frontend/app/pages/machines/new.vue - Probleme : Page de creation de machine avec selection de type et heritage de structure, trop volumineuse.
- Action :
- Extraire le formulaire de creation en composant
MachineCreateForm.vue - Extraire la selection de type en
MachineTypeSelector.vue - Extraire l'apercu de structure en composant separe
- Objectif : page <200 LOC
- Extraire le formulaire de creation en composant
- Agent : -
- Notes : -
F1.3 Decouper les pages de creation/edition (Piece, Component, Product)
- Statut :
[ ] - Fichiers :
pages/component/create.vue(1282 LOC)pages/component/[id]/edit.vue(1629 LOC)pages/pieces/create.vue(817 LOC)pages/pieces/[id]/edit.vue(1327 LOC)pages/product/[id]/edit.vue(936 LOC)
- Probleme : Formulaires monolithiques avec sections multiples (infos generales, fournisseurs, documents, custom fields, etc.).
- Action :
- Identifier les sections communes entre create/edit (factoriser)
- Extraire chaque section en composant reutilisable :
EntityFormGeneral.vue(nom, reference, description)EntityFormSuppliers.vue(constructeurs)EntityFormDocuments.vue(documents)EntityFormCustomFields.vue(champs personnalises)
- Objectif par page : <400 LOC
- Agent : -
- Notes : Les formulaires create et edit partagent beaucoup de code. Factoriser.
F1.4 Reduire PieceItem.vue (1588 LOC) et ComponentItem.vue (1336 LOC)
- Statut :
[ ] - Fichiers :
Inventory_frontend/app/components/PieceItem.vue(1588 LOC)Inventory_frontend/app/components/ComponentItem.vue(1336 LOC)
- Probleme : Composants d'affichage/edition inline tres volumineux.
- Action :
- Separer la vue lecture de la vue edition
- Extraire les sous-sections (details, documents, fournisseurs) en sous-composants
- Objectif : <400 LOC par composant
- Agent : -
- Notes : -
Phase F2 - Elimination de la duplication frontend
Priorite : HAUTE - DRY
F2.1 Extraire extractCollection() dans un utilitaire partage
- Statut :
[ ] - Fichiers concernes :
composables/useSites.jscomposables/useProducts.jscomposables/usePieces.jscomposables/useComposants.jscomposables/useMachineTypesApi.jscomposables/useConstructeurs.js
- Probleme : La fonction
extractCollection()(parsinghydra:member/member/ array) est dupliquee dans 6+ fichiers. - Action :
- Creer
shared/utils/apiHelpers.ts - Y placer
extractCollection(),extractRelationId(),normalizeRelationIds() - Remplacer les implementations locales par un import
- Creer
- Agent : -
- Notes : -
F2.2 Fusionner les 3 composables d'historique
- Statut :
[ ] - Fichiers concernes :
composables/useComponentHistory.ts(67 LOC)composables/usePieceHistory.ts(67 LOC)composables/useProductHistory.ts(67 LOC)
- Probleme : 3 fichiers quasi identiques (seul le endpoint differe).
- Action :
- Creer
composables/useEntityHistory.tsparametrable par type d'entite - Supprimer les 3 fichiers specifiques
- Creer
- Agent : -
- Notes : -
F2.3 Factoriser les composables de types (Component/Piece/Product)
- Statut :
[ ] - Fichiers concernes :
composables/useComponentTypes.js(140 LOC)composables/usePieceTypes.js(140 LOC)composables/useProductTypes.js(132 LOC)
- Probleme : 3 composables tres similaires pour gerer les categories/types.
- Action :
- Creer
composables/useEntityTypes.tsgenerique - Parametrer par type d'entite et endpoint
- Creer
- Agent : -
- Notes : -
Phase F3 - Migration TypeScript
Priorite : HAUTE - Securite du typage
F3.1 Definir les types pour les reponses API
- Statut :
[ ] - Fichier a creer :
Inventory_frontend/app/shared/types/api.ts - Probleme : Aucun type pour les reponses API. Les composables travaillent avec
anyimplicite. - Action :
- Definir les interfaces pour chaque entite API :
ApiMachine,ApiProduct,ApiPiece,ApiComposantApiSite,ApiDocument,ApiConstructeurApiAuditLog,ApiProfile,ApiCustomField
- Definir
ApiCollectionResponse<T>(hydra:member, totalItems, etc.) - Definir
ApiErrorResponse - Typer les retours de
useApi()
- Definir les interfaces pour chaque entite API :
- Agent : -
- Notes : Partir de
shared/types/inventory.ts(289 LOC) qui contient deja des types partiels.
F3.2 Convertir les composables JS en TS
- Statut :
[ ] - Fichiers concernes (10 fichiers JS) :
useApi.js->useApi.tsuseMachines.js->useMachines.tsuseProducts.js->useProducts.tsusePieces.js->usePieces.tsuseComposants.js->useComposants.tsuseConstructeurs.js->useConstructeurs.tsuseSites.js->useSites.tsuseDocuments.js->useDocuments.tsuseMachineTypesApi.js->useMachineTypesApi.tsuseCustomFields.js->useCustomFields.ts
- Action :
- Renommer
.jsen.ts - Ajouter les types de retour, parametres, et variables reactives
- Utiliser les types API definis en F3.1
- Eliminer tous les
anyexplicites et implicites
- Renommer
- Agent : -
- Notes : Depend de F3.1 (types API).
F3.3 Eliminer les any restants
- Statut :
[ ] - Fichiers concernes :
components/common/ProductSelect.vuecomponents/common/ManagementView.vuecomponents/ComponentStructureAssignmentNode.vuecomponents/model-types/ComponentModelStructureEditor.vuecomponents/model-types/ModelTypeForm.vue
- Probleme : 20+ usages de
anytype identifies. - Action : Remplacer chaque
anypar un type concret ou un type union. - Agent : -
- Notes : -
Phase F4 - Qualite du code frontend
Priorite : MOYENNE
F4.1 Activer les regles ESLint critiques
- Statut :
[ ] - Fichier :
Inventory_frontend/eslint.config.mjs - Probleme : Presque toutes les regles sont desactivees (
no-console: off,no-unused-vars: off,no-explicit-any: off). - Action :
- Activer
@typescript-eslint/no-explicit-any: warn - Activer
no-console: warn(ouerrorsauf pourconsole.error) - Activer
no-unused-vars: warn - Fixer les violations progressivement
- Activer
- Agent : -
- Notes : 94 appels
console.*a nettoyer.
F4.2 Nettoyer les console.log/console.error
- Statut :
[ ] - Fichiers : ~94 occurrences dans le frontend
- Probleme : Appels de debug laisses dans le code de production.
- Action :
- Remplacer les
console.errorutiles par un logger centralise (ouuseToast) - Supprimer les
console.logde debug - Creer un utilitaire
logger.tssi necessaire (qui respecteenableDebugdu runtime config)
- Remplacer les
- Agent : -
- Notes : -
F4.3 Centraliser la gestion d'erreurs API
- Statut :
[ ] - Fichier :
Inventory_frontend/app/composables/useApi.js(105 LOC) - Probleme : Gestion d'erreur basique (juste un toast). Pas de retry, pas d'intercepteur, erreurs silencieuses dans certains composables.
- Action :
- Ajouter un systeme de retry configurable (1-3 tentatives)
- Centraliser la gestion des erreurs HTTP (401 -> redirect login, 500 -> message explicite)
- Ajouter des intercepteurs request/response
- Uniformiser le pattern dans tous les composables
- Agent : -
- Notes : -
Phase F5 - Reduire le fichier modelUtils.ts (1017 LOC)
Priorite : MOYENNE
F5.1 Decouper shared/modelUtils.ts
- Statut :
[ ] - Fichier :
Inventory_frontend/app/shared/modelUtils.ts(1017 LOC) - Probleme : Fichier utilitaire monolithique de 1017 lignes regroupant toute la logique de manipulation de modeles.
- Action :
- Identifier les groupes de fonctions (structure, custom fields, requirements, serialization)
- Decouper en modules :
shared/model/structureUtils.tsshared/model/customFieldUtils.tsshared/model/requirementUtils.tsshared/model/serializationUtils.ts
- Re-exporter depuis un
shared/model/index.tspour ne pas casser les imports
- Agent : -
- Notes : -
Phase F6 - Tests frontend
Priorite : HAUTE - Aucun test actuellement
F6.1 Configurer Vitest
- Statut :
[ ] - Fichier a creer :
Inventory_frontend/vitest.config.ts - Action :
- Installer
vitest,@vue/test-utils,@nuxt/test-utils - Configurer Vitest avec support Vue/Nuxt
- Ajouter un script
testdanspackage.json - Creer un premier test smoke
- Installer
- Agent : -
- Notes : -
F6.2 Tests unitaires des composables
- Statut :
[ ] - Fichiers a creer :
tests/composables/useApi.test.tstests/composables/useProducts.test.tstests/composables/useToast.test.tstests/shared/apiHelpers.test.ts(apres F2.1)
- Action :
- Tester
useApi(requetes, timeout, erreurs) - Tester
extractCollection()(tous les formats de reponse) - Tester les composables CRUD (mock des appels API)
- Tester le toast (ajout, suppression, max toasts)
- Tester
- Agent : -
- Notes : -
F6.3 Tests de composants
- Statut :
[ ] - Fichiers a creer :
tests/components/Pagination.test.tstests/components/SearchSelect.test.tstests/components/MachineHeader.test.ts(apres F1.1)
- Action :
- Tester les composants communs (Pagination, SearchSelect)
- Tester le rendu conditionnel et les events
- Agent : -
- Notes : -
Phase F7 - Ameliorations UX/DX
Priorite : BASSE - Polish
F7.1 Reduire le props drilling
- Statut :
[ ] - Probleme : Props passees sur 3+ niveaux (ex: machine data dans les sous-composants).
- Action :
- Identifier les cas de props drilling >2 niveaux
- Utiliser
provide/injectou des composables partages - Documenter le pattern choisi
- Agent : -
- Notes : A traiter apres F1 (decoupage des composants).
F7.2 Remplacer confirm() natif par des modales DaisyUI
- Statut :
[ ] - Probleme : Les confirmations de suppression utilisent
window.confirm()(UI native, non-stylee). - Action :
- Creer un composant
ConfirmModal.vuereutilisable - Ou creer un composable
useConfirm()qui affiche une modale DaisyUI - Remplacer tous les
confirm()dans les composants
- Creer un composant
- Agent : -
- Notes : -
F7.3 Nettoyer app.vue (861 LOC)
- Statut :
[ ] - Fichier :
Inventory_frontend/app/app.vue(861 LOC) - Probleme : Le fichier racine contient le layout principal, la navbar, la sidebar, et du state management.
- Action :
- Extraire la navbar en
components/layout/AppNavbar.vue - Extraire la sidebar en
components/layout/AppSidebar.vue - Utiliser un layout Nuxt (
layouts/default.vue) app.vuene doit contenir que<NuxtLayout>et les providers globaux
- Extraire la navbar en
- Agent : -
- Notes : -
Ordre d'execution recommande
=== BACKEND === === FRONTEND ===
Phase 6.1 (Tests unitaires) Phase F6.1 (Config Vitest)
| |
v v
Phase 1 (Securite) Phase F1 (Decoupage mega-composants)
| |
v v
Phase 2 (Duplication backend) Phase F2 (Duplication frontend)
| |
v v
Phase 3 (Controllers) Phase F3 (Migration TypeScript)
| |
v v
Phase 6.2 (Tests API) Phase F4 (Qualite code) + Phase F5 (modelUtils)
| |
v v
Phase 4 (Stockage) Phase F6.2-F6.3 (Tests frontend)
| |
v v
Phase 5 + Phase 7 (Nettoyage) Phase F7 (UX/DX polish)
|
v
Phase 6.3 (Tests audit)
Les colonnes backend et frontend peuvent etre executees en parallele par des agents differents.
Journal des modifications
| Date | Phase | Tache | Agent | Statut | Notes |
|---|---|---|---|---|---|
| 2026-02-03 | - | Creation du plan backend | Claude Opus 4.5 | Termine | Analyse initiale backend (7 phases, 17 taches) |
| 2026-02-03 | - | Creation du plan frontend | Claude Opus 4.5 | Termine | Analyse frontend (7 phases, 22 taches) |
Regles pour les agents
-
Avant de commencer une tache :
- Mettre le statut a
[~]dans ce fichier - Inscrire son nom/ID dans la colonne "Agent"
- Lire les fichiers concernes AVANT de modifier quoi que ce soit
- Mettre le statut a
-
Pendant le travail :
- Ne modifier QUE les fichiers listes dans la tache
- Respecter les conventions existantes (PSR-12, strict_types)
- Ne pas introduire de nouvelles dependances sans justification
- Lancer
php-cs-fixerapres les modifications
-
Apres avoir termine :
- Mettre le statut a
[x] - Ajouter une entree dans le "Journal des modifications"
- Lancer les tests existants (
make test) pour verifier la non-regression - Decrire brievement les changements effectues dans "Notes"
- Mettre le statut a
-
En cas de blocage :
- Mettre le statut a
[!] - Documenter le blocage dans "Notes"
- Ne PAS passer a une autre tache sans signaler le blocage
- Mettre le statut a
-
Regles specifiques au frontend :
- Ecrire en TypeScript (pas de JS pour les nouveaux fichiers)
- Pas de
any- utiliser des types concrets - Pas de
console.log- utiliser le logger ouuseToast - Composants Vue : max 400 LOC par fichier
- Utiliser les composants DaisyUI existants (pas de CSS custom)
- Tester avec Vitest quand la config est en place
-
Regles specifiques au backend :
declare(strict_types=1)obligatoire- Respecter PSR-12 + regles Symfony (php-cs-fixer)
- Pas de
exec()direct - utiliser Symfony Process - Tester avec PHPUnit