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,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Components Detector
|
|
3
|
+
* Detects: shadcn, Radix, MUI, Chakra, Ant Design, Headless UI
|
|
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
|
+
* Find all matching dependencies by pattern
|
|
33
|
+
*/
|
|
34
|
+
function findMatchingDeps(deps, pattern) {
|
|
35
|
+
return Object.keys(deps).filter(name => name.startsWith(pattern));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Detect shadcn/ui
|
|
39
|
+
*/
|
|
40
|
+
function detectShadcn(projectRoot, deps) {
|
|
41
|
+
const evidence = [];
|
|
42
|
+
let confidence = 0;
|
|
43
|
+
// Check for components.json (shadcn config file)
|
|
44
|
+
const componentsJsonPath = join(projectRoot, 'components.json');
|
|
45
|
+
if (existsSync(componentsJsonPath)) {
|
|
46
|
+
evidence.push('components.json found');
|
|
47
|
+
confidence += 60;
|
|
48
|
+
// Try to read and validate it's a shadcn config
|
|
49
|
+
try {
|
|
50
|
+
const content = readFileSync(componentsJsonPath, 'utf-8');
|
|
51
|
+
const config = JSON.parse(content);
|
|
52
|
+
if (config.style || config.rsc || config.tsx || config.components) {
|
|
53
|
+
evidence.push('Valid shadcn/ui configuration detected');
|
|
54
|
+
confidence += 20;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// File exists but couldn't be parsed
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check for @radix-ui/* packages (shadcn uses Radix primitives)
|
|
62
|
+
const radixPackages = findMatchingDeps(deps, '@radix-ui/');
|
|
63
|
+
if (radixPackages.length >= 3) {
|
|
64
|
+
evidence.push(`Multiple @radix-ui packages found (${radixPackages.length})`);
|
|
65
|
+
confidence += 20;
|
|
66
|
+
}
|
|
67
|
+
// Check for class-variance-authority (commonly used with shadcn)
|
|
68
|
+
if (deps['class-variance-authority']) {
|
|
69
|
+
evidence.push('class-variance-authority detected (common with shadcn)');
|
|
70
|
+
confidence += 10;
|
|
71
|
+
}
|
|
72
|
+
// Check for clsx or tailwind-merge (common utilities with shadcn)
|
|
73
|
+
if (deps.clsx || deps['tailwind-merge']) {
|
|
74
|
+
evidence.push('clsx/tailwind-merge utilities detected');
|
|
75
|
+
confidence += 5;
|
|
76
|
+
}
|
|
77
|
+
if (confidence === 0)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
name: 'shadcn/ui',
|
|
81
|
+
confidence: Math.min(confidence, 100),
|
|
82
|
+
evidence,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Detect Radix UI (standalone, not as part of shadcn)
|
|
87
|
+
*/
|
|
88
|
+
function detectRadix(projectRoot, deps) {
|
|
89
|
+
const evidence = [];
|
|
90
|
+
let confidence = 0;
|
|
91
|
+
// Check for @radix-ui/* packages
|
|
92
|
+
const radixPackages = findMatchingDeps(deps, '@radix-ui/');
|
|
93
|
+
if (radixPackages.length > 0) {
|
|
94
|
+
evidence.push(`@radix-ui packages found: ${radixPackages.slice(0, 5).join(', ')}${radixPackages.length > 5 ? '...' : ''}`);
|
|
95
|
+
confidence += 50 + Math.min(radixPackages.length * 5, 30);
|
|
96
|
+
}
|
|
97
|
+
// Check for @radix-ui/themes (full theme package)
|
|
98
|
+
if (deps['@radix-ui/themes']) {
|
|
99
|
+
evidence.push('@radix-ui/themes found');
|
|
100
|
+
confidence += 20;
|
|
101
|
+
}
|
|
102
|
+
if (confidence === 0)
|
|
103
|
+
return null;
|
|
104
|
+
return {
|
|
105
|
+
name: 'Radix UI',
|
|
106
|
+
confidence: Math.min(confidence, 100),
|
|
107
|
+
evidence,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Detect Material UI (MUI)
|
|
112
|
+
*/
|
|
113
|
+
function detectMUI(deps) {
|
|
114
|
+
const evidence = [];
|
|
115
|
+
let confidence = 0;
|
|
116
|
+
// Check for @mui/material
|
|
117
|
+
if (deps['@mui/material']) {
|
|
118
|
+
evidence.push(`@mui/material@${deps['@mui/material']} in dependencies`);
|
|
119
|
+
confidence += 70;
|
|
120
|
+
}
|
|
121
|
+
// Check for @mui/icons-material
|
|
122
|
+
if (deps['@mui/icons-material']) {
|
|
123
|
+
evidence.push('@mui/icons-material found');
|
|
124
|
+
confidence += 10;
|
|
125
|
+
}
|
|
126
|
+
// Check for @mui/x-* (data grid, date pickers, etc.)
|
|
127
|
+
const muiXPackages = findMatchingDeps(deps, '@mui/x-');
|
|
128
|
+
if (muiXPackages.length > 0) {
|
|
129
|
+
evidence.push(`MUI X packages found: ${muiXPackages.join(', ')}`);
|
|
130
|
+
confidence += 10;
|
|
131
|
+
}
|
|
132
|
+
// Check for @emotion (MUI's default styling)
|
|
133
|
+
if (deps['@emotion/react'] || deps['@emotion/styled']) {
|
|
134
|
+
evidence.push('Emotion styling detected (MUI default)');
|
|
135
|
+
confidence += 10;
|
|
136
|
+
}
|
|
137
|
+
if (confidence === 0)
|
|
138
|
+
return null;
|
|
139
|
+
return {
|
|
140
|
+
name: 'MUI',
|
|
141
|
+
version: deps['@mui/material'],
|
|
142
|
+
confidence: Math.min(confidence, 100),
|
|
143
|
+
evidence,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Detect Chakra UI
|
|
148
|
+
*/
|
|
149
|
+
function detectChakra(deps) {
|
|
150
|
+
const evidence = [];
|
|
151
|
+
let confidence = 0;
|
|
152
|
+
// Check for @chakra-ui/react
|
|
153
|
+
if (deps['@chakra-ui/react']) {
|
|
154
|
+
evidence.push(`@chakra-ui/react@${deps['@chakra-ui/react']} in dependencies`);
|
|
155
|
+
confidence += 80;
|
|
156
|
+
}
|
|
157
|
+
// Check for @chakra-ui/* packages
|
|
158
|
+
const chakraPackages = findMatchingDeps(deps, '@chakra-ui/');
|
|
159
|
+
if (chakraPackages.length > 1) {
|
|
160
|
+
evidence.push(`Multiple Chakra packages found (${chakraPackages.length})`);
|
|
161
|
+
confidence += 10;
|
|
162
|
+
}
|
|
163
|
+
if (confidence === 0)
|
|
164
|
+
return null;
|
|
165
|
+
return {
|
|
166
|
+
name: 'Chakra UI',
|
|
167
|
+
version: deps['@chakra-ui/react'],
|
|
168
|
+
confidence: Math.min(confidence, 100),
|
|
169
|
+
evidence,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Detect Ant Design
|
|
174
|
+
*/
|
|
175
|
+
function detectAntDesign(deps) {
|
|
176
|
+
const evidence = [];
|
|
177
|
+
let confidence = 0;
|
|
178
|
+
if (deps.antd) {
|
|
179
|
+
evidence.push(`antd@${deps.antd} in dependencies`);
|
|
180
|
+
confidence += 80;
|
|
181
|
+
}
|
|
182
|
+
// Check for @ant-design/* packages
|
|
183
|
+
const antPackages = findMatchingDeps(deps, '@ant-design/');
|
|
184
|
+
if (antPackages.length > 0) {
|
|
185
|
+
evidence.push(`Ant Design packages found: ${antPackages.join(', ')}`);
|
|
186
|
+
confidence += 10;
|
|
187
|
+
}
|
|
188
|
+
if (confidence === 0)
|
|
189
|
+
return null;
|
|
190
|
+
return {
|
|
191
|
+
name: 'Ant Design',
|
|
192
|
+
version: deps.antd,
|
|
193
|
+
confidence: Math.min(confidence, 100),
|
|
194
|
+
evidence,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Detect Headless UI
|
|
199
|
+
*/
|
|
200
|
+
function detectHeadlessUI(deps) {
|
|
201
|
+
const evidence = [];
|
|
202
|
+
let confidence = 0;
|
|
203
|
+
// Check for @headlessui/react
|
|
204
|
+
if (deps['@headlessui/react']) {
|
|
205
|
+
evidence.push(`@headlessui/react@${deps['@headlessui/react']} in dependencies`);
|
|
206
|
+
confidence += 80;
|
|
207
|
+
}
|
|
208
|
+
// Check for @headlessui/vue
|
|
209
|
+
if (deps['@headlessui/vue']) {
|
|
210
|
+
evidence.push(`@headlessui/vue@${deps['@headlessui/vue']} in dependencies`);
|
|
211
|
+
confidence += 80;
|
|
212
|
+
}
|
|
213
|
+
if (confidence === 0)
|
|
214
|
+
return null;
|
|
215
|
+
return {
|
|
216
|
+
name: 'Headless UI',
|
|
217
|
+
version: deps['@headlessui/react'] || deps['@headlessui/vue'],
|
|
218
|
+
confidence: Math.min(confidence, 100),
|
|
219
|
+
evidence,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Detect daisyUI
|
|
224
|
+
*/
|
|
225
|
+
function detectDaisyUI(deps) {
|
|
226
|
+
const evidence = [];
|
|
227
|
+
let confidence = 0;
|
|
228
|
+
if (deps.daisyui) {
|
|
229
|
+
evidence.push(`daisyui@${deps.daisyui} in dependencies`);
|
|
230
|
+
confidence += 80;
|
|
231
|
+
}
|
|
232
|
+
if (confidence === 0)
|
|
233
|
+
return null;
|
|
234
|
+
return {
|
|
235
|
+
name: 'daisyUI',
|
|
236
|
+
version: deps.daisyui,
|
|
237
|
+
confidence: Math.min(confidence, 100),
|
|
238
|
+
evidence,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* UI Components detector
|
|
243
|
+
* Returns all detected UI libraries (projects often use multiple)
|
|
244
|
+
*/
|
|
245
|
+
export const uiComponentsDetector = {
|
|
246
|
+
category: 'uiComponents',
|
|
247
|
+
name: 'UI Components Detector',
|
|
248
|
+
async detect(projectRoot) {
|
|
249
|
+
const pkg = readPackageJson(projectRoot);
|
|
250
|
+
if (!pkg) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
const deps = getDependencies(pkg);
|
|
254
|
+
const results = [];
|
|
255
|
+
// Check for shadcn first (it uses Radix under the hood)
|
|
256
|
+
const shadcn = detectShadcn(projectRoot, deps);
|
|
257
|
+
if (shadcn && shadcn.confidence >= 40) {
|
|
258
|
+
results.push(shadcn);
|
|
259
|
+
}
|
|
260
|
+
// Only add Radix as separate if not using shadcn
|
|
261
|
+
if (!shadcn || shadcn.confidence < 40) {
|
|
262
|
+
const radix = detectRadix(projectRoot, deps);
|
|
263
|
+
if (radix && radix.confidence >= 40) {
|
|
264
|
+
results.push(radix);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Check other UI libraries
|
|
268
|
+
const detectors = [
|
|
269
|
+
() => detectMUI(deps),
|
|
270
|
+
() => detectChakra(deps),
|
|
271
|
+
() => detectAntDesign(deps),
|
|
272
|
+
() => detectHeadlessUI(deps),
|
|
273
|
+
() => detectDaisyUI(deps),
|
|
274
|
+
];
|
|
275
|
+
for (const detector of detectors) {
|
|
276
|
+
const result = detector();
|
|
277
|
+
if (result && result.confidence >= 40) {
|
|
278
|
+
results.push(result);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return results.length > 0 ? results : null;
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
export default uiComponentsDetector;
|
|
285
|
+
//# sourceMappingURL=uiComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiComponents.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/frontend/uiComponents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Target Detector
|
|
3
|
+
* Detects: Vercel, Netlify, Railway, Docker
|
|
4
|
+
*/
|
|
5
|
+
import type { Detector } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Deployment target detector
|
|
8
|
+
* Returns all detected deployment targets (projects can deploy to multiple)
|
|
9
|
+
*/
|
|
10
|
+
export declare const deploymentDetector: Detector;
|
|
11
|
+
export default deploymentDetector;
|
|
12
|
+
//# sourceMappingURL=deployment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/deployment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AA6ShE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA4BhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Target Detector
|
|
3
|
+
* Detects: Vercel, Netlify, Railway, Docker
|
|
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
|
+
* Find all matching dependencies by pattern
|
|
33
|
+
*/
|
|
34
|
+
function findMatchingDeps(deps, pattern) {
|
|
35
|
+
return Object.keys(deps).filter(name => name.startsWith(pattern));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Detect Vercel deployment
|
|
39
|
+
*/
|
|
40
|
+
function detectVercel(projectRoot, deps) {
|
|
41
|
+
const evidence = [];
|
|
42
|
+
let confidence = 0;
|
|
43
|
+
// Check for vercel.json
|
|
44
|
+
const vercelJson = join(projectRoot, 'vercel.json');
|
|
45
|
+
if (existsSync(vercelJson)) {
|
|
46
|
+
evidence.push('vercel.json found');
|
|
47
|
+
confidence += 50;
|
|
48
|
+
}
|
|
49
|
+
// Check for .vercel directory
|
|
50
|
+
const vercelDir = join(projectRoot, '.vercel');
|
|
51
|
+
if (existsSync(vercelDir)) {
|
|
52
|
+
evidence.push('.vercel/ directory found');
|
|
53
|
+
confidence += 30;
|
|
54
|
+
}
|
|
55
|
+
// Check for @vercel/* packages
|
|
56
|
+
const vercelPackages = findMatchingDeps(deps, '@vercel/');
|
|
57
|
+
if (vercelPackages.length > 0) {
|
|
58
|
+
evidence.push(`Vercel packages found: ${vercelPackages.join(', ')}`);
|
|
59
|
+
confidence += 30;
|
|
60
|
+
}
|
|
61
|
+
// Check for vercel CLI
|
|
62
|
+
if (deps.vercel) {
|
|
63
|
+
evidence.push('vercel CLI in devDependencies');
|
|
64
|
+
confidence += 20;
|
|
65
|
+
}
|
|
66
|
+
if (confidence === 0)
|
|
67
|
+
return null;
|
|
68
|
+
return {
|
|
69
|
+
name: 'Vercel',
|
|
70
|
+
confidence: Math.min(confidence, 100),
|
|
71
|
+
evidence,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Detect Netlify deployment
|
|
76
|
+
*/
|
|
77
|
+
function detectNetlify(projectRoot, deps) {
|
|
78
|
+
const evidence = [];
|
|
79
|
+
let confidence = 0;
|
|
80
|
+
// Check for netlify.toml
|
|
81
|
+
const netlifyToml = join(projectRoot, 'netlify.toml');
|
|
82
|
+
if (existsSync(netlifyToml)) {
|
|
83
|
+
evidence.push('netlify.toml found');
|
|
84
|
+
confidence += 60;
|
|
85
|
+
}
|
|
86
|
+
// Check for .netlify directory
|
|
87
|
+
const netlifyDir = join(projectRoot, '.netlify');
|
|
88
|
+
if (existsSync(netlifyDir)) {
|
|
89
|
+
evidence.push('.netlify/ directory found');
|
|
90
|
+
confidence += 30;
|
|
91
|
+
}
|
|
92
|
+
// Check for netlify-cli
|
|
93
|
+
if (deps['netlify-cli']) {
|
|
94
|
+
evidence.push('netlify-cli in devDependencies');
|
|
95
|
+
confidence += 20;
|
|
96
|
+
}
|
|
97
|
+
// Check for @netlify/* packages
|
|
98
|
+
const netlifyPackages = findMatchingDeps(deps, '@netlify/');
|
|
99
|
+
if (netlifyPackages.length > 0) {
|
|
100
|
+
evidence.push(`Netlify packages found: ${netlifyPackages.join(', ')}`);
|
|
101
|
+
confidence += 20;
|
|
102
|
+
}
|
|
103
|
+
if (confidence === 0)
|
|
104
|
+
return null;
|
|
105
|
+
return {
|
|
106
|
+
name: 'Netlify',
|
|
107
|
+
confidence: Math.min(confidence, 100),
|
|
108
|
+
evidence,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect Railway deployment
|
|
113
|
+
*/
|
|
114
|
+
function detectRailway(projectRoot) {
|
|
115
|
+
const evidence = [];
|
|
116
|
+
let confidence = 0;
|
|
117
|
+
// Check for railway.json
|
|
118
|
+
const railwayJson = join(projectRoot, 'railway.json');
|
|
119
|
+
if (existsSync(railwayJson)) {
|
|
120
|
+
evidence.push('railway.json found');
|
|
121
|
+
confidence += 70;
|
|
122
|
+
}
|
|
123
|
+
// Check for railway.toml
|
|
124
|
+
const railwayToml = join(projectRoot, 'railway.toml');
|
|
125
|
+
if (existsSync(railwayToml)) {
|
|
126
|
+
evidence.push('railway.toml found');
|
|
127
|
+
confidence += 70;
|
|
128
|
+
}
|
|
129
|
+
if (confidence === 0)
|
|
130
|
+
return null;
|
|
131
|
+
return {
|
|
132
|
+
name: 'Railway',
|
|
133
|
+
confidence: Math.min(confidence, 100),
|
|
134
|
+
evidence,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Detect Docker deployment
|
|
139
|
+
*/
|
|
140
|
+
function detectDocker(projectRoot) {
|
|
141
|
+
const evidence = [];
|
|
142
|
+
let confidence = 0;
|
|
143
|
+
let variant;
|
|
144
|
+
// Check for Dockerfile
|
|
145
|
+
const dockerfile = join(projectRoot, 'Dockerfile');
|
|
146
|
+
if (existsSync(dockerfile)) {
|
|
147
|
+
evidence.push('Dockerfile found');
|
|
148
|
+
confidence += 50;
|
|
149
|
+
}
|
|
150
|
+
// Check for docker-compose files
|
|
151
|
+
const composeFiles = [
|
|
152
|
+
'docker-compose.yml',
|
|
153
|
+
'docker-compose.yaml',
|
|
154
|
+
'compose.yml',
|
|
155
|
+
'compose.yaml',
|
|
156
|
+
];
|
|
157
|
+
for (const file of composeFiles) {
|
|
158
|
+
if (existsSync(join(projectRoot, file))) {
|
|
159
|
+
evidence.push(`${file} found`);
|
|
160
|
+
confidence += 40;
|
|
161
|
+
variant = 'compose';
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Check for .dockerignore
|
|
166
|
+
const dockerignore = join(projectRoot, '.dockerignore');
|
|
167
|
+
if (existsSync(dockerignore)) {
|
|
168
|
+
evidence.push('.dockerignore found');
|
|
169
|
+
confidence += 10;
|
|
170
|
+
}
|
|
171
|
+
if (confidence === 0)
|
|
172
|
+
return null;
|
|
173
|
+
return {
|
|
174
|
+
name: 'Docker',
|
|
175
|
+
variant,
|
|
176
|
+
confidence: Math.min(confidence, 100),
|
|
177
|
+
evidence,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Detect Fly.io deployment
|
|
182
|
+
*/
|
|
183
|
+
function detectFly(projectRoot) {
|
|
184
|
+
const evidence = [];
|
|
185
|
+
let confidence = 0;
|
|
186
|
+
// Check for fly.toml
|
|
187
|
+
const flyToml = join(projectRoot, 'fly.toml');
|
|
188
|
+
if (existsSync(flyToml)) {
|
|
189
|
+
evidence.push('fly.toml found');
|
|
190
|
+
confidence += 80;
|
|
191
|
+
}
|
|
192
|
+
if (confidence === 0)
|
|
193
|
+
return null;
|
|
194
|
+
return {
|
|
195
|
+
name: 'Fly.io',
|
|
196
|
+
confidence: Math.min(confidence, 100),
|
|
197
|
+
evidence,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Detect Render deployment
|
|
202
|
+
*/
|
|
203
|
+
function detectRender(projectRoot) {
|
|
204
|
+
const evidence = [];
|
|
205
|
+
let confidence = 0;
|
|
206
|
+
// Check for render.yaml
|
|
207
|
+
const renderYaml = join(projectRoot, 'render.yaml');
|
|
208
|
+
if (existsSync(renderYaml)) {
|
|
209
|
+
evidence.push('render.yaml found');
|
|
210
|
+
confidence += 80;
|
|
211
|
+
}
|
|
212
|
+
if (confidence === 0)
|
|
213
|
+
return null;
|
|
214
|
+
return {
|
|
215
|
+
name: 'Render',
|
|
216
|
+
confidence: Math.min(confidence, 100),
|
|
217
|
+
evidence,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Detect AWS deployment
|
|
222
|
+
*/
|
|
223
|
+
function detectAWS(projectRoot, deps) {
|
|
224
|
+
const evidence = [];
|
|
225
|
+
let confidence = 0;
|
|
226
|
+
let variant;
|
|
227
|
+
// Check for AWS SAM template
|
|
228
|
+
const samTemplate = join(projectRoot, 'template.yaml');
|
|
229
|
+
if (existsSync(samTemplate)) {
|
|
230
|
+
try {
|
|
231
|
+
const content = readFileSync(samTemplate, 'utf-8');
|
|
232
|
+
if (content.includes('AWS::Serverless') || content.includes('AWSTemplateFormatVersion')) {
|
|
233
|
+
evidence.push('AWS SAM template.yaml found');
|
|
234
|
+
confidence += 70;
|
|
235
|
+
variant = 'sam';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Ignore read errors
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Check for serverless.yml (Serverless Framework)
|
|
243
|
+
const serverlessYml = join(projectRoot, 'serverless.yml');
|
|
244
|
+
const serverlessYaml = join(projectRoot, 'serverless.yaml');
|
|
245
|
+
if (existsSync(serverlessYml) || existsSync(serverlessYaml)) {
|
|
246
|
+
evidence.push('serverless.yml found');
|
|
247
|
+
confidence += 60;
|
|
248
|
+
variant = 'serverless-framework';
|
|
249
|
+
}
|
|
250
|
+
// Check for AWS CDK
|
|
251
|
+
if (deps['aws-cdk-lib'] || deps['@aws-cdk/core']) {
|
|
252
|
+
evidence.push('AWS CDK detected');
|
|
253
|
+
confidence += 60;
|
|
254
|
+
variant = 'cdk';
|
|
255
|
+
}
|
|
256
|
+
// Check for SST
|
|
257
|
+
if (deps.sst) {
|
|
258
|
+
evidence.push(`sst@${deps.sst} in dependencies`);
|
|
259
|
+
confidence += 70;
|
|
260
|
+
variant = 'sst';
|
|
261
|
+
}
|
|
262
|
+
if (confidence === 0)
|
|
263
|
+
return null;
|
|
264
|
+
return {
|
|
265
|
+
name: 'AWS',
|
|
266
|
+
variant,
|
|
267
|
+
confidence: Math.min(confidence, 100),
|
|
268
|
+
evidence,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Deployment target detector
|
|
273
|
+
* Returns all detected deployment targets (projects can deploy to multiple)
|
|
274
|
+
*/
|
|
275
|
+
export const deploymentDetector = {
|
|
276
|
+
category: 'deployment',
|
|
277
|
+
name: 'Deployment Target Detector',
|
|
278
|
+
async detect(projectRoot) {
|
|
279
|
+
const pkg = readPackageJson(projectRoot);
|
|
280
|
+
const deps = pkg ? getDependencies(pkg) : {};
|
|
281
|
+
const results = [];
|
|
282
|
+
const detectors = [
|
|
283
|
+
() => detectVercel(projectRoot, deps),
|
|
284
|
+
() => detectNetlify(projectRoot, deps),
|
|
285
|
+
() => detectRailway(projectRoot),
|
|
286
|
+
() => detectDocker(projectRoot),
|
|
287
|
+
() => detectFly(projectRoot),
|
|
288
|
+
() => detectRender(projectRoot),
|
|
289
|
+
() => detectAWS(projectRoot, deps),
|
|
290
|
+
];
|
|
291
|
+
for (const detector of detectors) {
|
|
292
|
+
const result = detector();
|
|
293
|
+
if (result && result.confidence >= 40) {
|
|
294
|
+
results.push(result);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return results.length > 0 ? results : null;
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
export default deploymentDetector;
|
|
301
|
+
//# sourceMappingURL=deployment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/deployment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Tool Detector
|
|
3
|
+
* Detects: Turborepo, Nx, pnpm workspaces, Lerna
|
|
4
|
+
*/
|
|
5
|
+
import type { Detector } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Monorepo tool detector
|
|
8
|
+
* Returns the primary monorepo tool detected
|
|
9
|
+
*/
|
|
10
|
+
export declare const monorepoDetector: Detector;
|
|
11
|
+
export default monorepoDetector;
|
|
12
|
+
//# sourceMappingURL=monorepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/monorepo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AA6MhE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAgC9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|