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.
- package/README.md +7 -12
- 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/suggest.d.ts.map +1 -1
- package/dist/tools/suggest.js +28 -270
- package/dist/tools/suggest.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/suggest.js
CHANGED
|
@@ -1,301 +1,68 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
+
import { getMessages } 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
|
+
}
|
|
2
6
|
function buildSuggestions(analysis, gaps) {
|
|
7
|
+
const m = getMessages("en").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:
|
|
9
|
-
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
|
-
},
|
|
31
|
-
],
|
|
13
|
+
topic: m.testing.topic,
|
|
14
|
+
options: [opt(m.testing.simple, "simple"), opt(m.testing.clean, "clean"), opt(m.testing.scalable, "scalable")],
|
|
32
15
|
});
|
|
33
16
|
break;
|
|
34
17
|
case "input-validation":
|
|
35
|
-
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
|
-
],
|
|
53
|
-
});
|
|
18
|
+
suggestions.push({ topic: m.inputValidation.topic, options: [opt(m.inputValidation.simple, "simple"), opt(m.inputValidation.clean, "clean")] });
|
|
54
19
|
break;
|
|
55
20
|
case "error-handling":
|
|
56
|
-
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
|
-
],
|
|
74
|
-
});
|
|
21
|
+
suggestions.push({ topic: m.errorHandling.topic, options: [opt(m.errorHandling.simple, "simple"), opt(m.errorHandling.clean, "clean")] });
|
|
75
22
|
break;
|
|
76
23
|
case "shared-schemas":
|
|
77
|
-
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
|
-
],
|
|
95
|
-
});
|
|
24
|
+
suggestions.push({ topic: m.schemaOrg.topic, options: [opt(m.schemaOrg.simple, "simple"), opt(m.schemaOrg.clean, "clean")] });
|
|
96
25
|
break;
|
|
97
26
|
case "component-structure":
|
|
98
|
-
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
|
-
],
|
|
116
|
-
});
|
|
27
|
+
suggestions.push({ topic: m.componentStructure.topic, options: [opt(m.componentStructure.simple, "simple"), opt(m.componentStructure.clean, "clean")] });
|
|
117
28
|
break;
|
|
118
29
|
case "auth-middleware":
|
|
119
|
-
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
|
-
],
|
|
137
|
-
});
|
|
30
|
+
suggestions.push({ topic: m.authMiddleware.topic, options: [opt(m.authMiddleware.simple, "simple"), opt(m.authMiddleware.clean, "clean")] });
|
|
138
31
|
break;
|
|
139
32
|
case "loading-states":
|
|
140
|
-
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
|
-
],
|
|
158
|
-
});
|
|
33
|
+
suggestions.push({ topic: m.loadingStates.topic, options: [opt(m.loadingStates.simple, "simple"), opt(m.loadingStates.clean, "clean")] });
|
|
159
34
|
break;
|
|
160
35
|
case "metadata":
|
|
161
|
-
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
|
-
],
|
|
179
|
-
});
|
|
36
|
+
suggestions.push({ topic: m.metadata.topic, options: [opt(m.metadata.simple, "simple"), opt(m.metadata.clean, "clean")] });
|
|
180
37
|
break;
|
|
181
38
|
case "prisma-client-singleton":
|
|
182
|
-
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
|
-
],
|
|
193
|
-
});
|
|
39
|
+
suggestions.push({ topic: m.prismaClient.topic, options: [opt(m.prismaClient.simple, "simple")] });
|
|
194
40
|
break;
|
|
195
41
|
case "auth-session":
|
|
196
|
-
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
|
-
],
|
|
214
|
-
});
|
|
42
|
+
suggestions.push({ topic: m.authSession.topic, options: [opt(m.authSession.simple, "simple"), opt(m.authSession.clean, "clean")] });
|
|
215
43
|
break;
|
|
216
44
|
case "env-validation":
|
|
217
|
-
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
|
-
],
|
|
235
|
-
});
|
|
45
|
+
suggestions.push({ topic: m.envValidation.topic, options: [opt(m.envValidation.simple, "simple"), opt(m.envValidation.clean, "clean")] });
|
|
236
46
|
break;
|
|
237
47
|
case "types-dir":
|
|
238
|
-
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
|
-
],
|
|
249
|
-
});
|
|
48
|
+
suggestions.push({ topic: m.typesDir.topic, options: [opt(m.typesDir.simple, "simple")] });
|
|
250
49
|
break;
|
|
251
50
|
case "store-organization":
|
|
252
|
-
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
|
-
],
|
|
263
|
-
});
|
|
51
|
+
suggestions.push({ topic: m.storeOrg.topic, options: [opt(m.storeOrg.simple, "simple")] });
|
|
264
52
|
break;
|
|
265
53
|
case "drizzle-schema-org":
|
|
266
|
-
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
|
-
],
|
|
284
|
-
});
|
|
54
|
+
suggestions.push({ topic: m.drizzleSchema.topic, options: [opt(m.drizzleSchema.simple, "simple"), opt(m.drizzleSchema.clean, "clean")] });
|
|
285
55
|
break;
|
|
286
56
|
default:
|
|
287
|
-
// Generic suggestion for uncategorized gaps
|
|
288
57
|
suggestions.push({
|
|
289
58
|
topic: gap.message,
|
|
290
|
-
options: [
|
|
291
|
-
{
|
|
59
|
+
options: [{
|
|
292
60
|
level: "simple",
|
|
293
61
|
description: `Address: ${gap.message}`,
|
|
294
|
-
pros:
|
|
295
|
-
cons:
|
|
296
|
-
claudeImpact:
|
|
297
|
-
},
|
|
298
|
-
],
|
|
62
|
+
pros: m.genericPros,
|
|
63
|
+
cons: m.genericCons,
|
|
64
|
+
claudeImpact: m.genericClaudeImpact,
|
|
65
|
+
}],
|
|
299
66
|
});
|
|
300
67
|
break;
|
|
301
68
|
}
|
|
@@ -307,12 +74,8 @@ export function registerSuggest(server) {
|
|
|
307
74
|
title: "Suggest Conventions",
|
|
308
75
|
description: "Given a repo analysis and detected gaps, proposes structured options (simple / clean / scalable) for each gap. Each option includes pros, cons, and impact on Claude Code behavior.",
|
|
309
76
|
inputSchema: {
|
|
310
|
-
analysis: z
|
|
311
|
-
|
|
312
|
-
.describe("JSON string of RepoAnalysis"),
|
|
313
|
-
gaps: z
|
|
314
|
-
.string()
|
|
315
|
-
.describe("JSON string of gaps array (output of detect-gaps)"),
|
|
77
|
+
analysis: z.string().describe("JSON string of RepoAnalysis"),
|
|
78
|
+
gaps: z.string().describe("JSON string of gaps array (output of detect-gaps)"),
|
|
316
79
|
},
|
|
317
80
|
}, async ({ analysis: analysisStr, gaps: gapsStr }) => {
|
|
318
81
|
try {
|
|
@@ -321,12 +84,7 @@ export function registerSuggest(server) {
|
|
|
321
84
|
const gaps = Array.isArray(parsed) ? parsed : parsed.gaps;
|
|
322
85
|
const suggestions = buildSuggestions(analysis, gaps);
|
|
323
86
|
return {
|
|
324
|
-
content: [
|
|
325
|
-
{
|
|
326
|
-
type: "text",
|
|
327
|
-
text: JSON.stringify({ suggestions }, null, 2),
|
|
328
|
-
},
|
|
329
|
-
],
|
|
87
|
+
content: [{ type: "text", text: JSON.stringify({ suggestions }, null, 2) }],
|
|
330
88
|
};
|
|
331
89
|
}
|
|
332
90
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"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"}
|