diff --git a/ROADMAP.md b/ROADMAP.md index c49facf7..fc5345a7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,21 +1,21 @@ -# Roadmap BowPHP Framework +# BowPHP Framework Roadmap -> Document évolutif basé sur l'analyse du code source (branche 5.x) et le manifeste du projet. -> Dernière mise à jour : Mai 2026 +> Living document based on source code analysis (5.x branch) and the project manifesto. +> Last updated: May 2026 --- -## État Actuel du Framework +## Current Framework State -### Modules Existants (Analyse du `/src`) +### Existing Modules (`/src` Analysis) -| Module | Statut | Description | -| ---------------------- | --------- | ---------------------------------------------- | +| Module | Status | Description | +| ---------------------- | -------- | ---------------------------------------------- | | **Application** | ✅ Stable | Bootstrap, exception handling, kernel | | **Auth** | ✅ Stable | Guards (Session, JWT), Authentication | | **Cache** | ✅ Stable | Adapters: Database, Filesystem, Redis | | **Configuration** | ✅ Stable | Loader, Env, Logger configuration | -| **Console** | ✅ Stable | 26 commandes, générateurs, stubs | +| **Console** | ✅ Stable | 26 commands, generators, stubs | | **Container** | ✅ Stable | DI container, middleware dispatcher | | **Database/Barry ORM** | ✅ Stable | MySQL, PostgreSQL, SQLite + Relations | | **Event** | ✅ Stable | Event dispatcher, listeners, queue integration | @@ -31,233 +31,233 @@ | **Support** | ✅ Stable | Helpers, Collection, Str, Log, Env | | **Testing** | ✅ Stable | TestCase, Assertions, KernelTesting | | **Translate** | ✅ Stable | i18n support | -| **Validation** | ✅ Stable | Règles de validation, messages custom | +| **Validation** | ✅ Stable | Validation rules, custom messages | | **View** | ✅ Stable | Tintin (default), Twig support | -### Dépendances Actuelles +### Current Dependencies -**Requises :** +**Required:** -- PHP ^8.1 -- bowphp/tintin ^3.0 (template engine) -- filp/whoops ^2.1 (error handling) -- nesbot/carbon 3.8.4 (dates) -- fakerphp/faker ^1.20 (testing data) -- ramsey/uuid ^4.7 (UUIDs) +* PHP ^8.1 +* bowphp/tintin ^3.0 (template engine) +* filp/whoops ^2.1 (error handling) +* nesbot/carbon 3.8.4 (dates) +* fakerphp/faker ^1.20 (testing data) +* ramsey/uuid ^4.7 (UUIDs) -**Dev/Suggérées :** +**Dev/Suggested:** -- pda/pheanstalk ^5.0 (Beanstalkd) -- aws/aws-sdk-php ^3.87 (S3) -- bowphp/policier ^3.0 (JWT) -- predis/predis ^2.1 (Redis) -- twilio/sdk ^8.3 (SMS) -- bowphp/slack-webhook ^1.0 (Slack) +* pda/pheanstalk ^5.0 (Beanstalkd) +* aws/aws-sdk-php ^3.87 (S3) +* bowphp/policier ^3.0 (JWT) +* predis/predis ^2.1 (Redis) +* twilio/sdk ^8.3 (SMS) +* bowphp/slack-webhook ^1.0 (Slack) --- -## ✅ Récemment livré (printemps 2026) +## ✅ Recently Delivered (Spring 2026) -Faits saillants des dernières itérations — déjà mergés sur `5.x`. Tous les détails dans le CHANGELOG. +Highlights from the latest iterations — already merged into `5.x`. Full details are available in the CHANGELOG. ### Routing -- Routage par attributs PHP 8 (cf. section dédiée plus bas). -- `Router::$routes` rendu instance (corrige les fuites d'état entre tests). -- Préfixe de nom du `#[Controller]` appliqué aux routes filles ; méthodes héritées ignorées au scan. +* PHP 8 attribute routing support (see dedicated section below). +* `Router::$routes` converted to instance state (fixes shared state leaks between tests). +* `#[Controller]` name prefix applied to child routes; inherited methods ignored during scanning. ### Barry ORM -- Trait `SoftDelete` (`delete` → `deleted_at`, `restore`, `forceDelete`, `withTrashed` / `onlyTrashed` / `withoutTrashed`, événements `model.restoring/restored/forceDeleting/forceDeleted`). -- Cast `array` réparé : ne renvoie plus un `stdClass`. -- Propriété morte `$soft_delete` supprimée (remplacée par le trait). -- Visibilité `EventTrait::fireEvent` / `formatEventName` élargie à `protected` pour les traits enfants. +* `SoftDelete` trait (`delete` → `deleted_at`, `restore`, `forceDelete`, `withTrashed` / `onlyTrashed` / `withoutTrashed`, events `model.restoring/restored/forceDeleting/forceDeleted`). +* Fixed `array` cast: no longer returns `stdClass`. +* Removed dead `$soft_delete` property (replaced by the trait). +* `EventTrait::fireEvent` / `formatEventName` visibility expanded to `protected` for child traits. ### Validation -- Nouvelles règles : `url`, `ip` (+ `ip:v4`, `ip:v6`), `boolean`, `json`, `uuid`, `confirmed`, `different:field`, `between:min,max`. -- Priorité corrigée : `nullable|required` laisse `required` s'exécuter (et l'inner-loop break utilise enfin la bonne variable). +* New rules: `url`, `ip` (+ `ip:v4`, `ip:v6`), `boolean`, `json`, `uuid`, `confirmed`, `different:field`, `between:min,max`. +* Fixed priority handling: `nullable|required` now allows `required` to execute properly (and the inner-loop break now uses the correct variable). -### Infrastructure de test +### Testing Infrastructure -- `TestCase` refactoré : vrai DELETE/PATCH (plus de hack `_method`), `head()` / `options()`, factorisation via `newHttpClient()`, reset auto des attachements, port par défaut 8080. -- `Env::reset()` ajouté pour la propreté entre suites de tests. -- `SchedulerCommand` charge automatiquement `routes/scheduler.php` et tolère un Loader manquant. -- `addEnum` / `changeEnum` : messages d'erreur explicites (mentionnent la clé `size`). -- Bootstrap des tests filtre les `E_DEPRECATED` issus de `vendor/` (lcobucci/jwt v3.2.5, spatie 4.x). -- Pagination : tests appelaient `total()` au lieu de `totalPages()` — 24 cas corrigés. +* `TestCase` refactored: real DELETE/PATCH support (no more `_method` hack), `head()` / `options()`, shared logic through `newHttpClient()`, automatic attachment reset, default port 8080. +* `Env::reset()` added for cleaner test isolation. +* `SchedulerCommand` now automatically loads `routes/scheduler.php` and tolerates a missing Loader. +* `addEnum` / `changeEnum`: explicit error messages (mention the `size` key). +* Test bootstrap now filters `E_DEPRECATED` coming from `vendor/` (`lcobucci/jwt v3.2.5`, spatie 4.x). +* Pagination: tests were calling `total()` instead of `totalPages()` — 24 test cases fixed. -### Tintin (vendoré) +### Tintin (vendored) -- Cache atomique (`rename`), `mkdir` récursif, invalidation par `filemtime` (au lieu de `fileatime`). -- `Compiler::compile` ne perd plus les lignes vides ; ajout d'un post-pass `?>\n\n` pour préserver l'indentation des snippets `
/`.
-- `Tintin::renderString` utilise `tempnam()` + `try/finally` ; suppression du `trim()` destructif.
-- Heuristique d'échappement `{{ ... }}` resserrée mais compatible Vue/Angular.
-- `directivesProtected` enrichi (csrf, macro/endmacro, lang, flash, notempty…).
+* Atomic cache (`rename`), recursive `mkdir`, invalidation based on `filemtime` (instead of `fileatime`).
+* `Compiler::compile` no longer removes empty lines; added `?>\n\n` post-pass to preserve indentation in `/` snippets.
+* `Tintin::renderString` now uses `tempnam()` + `try/finally`; removed destructive `trim()`.
+* Tightened `{{ ... }}` escaping heuristic while remaining compatible with Vue/Angular.
+* Extended `directivesProtected` (`csrf`, `macro/endmacro`, `lang`, `flash`, `notempty`, etc.).
### Documentation & READMEs
-- Audit complet de `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Mail, Storage, Messaging, Container, Pagination, Scheduler, Task, Testing, Configuration, Concept, Controller, CQRS, Database, Policier, Service, Session, SoAuth, Structure, Upload, View, Package, Contribution).
-- README mis à jour (badges, compteurs de tests, soft delete, attribut routing, helpers de commande).
-- `microservice` (sous-projet) : refactor de `MicroserviceConfiguration` (extends `Configuration`, PSR-4 propre), `microservice.php` Bow-intégré, namespace `Bow\Console\Command\Generator` corrigé.
+* Full audit of `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Mail, Storage, Messaging, Container, Pagination, Scheduler, Task, Testing, Configuration, Concept, Controller, CQRS, Database, Policier, Service, Session, SoAuth, Structure, Upload, View, Package, Contribution).
+* Updated README (badges, test counters, soft delete, attribute routing, command helpers).
+* `microservice` (subproject): `MicroserviceConfiguration` refactor (`extends Configuration`, clean PSR-4), Bow-integrated `microservice.php`, fixed `Bow\Console\Command\Generator` namespace.
---
-## 🔴 NOW — 0 à 3 mois (Stabilisation & Consolidation)
-
-### Tests et CI/CD
-
-| Tâche | Statut | Priorité | Notes |
-| --------------------------------------------------- | ------------ | -------- | ------------------------------------------------------ |
-| Séparer les tests unitaires des tests d'intégration | ⏳ À faire | Haute | Les tests DB/FTP/S3 nécessitent des services externes |
-| Ajouter `@group` PHPUnit pour isoler les tests | ⏳ À faire | Haute | `@group unit`, `@group integration`, `@group database` |
-| Configurer GitHub Actions avec services Docker | ⏳ À faire | Haute | MySQL, PostgreSQL, Redis pour CI |
-| Augmenter couverture tests unitaires | 🔄 En cours | Moyenne | 1 600+ tests, 0 échec logique. Ajouts récents : SoftDelete, AttributeRouteRegistrar, nouvelles règles de validation, Pagination. |
-| Intégrer PHPStan niveau 5+ | ⏳ À faire | Moyenne | Constraint actuel : `phpstan/phpstan: ^0.12.87` — bumper vers ^1.x avant de cibler un niveau plus élevé |
-
-### Corrections de Code
-
-| Tâche | Statut | Priorité | Notes |
-| -------------------------------------------------------------------- | ---------- | -------- | ---------------------------------------------------------------------- |
-| Fixer le test d'attribut middleware (state partagé entre tests) | ✅ Fait | - | `Router::$routes` rendue instance (n'était plus partagée entre tests) |
-| Fixer les tests Pagination qui appelaient `total()` au lieu de `totalPages()` | ✅ Fait | - | 24 tests corrigés |
-| Fixer le cast `array` du modèle Barry qui renvoyait `stdClass` | ✅ Fait | - | `Model::executeDataCasting` + `parseToJson($value, assoc: true)` |
-| Fixer la priorité `nullable\|required` du Validator | ✅ Fait | - | `nullable` ne court-circuite plus `required` |
-| Fixer `EnvTest` (pollution du singleton entre tests) | ✅ Fait | - | `Env::reset()` ajouté |
-| Fixer `SchedulerCommand` (chargement de `routes/scheduler.php`) | ✅ Fait | - | `loadSchedulerFile()` mis à jour, tolère un Loader manquant |
-| Retirer la propriété morte `Model::$soft_delete` | ✅ Fait | - | Remplacée par un trait fonctionnel (cf. Soft delete plus bas) |
-| Améliorer les messages d'erreur de `addEnum` / `changeEnum` | ✅ Fait | - | Mentionnent explicitement la clé `size` |
-| Uniformiser les signatures de méthodes | ✅ Fait | - | PHP 8.1+ nullable types |
-| Fixer le cast `(double)` → `(float)` | ✅ Fait | - | Model.php |
-| Gérer `array_key_exists` avec clé null | ✅ Fait | - | Console.php |
-| Créer le répertoire de test si inexistant | ✅ Fait | - | CustomCommand.php |
+## 🔴 NOW — 0 to 3 Months (Stabilization & Consolidation)
+
+### Testing and CI/CD
+
+| Task | Status | Priority | Notes |
+| --------------------------------------------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+| Separate unit tests from integration tests | ⏳ Planned | High | DB/FTP/S3 tests require external services |
+| Add PHPUnit `@group` annotations | ⏳ Planned | High | `@group unit`, `@group integration`, `@group database` |
+| Configure GitHub Actions with Docker services | ⏳ Planned | High | MySQL, PostgreSQL, Redis for CI |
+| Increase unit test coverage | 🔄 Ongoing | Medium | 1,600+ tests, 0 logical failures. Recent additions: SoftDelete, AttributeRouteRegistrar, new validation rules, Pagination |
+| Integrate PHPStan level 5+ | ⏳ Planned | Medium | Current constraint: `phpstan/phpstan: ^0.12.87` — upgrade to ^1.x before targeting higher levels |
+
+### Code Fixes
+
+| Task | Status | Priority | Notes |
+| ---------------------------------------------------------------- | ------ | -------- | ---------------------------------------------------------------- |
+| Fix middleware attribute test (shared state between tests) | ✅ Done | - | `Router::$routes` converted to instance state |
+| Fix Pagination tests calling `total()` instead of `totalPages()` | ✅ Done | - | 24 tests fixed |
+| Fix Barry model `array` cast returning `stdClass` | ✅ Done | - | `Model::executeDataCasting` + `parseToJson($value, assoc: true)` |
+| Fix Validator `nullable\|required` priority | ✅ Done | - | `nullable` no longer short-circuits `required` |
+| Fix `EnvTest` singleton pollution between tests | ✅ Done | - | `Env::reset()` added |
+| Fix `SchedulerCommand` (`routes/scheduler.php` loading) | ✅ Done | - | `loadSchedulerFile()` updated, tolerates missing Loader |
+| Remove dead `Model::$soft_delete` property | ✅ Done | - | Replaced with a fully functional trait |
+| Improve `addEnum` / `changeEnum` error messages | ✅ Done | - | Explicitly mention the `size` key |
+| Standardize method signatures | ✅ Done | - | PHP 8.1+ nullable types |
+| Fix `(double)` → `(float)` cast | ✅ Done | - | `Model.php` |
+| Handle `array_key_exists` with null key | ✅ Done | - | `Console.php` |
+| Create test directory if missing | ✅ Done | - | `CustomCommand.php` |
### Documentation
-| Tâche | Statut | Priorité | Notes |
-| -------------------------------------------- | ------------ | -------- | ----------------------------------------------------------- |
-| Mettre à jour README avec exemples API-first | ✅ Fait | - | Compteurs de tests, exemples corrigés (`User::retrieve`, `persist()`, `$app`), attribut routing et soft delete mis en avant |
-| Documenter les configurations requises | ✅ Fait | - | Audit complet de `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Storage, Mail, Notifier, Container, Pagination, Scheduler, Task, etc.) |
-| Créer guide de contribution détaillé | ⏳ À faire | Basse | Au-delà du CONTRIBUTING.md |
+| Task | Status | Priority | Notes |
+| ------------------------------------- | --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
+| Update README with API-first examples | ✅ Done | - | Test counters, corrected examples (`User::retrieve`, `persist()`, `$app`), attribute routing and soft delete highlighted |
+| Document required configurations | ✅ Done | - | Full audit of `docs/docs/*.mdx` (ORM, Router, Validation, Migration, Storage, Mail, Notifier, Container, Pagination, Scheduler, Task, etc.) |
+| Create a detailed contribution guide | ⏳ Planned | Low | Beyond the current `CONTRIBUTING.md` |
---
-## 🟠 NEXT — 3 à 6 mois (Nouvelles Fonctionnalités)
+## 🟠 NEXT — 3 to 6 Months (New Features)
-### Queue - Adapter Redis
+### Queue - Redis Adapter
-| Tâche | Statut | Priorité | Notes |
-| ---------------------------------------- | ---------- | -------- | ------------------------------ |
-| Créer `RedisAdapter` pour Queue | ⏳ À faire | Haute | predis/predis déjà en dev-deps |
-| Implémenter delayed jobs avec Redis ZADD | ⏳ À faire | Haute | |
-| Ajouter monitoring des queues via CLI | ⏳ À faire | Moyenne | `bow queue:status` |
+| Task | Status | Priority | Notes |
+| -------------------------------------- | --------- | -------- | ------------------------------------------- |
+| Create `RedisAdapter` for Queue | ⏳ Planned | High | `predis/predis` already in dev dependencies |
+| Implement delayed jobs with Redis ZADD | ⏳ Planned | High | |
+| Add queue monitoring through CLI | ⏳ Planned | Medium | `bow queue:status` |
-### Router - Attributs PHP 8 ✅ Livré
+### Router - PHP 8 Attributes ✅ Delivered
-| Tâche | Statut | Priorité | Notes |
-| ------------------------------------------------------ | ------- | -------- | -------------------------------------------------------------------- |
-| Créer namespace `Bow\Router\Attributes` | ✅ Fait | - | `src/Router/Attributes/` |
-| Implémenter `#[Controller]` | ✅ Fait | - | `prefix`, `middleware`, `name` (préfixe de nom de route) |
-| Implémenter `#[Get]`, `#[Post]`, `#[Put]`, `#[Delete]` | ✅ Fait | - | + `#[Patch]`, `#[Options]`, `#[Route]` (multi-verbes), tous répétables |
-| Ajouter `$app->register(Controller::class)` | ✅ Fait | - | Accepte aussi un tableau de contrôleurs |
-| `AttributeRouteRegistrar` | ✅ Fait | - | Refactoré : préfixe de nom appliqué, méthodes héritées ignorées, sous-classe d'attribut acceptée |
-| Tests + stubs | ✅ Fait | - | `tests/Routing/AttributeRouteIntegrationTest.php` |
+| Task | Status | Priority | Notes |
+| ---------------------------------------------------- | ------ | -------- | -------------------------------------------------------------------------------------- |
+| Create namespace `Bow\Router\Attributes` | ✅ Done | - | `src/Router/Attributes/` |
+| Implement `#[Controller]` | ✅ Done | - | `prefix`, `middleware`, `name` (route name prefix) |
+| Implement `#[Get]`, `#[Post]`, `#[Put]`, `#[Delete]` | ✅ Done | - | + `#[Patch]`, `#[Options]`, `#[Route]` (multi-verb), all repeatable |
+| Add `$app->register(Controller::class)` | ✅ Done | - | Also accepts an array of controllers |
+| `AttributeRouteRegistrar` | ✅ Done | - | Refactored: name prefix applied, inherited methods ignored, attribute subclass support |
+| Tests + stubs | ✅ Done | - | `tests/Routing/AttributeRouteIntegrationTest.php` |
-### Cache - Adapter Memcached
+### Cache - Memcached Adapter
-| Tâche | Statut | Priorité | Notes |
-| --------------------------------------------- | ---------- | -------- | ----- |
-| Créer `MemcachedAdapter` | ⏳ À faire | Moyenne | |
-| Améliorer résilience Redis (reconnexion auto) | ⏳ À faire | Moyenne | |
+| Task | Status | Priority | Notes |
+| ----------------------------------------- | --------- | -------- | ----- |
+| Create `MemcachedAdapter` | ⏳ Planned | Medium | |
+| Improve Redis resiliency (auto-reconnect) | ⏳ Planned | Medium | |
### Messaging - Push Notifications
-| Tâche | Statut | Priorité | Notes |
-| ------------------------------------ | ---------- | -------- | ------------- |
-| Créer `FcmChannelAdapter` (Firebase) | ⏳ À faire | Moyenne | |
-| Créer `ApnsChannelAdapter` (Apple) | ⏳ À faire | Moyenne | |
-| Améliorer `TelegramChannelAdapter` | ⏳ À faire | Basse | Déjà existant |
-| Améliorer `SlackChannelAdapter` | ⏳ À faire | Basse | Déjà existant |
+| Task | Status | Priority | Notes |
+| ------------------------------------- | --------- | -------- | -------------- |
+| Create `FcmChannelAdapter` (Firebase) | ⏳ Planned | Medium | |
+| Create `ApnsChannelAdapter` (Apple) | ⏳ Planned | Medium | |
+| Improve `TelegramChannelAdapter` | ⏳ Planned | Low | Already exists |
+| Improve `SlackChannelAdapter` | ⏳ Planned | Low | Already exists |
### Database
-| Tâche | Statut | Priorité | Notes |
-| ----------------------------------------- | ---------- | -------- | ---------------------------- |
-| Ajouter support SQL Server | ⏳ À faire | Moyenne | |
-| Créer adapter Array/FileWriter pour tests | ⏳ À faire | Moyenne | Évite dépendance DB en tests |
+| Task | Status | Priority | Notes |
+| ----------------------------------------- | --------- | -------- | ------------------------------ |
+| Add SQL Server support | ⏳ Planned | Medium | |
+| Create Array/FileWriter adapter for tests | ⏳ Planned | Medium | Removes DB dependency in tests |
---
-## 🟢 LATER — 6 à 12 mois (Vision Long Terme)
+## 🟢 LATER — 6 to 12 Months (Long-Term Vision)
-### Performance et Modernisation
+### Performance and Modernization
-| Tâche | Statut | Priorité | Notes |
-| -------------------------------------------- | ---------- | -------- | -------------------------- |
-| Support Swoole/FrankenPHP | ⏳ À faire | Moyenne | Serveurs non-bloquants |
-| Images Docker officielles | ⏳ À faire | Moyenne | Optimisées pour production |
-| Support serverless (Lambda, Cloud Functions) | ⏳ À faire | Basse | HTTP Handler adapté |
+| Task | Status | Priority | Notes |
+| -------------------------------------------- | --------- | -------- | ---------------------- |
+| Swoole/FrankenPHP support | ⏳ Planned | Medium | Non-blocking servers |
+| Official Docker images | ⏳ Planned | Medium | Production-optimized |
+| Serverless support (Lambda, Cloud Functions) | ⏳ Planned | Low | Dedicated HTTP handler |
-### Écosystème
+### Ecosystem
-| Tâche | Statut | Priorité | Notes |
-| ------------------------------------------------ | ---------- | -------- | -------------------- |
-| Package `bowphp/payment` | ⏳ À faire | Haute | Mobile money Afrique |
-| Package `bowphp/logviewer` ou `bowphp/telescope` | ⏳ À faire | Moyenne | Observabilité |
-| Adapter laravel-notify pour Bow | ⏳ À faire | Basse | UI notifications |
+| Task | Status | Priority | Notes |
+| ------------------------------------------------ | --------- | -------- | -------------------- |
+| Package `bowphp/payment` | ⏳ Planned | High | African mobile money |
+| Package `bowphp/logviewer` or `bowphp/telescope` | ⏳ Planned | Medium | Observability |
+| Adapt `laravel-notify` for Bow | ⏳ Planned | Low | Notification UI |
-### Observabilité
+### Observability
-| Tâche | Statut | Priorité | Notes |
-| ------------------------------ | ---------- | -------- | ------------------------------- |
-| Module OpenTelemetry optionnel | ⏳ À faire | Moyenne | Tracing requests, jobs, queries |
-| Intégration Prometheus/Grafana | ⏳ À faire | Basse | Métriques production |
+| Task | Status | Priority | Notes |
+| ------------------------------ | --------- | -------- | ------------------------------- |
+| Optional OpenTelemetry module | ⏳ Planned | Medium | Request, job, and query tracing |
+| Prometheus/Grafana integration | ⏳ Planned | Low | Production metrics |
---
-## Légende
+## Legend
-- ✅ **Fait** : Tâche complétée
-- ⏳ **À faire** : Tâche planifiée
-- 🔄 **En cours** : Travail en progression
-- ❌ **Annulé** : Tâche abandonnée
+* ✅ **Done**: Completed task
+* ⏳ **Planned**: Scheduled task
+* 🔄 **Ongoing**: Work in progress
+* ❌ **Cancelled**: Abandoned task
---
-## Comment Contribuer
+## How to Contribute
-1. Choisir une tâche de la section **NOW** (priorité haute)
-2. Ouvrir une issue pour discuter de l'implémentation
-3. Créer une branche `feature/nom-de-la-tache`
-4. Suivre les conventions du projet (voir CONTRIBUTING.md)
-5. Soumettre une PR avec tests
+1. Pick a task from the **NOW** section (high priority)
+2. Open an issue to discuss the implementation
+3. Create a branch named `feature/task-name`
+4. Follow project conventions (see `CONTRIBUTING.md`)
+5. Submit a PR with tests
---
-## Notes Importantes
+## Important Notes
-### Concernant les Tests
+### About Testing
-Les erreurs actuelles lors de `composer test` sont principalement dues à :
+Current failures during `composer test` are mainly caused by:
-1. **Services externes non disponibles** (pas des bugs du framework) :
+1. **Unavailable external services** (not framework bugs):
- - MySQL : Connection refused / Access denied
- - PostgreSQL : Connection refused
- - FTP : Connection refused
- - S3 : Invalid endpoint
- - Beanstalkd : Connection refused
+ * MySQL: Connection refused / Access denied
+ * PostgreSQL: Connection refused
+ * FTP: Connection refused
+ * S3: Invalid endpoint
+ * Beanstalkd: Connection refused
-2. **Isolation des tests SQLite** : Certains tests partagent l'état de la base, causant des échecs intermittents.
+2. **SQLite test isolation issues**: Some tests share database state, causing intermittent failures.
-**Solution recommandée** : Séparer les tests en groupes (`@group unit`, `@group integration`) et configurer CI avec Docker Compose pour les tests d'intégration.
+**Recommended solution**: Split tests into groups (`@group unit`, `@group integration`) and configure CI with Docker Compose for integration tests.
-### Philosophie du Projet
+### Project Philosophy
-Toute contribution doit respecter le manifeste :
+Every contribution must respect the manifesto:
-- **Simplicité** > Sophistication
-- **Lisibilité** > Concision extrême
-- **API-first** : Priorité aux backends JSON
-- **Performance** : Bootstrap minimal, réponse rapide
-- **Contrôle** : Le développeur garde le contrôle de son architecture
+* **Simplicity** > Sophistication
+* **Readability** > Extreme conciseness
+* **API-first**: JSON backends are the priority
+* **Performance**: Minimal bootstrap, fast response times
+* **Control**: Developers retain full control over their architecture