wiggum-cli 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 +341 -0
- package/bin/ralph.js +8 -0
- package/dist/ai/enhancer.d.ts +100 -0
- package/dist/ai/enhancer.d.ts.map +1 -0
- package/dist/ai/enhancer.js +233 -0
- package/dist/ai/enhancer.js.map +1 -0
- package/dist/ai/index.d.ts +8 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +26 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +201 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/providers.d.ts +35 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +104 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +16 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +124 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/monitor.d.ts +17 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +342 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/commands/new.d.ts +19 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +272 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/run.d.ts +16 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +175 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/generator/config.d.ts +59 -0
- package/dist/generator/config.d.ts.map +1 -0
- package/dist/generator/config.js +68 -0
- package/dist/generator/config.js.map +1 -0
- package/dist/generator/index.d.ts +64 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +147 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/templates.d.ts +70 -0
- package/dist/generator/templates.d.ts.map +1 -0
- package/dist/generator/templates.js +296 -0
- package/dist/generator/templates.js.map +1 -0
- package/dist/generator/writer.d.ts +93 -0
- package/dist/generator/writer.d.ts.map +1 -0
- package/dist/generator/writer.js +213 -0
- package/dist/generator/writer.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/detectors/core/framework.d.ts +11 -0
- package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
- package/dist/scanner/detectors/core/framework.js +275 -0
- package/dist/scanner/detectors/core/framework.js.map +1 -0
- package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
- package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
- package/dist/scanner/detectors/core/packageManager.js +74 -0
- package/dist/scanner/detectors/core/packageManager.js.map +1 -0
- package/dist/scanner/detectors/core/styling.d.ts +12 -0
- package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
- package/dist/scanner/detectors/core/styling.js +230 -0
- package/dist/scanner/detectors/core/styling.js.map +1 -0
- package/dist/scanner/detectors/core/testing.d.ts +12 -0
- package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
- package/dist/scanner/detectors/core/testing.js +190 -0
- package/dist/scanner/detectors/core/testing.js.map +1 -0
- package/dist/scanner/detectors/data/api.d.ts +12 -0
- package/dist/scanner/detectors/data/api.d.ts.map +1 -0
- package/dist/scanner/detectors/data/api.js +261 -0
- package/dist/scanner/detectors/data/api.js.map +1 -0
- package/dist/scanner/detectors/data/database.d.ts +12 -0
- package/dist/scanner/detectors/data/database.d.ts.map +1 -0
- package/dist/scanner/detectors/data/database.js +213 -0
- package/dist/scanner/detectors/data/database.js.map +1 -0
- package/dist/scanner/detectors/data/orm.d.ts +12 -0
- package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
- package/dist/scanner/detectors/data/orm.js +160 -0
- package/dist/scanner/detectors/data/orm.js.map +1 -0
- package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
- package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/formHandling.js +211 -0
- package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
- package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
- package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
- package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
- package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
- package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
- package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
- package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
- package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
- package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
- package/dist/scanner/detectors/infra/deployment.js +301 -0
- package/dist/scanner/detectors/infra/deployment.js.map +1 -0
- package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
- package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
- package/dist/scanner/detectors/infra/monorepo.js +219 -0
- package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
- package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
- package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
- package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
- package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
- package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
- package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
- package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
- package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
- package/dist/scanner/detectors/services/analytics.d.ts +12 -0
- package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
- package/dist/scanner/detectors/services/analytics.js +236 -0
- package/dist/scanner/detectors/services/analytics.js.map +1 -0
- package/dist/scanner/detectors/services/auth.d.ts +12 -0
- package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
- package/dist/scanner/detectors/services/auth.js +217 -0
- package/dist/scanner/detectors/services/auth.js.map +1 -0
- package/dist/scanner/detectors/services/email.d.ts +12 -0
- package/dist/scanner/detectors/services/email.d.ts.map +1 -0
- package/dist/scanner/detectors/services/email.js +211 -0
- package/dist/scanner/detectors/services/email.js.map +1 -0
- package/dist/scanner/detectors/services/payments.d.ts +12 -0
- package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
- package/dist/scanner/detectors/services/payments.js +185 -0
- package/dist/scanner/detectors/services/payments.js.map +1 -0
- package/dist/scanner/detectors/utils.d.ts +160 -0
- package/dist/scanner/detectors/utils.d.ts.map +1 -0
- package/dist/scanner/detectors/utils.js +222 -0
- package/dist/scanner/detectors/utils.js.map +1 -0
- package/dist/scanner/index.d.ts +42 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +282 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/registry.d.ts +43 -0
- package/dist/scanner/registry.d.ts.map +1 -0
- package/dist/scanner/registry.js +243 -0
- package/dist/scanner/registry.js.map +1 -0
- package/dist/scanner/types.d.ts +112 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +6 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/templates/config/ralph.config.js.tmpl +38 -0
- package/dist/templates/guides/AGENTS.md.tmpl +100 -0
- package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
- package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
- package/dist/templates/guides/SECURITY.md.tmpl +100 -0
- package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
- package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
- package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
- package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
- package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
- package/dist/templates/root/.gitignore.tmpl +5 -0
- package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
- package/dist/templates/root/README.md.tmpl +61 -0
- package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
- package/dist/templates/scripts/loop.sh.tmpl +59 -0
- package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
- package/dist/templates/specs/README.md.tmpl +57 -0
- package/dist/templates/specs/_example.md.tmpl +71 -0
- package/dist/utils/config.d.ts +95 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +148 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/header.d.ts +5 -0
- package/dist/utils/header.d.ts.map +1 -0
- package/dist/utils/header.js +15 -0
- package/dist/utils/header.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +24 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +44 -0
- package/src/ai/enhancer.ts +350 -0
- package/src/ai/index.ts +38 -0
- package/src/ai/prompts.ts +217 -0
- package/src/ai/providers.ts +136 -0
- package/src/cli.ts +255 -0
- package/src/commands/init.ts +149 -0
- package/src/commands/monitor.ts +412 -0
- package/src/commands/new.ts +312 -0
- package/src/commands/run.ts +214 -0
- package/src/generator/config.ts +116 -0
- package/src/generator/index.ts +227 -0
- package/src/generator/templates.ts +412 -0
- package/src/generator/writer.ts +293 -0
- package/src/index.ts +41 -0
- package/src/scanner/detectors/core/framework.ts +332 -0
- package/src/scanner/detectors/core/packageManager.ts +91 -0
- package/src/scanner/detectors/core/styling.ts +261 -0
- package/src/scanner/detectors/core/testing.ts +221 -0
- package/src/scanner/detectors/data/api.ts +303 -0
- package/src/scanner/detectors/data/database.ts +245 -0
- package/src/scanner/detectors/data/orm.ts +180 -0
- package/src/scanner/detectors/frontend/formHandling.ts +244 -0
- package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
- package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
- package/src/scanner/detectors/infra/deployment.ts +343 -0
- package/src/scanner/detectors/infra/monorepo.ts +251 -0
- package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
- package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
- package/src/scanner/detectors/services/analytics.ts +273 -0
- package/src/scanner/detectors/services/auth.ts +254 -0
- package/src/scanner/detectors/services/email.ts +244 -0
- package/src/scanner/detectors/services/payments.ts +213 -0
- package/src/scanner/detectors/utils.ts +251 -0
- package/src/scanner/index.ts +354 -0
- package/src/scanner/registry.ts +301 -0
- package/src/scanner/types.ts +152 -0
- package/src/templates/config/ralph.config.js.tmpl +38 -0
- package/src/templates/guides/AGENTS.md.tmpl +100 -0
- package/src/templates/guides/FRONTEND.md.tmpl +523 -0
- package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
- package/src/templates/guides/SECURITY.md.tmpl +100 -0
- package/src/templates/prompts/PROMPT.md.tmpl +77 -0
- package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
- package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
- package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
- package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
- package/src/templates/root/.gitignore.tmpl +5 -0
- package/src/templates/root/LEARNINGS.md.tmpl +24 -0
- package/src/templates/root/README.md.tmpl +61 -0
- package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
- package/src/templates/scripts/loop.sh.tmpl +59 -0
- package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
- package/src/templates/specs/README.md.tmpl +57 -0
- package/src/templates/specs/_example.md.tmpl +71 -0
- package/src/utils/config.ts +221 -0
- package/src/utils/header.ts +15 -0
- package/src/utils/logger.ts +28 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Tool Detector
|
|
3
|
+
* Detects: Turborepo, Nx, pnpm workspaces, Lerna
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Read and parse package.json from a directory
|
|
9
|
+
*/
|
|
10
|
+
function readPackageJson(projectRoot) {
|
|
11
|
+
const packageJsonPath = join(projectRoot, 'package.json');
|
|
12
|
+
if (!existsSync(packageJsonPath)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get all dependencies from package.json (deps + devDeps)
|
|
25
|
+
*/
|
|
26
|
+
function getDependencies(pkg) {
|
|
27
|
+
const deps = pkg.dependencies || {};
|
|
28
|
+
const devDeps = pkg.devDependencies || {};
|
|
29
|
+
return { ...deps, ...devDeps };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Detect Turborepo
|
|
33
|
+
*/
|
|
34
|
+
function detectTurborepo(projectRoot, deps) {
|
|
35
|
+
const evidence = [];
|
|
36
|
+
let confidence = 0;
|
|
37
|
+
// Check for turbo.json
|
|
38
|
+
const turboJson = join(projectRoot, 'turbo.json');
|
|
39
|
+
if (existsSync(turboJson)) {
|
|
40
|
+
evidence.push('turbo.json found');
|
|
41
|
+
confidence += 60;
|
|
42
|
+
}
|
|
43
|
+
// Check for turbo in dependencies
|
|
44
|
+
if (deps.turbo) {
|
|
45
|
+
evidence.push(`turbo@${deps.turbo} in devDependencies`);
|
|
46
|
+
confidence += 40;
|
|
47
|
+
}
|
|
48
|
+
if (confidence === 0)
|
|
49
|
+
return null;
|
|
50
|
+
return {
|
|
51
|
+
name: 'Turborepo',
|
|
52
|
+
version: deps.turbo,
|
|
53
|
+
confidence: Math.min(confidence, 100),
|
|
54
|
+
evidence,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Detect Nx
|
|
59
|
+
*/
|
|
60
|
+
function detectNx(projectRoot, deps) {
|
|
61
|
+
const evidence = [];
|
|
62
|
+
let confidence = 0;
|
|
63
|
+
// Check for nx.json
|
|
64
|
+
const nxJson = join(projectRoot, 'nx.json');
|
|
65
|
+
if (existsSync(nxJson)) {
|
|
66
|
+
evidence.push('nx.json found');
|
|
67
|
+
confidence += 60;
|
|
68
|
+
}
|
|
69
|
+
// Check for nx in dependencies
|
|
70
|
+
if (deps.nx) {
|
|
71
|
+
evidence.push(`nx@${deps.nx} in devDependencies`);
|
|
72
|
+
confidence += 40;
|
|
73
|
+
}
|
|
74
|
+
// Check for @nrwl/* packages (older Nx packages)
|
|
75
|
+
if (deps['@nrwl/workspace'] || deps['@nx/workspace']) {
|
|
76
|
+
evidence.push('Nx workspace package found');
|
|
77
|
+
confidence += 20;
|
|
78
|
+
}
|
|
79
|
+
if (confidence === 0)
|
|
80
|
+
return null;
|
|
81
|
+
return {
|
|
82
|
+
name: 'Nx',
|
|
83
|
+
version: deps.nx,
|
|
84
|
+
confidence: Math.min(confidence, 100),
|
|
85
|
+
evidence,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Detect pnpm workspaces
|
|
90
|
+
*/
|
|
91
|
+
function detectPnpmWorkspaces(projectRoot) {
|
|
92
|
+
const evidence = [];
|
|
93
|
+
let confidence = 0;
|
|
94
|
+
// Check for pnpm-workspace.yaml
|
|
95
|
+
const pnpmWorkspace = join(projectRoot, 'pnpm-workspace.yaml');
|
|
96
|
+
if (existsSync(pnpmWorkspace)) {
|
|
97
|
+
evidence.push('pnpm-workspace.yaml found');
|
|
98
|
+
confidence += 80;
|
|
99
|
+
}
|
|
100
|
+
if (confidence === 0)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
name: 'pnpm Workspaces',
|
|
104
|
+
confidence: Math.min(confidence, 100),
|
|
105
|
+
evidence,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Detect npm/yarn workspaces
|
|
110
|
+
*/
|
|
111
|
+
function detectNpmYarnWorkspaces(projectRoot, pkg) {
|
|
112
|
+
const evidence = [];
|
|
113
|
+
let confidence = 0;
|
|
114
|
+
let variant;
|
|
115
|
+
// Check for workspaces field in package.json
|
|
116
|
+
if (pkg.workspaces) {
|
|
117
|
+
evidence.push('workspaces field in package.json');
|
|
118
|
+
confidence += 70;
|
|
119
|
+
// Determine if it's yarn or npm based on lock files
|
|
120
|
+
const yarnLock = join(projectRoot, 'yarn.lock');
|
|
121
|
+
const npmLock = join(projectRoot, 'package-lock.json');
|
|
122
|
+
if (existsSync(yarnLock)) {
|
|
123
|
+
variant = 'yarn';
|
|
124
|
+
evidence.push('yarn.lock found');
|
|
125
|
+
}
|
|
126
|
+
else if (existsSync(npmLock)) {
|
|
127
|
+
variant = 'npm';
|
|
128
|
+
evidence.push('package-lock.json found');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (confidence === 0)
|
|
132
|
+
return null;
|
|
133
|
+
return {
|
|
134
|
+
name: variant === 'yarn' ? 'Yarn Workspaces' : 'npm Workspaces',
|
|
135
|
+
variant,
|
|
136
|
+
confidence: Math.min(confidence, 100),
|
|
137
|
+
evidence,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Detect Lerna
|
|
142
|
+
*/
|
|
143
|
+
function detectLerna(projectRoot, deps) {
|
|
144
|
+
const evidence = [];
|
|
145
|
+
let confidence = 0;
|
|
146
|
+
// Check for lerna.json
|
|
147
|
+
const lernaJson = join(projectRoot, 'lerna.json');
|
|
148
|
+
if (existsSync(lernaJson)) {
|
|
149
|
+
evidence.push('lerna.json found');
|
|
150
|
+
confidence += 70;
|
|
151
|
+
}
|
|
152
|
+
// Check for lerna in dependencies
|
|
153
|
+
if (deps.lerna) {
|
|
154
|
+
evidence.push(`lerna@${deps.lerna} in devDependencies`);
|
|
155
|
+
confidence += 30;
|
|
156
|
+
}
|
|
157
|
+
if (confidence === 0)
|
|
158
|
+
return null;
|
|
159
|
+
return {
|
|
160
|
+
name: 'Lerna',
|
|
161
|
+
version: deps.lerna,
|
|
162
|
+
confidence: Math.min(confidence, 100),
|
|
163
|
+
evidence,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Detect Rush
|
|
168
|
+
*/
|
|
169
|
+
function detectRush(projectRoot) {
|
|
170
|
+
const evidence = [];
|
|
171
|
+
let confidence = 0;
|
|
172
|
+
// Check for rush.json
|
|
173
|
+
const rushJson = join(projectRoot, 'rush.json');
|
|
174
|
+
if (existsSync(rushJson)) {
|
|
175
|
+
evidence.push('rush.json found');
|
|
176
|
+
confidence += 80;
|
|
177
|
+
}
|
|
178
|
+
if (confidence === 0)
|
|
179
|
+
return null;
|
|
180
|
+
return {
|
|
181
|
+
name: 'Rush',
|
|
182
|
+
confidence: Math.min(confidence, 100),
|
|
183
|
+
evidence,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Monorepo tool detector
|
|
188
|
+
* Returns the primary monorepo tool detected
|
|
189
|
+
*/
|
|
190
|
+
export const monorepoDetector = {
|
|
191
|
+
category: 'monorepo',
|
|
192
|
+
name: 'Monorepo Tool Detector',
|
|
193
|
+
async detect(projectRoot) {
|
|
194
|
+
const pkg = readPackageJson(projectRoot);
|
|
195
|
+
const deps = pkg ? getDependencies(pkg) : {};
|
|
196
|
+
// Priority: dedicated monorepo tools first, then workspace configs
|
|
197
|
+
const detectors = [
|
|
198
|
+
() => detectTurborepo(projectRoot, deps),
|
|
199
|
+
() => detectNx(projectRoot, deps),
|
|
200
|
+
() => detectLerna(projectRoot, deps),
|
|
201
|
+
() => detectRush(projectRoot),
|
|
202
|
+
() => detectPnpmWorkspaces(projectRoot),
|
|
203
|
+
() => pkg ? detectNpmYarnWorkspaces(projectRoot, pkg) : null,
|
|
204
|
+
];
|
|
205
|
+
// Find the highest confidence result
|
|
206
|
+
let bestResult = null;
|
|
207
|
+
let bestConfidence = 0;
|
|
208
|
+
for (const detector of detectors) {
|
|
209
|
+
const result = detector();
|
|
210
|
+
if (result && result.confidence > bestConfidence) {
|
|
211
|
+
bestResult = result;
|
|
212
|
+
bestConfidence = result.confidence;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return bestResult && bestResult.confidence >= 40 ? bestResult : null;
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
export default monorepoDetector;
|
|
219
|
+
//# sourceMappingURL=monorepo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/monorepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Project Detector
|
|
3
|
+
* Detects if the project is building an MCP server
|
|
4
|
+
*/
|
|
5
|
+
import type { Detector } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* MCP project detector
|
|
8
|
+
* Detects if the project is an MCP server or uses MCP
|
|
9
|
+
*/
|
|
10
|
+
export declare const mcpProjectDetector: Detector;
|
|
11
|
+
export default mcpProjectDetector;
|
|
12
|
+
//# sourceMappingURL=mcpProject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpProject.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpProject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAwIhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA0BhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Project Detector
|
|
3
|
+
* Detects if the project is building an MCP server
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Read and parse package.json from a directory
|
|
9
|
+
*/
|
|
10
|
+
function readPackageJson(projectRoot) {
|
|
11
|
+
const packageJsonPath = join(projectRoot, 'package.json');
|
|
12
|
+
if (!existsSync(packageJsonPath)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get all dependencies from package.json (deps + devDeps)
|
|
25
|
+
*/
|
|
26
|
+
function getDependencies(pkg) {
|
|
27
|
+
const deps = pkg.dependencies || {};
|
|
28
|
+
const devDeps = pkg.devDependencies || {};
|
|
29
|
+
return { ...deps, ...devDeps };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Detect if project is an MCP server
|
|
33
|
+
*/
|
|
34
|
+
function detectMCPServer(projectRoot, pkg, deps) {
|
|
35
|
+
const evidence = [];
|
|
36
|
+
let confidence = 0;
|
|
37
|
+
// Check for @modelcontextprotocol/sdk
|
|
38
|
+
if (deps['@modelcontextprotocol/sdk']) {
|
|
39
|
+
evidence.push(`@modelcontextprotocol/sdk@${deps['@modelcontextprotocol/sdk']} in dependencies`);
|
|
40
|
+
confidence += 70;
|
|
41
|
+
}
|
|
42
|
+
// Check for mcp-* or *-mcp in package name
|
|
43
|
+
const packageName = pkg.name;
|
|
44
|
+
if (packageName) {
|
|
45
|
+
if (packageName.startsWith('mcp-') || packageName.endsWith('-mcp')) {
|
|
46
|
+
evidence.push(`Package name "${packageName}" follows MCP naming convention`);
|
|
47
|
+
confidence += 20;
|
|
48
|
+
}
|
|
49
|
+
if (packageName.includes('mcp-server') || packageName.includes('server-mcp')) {
|
|
50
|
+
evidence.push(`Package name "${packageName}" indicates MCP server`);
|
|
51
|
+
confidence += 10;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Check for MCP-related keywords in package.json
|
|
55
|
+
const keywords = pkg.keywords;
|
|
56
|
+
if (keywords && Array.isArray(keywords)) {
|
|
57
|
+
const mcpKeywords = keywords.filter(k => k.toLowerCase().includes('mcp') ||
|
|
58
|
+
k.toLowerCase().includes('model-context-protocol') ||
|
|
59
|
+
k.toLowerCase().includes('claude'));
|
|
60
|
+
if (mcpKeywords.length > 0) {
|
|
61
|
+
evidence.push(`MCP-related keywords: ${mcpKeywords.join(', ')}`);
|
|
62
|
+
confidence += 10;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Check for MCP server files
|
|
66
|
+
const serverFiles = [
|
|
67
|
+
'src/index.ts',
|
|
68
|
+
'src/server.ts',
|
|
69
|
+
'src/mcp.ts',
|
|
70
|
+
'index.ts',
|
|
71
|
+
'server.ts',
|
|
72
|
+
];
|
|
73
|
+
for (const file of serverFiles) {
|
|
74
|
+
const filePath = join(projectRoot, file);
|
|
75
|
+
if (existsSync(filePath)) {
|
|
76
|
+
try {
|
|
77
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
78
|
+
if (content.includes('@modelcontextprotocol/sdk') || content.includes('McpServer')) {
|
|
79
|
+
evidence.push(`MCP server code found in ${file}`);
|
|
80
|
+
confidence += 20;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore read errors
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Check for package.json bin field (common for MCP servers)
|
|
90
|
+
if (pkg.bin && deps['@modelcontextprotocol/sdk']) {
|
|
91
|
+
evidence.push('Package has bin field (likely a CLI MCP server)');
|
|
92
|
+
confidence += 10;
|
|
93
|
+
}
|
|
94
|
+
if (confidence === 0)
|
|
95
|
+
return null;
|
|
96
|
+
return {
|
|
97
|
+
name: 'MCP Server Project',
|
|
98
|
+
version: deps['@modelcontextprotocol/sdk'],
|
|
99
|
+
confidence: Math.min(confidence, 100),
|
|
100
|
+
evidence,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Detect if project uses MCP client
|
|
105
|
+
*/
|
|
106
|
+
function detectMCPClient(deps) {
|
|
107
|
+
const evidence = [];
|
|
108
|
+
let confidence = 0;
|
|
109
|
+
// Check for MCP client packages
|
|
110
|
+
if (deps['@anthropic-ai/sdk']) {
|
|
111
|
+
evidence.push(`@anthropic-ai/sdk@${deps['@anthropic-ai/sdk']} in dependencies`);
|
|
112
|
+
confidence += 50;
|
|
113
|
+
}
|
|
114
|
+
if (deps['@modelcontextprotocol/sdk']) {
|
|
115
|
+
// Could be either client or server, lower confidence
|
|
116
|
+
evidence.push('MCP SDK found (could be client usage)');
|
|
117
|
+
confidence += 30;
|
|
118
|
+
}
|
|
119
|
+
if (confidence === 0)
|
|
120
|
+
return null;
|
|
121
|
+
return {
|
|
122
|
+
name: 'MCP Client',
|
|
123
|
+
confidence: Math.min(confidence, 100),
|
|
124
|
+
evidence,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* MCP project detector
|
|
129
|
+
* Detects if the project is an MCP server or uses MCP
|
|
130
|
+
*/
|
|
131
|
+
export const mcpProjectDetector = {
|
|
132
|
+
category: 'mcp',
|
|
133
|
+
name: 'MCP Project Detector',
|
|
134
|
+
async detect(projectRoot) {
|
|
135
|
+
const pkg = readPackageJson(projectRoot);
|
|
136
|
+
if (!pkg) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const deps = getDependencies(pkg);
|
|
140
|
+
// First check if it's an MCP server project
|
|
141
|
+
const serverResult = detectMCPServer(projectRoot, pkg, deps);
|
|
142
|
+
if (serverResult && serverResult.confidence >= 40) {
|
|
143
|
+
return serverResult;
|
|
144
|
+
}
|
|
145
|
+
// Then check if it uses MCP client
|
|
146
|
+
const clientResult = detectMCPClient(deps);
|
|
147
|
+
if (clientResult && clientResult.confidence >= 40) {
|
|
148
|
+
return clientResult;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
export default mcpProjectDetector;
|
|
154
|
+
//# sourceMappingURL=mcpProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpProject.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Servers Detector
|
|
3
|
+
* Detects usable MCP tools from config files and infers from dependencies
|
|
4
|
+
*/
|
|
5
|
+
import type { Detector } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* MCP servers detector
|
|
8
|
+
* Returns detected MCP configurations and recommendations
|
|
9
|
+
*/
|
|
10
|
+
export declare const mcpServersDetector: Detector;
|
|
11
|
+
/**
|
|
12
|
+
* Get recommended MCP servers based on project stack
|
|
13
|
+
* This is a utility function, not a detector
|
|
14
|
+
*/
|
|
15
|
+
export declare function getRecommendedMCPServers(projectRoot: string): string[];
|
|
16
|
+
export default mcpServersDetector;
|
|
17
|
+
//# sourceMappingURL=mcpServers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpServers.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpServers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAuKhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA0ChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtE;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Servers Detector
|
|
3
|
+
* Detects usable MCP tools from config files and infers from dependencies
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Read and parse package.json from a directory
|
|
9
|
+
*/
|
|
10
|
+
function readPackageJson(projectRoot) {
|
|
11
|
+
const packageJsonPath = join(projectRoot, 'package.json');
|
|
12
|
+
if (!existsSync(packageJsonPath)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get all dependencies from package.json (deps + devDeps)
|
|
25
|
+
*/
|
|
26
|
+
function getDependencies(pkg) {
|
|
27
|
+
const deps = pkg.dependencies || {};
|
|
28
|
+
const devDeps = pkg.devDependencies || {};
|
|
29
|
+
return { ...deps, ...devDeps };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read JSON file safely
|
|
33
|
+
*/
|
|
34
|
+
function readJsonFile(filePath) {
|
|
35
|
+
if (!existsSync(filePath)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
40
|
+
return JSON.parse(content);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detect MCP configuration from .claude directory
|
|
48
|
+
*/
|
|
49
|
+
function detectClaudeMCP(projectRoot) {
|
|
50
|
+
const results = [];
|
|
51
|
+
const claudeDir = join(projectRoot, '.claude');
|
|
52
|
+
if (!existsSync(claudeDir)) {
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
// Check for mcp.json in .claude directory
|
|
56
|
+
const mcpConfigPath = join(claudeDir, 'mcp.json');
|
|
57
|
+
const config = readJsonFile(mcpConfigPath);
|
|
58
|
+
if (config?.mcpServers) {
|
|
59
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
60
|
+
results.push({
|
|
61
|
+
name: `MCP: ${name}`,
|
|
62
|
+
confidence: 90,
|
|
63
|
+
evidence: [`Configured in .claude/mcp.json`],
|
|
64
|
+
variant: serverConfig.command || serverConfig.url || 'configured',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect MCP configuration from .cursor directory
|
|
72
|
+
*/
|
|
73
|
+
function detectCursorMCP(projectRoot) {
|
|
74
|
+
const results = [];
|
|
75
|
+
const cursorDir = join(projectRoot, '.cursor');
|
|
76
|
+
if (!existsSync(cursorDir)) {
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
// Check for mcp.json in .cursor directory
|
|
80
|
+
const mcpConfigPath = join(cursorDir, 'mcp.json');
|
|
81
|
+
const config = readJsonFile(mcpConfigPath);
|
|
82
|
+
if (config?.mcpServers) {
|
|
83
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
84
|
+
results.push({
|
|
85
|
+
name: `MCP: ${name}`,
|
|
86
|
+
confidence: 90,
|
|
87
|
+
evidence: [`Configured in .cursor/mcp.json`],
|
|
88
|
+
variant: serverConfig.command || serverConfig.url || 'configured',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return results;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Detect MCP configuration from root mcp.json
|
|
96
|
+
*/
|
|
97
|
+
function detectRootMCP(projectRoot) {
|
|
98
|
+
const results = [];
|
|
99
|
+
const mcpConfigPath = join(projectRoot, 'mcp.json');
|
|
100
|
+
const config = readJsonFile(mcpConfigPath);
|
|
101
|
+
if (config?.mcpServers) {
|
|
102
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
103
|
+
results.push({
|
|
104
|
+
name: `MCP: ${name}`,
|
|
105
|
+
confidence: 90,
|
|
106
|
+
evidence: [`Configured in mcp.json`],
|
|
107
|
+
variant: serverConfig.command || serverConfig.url || 'configured',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Infer recommended MCP servers from dependencies
|
|
115
|
+
*/
|
|
116
|
+
function inferMCPFromDeps(deps) {
|
|
117
|
+
const recommendations = [];
|
|
118
|
+
// Supabase → Supabase MCP
|
|
119
|
+
if (deps['@supabase/supabase-js'] || deps['@supabase/ssr']) {
|
|
120
|
+
recommendations.push('supabase');
|
|
121
|
+
}
|
|
122
|
+
// GitHub (if repo uses git) → GitHub MCP
|
|
123
|
+
// This is almost always useful
|
|
124
|
+
recommendations.push('github');
|
|
125
|
+
// Stripe → Stripe MCP (if available)
|
|
126
|
+
if (deps.stripe) {
|
|
127
|
+
recommendations.push('stripe');
|
|
128
|
+
}
|
|
129
|
+
// PostgreSQL → Postgres MCP
|
|
130
|
+
if (deps.pg || deps.postgres || deps['@prisma/client']) {
|
|
131
|
+
recommendations.push('postgres');
|
|
132
|
+
}
|
|
133
|
+
// Filesystem is almost always useful
|
|
134
|
+
recommendations.push('filesystem');
|
|
135
|
+
// Memory/knowledge base
|
|
136
|
+
recommendations.push('memory');
|
|
137
|
+
return [...new Set(recommendations)]; // Remove duplicates
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* MCP servers detector
|
|
141
|
+
* Returns detected MCP configurations and recommendations
|
|
142
|
+
*/
|
|
143
|
+
export const mcpServersDetector = {
|
|
144
|
+
category: 'mcp',
|
|
145
|
+
name: 'MCP Servers Detector',
|
|
146
|
+
async detect(projectRoot) {
|
|
147
|
+
const results = [];
|
|
148
|
+
// Detect configured MCP servers
|
|
149
|
+
results.push(...detectClaudeMCP(projectRoot));
|
|
150
|
+
results.push(...detectCursorMCP(projectRoot));
|
|
151
|
+
results.push(...detectRootMCP(projectRoot));
|
|
152
|
+
// Deduplicate by name
|
|
153
|
+
const seen = new Set();
|
|
154
|
+
const uniqueResults = results.filter(r => {
|
|
155
|
+
if (seen.has(r.name))
|
|
156
|
+
return false;
|
|
157
|
+
seen.add(r.name);
|
|
158
|
+
return true;
|
|
159
|
+
});
|
|
160
|
+
// If we found configured servers, return them
|
|
161
|
+
if (uniqueResults.length > 0) {
|
|
162
|
+
return uniqueResults;
|
|
163
|
+
}
|
|
164
|
+
// Otherwise, check for MCP config directories existence
|
|
165
|
+
const claudeDir = join(projectRoot, '.claude');
|
|
166
|
+
const cursorDir = join(projectRoot, '.cursor');
|
|
167
|
+
if (existsSync(claudeDir) || existsSync(cursorDir)) {
|
|
168
|
+
return [{
|
|
169
|
+
name: 'MCP Config Directory',
|
|
170
|
+
confidence: 50,
|
|
171
|
+
evidence: [
|
|
172
|
+
existsSync(claudeDir) ? '.claude/ directory found' : '',
|
|
173
|
+
existsSync(cursorDir) ? '.cursor/ directory found' : '',
|
|
174
|
+
].filter(Boolean),
|
|
175
|
+
}];
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Get recommended MCP servers based on project stack
|
|
182
|
+
* This is a utility function, not a detector
|
|
183
|
+
*/
|
|
184
|
+
export function getRecommendedMCPServers(projectRoot) {
|
|
185
|
+
const pkg = readPackageJson(projectRoot);
|
|
186
|
+
if (!pkg) {
|
|
187
|
+
return ['filesystem', 'github', 'memory'];
|
|
188
|
+
}
|
|
189
|
+
const deps = getDependencies(pkg);
|
|
190
|
+
return inferMCPFromDeps(deps);
|
|
191
|
+
}
|
|
192
|
+
export default mcpServersDetector;
|
|
193
|
+
//# sourceMappingURL=mcpServers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpServers.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpServers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Detector
|
|
3
|
+
* Detects: PostHog, Mixpanel, Vercel Analytics, Google Analytics
|
|
4
|
+
*/
|
|
5
|
+
import type { Detector } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Analytics detector
|
|
8
|
+
* Returns all detected analytics solutions (projects often use multiple)
|
|
9
|
+
*/
|
|
10
|
+
export declare const analyticsDetector: Detector;
|
|
11
|
+
export default analyticsDetector;
|
|
12
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/services/analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAoOhE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QA+B/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|