@sudu-cli/fronted-preview-mcp 1.0.0-beta.0 → 1.0.0-beta.3
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/dist/handlers/autoFixLoop.d.ts +17 -0
- package/dist/handlers/autoFixLoop.js +94 -0
- package/dist/handlers/autoFixLoop.js.map +1 -0
- package/dist/handlers/checkPageErrors.d.ts +9 -0
- package/dist/handlers/checkPageErrors.js +168 -0
- package/dist/handlers/checkPageErrors.js.map +1 -0
- package/dist/handlers/pickElement.d.ts +10 -0
- package/dist/handlers/pickElement.js +413 -0
- package/dist/handlers/pickElement.js.map +1 -0
- package/dist/handlers/takeScreenshot.d.ts +17 -0
- package/dist/handlers/takeScreenshot.js +83 -0
- package/dist/handlers/takeScreenshot.js.map +1 -0
- package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
- package/dist/handlers/typescriptDiagnostics.js +151 -0
- package/dist/handlers/typescriptDiagnostics.js.map +1 -0
- package/dist/index.js +161 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/package.json +7 -4
- package/templates/init/agent.md +18 -2
- package/templates/init/instructions.md +31 -4
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { Project } from 'ts-morph';
|
|
3
|
+
function getSeverity(diagnostic) {
|
|
4
|
+
const category = diagnostic.getCategory();
|
|
5
|
+
if (category === 1)
|
|
6
|
+
return 'error'; // DiagnosticCategory.Error
|
|
7
|
+
if (category === 0)
|
|
8
|
+
return 'warning'; // DiagnosticCategory.Warning
|
|
9
|
+
if (category === 2)
|
|
10
|
+
return 'suggestion'; // DiagnosticCategory.Suggestion
|
|
11
|
+
return 'message'; // DiagnosticCategory.Message
|
|
12
|
+
}
|
|
13
|
+
function getCategory(diagnostic) {
|
|
14
|
+
const code = diagnostic.getCode();
|
|
15
|
+
// TypeScript diagnostic codes:
|
|
16
|
+
// 1000-1999: syntactic (parser)
|
|
17
|
+
// 2000-2999: semantic (binder/checker)
|
|
18
|
+
// 3000-3999: declaration
|
|
19
|
+
// 4000-4999: config
|
|
20
|
+
// 5000-5999: project references
|
|
21
|
+
// 6000-6999: deprecated
|
|
22
|
+
// 7000-7999: strict null checks
|
|
23
|
+
// 8000-8999: watch
|
|
24
|
+
if (code >= 1000 && code < 2000)
|
|
25
|
+
return 'syntactic';
|
|
26
|
+
if (code >= 2000 && code < 3000)
|
|
27
|
+
return 'semantic';
|
|
28
|
+
if (code >= 3000 && code < 4000)
|
|
29
|
+
return 'declaration';
|
|
30
|
+
if (code >= 4000 && code < 5000)
|
|
31
|
+
return 'config';
|
|
32
|
+
if (code >= 5000 && code < 6000)
|
|
33
|
+
return 'typescript'; // project references
|
|
34
|
+
return 'typescript';
|
|
35
|
+
}
|
|
36
|
+
function formatDiagnostic(diagnostic, projectDir) {
|
|
37
|
+
const sourceFile = diagnostic.getSourceFile();
|
|
38
|
+
const filePath = sourceFile ? path.relative(projectDir, sourceFile.getFilePath()) : 'unknown';
|
|
39
|
+
let line = 0;
|
|
40
|
+
let column = 0;
|
|
41
|
+
const start = diagnostic.getStart();
|
|
42
|
+
if (start !== undefined && sourceFile) {
|
|
43
|
+
const pos = sourceFile.getLineAndColumnAtPos(start);
|
|
44
|
+
// ts-morph returns { line, character } or { line, column } depending on version
|
|
45
|
+
line = pos.line;
|
|
46
|
+
const col = 'character' in pos ? pos.character : 'column' in pos ? pos.column : 0;
|
|
47
|
+
column = typeof col === 'number' ? col : 0;
|
|
48
|
+
}
|
|
49
|
+
// getMessageText() can return string or DiagnosticMessageChain
|
|
50
|
+
const messageText = diagnostic.getMessageText();
|
|
51
|
+
const message = typeof messageText === 'string' ? messageText : JSON.stringify(messageText);
|
|
52
|
+
return {
|
|
53
|
+
file: filePath,
|
|
54
|
+
line: line + 1, // Convert to 1-based
|
|
55
|
+
column: column + 1, // Convert to 1-based
|
|
56
|
+
code: diagnostic.getCode(),
|
|
57
|
+
message,
|
|
58
|
+
severity: getSeverity(diagnostic),
|
|
59
|
+
category: getCategory(diagnostic),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function handleGetTypeScriptDiagnostics(args) {
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
const projectDir = args.projectDir || process.cwd();
|
|
65
|
+
const tsConfigPath = args.tsConfigPath || 'tsconfig.json';
|
|
66
|
+
const fullTsConfigPath = path.resolve(projectDir, tsConfigPath);
|
|
67
|
+
const includeWarnings = args.includeWarnings ?? true;
|
|
68
|
+
try {
|
|
69
|
+
// Check if tsconfig exists
|
|
70
|
+
const fs = await import('node:fs/promises');
|
|
71
|
+
try {
|
|
72
|
+
await fs.access(fullTsConfigPath);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: JSON.stringify({
|
|
80
|
+
error: `tsconfig.json not found at ${fullTsConfigPath}`,
|
|
81
|
+
projectDir,
|
|
82
|
+
suggestion: 'Ensure the project has a tsconfig.json file',
|
|
83
|
+
}, null, 2),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Create ts-morph project
|
|
90
|
+
const project = new Project({
|
|
91
|
+
tsConfigFilePath: fullTsConfigPath,
|
|
92
|
+
skipAddingFilesFromTsConfig: false,
|
|
93
|
+
skipFileDependencyResolution: true, // Faster for diagnostics only
|
|
94
|
+
skipLoadingLibFiles: true, // Don't load lib.d.ts
|
|
95
|
+
});
|
|
96
|
+
let diagnostics = [];
|
|
97
|
+
if (args.files && args.files.length > 0) {
|
|
98
|
+
// Check specific files
|
|
99
|
+
for (const file of args.files) {
|
|
100
|
+
const fullPath = path.resolve(projectDir, file);
|
|
101
|
+
const sourceFile = project.getSourceFile(fullPath);
|
|
102
|
+
if (sourceFile) {
|
|
103
|
+
const fileDiagnostics = sourceFile.getPreEmitDiagnostics();
|
|
104
|
+
diagnostics.push(...fileDiagnostics);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Check entire project
|
|
110
|
+
diagnostics = project.getPreEmitDiagnostics();
|
|
111
|
+
}
|
|
112
|
+
// Filter and format
|
|
113
|
+
const formattedDiagnostics = diagnostics
|
|
114
|
+
.filter((d) => includeWarnings || d.getCategory() === 1) // Include errors always, warnings if requested
|
|
115
|
+
.map((d) => formatDiagnostic(d, projectDir));
|
|
116
|
+
// Count by severity
|
|
117
|
+
const errorCount = formattedDiagnostics.filter((d) => d.severity === 'error').length;
|
|
118
|
+
const warningCount = formattedDiagnostics.filter((d) => d.severity === 'warning').length;
|
|
119
|
+
const suggestionCount = formattedDiagnostics.filter((d) => d.severity === 'suggestion').length;
|
|
120
|
+
// Count unique files
|
|
121
|
+
const fileCount = new Set(formattedDiagnostics.map((d) => d.file)).size;
|
|
122
|
+
const report = {
|
|
123
|
+
projectDir,
|
|
124
|
+
tsConfigPath: path.relative(projectDir, fullTsConfigPath),
|
|
125
|
+
diagnostics: formattedDiagnostics,
|
|
126
|
+
errorCount,
|
|
127
|
+
warningCount,
|
|
128
|
+
suggestionCount,
|
|
129
|
+
fileCount,
|
|
130
|
+
durationMs: Date.now() - startTime,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: 'text',
|
|
137
|
+
text: JSON.stringify(report, null, 2),
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
|
|
146
|
+
isError: true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export { handleGetTypeScriptDiagnostics };
|
|
151
|
+
//# sourceMappingURL=typescriptDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescriptDiagnostics.js","sourceRoot":"","sources":["../../src/handlers/typescriptDiagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,9 @@ import { handleGetProjectInfo } from './handlers/getProjectInfo.js';
|
|
|
7
7
|
import { handleStartDevServer } from './handlers/startDevServer.js';
|
|
8
8
|
import { handleStopDevServer } from './handlers/stopDevServer.js';
|
|
9
9
|
import { handleQuickPreview } from './handlers/quickPreview.js';
|
|
10
|
+
import { handleCheckPageErrors } from './handlers/checkPageErrors.js';
|
|
11
|
+
import { handleGetTypeScriptDiagnostics } from './handlers/typescriptDiagnostics.js';
|
|
12
|
+
import { handleAutoFixLoop } from './handlers/autoFixLoop.js';
|
|
10
13
|
const server = new McpServer({
|
|
11
14
|
name: 'frontend-preview',
|
|
12
15
|
version: '1.0.0',
|
|
@@ -98,13 +101,16 @@ server.tool('quick_preview', 'ONE-STEP: detect frontend framework + start dev se
|
|
|
98
101
|
'WHEN NOT TO USE:\n' +
|
|
99
102
|
'- User only asks about project info — use get_project_info\n' +
|
|
100
103
|
'- User explicitly asks to stop — use stop_dev_server\n\n' +
|
|
101
|
-
'CRITICAL — AFTER THIS TOOL, USE
|
|
104
|
+
'CRITICAL — AFTER THIS TOOL, USE chrome-devtools-mcp FOR ALL BROWSER INTERACTIONS:\n' +
|
|
102
105
|
'1. chrome-devtools navigate_page(url) ← Open page in browser\n' +
|
|
103
106
|
'2. chrome-devtools list_console_messages() ← Check for JS errors\n' +
|
|
104
107
|
'3. chrome-devtools take_snapshot() ← Inspect page structure\n' +
|
|
105
|
-
'4.
|
|
108
|
+
'4. chrome-devtools take_screenshot() ← Visual capture (optional)\n' +
|
|
109
|
+
'5. Report findings to the user\n\n' +
|
|
106
110
|
'Do NOT call get_project_info or start_dev_server separately when using this.\n' +
|
|
107
|
-
'The dev server stays running — no need to call stop_dev_server after preview
|
|
111
|
+
'The dev server stays running — no need to call stop_dev_server after preview.\n\n' +
|
|
112
|
+
'NOTE: This MCP handles framework detection + dev server lifecycle. ' +
|
|
113
|
+
'All browser interactions are delegated to chrome-devtools-mcp.', {
|
|
108
114
|
projectDir: z
|
|
109
115
|
.string()
|
|
110
116
|
.optional()
|
|
@@ -117,6 +123,158 @@ server.tool('quick_preview', 'ONE-STEP: detect frontend framework + start dev se
|
|
|
117
123
|
return await handleQuickPreview(args);
|
|
118
124
|
});
|
|
119
125
|
// ============================================================
|
|
126
|
+
// Tool: check_page_errors
|
|
127
|
+
// ============================================================
|
|
128
|
+
server.tool('check_page_errors', 'Check frontend page for console errors and network failures. ' +
|
|
129
|
+
'Starts dev server (if needed), connects to Chrome via CDP (port 9222), ' +
|
|
130
|
+
'navigates to the page, and returns structured error report.\n\n' +
|
|
131
|
+
'This is the ONLY tool in this MCP that directly uses CDP. ' +
|
|
132
|
+
'All other browser interactions (screenshots, element inspection, snapshots) ' +
|
|
133
|
+
'are delegated to chrome-devtools-mcp.\n\n' +
|
|
134
|
+
'Returns { pageUrl, framework, port, consoleMessages[], networkErrors[], hasErrors, errorCount, warningCount }.\n\n' +
|
|
135
|
+
'WHEN TO USE:\n' +
|
|
136
|
+
'- User wants to check if page has any JavaScript errors\n' +
|
|
137
|
+
'- User wants to verify page loads without console errors\n' +
|
|
138
|
+
'- Automated CI/CD error checking\n\n' +
|
|
139
|
+
'PREREQUISITE:\n' +
|
|
140
|
+
'- Chrome must be running with --remote-debugging-port=9222\n' +
|
|
141
|
+
'- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
|
|
142
|
+
'AFTER THIS TOOL:\n' +
|
|
143
|
+
'- If errors found, use the error details to fix the code\n' +
|
|
144
|
+
'- Re-run check_page_errors to verify fixes\n' +
|
|
145
|
+
'- For visual inspection, use chrome-devtools take_screenshot\n' +
|
|
146
|
+
'- For element inspection, use chrome-devtools take_snapshot / navigate_page', {
|
|
147
|
+
projectDir: z
|
|
148
|
+
.string()
|
|
149
|
+
.optional()
|
|
150
|
+
.describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
|
|
151
|
+
customPort: z
|
|
152
|
+
.number()
|
|
153
|
+
.optional()
|
|
154
|
+
.describe('Override the auto-detected dev server port number.'),
|
|
155
|
+
cdpPort: z
|
|
156
|
+
.number()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe('Chrome DevTools Protocol port. Defaults to 9222.'),
|
|
159
|
+
waitForLoadMs: z
|
|
160
|
+
.number()
|
|
161
|
+
.optional()
|
|
162
|
+
.describe('Milliseconds to wait for page load before checking console. Defaults to 3000.'),
|
|
163
|
+
}, async (args) => {
|
|
164
|
+
return await handleCheckPageErrors(args);
|
|
165
|
+
});
|
|
166
|
+
// ============================================================
|
|
167
|
+
// Tool: get_typescript_diagnostics
|
|
168
|
+
// ============================================================
|
|
169
|
+
server.tool('get_typescript_diagnostics', 'Get TypeScript compiler diagnostics (type errors, warnings) for a project. ' +
|
|
170
|
+
'Uses ts-morph to run incremental type checking without emitting files.\n\n' +
|
|
171
|
+
'Returns { projectDir, tsConfigPath, diagnostics[], errorCount, warningCount, fileCount, durationMs }.\n\n' +
|
|
172
|
+
'WHEN TO USE:\n' +
|
|
173
|
+
'- User wants to check for TypeScript type errors\n' +
|
|
174
|
+
'- After code changes to verify no regressions\n' +
|
|
175
|
+
'- CI/CD pre-check before build\n' +
|
|
176
|
+
'- AI needs context for type-safe fixes\n\n' +
|
|
177
|
+
'PREREQUISITE:\n' +
|
|
178
|
+
'- Project must have a valid tsconfig.json\n' +
|
|
179
|
+
'- Dependencies should be installed (node_modules)\n\n' +
|
|
180
|
+
'AFTER THIS TOOL:\n' +
|
|
181
|
+
'- Fix reported type errors in the listed files\n' +
|
|
182
|
+
'- Re-run to verify fixes\n' +
|
|
183
|
+
'- Combine with check_page_errors for full error coverage', {
|
|
184
|
+
projectDir: z
|
|
185
|
+
.string()
|
|
186
|
+
.optional()
|
|
187
|
+
.describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
|
|
188
|
+
tsConfigPath: z
|
|
189
|
+
.string()
|
|
190
|
+
.optional()
|
|
191
|
+
.describe('Relative path to tsconfig.json from projectDir. Defaults to "tsconfig.json".'),
|
|
192
|
+
files: z
|
|
193
|
+
.array(z.string())
|
|
194
|
+
.optional()
|
|
195
|
+
.describe('Optional: specific files to check (relative to projectDir). If omitted, checks entire project.'),
|
|
196
|
+
includeWarnings: z
|
|
197
|
+
.boolean()
|
|
198
|
+
.optional()
|
|
199
|
+
.describe('Include warnings and suggestions. Defaults to true.'),
|
|
200
|
+
}, async (args) => {
|
|
201
|
+
return await handleGetTypeScriptDiagnostics(args);
|
|
202
|
+
});
|
|
203
|
+
// ============================================================
|
|
204
|
+
// Tool: auto_fix_loop
|
|
205
|
+
// ============================================================
|
|
206
|
+
server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an iterative loop. ' +
|
|
207
|
+
'Combines console error checking (via CDP) and TypeScript diagnostics ' +
|
|
208
|
+
'to identify and verify fixes automatically.\n\n' +
|
|
209
|
+
'Returns { success, iterations, errorsFixed, errorsRemaining, messages, errors }.\n\n' +
|
|
210
|
+
'WHEN TO USE:\n' +
|
|
211
|
+
'- User wants to automatically fix all detected errors\n' +
|
|
212
|
+
'- User says "fix all errors" or "auto-fix this project"\n' +
|
|
213
|
+
'- Need iterative error detection and fixing\n' +
|
|
214
|
+
'- CI/CD automated error cleanup\n\n' +
|
|
215
|
+
'PREREQUISITE:\n' +
|
|
216
|
+
'- Chrome must be running with --remote-debugging-port=9222 (for console error detection)\n' +
|
|
217
|
+
'- Project must have TypeScript configuration for type checking\n' +
|
|
218
|
+
'- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
|
|
219
|
+
'AFTER THIS TOOL:\n' +
|
|
220
|
+
'- Check the result for errorsFixed vs errorsRemaining\n' +
|
|
221
|
+
'- For visual inspection, use chrome-devtools take_screenshot\n' +
|
|
222
|
+
'- If errors remain, run again with more iterations\n' +
|
|
223
|
+
'- Manual review may be needed for complex issues', {
|
|
224
|
+
projectDir: z
|
|
225
|
+
.string()
|
|
226
|
+
.optional()
|
|
227
|
+
.describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
|
|
228
|
+
customPort: z
|
|
229
|
+
.number()
|
|
230
|
+
.optional()
|
|
231
|
+
.describe('Override the auto-detected dev server port number.'),
|
|
232
|
+
cdpPort: z
|
|
233
|
+
.number()
|
|
234
|
+
.optional()
|
|
235
|
+
.describe('Chrome DevTools Protocol port. Defaults to 9222.'),
|
|
236
|
+
maxIterations: z
|
|
237
|
+
.number()
|
|
238
|
+
.min(1)
|
|
239
|
+
.max(10)
|
|
240
|
+
.optional()
|
|
241
|
+
.describe('Maximum number of fix iterations. Defaults to 3.'),
|
|
242
|
+
timeoutPerIteration: z
|
|
243
|
+
.number()
|
|
244
|
+
.min(1000)
|
|
245
|
+
.max(120000)
|
|
246
|
+
.optional()
|
|
247
|
+
.describe('Timeout per iteration in milliseconds. Defaults to 30000.'),
|
|
248
|
+
stopOnSuccess: z
|
|
249
|
+
.boolean()
|
|
250
|
+
.optional()
|
|
251
|
+
.describe('Stop when no errors remain. Defaults to true.'),
|
|
252
|
+
targetErrors: z
|
|
253
|
+
.array(z.string())
|
|
254
|
+
.optional()
|
|
255
|
+
.describe('Optional: filter to specific error messages. If omitted, fixes all errors.'),
|
|
256
|
+
}, async (args) => {
|
|
257
|
+
const result = await handleAutoFixLoop(args);
|
|
258
|
+
const content = [
|
|
259
|
+
{
|
|
260
|
+
type: 'text',
|
|
261
|
+
text: `Auto-fix loop completed:\n` +
|
|
262
|
+
`Iterations: ${result.iterations}\n` +
|
|
263
|
+
`Errors fixed: ${result.errorsFixed}\n` +
|
|
264
|
+
`Errors remaining: ${result.errorsRemaining}\n` +
|
|
265
|
+
`Success: ${result.success ? '✅' : '❌'}\n\n` +
|
|
266
|
+
`Messages:\n${result.messages.join('\n')}`
|
|
267
|
+
}
|
|
268
|
+
];
|
|
269
|
+
if (result.errors.length > 0) {
|
|
270
|
+
content.push({
|
|
271
|
+
type: 'text',
|
|
272
|
+
text: `\nErrors:\n${result.errors.join('\n')}`
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return { content };
|
|
276
|
+
});
|
|
277
|
+
// ============================================================
|
|
120
278
|
// Server startup
|
|
121
279
|
// ============================================================
|
|
122
280
|
export async function main() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6DAA6D;IAC3D,kFAAkF;IAClF,6EAA6E;IAC7E,+DAA+D;IAC/D,gBAAgB;IAChB,oEAAoE;IACpE,uEAAuE;IACvE,oBAAoB;IACpB,yEAAyE;IACzE,wEAAwE;IACxE,oBAAoB;IACpB,+EAA+E;IAC/E,iEAAiE,EACnE;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yFAAyF,CAC1F;CACJ,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kEAAkE;IAChE,sEAAsE;IACtE,wDAAwD;IACxD,sDAAsD;IACtD,gBAAgB;IAChB,oEAAoE;IACpE,kDAAkD;IAClD,oBAAoB;IACpB,6EAA6E;IAC7E,4DAA4D;IAC5D,oBAAoB;IACpB,8DAA8D;IAC9D,yDAAyD;IACzD,qDAAqD,EACvD;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,gEAAgE,CACjE;CACJ,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oEAAoE;IAClE,mDAAmD;IACnD,gDAAgD;IAChD,gBAAgB;IAChB,gEAAgE;IAChE,oBAAoB;IACpB,gFAAgF;IAChF,0CAA0C,EAC5C,EAAE,EACF,KAAK,IAAI,EAAE;IACT,OAAO,MAAM,mBAAmB,EAAE,CAAC;AACrC,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,sBAAsB;AACtB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0DAA0D;IACxD,qEAAqE;IACrE,oDAAoD;IACpD,kEAAkE;IAClE,4BAA4B;IAC5B,+DAA+D;IAC/D,2DAA2D;IAC3D,oDAAoD;IACpD,oDAAoD;IACpD,oBAAoB;IACpB,8DAA8D;IAC9D,0DAA0D;IAC1D,qFAAqF;IACrF,sEAAsE;IACtE,qEAAqE;IACrE,wEAAwE;IACxE,2EAA2E;IAC3E,oCAAoC;IACpC,gFAAgF;IAChF,mFAAmF;IACnF,qEAAqE;IACrE,gEAAgE,EAClE;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;IACtG,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0FAA0F,CAAC;CACxG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,+DAA+D;IAC7D,yEAAyE;IACzE,iEAAiE;IACjE,4DAA4D;IAC5D,8EAA8E;IAC9E,2CAA2C;IAC3C,oHAAoH;IACpH,gBAAgB;IAChB,2DAA2D;IAC3D,4DAA4D;IAC5D,sCAAsC;IACtC,iBAAiB;IACjB,8DAA8D;IAC9D,2FAA2F;IAC3F,oBAAoB;IACpB,4DAA4D;IAC5D,8CAA8C;IAC9C,gEAAgE;IAChE,6EAA6E,EAC/E;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;IACtG,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+EAA+E,CAAC;CAC7F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,mCAAmC;AACnC,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,6EAA6E;IAC3E,4EAA4E;IAC5E,2GAA2G;IAC3G,gBAAgB;IAChB,oDAAoD;IACpD,iDAAiD;IACjD,kCAAkC;IAClC,4CAA4C;IAC5C,iBAAiB;IACjB,6CAA6C;IAC7C,uDAAuD;IACvD,oBAAoB;IACpB,kDAAkD;IAClD,4BAA4B;IAC5B,0DAA0D,EAC5D;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;IACtG,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8EAA8E,CAAC;IAC3F,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,gGAAgG,CAAC;IAC7G,eAAe,EAAE,CAAC;SACf,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;CACnE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,8BAA8B,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC,CACF,CAAC;AAIF,+DAA+D;AAC/D,sBAAsB;AACtB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qEAAqE;IACnE,uEAAuE;IACvE,iDAAiD;IACjD,sFAAsF;IACtF,gBAAgB;IAChB,yDAAyD;IACzD,2DAA2D;IAC3D,+CAA+C;IAC/C,qCAAqC;IACrC,iBAAiB;IACjB,4FAA4F;IAC5F,kEAAkE;IAClE,2FAA2F;IAC3F,oBAAoB;IACpB,yDAAyD;IACzD,gEAAgE;IAChE,sDAAsD;IACtD,kDAAkD,EACpD;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;IACtG,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,GAAG,CAAC,IAAI,CAAC;SACT,GAAG,CAAC,MAAM,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CAAC,2DAA2D,CAAC;IACxE,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,YAAY,EAAE,CAAC;SACZ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,4EAA4E,CAAC;CAC1F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG;QACd;YACE,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,4BAA4B;gBAC5B,eAAe,MAAM,CAAC,UAAU,IAAI;gBACpC,iBAAiB,MAAM,CAAC,WAAW,IAAI;gBACvC,qBAAqB,MAAM,CAAC,eAAe,IAAI;gBAC/C,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM;gBAC5C,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACjD;KACF,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,cAAc,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,yEAAyE;AACzE,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjF,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudu-cli/fronted-preview-mcp",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"description": "MCP server for frontend project detection, dev server management, and preview workflow. Pairs with chrome-devtools-mcp for automated frontend checking.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,11 +22,14 @@
|
|
|
22
22
|
"node": ">=18"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@modelcontextprotocol/sdk": "^1.27.1"
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
26
|
+
"chrome-remote-interface": "^0.34.0",
|
|
27
|
+
"ts-morph": "^28.0.0"
|
|
26
28
|
},
|
|
27
29
|
"devDependencies": {
|
|
28
|
-
"
|
|
29
|
-
"@types/node": "^22.0.0"
|
|
30
|
+
"@types/chrome-remote-interface": "^0.34.0",
|
|
31
|
+
"@types/node": "^22.0.0",
|
|
32
|
+
"typescript": "^5.7.0"
|
|
30
33
|
},
|
|
31
34
|
"publishConfig": {
|
|
32
35
|
"access": "public"
|
package/templates/init/agent.md
CHANGED
|
@@ -1,26 +1,40 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: 前端页面预览检查专家,自动检测 console
|
|
2
|
+
description: 前端页面预览检查专家,自动检测 console 错误、TypeScript 类型错误和渲染问题
|
|
3
3
|
mode: subagent
|
|
4
4
|
permission:
|
|
5
5
|
edit: deny
|
|
6
6
|
bash: deny
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
你是一个前端页面检查专家,专注于自动预览前端页面并报告问题,包括错误检测和自动修复。
|
|
10
10
|
|
|
11
11
|
## 工作流程
|
|
12
12
|
|
|
13
|
+
### 页面预览检查工作流
|
|
13
14
|
1. 调用 `quick_preview` 检测框架并启动 dev server
|
|
14
15
|
2. 用 chrome-devtools `navigate_page` 打开返回的 URL
|
|
15
16
|
3. 用 `list_console_messages` 检查 console 错误
|
|
16
17
|
4. 用 `take_snapshot` 获取页面结构分析
|
|
17
18
|
5. 汇总结果给用户
|
|
18
19
|
|
|
20
|
+
### 错误检测与修复工作流
|
|
21
|
+
1. 调用 `check_page_errors` 检测页面 console 错误和网络失败
|
|
22
|
+
2. 调用 `get_typescript_diagnostics` 检测 TypeScript 类型错误
|
|
23
|
+
3. 调用 `auto_fix_loop` 自动修复错误(可选)
|
|
24
|
+
4. 汇总结果给用户
|
|
25
|
+
|
|
26
|
+
### 元素分析与截图工作流
|
|
27
|
+
1. 调用 `pick_element` 拾取页面元素获取详细信息
|
|
28
|
+
2. 调用 `take_screenshot` 截图页面或特定元素
|
|
29
|
+
3. 汇总结果给用户
|
|
30
|
+
|
|
19
31
|
## 工具路由
|
|
20
32
|
|
|
21
33
|
| 场景 | 工具序列 |
|
|
22
34
|
|------|---------|
|
|
23
35
|
| "检查页面效果" | quick_preview → navigate_page → list_console_messages → take_snapshot |
|
|
36
|
+
| "检查错误" | check_page_errors → get_typescript_diagnostics → auto_fix_loop(可选) |
|
|
37
|
+
| "分析元素" | pick_element → take_screenshot(可选) |
|
|
24
38
|
| "只看项目信息" | get_project_info(不启动服务) |
|
|
25
39
|
| "停止 dev server" | stop_dev_server |
|
|
26
40
|
|
|
@@ -29,3 +43,5 @@ permission:
|
|
|
29
43
|
- 不需要截图,take_snapshot 就够了
|
|
30
44
|
- quick_preview 已包含检测,不要再调 get_project_info
|
|
31
45
|
- 报告结果时说明:是否正常运行、是否有错误、页面结构
|
|
46
|
+
- 使用 `auto_fix_loop` 时需要 Chrome 运行在调试模式(--remote-debugging-port=9222)
|
|
47
|
+
- `pick_element` 支持直接传入 CSS 选择器,或进入交互式拾取模式
|
|
@@ -13,21 +13,48 @@
|
|
|
13
13
|
4. **chrome-devtools `take_snapshot`** — 获取页面无障碍结构树,分析渲染
|
|
14
14
|
5. **汇总结果** — 告诉用户:页面运行状态、有无 console 错误、页面结构概况
|
|
15
15
|
|
|
16
|
+
## 自动错误检测与修复工作流
|
|
17
|
+
|
|
18
|
+
当用户想"检查错误"、"修复错误"、"自动修复"时,按照以下步骤:
|
|
19
|
+
|
|
20
|
+
1. **`check_page_errors`** — 检测页面 console 错误和网络失败
|
|
21
|
+
2. **`get_typescript_diagnostics`** — 检测 TypeScript 类型错误
|
|
22
|
+
3. **`auto_fix_loop`** — 自动检测和修复错误(可选)
|
|
23
|
+
4. **汇总结果** — 告诉用户:错误类型、数量、修复建议
|
|
24
|
+
|
|
25
|
+
## 元素分析与截图工作流
|
|
26
|
+
|
|
27
|
+
当用户想"分析元素"、"截图"、"查看样式"时,按照以下步骤:
|
|
28
|
+
|
|
29
|
+
1. **`pick_element`** — 拾取页面元素获取详细信息
|
|
30
|
+
2. **`take_screenshot`** — 截图页面或特定元素
|
|
31
|
+
3. **汇总结果** — 告诉用户:元素信息、样式、截图结果
|
|
32
|
+
|
|
16
33
|
## 工具快速参考
|
|
17
34
|
|
|
18
35
|
| 工具 | 用途 | 优先使用场景 |
|
|
19
36
|
|------|------|------------|
|
|
37
|
+
| **核心预览工具** | | |
|
|
20
38
|
| `quick_preview` | 检测框架 + 启动 dev server | 大多数场景——一步到位 |
|
|
21
39
|
| `get_project_info` | 仅检测框架信息 | 用户只问"这是什么项目" |
|
|
22
40
|
| `start_dev_server` | 仅启动 dev server | 已知道框架时单独使用 |
|
|
23
41
|
| `stop_dev_server` | 停止 dev server | 用户明确要求停止 |
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
42
|
+
| **错误检测工具** | | |
|
|
43
|
+
| `check_page_errors` | 检测页面 console 错误和网络失败 | 检查页面是否有 JavaScript 错误 |
|
|
44
|
+
| `get_typescript_diagnostics` | 检测 TypeScript 类型错误 | 检查代码类型错误和警告 |
|
|
45
|
+
| `auto_fix_loop` | 自动检测和修复错误 | 自动修复所有检测到的错误 |
|
|
46
|
+
| **元素分析工具** | | |
|
|
47
|
+
| `pick_element` | 拾取页面元素获取详细信息 | 分析特定元素的信息和样式 |
|
|
48
|
+
| **chrome-devtools** | | |
|
|
49
|
+
| `chrome-devtools `navigate_page` | 打开 URL | 拿到 URL 后立即使用 |
|
|
50
|
+
| `chrome-devtools `list_console_messages` | 检查 console 错误 | 页面加载完成后 |
|
|
51
|
+
| `chrome-devtools `take_snapshot` | 获取页面结构 | 需要分析渲染结果时 |
|
|
52
|
+
| `chrome-devtools `take_screenshot` | 页面截图 | 用户明确要求视觉确认时 |
|
|
28
53
|
|
|
29
54
|
## 注意
|
|
30
55
|
|
|
31
56
|
- 默认不需要截图,`take_snapshot` 的无障碍树对 AI 已足够
|
|
32
57
|
- `quick_preview` 已包含 framework 检测,不要再重复调 `get_project_info`
|
|
33
58
|
- dev server 可以保持运行,不需要每次用完就关闭
|
|
59
|
+
- 使用 `auto_fix_loop` 时需要 Chrome 运行在调试模式(--remote-debugging-port=9222)
|
|
60
|
+
- `pick_element` 支持直接传入 CSS 选择器,或进入交互式拾取模式
|