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.
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/bin/leadcode.js +2 -0
- package/dist/analyzers/constants.d.ts +3 -0
- package/dist/analyzers/constants.d.ts.map +1 -0
- package/dist/analyzers/constants.js +14 -0
- package/dist/analyzers/constants.js.map +1 -0
- package/dist/analyzers/dependencies.d.ts +8 -0
- package/dist/analyzers/dependencies.d.ts.map +1 -0
- package/dist/analyzers/dependencies.js +13 -0
- package/dist/analyzers/dependencies.js.map +1 -0
- package/dist/analyzers/detection.d.ts +6 -0
- package/dist/analyzers/detection.d.ts.map +1 -0
- package/dist/analyzers/detection.js +334 -0
- package/dist/analyzers/detection.js.map +1 -0
- package/dist/analyzers/patterns.d.ts +12 -0
- package/dist/analyzers/patterns.d.ts.map +1 -0
- package/dist/analyzers/patterns.js +84 -0
- package/dist/analyzers/patterns.js.map +1 -0
- package/dist/analyzers/structure.d.ts +3 -0
- package/dist/analyzers/structure.d.ts.map +1 -0
- package/dist/analyzers/structure.js +217 -0
- package/dist/analyzers/structure.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/auth.d.ts +3 -0
- package/dist/rules/auth.d.ts.map +1 -0
- package/dist/rules/auth.js +48 -0
- package/dist/rules/auth.js.map +1 -0
- package/dist/rules/cross-stack.d.ts +3 -0
- package/dist/rules/cross-stack.d.ts.map +1 -0
- package/dist/rules/cross-stack.js +320 -0
- package/dist/rules/cross-stack.js.map +1 -0
- package/dist/rules/drizzle.d.ts +3 -0
- package/dist/rules/drizzle.d.ts.map +1 -0
- package/dist/rules/drizzle.js +43 -0
- package/dist/rules/drizzle.js.map +1 -0
- package/dist/rules/index.d.ts +7 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +104 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/nextjs.d.ts +4 -0
- package/dist/rules/nextjs.d.ts.map +1 -0
- package/dist/rules/nextjs.js +86 -0
- package/dist/rules/nextjs.js.map +1 -0
- package/dist/rules/node.d.ts +3 -0
- package/dist/rules/node.d.ts.map +1 -0
- package/dist/rules/node.js +61 -0
- package/dist/rules/node.js.map +1 -0
- package/dist/rules/prisma.d.ts +3 -0
- package/dist/rules/prisma.d.ts.map +1 -0
- package/dist/rules/prisma.js +44 -0
- package/dist/rules/prisma.js.map +1 -0
- package/dist/rules/react.d.ts +3 -0
- package/dist/rules/react.d.ts.map +1 -0
- package/dist/rules/react.js +58 -0
- package/dist/rules/react.js.map +1 -0
- package/dist/rules/state.d.ts +3 -0
- package/dist/rules/state.d.ts.map +1 -0
- package/dist/rules/state.js +54 -0
- package/dist/rules/state.js.map +1 -0
- package/dist/rules/tailwind.d.ts +3 -0
- package/dist/rules/tailwind.d.ts.map +1 -0
- package/dist/rules/tailwind.js +41 -0
- package/dist/rules/tailwind.js.map +1 -0
- package/dist/rules/trpc.d.ts +3 -0
- package/dist/rules/trpc.d.ts.map +1 -0
- package/dist/rules/trpc.js +35 -0
- package/dist/rules/trpc.js.map +1 -0
- package/dist/rules/typescript.d.ts +3 -0
- package/dist/rules/typescript.d.ts.map +1 -0
- package/dist/rules/typescript.js +54 -0
- package/dist/rules/typescript.js.map +1 -0
- package/dist/rules/validation.d.ts +3 -0
- package/dist/rules/validation.d.ts.map +1 -0
- package/dist/rules/validation.js +38 -0
- package/dist/rules/validation.js.map +1 -0
- package/dist/templates/claude-md.d.ts +4 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +309 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/tools/analyze-repo.d.ts +3 -0
- package/dist/tools/analyze-repo.d.ts.map +1 -0
- package/dist/tools/analyze-repo.js +68 -0
- package/dist/tools/analyze-repo.js.map +1 -0
- package/dist/tools/detect-gaps.d.ts +3 -0
- package/dist/tools/detect-gaps.d.ts.map +1 -0
- package/dist/tools/detect-gaps.js +34 -0
- package/dist/tools/detect-gaps.js.map +1 -0
- package/dist/tools/generate-claude-md.d.ts +3 -0
- package/dist/tools/generate-claude-md.d.ts.map +1 -0
- package/dist/tools/generate-claude-md.js +70 -0
- package/dist/tools/generate-claude-md.js.map +1 -0
- package/dist/tools/suggest.d.ts +3 -0
- package/dist/tools/suggest.d.ts.map +1 -0
- package/dist/tools/suggest.js +340 -0
- package/dist/tools/suggest.js.map +1 -0
- package/dist/tools/update-claude-md.d.ts +3 -0
- package/dist/tools/update-claude-md.d.ts.map +1 -0
- package/dist/tools/update-claude-md.js +108 -0
- package/dist/tools/update-claude-md.js.map +1 -0
- package/dist/tools/validate-claude-md.d.ts +3 -0
- package/dist/tools/validate-claude-md.d.ts.map +1 -0
- package/dist/tools/validate-claude-md.js +137 -0
- package/dist/tools/validate-claude-md.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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
|
+
[](https://www.npmjs.com/package/leadcode)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](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
|
package/bin/leadcode.js
ADDED
|
@@ -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"}
|