@sudu-cli/fronted-preview-mcp 1.0.0-beta.0 → 1.0.0-beta.2

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.
@@ -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,11 @@ 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 { handlePickElement } from './handlers/pickElement.js';
13
+ import { handleTakeScreenshot } from './handlers/takeScreenshot.js';
14
+ import { handleAutoFixLoop } from './handlers/autoFixLoop.js';
10
15
  const server = new McpServer({
11
16
  name: 'frontend-preview',
12
17
  version: '1.0.0',
@@ -117,6 +122,277 @@ server.tool('quick_preview', 'ONE-STEP: detect frontend framework + start dev se
117
122
  return await handleQuickPreview(args);
118
123
  });
119
124
  // ============================================================
125
+ // Tool: check_page_errors
126
+ // ============================================================
127
+ server.tool('check_page_errors', 'Check frontend page for console errors and network failures. ' +
128
+ 'Starts dev server (if needed), connects to Chrome via CDP (port 9222), ' +
129
+ 'navigates to the page, and returns structured error report.\n\n' +
130
+ 'Returns { pageUrl, framework, port, consoleMessages[], networkErrors[], hasErrors, errorCount, warningCount }.\n\n' +
131
+ 'WHEN TO USE:\n' +
132
+ '- User wants to check if page has any JavaScript errors\n' +
133
+ '- User wants to verify page loads without console errors\n' +
134
+ '- Automated CI/CD error checking\n\n' +
135
+ 'PREREQUISITE:\n' +
136
+ '- Chrome must be running with --remote-debugging-port=9222\n' +
137
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
138
+ 'AFTER THIS TOOL:\n' +
139
+ '- If errors found, use the error details to fix the code\n' +
140
+ '- Re-run check_page_errors to verify fixes\n' +
141
+ '- For visual inspection, use chrome-devtools take_screenshot', {
142
+ projectDir: z
143
+ .string()
144
+ .optional()
145
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
146
+ customPort: z
147
+ .number()
148
+ .optional()
149
+ .describe('Override the auto-detected dev server port number.'),
150
+ cdpPort: z
151
+ .number()
152
+ .optional()
153
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
154
+ waitForLoadMs: z
155
+ .number()
156
+ .optional()
157
+ .describe('Milliseconds to wait for page load before checking console. Defaults to 3000.'),
158
+ }, async (args) => {
159
+ return await handleCheckPageErrors(args);
160
+ });
161
+ // ============================================================
162
+ // Tool: get_typescript_diagnostics
163
+ // ============================================================
164
+ server.tool('get_typescript_diagnostics', 'Get TypeScript compiler diagnostics (type errors, warnings) for a project. ' +
165
+ 'Uses ts-morph to run incremental type checking without emitting files.\n\n' +
166
+ 'Returns { projectDir, tsConfigPath, diagnostics[], errorCount, warningCount, fileCount, durationMs }.\n\n' +
167
+ 'WHEN TO USE:\n' +
168
+ '- User wants to check for TypeScript type errors\n' +
169
+ '- After code changes to verify no regressions\n' +
170
+ '- CI/CD pre-check before build\n' +
171
+ '- AI needs context for type-safe fixes\n\n' +
172
+ 'PREREQUISITE:\n' +
173
+ '- Project must have a valid tsconfig.json\n' +
174
+ '- Dependencies should be installed (node_modules)\n\n' +
175
+ 'AFTER THIS TOOL:\n' +
176
+ '- Fix reported type errors in the listed files\n' +
177
+ '- Re-run to verify fixes\n' +
178
+ '- Combine with check_page_errors for full error coverage', {
179
+ projectDir: z
180
+ .string()
181
+ .optional()
182
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
183
+ tsConfigPath: z
184
+ .string()
185
+ .optional()
186
+ .describe('Relative path to tsconfig.json from projectDir. Defaults to "tsconfig.json".'),
187
+ files: z
188
+ .array(z.string())
189
+ .optional()
190
+ .describe('Optional: specific files to check (relative to projectDir). If omitted, checks entire project.'),
191
+ includeWarnings: z
192
+ .boolean()
193
+ .optional()
194
+ .describe('Include warnings and suggestions. Defaults to true.'),
195
+ }, async (args) => {
196
+ return await handleGetTypeScriptDiagnostics(args);
197
+ });
198
+ // ============================================================
199
+ // Tool: pick_element
200
+ // ============================================================
201
+ server.tool('pick_element', 'Pick an element from the frontend page to get its selector, styles, and structure. ' +
202
+ 'Starts dev server (if needed), connects to Chrome via CDP (port 9222), ' +
203
+ 'and either uses a provided CSS selector or enters inspection mode for user to click an element.\n\n' +
204
+ 'Returns { pageUrl, framework, port, element: { selector, xpath, tagName, id, className, attributes, computedStyles, boundingBox, outerHTML, innerText, componentName, componentProps } }.\n\n' +
205
+ 'WHEN TO USE:\n' +
206
+ '- User wants to inspect a specific element on the page\n' +
207
+ '- User says "pick this element" or "what is this button\'s selector"\n' +
208
+ '- Need exact CSS selector, computed styles, or component info for AI fixing\n\n' +
209
+ 'PREREQUISITE:\n' +
210
+ '- Chrome must be running with --remote-debugging-port=9222\n' +
211
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
212
+ 'AFTER THIS TOOL:\n' +
213
+ '- Use the selector/xpath to target the element in fixes\n' +
214
+ '- Use computedStyles to understand layout issues\n' +
215
+ '- Use componentName/componentProps for React/Vue component debugging\n' +
216
+ '- Combine with check_page_errors for full debugging context', {
217
+ projectDir: z
218
+ .string()
219
+ .optional()
220
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
221
+ customPort: z
222
+ .number()
223
+ .optional()
224
+ .describe('Override the auto-detected dev server port number.'),
225
+ cdpPort: z
226
+ .number()
227
+ .optional()
228
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
229
+ selector: z
230
+ .string()
231
+ .optional()
232
+ .describe('Optional: CSS selector to pick directly. If omitted, enters inspection mode for user to click element.'),
233
+ waitForLoadMs: z
234
+ .number()
235
+ .optional()
236
+ .describe('Milliseconds to wait for page load before picking. Defaults to 3000.'),
237
+ }, async (args) => {
238
+ return await handlePickElement(args);
239
+ });
240
+ // ============================================================
241
+ // Tool: take_screenshot
242
+ // ============================================================
243
+ server.tool('take_screenshot', 'Take a screenshot of the frontend page or specific element. ' +
244
+ 'Starts dev server (if needed), connects to Chrome via CDP (port 9222), ' +
245
+ 'and captures the current page view or a specific element.\n\n' +
246
+ 'Returns { success, message, dataUrl, filePath, error }.\n\n' +
247
+ 'WHEN TO USE:\n' +
248
+ '- User wants to capture the current page state\n' +
249
+ '- User says "take a screenshot" or "show me the page"\n' +
250
+ '- Need visual confirmation of page layout or styling\n' +
251
+ '- Documenting bugs or sharing UI state\n\n' +
252
+ 'PREREQUISITE:\n' +
253
+ '- Chrome must be running with --remote-debugging-port=9222\n' +
254
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
255
+ 'AFTER THIS TOOL:\n' +
256
+ '- Use dataUrl for inline display or save to file for sharing\n' +
257
+ '- Combine with pick_element for element-specific screenshots\n' +
258
+ '- Use in error reporting to show visual context', {
259
+ projectDir: z
260
+ .string()
261
+ .optional()
262
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
263
+ customPort: z
264
+ .number()
265
+ .optional()
266
+ .describe('Override the auto-detected dev server port number.'),
267
+ cdpPort: z
268
+ .number()
269
+ .optional()
270
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
271
+ format: z
272
+ .enum(['png', 'jpeg', 'webp'])
273
+ .optional()
274
+ .describe('Image format. Defaults to "png".'),
275
+ quality: z
276
+ .number()
277
+ .min(0)
278
+ .max(100)
279
+ .optional()
280
+ .describe('Image quality for JPEG/WebP (0-100). Defaults to 80.'),
281
+ fullPage: z
282
+ .boolean()
283
+ .optional()
284
+ .describe('Capture entire page instead of viewport. Defaults to false.'),
285
+ selector: z
286
+ .string()
287
+ .optional()
288
+ .describe('Optional: CSS selector to screenshot specific element. If omitted, captures entire viewport.'),
289
+ waitForLoadMs: z
290
+ .number()
291
+ .optional()
292
+ .describe('Milliseconds to wait for page load before screenshot. Defaults to 3000.'),
293
+ }, async (args) => {
294
+ const result = await handleTakeScreenshot(args);
295
+ return {
296
+ content: [
297
+ {
298
+ type: 'text',
299
+ text: result.success
300
+ ? `Screenshot captured successfully!\nFormat: ${result.dataUrl ? 'data URL' : 'File saved'}\n` +
301
+ (result.dataUrl ? `Data URL: ${result.dataUrl.substring(0, 100)}...` : '')
302
+ : `Failed to capture screenshot: ${result.error}`
303
+ }
304
+ ]
305
+ };
306
+ });
307
+ // ============================================================
308
+ // Tool: auto_fix_loop
309
+ // ============================================================
310
+ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an iterative loop. ' +
311
+ 'Combines console error checking, TypeScript diagnostics, and screenshot capture ' +
312
+ 'to identify and fix issues automatically.\n\n' +
313
+ 'Returns { success, iterations, errorsFixed, errorsRemaining, screenshots, messages, errors }.\n\n' +
314
+ 'WHEN TO USE:\n' +
315
+ '- User wants to automatically fix all detected errors\n' +
316
+ '- User says "fix all errors" or "auto-fix this project"\n' +
317
+ '- Need iterative error detection and fixing\n' +
318
+ '- CI/CD automated error cleanup\n\n' +
319
+ 'PREREQUISITE:\n' +
320
+ '- Chrome must be running with --remote-debugging-port=9222\n' +
321
+ '- Project must have TypeScript configuration for type checking\n' +
322
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
323
+ 'AFTER THIS TOOL:\n' +
324
+ '- Check the result for errorsFixed vs errorsRemaining\n' +
325
+ '- Review screenshots for visual context\n' +
326
+ '- If errors remain, run again with more iterations\n' +
327
+ '- Manual review may be needed for complex issues', {
328
+ projectDir: z
329
+ .string()
330
+ .optional()
331
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
332
+ customPort: z
333
+ .number()
334
+ .optional()
335
+ .describe('Override the auto-detected dev server port number.'),
336
+ cdpPort: z
337
+ .number()
338
+ .optional()
339
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
340
+ maxIterations: z
341
+ .number()
342
+ .min(1)
343
+ .max(10)
344
+ .optional()
345
+ .describe('Maximum number of fix iterations. Defaults to 3.'),
346
+ timeoutPerIteration: z
347
+ .number()
348
+ .min(1000)
349
+ .max(120000)
350
+ .optional()
351
+ .describe('Timeout per iteration in milliseconds. Defaults to 30000.'),
352
+ stopOnSuccess: z
353
+ .boolean()
354
+ .optional()
355
+ .describe('Stop when no errors remain. Defaults to true.'),
356
+ screenshotOnError: z
357
+ .boolean()
358
+ .optional()
359
+ .describe('Take screenshot when errors detected. Defaults to true.'),
360
+ screenshotOnSuccess: z
361
+ .boolean()
362
+ .optional()
363
+ .describe('Take screenshot when all errors fixed. Defaults to false.'),
364
+ targetErrors: z
365
+ .array(z.string())
366
+ .optional()
367
+ .describe('Optional: filter to specific error messages. If omitted, fixes all errors.'),
368
+ }, async (args) => {
369
+ const result = await handleAutoFixLoop(args);
370
+ const content = [
371
+ {
372
+ type: 'text',
373
+ text: `Auto-fix loop completed:\n` +
374
+ `Iterations: ${result.iterations}\n` +
375
+ `Errors fixed: ${result.errorsFixed}\n` +
376
+ `Errors remaining: ${result.errorsRemaining}\n` +
377
+ `Success: ${result.success ? '✅' : '❌'}\n\n` +
378
+ `Messages:\n${result.messages.join('\n')}`
379
+ }
380
+ ];
381
+ if (result.screenshots.length > 0) {
382
+ content.push({
383
+ type: 'text',
384
+ text: `\nScreenshots captured: ${result.screenshots.length}`
385
+ });
386
+ }
387
+ if (result.errors.length > 0) {
388
+ content.push({
389
+ type: 'text',
390
+ text: `\nErrors:\n${result.errors.join('\n')}`
391
+ });
392
+ }
393
+ return { content };
394
+ });
395
+ // ============================================================
120
396
  // Server startup
121
397
  // ============================================================
122
398
  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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -22,3 +22,9 @@ export interface MCPToolResponse {
22
22
  isError?: boolean;
23
23
  [key: string]: unknown;
24
24
  }
25
+ export interface ToolContext {
26
+ chromeClient?: any;
27
+ projectDir?: string;
28
+ port?: number;
29
+ cdpPort?: number;
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudu-cli/fronted-preview-mcp",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0-beta.2",
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
- "typescript": "^5.7.0",
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"
@@ -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
- | chrome-devtools `navigate_page` | 打开 URL | 拿到 URL 后立即使用 |
25
- | chrome-devtools `list_console_messages` | 检查 console 错误 | 页面加载完成后 |
26
- | chrome-devtools `take_snapshot` | 获取页面结构 | 需要分析渲染结果时 |
27
- | chrome-devtools `take_screenshot` | 页面截图 | 用户明确要求视觉确认时 |
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 选择器,或进入交互式拾取模式