test-genie-mcp 2.0.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/README.md +219 -0
- package/dist/analyzers/astAnalyzer.d.ts +108 -0
- package/dist/analyzers/astAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/astAnalyzer.js +800 -0
- package/dist/analyzers/astAnalyzer.js.map +1 -0
- package/dist/analyzers/performanceAnalyzer.d.ts +90 -0
- package/dist/analyzers/performanceAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/performanceAnalyzer.js +647 -0
- package/dist/analyzers/performanceAnalyzer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +683 -0
- package/dist/index.js.map +1 -0
- package/dist/platforms/android/index.d.ts +90 -0
- package/dist/platforms/android/index.d.ts.map +1 -0
- package/dist/platforms/android/index.js +519 -0
- package/dist/platforms/android/index.js.map +1 -0
- package/dist/platforms/flutter/index.d.ts +105 -0
- package/dist/platforms/flutter/index.d.ts.map +1 -0
- package/dist/platforms/flutter/index.js +533 -0
- package/dist/platforms/flutter/index.js.map +1 -0
- package/dist/platforms/ios/index.d.ts +79 -0
- package/dist/platforms/ios/index.d.ts.map +1 -0
- package/dist/platforms/ios/index.js +393 -0
- package/dist/platforms/ios/index.js.map +1 -0
- package/dist/platforms/react-native/index.d.ts +160 -0
- package/dist/platforms/react-native/index.d.ts.map +1 -0
- package/dist/platforms/react-native/index.js +602 -0
- package/dist/platforms/react-native/index.js.map +1 -0
- package/dist/platforms/web/index.d.ts +177 -0
- package/dist/platforms/web/index.d.ts.map +1 -0
- package/dist/platforms/web/index.js +637 -0
- package/dist/platforms/web/index.js.map +1 -0
- package/dist/storage/index.d.ts +35 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +351 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/tools/analysis/analyzeAppStructure.d.ts +9 -0
- package/dist/tools/analysis/analyzeAppStructure.d.ts.map +1 -0
- package/dist/tools/analysis/analyzeAppStructure.js +289 -0
- package/dist/tools/analysis/analyzeAppStructure.js.map +1 -0
- package/dist/tools/analysis/createTestPlan.d.ts +21 -0
- package/dist/tools/analysis/createTestPlan.d.ts.map +1 -0
- package/dist/tools/analysis/createTestPlan.js +214 -0
- package/dist/tools/analysis/createTestPlan.js.map +1 -0
- package/dist/tools/analysis/generateScenarios.d.ts +21 -0
- package/dist/tools/analysis/generateScenarios.d.ts.map +1 -0
- package/dist/tools/analysis/generateScenarios.js +567 -0
- package/dist/tools/analysis/generateScenarios.js.map +1 -0
- package/dist/tools/automation/cicdIntegration.d.ts +41 -0
- package/dist/tools/automation/cicdIntegration.d.ts.map +1 -0
- package/dist/tools/automation/cicdIntegration.js +825 -0
- package/dist/tools/automation/cicdIntegration.js.map +1 -0
- package/dist/tools/automation/generateReport.d.ts +16 -0
- package/dist/tools/automation/generateReport.d.ts.map +1 -0
- package/dist/tools/automation/generateReport.js +406 -0
- package/dist/tools/automation/generateReport.js.map +1 -0
- package/dist/tools/automation/runFullAutomation.d.ts +25 -0
- package/dist/tools/automation/runFullAutomation.d.ts.map +1 -0
- package/dist/tools/automation/runFullAutomation.js +296 -0
- package/dist/tools/automation/runFullAutomation.js.map +1 -0
- package/dist/tools/detection/detectLogicErrors.d.ts +18 -0
- package/dist/tools/detection/detectLogicErrors.d.ts.map +1 -0
- package/dist/tools/detection/detectLogicErrors.js +470 -0
- package/dist/tools/detection/detectLogicErrors.js.map +1 -0
- package/dist/tools/detection/detectMemoryLeaks.d.ts +23 -0
- package/dist/tools/detection/detectMemoryLeaks.d.ts.map +1 -0
- package/dist/tools/detection/detectMemoryLeaks.js +453 -0
- package/dist/tools/detection/detectMemoryLeaks.js.map +1 -0
- package/dist/tools/execution/runScenarioTest.d.ts +34 -0
- package/dist/tools/execution/runScenarioTest.d.ts.map +1 -0
- package/dist/tools/execution/runScenarioTest.js +334 -0
- package/dist/tools/execution/runScenarioTest.js.map +1 -0
- package/dist/tools/execution/runSimulation.d.ts +17 -0
- package/dist/tools/execution/runSimulation.d.ts.map +1 -0
- package/dist/tools/execution/runSimulation.js +250 -0
- package/dist/tools/execution/runSimulation.js.map +1 -0
- package/dist/tools/execution/runStressTest.d.ts +52 -0
- package/dist/tools/execution/runStressTest.d.ts.map +1 -0
- package/dist/tools/execution/runStressTest.js +176 -0
- package/dist/tools/execution/runStressTest.js.map +1 -0
- package/dist/tools/fixing/applyFix.d.ts +44 -0
- package/dist/tools/fixing/applyFix.d.ts.map +1 -0
- package/dist/tools/fixing/applyFix.js +399 -0
- package/dist/tools/fixing/applyFix.js.map +1 -0
- package/dist/tools/fixing/confirmFix.d.ts +31 -0
- package/dist/tools/fixing/confirmFix.d.ts.map +1 -0
- package/dist/tools/fixing/confirmFix.js +136 -0
- package/dist/tools/fixing/confirmFix.js.map +1 -0
- package/dist/tools/fixing/suggestFixes.d.ts +23 -0
- package/dist/tools/fixing/suggestFixes.d.ts.map +1 -0
- package/dist/tools/fixing/suggestFixes.js +349 -0
- package/dist/tools/fixing/suggestFixes.js.map +1 -0
- package/dist/types.d.ts +322 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/codeParser.d.ts +12 -0
- package/dist/utils/codeParser.d.ts.map +1 -0
- package/dist/utils/codeParser.js +487 -0
- package/dist/utils/codeParser.js.map +1 -0
- package/package.json +68 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,683 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// ============================================
|
|
4
|
+
// Test Genie MCP Server
|
|
5
|
+
// AI-powered App Test Automation
|
|
6
|
+
// ============================================
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
42
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
43
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
44
|
+
// Import tools
|
|
45
|
+
const analyzeAppStructure_js_1 = require("./tools/analysis/analyzeAppStructure.js");
|
|
46
|
+
const generateScenarios_js_1 = require("./tools/analysis/generateScenarios.js");
|
|
47
|
+
const createTestPlan_js_1 = require("./tools/analysis/createTestPlan.js");
|
|
48
|
+
const runScenarioTest_js_1 = require("./tools/execution/runScenarioTest.js");
|
|
49
|
+
const runSimulation_js_1 = require("./tools/execution/runSimulation.js");
|
|
50
|
+
const runStressTest_js_1 = require("./tools/execution/runStressTest.js");
|
|
51
|
+
const detectMemoryLeaks_js_1 = require("./tools/detection/detectMemoryLeaks.js");
|
|
52
|
+
const detectLogicErrors_js_1 = require("./tools/detection/detectLogicErrors.js");
|
|
53
|
+
const suggestFixes_js_1 = require("./tools/fixing/suggestFixes.js");
|
|
54
|
+
const confirmFix_js_1 = require("./tools/fixing/confirmFix.js");
|
|
55
|
+
const applyFix_js_1 = require("./tools/fixing/applyFix.js");
|
|
56
|
+
const runFullAutomation_js_1 = require("./tools/automation/runFullAutomation.js");
|
|
57
|
+
const generateReport_js_1 = require("./tools/automation/generateReport.js");
|
|
58
|
+
const cicdIntegration_js_1 = require("./tools/automation/cicdIntegration.js");
|
|
59
|
+
// Import analyzers
|
|
60
|
+
const performanceAnalyzer_js_1 = require("./analyzers/performanceAnalyzer.js");
|
|
61
|
+
const astAnalyzer_js_1 = require("./analyzers/astAnalyzer.js");
|
|
62
|
+
// Import storage
|
|
63
|
+
const storage = __importStar(require("./storage/index.js"));
|
|
64
|
+
// Define tools
|
|
65
|
+
const tools = [
|
|
66
|
+
// ============================================
|
|
67
|
+
// Phase 1: Analysis & Scenario Generation
|
|
68
|
+
// ============================================
|
|
69
|
+
{
|
|
70
|
+
name: 'analyze_app_structure',
|
|
71
|
+
description: 'Analyze app codebase structure including screens, components, APIs, and state management. Supports iOS, Android, Flutter, React Native, and Web platforms.',
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: 'object',
|
|
74
|
+
properties: {
|
|
75
|
+
projectPath: { type: 'string', description: 'Path to the project root directory' },
|
|
76
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform (auto-detected if not provided)' },
|
|
77
|
+
depth: { type: 'string', enum: ['shallow', 'normal', 'deep'], description: 'Analysis depth level' },
|
|
78
|
+
},
|
|
79
|
+
required: ['projectPath'],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'generate_scenarios',
|
|
84
|
+
description: 'Generate test scenarios based on app structure analysis. Creates E2E, integration, unit, performance, and memory test scenarios.',
|
|
85
|
+
inputSchema: {
|
|
86
|
+
type: 'object',
|
|
87
|
+
properties: {
|
|
88
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
89
|
+
testTypes: { type: 'array', items: { type: 'string', enum: ['unit', 'integration', 'e2e', 'performance', 'stress', 'memory'] }, description: 'Types of tests to generate' },
|
|
90
|
+
coverage: { type: 'string', enum: ['minimal', 'standard', 'comprehensive'], description: 'Coverage level' },
|
|
91
|
+
focusAreas: { type: 'array', items: { type: 'string' }, description: 'Specific areas to focus on' },
|
|
92
|
+
maxScenarios: { type: 'number', description: 'Maximum number of scenarios to generate' },
|
|
93
|
+
},
|
|
94
|
+
required: ['projectPath'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'create_test_plan',
|
|
99
|
+
description: 'Create a test plan from generated scenarios with filtering and scheduling options.',
|
|
100
|
+
inputSchema: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
properties: {
|
|
103
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
104
|
+
name: { type: 'string', description: 'Name of the test plan' },
|
|
105
|
+
priorityFilter: { type: 'array', items: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] }, description: 'Filter by priority' },
|
|
106
|
+
typeFilter: { type: 'array', items: { type: 'string' }, description: 'Filter by test type' },
|
|
107
|
+
template: { type: 'string', enum: ['smoke', 'regression', 'nightly', 'full'], description: 'Use a predefined template' },
|
|
108
|
+
maxDuration: { type: 'number', description: 'Maximum duration in seconds' },
|
|
109
|
+
},
|
|
110
|
+
required: ['projectPath', 'name'],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
// ============================================
|
|
114
|
+
// Phase 2: Test Execution
|
|
115
|
+
// ============================================
|
|
116
|
+
{
|
|
117
|
+
name: 'run_scenario_test',
|
|
118
|
+
description: 'Run a specific test scenario and get detailed results.',
|
|
119
|
+
inputSchema: {
|
|
120
|
+
type: 'object',
|
|
121
|
+
properties: {
|
|
122
|
+
scenarioId: { type: 'string', description: 'ID of the scenario to run' },
|
|
123
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
124
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform' },
|
|
125
|
+
device: { type: 'string', description: 'Target device or simulator' },
|
|
126
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds' },
|
|
127
|
+
retries: { type: 'number', description: 'Number of retry attempts' },
|
|
128
|
+
},
|
|
129
|
+
required: ['scenarioId', 'projectPath', 'platform'],
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'run_simulation',
|
|
134
|
+
description: 'Run user behavior simulation to find issues through random/pattern-based testing.',
|
|
135
|
+
inputSchema: {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties: {
|
|
138
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
139
|
+
duration: { type: 'number', description: 'Simulation duration in seconds' },
|
|
140
|
+
userPatterns: { type: 'array', items: { type: 'string', enum: ['random', 'sequential', 'stress', 'idle'] }, description: 'User behavior patterns to simulate' },
|
|
141
|
+
intensity: { type: 'string', enum: ['low', 'medium', 'high'], description: 'Interaction intensity' },
|
|
142
|
+
monitorMetrics: { type: 'array', items: { type: 'string', enum: ['memory', 'cpu', 'network', 'render'] }, description: 'Metrics to monitor' },
|
|
143
|
+
},
|
|
144
|
+
required: ['projectPath', 'duration'],
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'run_stress_test',
|
|
149
|
+
description: 'Run stress/load tests on APIs or UI components.',
|
|
150
|
+
inputSchema: {
|
|
151
|
+
type: 'object',
|
|
152
|
+
properties: {
|
|
153
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
154
|
+
targetType: { type: 'string', enum: ['api', 'ui', 'navigation', 'all'], description: 'What to stress test' },
|
|
155
|
+
concurrency: { type: 'number', description: 'Number of concurrent users/requests' },
|
|
156
|
+
duration: { type: 'number', description: 'Test duration in seconds' },
|
|
157
|
+
rampUp: { type: 'number', description: 'Ramp up time in seconds' },
|
|
158
|
+
endpoints: { type: 'array', items: { type: 'string' }, description: 'Specific endpoints to test' },
|
|
159
|
+
},
|
|
160
|
+
required: ['projectPath', 'targetType', 'concurrency', 'duration'],
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
// ============================================
|
|
164
|
+
// Phase 3: Issue Detection
|
|
165
|
+
// ============================================
|
|
166
|
+
{
|
|
167
|
+
name: 'detect_memory_leaks',
|
|
168
|
+
description: 'Detect memory leaks, retain cycles, and unclosed resources through static and dynamic analysis.',
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: 'object',
|
|
171
|
+
properties: {
|
|
172
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
173
|
+
analysisType: { type: 'string', enum: ['static', 'dynamic', 'both'], description: 'Type of analysis' },
|
|
174
|
+
minLeakSizeMB: { type: 'number', description: 'Minimum leak size to report (MB)' },
|
|
175
|
+
},
|
|
176
|
+
required: ['projectPath'],
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'detect_logic_errors',
|
|
181
|
+
description: 'Detect logic errors including race conditions, state inconsistencies, null references, and type mismatches.',
|
|
182
|
+
inputSchema: {
|
|
183
|
+
type: 'object',
|
|
184
|
+
properties: {
|
|
185
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
186
|
+
analysisDepth: { type: 'string', enum: ['shallow', 'normal', 'deep'], description: 'Analysis depth' },
|
|
187
|
+
checkTypes: { type: 'array', items: { type: 'string', enum: ['race_condition', 'state_inconsistency', 'null_reference', 'type_mismatch', 'all'] }, description: 'Types of errors to check' },
|
|
188
|
+
},
|
|
189
|
+
required: ['projectPath'],
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
// ============================================
|
|
193
|
+
// Phase 4: Fix Suggestions & Application
|
|
194
|
+
// ============================================
|
|
195
|
+
{
|
|
196
|
+
name: 'suggest_fixes',
|
|
197
|
+
description: 'Generate AI-powered fix suggestions for detected issues.',
|
|
198
|
+
inputSchema: {
|
|
199
|
+
type: 'object',
|
|
200
|
+
properties: {
|
|
201
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
202
|
+
issueIds: { type: 'array', items: { type: 'string' }, description: 'Specific issue IDs to fix' },
|
|
203
|
+
maxSuggestions: { type: 'number', description: 'Maximum suggestions to generate' },
|
|
204
|
+
},
|
|
205
|
+
required: ['projectPath'],
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: 'confirm_fix',
|
|
210
|
+
description: 'Confirm or reject a suggested fix before application.',
|
|
211
|
+
inputSchema: {
|
|
212
|
+
type: 'object',
|
|
213
|
+
properties: {
|
|
214
|
+
fixId: { type: 'string', description: 'ID of the fix to confirm' },
|
|
215
|
+
action: { type: 'string', enum: ['approve', 'reject', 'modify'], description: 'Confirmation action' },
|
|
216
|
+
modifiedCode: { type: 'string', description: 'Modified code if action is modify' },
|
|
217
|
+
reason: { type: 'string', description: 'Reason for rejection if action is reject' },
|
|
218
|
+
},
|
|
219
|
+
required: ['fixId', 'action'],
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'apply_fix',
|
|
224
|
+
description: 'Apply a confirmed fix to the codebase.',
|
|
225
|
+
inputSchema: {
|
|
226
|
+
type: 'object',
|
|
227
|
+
properties: {
|
|
228
|
+
fixId: { type: 'string', description: 'ID of the fix to apply' },
|
|
229
|
+
backup: { type: 'boolean', description: 'Create backup before applying' },
|
|
230
|
+
validate: { type: 'boolean', description: 'Validate syntax after applying' },
|
|
231
|
+
dryRun: { type: 'boolean', description: 'Preview changes without applying' },
|
|
232
|
+
},
|
|
233
|
+
required: ['fixId'],
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
name: 'rollback_fix',
|
|
238
|
+
description: 'Rollback an applied fix to restore original code.',
|
|
239
|
+
inputSchema: {
|
|
240
|
+
type: 'object',
|
|
241
|
+
properties: {
|
|
242
|
+
fixId: { type: 'string', description: 'ID of the fix to rollback' },
|
|
243
|
+
},
|
|
244
|
+
required: ['fixId'],
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
// ============================================
|
|
248
|
+
// Phase 5: Full Automation
|
|
249
|
+
// ============================================
|
|
250
|
+
{
|
|
251
|
+
name: 'run_full_automation',
|
|
252
|
+
description: 'Run complete test automation pipeline: analyze → generate scenarios → run tests → detect issues → suggest fixes. Interactive confirmation for fixes.',
|
|
253
|
+
inputSchema: {
|
|
254
|
+
type: 'object',
|
|
255
|
+
properties: {
|
|
256
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
257
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform' },
|
|
258
|
+
testTypes: { type: 'array', items: { type: 'string', enum: ['unit', 'integration', 'e2e', 'performance', 'memory'] }, description: 'Types of tests to run' },
|
|
259
|
+
autoFix: { type: 'boolean', description: 'Automatically apply high-confidence fixes' },
|
|
260
|
+
confirmMode: { type: 'string', enum: ['auto', 'interactive', 'batch'], description: 'Fix confirmation mode' },
|
|
261
|
+
},
|
|
262
|
+
required: ['projectPath'],
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'generate_report',
|
|
267
|
+
description: 'Generate detailed test automation report in Markdown, HTML, or JSON format.',
|
|
268
|
+
inputSchema: {
|
|
269
|
+
type: 'object',
|
|
270
|
+
properties: {
|
|
271
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
272
|
+
format: { type: 'string', enum: ['markdown', 'html', 'json'], description: 'Report format' },
|
|
273
|
+
sections: { type: 'array', items: { type: 'string', enum: ['summary', 'details', 'issues', 'fixes', 'recommendations'] }, description: 'Sections to include' },
|
|
274
|
+
outputPath: { type: 'string', description: 'Path to save the report' },
|
|
275
|
+
},
|
|
276
|
+
required: ['projectPath'],
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
// ============================================
|
|
280
|
+
// Utility Tools
|
|
281
|
+
// ============================================
|
|
282
|
+
{
|
|
283
|
+
name: 'get_pending_fixes',
|
|
284
|
+
description: 'Get list of pending fix suggestions waiting for confirmation.',
|
|
285
|
+
inputSchema: {
|
|
286
|
+
type: 'object',
|
|
287
|
+
properties: {
|
|
288
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
289
|
+
},
|
|
290
|
+
required: ['projectPath'],
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
name: 'get_test_history',
|
|
295
|
+
description: 'Get test execution history for a project.',
|
|
296
|
+
inputSchema: {
|
|
297
|
+
type: 'object',
|
|
298
|
+
properties: {
|
|
299
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
300
|
+
limit: { type: 'number', description: 'Maximum results to return' },
|
|
301
|
+
},
|
|
302
|
+
required: ['projectPath'],
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
// ============================================
|
|
306
|
+
// Enhanced Analysis Tools
|
|
307
|
+
// ============================================
|
|
308
|
+
{
|
|
309
|
+
name: 'analyze_performance',
|
|
310
|
+
description: 'Deep performance analysis including rendering, computation, network, and bundle size issues. Provides actionable recommendations.',
|
|
311
|
+
inputSchema: {
|
|
312
|
+
type: 'object',
|
|
313
|
+
properties: {
|
|
314
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
315
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform' },
|
|
316
|
+
},
|
|
317
|
+
required: ['projectPath'],
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: 'analyze_code_deep',
|
|
322
|
+
description: 'Deep AST-based code analysis with function extraction, complexity metrics, hook analysis, and issue detection.',
|
|
323
|
+
inputSchema: {
|
|
324
|
+
type: 'object',
|
|
325
|
+
properties: {
|
|
326
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
327
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform' },
|
|
328
|
+
},
|
|
329
|
+
required: ['projectPath'],
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'generate_cicd_config',
|
|
334
|
+
description: 'Generate CI/CD configuration for GitHub Actions, Jenkins, or GitLab CI with test automation integration.',
|
|
335
|
+
inputSchema: {
|
|
336
|
+
type: 'object',
|
|
337
|
+
properties: {
|
|
338
|
+
projectPath: { type: 'string', description: 'Path to the project' },
|
|
339
|
+
platform: { type: 'string', enum: ['ios', 'android', 'flutter', 'react-native', 'web'], description: 'Target platform' },
|
|
340
|
+
provider: { type: 'string', enum: ['github-actions', 'jenkins', 'gitlab-ci'], description: 'CI/CD provider' },
|
|
341
|
+
testCommand: { type: 'string', description: 'Custom test command' },
|
|
342
|
+
buildCommand: { type: 'string', description: 'Custom build command' },
|
|
343
|
+
branches: { type: 'array', items: { type: 'string' }, description: 'Branches to run CI on' },
|
|
344
|
+
writeToFile: { type: 'boolean', description: 'Write config to project' },
|
|
345
|
+
},
|
|
346
|
+
required: ['projectPath', 'provider'],
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
];
|
|
350
|
+
// Create server
|
|
351
|
+
const server = new index_js_1.Server({
|
|
352
|
+
name: 'test-genie-mcp',
|
|
353
|
+
version: '2.0.0',
|
|
354
|
+
}, {
|
|
355
|
+
capabilities: {
|
|
356
|
+
tools: {},
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
// Handle list tools request
|
|
360
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
361
|
+
return { tools };
|
|
362
|
+
});
|
|
363
|
+
// Handle tool calls
|
|
364
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
365
|
+
const { name, arguments: args } = request.params;
|
|
366
|
+
if (!args) {
|
|
367
|
+
return { content: [{ type: 'text', text: 'Error: No arguments provided' }], isError: true };
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
switch (name) {
|
|
371
|
+
// Analysis tools
|
|
372
|
+
case 'analyze_app_structure': {
|
|
373
|
+
const result = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
374
|
+
projectPath: args.projectPath,
|
|
375
|
+
platform: args.platform,
|
|
376
|
+
depth: args.depth,
|
|
377
|
+
});
|
|
378
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
379
|
+
}
|
|
380
|
+
case 'generate_scenarios': {
|
|
381
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
382
|
+
projectPath: args.projectPath,
|
|
383
|
+
});
|
|
384
|
+
const result = (0, generateScenarios_js_1.generateScenarios)({
|
|
385
|
+
appStructure,
|
|
386
|
+
testTypes: args.testTypes,
|
|
387
|
+
coverage: args.coverage,
|
|
388
|
+
focusAreas: args.focusAreas,
|
|
389
|
+
maxScenarios: args.maxScenarios,
|
|
390
|
+
});
|
|
391
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
392
|
+
}
|
|
393
|
+
case 'create_test_plan': {
|
|
394
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
395
|
+
projectPath: args.projectPath,
|
|
396
|
+
});
|
|
397
|
+
const scenarios = storage.getScenarios(args.projectPath);
|
|
398
|
+
if (args.template) {
|
|
399
|
+
const result = (0, createTestPlan_js_1.createQuickPlan)(appStructure, scenarios.map(s => s.scenario), args.template);
|
|
400
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
401
|
+
}
|
|
402
|
+
const result = (0, createTestPlan_js_1.createTestPlan)({
|
|
403
|
+
name: args.name,
|
|
404
|
+
scenarios: scenarios.map(s => s.scenario),
|
|
405
|
+
appStructure,
|
|
406
|
+
priorityFilter: args.priorityFilter,
|
|
407
|
+
typeFilter: args.typeFilter,
|
|
408
|
+
maxDuration: args.maxDuration,
|
|
409
|
+
});
|
|
410
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
411
|
+
}
|
|
412
|
+
// Execution tools
|
|
413
|
+
case 'run_scenario_test': {
|
|
414
|
+
const result = await (0, runScenarioTest_js_1.runScenarioTest)({
|
|
415
|
+
scenarioId: args.scenarioId,
|
|
416
|
+
projectPath: args.projectPath,
|
|
417
|
+
platform: args.platform,
|
|
418
|
+
device: args.device,
|
|
419
|
+
options: {
|
|
420
|
+
timeout: args.timeout,
|
|
421
|
+
retries: args.retries,
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
425
|
+
}
|
|
426
|
+
case 'run_simulation': {
|
|
427
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
428
|
+
projectPath: args.projectPath,
|
|
429
|
+
});
|
|
430
|
+
const result = await (0, runSimulation_js_1.runSimulation)({
|
|
431
|
+
appStructure,
|
|
432
|
+
duration: args.duration,
|
|
433
|
+
userPatterns: args.userPatterns,
|
|
434
|
+
intensity: args.intensity,
|
|
435
|
+
monitorMetrics: args.monitorMetrics,
|
|
436
|
+
});
|
|
437
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
438
|
+
}
|
|
439
|
+
case 'run_stress_test': {
|
|
440
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
441
|
+
projectPath: args.projectPath,
|
|
442
|
+
});
|
|
443
|
+
const result = await (0, runStressTest_js_1.runStressTest)({
|
|
444
|
+
appStructure,
|
|
445
|
+
targetType: args.targetType,
|
|
446
|
+
concurrency: args.concurrency,
|
|
447
|
+
duration: args.duration,
|
|
448
|
+
rampUp: args.rampUp,
|
|
449
|
+
endpoints: args.endpoints,
|
|
450
|
+
});
|
|
451
|
+
return { content: [{ type: 'text', text: result.summary }] };
|
|
452
|
+
}
|
|
453
|
+
// Detection tools
|
|
454
|
+
case 'detect_memory_leaks': {
|
|
455
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
456
|
+
projectPath: args.projectPath,
|
|
457
|
+
});
|
|
458
|
+
const result = (0, detectMemoryLeaks_js_1.detectMemoryLeaks)({
|
|
459
|
+
appStructure,
|
|
460
|
+
analysisType: args.analysisType,
|
|
461
|
+
thresholds: { minLeakSizeMB: args.minLeakSizeMB },
|
|
462
|
+
});
|
|
463
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.summary, null, 2) + '\n\n' + result.recommendations.join('\n') }] };
|
|
464
|
+
}
|
|
465
|
+
case 'detect_logic_errors': {
|
|
466
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
467
|
+
projectPath: args.projectPath,
|
|
468
|
+
});
|
|
469
|
+
const result = (0, detectLogicErrors_js_1.detectLogicErrors)({
|
|
470
|
+
appStructure,
|
|
471
|
+
analysisDepth: args.analysisDepth,
|
|
472
|
+
checkTypes: args.checkTypes,
|
|
473
|
+
});
|
|
474
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.summary, null, 2) + '\n\n' + result.recommendations.join('\n') }] };
|
|
475
|
+
}
|
|
476
|
+
// Fixing tools
|
|
477
|
+
case 'suggest_fixes': {
|
|
478
|
+
const issues = storage.getIssues(args.projectPath);
|
|
479
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
480
|
+
projectPath: args.projectPath,
|
|
481
|
+
});
|
|
482
|
+
const filteredIssues = args.issueIds
|
|
483
|
+
? issues.filter(i => args.issueIds.includes(i.id))
|
|
484
|
+
: issues;
|
|
485
|
+
const result = (0, suggestFixes_js_1.suggestFixes)({
|
|
486
|
+
issues: filteredIssues,
|
|
487
|
+
projectPath: args.projectPath,
|
|
488
|
+
platform: appStructure.platform,
|
|
489
|
+
maxSuggestions: args.maxSuggestions,
|
|
490
|
+
});
|
|
491
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.summary, null, 2) }] };
|
|
492
|
+
}
|
|
493
|
+
case 'confirm_fix': {
|
|
494
|
+
const result = (0, confirmFix_js_1.confirmFix)({
|
|
495
|
+
fixId: args.fixId,
|
|
496
|
+
action: args.action,
|
|
497
|
+
modifiedCode: args.modifiedCode,
|
|
498
|
+
reason: args.reason,
|
|
499
|
+
});
|
|
500
|
+
return { content: [{ type: 'text', text: result.message }] };
|
|
501
|
+
}
|
|
502
|
+
case 'apply_fix': {
|
|
503
|
+
const result = (0, applyFix_js_1.applyFix)({
|
|
504
|
+
fixId: args.fixId,
|
|
505
|
+
backup: args.backup,
|
|
506
|
+
validate: args.validate,
|
|
507
|
+
dryRun: args.dryRun,
|
|
508
|
+
});
|
|
509
|
+
if (result.success) {
|
|
510
|
+
return { content: [{ type: 'text', text: `Fix applied successfully!\n\n${result.diff || ''}` }] };
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
return { content: [{ type: 'text', text: `Fix failed: ${result.error}` }] };
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
case 'rollback_fix': {
|
|
517
|
+
const result = (0, applyFix_js_1.rollbackFix)(args.fixId);
|
|
518
|
+
return { content: [{ type: 'text', text: result.message }] };
|
|
519
|
+
}
|
|
520
|
+
// Automation tools
|
|
521
|
+
case 'run_full_automation': {
|
|
522
|
+
const result = await (0, runFullAutomation_js_1.runFullAutomation)({
|
|
523
|
+
projectPath: args.projectPath,
|
|
524
|
+
platform: args.platform,
|
|
525
|
+
testTypes: args.testTypes,
|
|
526
|
+
autoFix: args.autoFix,
|
|
527
|
+
confirmMode: args.confirmMode,
|
|
528
|
+
onProgress: (phase, progress, message) => {
|
|
529
|
+
// Progress updates would go here
|
|
530
|
+
},
|
|
531
|
+
});
|
|
532
|
+
let response = result.summary;
|
|
533
|
+
if (result.pendingConfirmations.length > 0) {
|
|
534
|
+
response += '\n\n### Pending Fix Confirmations\n\n';
|
|
535
|
+
for (const fix of result.pendingConfirmations.slice(0, 5)) {
|
|
536
|
+
response += (0, confirmFix_js_1.generateConfirmationPrompt)(fix) + '\n\n';
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return { content: [{ type: 'text', text: response }] };
|
|
540
|
+
}
|
|
541
|
+
case 'generate_report': {
|
|
542
|
+
const fixes = storage.getFixes(args.projectPath);
|
|
543
|
+
const issues = storage.getIssues(args.projectPath);
|
|
544
|
+
const results = storage.getTestResults(args.projectPath);
|
|
545
|
+
// Create a minimal automation result for report generation
|
|
546
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
547
|
+
projectPath: args.projectPath,
|
|
548
|
+
});
|
|
549
|
+
const result = (0, generateReport_js_1.generateReport)({
|
|
550
|
+
automationResult: {
|
|
551
|
+
id: 'manual',
|
|
552
|
+
config: {
|
|
553
|
+
projectPath: args.projectPath,
|
|
554
|
+
platform: appStructure.platform,
|
|
555
|
+
testTypes: ['e2e'],
|
|
556
|
+
autoFix: false,
|
|
557
|
+
confirmMode: 'batch',
|
|
558
|
+
thresholds: { memoryLeakSizeMB: 10, cpuUsagePercent: 80, renderTimeMs: 16, apiTimeoutMs: 5000, coveragePercent: 80 },
|
|
559
|
+
},
|
|
560
|
+
appStructure,
|
|
561
|
+
testPlan: { id: 'manual', name: 'Manual', description: '', scenarios: [], coverage: { screens: 0, components: 0, apis: 0, stateTransitions: 0, edgeCases: 0 }, createdAt: new Date().toISOString() },
|
|
562
|
+
testResults: results.map(r => r.result),
|
|
563
|
+
detectedIssues: issues,
|
|
564
|
+
fixSuggestions: fixes.map(f => f.fix),
|
|
565
|
+
appliedFixes: fixes.filter(f => f.application).map(f => f.application),
|
|
566
|
+
summary: {
|
|
567
|
+
totalScenarios: results.length,
|
|
568
|
+
passedScenarios: results.filter(r => r.result.status === 'passed').length,
|
|
569
|
+
failedScenarios: results.filter(r => r.result.status === 'failed').length,
|
|
570
|
+
totalIssues: issues.length,
|
|
571
|
+
criticalIssues: issues.filter(i => i.severity === 'critical').length,
|
|
572
|
+
fixesApplied: fixes.filter(f => f.application?.success).length,
|
|
573
|
+
coveragePercent: 0,
|
|
574
|
+
duration: 0,
|
|
575
|
+
},
|
|
576
|
+
startedAt: new Date().toISOString(),
|
|
577
|
+
completedAt: new Date().toISOString(),
|
|
578
|
+
},
|
|
579
|
+
format: args.format,
|
|
580
|
+
sections: args.sections,
|
|
581
|
+
outputPath: args.outputPath,
|
|
582
|
+
});
|
|
583
|
+
return { content: [{ type: 'text', text: result.content.substring(0, 10000) }] };
|
|
584
|
+
}
|
|
585
|
+
// Utility tools
|
|
586
|
+
case 'get_pending_fixes': {
|
|
587
|
+
const fixes = storage.getPendingFixes(args.projectPath);
|
|
588
|
+
return { content: [{ type: 'text', text: JSON.stringify(fixes.map(f => ({ id: f.fix.id, title: f.fix.title, file: f.fix.file, confidence: f.fix.confidence })), null, 2) }] };
|
|
589
|
+
}
|
|
590
|
+
case 'get_test_history': {
|
|
591
|
+
const history = storage.getTestResults(args.projectPath, args.limit);
|
|
592
|
+
return { content: [{ type: 'text', text: JSON.stringify(history.map(h => ({ id: h.result.id, scenario: h.result.scenarioName, status: h.result.status, duration: h.result.duration, executedAt: h.result.executedAt })), null, 2) }] };
|
|
593
|
+
}
|
|
594
|
+
// Enhanced Analysis Tools
|
|
595
|
+
case 'analyze_performance': {
|
|
596
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
597
|
+
projectPath: args.projectPath,
|
|
598
|
+
platform: args.platform,
|
|
599
|
+
});
|
|
600
|
+
const result = await (0, performanceAnalyzer_js_1.analyzePerformance)(args.projectPath, appStructure.platform);
|
|
601
|
+
let response = `# Performance Analysis Report\n\n`;
|
|
602
|
+
response += `**Score:** ${result.summary.performanceScore}/100\n\n`;
|
|
603
|
+
response += `**Issues Found:**\n`;
|
|
604
|
+
response += `- Critical: ${result.summary.criticalIssues}\n`;
|
|
605
|
+
response += `- Major: ${result.summary.majorIssues}\n`;
|
|
606
|
+
response += `- Minor: ${result.summary.minorIssues}\n\n`;
|
|
607
|
+
if (result.recommendations.length > 0) {
|
|
608
|
+
response += `## Top Recommendations\n\n`;
|
|
609
|
+
for (const rec of result.recommendations.slice(0, 5)) {
|
|
610
|
+
response += `### [${rec.priority.toUpperCase()}] ${rec.category}\n`;
|
|
611
|
+
response += `${rec.description}\n`;
|
|
612
|
+
response += `*Expected impact: ${rec.estimatedImpact}*\n\n`;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
return { content: [{ type: 'text', text: response }] };
|
|
616
|
+
}
|
|
617
|
+
case 'analyze_code_deep': {
|
|
618
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
619
|
+
projectPath: args.projectPath,
|
|
620
|
+
platform: args.platform,
|
|
621
|
+
});
|
|
622
|
+
const result = await (0, astAnalyzer_js_1.analyzeProject)(args.projectPath, appStructure.platform);
|
|
623
|
+
let response = `# Deep Code Analysis\n\n`;
|
|
624
|
+
response += `**Files Analyzed:** ${result.summary.totalFiles}\n`;
|
|
625
|
+
response += `**Functions:** ${result.summary.totalFunctions}\n`;
|
|
626
|
+
response += `**Classes:** ${result.summary.totalClasses}\n`;
|
|
627
|
+
response += `**Components:** ${result.summary.totalComponents}\n`;
|
|
628
|
+
response += `**Avg Complexity:** ${result.summary.avgComplexity.toFixed(2)}\n\n`;
|
|
629
|
+
response += `**Issues:**\n`;
|
|
630
|
+
response += `- Errors: ${result.summary.issueCount.error}\n`;
|
|
631
|
+
response += `- Warnings: ${result.summary.issueCount.warning}\n`;
|
|
632
|
+
response += `- Info: ${result.summary.issueCount.info}\n`;
|
|
633
|
+
return { content: [{ type: 'text', text: response }] };
|
|
634
|
+
}
|
|
635
|
+
case 'generate_cicd_config': {
|
|
636
|
+
const appStructure = (0, analyzeAppStructure_js_1.analyzeAppStructure)({
|
|
637
|
+
projectPath: args.projectPath,
|
|
638
|
+
platform: args.platform,
|
|
639
|
+
});
|
|
640
|
+
const cicdConfig = {
|
|
641
|
+
projectPath: args.projectPath,
|
|
642
|
+
platform: appStructure.platform,
|
|
643
|
+
provider: args.provider,
|
|
644
|
+
options: {
|
|
645
|
+
testCommand: args.testCommand,
|
|
646
|
+
buildCommand: args.buildCommand,
|
|
647
|
+
branches: args.branches,
|
|
648
|
+
},
|
|
649
|
+
};
|
|
650
|
+
if (args.writeToFile) {
|
|
651
|
+
const result = (0, cicdIntegration_js_1.writeCICDConfig)(cicdConfig);
|
|
652
|
+
if (result.success) {
|
|
653
|
+
return { content: [{ type: 'text', text: `CI/CD config written to:\n${result.files.join('\n')}` }] };
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
return { content: [{ type: 'text', text: 'Failed to write CI/CD config' }], isError: true };
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
else {
|
|
660
|
+
const result = (0, cicdIntegration_js_1.generateCICDConfig)(cicdConfig);
|
|
661
|
+
return { content: [{ type: 'text', text: `# ${result.provider} Configuration\n\nFile: \`${result.filePath}\`\n\n\`\`\`yaml\n${result.content}\n\`\`\`` }] };
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
default:
|
|
665
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
670
|
+
return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
|
|
671
|
+
}
|
|
672
|
+
});
|
|
673
|
+
// Start server
|
|
674
|
+
async function main() {
|
|
675
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
676
|
+
await server.connect(transport);
|
|
677
|
+
console.error('Test Genie MCP server running on stdio');
|
|
678
|
+
}
|
|
679
|
+
main().catch((error) => {
|
|
680
|
+
console.error('Server error:', error);
|
|
681
|
+
process.exit(1);
|
|
682
|
+
});
|
|
683
|
+
//# sourceMappingURL=index.js.map
|