Migrer vers Encore
Cette skill guide la migration de toute application backend existante vers Encore, une unité de migration à la fois. Elle supporte n'importe quel langage source ou framework et cible à la fois Encore.ts et Encore Go. Un fichier récapitulatif migration-plan.md et un répertoire migration-plan/ contenant des fichiers de détail par unité sont créés à la racine du projet Encore pour suivre la progression entre les sessions. Cette skill ne contient aucun exemple de code Encore — elle délègue toute implémentation spécifique à Encore aux skills appropriées spécifiques au langage.
Détection de Phase
Avant toute action, déterminez quelle phase intégrer :
- Aucun
migration-plan.mdn'existe dans le répertoire du projet Encore → Commencez à Phase 1 : DISCOVER migration-plan.mdexiste mais pas de répertoiremigration-plan/→ Reprenez à Phase 2 : PLAN (découverte faite, fichiers de détail pas encore écrits)- Le répertoire
migration-plan/existe avec des unités en attente (toute unité du résumé avec le statutpendingouin progress) → Reprenez à Phase 3 : MIGRATE - Toutes les unités du résumé sont
migrated,skipped, oumanual validation needed→ Allez à Phase 4 : COMPLETE
Reprendre une Migration (Phase 3)
Quand migration-plan.md et migration-plan/ existent avec des unités en attente :
- Lisez
migration-plan.md(résumé uniquement — ne lisez PAS tous les fichiers de détail) - Signalez le statut actuel à l'utilisateur — par exemple : « 3 de 7 unités migrées, prochaine suggérée : billing (toutes ses dépendances sont migrées) »
- Demandez à l'utilisateur ce qu'il souhaite faire ensuite, en proposant une suggestion basée sur l'ordre des dépendances du plan
Phase 1 — Discover
1. Recueillir les Informations
Demandez à l'utilisateur :
- Chemin du système source (la base de code existante en cours de migration)
- URL locale où s'exécute le système source (si applicable — nécessaire pour la validation par comparaison HTTP plus tard)
- Langage cible : Encore.ts ou Encore Go
2. Analyser la Base de Code Source
Lisez la base de code source et inventoriez toutes les entités :
| Catégorie | À rechercher |
|---|---|
| Services / modules / domaines | Contextes délimités distincts, unités déployables séparées, groupes de routes |
| Points de terminaison API | Méthode, chemin, fonction gestionnaire, formes requête/réponse |
| Bases de données | Type (Postgres, MySQL, etc.), tables, schémas, fichiers de migration |
| Topics Pub/Sub et abonnements | Noms de topics, éditeurs, abonnés, formes de message |
| Tâches Cron / tâches planifiées | Expressions de planification, fonctions gestionnaire |
| Middleware d'authentification / gestionnaires | Stratégies d'authentification, validation de token, gestion de session |
| Secrets / variables d'environnement | Toutes les variables d'environnement et secrets référencés, en notant lesquels sont sensibles |
| Tests existants | Fichiers de test, quelles entités ils couvrent, framework de test utilisé |
| Code frontend | Composants React/Vue/Angular, HTML statique, CSS, JS côté client — hors de portée |
3. Identifier le Code Frontend
Les repos full-stack et monorepos mélangent souvent le code backend et frontend. La migration cible uniquement le backend — le code frontend est hors de portée.
Détectez les répertoires frontend et marquez-les comme hors de portée. Indicateurs courants :
| Motif | Exemples |
|---|---|
| Répertoires frontend dédiés | frontend/, client/, web/, app/ (quand il contient React/Vue/Angular), src/components/, public/ |
| Fichiers de config frontend | next.config.js, vite.config.ts, nuxt.config.ts, angular.json, .svelte-kit/, remix.config.js |
| Dépendances du package | react, vue, @angular/core, svelte dans package.json |
Signalez le code côté serveur du framework qui devrait être migré. Certains frameworks frontend intègrent la logique backend qui contient des points de terminaison API, des requêtes de base de données ou la logique métier côté serveur :
| Framework | Emplacements côté serveur | À rechercher |
|---|---|---|
| Next.js | pages/api/, app/*/route.ts |
Gestionnaires de routes API — ce sont des points de terminaison backend |
| Remix | app/routes/*.tsx (exports loader/action) |
Les fonctions loader et action contiennent la logique serveur |
| Nuxt | server/api/, server/routes/ |
Routes API serveur |
| SvelteKit | src/routes/+server.ts, +page.server.ts |
Points de terminaison serveur et fonctions de chargement |
| Astro | src/pages/*.ts (non-.astro) |
Points de terminaison API |
Quand le code côté serveur du framework est trouvé, demandez à l'utilisateur quoi faire. Tout le code côté serveur ne devrait pas bouger vers Encore — parfois une couche backend mince (BFF, auth proxy, SSR data fetching) devrait rester dans le framework frontend aux côtés d'un backend Encore.
Présentez à l'utilisateur ce qui a été trouvé et demandez :
« J'ai trouvé <N> routes côté serveur dans votre app <framework> (par ex.,
pages/api/users.ts,app/billing/route.ts). Elles contiennent une logique backend qui pourrait être migrée vers Encore, mais certaines équipes préfèrent garder une couche serveur mince dans leur framework frontend pour des choses comme SSR data fetching ou BFF proxying. Souhaiteriez-vous :
- Migrer tout — routes côté serveur vers Encore
- Migrer certaines — je vais les lister et vous choisirez lesquelles bouger
- Garder tout dans <framework> — migrer uniquement le code backend autonome »
Selon le choix de l'utilisateur :
- Migrer tout : Extrayez la logique backend dans les unités de migration. Laissez le code de rendu frontend hors de portée. Notez dans le plan de migration quels fichiers source contiennent du code mixte frontend/backend.
- Migrer certaines : Présentez la liste des routes côté serveur et laissez l'utilisateur sélectionner. Incluez les routes sélectionnées dans les unités de migration, marquez le reste comme hors de portée.
- Garder tout : Marquez tout le code côté serveur du framework comme hors de portée aux côtés du frontend. Seul le code backend autonome (routes Express, serveurs API autonomes, etc.) entre dans les unités de migration.
Signalez à l'utilisateur : Listez tous les répertoires frontend détectés et la décision prise concernant le code côté serveur du framework. Exemple : « J'ai trouvé un frontend Next.js dans app/ — les composants React sont hors de portée. Vous avez choisi de migrer 8 des 12 routes API de pages/api/ vers Encore et de garder 4 routes proxy minces dans Next.js. »
4. Grouper les Entités dans des Unités de Migration
Regroupez les entités découvertes dans des unités de migration en utilisant ces heuristiques par ordre de priorité :
- Limites de service existantes — Si l'app source a déjà des services, modules ou packages, utilisez-les comme point de départ pour les chunks
- Préfixes de chemin URL — Regroupez les points de terminaison partageant un préfixe de chemin (ex.,
/users/*,/billing/*) - Tables de base de données partagées — Les points de terminaison qui lisent/écrivent aux mêmes tables appartiennent ensemble
- Types/modèles partagés — Les points de terminaison qui partagent les types requête/réponse ou les modèles de domaine
Dimensionnement des chunks : Visez 5-15 points de terminaison par unité de migration. Si un groupe dépasse ~15 points de terminaison, suggérez de le scinder davantage (ex., users-crud et users-admin). Si un groupe a moins de 3 points de terminaison, envisagez de le fusionner avec un chunk connexe.
Les préoccupations transversales reçoivent leurs propres unités de migration : auth, secrets et infrastructure autonome (pub/sub topics, cron jobs non fortement couplés à un service) sont des unités séparées car elles suivent différents niveaux de dépendance.
Pour les monolithes sans limites claires : Retombez sur le regroupement par préfixe de chemin URL, puis demandez : « Ces regroupements sont basés sur les chemins URL — souhaiteriez-vous les réorganiser par domaine ? »
5. Présenter les Unités de Migration
Présentez les unités de migration à l'utilisateur sous forme d'un tableau récapitulatif :
| Unité | Points de terminaison | Tables DB | Autre | Complexité |
|---|
Incluez les totaux (ex., « 7 unités de migration couvrant 42 points de terminaison, 3 bases de données »). Pour chaque unité, évaluez la complexité globale de la migration :
- Low — les équivalents Encore directs existent, mappage simple
- Medium — nécessite une restructuration ou a des équivalents Encore partiels
- High — pas d'équivalent direct, nécessite une refonte ou une solution personnalisée
Proposez de montrer le détail de toute unité si l'utilisateur souhaite inspecter ce qui se trouve à l'intérieur avant de confirmer.
6. Afficher des Aperçus de Code
Pour 2-3 entités représentatives (choisissez un mélange de simples et complexes provenant de différentes unités), montrez un court aperçu « avant et après » de ce que le code source ressemble maintenant et ce que la version Encore ressemblera. Utilisez la skill appropriée spécifique au langage pour informer l'aperçu. Gardez les aperçus brefs — un point de terminaison, une requête ou une déclaration de topic est suffisant par aperçu.
7. Confirmer avec l'Utilisateur
Demandez à l'utilisateur de confirmer que les unités de migration sont correctes. Demandez spécifiquement :
- « Y a-t-il des services, points de terminaison ou autres entités que j'ai manqués ? »
- « Souhaiteriez-vous scinder, fusionner ou renommer l'une de ces unités de migration ? »
- « Y a-t-il quelque chose que vous voulez exclure de la migration ? »
8. Itérer si Nécessaire
Si l'utilisateur identifie des entités manquantes ou souhaite ajuster les limites des chunks, mettez à jour les unités et re-présentez le tableau récapitulatif. Répétez jusqu'à ce que l'utilisateur confirme que les unités de migration sont exactes.
Phase 2 — Plan
1. Vérifier l'Existence du Projet Encore
Vérifiez si un projet Encore existe déjà au chemin cible (recherchez le fichier encore.app). Si oui, confirmez auprès de l'utilisateur que c'est le bon projet. Si non, aidez à en créer un en invoquant la skill encore-getting-started (ou encore-go-getting-started pour Go).
2. Recueillir les Informations Cibles
Demandez à l'utilisateur :
- Chemin du projet Encore (où vivra le code migré)
- URL locale où s'exécutera l'app Encore (défaut :
http://localhost:4000)
3. Déterminer l'Ordre des Dépendances
Ordonnez les unités de migration en fonction des dépendances. Suivez cet ordre de tier :
- Secrets / config — aucune dépendance, nécessaires pour tout
- Bases de données — schéma et migrations doivent exister avant que les services puissent les utiliser
- Auth — les gestionnaires d'auth sont nécessaires avant les points de terminaison protégés
- Unités feuille — unités sans dépendances inter-services
- Unités dépendantes — unités qui dépendent d'unités déjà migrées
- Topics Pub/Sub et abonnements — dépendent souvent de la présence de services
- Tâches Cron — dépendent généralement des points de terminaison de service
Au sein de chaque tier, suggérez l'unité la plus simple en premier (le moins de points de terminaison, le plus petit schéma, le moins de complexité).
4. Écrire migration-plan.md (Résumé)
Écrivez le fichier résumé migration-plan.md à la racine du projet Encore en utilisant le modèle dans la section « Format migration-plan.md » ci-dessous. Remplissez toutes les unités de migration avec le statut pending.
5. Écrire les Fichiers de Détail
Créez un répertoire migration-plan/ à la racine du projet Encore. Écrivez un fichier de détail par unité de migration en utilisant le modèle dans la section « Format Fichier de Détail » ci-dessous. Chaque fichier est nommé migration-plan/<unit-name>.md.
6. Proposer la Première Unité
Proposez la première unité de migration, en expliquant pourquoi elle devrait venir en premier en fonction de l'ordre des dépendances. Attendez l'approbation de l'utilisateur avant de procéder à la Phase 3.
Phase 3 — Migrate (Boucle)
1. Identifier l'Unité Suivante
Lisez migration-plan.md (résumé uniquement) et identifiez l'unité de migration en attente suivante en fonction de l'ordre des dépendances.
2. Suggérer et Confirmer
Suggérez l'unité suivante à migrer et expliquez pourquoi celle-ci vient ensuite (ex., « Cette unité n'a aucune dépendance sur les unités non migrées » ou « La base de données doit exister avant que nous puissions migrer le service qui l'utilise »). Demandez à l'utilisateur s'il souhaite procéder avec cette unité ou en choisir une autre.
3. Charger le Détail de l'Unité
Lisez le fichier de détail pour l'unité choisie (migration-plan/<unit-name>.md). Ne lisez PAS les fichiers de détail pour les autres unités.
4. Migrer Chaque Entité
Pour chaque entité dans l'unité :
a. Implémenter
Invoquez la skill appropriée spécifique au langage en fonction du type d'entité et du langage cible :
| Migration de... | Skill Encore.ts | Skill Encore Go |
|---|---|---|
| Structure de service | encore-service |
encore-go-service |
| Points de terminaison API | encore-api |
encore-go-api |
| Auth | encore-auth |
encore-go-auth |
| Base de données + migrations | encore-database |
encore-go-database |
| Pub/Sub, crons, buckets, secrets | encore-infrastructure |
encore-go-infrastructure |
| Tests | encore-testing |
encore-go-testing |
b. Migrer les Tests
Si l'entité source a des tests associés, migrez-les en utilisant la skill de test appropriée (encore-testing ou encore-go-testing). Adaptez les assertions de test pour correspondre aux motifs API Encore. Si l'entité source n'a pas de tests, notez-le dans le fichier de détail.
c. Valider
Trois couches de validation sont appliquées à chaque entité avant qu'elle puisse être marquée comme migrated. Chaque entité doit passer par toutes les couches applicables.
Couche 1 : Migration de Tests (Primaire)
- Lors de la migration d'une entité, migrez également ses tests associés
- Utilisez la skill
encore-testing(ouencore-go-testingpour Go) pour implémenter les tests - Exécutez les tests — ils doivent réussir avant que l'entité puisse être marquée comme
migrated - Si l'entité source n'avait pas de tests, notez « no source tests » dans le plan et appuyez-vous sur les autres couches
Couche 2 : Comparaison HTTP (Points de Terminaison Uniquement, Meilleur Effort)
Quand les deux systèmes s'exécutent localement, appelez le même point de terminaison sur le système source et l'app Encore, puis comparez :
- Code de statut HTTP — doit correspondre
- Structure du corps de réponse — les clés et la forme doivent correspondre (les valeurs peuvent différer pour les données dynamiques comme les timestamps ou les ID)
Ignorez cette couche quand :
- Le point de terminaison nécessite des identifiants d'authentification que l'agent ne peut pas obtenir (demandez à l'utilisateur — autorisez l'omission)
Si une requête à l'un ou l'autre système échoue à se connecter, demandez à l'utilisateur de démarrer l'app avant de réessayer. N'omettez pas silencieusement — l'utilisateur a peut-être simplement oublié de la démarrer.
Demandez toujours à l'utilisateur avant de faire tout appel HTTP qui pourrait avoir des effets secondaires.
Couche 3 : Portail de Vérification-Avant-Complétion
Avant de marquer UNE QUELCONQUE entité comme migrated, l'agent DOIT avoir des preuves récentes de la session actuelle :
- Sortie de commande de test montrant le nombre de réussite et le code de sortie, OU
- Résultats de comparaison HTTP montrant une correspondance, OU
- Approbation explicite de l'utilisateur pour ignorer la validation
Règles :
- Pas de « should work », « looks correct » ou « seems fine » — uniquement des prétentions soutenues par des preuves
- L'agent doit énoncer exactement ce qu'il a vérifié et quelle a été la sortie
- Si la preuve est insuffisante, marquez l'entité comme
manual validation needed, pasmigrated - Les preuves obsolètes d'une session précédente ne comptent pas — réexécutez la validation en cas de reprise
d. Mettre à Jour le Fichier de Détail
Mettez à jour le statut de l'entité dans le fichier de détail de l'unité (migration-plan/<unit-name>.md) et enregistrez la preuve de validation dans le tableau Validation Log de ce fichier.
e. Mettre à Jour le Résumé
Quand toutes les entités d'une unité sont terminées, mettez à jour le statut de l'unité dans migration-plan.md à migrated. Si certaines entités sont en attente, définissez le statut de l'unité à in progress.
5. Continuer ou Pausar
Après avoir complété une unité, demandez « Qu'aimeriez-vous migrer ensuite ? » et suggérez l'unité suivante en fonction de l'ordre des dépendances.
6. Regroupement
Le défaut est une unité à la fois. Si l'utilisateur dit « continue », « fais-les tous » ou similaire, regroupez plusieurs unités mais validez toujours chaque entité individuellement avant de la marquer comme migrée.
Phase 4 — Complete
Quand toutes les unités dans migration-plan.md sont migrated, skipped, ou manual validation needed :
- Présentez un résumé final provenant de
migration-plan.md:- Unités migrées au total
- Unités marquées comme
manual validation needed— lisez ces fichiers de détail spécifiques et listez les entités qui nécessitent une attention avec les raisons - Unités ignorées (listez-les avec les raisons)
- Suggérez d'exécuter la suite de tests complète une dernière fois pour détecter tout problème d'intégration
- Notez tout élément de validation manuel qui nécessite encore une attention humaine
- Si le système source avait du code frontend, suggérez d'utiliser la skill
encore-frontendpour reconnecter le frontend au nouveau backend Encore (générer un client API typé, configurer CORS, mettre à jour les URLs de base) - Suggérez de supprimer
migration-plan.mdetmigration-plan/du projet une fois que l'utilisateur est satisfait de la migration
Poser des Questions
Demandez à l'utilisateur avant d'agir quand :
- Les limites de service ne sont pas claires — ex., « Ces fichiers de routes pourraient être 1 service ou 3 — comment souhaiteriez-vous les scinder ? »
- Aucun équivalent Encore propre n'existe — ex., couche de cache Redis, chaînes de middleware personnalisées, gestionnaires WebSocket
- Plusieurs stratégies de migration valides existent — présentez les options avec les compromis
- Avant tout appel HTTP qui pourrait avoir des effets secondaires — toujours demander d'abord
- Le code source est ambigu — quand l'agent n'est pas confiant sur ce que fait le code, demandez plutôt que de deviner
- Le système source semble avoir changé — si des fichiers référencés dans un fichier de détail n'existent plus ou ont changé significativement
Protection du Système Source
Le système source ne doit jamais être modifié lors de la migration. Suivez ces règles :
- Ne jamais modifier les fichiers source — lisez-les, ne les éditez pas
- Ne jamais supprimer les fichiers source — même après la migration
- Ne jamais écrire dans le répertoire source — toute sortie va vers le projet Encore
- Ne jamais exécuter de commandes destructrices contre le système source (drop tables, delete queues, etc.)
- Demandez avant tout appel HTTP qui mute l'état du système source (POST, PUT, DELETE)
Si l'utilisateur vous demande de « nettoyer » ou « supprimer » l'ancien système, confirmez explicitement avant de prendre toute action. Le système source peut encore servir le trafic de production.
Cas Limites
Déplacer des Points de Terminaison Entre les Unités
Si l'utilisateur réalise qu'un point de terminaison appartient à une unité de migration différente :
- Supprimez la ligne du point de terminaison du fichier de détail de l'unité source
- Ajoutez-la au fichier de détail de l'unité cible
- Mettez à jour les nombres de points de terminaison dans
migration-plan.md
Scinder une Unité en Cours de Migration
Si une unité s'avère être trop grande pendant que vous travaillez dessus :
- Créez un nouveau fichier de détail pour la portion scindée (
migration-plan/<new-unit>.md) - Déplacez les entités en attente vers le nouveau fichier (les entités déjà migrées restent dans l'original)
- Ajoutez la nouvelle unité au tableau résumé
migration-plan.md - Insérez-la dans l'ordre des dépendances (même tier, après l'original)
Monolithe vers Plusieurs Services Encore
Une seule unité de migration peut mapper à plusieurs services Encore. Le fichier de détail suit le regroupement source, mais la colonne « Notes » peut indiquer le service Encore cible. Demandez lors de la migration si l'unité mappe à un service ou doit être scindée entre les services Encore.
Code Source Changé Depuis la Découverte
Si des fichiers référencés dans un fichier de détail n'existent plus ou ont changé significativement depuis la découverte :
- Signalez la discordance à l'utilisateur
- Demandez si mettre à jour le fichier de détail avec le nouvel état ou ignorer les entités affectées
- Si mise à jour, ré-évaluez la complexité et ajustez le plan en conséquence
Dépannage
Les problèmes courants lors de la migration et comment les résoudre :
| Problème | Cause | Résolution |
|---|---|---|
| Erreurs d'importation entre services | Importations directes entre services | Utilisez ~encore/clients (TS) ou les packages clients de service (Go) à la place |
| Échec de migration de base de données | Syntaxe SQL incompatible | Vérifiez que Encore utilise PostgreSQL — adaptez la syntaxe MySQL/SQLite |
| Les messages Pub/Sub ne sont pas reçus | Abonnement non enregistré | Assurez-vous que l'abonnement est déclaré au niveau du package, non à l'intérieur d'une fonction |
| Tâche Cron non exécutée | Expression de planification invalide | Encore utilise les expressions cron standard — vérifiez la syntaxe |
Erreurs encore run sur l'infrastructure |
Infrastructure déclarée à l'intérieur de fonctions | Déplacez toutes les déclarations d'infrastructure au niveau du package |
| Les réponses source et Encore diffèrent | Logique métier manquante ou gestion d'erreur différente | Comparez attentivement les formes de réponse, vérifiez les cas limites |
| Impossible de valider le point de terminaison | Auth requise ou effets secondaires | Demandez à l'utilisateur les identifiants de test, ou marquez comme manual validation needed |
Format migration-plan.md
Utilisez ce modèle exact pour le fichier de plan résumé. Remplissez les valeurs depuis la phase de découverte.
# Migration Plan
## Source System
- **Path:** <source system path>
- **URL:** <source system local URL>
- **Framework:** <detected framework>
- **Language:** <detected language>
## Frontend (Out of Scope)
- **Detected:** <Yes/No>
- **Directories:** <list of frontend directories, or "None">
- **Framework:** <frontend framework if detected, or "N/A">
- **Note:** <any framework server-side code that WAS included in migration units>
## Target System
- **Path:** <encore project path>
- **URL:** <encore local URL>
- **Type:** Encore.ts | Encore Go
## Migration Units
| Unit | Endpoints | DB Tables | Other | Complexity | Status |
|------|-----------|-----------|-------|------------|--------|
## Dependency Order
1. <ordered list of migration units>
Valeurs de statut : pending, in progress, migrated, skipped, manual validation needed
Valeurs de complexité : Low (équivalent direct), Medium (nécessite une restructuration), High (nécessite une refonte)
Format Fichier de Détail
Créez un fichier par unité de migration à migration-plan/<unit-name>.md. Utilisez ce modèle exact :
# Migration Unit: <unit-name>
## Source
- **Files:** <list of source files in this unit>
- **Depends on:** <other migration units, with their current status>
## Endpoints
| Endpoint | Method | Path | Status | Notes |
|----------|--------|------|--------|-------|
## Database
| Table | Complexity | Status | Notes |
|-------|------------|--------|-------|
## Tests
- **Source tests:** <test files and count>
- **Migrated:** <count of migrated tests>
## Validation Log
| Entity | Tests | HTTP Match | Evidence | Status |
|--------|-------|------------|----------|--------|
Toutes les sections ne sont pas obligatoires — omettez les sections qui ne s'appliquent pas à une unité donnée (ex., une unité de secrets n'aura pas de sections Endpoints ou Database).