leadcode 0.1.2 → 0.2.0

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.
@@ -1,299 +1,111 @@
1
1
  import * as z from "zod";
2
- function buildSuggestions(analysis, gaps) {
2
+ import { getMessages, interpolate } from "../i18n/index.js";
3
+ function opt(o, level) {
4
+ return { level, description: o.description, pros: o.pros, cons: o.cons, claudeImpact: o.claudeImpact };
5
+ }
6
+ function buildSuggestions(analysis, gaps, locale) {
7
+ const m = getMessages(locale).suggestions;
3
8
  const suggestions = [];
4
9
  for (const gap of gaps) {
5
10
  switch (gap.category) {
6
11
  case "testing":
7
12
  suggestions.push({
8
- topic: "Testing Strategy",
13
+ topic: m.testing.topic,
9
14
  options: [
10
- {
11
- level: "simple",
12
- description: "Add Vitest for unit tests only",
13
- pros: ["Fast setup", "Lightweight", "Great DX"],
14
- cons: ["No E2E coverage"],
15
- claudeImpact: "Claude will generate unit tests alongside new functions when asked.",
16
- },
17
- {
18
- level: "clean",
19
- description: "Vitest + Testing Library for component tests",
20
- pros: ["Unit + component coverage", "Tests user behavior"],
21
- cons: ["More setup", "Slower component tests"],
22
- claudeImpact: "Claude will generate both unit and component tests with proper render/assert patterns.",
23
- },
24
- {
25
- level: "scalable",
26
- description: "Vitest + Testing Library + Playwright for E2E",
27
- pros: ["Full coverage pyramid", "Catches integration bugs"],
28
- cons: ["Significant setup", "Slower CI"],
29
- claudeImpact: "Claude will generate tests at all levels and respect the testing pyramid.",
30
- },
15
+ opt(m.testing.simple, "simple"),
16
+ opt(m.testing.clean, "clean"),
17
+ opt(m.testing.scalable, "scalable"),
31
18
  ],
32
19
  });
33
20
  break;
34
21
  case "input-validation":
35
22
  suggestions.push({
36
- topic: "Input Validation",
37
- options: [
38
- {
39
- level: "simple",
40
- description: "Add Zod for manual validation in API routes",
41
- pros: ["Minimal", "TypeScript-native"],
42
- cons: ["Must remember to validate each route"],
43
- claudeImpact: "Claude will add z.object().parse() in API routes when reminded.",
44
- },
45
- {
46
- level: "clean",
47
- description: "Zod with shared schemas directory and middleware",
48
- pros: ["DRY schemas", "Consistent validation"],
49
- cons: ["More structure upfront"],
50
- claudeImpact: "Claude will import shared schemas and validate automatically in every route.",
51
- },
52
- ],
23
+ topic: m.inputValidation.topic,
24
+ options: [opt(m.inputValidation.simple, "simple"), opt(m.inputValidation.clean, "clean")],
53
25
  });
54
26
  break;
55
27
  case "error-handling":
56
28
  suggestions.push({
57
- topic: "Error Handling",
58
- options: [
59
- {
60
- level: "simple",
61
- description: "Add error.tsx in each route segment",
62
- pros: ["Quick", "Follows Next.js conventions"],
63
- cons: ["No structured error logging"],
64
- claudeImpact: "Claude will create error.tsx files and handle errors gracefully.",
65
- },
66
- {
67
- level: "clean",
68
- description: "Error boundaries + centralized error utilities + structured logging",
69
- pros: ["Consistent error format", "Debuggable"],
70
- cons: ["More setup"],
71
- claudeImpact: "Claude will use the error utilities consistently and produce debuggable error responses.",
72
- },
73
- ],
29
+ topic: m.errorHandling.topic,
30
+ options: [opt(m.errorHandling.simple, "simple"), opt(m.errorHandling.clean, "clean")],
74
31
  });
75
32
  break;
76
33
  case "shared-schemas":
77
34
  suggestions.push({
78
- topic: "Schema Organization",
79
- options: [
80
- {
81
- level: "simple",
82
- description: "Co-locate schemas next to their API routes",
83
- pros: ["Easy to find", "No indirection"],
84
- cons: ["Schemas get duplicated across routes"],
85
- claudeImpact: "Claude will duplicate schemas when the same data is used in multiple routes.",
86
- },
87
- {
88
- level: "clean",
89
- description: "Shared /lib/schemas/ directory",
90
- pros: ["Single source of truth", "DRY"],
91
- cons: ["One more directory to manage"],
92
- claudeImpact: "Claude will find and reuse schemas consistently across routes and forms.",
93
- },
94
- ],
35
+ topic: m.schemaOrg.topic,
36
+ options: [opt(m.schemaOrg.simple, "simple"), opt(m.schemaOrg.clean, "clean")],
95
37
  });
96
38
  break;
97
39
  case "component-structure":
98
40
  suggestions.push({
99
- topic: "Component Organization",
100
- options: [
101
- {
102
- level: "simple",
103
- description: "Flat /components directory",
104
- pros: ["Simple", "Works for small projects"],
105
- cons: ["Gets messy at scale"],
106
- claudeImpact: "Claude will place all components in one directory.",
107
- },
108
- {
109
- level: "clean",
110
- description: "Feature-based organization: /components/ui/ + /components/[feature]/",
111
- pros: ["Scales well", "Clear ownership"],
112
- cons: ["More directories"],
113
- claudeImpact: "Claude will organize components by feature and reuse UI primitives.",
114
- },
115
- ],
41
+ topic: m.componentStructure.topic,
42
+ options: [opt(m.componentStructure.simple, "simple"), opt(m.componentStructure.clean, "clean")],
116
43
  });
117
44
  break;
118
45
  case "auth-middleware":
119
46
  suggestions.push({
120
- topic: "Route Protection",
121
- options: [
122
- {
123
- level: "simple",
124
- description: "Check auth in each Server Component/route handler",
125
- pros: ["Explicit", "Easy to understand"],
126
- cons: ["Easy to forget on new routes"],
127
- claudeImpact: "Claude may forget auth checks on new routes unless reminded.",
128
- },
129
- {
130
- level: "clean",
131
- description: "middleware.ts with route matcher + per-route checks as backup",
132
- pros: ["Centralized", "Defense in depth"],
133
- cons: ["Middleware can be tricky to debug"],
134
- claudeImpact: "Claude will add routes to the protected matcher and still add server-side checks.",
135
- },
136
- ],
47
+ topic: m.authMiddleware.topic,
48
+ options: [opt(m.authMiddleware.simple, "simple"), opt(m.authMiddleware.clean, "clean")],
137
49
  });
138
50
  break;
139
51
  case "loading-states":
140
52
  suggestions.push({
141
- topic: "Loading States",
142
- options: [
143
- {
144
- level: "simple",
145
- description: "Add a single loading.tsx at the root app/ level",
146
- pros: ["Quick", "Covers all routes"],
147
- cons: ["Same loading UI everywhere"],
148
- claudeImpact: "Claude will see the pattern and create loading.tsx for new route segments.",
149
- },
150
- {
151
- level: "clean",
152
- description: "Per-segment loading.tsx with skeleton UIs matching each page layout",
153
- pros: ["Better UX", "Layout-aware skeletons"],
154
- cons: ["More files to maintain"],
155
- claudeImpact: "Claude will create matching skeleton UIs for each new route segment.",
156
- },
157
- ],
53
+ topic: m.loadingStates.topic,
54
+ options: [opt(m.loadingStates.simple, "simple"), opt(m.loadingStates.clean, "clean")],
158
55
  });
159
56
  break;
160
57
  case "metadata":
161
58
  suggestions.push({
162
- topic: "SEO & Metadata",
163
- options: [
164
- {
165
- level: "simple",
166
- description: "Static metadata export in each page.tsx",
167
- pros: ["Simple", "Covers basic SEO"],
168
- cons: ["No dynamic metadata for dynamic routes"],
169
- claudeImpact: "Claude will add export const metadata to new pages.",
170
- },
171
- {
172
- level: "clean",
173
- description: "generateMetadata for dynamic pages + static metadata for others",
174
- pros: ["Dynamic title/description per route", "Full SEO control"],
175
- cons: ["More boilerplate per page"],
176
- claudeImpact: "Claude will generate proper generateMetadata functions with dynamic data.",
177
- },
178
- ],
59
+ topic: m.metadata.topic,
60
+ options: [opt(m.metadata.simple, "simple"), opt(m.metadata.clean, "clean")],
179
61
  });
180
62
  break;
181
63
  case "prisma-client-singleton":
182
64
  suggestions.push({
183
- topic: "Prisma Client Singleton",
184
- options: [
185
- {
186
- level: "simple",
187
- description: "globalThis pattern in lib/prisma.ts",
188
- pros: ["Standard approach", "Prevents hot-reload leaks"],
189
- cons: ["Requires discipline to always import from there"],
190
- claudeImpact: "Claude will import from lib/prisma.ts consistently.",
191
- },
192
- ],
65
+ topic: m.prismaClient.topic,
66
+ options: [opt(m.prismaClient.simple, "simple")],
193
67
  });
194
68
  break;
195
69
  case "auth-session":
196
70
  suggestions.push({
197
- topic: "Auth Utility",
198
- options: [
199
- {
200
- level: "simple",
201
- description: "Create lib/auth.ts with getCurrentUser() function",
202
- pros: ["Centralized", "Easy to use"],
203
- cons: ["Must remember to use it"],
204
- claudeImpact: "Claude will call getCurrentUser() in Server Components and Route Handlers.",
205
- },
206
- {
207
- level: "clean",
208
- description: "lib/auth.ts with getCurrentUser() + requireAuth() that throws on no session",
209
- pros: ["Fail-safe", "Clear intent"],
210
- cons: ["Slightly more code"],
211
- claudeImpact: "Claude will use requireAuth() at the top of protected routes automatically.",
212
- },
213
- ],
71
+ topic: m.authSession.topic,
72
+ options: [opt(m.authSession.simple, "simple"), opt(m.authSession.clean, "clean")],
214
73
  });
215
74
  break;
216
75
  case "env-validation":
217
76
  suggestions.push({
218
- topic: "Environment Variable Validation",
219
- options: [
220
- {
221
- level: "simple",
222
- description: "Manual Zod validation in env.ts",
223
- pros: ["No extra deps", "Full control"],
224
- cons: ["Manual maintenance"],
225
- claudeImpact: "Claude will import env vars from env.ts and never use process.env directly.",
226
- },
227
- {
228
- level: "clean",
229
- description: "Use @t3-oss/env-nextjs for type-safe env with client/server separation",
230
- pros: ["Type-safe", "Client/server boundary enforcement"],
231
- cons: ["Extra dependency"],
232
- claudeImpact: "Claude will import from env.mjs and respect client/server env boundaries.",
233
- },
234
- ],
77
+ topic: m.envValidation.topic,
78
+ options: [opt(m.envValidation.simple, "simple"), opt(m.envValidation.clean, "clean")],
235
79
  });
236
80
  break;
237
81
  case "types-dir":
238
82
  suggestions.push({
239
- topic: "Shared Types Organization",
240
- options: [
241
- {
242
- level: "simple",
243
- description: "Create a types/ directory with domain-specific type files",
244
- pros: ["Clear location for shared types"],
245
- cons: ["One more directory"],
246
- claudeImpact: "Claude will place shared types in types/ and import from there.",
247
- },
248
- ],
83
+ topic: m.typesDir.topic,
84
+ options: [opt(m.typesDir.simple, "simple")],
249
85
  });
250
86
  break;
251
87
  case "store-organization":
252
88
  suggestions.push({
253
- topic: "Store Organization",
254
- options: [
255
- {
256
- level: "simple",
257
- description: "Create a store/ directory with one file per store",
258
- pros: ["Simple", "Easy to find"],
259
- cons: ["Flat structure"],
260
- claudeImpact: "Claude will create stores in store/ with clear naming.",
261
- },
262
- ],
89
+ topic: m.storeOrg.topic,
90
+ options: [opt(m.storeOrg.simple, "simple")],
263
91
  });
264
92
  break;
265
93
  case "drizzle-schema-org":
266
94
  suggestions.push({
267
- topic: "Drizzle Schema Organization",
268
- options: [
269
- {
270
- level: "simple",
271
- description: "All schemas in db/schema.ts",
272
- pros: ["Simple for small projects"],
273
- cons: ["Gets large fast"],
274
- claudeImpact: "Claude will add new tables to the single schema file.",
275
- },
276
- {
277
- level: "clean",
278
- description: "db/schema/ directory with one file per domain entity + index.ts barrel",
279
- pros: ["Scales well", "Easy to find"],
280
- cons: ["More files"],
281
- claudeImpact: "Claude will create new schema files per entity and export from index.ts.",
282
- },
283
- ],
95
+ topic: m.drizzleSchema.topic,
96
+ options: [opt(m.drizzleSchema.simple, "simple"), opt(m.drizzleSchema.clean, "clean")],
284
97
  });
285
98
  break;
286
99
  default:
287
- // Generic suggestion for uncategorized gaps
288
100
  suggestions.push({
289
101
  topic: gap.message,
290
102
  options: [
291
103
  {
292
104
  level: "simple",
293
- description: `Address: ${gap.message}`,
294
- pros: ["Fixes the gap"],
295
- cons: ["May need further refinement"],
296
- claudeImpact: "Claude will follow the convention once documented in CLAUDE.md.",
105
+ description: interpolate(m.genericFix, { message: gap.message }),
106
+ pros: m.genericPros,
107
+ cons: m.genericCons,
108
+ claudeImpact: m.genericClaudeImpact,
297
109
  },
298
110
  ],
299
111
  });
@@ -313,13 +125,18 @@ export function registerSuggest(server) {
313
125
  gaps: z
314
126
  .string()
315
127
  .describe("JSON string of gaps array (output of detect-gaps)"),
128
+ language: z
129
+ .enum(["en", "fr"])
130
+ .optional()
131
+ .describe("Output language for suggestions (default: en)"),
316
132
  },
317
- }, async ({ analysis: analysisStr, gaps: gapsStr }) => {
133
+ }, async ({ analysis: analysisStr, gaps: gapsStr, language }) => {
318
134
  try {
135
+ const locale = language ?? "en";
319
136
  const analysis = JSON.parse(analysisStr);
320
137
  const parsed = JSON.parse(gapsStr);
321
138
  const gaps = Array.isArray(parsed) ? parsed : parsed.gaps;
322
- const suggestions = buildSuggestions(analysis, gaps);
139
+ const suggestions = buildSuggestions(analysis, gaps, locale);
323
140
  return {
324
141
  content: [
325
142
  {
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,SAAS,gBAAgB,CAAC,QAAsB,EAAE,IAAW;IAC3D,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,SAAS;gBACZ,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,gCAAgC;4BAC7C,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAC;4BAC/C,IAAI,EAAE,CAAC,iBAAiB,CAAC;4BACzB,YAAY,EACV,qEAAqE;yBACxE;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,8CAA8C;4BAC3D,IAAI,EAAE,CAAC,2BAA2B,EAAE,qBAAqB,CAAC;4BAC1D,IAAI,EAAE,CAAC,YAAY,EAAE,wBAAwB,CAAC;4BAC9C,YAAY,EACV,wFAAwF;yBAC3F;wBACD;4BACE,KAAK,EAAE,UAAU;4BACjB,WAAW,EACT,+CAA+C;4BACjD,IAAI,EAAE,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;4BAC3D,IAAI,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC;4BACxC,YAAY,EACV,2EAA2E;yBAC9E;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,kBAAkB;gBACrB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,6CAA6C;4BAC1D,IAAI,EAAE,CAAC,SAAS,EAAE,mBAAmB,CAAC;4BACtC,IAAI,EAAE,CAAC,sCAAsC,CAAC;4BAC9C,YAAY,EACV,iEAAiE;yBACpE;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EACT,kDAAkD;4BACpD,IAAI,EAAE,CAAC,aAAa,EAAE,uBAAuB,CAAC;4BAC9C,IAAI,EAAE,CAAC,wBAAwB,CAAC;4BAChC,YAAY,EACV,8EAA8E;yBACjF;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,gBAAgB;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,qCAAqC;4BAClD,IAAI,EAAE,CAAC,OAAO,EAAE,6BAA6B,CAAC;4BAC9C,IAAI,EAAE,CAAC,6BAA6B,CAAC;4BACrC,YAAY,EACV,kEAAkE;yBACrE;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EACT,qEAAqE;4BACvE,IAAI,EAAE,CAAC,yBAAyB,EAAE,YAAY,CAAC;4BAC/C,IAAI,EAAE,CAAC,YAAY,CAAC;4BACpB,YAAY,EACV,0FAA0F;yBAC7F;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,gBAAgB;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,4CAA4C;4BACzD,IAAI,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;4BACxC,IAAI,EAAE,CAAC,sCAAsC,CAAC;4BAC9C,YAAY,EACV,8EAA8E;yBACjF;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,gCAAgC;4BAC7C,IAAI,EAAE,CAAC,wBAAwB,EAAE,KAAK,CAAC;4BACvC,IAAI,EAAE,CAAC,8BAA8B,CAAC;4BACtC,YAAY,EACV,0EAA0E;yBAC7E;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,qBAAqB;gBACxB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,wBAAwB;oBAC/B,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,4BAA4B;4BACzC,IAAI,EAAE,CAAC,QAAQ,EAAE,0BAA0B,CAAC;4BAC5C,IAAI,EAAE,CAAC,qBAAqB,CAAC;4BAC7B,YAAY,EACV,oDAAoD;yBACvD;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EACT,sEAAsE;4BACxE,IAAI,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC;4BACxC,IAAI,EAAE,CAAC,kBAAkB,CAAC;4BAC1B,YAAY,EACV,qEAAqE;yBACxE;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,iBAAiB;gBACpB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,mDAAmD;4BAChE,IAAI,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC;4BACxC,IAAI,EAAE,CAAC,8BAA8B,CAAC;4BACtC,YAAY,EACV,8DAA8D;yBACjE;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EACT,+DAA+D;4BACjE,IAAI,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;4BACzC,IAAI,EAAE,CAAC,mCAAmC,CAAC;4BAC3C,YAAY,EACV,mFAAmF;yBACtF;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,gBAAgB;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,iDAAiD;4BAC9D,IAAI,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC;4BACpC,IAAI,EAAE,CAAC,4BAA4B,CAAC;4BACpC,YAAY,EACV,4EAA4E;yBAC/E;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,qEAAqE;4BAClF,IAAI,EAAE,CAAC,WAAW,EAAE,wBAAwB,CAAC;4BAC7C,IAAI,EAAE,CAAC,wBAAwB,CAAC;4BAChC,YAAY,EACV,sEAAsE;yBACzE;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,UAAU;gBACb,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,yCAAyC;4BACtD,IAAI,EAAE,CAAC,QAAQ,EAAE,kBAAkB,CAAC;4BACpC,IAAI,EAAE,CAAC,wCAAwC,CAAC;4BAChD,YAAY,EACV,qDAAqD;yBACxD;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,iEAAiE;4BAC9E,IAAI,EAAE,CAAC,qCAAqC,EAAE,kBAAkB,CAAC;4BACjE,IAAI,EAAE,CAAC,2BAA2B,CAAC;4BACnC,YAAY,EACV,2EAA2E;yBAC9E;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,yBAAyB;gBAC5B,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,yBAAyB;oBAChC,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,qCAAqC;4BAClD,IAAI,EAAE,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;4BACxD,IAAI,EAAE,CAAC,iDAAiD,CAAC;4BACzD,YAAY,EACV,qDAAqD;yBACxD;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,cAAc;gBACjB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,mDAAmD;4BAChE,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;4BACpC,IAAI,EAAE,CAAC,yBAAyB,CAAC;4BACjC,YAAY,EACV,4EAA4E;yBAC/E;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,6EAA6E;4BAC1F,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;4BACnC,IAAI,EAAE,CAAC,oBAAoB,CAAC;4BAC5B,YAAY,EACV,6EAA6E;yBAChF;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,gBAAgB;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,iCAAiC;oBACxC,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,iCAAiC;4BAC9C,IAAI,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC;4BACvC,IAAI,EAAE,CAAC,oBAAoB,CAAC;4BAC5B,YAAY,EACV,6EAA6E;yBAChF;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,wEAAwE;4BACrF,IAAI,EAAE,CAAC,WAAW,EAAE,oCAAoC,CAAC;4BACzD,IAAI,EAAE,CAAC,kBAAkB,CAAC;4BAC1B,YAAY,EACV,2EAA2E;yBAC9E;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,WAAW;gBACd,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,2BAA2B;oBAClC,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,2DAA2D;4BACxE,IAAI,EAAE,CAAC,iCAAiC,CAAC;4BACzC,IAAI,EAAE,CAAC,oBAAoB,CAAC;4BAC5B,YAAY,EACV,iEAAiE;yBACpE;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,oBAAoB;gBACvB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,oBAAoB;oBAC3B,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,mDAAmD;4BAChE,IAAI,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;4BAChC,IAAI,EAAE,CAAC,gBAAgB,CAAC;4BACxB,YAAY,EACV,wDAAwD;yBAC3D;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,oBAAoB;gBACvB,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,6BAA6B;oBACpC,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,6BAA6B;4BAC1C,IAAI,EAAE,CAAC,2BAA2B,CAAC;4BACnC,IAAI,EAAE,CAAC,iBAAiB,CAAC;4BACzB,YAAY,EACV,uDAAuD;yBAC1D;wBACD;4BACE,KAAK,EAAE,OAAO;4BACd,WAAW,EAAE,wEAAwE;4BACrF,IAAI,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;4BACrC,IAAI,EAAE,CAAC,YAAY,CAAC;4BACpB,YAAY,EACV,0EAA0E;yBAC7E;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;YAER;gBACE,4CAA4C;gBAC5C,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,GAAG,CAAC,OAAO;oBAClB,OAAO,EAAE;wBACP;4BACE,KAAK,EAAE,QAAQ;4BACf,WAAW,EAAE,YAAY,GAAG,CAAC,OAAO,EAAE;4BACtC,IAAI,EAAE,CAAC,eAAe,CAAC;4BACvB,IAAI,EAAE,CAAC,6BAA6B,CAAC;4BACrC,YAAY,EACV,iEAAiE;yBACpE;qBACF;iBACF,CAAC,CAAC;gBACH,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,qLAAqL;QACvL,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,6BAA6B,CAAC;YAC1C,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,mDAAmD,CAAC;SACjE;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,GAAU,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAErD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC/C;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,+BAA+B,OAAO,EAAE,EAAE,CAAC;aACrF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-claude-md.d.ts","sourceRoot":"","sources":["../../src/tools/update-claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoG9D"}
1
+ {"version":3,"file":"update-claude-md.d.ts","sourceRoot":"","sources":["../../src/tools/update-claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgH9D"}
@@ -7,13 +7,15 @@ import { detectFramework, detectStack } from "../analyzers/detection.js";
7
7
  import { analyzePatterns } from "../analyzers/patterns.js";
8
8
  import { getConventions, getInterdictions, getActiveCrossRefs, } from "../rules/index.js";
9
9
  import { generateClaudeMd } from "../templates/claude-md.js";
10
+ import { getMessages, interpolate } from "../i18n/index.js";
10
11
  /**
11
12
  * Extract user-added sections from an existing CLAUDE.md.
12
13
  * Preserves "Project Decisions" and any section not generated by LeadCode.
13
14
  */
14
15
  function extractUserChoices(existingContent) {
15
16
  const choices = {};
16
- const decisionsMatch = existingContent.match(/## Project Decisions\n+([\s\S]*?)(?=\n## |$)/);
17
+ // Match both English and French section headers
18
+ const decisionsMatch = existingContent.match(/## (?:Project Decisions|Décisions du projet)\n+([\s\S]*?)(?=\n## |$)/);
17
19
  if (decisionsMatch) {
18
20
  const lines = decisionsMatch[1].trim().split("\n");
19
21
  for (const line of lines) {
@@ -25,6 +27,13 @@ function extractUserChoices(existingContent) {
25
27
  }
26
28
  return choices;
27
29
  }
30
+ /** Detect locale of existing CLAUDE.md by checking for French section headers */
31
+ function detectExistingLocale(content) {
32
+ if (content.includes("## Vue d'ensemble") || content.includes("## Stack technique") || content.includes("## Décisions du projet")) {
33
+ return "fr";
34
+ }
35
+ return "en";
36
+ }
28
37
  export function registerUpdateClaudeMd(server) {
29
38
  server.registerTool("update-claude-md", {
30
39
  title: "Update CLAUDE.md",
@@ -33,29 +42,38 @@ export function registerUpdateClaudeMd(server) {
33
42
  projectPath: z
34
43
  .string()
35
44
  .describe("Absolute path to the project root directory"),
45
+ language: z
46
+ .enum(["en", "fr"])
47
+ .optional()
48
+ .describe("Output language. If omitted, keeps the language of the existing CLAUDE.md (default: en for new files)"),
36
49
  },
37
- }, async ({ projectPath }) => {
50
+ }, async ({ projectPath, language }) => {
38
51
  try {
39
52
  // Verify project path
40
53
  try {
41
54
  await stat(projectPath);
42
55
  }
43
56
  catch {
57
+ const msg = getMessages(language ?? "en");
44
58
  return {
45
59
  isError: true,
46
- content: [{ type: "text", text: `Project directory not found: ${projectPath}` }],
60
+ content: [{ type: "text", text: interpolate(msg.tools.dirNotFound, { path: projectPath }) }],
47
61
  };
48
62
  }
49
63
  const claudeMdPath = join(projectPath, "CLAUDE.md");
50
- // Extract existing choices if CLAUDE.md exists
64
+ // Extract existing choices and detect locale if CLAUDE.md exists
51
65
  let previousChoices = {};
66
+ let detectedLocale = "en";
52
67
  try {
53
68
  const existing = await readFile(claudeMdPath, "utf-8");
54
69
  previousChoices = extractUserChoices(existing);
70
+ detectedLocale = detectExistingLocale(existing);
55
71
  }
56
72
  catch {
57
73
  // No existing file — that's fine
58
74
  }
75
+ const locale = language ?? detectedLocale;
76
+ const msg = getMessages(locale);
59
77
  // Re-analyze
60
78
  const pkg = await analyzeDependencies(projectPath);
61
79
  const structure = await analyzeStructure(projectPath);
@@ -76,7 +94,7 @@ export function registerUpdateClaudeMd(server) {
76
94
  const conventions = getConventions(analysis);
77
95
  const interdictions = getInterdictions(analysis);
78
96
  const crossRefs = getActiveCrossRefs(analysis);
79
- const content = generateClaudeMd(analysis, conventions, interdictions, crossRefs, previousChoices, patterns);
97
+ const content = generateClaudeMd(analysis, conventions, interdictions, crossRefs, previousChoices, patterns, locale);
80
98
  await writeFile(claudeMdPath, content, "utf-8");
81
99
  return {
82
100
  content: [
@@ -84,7 +102,8 @@ export function registerUpdateClaudeMd(server) {
84
102
  type: "text",
85
103
  text: JSON.stringify({
86
104
  path: claudeMdPath,
87
- message: "CLAUDE.md updated successfully",
105
+ message: msg.tools.updateSuccess,
106
+ language: locale,
88
107
  preservedChoices: Object.keys(previousChoices).length,
89
108
  sections: {
90
109
  conventions: conventions.length,
@@ -1 +1 @@
1
- {"version":3,"file":"update-claude-md.js","sourceRoot":"","sources":["../../src/tools/update-claude-md.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-claude-md.js","sourceRoot":"","sources":["../../src/tools/update-claude-md.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-claude-md.d.ts","sourceRoot":"","sources":["../../src/tools/validate-claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkJhE"}
1
+ {"version":3,"file":"validate-claude-md.d.ts","sourceRoot":"","sources":["../../src/tools/validate-claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyJhE"}