leadcode 0.1.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.
Files changed (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/bin/leadcode.js +2 -0
  4. package/dist/analyzers/constants.d.ts +3 -0
  5. package/dist/analyzers/constants.d.ts.map +1 -0
  6. package/dist/analyzers/constants.js +14 -0
  7. package/dist/analyzers/constants.js.map +1 -0
  8. package/dist/analyzers/dependencies.d.ts +8 -0
  9. package/dist/analyzers/dependencies.d.ts.map +1 -0
  10. package/dist/analyzers/dependencies.js +13 -0
  11. package/dist/analyzers/dependencies.js.map +1 -0
  12. package/dist/analyzers/detection.d.ts +6 -0
  13. package/dist/analyzers/detection.d.ts.map +1 -0
  14. package/dist/analyzers/detection.js +334 -0
  15. package/dist/analyzers/detection.js.map +1 -0
  16. package/dist/analyzers/patterns.d.ts +12 -0
  17. package/dist/analyzers/patterns.d.ts.map +1 -0
  18. package/dist/analyzers/patterns.js +84 -0
  19. package/dist/analyzers/patterns.js.map +1 -0
  20. package/dist/analyzers/structure.d.ts +3 -0
  21. package/dist/analyzers/structure.d.ts.map +1 -0
  22. package/dist/analyzers/structure.js +217 -0
  23. package/dist/analyzers/structure.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +64 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/rules/auth.d.ts +3 -0
  29. package/dist/rules/auth.d.ts.map +1 -0
  30. package/dist/rules/auth.js +48 -0
  31. package/dist/rules/auth.js.map +1 -0
  32. package/dist/rules/cross-stack.d.ts +3 -0
  33. package/dist/rules/cross-stack.d.ts.map +1 -0
  34. package/dist/rules/cross-stack.js +320 -0
  35. package/dist/rules/cross-stack.js.map +1 -0
  36. package/dist/rules/drizzle.d.ts +3 -0
  37. package/dist/rules/drizzle.d.ts.map +1 -0
  38. package/dist/rules/drizzle.js +43 -0
  39. package/dist/rules/drizzle.js.map +1 -0
  40. package/dist/rules/index.d.ts +7 -0
  41. package/dist/rules/index.d.ts.map +1 -0
  42. package/dist/rules/index.js +104 -0
  43. package/dist/rules/index.js.map +1 -0
  44. package/dist/rules/nextjs.d.ts +4 -0
  45. package/dist/rules/nextjs.d.ts.map +1 -0
  46. package/dist/rules/nextjs.js +86 -0
  47. package/dist/rules/nextjs.js.map +1 -0
  48. package/dist/rules/node.d.ts +3 -0
  49. package/dist/rules/node.d.ts.map +1 -0
  50. package/dist/rules/node.js +61 -0
  51. package/dist/rules/node.js.map +1 -0
  52. package/dist/rules/prisma.d.ts +3 -0
  53. package/dist/rules/prisma.d.ts.map +1 -0
  54. package/dist/rules/prisma.js +44 -0
  55. package/dist/rules/prisma.js.map +1 -0
  56. package/dist/rules/react.d.ts +3 -0
  57. package/dist/rules/react.d.ts.map +1 -0
  58. package/dist/rules/react.js +58 -0
  59. package/dist/rules/react.js.map +1 -0
  60. package/dist/rules/state.d.ts +3 -0
  61. package/dist/rules/state.d.ts.map +1 -0
  62. package/dist/rules/state.js +54 -0
  63. package/dist/rules/state.js.map +1 -0
  64. package/dist/rules/tailwind.d.ts +3 -0
  65. package/dist/rules/tailwind.d.ts.map +1 -0
  66. package/dist/rules/tailwind.js +41 -0
  67. package/dist/rules/tailwind.js.map +1 -0
  68. package/dist/rules/trpc.d.ts +3 -0
  69. package/dist/rules/trpc.d.ts.map +1 -0
  70. package/dist/rules/trpc.js +35 -0
  71. package/dist/rules/trpc.js.map +1 -0
  72. package/dist/rules/typescript.d.ts +3 -0
  73. package/dist/rules/typescript.d.ts.map +1 -0
  74. package/dist/rules/typescript.js +54 -0
  75. package/dist/rules/typescript.js.map +1 -0
  76. package/dist/rules/validation.d.ts +3 -0
  77. package/dist/rules/validation.d.ts.map +1 -0
  78. package/dist/rules/validation.js +38 -0
  79. package/dist/rules/validation.js.map +1 -0
  80. package/dist/templates/claude-md.d.ts +4 -0
  81. package/dist/templates/claude-md.d.ts.map +1 -0
  82. package/dist/templates/claude-md.js +309 -0
  83. package/dist/templates/claude-md.js.map +1 -0
  84. package/dist/tools/analyze-repo.d.ts +3 -0
  85. package/dist/tools/analyze-repo.d.ts.map +1 -0
  86. package/dist/tools/analyze-repo.js +68 -0
  87. package/dist/tools/analyze-repo.js.map +1 -0
  88. package/dist/tools/detect-gaps.d.ts +3 -0
  89. package/dist/tools/detect-gaps.d.ts.map +1 -0
  90. package/dist/tools/detect-gaps.js +34 -0
  91. package/dist/tools/detect-gaps.js.map +1 -0
  92. package/dist/tools/generate-claude-md.d.ts +3 -0
  93. package/dist/tools/generate-claude-md.d.ts.map +1 -0
  94. package/dist/tools/generate-claude-md.js +70 -0
  95. package/dist/tools/generate-claude-md.js.map +1 -0
  96. package/dist/tools/suggest.d.ts +3 -0
  97. package/dist/tools/suggest.d.ts.map +1 -0
  98. package/dist/tools/suggest.js +340 -0
  99. package/dist/tools/suggest.js.map +1 -0
  100. package/dist/tools/update-claude-md.d.ts +3 -0
  101. package/dist/tools/update-claude-md.d.ts.map +1 -0
  102. package/dist/tools/update-claude-md.js +108 -0
  103. package/dist/tools/update-claude-md.js.map +1 -0
  104. package/dist/tools/validate-claude-md.d.ts +3 -0
  105. package/dist/tools/validate-claude-md.d.ts.map +1 -0
  106. package/dist/tools/validate-claude-md.js +137 -0
  107. package/dist/tools/validate-claude-md.js.map +1 -0
  108. package/dist/types.d.ts +116 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +2 -0
  111. package/dist/types.js.map +1 -0
  112. package/package.json +55 -0
@@ -0,0 +1,309 @@
1
+ function describeArchitecture(analysis) {
2
+ const lines = [];
3
+ const f = analysis.framework;
4
+ const d = analysis.detected;
5
+ if (f?.name === "next") {
6
+ const variant = f.variant === "app-router" ? "App Router" : f.variant === "pages-router" ? "Pages Router" : "";
7
+ lines.push(`- **Frontend + Backend**: Next.js ${f.version} (${variant}) — full-stack React framework`);
8
+ }
9
+ else if (f?.name === "vite-react") {
10
+ lines.push(`- **Frontend**: React SPA with Vite ${f.version}`);
11
+ }
12
+ else if (f) {
13
+ lines.push(`- **Framework**: ${f.name} ${f.version}`);
14
+ }
15
+ if (d.orm)
16
+ lines.push(`- **Data Layer**: ${d.orm}${d.database ? ` → ${d.database}` : ""}`);
17
+ else if (d.database)
18
+ lines.push(`- **Database**: ${d.database}`);
19
+ if (d.auth)
20
+ lines.push(`- **Authentication**: ${d.auth}`);
21
+ if (d.apiStyle)
22
+ lines.push(`- **API**: ${d.apiStyle}`);
23
+ if (d.stateManagement)
24
+ lines.push(`- **Client State**: ${d.stateManagement}`);
25
+ if (d.i18n)
26
+ lines.push(`- **i18n**: ${d.i18n}`);
27
+ if (d.payments)
28
+ lines.push(`- **Payments**: ${d.payments}`);
29
+ if (d.realtime)
30
+ lines.push(`- **Realtime**: ${d.realtime}`);
31
+ if (d.email)
32
+ lines.push(`- **Email**: ${d.email}`);
33
+ if (d.cms)
34
+ lines.push(`- **Content**: ${d.cms}`);
35
+ if (d.jobs)
36
+ lines.push(`- **Background Jobs**: ${d.jobs}`);
37
+ if (d.fileUpload)
38
+ lines.push(`- **File Upload**: ${d.fileUpload}`);
39
+ const scale = analysis.structure.approximateFileCount;
40
+ if (scale > 0) {
41
+ const size = scale < 30 ? "Small" : scale < 100 ? "Medium" : scale < 300 ? "Large" : "Very large";
42
+ lines.push(`- **Project Size**: ${size} (~${scale} source files)`);
43
+ }
44
+ return lines;
45
+ }
46
+ function buildDynamicInstructions(analysis) {
47
+ const lines = [];
48
+ const f = analysis.framework;
49
+ const d = analysis.detected;
50
+ lines.push("- Follow ALL rules in this document without exception.");
51
+ lines.push("- When creating new files, respect the existing project structure and naming conventions.");
52
+ lines.push("- When unsure about a pattern, check existing code for precedent before inventing new patterns.");
53
+ lines.push("- Never introduce new dependencies without being explicitly asked.");
54
+ lines.push("- Prefer small, focused changes over large refactors.");
55
+ if (f?.name === "next" && f.variant === "app-router") {
56
+ lines.push("- Default to Server Components. Only add 'use client' when the component needs interactivity.");
57
+ lines.push("- Place new pages in app/ following the existing route structure.");
58
+ lines.push("- Use Server Actions for mutations, Route Handlers for API endpoints.");
59
+ }
60
+ if (d.orm === "prisma") {
61
+ lines.push("- After changing schema.prisma, always run `npx prisma migrate dev` and `npx prisma generate`.");
62
+ }
63
+ else if (d.orm === "drizzle") {
64
+ lines.push("- After changing Drizzle schemas, run `npx drizzle-kit generate` to create migrations.");
65
+ }
66
+ if (d.validation === "zod") {
67
+ lines.push("- Validate all inputs at API boundaries with Zod. Parse, don't validate.");
68
+ }
69
+ if (d.css === "tailwind") {
70
+ lines.push("- Use Tailwind utility classes for styling. Use cn() for conditional classes.");
71
+ }
72
+ if (d.uiComponents === "shadcn") {
73
+ lines.push("- Use shadcn/ui components from components/ui/ as building blocks.");
74
+ }
75
+ if (d.testing) {
76
+ lines.push(`- Run tests with the project's ${d.testing} setup before marking work as done.`);
77
+ }
78
+ if (d.linter) {
79
+ lines.push(`- Run ${d.linter} before committing. Fix all warnings.`);
80
+ }
81
+ if (d.i18n) {
82
+ lines.push("- All user-facing strings must go through the i18n system. Never hardcode text.");
83
+ }
84
+ return lines;
85
+ }
86
+ export function generateClaudeMd(analysis, conventions, interdictions, crossRefs, choices, patterns) {
87
+ const lines = [];
88
+ // Header
89
+ lines.push(`# ${analysis.projectName} — Project Rules`);
90
+ lines.push("");
91
+ lines.push("> Auto-generated by [LeadCode](https://github.com/Julxoo/LeadCode). This file is the source of truth for Claude Code.");
92
+ lines.push("> Modify as needed, then commit to version control.");
93
+ lines.push("");
94
+ // Architecture overview
95
+ const archLines = describeArchitecture(analysis);
96
+ if (archLines.length > 0) {
97
+ lines.push("## Architecture Overview");
98
+ lines.push("");
99
+ lines.push(...archLines);
100
+ lines.push("");
101
+ }
102
+ // Stack details
103
+ lines.push("## Stack");
104
+ lines.push("");
105
+ if (analysis.framework) {
106
+ const variant = analysis.framework.variant
107
+ ? ` (${analysis.framework.variant})`
108
+ : "";
109
+ lines.push(`- **Framework**: ${analysis.framework.name} ${analysis.framework.version}${variant}`);
110
+ }
111
+ const d = analysis.detected;
112
+ if (d.orm)
113
+ lines.push(`- **ORM**: ${d.orm}`);
114
+ if (d.database)
115
+ lines.push(`- **Database**: ${d.database}`);
116
+ if (d.auth)
117
+ lines.push(`- **Auth**: ${d.auth}`);
118
+ if (d.validation)
119
+ lines.push(`- **Validation**: ${d.validation}`);
120
+ if (d.css)
121
+ lines.push(`- **CSS**: ${d.css}`);
122
+ if (d.uiComponents)
123
+ lines.push(`- **UI Components**: ${d.uiComponents}`);
124
+ if (d.testing)
125
+ lines.push(`- **Testing**: ${d.testing}`);
126
+ if (d.stateManagement)
127
+ lines.push(`- **State Management**: ${d.stateManagement}`);
128
+ if (d.apiStyle)
129
+ lines.push(`- **API Style**: ${d.apiStyle}`);
130
+ if (d.i18n)
131
+ lines.push(`- **i18n**: ${d.i18n}`);
132
+ if (d.payments)
133
+ lines.push(`- **Payments**: ${d.payments}`);
134
+ if (d.email)
135
+ lines.push(`- **Email**: ${d.email}`);
136
+ if (d.realtime)
137
+ lines.push(`- **Realtime**: ${d.realtime}`);
138
+ if (d.cms)
139
+ lines.push(`- **CMS/Content**: ${d.cms}`);
140
+ if (d.fileUpload)
141
+ lines.push(`- **File Upload**: ${d.fileUpload}`);
142
+ if (d.jobs)
143
+ lines.push(`- **Jobs/Queue**: ${d.jobs}`);
144
+ if (d.monorepo)
145
+ lines.push(`- **Monorepo**: ${d.monorepo}`);
146
+ if (d.deployment)
147
+ lines.push(`- **Deployment**: ${d.deployment}`);
148
+ if (d.linter)
149
+ lines.push(`- **Linter**: ${d.linter}`);
150
+ if (d.formatter)
151
+ lines.push(`- **Formatter**: ${d.formatter}`);
152
+ if (d.runtime && d.runtime !== "node")
153
+ lines.push(`- **Runtime**: ${d.runtime}`);
154
+ lines.push("");
155
+ // Project structure
156
+ lines.push("## Project Structure");
157
+ lines.push("");
158
+ const s = analysis.structure;
159
+ if (s.hasSrcDir)
160
+ lines.push("- Source code in `src/`");
161
+ if (s.hasAppDir)
162
+ lines.push("- App Router: `app/`");
163
+ if (s.hasPagesDir)
164
+ lines.push("- Pages Router: `pages/`");
165
+ if (s.hasApiRoutes)
166
+ lines.push("- API routes present");
167
+ if (s.hasMiddleware)
168
+ lines.push("- Middleware configured");
169
+ if (s.hasComponentsDir)
170
+ lines.push("- Components: `components/`");
171
+ if (s.hasLibDir)
172
+ lines.push("- Shared utilities: `lib/`");
173
+ if (s.hasServicesDir)
174
+ lines.push("- Services: `services/`");
175
+ if (s.hasHooksDir)
176
+ lines.push("- Custom hooks: `hooks/`");
177
+ if (s.hasStoreDir)
178
+ lines.push("- State stores: `store/`");
179
+ if (s.hasSchemasDir)
180
+ lines.push("- Validation schemas: `schemas/`");
181
+ if (s.hasTypesDir)
182
+ lines.push("- Type definitions: `types/`");
183
+ if (s.hasConfigDir)
184
+ lines.push("- Configuration: `config/`");
185
+ if (s.hasProvidersDir)
186
+ lines.push("- React providers: `providers/`");
187
+ if (s.hasPrismaSchema)
188
+ lines.push("- Prisma schema: `prisma/schema.prisma`");
189
+ lines.push("");
190
+ // Scripts
191
+ const scripts = Object.entries(analysis.scripts);
192
+ if (scripts.length > 0) {
193
+ lines.push("## Available Scripts");
194
+ lines.push("");
195
+ for (const [name, cmd] of scripts) {
196
+ lines.push(`- \`npm run ${name}\` → \`${cmd}\``);
197
+ }
198
+ lines.push("");
199
+ }
200
+ // File naming conventions
201
+ lines.push("## File & Naming Conventions");
202
+ lines.push("");
203
+ lines.push("- **Files**: kebab-case (e.g., `user-profile.ts`, `auth-utils.ts`)");
204
+ lines.push("- **React components**: PascalCase filename matching component name (e.g., `UserProfile.tsx` exports `UserProfile`)");
205
+ lines.push("- **Hooks**: camelCase prefixed with `use` (e.g., `useAuth.ts`)");
206
+ lines.push("- **Constants/config**: SCREAMING_SNAKE_CASE for values, kebab-case for files");
207
+ if (s.hasSrcDir) {
208
+ lines.push("- **New files**: Place in `src/` following the existing directory structure");
209
+ }
210
+ lines.push("");
211
+ // Import ordering
212
+ lines.push("## Import Ordering");
213
+ lines.push("");
214
+ lines.push("```");
215
+ lines.push("1. Node.js builtins (node:fs, node:path)");
216
+ lines.push("2. External packages (react, next, etc.)");
217
+ lines.push("3. Internal aliases (@/ or ~/)");
218
+ lines.push("4. Relative imports (../ and ./)");
219
+ lines.push("5. Type imports (import type { ... })");
220
+ lines.push("```");
221
+ lines.push("");
222
+ // Conventions
223
+ if (conventions.length > 0) {
224
+ lines.push("## Conventions (MUST follow)");
225
+ lines.push("");
226
+ for (const conv of conventions) {
227
+ lines.push(`### ${conv.description}`);
228
+ lines.push(`<!-- id:${conv.id} -->`);
229
+ lines.push(conv.rule);
230
+ lines.push("");
231
+ }
232
+ }
233
+ // Cross-stack rules
234
+ if (crossRefs.length > 0) {
235
+ lines.push("## Cross-Stack Rules (CRITICAL)");
236
+ lines.push("");
237
+ for (const cr of crossRefs) {
238
+ lines.push(`### ${cr.techs.join(" + ")}`);
239
+ lines.push("");
240
+ for (const conv of cr.conventions) {
241
+ lines.push(`- **${conv.description}**: ${conv.rule}`);
242
+ }
243
+ if (cr.interdictions.length > 0) {
244
+ lines.push("");
245
+ for (const inter of cr.interdictions) {
246
+ lines.push(`- ${inter}`);
247
+ }
248
+ }
249
+ lines.push("");
250
+ }
251
+ }
252
+ // Interdictions
253
+ if (interdictions.length > 0) {
254
+ lines.push("## Interdictions (NEVER do)");
255
+ lines.push("");
256
+ for (const inter of interdictions) {
257
+ lines.push(`- ${inter}`);
258
+ }
259
+ lines.push("");
260
+ }
261
+ // User choices
262
+ const choiceEntries = Object.entries(choices);
263
+ if (choiceEntries.length > 0) {
264
+ lines.push("## Project Decisions");
265
+ lines.push("");
266
+ for (const [topic, choice] of choiceEntries) {
267
+ lines.push(`- **${topic}**: ${choice}`);
268
+ }
269
+ lines.push("");
270
+ }
271
+ // Existing code patterns
272
+ if (patterns) {
273
+ const patternLines = [];
274
+ if (patterns.totalComponents > 0) {
275
+ patternLines.push(`- **Client/Server ratio**: ${patterns.useClientCount} client components out of ${patterns.totalComponents} total (${Math.round(patterns.clientRatio * 100)}% client)`);
276
+ }
277
+ if (patterns.useServerCount > 0) {
278
+ patternLines.push(`- **Server Actions**: ${patterns.useServerCount} files with 'use server'`);
279
+ }
280
+ if (patterns.usesPathAlias) {
281
+ patternLines.push("- **Path aliases**: Project uses @/ or ~/ imports — keep using them");
282
+ }
283
+ if (patterns.hasBarrelFiles) {
284
+ patternLines.push("- **Barrel files**: Project uses index.ts re-exports — follow this pattern");
285
+ }
286
+ if (patterns.largeFiles.length > 0) {
287
+ patternLines.push(`- **Large files** (>300 lines): ${patterns.largeFiles.length} file(s) — consider splitting`);
288
+ }
289
+ if (patterns.consoleLogCount > 0) {
290
+ patternLines.push(`- **Console.log**: ${patterns.consoleLogCount} occurrences found — clean up before production`);
291
+ }
292
+ if (patternLines.length > 0) {
293
+ lines.push("## Existing Code Patterns");
294
+ lines.push("");
295
+ lines.push(...patternLines);
296
+ lines.push("");
297
+ }
298
+ }
299
+ // Dynamic Claude Code instructions
300
+ lines.push("## Claude Code Instructions");
301
+ lines.push("");
302
+ const instructions = buildDynamicInstructions(analysis);
303
+ for (const instr of instructions) {
304
+ lines.push(instr);
305
+ }
306
+ lines.push("");
307
+ return lines.join("\n");
308
+ }
309
+ //# sourceMappingURL=claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAnalyzeRepo(server: McpServer): void;
3
+ //# sourceMappingURL=analyze-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-repo.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-repo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsE3D"}
@@ -0,0 +1,68 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import * as z from "zod";
4
+ import { analyzeDependencies } from "../analyzers/dependencies.js";
5
+ import { analyzeStructure } from "../analyzers/structure.js";
6
+ import { detectFramework, detectStack } from "../analyzers/detection.js";
7
+ export function registerAnalyzeRepo(server) {
8
+ server.registerTool("analyze-repo", {
9
+ title: "Analyze Repository",
10
+ description: "Scans a project directory and returns structured technical facts: framework, dependencies, directory structure, detected stack (ORM, auth, validation, CSS, testing, etc.). No opinions, only facts.",
11
+ inputSchema: {
12
+ projectPath: z
13
+ .string()
14
+ .describe("Absolute path to the project root directory"),
15
+ },
16
+ }, async ({ projectPath }) => {
17
+ try {
18
+ // Verify path exists
19
+ try {
20
+ await stat(projectPath);
21
+ }
22
+ catch {
23
+ return {
24
+ isError: true,
25
+ content: [{ type: "text", text: `Directory not found: ${projectPath}` }],
26
+ };
27
+ }
28
+ // Verify package.json exists
29
+ try {
30
+ await stat(join(projectPath, "package.json"));
31
+ }
32
+ catch {
33
+ return {
34
+ isError: true,
35
+ content: [{ type: "text", text: `No package.json found in ${projectPath}. LeadCode requires a Node.js project.` }],
36
+ };
37
+ }
38
+ const pkg = await analyzeDependencies(projectPath);
39
+ const structure = await analyzeStructure(projectPath);
40
+ const framework = detectFramework(pkg.dependencies, pkg.devDependencies, structure);
41
+ const detected = detectStack(pkg.dependencies, pkg.devDependencies);
42
+ detected.runtime = structure.detectedRuntime;
43
+ const analysis = {
44
+ projectPath,
45
+ projectName: pkg.name,
46
+ framework,
47
+ dependencies: pkg.dependencies,
48
+ devDependencies: pkg.devDependencies,
49
+ scripts: pkg.scripts,
50
+ structure,
51
+ detected,
52
+ };
53
+ return {
54
+ content: [
55
+ { type: "text", text: JSON.stringify(analysis, null, 2) },
56
+ ],
57
+ };
58
+ }
59
+ catch (err) {
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ return {
62
+ isError: true,
63
+ content: [{ type: "text", text: `analyze-repo failed: ${message}` }],
64
+ };
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=analyze-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-repo.js","sourceRoot":"","sources":["../../src/tools/analyze-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,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;AAGzE,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,sMAAsM;QACxM,WAAW,EAAE;YACX,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,6CAA6C,CAAC;SAC3D;KACF,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,qBAAqB;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wBAAwB,WAAW,EAAE,EAAE,CAAC;iBAClF,CAAC;YACJ,CAAC;YAED,6BAA6B;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,WAAW,wCAAwC,EAAE,CAAC;iBAC5H,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,eAAe,CAC/B,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,eAAe,EACnB,SAAS,CACV,CAAC;YACF,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YACpE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC;YAE7C,MAAM,QAAQ,GAAiB;gBAC7B,WAAW;gBACX,WAAW,EAAE,GAAG,CAAC,IAAI;gBACrB,SAAS;gBACT,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS;gBACT,QAAQ;aACT,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACnE;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,wBAAwB,OAAO,EAAE,EAAE,CAAC;aAC9E,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDetectGaps(server: McpServer): void;
3
+ //# sourceMappingURL=detect-gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-gaps.d.ts","sourceRoot":"","sources":["../../src/tools/detect-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmC1D"}
@@ -0,0 +1,34 @@
1
+ import * as z from "zod";
2
+ import { detectGaps } from "../rules/index.js";
3
+ export function registerDetectGaps(server) {
4
+ server.registerTool("detect-gaps", {
5
+ title: "Detect Gaps",
6
+ description: "Analyzes a repo analysis result and identifies structural gaps: missing error handling, no validation, no test framework, missing patterns, etc. Returns gaps with severity levels.",
7
+ inputSchema: {
8
+ analysis: z
9
+ .string()
10
+ .describe("JSON string of the RepoAnalysis object (output of analyze-repo)"),
11
+ },
12
+ }, async ({ analysis: analysisStr }) => {
13
+ try {
14
+ const analysis = JSON.parse(analysisStr);
15
+ const gaps = detectGaps(analysis);
16
+ return {
17
+ content: [
18
+ {
19
+ type: "text",
20
+ text: JSON.stringify({ gaps, total: gaps.length }, null, 2),
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ catch (err) {
26
+ const message = err instanceof Error ? err.message : String(err);
27
+ return {
28
+ isError: true,
29
+ content: [{ type: "text", text: `detect-gaps failed: ${message}` }],
30
+ };
31
+ }
32
+ });
33
+ }
34
+ //# sourceMappingURL=detect-gaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-gaps.js","sourceRoot":"","sources":["../../src/tools/detect-gaps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,qLAAqL;QACvL,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,iEAAiE,CAAC;SAC/E;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YAElC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC5D;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,uBAAuB,OAAO,EAAE,EAAE,CAAC;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGenerateClaudeMd(server: McpServer): void;
3
+ //# sourceMappingURL=generate-claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-claude-md.d.ts","sourceRoot":"","sources":["../../src/tools/generate-claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmFhE"}
@@ -0,0 +1,70 @@
1
+ import { writeFile, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import * as z from "zod";
4
+ import { getConventions, getInterdictions, getActiveCrossRefs, } from "../rules/index.js";
5
+ import { generateClaudeMd } from "../templates/claude-md.js";
6
+ import { analyzePatterns } from "../analyzers/patterns.js";
7
+ export function registerGenerateClaudeMd(server) {
8
+ server.registerTool("generate-claude-md", {
9
+ title: "Generate CLAUDE.md",
10
+ description: "Generates a structured CLAUDE.md file from the repo analysis and user choices. Writes it directly to the project root. This file becomes the source of truth for Claude Code.",
11
+ inputSchema: {
12
+ analysis: z
13
+ .string()
14
+ .describe("JSON string of RepoAnalysis"),
15
+ choices: z
16
+ .string()
17
+ .optional()
18
+ .describe("JSON string of user choices: Record<string, string> mapping topic to chosen option. Optional."),
19
+ },
20
+ }, async ({ analysis: analysisStr, choices: choicesStr }) => {
21
+ try {
22
+ const analysis = JSON.parse(analysisStr);
23
+ const choices = choicesStr
24
+ ? JSON.parse(choicesStr)
25
+ : {};
26
+ // Verify project path still exists
27
+ try {
28
+ await stat(analysis.projectPath);
29
+ }
30
+ catch {
31
+ return {
32
+ isError: true,
33
+ content: [{ type: "text", text: `Project directory not found: ${analysis.projectPath}` }],
34
+ };
35
+ }
36
+ const conventions = getConventions(analysis);
37
+ const interdictions = getInterdictions(analysis);
38
+ const crossRefs = getActiveCrossRefs(analysis);
39
+ const patterns = await analyzePatterns(analysis.projectPath);
40
+ const content = generateClaudeMd(analysis, conventions, interdictions, crossRefs, choices, patterns);
41
+ const outputPath = join(analysis.projectPath, "CLAUDE.md");
42
+ await writeFile(outputPath, content, "utf-8");
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: JSON.stringify({
48
+ path: outputPath,
49
+ message: "CLAUDE.md generated successfully",
50
+ sections: {
51
+ conventions: conventions.length,
52
+ interdictions: interdictions.length,
53
+ crossStackRules: crossRefs.length,
54
+ choices: Object.keys(choices).length,
55
+ },
56
+ }, null, 2),
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ catch (err) {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ return {
64
+ isError: true,
65
+ content: [{ type: "text", text: `generate-claude-md failed: ${message}` }],
66
+ };
67
+ }
68
+ });
69
+ }
70
+ //# sourceMappingURL=generate-claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-claude-md.js","sourceRoot":"","sources":["../../src/tools/generate-claude-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerSuggest(server: McpServer): void;
3
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/tools/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoWzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuCvD"}