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,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detector Registry
|
|
3
|
+
* Registers and manages all detectors for the scanner
|
|
4
|
+
*/
|
|
5
|
+
// Import core detectors
|
|
6
|
+
import { frameworkDetector } from './detectors/core/framework.js';
|
|
7
|
+
import { packageManagerDetector } from './detectors/core/packageManager.js';
|
|
8
|
+
import { testingDetector } from './detectors/core/testing.js';
|
|
9
|
+
import { stylingDetector } from './detectors/core/styling.js';
|
|
10
|
+
// Import data layer detectors
|
|
11
|
+
import { databaseDetector } from './detectors/data/database.js';
|
|
12
|
+
import { ormDetector } from './detectors/data/orm.js';
|
|
13
|
+
import { apiDetector } from './detectors/data/api.js';
|
|
14
|
+
// Import frontend detectors
|
|
15
|
+
import { stateManagementDetector } from './detectors/frontend/stateManagement.js';
|
|
16
|
+
import { uiComponentsDetector } from './detectors/frontend/uiComponents.js';
|
|
17
|
+
import { formHandlingDetector } from './detectors/frontend/formHandling.js';
|
|
18
|
+
// Import services detectors
|
|
19
|
+
import { authDetector } from './detectors/services/auth.js';
|
|
20
|
+
import { analyticsDetector } from './detectors/services/analytics.js';
|
|
21
|
+
import { paymentsDetector } from './detectors/services/payments.js';
|
|
22
|
+
import { emailDetector } from './detectors/services/email.js';
|
|
23
|
+
// Import infrastructure detectors
|
|
24
|
+
import { deploymentDetector } from './detectors/infra/deployment.js';
|
|
25
|
+
import { monorepoDetector } from './detectors/infra/monorepo.js';
|
|
26
|
+
// Import MCP detectors
|
|
27
|
+
import { mcpServersDetector, getRecommendedMCPServers } from './detectors/mcp/mcpServers.js';
|
|
28
|
+
import { mcpProjectDetector } from './detectors/mcp/mcpProject.js';
|
|
29
|
+
/**
|
|
30
|
+
* All detector categories
|
|
31
|
+
*/
|
|
32
|
+
const ALL_CATEGORIES = [
|
|
33
|
+
// Core
|
|
34
|
+
'framework',
|
|
35
|
+
'packageManager',
|
|
36
|
+
'testing',
|
|
37
|
+
'styling',
|
|
38
|
+
// Data Layer
|
|
39
|
+
'database',
|
|
40
|
+
'orm',
|
|
41
|
+
'api',
|
|
42
|
+
// Frontend
|
|
43
|
+
'stateManagement',
|
|
44
|
+
'uiComponents',
|
|
45
|
+
'formHandling',
|
|
46
|
+
// Services
|
|
47
|
+
'auth',
|
|
48
|
+
'analytics',
|
|
49
|
+
'payments',
|
|
50
|
+
'email',
|
|
51
|
+
// Infrastructure
|
|
52
|
+
'deployment',
|
|
53
|
+
'monorepo',
|
|
54
|
+
// MCP
|
|
55
|
+
'mcp',
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Detector Registry class
|
|
59
|
+
* Manages registration and execution of detectors
|
|
60
|
+
*/
|
|
61
|
+
export class DetectorRegistry {
|
|
62
|
+
detectors = new Map();
|
|
63
|
+
constructor() {
|
|
64
|
+
// Initialize all categories
|
|
65
|
+
for (const category of ALL_CATEGORIES) {
|
|
66
|
+
this.detectors.set(category, []);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a detector
|
|
71
|
+
*/
|
|
72
|
+
register(detector) {
|
|
73
|
+
const category = this.detectors.get(detector.category);
|
|
74
|
+
if (category) {
|
|
75
|
+
category.push(detector);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get all detectors for a category
|
|
80
|
+
*/
|
|
81
|
+
getDetectors(category) {
|
|
82
|
+
return this.detectors.get(category) || [];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all registered detectors
|
|
86
|
+
*/
|
|
87
|
+
getAllDetectors() {
|
|
88
|
+
const all = [];
|
|
89
|
+
for (const detectors of this.detectors.values()) {
|
|
90
|
+
all.push(...detectors);
|
|
91
|
+
}
|
|
92
|
+
return all;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run a single-result detector category
|
|
96
|
+
*/
|
|
97
|
+
async runSingleDetector(projectRoot, category) {
|
|
98
|
+
for (const detector of this.getDetectors(category)) {
|
|
99
|
+
const result = await detector.detect(projectRoot);
|
|
100
|
+
if (result && !Array.isArray(result)) {
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run a multi-result detector category
|
|
108
|
+
*/
|
|
109
|
+
async runMultiDetector(projectRoot, category) {
|
|
110
|
+
for (const detector of this.getDetectors(category)) {
|
|
111
|
+
const result = await detector.detect(projectRoot);
|
|
112
|
+
if (result) {
|
|
113
|
+
return Array.isArray(result) ? result : [result];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Run all detectors for a project
|
|
120
|
+
*/
|
|
121
|
+
async runAllDetectors(projectRoot) {
|
|
122
|
+
const stack = {};
|
|
123
|
+
// ============ Core ============
|
|
124
|
+
// Run framework detector
|
|
125
|
+
stack.framework = await this.runSingleDetector(projectRoot, 'framework') || undefined;
|
|
126
|
+
// Run package manager detector
|
|
127
|
+
stack.packageManager = await this.runSingleDetector(projectRoot, 'packageManager') || undefined;
|
|
128
|
+
// Run testing detectors
|
|
129
|
+
for (const detector of this.getDetectors('testing')) {
|
|
130
|
+
const result = await detector.detect(projectRoot);
|
|
131
|
+
if (result) {
|
|
132
|
+
stack.testing = {};
|
|
133
|
+
if (Array.isArray(result)) {
|
|
134
|
+
for (const r of result) {
|
|
135
|
+
if (r.variant === 'unit') {
|
|
136
|
+
stack.testing.unit = r;
|
|
137
|
+
}
|
|
138
|
+
else if (r.variant === 'e2e') {
|
|
139
|
+
stack.testing.e2e = r;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Single result, determine type from name
|
|
145
|
+
if (result.name === 'Jest' || result.name === 'Vitest') {
|
|
146
|
+
stack.testing.unit = result;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
stack.testing.e2e = result;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Run styling detector
|
|
156
|
+
stack.styling = await this.runSingleDetector(projectRoot, 'styling') || undefined;
|
|
157
|
+
// ============ Data Layer ============
|
|
158
|
+
// Run database detector
|
|
159
|
+
stack.database = await this.runSingleDetector(projectRoot, 'database') || undefined;
|
|
160
|
+
// Run ORM detector
|
|
161
|
+
stack.orm = await this.runSingleDetector(projectRoot, 'orm') || undefined;
|
|
162
|
+
// Run API detector (multi-result)
|
|
163
|
+
stack.api = await this.runMultiDetector(projectRoot, 'api') || undefined;
|
|
164
|
+
// ============ Frontend ============
|
|
165
|
+
// Run state management detector
|
|
166
|
+
stack.stateManagement = await this.runSingleDetector(projectRoot, 'stateManagement') || undefined;
|
|
167
|
+
// Run UI components detector (multi-result)
|
|
168
|
+
stack.uiComponents = await this.runMultiDetector(projectRoot, 'uiComponents') || undefined;
|
|
169
|
+
// Run form handling detector (multi-result)
|
|
170
|
+
stack.formHandling = await this.runMultiDetector(projectRoot, 'formHandling') || undefined;
|
|
171
|
+
// ============ Services ============
|
|
172
|
+
// Run auth detector
|
|
173
|
+
stack.auth = await this.runSingleDetector(projectRoot, 'auth') || undefined;
|
|
174
|
+
// Run analytics detector (multi-result)
|
|
175
|
+
stack.analytics = await this.runMultiDetector(projectRoot, 'analytics') || undefined;
|
|
176
|
+
// Run payments detector
|
|
177
|
+
stack.payments = await this.runSingleDetector(projectRoot, 'payments') || undefined;
|
|
178
|
+
// Run email detector
|
|
179
|
+
stack.email = await this.runSingleDetector(projectRoot, 'email') || undefined;
|
|
180
|
+
// ============ Infrastructure ============
|
|
181
|
+
// Run deployment detector (multi-result)
|
|
182
|
+
stack.deployment = await this.runMultiDetector(projectRoot, 'deployment') || undefined;
|
|
183
|
+
// Run monorepo detector
|
|
184
|
+
stack.monorepo = await this.runSingleDetector(projectRoot, 'monorepo') || undefined;
|
|
185
|
+
// ============ MCP ============
|
|
186
|
+
// Run MCP detectors
|
|
187
|
+
const mcpStack = {};
|
|
188
|
+
// Detect configured MCP servers
|
|
189
|
+
const mcpServers = await this.runMultiDetector(projectRoot, 'mcp');
|
|
190
|
+
// Separate MCP server configs from MCP project detection
|
|
191
|
+
if (mcpServers) {
|
|
192
|
+
const serverConfigs = mcpServers.filter(r => r.name.startsWith('MCP:') || r.name === 'MCP Config Directory');
|
|
193
|
+
const projectInfo = mcpServers.find(r => r.name === 'MCP Server Project' || r.name === 'MCP Client');
|
|
194
|
+
if (serverConfigs.length > 0) {
|
|
195
|
+
mcpStack.detected = serverConfigs;
|
|
196
|
+
}
|
|
197
|
+
if (projectInfo) {
|
|
198
|
+
mcpStack.isProject = projectInfo.name === 'MCP Server Project';
|
|
199
|
+
mcpStack.projectInfo = projectInfo;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Get recommended MCP servers based on stack
|
|
203
|
+
mcpStack.recommended = getRecommendedMCPServers(projectRoot);
|
|
204
|
+
// Only add MCP stack if there's meaningful data
|
|
205
|
+
if (mcpStack.detected || mcpStack.isProject || (mcpStack.recommended && mcpStack.recommended.length > 0)) {
|
|
206
|
+
stack.mcp = mcpStack;
|
|
207
|
+
}
|
|
208
|
+
return stack;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Create a registry with all core detectors pre-registered
|
|
213
|
+
*/
|
|
214
|
+
export function createDefaultRegistry() {
|
|
215
|
+
const registry = new DetectorRegistry();
|
|
216
|
+
// Register core detectors
|
|
217
|
+
registry.register(frameworkDetector);
|
|
218
|
+
registry.register(packageManagerDetector);
|
|
219
|
+
registry.register(testingDetector);
|
|
220
|
+
registry.register(stylingDetector);
|
|
221
|
+
// Register data layer detectors
|
|
222
|
+
registry.register(databaseDetector);
|
|
223
|
+
registry.register(ormDetector);
|
|
224
|
+
registry.register(apiDetector);
|
|
225
|
+
// Register frontend detectors
|
|
226
|
+
registry.register(stateManagementDetector);
|
|
227
|
+
registry.register(uiComponentsDetector);
|
|
228
|
+
registry.register(formHandlingDetector);
|
|
229
|
+
// Register services detectors
|
|
230
|
+
registry.register(authDetector);
|
|
231
|
+
registry.register(analyticsDetector);
|
|
232
|
+
registry.register(paymentsDetector);
|
|
233
|
+
registry.register(emailDetector);
|
|
234
|
+
// Register infrastructure detectors
|
|
235
|
+
registry.register(deploymentDetector);
|
|
236
|
+
registry.register(monorepoDetector);
|
|
237
|
+
// Register MCP detectors
|
|
238
|
+
registry.register(mcpServersDetector);
|
|
239
|
+
registry.register(mcpProjectDetector);
|
|
240
|
+
return registry;
|
|
241
|
+
}
|
|
242
|
+
export { DetectorRegistry as Registry };
|
|
243
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/scanner/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scanner Types
|
|
3
|
+
* Type definitions for the project scanner system
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Result of detecting a single technology/tool
|
|
7
|
+
*/
|
|
8
|
+
export interface DetectionResult {
|
|
9
|
+
/** Name of the detected technology (e.g., "Next.js", "pnpm") */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Version if detectable from package.json */
|
|
12
|
+
version?: string;
|
|
13
|
+
/** Variant or additional context (e.g., "app-router" for Next.js) */
|
|
14
|
+
variant?: string;
|
|
15
|
+
/** Confidence score from 0-100 */
|
|
16
|
+
confidence: number;
|
|
17
|
+
/** Evidence that led to this detection (files found, deps matched) */
|
|
18
|
+
evidence: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MCP detection result
|
|
22
|
+
*/
|
|
23
|
+
export interface MCPStack {
|
|
24
|
+
/** Detected MCP servers from config */
|
|
25
|
+
detected?: DetectionResult[];
|
|
26
|
+
/** Recommended MCP servers based on stack */
|
|
27
|
+
recommended?: string[];
|
|
28
|
+
/** Is this an MCP server project */
|
|
29
|
+
isProject?: boolean;
|
|
30
|
+
/** MCP project detection result (if it's an MCP server project) */
|
|
31
|
+
projectInfo?: DetectionResult;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Complete detected tech stack for a project
|
|
35
|
+
*/
|
|
36
|
+
export interface DetectedStack {
|
|
37
|
+
/** Web framework (Next.js, React, Vue, etc.) */
|
|
38
|
+
framework?: DetectionResult;
|
|
39
|
+
/** Package manager (pnpm, yarn, npm, bun) */
|
|
40
|
+
packageManager?: DetectionResult;
|
|
41
|
+
/** Testing frameworks */
|
|
42
|
+
testing?: {
|
|
43
|
+
unit?: DetectionResult;
|
|
44
|
+
e2e?: DetectionResult;
|
|
45
|
+
};
|
|
46
|
+
/** Styling approach (Tailwind, CSS Modules, etc.) */
|
|
47
|
+
styling?: DetectionResult;
|
|
48
|
+
/** Database (Supabase, Firebase, MongoDB, PostgreSQL) */
|
|
49
|
+
database?: DetectionResult;
|
|
50
|
+
/** ORM (Prisma, Drizzle) */
|
|
51
|
+
orm?: DetectionResult;
|
|
52
|
+
/** API patterns (tRPC, GraphQL, TanStack Query, REST) - can have multiple */
|
|
53
|
+
api?: DetectionResult[];
|
|
54
|
+
/** State management (Redux, Zustand, Jotai, Pinia, etc.) */
|
|
55
|
+
stateManagement?: DetectionResult;
|
|
56
|
+
/** UI component libraries (shadcn, Radix, MUI, etc.) - can have multiple */
|
|
57
|
+
uiComponents?: DetectionResult[];
|
|
58
|
+
/** Form handling and validation (React Hook Form, Zod, etc.) - can have multiple */
|
|
59
|
+
formHandling?: DetectionResult[];
|
|
60
|
+
/** Auth provider (NextAuth, Clerk, Auth0, Supabase Auth) */
|
|
61
|
+
auth?: DetectionResult;
|
|
62
|
+
/** Analytics (PostHog, Mixpanel, Vercel Analytics, etc.) - can have multiple */
|
|
63
|
+
analytics?: DetectionResult[];
|
|
64
|
+
/** Payment provider (Stripe, Lemon Squeezy, Paddle) */
|
|
65
|
+
payments?: DetectionResult;
|
|
66
|
+
/** Email provider (Resend, SendGrid, Nodemailer) */
|
|
67
|
+
email?: DetectionResult;
|
|
68
|
+
/** Deployment targets (Vercel, Netlify, Railway, Docker) - can have multiple */
|
|
69
|
+
deployment?: DetectionResult[];
|
|
70
|
+
/** Monorepo tools (Turborepo, Nx, pnpm workspaces, Lerna) */
|
|
71
|
+
monorepo?: DetectionResult;
|
|
72
|
+
/** MCP (Model Context Protocol) related detection */
|
|
73
|
+
mcp?: MCPStack;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Category of detector
|
|
77
|
+
*/
|
|
78
|
+
export type DetectorCategory = 'framework' | 'packageManager' | 'testing' | 'styling' | 'database' | 'orm' | 'api' | 'stateManagement' | 'uiComponents' | 'formHandling' | 'auth' | 'analytics' | 'payments' | 'email' | 'deployment' | 'monorepo' | 'mcp';
|
|
79
|
+
/**
|
|
80
|
+
* Interface for a detector function
|
|
81
|
+
*/
|
|
82
|
+
export interface Detector {
|
|
83
|
+
/** Category this detector belongs to */
|
|
84
|
+
category: DetectorCategory;
|
|
85
|
+
/** Human-readable name */
|
|
86
|
+
name: string;
|
|
87
|
+
/** Run detection on a project directory */
|
|
88
|
+
detect: (projectRoot: string) => Promise<DetectionResult | DetectionResult[] | null>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Options for the scanner
|
|
92
|
+
*/
|
|
93
|
+
export interface ScannerOptions {
|
|
94
|
+
/** Whether to include low-confidence results */
|
|
95
|
+
includeLowConfidence?: boolean;
|
|
96
|
+
/** Minimum confidence threshold (0-100) */
|
|
97
|
+
minConfidence?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Result of a full project scan
|
|
101
|
+
*/
|
|
102
|
+
export interface ScanResult {
|
|
103
|
+
/** Path that was scanned */
|
|
104
|
+
projectRoot: string;
|
|
105
|
+
/** Detected tech stack */
|
|
106
|
+
stack: DetectedStack;
|
|
107
|
+
/** Time taken to scan in milliseconds */
|
|
108
|
+
scanTime: number;
|
|
109
|
+
/** Any errors encountered during scanning */
|
|
110
|
+
errors?: string[];
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
name: '{{projectName}}',
|
|
3
|
+
stack: {
|
|
4
|
+
framework: {
|
|
5
|
+
name: '{{framework}}',
|
|
6
|
+
version: '{{frameworkVersion}}',
|
|
7
|
+
variant: '{{frameworkVariant}}',
|
|
8
|
+
},
|
|
9
|
+
packageManager: '{{packageManager}}',
|
|
10
|
+
testing: {
|
|
11
|
+
unit: '{{unitTest}}',
|
|
12
|
+
e2e: '{{e2eTest}}',
|
|
13
|
+
},
|
|
14
|
+
styling: '{{styling}}',
|
|
15
|
+
},
|
|
16
|
+
commands: {
|
|
17
|
+
dev: '{{devCommand}}',
|
|
18
|
+
build: '{{buildCommand}}',
|
|
19
|
+
test: '{{testCommand}}',
|
|
20
|
+
lint: '{{lintCommand}}',
|
|
21
|
+
typecheck: '{{typecheckCommand}}',
|
|
22
|
+
},
|
|
23
|
+
paths: {
|
|
24
|
+
root: '.ralph',
|
|
25
|
+
prompts: '.ralph/prompts',
|
|
26
|
+
guides: '.ralph/guides',
|
|
27
|
+
specs: '.ralph/specs',
|
|
28
|
+
scripts: '.ralph/scripts',
|
|
29
|
+
learnings: '.ralph/LEARNINGS.md',
|
|
30
|
+
agents: '.ralph/AGENTS.md',
|
|
31
|
+
},
|
|
32
|
+
loop: {
|
|
33
|
+
maxIterations: 10,
|
|
34
|
+
maxE2eAttempts: 5,
|
|
35
|
+
defaultModel: 'sonnet',
|
|
36
|
+
planningModel: 'opus',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
{{framework}}{{#if frameworkVersion}} {{frameworkVersion}}{{/if}}{{#if frameworkVariant}} ({{frameworkVariant}}){{/if}}, TypeScript, {{styling || css}}{{#if unitTest}}, {{unitTest}}{{/if}}{{#if e2eTest}}, {{e2eTest}}{{/if}}
|
|
5
|
+
|
|
6
|
+
## Commands
|
|
7
|
+
All commands run from `{{appDir}}/` directory:
|
|
8
|
+
|
|
9
|
+
| Action | Command |
|
|
10
|
+
|--------|---------|
|
|
11
|
+
| Dev | `cd {{appDir}} && {{devCommand}}` |
|
|
12
|
+
| Build | `cd {{appDir}} && {{buildCommand}}` |
|
|
13
|
+
| Lint | `cd {{appDir}} && {{lintCommand}}` |
|
|
14
|
+
| Lint fix | `cd {{appDir}} && {{lintCommand}} -- --fix` |
|
|
15
|
+
| Format | `cd {{appDir}} && {{formatCommand}}` |
|
|
16
|
+
| Typecheck | `cd {{appDir}} && {{typecheckCommand}}` |
|
|
17
|
+
{{#if unitTest}}| Test | `cd {{appDir}} && {{testCommand}}` |
|
|
18
|
+
| Test watch | `cd {{appDir}} && {{testCommand}} -- --watch` |{{/if}}
|
|
19
|
+
|
|
20
|
+
## Validation (run before commit)
|
|
21
|
+
```bash
|
|
22
|
+
cd {{appDir}} && {{lintCommand}} -- --fix && {{typecheckCommand}}{{#if unitTest}} && {{testCommand}}{{/if}} && {{buildCommand}}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Security Review (run before commit)
|
|
26
|
+
```bash
|
|
27
|
+
cd {{appDir}} && {{packageManager}} audit # Check vulnerable dependencies
|
|
28
|
+
```
|
|
29
|
+
Then review changes against @.ralph/guides/SECURITY.md checklist.
|
|
30
|
+
Use `mcp__supabase__get_advisors` with type "security" to check RLS policies.
|
|
31
|
+
|
|
32
|
+
## Patterns
|
|
33
|
+
- Pages: `{{appDir}}/app/` - Next.js App Router
|
|
34
|
+
- Components: `{{appDir}}/components/` - see ui/, ai-elements/, survey-editor/
|
|
35
|
+
- API: `{{appDir}}/app/api/` - streaming endpoints with tool calling
|
|
36
|
+
- Store: `{{appDir}}/store/` - State management
|
|
37
|
+
- Server Actions: `{{appDir}}/app/actions.ts` and `{{appDir}}/app/actions/`
|
|
38
|
+
- Libs: `{{appDir}}/lib/` - utilities and integrations
|
|
39
|
+
|
|
40
|
+
## Search Tools
|
|
41
|
+
- **Codebase search**: Use `mgrep "query"` (preferred over Grep/Glob)
|
|
42
|
+
- **Documentation lookup**: Use Context7 MCP for library/framework docs
|
|
43
|
+
- **Web search**: Use `mgrep --web "query"` for general web lookups
|
|
44
|
+
|
|
45
|
+
## Code Rules
|
|
46
|
+
- Explicit return types on functions
|
|
47
|
+
- No `any` - use `unknown` if truly unknown
|
|
48
|
+
- Early returns over nested conditionals
|
|
49
|
+
- Named exports, not default exports
|
|
50
|
+
- Path alias `@/` maps to `{{appDir}}/` root
|
|
51
|
+
- Follow patterns in existing components
|
|
52
|
+
- 2-space indentation, single quotes
|
|
53
|
+
- PascalCase for components, `use` prefix for hooks
|
|
54
|
+
- kebab-case for folder names (e.g., `survey-editor`)
|
|
55
|
+
|
|
56
|
+
{{#if unitTest}}## Testing
|
|
57
|
+
- Framework: {{unitTest}}{{#if unitTestVersion}} {{unitTestVersion}}{{/if}}
|
|
58
|
+
- Test location: next to component as `*.test.tsx` or in `__tests__/`
|
|
59
|
+
- Run: `cd {{appDir}} && {{testCommand}}`
|
|
60
|
+
- Each feature task should include tests
|
|
61
|
+
- Validation fails if tests fail
|
|
62
|
+
{{/if}}
|
|
63
|
+
|
|
64
|
+
## Secrets
|
|
65
|
+
- Use `.env.local` for secrets, never commit API keys
|
|
66
|
+
- Use `process.env.*` for all secrets
|
|
67
|
+
|
|
68
|
+
## Git
|
|
69
|
+
- Commits: `type(scope): description` (conventional commits)
|
|
70
|
+
- Types: feat, fix, docs, refactor, test, chore
|
|
71
|
+
- After changes: validate, commit, push
|
|
72
|
+
|
|
73
|
+
## MCP Servers Available
|
|
74
|
+
- **Supabase**: Query DB, manage migrations, generate types
|
|
75
|
+
- **PostHog**: Analytics, feature flags, experiments
|
|
76
|
+
- **Playwright**: Browser automation for E2E testing
|
|
77
|
+
- Navigate: `browser_navigate`, `browser_snapshot`
|
|
78
|
+
- Interact: `browser_click`, `browser_type`, `browser_fill_form`
|
|
79
|
+
- Verify: `browser_wait_for`, `browser_console_messages`
|
|
80
|
+
- Debug: `browser_take_screenshot`
|
|
81
|
+
- **Codex CLI** (shell command, not MCP): PR review
|
|
82
|
+
- Command: `echo "prompt" | codex exec --full-auto -`
|
|
83
|
+
- For reviews: `codex review --base main` (interactive mode)
|
|
84
|
+
- Location: `/opt/homebrew/bin/codex`
|
|
85
|
+
- Use for: code review, PR feedback before merge
|
|
86
|
+
- **Context7**: Documentation lookup for libraries/frameworks
|
|
87
|
+
|
|
88
|
+
## Quick Triggers
|
|
89
|
+
| Keywords | Action |
|
|
90
|
+
|----------|--------|
|
|
91
|
+
| type error, ts | Run typecheck |
|
|
92
|
+
| lint, format | Run lint --fix and prettier |
|
|
93
|
+
| deploy, build | Run full build |
|
|
94
|
+
| error, debug | Check PostHog logs or console |
|
|
95
|
+
| database, table | Use Supabase MCP |
|
|
96
|
+
| e2e, browser test | Use Playwright MCP |
|
|
97
|
+
|
|
98
|
+
## Detailed Docs
|
|
99
|
+
- Architecture: `{{appDir}}/.claude/CLAUDE.md` - comprehensive codebase details
|
|
100
|
+
- Frontend: `.ralph/guides/FRONTEND.md` - design patterns, component usage, quality checklist
|