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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jules Toussenel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # LeadCode
2
+
3
+ **Your virtual Lead Tech for Claude Code.** An MCP server that analyzes your codebase, detects structural gaps, and generates a tailored `CLAUDE.md` — so Claude Code understands your project like a senior engineer would.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/leadcode.svg)](https://www.npmjs.com/package/leadcode)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/)
8
+
9
+ ---
10
+
11
+ ## Why LeadCode?
12
+
13
+ Claude Code is powerful, but its output quality depends on context. Without clear project rules, Claude will:
14
+ - Mix up App Router and Pages Router patterns
15
+ - Create files in the wrong locations
16
+ - Ignore your validation library and hand-write `if/else` checks
17
+ - Forget auth checks on new routes
18
+ - Use inline styles when your project uses Tailwind
19
+
20
+ **LeadCode fixes this.** It scans your project, detects what you're using, identifies what's missing, and generates a `CLAUDE.md` file that tells Claude Code exactly how to behave in your codebase.
21
+
22
+ ## How It Works
23
+
24
+ ```
25
+ Your Project ──→ LeadCode ──→ CLAUDE.md ──→ Claude Code knows your rules
26
+ ```
27
+
28
+ 1. **Analyze** — Scans `package.json`, directory structure, and source code patterns
29
+ 2. **Detect** — Identifies your stack across 22 categories (framework, ORM, auth, CSS, testing, i18n, etc.)
30
+ 3. **Find Gaps** — Detects structural issues (missing error boundaries, no test setup, no validation, etc.)
31
+ 4. **Suggest** — Proposes options (simple / clean / scalable) for each gap, with pros, cons, and Claude impact
32
+ 5. **Generate** — Writes a structured `CLAUDE.md` with conventions, interdictions, and cross-stack rules
33
+
34
+ ## Installation
35
+
36
+ ```bash
37
+ npm install -g leadcode
38
+ ```
39
+
40
+ ### Configure with Claude Code
41
+
42
+ Add LeadCode to your MCP config. In `~/.claude/claude_code_config.json`:
43
+
44
+ ```json
45
+ {
46
+ "mcpServers": {
47
+ "leadcode": {
48
+ "command": "leadcode"
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ Or if installed locally in a project:
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "leadcode": {
60
+ "command": "npx",
61
+ "args": ["leadcode"]
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## Usage
68
+
69
+ ### Quick Start (Recommended)
70
+
71
+ Use the built-in prompt in Claude Code:
72
+
73
+ ```
74
+ Use the setup-project prompt with /path/to/your/project
75
+ ```
76
+
77
+ This walks through the full workflow: analyze → detect gaps → suggest fixes → ask your preferences → generate `CLAUDE.md`.
78
+
79
+ ### Manual Tool Usage
80
+
81
+ Each tool can be called individually:
82
+
83
+ #### `analyze-repo`
84
+ Scans a project and returns structured facts — framework, dependencies, directory structure, detected stack.
85
+
86
+ ```
87
+ Call analyze-repo with projectPath: /path/to/project
88
+ ```
89
+
90
+ #### `detect-gaps`
91
+ Takes the analysis output and identifies structural gaps (missing error handling, no tests, no validation schemas, etc.).
92
+
93
+ #### `suggest-conventions`
94
+ Proposes options for each gap. Each suggestion includes:
95
+ - **Simple** — Minimal setup, quick wins
96
+ - **Clean** — Best practices, good DX
97
+ - **Scalable** — Full setup for large projects
98
+
99
+ #### `generate-claude-md`
100
+ Generates and writes `CLAUDE.md` to the project root based on the analysis and your choices.
101
+
102
+ #### `validate-claude-md`
103
+ Checks if an existing `CLAUDE.md` is still in sync with the project. Detects drifts after adding dependencies or changing structure.
104
+
105
+ #### `update-claude-md`
106
+ Re-analyzes and regenerates `CLAUDE.md` while preserving your choices from the "Project Decisions" section.
107
+
108
+ ## What Gets Detected
109
+
110
+ ### Frameworks
111
+ Next.js (App/Pages Router), Nuxt, Remix, Astro, SvelteKit, SolidStart, Vite+React, Express, Fastify, Hono
112
+
113
+ ### Stack (22 categories)
114
+
115
+ | Category | Examples |
116
+ |----------|----------|
117
+ | ORM | Prisma, Drizzle, TypeORM, Mongoose, Kysely |
118
+ | Auth | NextAuth, Clerk, Lucia, Supabase Auth, Auth0, Kinde |
119
+ | Validation | Zod, Yup, Joi, Valibot |
120
+ | CSS | Tailwind, styled-components, Emotion, PandaCSS |
121
+ | UI Components | shadcn (auto-detected), Radix, MUI, Chakra, Headless UI |
122
+ | Testing | Vitest, Jest, Playwright, Cypress |
123
+ | State | Zustand, Redux, Jotai, Valtio, XState |
124
+ | i18n | next-intl, i18next |
125
+ | Payments | Stripe, LemonSqueezy |
126
+ | CMS | Contentlayer, MDX, Sanity, Notion |
127
+ | Email | Resend, Nodemailer, SendGrid |
128
+ | File Upload | UploadThing, Vercel Blob, Multer, S3 |
129
+ | Realtime | Socket.io, Pusher, Ably |
130
+ | Jobs | BullMQ, Inngest, Trigger.dev |
131
+ | Database | PostgreSQL, MySQL, SQLite, MongoDB, Supabase |
132
+ | Monorepo | Turborepo, Nx, Lerna |
133
+ | Deployment | Vercel, Netlify, Docker, Fly.io, Railway |
134
+ | Runtime | Node, Bun, Deno |
135
+
136
+ ### Code Patterns
137
+ - Client/Server component ratio
138
+ - `'use server'` file count
139
+ - Path alias usage (`@/` or `~/`)
140
+ - Barrel file patterns
141
+ - Large files (>300 lines)
142
+ - `console.log` count
143
+
144
+ ## What Gets Generated
145
+
146
+ The `CLAUDE.md` includes up to 11 sections, all tailored to your stack:
147
+
148
+ 1. **Architecture Overview** — Framework, data layer, auth, project size
149
+ 2. **Stack** — All detected technologies
150
+ 3. **Project Structure** — Directories, special files
151
+ 4. **Available Scripts** — `npm run` commands
152
+ 5. **File & Naming Conventions** — kebab-case, PascalCase rules
153
+ 6. **Import Ordering** — Node builtins → external → internal → relative → types
154
+ 7. **Conventions** — Stack-specific rules Claude must follow
155
+ 8. **Cross-Stack Rules** — Rules for technology combinations (e.g., Next.js + Prisma)
156
+ 9. **Interdictions** — Things Claude must never do
157
+ 10. **Existing Code Patterns** — Patterns detected in your code to respect
158
+ 11. **Claude Code Instructions** — Dynamic instructions based on your stack
159
+
160
+ ### Cross-Stack Rules (18 combinations)
161
+
162
+ LeadCode generates specific rules for technology pairs:
163
+
164
+ `next + prisma` · `next + drizzle` · `next + next-auth` · `next + clerk` · `next + supabase-auth` · `next + trpc` · `next + stripe` · `next + next-intl` · `next + react-query` · `next + zod` · `prisma + next-auth` · `prisma + zod` · `trpc + zod` · `express + prisma` · `fastify + prisma` · `tailwind + shadcn` · `tailwind + react`
165
+
166
+ ## Requirements
167
+
168
+ - **Node.js** >= 18
169
+ - The target project must have a `package.json`
170
+ - Currently optimized for JavaScript/TypeScript projects
171
+
172
+ ## Limitations
173
+
174
+ - **JS/TS only** — No support for Python, Go, Rust, etc.
175
+ - **Single package.json** — Monorepo support detects the tool but analyzes only the root
176
+ - **No lint config reading** — Detects ESLint/Biome but doesn't parse their rules
177
+ - **No CI/CD detection** — GitHub Actions, etc. are not analyzed
178
+ - **No test quality analysis** — Detects the runner but doesn't evaluate test coverage
179
+
180
+ ## Contributing
181
+
182
+ Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
183
+
184
+ ## License
185
+
186
+ [MIT](LICENSE) - Copyright (c) 2026 Jules Toussenel
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/index.js";
@@ -0,0 +1,3 @@
1
+ export declare const IGNORE_DIRS: Set<string>;
2
+ export declare const SOURCE_EXTS: Set<string>;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/analyzers/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAWtB,CAAC;AAEH,eAAO,MAAM,WAAW,aAAsC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const IGNORE_DIRS = new Set([
2
+ "node_modules",
3
+ ".git",
4
+ ".next",
5
+ ".vercel",
6
+ "dist",
7
+ "build",
8
+ ".turbo",
9
+ "coverage",
10
+ ".cache",
11
+ ".output",
12
+ ]);
13
+ export const SOURCE_EXTS = new Set(["ts", "tsx", "js", "jsx"]);
14
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/analyzers/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,cAAc;IACd,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface PackageJsonData {
2
+ name: string;
3
+ dependencies: Record<string, string>;
4
+ devDependencies: Record<string, string>;
5
+ scripts: Record<string, string>;
6
+ }
7
+ export declare function analyzeDependencies(projectPath: string): Promise<PackageJsonData>;
8
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/analyzers/dependencies.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAU1B"}
@@ -0,0 +1,13 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export async function analyzeDependencies(projectPath) {
4
+ const raw = await readFile(join(projectPath, "package.json"), "utf-8");
5
+ const pkg = JSON.parse(raw);
6
+ return {
7
+ name: pkg.name ?? "unknown",
8
+ dependencies: pkg.dependencies ?? {},
9
+ devDependencies: pkg.devDependencies ?? {},
10
+ scripts: pkg.scripts ?? {},
11
+ };
12
+ }
13
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/analyzers/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5B,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;QAC3B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;QACpC,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE;QAC1C,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DetectedStack, FrameworkInfo, StructureInfo } from "../types.js";
2
+ type Deps = Record<string, string>;
3
+ export declare function detectFramework(deps: Deps, devDeps: Deps, structure: StructureInfo): FrameworkInfo | null;
4
+ export declare function detectStack(deps: Deps, devDeps: Deps): DetectedStack;
5
+ export {};
6
+ //# sourceMappingURL=detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/analyzers/detection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/E,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAiBnC,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,aAAa,GACvB,aAAa,GAAG,IAAI,CA0DtB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,aAAa,CAuMpE"}
@@ -0,0 +1,334 @@
1
+ function findVersion(name, deps, devDeps) {
2
+ const v = deps[name] ?? devDeps[name];
3
+ if (!v)
4
+ return null;
5
+ const match = v.match(/\d+\.\d+\.\d+/);
6
+ return match ? match[0] : v.replace(/[\^~>=<]/g, "").trim();
7
+ }
8
+ function has(name, deps, devDeps) {
9
+ return name in deps || name in devDeps;
10
+ }
11
+ function hasAny(names, deps, devDeps) {
12
+ return names.some((n) => has(n, deps, devDeps));
13
+ }
14
+ export function detectFramework(deps, devDeps, structure) {
15
+ // Next.js
16
+ if (has("next", deps, devDeps)) {
17
+ const version = findVersion("next", deps, devDeps) ?? "unknown";
18
+ const variant = structure.hasAppDir
19
+ ? "app-router"
20
+ : structure.hasPagesDir
21
+ ? "pages-router"
22
+ : "unknown";
23
+ return { name: "next", version, variant };
24
+ }
25
+ // Nuxt
26
+ if (has("nuxt", deps, devDeps)) {
27
+ return { name: "nuxt", version: findVersion("nuxt", deps, devDeps) ?? "unknown" };
28
+ }
29
+ // Remix
30
+ if (hasAny(["@remix-run/react", "@remix-run/node"], deps, devDeps)) {
31
+ return { name: "remix", version: findVersion("@remix-run/react", deps, devDeps) ?? "unknown" };
32
+ }
33
+ // Astro
34
+ if (has("astro", deps, devDeps)) {
35
+ return { name: "astro", version: findVersion("astro", deps, devDeps) ?? "unknown" };
36
+ }
37
+ // SvelteKit
38
+ if (has("@sveltejs/kit", deps, devDeps)) {
39
+ return { name: "sveltekit", version: findVersion("@sveltejs/kit", deps, devDeps) ?? "unknown" };
40
+ }
41
+ // SolidStart
42
+ if (has("@solidjs/start", deps, devDeps)) {
43
+ return { name: "solid-start", version: findVersion("@solidjs/start", deps, devDeps) ?? "unknown" };
44
+ }
45
+ // Vite + React (SPA)
46
+ if (has("vite", deps, devDeps) && has("react", deps, devDeps)) {
47
+ return { name: "vite-react", version: findVersion("vite", deps, devDeps) ?? "unknown" };
48
+ }
49
+ // Express
50
+ if (has("express", deps, devDeps)) {
51
+ return { name: "express", version: findVersion("express", deps, devDeps) ?? "unknown" };
52
+ }
53
+ // Fastify
54
+ if (has("fastify", deps, devDeps)) {
55
+ return { name: "fastify", version: findVersion("fastify", deps, devDeps) ?? "unknown" };
56
+ }
57
+ // Hono
58
+ if (has("hono", deps, devDeps)) {
59
+ return { name: "hono", version: findVersion("hono", deps, devDeps) ?? "unknown" };
60
+ }
61
+ return null;
62
+ }
63
+ export function detectStack(deps, devDeps) {
64
+ const all = { ...deps, ...devDeps };
65
+ // ORM
66
+ let orm = null;
67
+ if ("prisma" in all || "@prisma/client" in all)
68
+ orm = "prisma";
69
+ else if ("drizzle-orm" in all)
70
+ orm = "drizzle";
71
+ else if ("typeorm" in all)
72
+ orm = "typeorm";
73
+ else if ("kysely" in all)
74
+ orm = "kysely";
75
+ else if ("mongoose" in all)
76
+ orm = "mongoose";
77
+ else if ("sequelize" in all)
78
+ orm = "sequelize";
79
+ else if ("@neondatabase/serverless" in all)
80
+ orm = "neon";
81
+ else if ("libsql" in all || "@libsql/client" in all)
82
+ orm = "libsql";
83
+ else if ("better-sqlite3" in all)
84
+ orm = "better-sqlite3";
85
+ // Auth
86
+ let auth = null;
87
+ if ("next-auth" in all || "@auth/core" in all)
88
+ auth = "next-auth";
89
+ else if ("@clerk/nextjs" in all || "@clerk/clerk-sdk-node" in all)
90
+ auth = "clerk";
91
+ else if ("lucia" in all || "@lucia-auth/adapter-prisma" in all)
92
+ auth = "lucia";
93
+ else if ("@supabase/auth-helpers-nextjs" in all || "@supabase/ssr" in all)
94
+ auth = "supabase-auth";
95
+ else if ("passport" in all)
96
+ auth = "passport";
97
+ else if ("better-auth" in all)
98
+ auth = "better-auth";
99
+ else if ("@kinde-oss/kinde-auth-nextjs" in all)
100
+ auth = "kinde";
101
+ else if ("@auth0/nextjs-auth0" in all || "@auth0/auth0-react" in all)
102
+ auth = "auth0";
103
+ else if ("firebase-admin" in all)
104
+ auth = "firebase";
105
+ // Validation
106
+ let validation = null;
107
+ if ("zod" in all)
108
+ validation = "zod";
109
+ else if ("yup" in all)
110
+ validation = "yup";
111
+ else if ("joi" in all)
112
+ validation = "joi";
113
+ else if ("valibot" in all)
114
+ validation = "valibot";
115
+ else if ("arktype" in all)
116
+ validation = "arktype";
117
+ // CSS
118
+ let css = null;
119
+ if ("tailwindcss" in all)
120
+ css = "tailwind";
121
+ else if ("@chakra-ui/react" in all)
122
+ css = "chakra";
123
+ else if ("@mui/material" in all)
124
+ css = "mui";
125
+ else if ("styled-components" in all)
126
+ css = "styled-components";
127
+ else if ("@emotion/react" in all)
128
+ css = "emotion";
129
+ else if ("@pandacss/dev" in all)
130
+ css = "panda";
131
+ else if ("@vanilla-extract/css" in all)
132
+ css = "vanilla-extract";
133
+ else if ("unocss" in all)
134
+ css = "unocss";
135
+ else if ("sass" in all)
136
+ css = "sass";
137
+ // Testing
138
+ let testing = null;
139
+ if ("vitest" in all)
140
+ testing = "vitest";
141
+ else if ("jest" in all)
142
+ testing = "jest";
143
+ else if ("@playwright/test" in all)
144
+ testing = "playwright";
145
+ else if ("cypress" in all)
146
+ testing = "cypress";
147
+ // Also detect test utilities (secondary)
148
+ // @testing-library/react, msw, supertest are addons, not primary test runners
149
+ // State management
150
+ let stateManagement = null;
151
+ if ("zustand" in all)
152
+ stateManagement = "zustand";
153
+ else if ("@reduxjs/toolkit" in all || "redux" in all)
154
+ stateManagement = "redux";
155
+ else if ("jotai" in all)
156
+ stateManagement = "jotai";
157
+ else if ("@tanstack/react-query" in all)
158
+ stateManagement = "react-query";
159
+ else if ("swr" in all)
160
+ stateManagement = "swr";
161
+ else if ("valtio" in all)
162
+ stateManagement = "valtio";
163
+ else if ("@xstate/react" in all || "xstate" in all)
164
+ stateManagement = "xstate";
165
+ // API style
166
+ let apiStyle = null;
167
+ if ("@trpc/server" in all || "@trpc/client" in all)
168
+ apiStyle = "trpc";
169
+ else if ("graphql" in all || "@apollo/client" in all || "urql" in all)
170
+ apiStyle = "graphql";
171
+ // Bundler
172
+ let bundler = null;
173
+ if ("turbopack" in all || "next" in all)
174
+ bundler = "next-bundler";
175
+ else if ("vite" in all)
176
+ bundler = "vite";
177
+ else if ("webpack" in all)
178
+ bundler = "webpack";
179
+ else if ("esbuild" in all)
180
+ bundler = "esbuild";
181
+ else if ("tsup" in all)
182
+ bundler = "tsup";
183
+ // Linter
184
+ let linter = null;
185
+ if ("eslint" in all)
186
+ linter = "eslint";
187
+ else if ("@biomejs/biome" in all || "biome" in all)
188
+ linter = "biome";
189
+ // Formatter
190
+ let formatter = null;
191
+ if ("prettier" in all)
192
+ formatter = "prettier";
193
+ else if ("@biomejs/biome" in all || "biome" in all)
194
+ formatter = "biome";
195
+ // --- New categories ---
196
+ // i18n
197
+ let i18n = null;
198
+ if ("next-intl" in all)
199
+ i18n = "next-intl";
200
+ else if ("i18next" in all || "react-i18next" in all)
201
+ i18n = "i18next";
202
+ else if ("@lingui/core" in all)
203
+ i18n = "lingui";
204
+ else if ("react-intl" in all)
205
+ i18n = "react-intl";
206
+ // Runtime
207
+ let runtime = "node"; // default
208
+ // Will be overridden by analyze-repo if bun.lockb or deno.json detected
209
+ // Monorepo
210
+ let monorepo = null;
211
+ if ("turbo" in all)
212
+ monorepo = "turborepo";
213
+ else if ("nx" in all)
214
+ monorepo = "nx";
215
+ else if ("lerna" in all)
216
+ monorepo = "lerna";
217
+ // Deployment (detected from deps — file-based detection done in structure analyzer)
218
+ let deployment = null;
219
+ if ("@vercel/analytics" in all || "@vercel/speed-insights" in all)
220
+ deployment = "vercel";
221
+ // Database (inferred from drivers)
222
+ let database = null;
223
+ if ("pg" in all || "@neondatabase/serverless" in all || "postgres" in all)
224
+ database = "postgres";
225
+ else if ("mysql2" in all)
226
+ database = "mysql";
227
+ else if ("better-sqlite3" in all || "libsql" in all || "@libsql/client" in all)
228
+ database = "sqlite";
229
+ else if ("mongodb" in all || "mongoose" in all)
230
+ database = "mongodb";
231
+ else if ("@supabase/supabase-js" in all)
232
+ database = "supabase";
233
+ // Email
234
+ let email = null;
235
+ if ("resend" in all)
236
+ email = "resend";
237
+ else if ("nodemailer" in all)
238
+ email = "nodemailer";
239
+ else if ("@sendgrid/mail" in all)
240
+ email = "sendgrid";
241
+ else if ("postmark" in all)
242
+ email = "postmark";
243
+ else if ("@react-email/components" in all)
244
+ email = "react-email";
245
+ // File upload
246
+ let fileUpload = null;
247
+ if ("uploadthing" in all)
248
+ fileUpload = "uploadthing";
249
+ else if ("@vercel/blob" in all)
250
+ fileUpload = "vercel-blob";
251
+ else if ("multer" in all)
252
+ fileUpload = "multer";
253
+ else if ("@aws-sdk/client-s3" in all)
254
+ fileUpload = "s3";
255
+ // Payments
256
+ let payments = null;
257
+ if ("stripe" in all || "@stripe/stripe-js" in all)
258
+ payments = "stripe";
259
+ else if ("@lemonsqueezy/lemonsqueezy.js" in all)
260
+ payments = "lemonsqueezy";
261
+ // Realtime
262
+ let realtime = null;
263
+ if ("socket.io" in all || "socket.io-client" in all)
264
+ realtime = "socket.io";
265
+ else if ("pusher" in all || "pusher-js" in all)
266
+ realtime = "pusher";
267
+ else if ("ably" in all)
268
+ realtime = "ably";
269
+ else if ("@supabase/realtime-js" in all)
270
+ realtime = "supabase-realtime";
271
+ // CMS
272
+ let cms = null;
273
+ if ("contentlayer" in all || "contentlayer2" in all)
274
+ cms = "contentlayer";
275
+ else if ("next-mdx-remote" in all)
276
+ cms = "mdx-remote";
277
+ else if ("@sanity/client" in all)
278
+ cms = "sanity";
279
+ else if ("@notionhq/client" in all)
280
+ cms = "notion";
281
+ else if ("contentful" in all)
282
+ cms = "contentful";
283
+ else if ("@strapi/strapi" in all)
284
+ cms = "strapi";
285
+ // Jobs / Queues
286
+ let jobs = null;
287
+ if ("bullmq" in all || "bull" in all)
288
+ jobs = "bullmq";
289
+ else if ("inngest" in all)
290
+ jobs = "inngest";
291
+ else if ("@trigger.dev/sdk" in all)
292
+ jobs = "trigger-dev";
293
+ // UI Components
294
+ let uiComponents = null;
295
+ if ("@radix-ui/react-slot" in all || "@radix-ui/react-dialog" in all ||
296
+ "@radix-ui/react-dropdown-menu" in all || "@radix-ui/react-separator" in all) {
297
+ // If radix + tailwind + class-variance-authority → likely shadcn
298
+ if ("tailwindcss" in all && "class-variance-authority" in all) {
299
+ uiComponents = "shadcn";
300
+ }
301
+ else {
302
+ uiComponents = "radix";
303
+ }
304
+ }
305
+ else if ("@headlessui/react" in all)
306
+ uiComponents = "headless-ui";
307
+ else if ("@ark-ui/react" in all)
308
+ uiComponents = "ark-ui";
309
+ return {
310
+ orm,
311
+ auth,
312
+ validation,
313
+ css,
314
+ testing,
315
+ stateManagement,
316
+ apiStyle,
317
+ bundler,
318
+ linter,
319
+ formatter,
320
+ i18n,
321
+ runtime,
322
+ monorepo,
323
+ deployment,
324
+ database,
325
+ email,
326
+ fileUpload,
327
+ payments,
328
+ realtime,
329
+ cms,
330
+ jobs,
331
+ uiComponents,
332
+ };
333
+ }
334
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../src/analyzers/detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface CodePatterns {
2
+ useClientCount: number;
3
+ useServerCount: number;
4
+ totalComponents: number;
5
+ clientRatio: number;
6
+ hasBarrelFiles: boolean;
7
+ usesPathAlias: boolean;
8
+ largeFiles: string[];
9
+ consoleLogCount: number;
10
+ }
11
+ export declare function analyzePatterns(projectPath: string): Promise<CodePatterns>;
12
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/analyzers/patterns.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AA2ED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBhF"}