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.
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +368 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/fr.d.ts +3 -0
- package/dist/i18n/fr.d.ts.map +1 -0
- package/dist/i18n/fr.js +368 -0
- package/dist/i18n/fr.js.map +1 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +15 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +355 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.js +75 -38
- package/dist/index.js.map +1 -1
- package/dist/templates/claude-md.d.ts +2 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +115 -106
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/tools/generate-claude-md.d.ts.map +1 -1
- package/dist/tools/generate-claude-md.js +12 -4
- package/dist/tools/generate-claude-md.js.map +1 -1
- package/dist/tools/suggest.d.ts.map +1 -1
- package/dist/tools/suggest.js +47 -230
- package/dist/tools/suggest.js.map +1 -1
- package/dist/tools/update-claude-md.d.ts.map +1 -1
- package/dist/tools/update-claude-md.js +25 -6
- package/dist/tools/update-claude-md.js.map +1 -1
- package/dist/tools/validate-claude-md.d.ts.map +1 -1
- package/dist/tools/validate-claude-md.js +25 -18
- package/dist/tools/validate-claude-md.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/suggest.js
CHANGED
|
@@ -1,299 +1,111 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
-
|
|
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:
|
|
13
|
+
topic: m.testing.topic,
|
|
9
14
|
options: [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
294
|
-
pros:
|
|
295
|
-
cons:
|
|
296
|
-
claudeImpact:
|
|
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,
|
|
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;
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D;;;GAGG;AACH,SAAS,kBAAkB,CAAC,eAAuB;IACjD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAC1C,
|
|
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;
|
|
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"}
|