leadcode 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,368 @@
1
+ export const fr = {
2
+ templates: {
3
+ header: {
4
+ title: "{name} — Règles du projet",
5
+ meta1: "Généré automatiquement par [LeadCode](https://github.com/Julxoo/LeadCode). Ce fichier est la source de vérité pour Claude Code.",
6
+ meta2: "Modifiez selon vos besoins, puis committez dans le contrôle de version.",
7
+ },
8
+ sections: {
9
+ architectureOverview: "Vue d'ensemble de l'architecture",
10
+ stack: "Stack technique",
11
+ projectStructure: "Structure du projet",
12
+ availableScripts: "Scripts disponibles",
13
+ fileNaming: "Conventions de nommage",
14
+ importOrdering: "Ordre des imports",
15
+ conventions: "Conventions (À SUIVRE impérativement)",
16
+ crossStackRules: "Règles cross-stack (CRITIQUE)",
17
+ interdictions: "Interdictions (JAMAIS faire)",
18
+ projectDecisions: "Décisions du projet",
19
+ existingPatterns: "Patterns existants",
20
+ claudeInstructions: "Instructions pour Claude Code",
21
+ },
22
+ architecture: {
23
+ frontendBackend: "Frontend + Backend",
24
+ fullStackReact: "framework React full-stack",
25
+ frontend: "Frontend",
26
+ reactSpaVite: "SPA React avec Vite",
27
+ framework: "Framework",
28
+ dataLayer: "Couche de données",
29
+ database: "Base de données",
30
+ authentication: "Authentification",
31
+ api: "API",
32
+ clientState: "État client",
33
+ i18n: "i18n",
34
+ payments: "Paiements",
35
+ realtime: "Temps réel",
36
+ email: "Email",
37
+ content: "Contenu",
38
+ backgroundJobs: "Tâches de fond",
39
+ fileUpload: "Upload de fichiers",
40
+ projectSize: "Taille du projet",
41
+ sizeSmall: "Petit",
42
+ sizeMedium: "Moyen",
43
+ sizeLarge: "Grand",
44
+ sizeVeryLarge: "Très grand",
45
+ sourceFiles: "fichiers source",
46
+ },
47
+ stackLabels: {
48
+ framework: "Framework",
49
+ orm: "ORM",
50
+ database: "Base de données",
51
+ auth: "Auth",
52
+ validation: "Validation",
53
+ css: "CSS",
54
+ uiComponents: "Composants UI",
55
+ testing: "Tests",
56
+ stateManagement: "Gestion d'état",
57
+ apiStyle: "Style d'API",
58
+ i18n: "i18n",
59
+ payments: "Paiements",
60
+ email: "Email",
61
+ realtime: "Temps réel",
62
+ cms: "CMS/Contenu",
63
+ fileUpload: "Upload de fichiers",
64
+ jobs: "Jobs/File d'attente",
65
+ monorepo: "Monorepo",
66
+ deployment: "Déploiement",
67
+ linter: "Linter",
68
+ formatter: "Formatter",
69
+ runtime: "Runtime",
70
+ },
71
+ structure: {
72
+ srcDir: "Code source dans `src/`",
73
+ appRouter: "App Router : `app/`",
74
+ pagesRouter: "Pages Router : `pages/`",
75
+ apiRoutes: "Routes API présentes",
76
+ middleware: "Middleware configuré",
77
+ components: "Composants : `components/`",
78
+ sharedUtils: "Utilitaires partagés : `lib/`",
79
+ services: "Services : `services/`",
80
+ customHooks: "Hooks personnalisés : `hooks/`",
81
+ stateStores: "Stores d'état : `store/`",
82
+ validationSchemas: "Schémas de validation : `schemas/`",
83
+ typeDefinitions: "Définitions de types : `types/`",
84
+ configuration: "Configuration : `config/`",
85
+ reactProviders: "Providers React : `providers/`",
86
+ prismaSchema: "Schéma Prisma : `prisma/schema.prisma`",
87
+ },
88
+ naming: {
89
+ files: "**Fichiers** : kebab-case (ex. `user-profile.ts`, `auth-utils.ts`)",
90
+ reactComponents: "**Composants React** : PascalCase, le nom du fichier correspond au composant (ex. `UserProfile.tsx` exporte `UserProfile`)",
91
+ hooks: "**Hooks** : camelCase préfixé par `use` (ex. `useAuth.ts`)",
92
+ constants: "**Constantes/config** : SCREAMING_SNAKE_CASE pour les valeurs, kebab-case pour les fichiers",
93
+ newFilesSrc: "**Nouveaux fichiers** : Placer dans `src/` en respectant la structure existante",
94
+ },
95
+ importOrder: [
96
+ "1. Builtins Node.js (node:fs, node:path)",
97
+ "2. Packages externes (react, next, etc.)",
98
+ "3. Alias internes (@/ ou ~/)",
99
+ "4. Imports relatifs (../ et ./)",
100
+ "5. Imports de types (import type { ... })",
101
+ ],
102
+ instructions: {
103
+ followAll: "Suivre TOUTES les règles de ce document sans exception.",
104
+ respectStructure: "Lors de la création de nouveaux fichiers, respecter la structure et les conventions de nommage existantes.",
105
+ checkPrecedent: "En cas de doute sur un pattern, vérifier le code existant avant d'en inventer un nouveau.",
106
+ neverNewDeps: "Ne jamais ajouter de nouvelles dépendances sans y être explicitement invité.",
107
+ smallChanges: "Préférer des changements petits et ciblés plutôt que de gros refactors.",
108
+ serverComponents: "Par défaut, utiliser les Server Components. N'ajouter 'use client' que si le composant a besoin d'interactivité.",
109
+ appRouterPages: "Placer les nouvelles pages dans app/ en suivant la structure de routes existante.",
110
+ serverActions: "Utiliser les Server Actions pour les mutations, les Route Handlers pour les endpoints API.",
111
+ prismaAfterChange: "Après modification de schema.prisma, toujours exécuter `npx prisma migrate dev` et `npx prisma generate`.",
112
+ drizzleAfterChange: "Après modification des schémas Drizzle, exécuter `npx drizzle-kit generate` pour créer les migrations.",
113
+ zodValidate: "Valider toutes les entrées aux frontières API avec Zod. Parser, pas valider.",
114
+ tailwindClasses: "Utiliser les classes utilitaires Tailwind pour le style. Utiliser cn() pour les classes conditionnelles.",
115
+ shadcnComponents: "Utiliser les composants shadcn/ui de components/ui/ comme briques de base.",
116
+ runTests: "Lancer les tests avec {testing} avant de considérer le travail terminé.",
117
+ runLinter: "Lancer {linter} avant de committer. Corriger tous les warnings.",
118
+ i18nStrings: "Toutes les chaînes visibles par l'utilisateur doivent passer par le système i18n. Ne jamais coder en dur.",
119
+ },
120
+ patterns: {
121
+ clientServerRatio: "**Ratio Client/Serveur** : {clientCount} composants client sur {totalCount} au total ({clientPercent}% client)",
122
+ serverActions: "**Server Actions** : {count} fichiers avec 'use server'",
123
+ pathAliases: "**Alias de chemins** : Le projet utilise les imports @/ ou ~/ — continuer à les utiliser",
124
+ barrelFiles: "**Fichiers barrel** : Le projet utilise les ré-exports via index.ts — suivre ce pattern",
125
+ largeFiles: "**Fichiers volumineux** (>300 lignes) : {count} fichier(s) — envisager de découper",
126
+ consoleLogs: "**Console.log** : {count} occurrences trouvées — nettoyer avant la production",
127
+ },
128
+ },
129
+ suggestions: {
130
+ testing: {
131
+ topic: "Stratégie de tests",
132
+ simple: {
133
+ description: "Ajouter Vitest pour les tests unitaires uniquement",
134
+ pros: ["Mise en place rapide", "Léger", "Excellente DX"],
135
+ cons: ["Pas de couverture E2E"],
136
+ claudeImpact: "Claude générera des tests unitaires à côté des nouvelles fonctions quand on le demande.",
137
+ },
138
+ clean: {
139
+ description: "Vitest + Testing Library pour les tests de composants",
140
+ pros: ["Couverture unitaire + composants", "Teste le comportement utilisateur"],
141
+ cons: ["Plus de configuration", "Tests de composants plus lents"],
142
+ claudeImpact: "Claude générera des tests unitaires et de composants avec les bons patterns render/assert.",
143
+ },
144
+ scalable: {
145
+ description: "Vitest + Testing Library + Playwright pour le E2E",
146
+ pros: ["Pyramide de tests complète", "Détecte les bugs d'intégration"],
147
+ cons: ["Configuration conséquente", "CI plus lente"],
148
+ claudeImpact: "Claude générera des tests à tous les niveaux en respectant la pyramide de tests.",
149
+ },
150
+ },
151
+ inputValidation: {
152
+ topic: "Validation des entrées",
153
+ simple: {
154
+ description: "Ajouter Zod pour la validation manuelle dans les routes API",
155
+ pros: ["Minimal", "Natif TypeScript"],
156
+ cons: ["Il faut penser à valider chaque route"],
157
+ claudeImpact: "Claude ajoutera z.object().parse() dans les routes API quand on le rappelle.",
158
+ },
159
+ clean: {
160
+ description: "Zod avec un dossier de schémas partagés et un middleware",
161
+ pros: ["Schémas DRY", "Validation cohérente"],
162
+ cons: ["Plus de structure au départ"],
163
+ claudeImpact: "Claude importera les schémas partagés et validera automatiquement dans chaque route.",
164
+ },
165
+ },
166
+ errorHandling: {
167
+ topic: "Gestion des erreurs",
168
+ simple: {
169
+ description: "Ajouter error.tsx dans chaque segment de route",
170
+ pros: ["Rapide", "Suit les conventions Next.js"],
171
+ cons: ["Pas de logging structuré des erreurs"],
172
+ claudeImpact: "Claude créera des fichiers error.tsx et gérera les erreurs proprement.",
173
+ },
174
+ clean: {
175
+ description: "Error boundaries + utilitaires d'erreur centralisés + logging structuré",
176
+ pros: ["Format d'erreur cohérent", "Débugable"],
177
+ cons: ["Plus de mise en place"],
178
+ claudeImpact: "Claude utilisera les utilitaires d'erreur de manière cohérente et produira des réponses d'erreur débugables.",
179
+ },
180
+ },
181
+ schemaOrg: {
182
+ topic: "Organisation des schémas",
183
+ simple: {
184
+ description: "Co-localiser les schémas à côté de leurs routes API",
185
+ pros: ["Facile à trouver", "Pas d'indirection"],
186
+ cons: ["Les schémas se dupliquent entre les routes"],
187
+ claudeImpact: "Claude dupliquera les schémas quand les mêmes données sont utilisées dans plusieurs routes.",
188
+ },
189
+ clean: {
190
+ description: "Dossier partagé /lib/schemas/",
191
+ pros: ["Source unique de vérité", "DRY"],
192
+ cons: ["Un dossier de plus à gérer"],
193
+ claudeImpact: "Claude trouvera et réutilisera les schémas de manière cohérente entre les routes et les formulaires.",
194
+ },
195
+ },
196
+ componentStructure: {
197
+ topic: "Organisation des composants",
198
+ simple: {
199
+ description: "Dossier /components à plat",
200
+ pros: ["Simple", "Fonctionne pour les petits projets"],
201
+ cons: ["Devient le bazar à l'échelle"],
202
+ claudeImpact: "Claude placera tous les composants dans un seul dossier.",
203
+ },
204
+ clean: {
205
+ description: "Organisation par feature : /components/ui/ + /components/[feature]/",
206
+ pros: ["Passe à l'échelle", "Propriété claire"],
207
+ cons: ["Plus de dossiers"],
208
+ claudeImpact: "Claude organisera les composants par feature et réutilisera les primitives UI.",
209
+ },
210
+ },
211
+ authMiddleware: {
212
+ topic: "Protection des routes",
213
+ simple: {
214
+ description: "Vérifier l'auth dans chaque Server Component/route handler",
215
+ pros: ["Explicite", "Facile à comprendre"],
216
+ cons: ["Facile d'oublier sur les nouvelles routes"],
217
+ claudeImpact: "Claude risque d'oublier les checks d'auth sur les nouvelles routes si on ne le rappelle pas.",
218
+ },
219
+ clean: {
220
+ description: "middleware.ts avec route matcher + vérifications par route en backup",
221
+ pros: ["Centralisé", "Défense en profondeur"],
222
+ cons: ["Le middleware peut être difficile à débuguer"],
223
+ claudeImpact: "Claude ajoutera les routes au matcher protégé et conservera les vérifications côté serveur.",
224
+ },
225
+ },
226
+ loadingStates: {
227
+ topic: "États de chargement",
228
+ simple: {
229
+ description: "Ajouter un seul loading.tsx à la racine de app/",
230
+ pros: ["Rapide", "Couvre toutes les routes"],
231
+ cons: ["Même UI de chargement partout"],
232
+ claudeImpact: "Claude verra le pattern et créera des loading.tsx pour les nouveaux segments de route.",
233
+ },
234
+ clean: {
235
+ description: "loading.tsx par segment avec des skeleton UIs adaptées à chaque page",
236
+ pros: ["Meilleure UX", "Skeletons adaptés au layout"],
237
+ cons: ["Plus de fichiers à maintenir"],
238
+ claudeImpact: "Claude créera des skeleton UIs correspondant à chaque nouveau segment de route.",
239
+ },
240
+ },
241
+ metadata: {
242
+ topic: "SEO & Métadonnées",
243
+ simple: {
244
+ description: "Export statique des métadonnées dans chaque page.tsx",
245
+ pros: ["Simple", "Couvre le SEO de base"],
246
+ cons: ["Pas de métadonnées dynamiques pour les routes dynamiques"],
247
+ claudeImpact: "Claude ajoutera export const metadata aux nouvelles pages.",
248
+ },
249
+ clean: {
250
+ description: "generateMetadata pour les pages dynamiques + métadonnées statiques pour le reste",
251
+ pros: ["Titre/description dynamique par route", "Contrôle SEO complet"],
252
+ cons: ["Plus de boilerplate par page"],
253
+ claudeImpact: "Claude générera les fonctions generateMetadata avec les données dynamiques.",
254
+ },
255
+ },
256
+ prismaClient: {
257
+ topic: "Singleton Prisma Client",
258
+ simple: {
259
+ description: "Pattern globalThis dans lib/prisma.ts",
260
+ pros: ["Approche standard", "Évite les fuites de hot-reload"],
261
+ cons: ["Nécessite de la discipline pour toujours importer depuis ce fichier"],
262
+ claudeImpact: "Claude importera depuis lib/prisma.ts de manière cohérente.",
263
+ },
264
+ },
265
+ authSession: {
266
+ topic: "Utilitaire d'authentification",
267
+ simple: {
268
+ description: "Créer lib/auth.ts avec une fonction getCurrentUser()",
269
+ pros: ["Centralisé", "Facile à utiliser"],
270
+ cons: ["Il faut penser à l'utiliser"],
271
+ claudeImpact: "Claude appellera getCurrentUser() dans les Server Components et Route Handlers.",
272
+ },
273
+ clean: {
274
+ description: "lib/auth.ts avec getCurrentUser() + requireAuth() qui throw si pas de session",
275
+ pros: ["Sécurisé par défaut", "Intention claire"],
276
+ cons: ["Un peu plus de code"],
277
+ claudeImpact: "Claude utilisera requireAuth() en haut des routes protégées automatiquement.",
278
+ },
279
+ },
280
+ envValidation: {
281
+ topic: "Validation des variables d'environnement",
282
+ simple: {
283
+ description: "Validation manuelle avec Zod dans env.ts",
284
+ pros: ["Pas de dépendance supplémentaire", "Contrôle total"],
285
+ cons: ["Maintenance manuelle"],
286
+ claudeImpact: "Claude importera les variables d'env depuis env.ts et n'utilisera jamais process.env directement.",
287
+ },
288
+ clean: {
289
+ description: "Utiliser @t3-oss/env-nextjs pour un env typé avec séparation client/serveur",
290
+ pros: ["Typé", "Séparation client/serveur forcée"],
291
+ cons: ["Dépendance supplémentaire"],
292
+ claudeImpact: "Claude importera depuis env.mjs et respectera les frontières client/serveur.",
293
+ },
294
+ },
295
+ typesDir: {
296
+ topic: "Organisation des types partagés",
297
+ simple: {
298
+ description: "Créer un dossier types/ avec des fichiers de types par domaine",
299
+ pros: ["Emplacement clair pour les types partagés"],
300
+ cons: ["Un dossier de plus"],
301
+ claudeImpact: "Claude placera les types partagés dans types/ et importera depuis ce dossier.",
302
+ },
303
+ },
304
+ storeOrg: {
305
+ topic: "Organisation des stores",
306
+ simple: {
307
+ description: "Créer un dossier store/ avec un fichier par store",
308
+ pros: ["Simple", "Facile à trouver"],
309
+ cons: ["Structure à plat"],
310
+ claudeImpact: "Claude créera les stores dans store/ avec un nommage clair.",
311
+ },
312
+ },
313
+ drizzleSchema: {
314
+ topic: "Organisation des schémas Drizzle",
315
+ simple: {
316
+ description: "Tous les schémas dans db/schema.ts",
317
+ pros: ["Simple pour les petits projets"],
318
+ cons: ["Grossit vite"],
319
+ claudeImpact: "Claude ajoutera les nouvelles tables dans le fichier de schéma unique.",
320
+ },
321
+ clean: {
322
+ description: "Dossier db/schema/ avec un fichier par entité + barrel index.ts",
323
+ pros: ["Passe à l'échelle", "Facile à trouver"],
324
+ cons: ["Plus de fichiers"],
325
+ claudeImpact: "Claude créera de nouveaux fichiers de schéma par entité et les exportera depuis index.ts.",
326
+ },
327
+ },
328
+ genericFix: "Corriger : {message}",
329
+ genericPros: ["Corrige le problème"],
330
+ genericCons: ["Peut nécessiter des ajustements"],
331
+ genericClaudeImpact: "Claude suivra la convention une fois documentée dans le CLAUDE.md.",
332
+ },
333
+ validation: {
334
+ noClaudeMd: "Aucun CLAUDE.md trouvé à {path}. Utilisez generate-claude-md d'abord.",
335
+ frameworkVersionOutdated: "La version {version} du framework n'est pas dans le CLAUDE.md. La version a peut-être été mise à jour.",
336
+ techMissing: "{label} : {value} est dans le projet mais pas mentionné dans le CLAUDE.md.",
337
+ conventionMissing: "La convention « {description} » est applicable mais absente du CLAUDE.md.",
338
+ crossStackMissing: "La règle cross-stack pour {combo} est applicable mais absente du CLAUDE.md.",
339
+ gapStillExists: "Un gap de haute sévérité persiste : {message}",
340
+ inSync: "Le CLAUDE.md est synchronisé avec le projet.",
341
+ driftsFound: "{count} décalage(s) trouvé(s). Envisagez de lancer generate-claude-md pour mettre à jour.",
342
+ },
343
+ tools: {
344
+ generateSuccess: "CLAUDE.md généré avec succès",
345
+ updateSuccess: "CLAUDE.md mis à jour avec succès",
346
+ dirNotFound: "Dossier du projet introuvable : {path}",
347
+ },
348
+ prompts: {
349
+ setupTitle: "Workflow complet LeadCode : analyser le repo → détecter les manques → proposer des conventions → générer le CLAUDE.md",
350
+ setupSteps: [
351
+ "1. Lance analyze-repo pour scanner le projet et obtenir une analyse technique complète.",
352
+ "2. Lance detect-gaps pour identifier les manques structurels.",
353
+ "3. Lance suggest-conventions pour proposer des améliorations.",
354
+ "4. Présente un résumé clair : ce qui est détecté, ce qui manque, et les options disponibles.",
355
+ "5. Demande-moi mes préférences pour chaque point (simple / clean / scalable).",
356
+ "6. Une fois mes choix faits, lance generate-claude-md pour créer le CLAUDE.md.",
357
+ "",
358
+ "Explique chaque étape simplement et clairement.",
359
+ ],
360
+ validateTitle: "Vérifier si le CLAUDE.md est encore synchronisé avec le projet",
361
+ validateSteps: [
362
+ "1. Lance validate-claude-md pour vérifier les décalages entre le CLAUDE.md et l'état réel du projet.",
363
+ "2. Présente les décalages trouvés avec des explications claires.",
364
+ "3. Si des décalages existent, suggère s'il faut régénérer ou corriger manuellement le CLAUDE.md.",
365
+ ],
366
+ },
367
+ };
368
+ //# sourceMappingURL=fr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr.js","sourceRoot":"","sources":["../../src/i18n/fr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Locale, Messages } from "./types.js";
2
+ export type { Locale, Messages };
3
+ export declare function getMessages(locale: Locale): Messages;
4
+ /** Simple string interpolation: replaces {key} with values */
5
+ export declare function interpolate(template: string, values: Record<string, string | number>): string;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAInD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAIjC,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEpD;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAM7F"}
@@ -0,0 +1,15 @@
1
+ import { en } from "./en.js";
2
+ import { fr } from "./fr.js";
3
+ const locales = { en, fr };
4
+ export function getMessages(locale) {
5
+ return locales[locale];
6
+ }
7
+ /** Simple string interpolation: replaces {key} with values */
8
+ export function interpolate(template, values) {
9
+ let result = template;
10
+ for (const [key, value] of Object.entries(values)) {
11
+ result = result.replaceAll(`{${key}}`, String(value));
12
+ }
13
+ return result;
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAI7B,MAAM,OAAO,GAA6B,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAErD,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAuC;IACnF,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}