frontend-guardian-core 3.7.0 → 3.7.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.
package/bin/fg-core.js CHANGED
@@ -67,6 +67,10 @@ import {
67
67
  FileWatcher,
68
68
  parseAllRoutes,
69
69
  findRouteFiles,
70
+ runPageHealthCheck,
71
+ isPlaywrightAvailable,
72
+ formatPageHealthReport,
73
+ formatPageHealthJson,
70
74
  } from "../dist/index.js";
71
75
  import pc from "picocolors";
72
76
  import { runWatchMode } from "./watch-mode.js";
@@ -101,7 +105,7 @@ const MODULE_RULES = {
101
105
 
102
106
  function showHelp() {
103
107
  console.log(`
104
- Frontend Guardian Core v3.7.0
108
+ Frontend Guardian Core v3.7.2
105
109
 
106
110
  Usage:
107
111
  fg-core <project-dir> [options]
@@ -161,6 +165,13 @@ Options:
161
165
  --serve 扫描前启动本地看板服务(扫描完成后停止)
162
166
  --e2e-detect-gaps 检测 E2E 测试覆盖缺口(页面 + 接口)
163
167
  --e2e-run 运行 Playwright E2E 测试并输出治理报告
168
+ --page-health 页面健康检查:遍历路由验证渲染、控制台错误、白屏
169
+ --serve <cmd> 自动启动 dev server(配合 --page-health,如 "npm run dev")
170
+ --port <n> dev server 端口(默认 5173,配合 --serve)
171
+ --routes <list> 指定要检查的路由(逗号分隔,配合 --page-health)
172
+ --base-url <url> 指定基础 URL(如 http://localhost:3000,配合 --page-health)
173
+ --no-screenshot 禁用截图(配合 --page-health)
174
+ --page-health-concurrency <n> 页面健康检查并发数(默认 3,配合 --page-health)
164
175
  --build-index 建立项目索引(预索引文件结构、符号、路由)
165
176
  --watch-index 监听文件变更并自动同步索引
166
177
  --index-status 查看项目索引状态
@@ -240,6 +251,13 @@ async function main() {
240
251
  serve: false,
241
252
  e2eDetectGaps: false,
242
253
  e2eRun: false,
254
+ pageHealth: false,
255
+ serveCommand: undefined,
256
+ servePort: undefined,
257
+ routes: undefined,
258
+ baseUrl: undefined,
259
+ screenshot: true,
260
+ pageHealthConcurrency: 3,
243
261
  buildIndex: false,
244
262
  watchIndex: false,
245
263
  indexStatus: false,
@@ -416,6 +434,27 @@ async function main() {
416
434
  case "--e2e-run":
417
435
  options.e2eRun = true;
418
436
  break;
437
+ case "--page-health":
438
+ options.pageHealth = true;
439
+ break;
440
+ case "--serve":
441
+ options.serveCommand = args[++i];
442
+ break;
443
+ case "--port":
444
+ options.servePort = parseInt(args[++i], 10) || 5173;
445
+ break;
446
+ case "--routes":
447
+ options.routes = args[++i].split(",");
448
+ break;
449
+ case "--base-url":
450
+ options.baseUrl = args[++i];
451
+ break;
452
+ case "--no-screenshot":
453
+ options.screenshot = false;
454
+ break;
455
+ case "--page-health-concurrency":
456
+ options.pageHealthConcurrency = parseInt(args[++i], 10) || 3;
457
+ break;
419
458
  case "--build-index":
420
459
  options.buildIndex = true;
421
460
  break;
@@ -491,6 +530,66 @@ async function main() {
491
530
  process.exit(issues.length > 0 ? 1 : 0);
492
531
  }
493
532
 
533
+ // v3.7.1: 页面健康检查
534
+ if (options.pageHealth) {
535
+ if (!isPlaywrightAvailable()) {
536
+ console.log(pc.yellow("⚠️ 未检测到 Playwright。页面健康检查需要 Playwright 支持。"));
537
+ console.log(pc.gray(" 安装: npm install -D playwright"));
538
+ console.log(pc.gray(" 安装浏览器: npx playwright install chromium"));
539
+ process.exit(1);
540
+ }
541
+
542
+ if (!options.baseUrl && !options.serveCommand) {
543
+ console.log(pc.yellow("⚠️ 请指定 --base-url 或 --serve"));
544
+ console.log(pc.gray(" 示例: fg-core . --page-health --serve \"npm run dev\" --port 5173"));
545
+ console.log(pc.gray(" 示例: fg-core . --page-health --base-url http://localhost:3000"));
546
+ process.exit(1);
547
+ }
548
+
549
+ console.log(pc.cyan("🌐 正在执行页面健康检查..."));
550
+ if (options.serveCommand) {
551
+ console.log(pc.gray(` 启动 dev server: ${options.serveCommand}`));
552
+ }
553
+ console.log(pc.gray(` 基础 URL: ${options.baseUrl || `http://localhost:${options.servePort || 5173}`}`));
554
+ console.log("");
555
+
556
+ try {
557
+ const result = await runPageHealthCheck({
558
+ projectDir: options.projectDir,
559
+ routes: options.routes,
560
+ baseUrl: options.baseUrl,
561
+ serveCommand: options.serveCommand,
562
+ servePort: options.servePort,
563
+ screenshot: options.screenshot,
564
+ concurrency: options.pageHealthConcurrency,
565
+ });
566
+
567
+ if (options.json) {
568
+ console.log(JSON.stringify(formatPageHealthJson(result), null, 2));
569
+ } else {
570
+ console.log(formatPageHealthReport(result));
571
+ console.log("");
572
+
573
+ if (result.issues.length > 0) {
574
+ console.log(pc.cyan(`📋 发现 ${result.issues.length} 个问题:`));
575
+ for (const issue of result.issues) {
576
+ const color = issue.severity === "critical" ? pc.red : issue.severity === "warning" ? pc.yellow : pc.blue;
577
+ console.log(color(` [${issue.severity.toUpperCase()}] ${issue.title}`));
578
+ console.log(pc.gray(` ${issue.description.split("\n")[0]}`));
579
+ }
580
+ } else {
581
+ console.log(pc.green("✅ 所有页面检查通过"));
582
+ }
583
+ }
584
+
585
+ const hasError = result.issues.some((i) => i.severity === "critical");
586
+ process.exit(hasError ? 1 : 0);
587
+ } catch (err) {
588
+ console.error(pc.red("❌ 页面健康检查失败:"), err instanceof Error ? err.message : String(err));
589
+ process.exit(1);
590
+ }
591
+ }
592
+
494
593
  // v3.7.0: 索引状态查看
495
594
  if (options.indexStatus) {
496
595
  const indexer = new ProjectIndexer(options.projectDir);
package/bin/fg-lsp.js CHANGED
@@ -26,7 +26,7 @@ for (let i = 0; i < args.length; i++) {
26
26
  } else if (arg === "--severity" || arg === "-s") {
27
27
  minSeverity = args[++i] ?? "suggestion";
28
28
  } else if (arg === "--help" || arg === "-h") {
29
- console.log(`Frontend Guardian LSP Server v3.7.0
29
+ console.log(`Frontend Guardian LSP Server v3.7.2
30
30
 
31
31
  Usage: fg-lsp [options]
32
32
 
package/bin/fg-server.js CHANGED
@@ -9,7 +9,7 @@ import pc from "picocolors";
9
9
 
10
10
  function showHelp() {
11
11
  console.log(`
12
- Frontend Guardian Dashboard Server v3.7.0
12
+ Frontend Guardian Dashboard Server v3.7.2
13
13
 
14
14
  Usage:
15
15
  fg-server [options]
@@ -61,7 +61,7 @@ async function main() {
61
61
  }
62
62
 
63
63
  console.log(pc.cyan("Frontend Guardian Dashboard Server"));
64
- console.log(pc.gray(` Version: 3.5.2`));
64
+ console.log(pc.gray(` Version: 3.7.2`));
65
65
  console.log("");
66
66
 
67
67
  const server = new DashboardServer({
package/dist/index.d.ts CHANGED
@@ -41,8 +41,8 @@ export { generatePRComment, generatePRCommentSummary, COMMENT_MARKER, isGuardian
41
41
  export type { CommentMeta } from "./formatters/pr-comment.js";
42
42
  export { GitHubPRPublisher, GitLabMRPublisher, detectPublisherConfig, createPublisher, autoPublishComment, } from "./utils/pr-publisher.js";
43
43
  export type { PublishResult, PublisherConfig, PRPublisher } from "./utils/pr-publisher.js";
44
- export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, playwrightIntegration, runAllExternalTools, } from "./integrations/index.js";
45
- export type { ExternalTool, ExternalToolResult } from "./integrations/index.js";
44
+ export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, playwrightIntegration, runAllExternalTools, runPageHealthCheck, isPlaywrightAvailable, formatPageHealthReport, formatPageHealthJson, } from "./integrations/index.js";
45
+ export type { ExternalTool, ExternalToolResult, PageHealthOptions, PageHealthResult, CheckedRoute, } from "./integrations/index.js";
46
46
  export { i18nRules } from "./scanners/i18n-scanner.js";
47
47
  export { performanceRules } from "./scanners/performance-scanner.js";
48
48
  export { a11yRules } from "./scanners/a11y-scanner.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,8 +5,8 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.writeJobSummary = exports.isGitHubActions = exports.formatAllAnnotations = exports.formatIssuesAnnotations = exports.formatIssueAnnotation = exports.formatSarif = exports.generateSarif = exports.toBaselineIssue = exports.saveBaseline = exports.loadBaseline = exports.generateBaseline = exports.compareWithBaseline = exports.BaselineManager = exports.detectFixBotConfig = exports.runFixBot = exports.detectUploadConfig = exports.uploadReport = exports.formatHistoryCompareJson = exports.formatHistoryCompare = exports.compareHistoryReports = exports.generateAIFixSuggestions = exports.detectAIConfig = exports.AIFixSuggester = exports.formatWorkspaceJson = exports.formatWorkspaceReport = exports.scanWorkspace = exports.analyzeCrossPackageDeps = exports.detectMonorepo = exports.generateDashboard = exports.HistoryReport = exports.detectCIProvider = exports.generateCIConfig = exports.detectHusky = exports.hasGitHook = exports.uninstallGitHooks = exports.installGitHooks = exports.generateDefaultConfig = exports.initConfig = exports.loadConfig = exports.detectProjectMeta = exports.getAdaptiveConcurrency = exports.walkAST = exports.hasImport = exports.getImports = exports.parseAST = exports.createRegistry = exports.RuleRegistry = exports.SmartCache = exports.createEngine = exports.RuleEngine = void 0;
8
- exports.DashboardServer = exports.getJSXTagName = exports.getFileExt = exports.registerComplianceMapping = exports.getComplianceMapping = exports.saveComplianceReport = exports.complianceReportToMarkdown = exports.generateComplianceReport = exports.loadBaselineAsync = exports.downloadBaseline = exports.buildNotificationPayload = exports.detectNotificationConfig = exports.sendNotifications = exports.matchOwner = exports.loadCodeowners = exports.parseCodeowners = exports.findCodeowners = exports.CodeownersParser = exports.runLSPServer = exports.createIncrementalDiagnostic = exports.IncrementalDiagnostic = exports.formatE2EGapJson = exports.formatE2EGapReport = exports.detectE2EGaps = exports.e2eRules = exports.svelteRules = exports.platformRules = exports.hooksRules = exports.componentRules = exports.crossFileRules = exports.namingRules = exports.securityRules = exports.a11yRules = exports.performanceRules = exports.i18nRules = exports.runAllExternalTools = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.allExternalTools = exports.autoPublishComment = exports.createPublisher = exports.detectPublisherConfig = exports.GitLabMRPublisher = exports.GitHubPRPublisher = exports.isGuardianComment = exports.COMMENT_MARKER = exports.generatePRCommentSummary = exports.generatePRComment = void 0;
9
- exports.detectRouteFramework = exports.parseVueRouterConfig = exports.parseReactRouterConfig = exports.parseTaroRoutes = exports.parseUniAppRoutes = exports.parseNuxtRoutes = exports.parseNextJsRoutes = exports.findRouteFiles = exports.parseAllRoutes = exports.parseRoutes = exports.watchProject = exports.FileWatcher = exports.ProjectIndexer = exports.detectDashboardConfig = exports.uploadToDashboardServer = exports.generateDashboardHtml = void 0;
8
+ exports.getComplianceMapping = exports.saveComplianceReport = exports.complianceReportToMarkdown = exports.generateComplianceReport = exports.loadBaselineAsync = exports.downloadBaseline = exports.buildNotificationPayload = exports.detectNotificationConfig = exports.sendNotifications = exports.matchOwner = exports.loadCodeowners = exports.parseCodeowners = exports.findCodeowners = exports.CodeownersParser = exports.runLSPServer = exports.createIncrementalDiagnostic = exports.IncrementalDiagnostic = exports.formatE2EGapJson = exports.formatE2EGapReport = exports.detectE2EGaps = exports.e2eRules = exports.svelteRules = exports.platformRules = exports.hooksRules = exports.componentRules = exports.crossFileRules = exports.namingRules = exports.securityRules = exports.a11yRules = exports.performanceRules = exports.i18nRules = exports.formatPageHealthJson = exports.formatPageHealthReport = exports.isPlaywrightAvailable = exports.runPageHealthCheck = exports.runAllExternalTools = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.allExternalTools = exports.autoPublishComment = exports.createPublisher = exports.detectPublisherConfig = exports.GitLabMRPublisher = exports.GitHubPRPublisher = exports.isGuardianComment = exports.COMMENT_MARKER = exports.generatePRCommentSummary = exports.generatePRComment = void 0;
9
+ exports.detectRouteFramework = exports.parseVueRouterConfig = exports.parseReactRouterConfig = exports.parseTaroRoutes = exports.parseUniAppRoutes = exports.parseNuxtRoutes = exports.parseNextJsRoutes = exports.findRouteFiles = exports.parseAllRoutes = exports.parseRoutes = exports.watchProject = exports.FileWatcher = exports.ProjectIndexer = exports.detectDashboardConfig = exports.uploadToDashboardServer = exports.generateDashboardHtml = exports.DashboardServer = exports.getJSXTagName = exports.getFileExt = exports.registerComplianceMapping = void 0;
10
10
  var rule_engine_js_1 = require("./engine/rule-engine.js");
11
11
  Object.defineProperty(exports, "RuleEngine", { enumerable: true, get: function () { return rule_engine_js_1.RuleEngine; } });
12
12
  Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return rule_engine_js_1.createEngine; } });
@@ -107,6 +107,10 @@ Object.defineProperty(exports, "typescriptIntegration", { enumerable: true, get:
107
107
  Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get: function () { return index_js_1.stylelintIntegration; } });
108
108
  Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return index_js_1.playwrightIntegration; } });
109
109
  Object.defineProperty(exports, "runAllExternalTools", { enumerable: true, get: function () { return index_js_1.runAllExternalTools; } });
110
+ Object.defineProperty(exports, "runPageHealthCheck", { enumerable: true, get: function () { return index_js_1.runPageHealthCheck; } });
111
+ Object.defineProperty(exports, "isPlaywrightAvailable", { enumerable: true, get: function () { return index_js_1.isPlaywrightAvailable; } });
112
+ Object.defineProperty(exports, "formatPageHealthReport", { enumerable: true, get: function () { return index_js_1.formatPageHealthReport; } });
113
+ Object.defineProperty(exports, "formatPageHealthJson", { enumerable: true, get: function () { return index_js_1.formatPageHealthJson; } });
110
114
  var i18n_scanner_js_1 = require("./scanners/i18n-scanner.js");
111
115
  Object.defineProperty(exports, "i18nRules", { enumerable: true, get: function () { return i18n_scanner_js_1.i18nRules; } });
112
116
  var performance_scanner_js_1 = require("./scanners/performance-scanner.js");
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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"}
@@ -12,6 +12,8 @@ export { _typescriptIntegration as typescriptIntegration };
12
12
  export { _stylelintIntegration as stylelintIntegration };
13
13
  import { playwrightIntegration as _playwrightIntegration } from "./playwright.js";
14
14
  export { _playwrightIntegration as playwrightIntegration };
15
+ export { runPageHealthCheck, isPlaywrightAvailable, formatPageHealthReport, formatPageHealthJson, } from "./page-health.js";
16
+ export type { PageHealthOptions, PageHealthResult, CheckedRoute, } from "./page-health.js";
15
17
  /** 所有可用的外部工具列表 */
16
18
  export declare const allExternalTools: import("./base.js").ExternalTool[];
17
19
  export { detectFormatter, runFormat } from "./formatter.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;AACnD,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAC3D,OAAO,EAAE,qBAAqB,IAAI,oBAAoB,EAAE,CAAC;AAGzD,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAE3D,kBAAkB;AAClB,eAAO,MAAM,gBAAgB,oCAK5B,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;AACnD,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAC3D,OAAO,EAAE,qBAAqB,IAAI,oBAAoB,EAAE,CAAC;AAGzD,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAG3D,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACR,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACf,MAAM,kBAAkB,CAAC;AAE1B,kBAAkB;AAClB,eAAO,MAAM,gBAAgB,oCAK5B,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Phase 4: 覆盖全面化 — 集成 ESLint / TypeScript / Stylelint
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.runFormat = exports.detectFormatter = exports.allExternalTools = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.hasPackage = exports.eslintSeverityToFg = exports.runCommand = exports.runAllExternalTools = void 0;
7
+ exports.runFormat = exports.detectFormatter = exports.allExternalTools = exports.formatPageHealthJson = exports.formatPageHealthReport = exports.isPlaywrightAvailable = exports.runPageHealthCheck = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.hasPackage = exports.eslintSeverityToFg = exports.runCommand = exports.runAllExternalTools = void 0;
8
8
  var base_js_1 = require("./base.js");
9
9
  Object.defineProperty(exports, "runAllExternalTools", { enumerable: true, get: function () { return base_js_1.runAllExternalTools; } });
10
10
  Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return base_js_1.runCommand; } });
@@ -19,6 +19,12 @@ Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get:
19
19
  // v3.6.1: Playwright E2E 测试集成
20
20
  const playwright_js_1 = require("./playwright.js");
21
21
  Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return playwright_js_1.playwrightIntegration; } });
22
+ // v3.7.1: 页面健康检查
23
+ var page_health_js_1 = require("./page-health.js");
24
+ Object.defineProperty(exports, "runPageHealthCheck", { enumerable: true, get: function () { return page_health_js_1.runPageHealthCheck; } });
25
+ Object.defineProperty(exports, "isPlaywrightAvailable", { enumerable: true, get: function () { return page_health_js_1.isPlaywrightAvailable; } });
26
+ Object.defineProperty(exports, "formatPageHealthReport", { enumerable: true, get: function () { return page_health_js_1.formatPageHealthReport; } });
27
+ Object.defineProperty(exports, "formatPageHealthJson", { enumerable: true, get: function () { return page_health_js_1.formatPageHealthJson; } });
22
28
  /** 所有可用的外部工具列表 */
23
29
  exports.allExternalTools = [
24
30
  eslint_js_1.eslintIntegration,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAA4F;AAAnF,8GAAA,mBAAmB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAExE,2CAAsE;AAIvC,kGAJD,6BAAkB,OAIA;AAHhD,mDAAkF;AAI/C,sGAJD,qCAAsB,OAIA;AAHxD,iDAA+E;AAI7C,qGAJD,mCAAqB,OAIA;AAEtD,8BAA8B;AAC9B,mDAAkF;AAC/C,sGADD,qCAAsB,OACA;AAExD,kBAAkB;AACL,QAAA,gBAAgB,GAAG;IAC5B,6BAAkB;IAClB,qCAAsB;IACtB,mCAAqB;IACrB,qCAAsB;CACzB,CAAC;AAEF,oBAAoB;AACpB,+CAA4D;AAAnD,+GAAA,eAAe,OAAA;AAAE,yGAAA,SAAS,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAA4F;AAAnF,8GAAA,mBAAmB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAExE,2CAAsE;AAIvC,kGAJD,6BAAkB,OAIA;AAHhD,mDAAkF;AAI/C,sGAJD,qCAAsB,OAIA;AAHxD,iDAA+E;AAI7C,qGAJD,mCAAqB,OAIA;AAEtD,8BAA8B;AAC9B,mDAAkF;AAC/C,sGADD,qCAAsB,OACA;AAExD,iBAAiB;AACjB,mDAK0B;AAJtB,oHAAA,kBAAkB,OAAA;AAClB,uHAAA,qBAAqB,OAAA;AACrB,wHAAA,sBAAsB,OAAA;AACtB,sHAAA,oBAAoB,OAAA;AAQxB,kBAAkB;AACL,QAAA,gBAAgB,GAAG;IAC5B,6BAAkB;IAClB,qCAAsB;IACtB,mCAAqB;IACrB,qCAAsB;CACzB,CAAC;AAEF,oBAAoB;AACpB,+CAA4D;AAAnD,+GAAA,eAAe,OAAA;AAAE,yGAAA,SAAS,OAAA"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Page Health Check — 页面运行时健康检查(v3.7.1)
3
+ *
4
+ * 结合 webapp-testing skill 的侦察-行动模式,对项目路由进行运行时验证:
5
+ * 1. 启动浏览器(Playwright),访问每个路由
6
+ * 2. 等待 networkidle,确保动态内容加载完成
7
+ * 3. 捕获控制台日志、资源加载失败、页面白屏
8
+ * 4. 截图保存,供人工核查
9
+ * 5. 将异常转换为 frontend-guardian Issue 格式
10
+ *
11
+ * 设计哲学:Playwright 是可选依赖,未安装时给出友好提示,不强制引入。
12
+ */
13
+ import { type ChildProcess } from "node:child_process";
14
+ import type { Issue } from "../types.js";
15
+ export interface PageHealthOptions {
16
+ /** 项目根目录 */
17
+ projectDir: string;
18
+ /** 要检查的路由列表(不传则自动从索引获取) */
19
+ routes?: string[];
20
+ /** 基础 URL(如 http://localhost:5173) */
21
+ baseUrl?: string;
22
+ /** 启动 dev server 的命令(如 "npm run dev") */
23
+ serveCommand?: string;
24
+ /** dev server 端口 */
25
+ servePort?: number;
26
+ /** 单个页面检查超时(毫秒) */
27
+ timeout?: number;
28
+ /** 是否截图 */
29
+ screenshot?: boolean;
30
+ /** 是否检查控制台错误 */
31
+ checkConsole?: boolean;
32
+ /** 是否检查白屏 */
33
+ checkWhiteScreen?: boolean;
34
+ /** 是否检查资源加载失败 */
35
+ checkResources?: boolean;
36
+ /** 截图保存目录 */
37
+ screenshotDir?: string;
38
+ /** 并发检查的页面数量(默认 3) */
39
+ concurrency?: number;
40
+ }
41
+ export interface CheckedRoute {
42
+ /** 路由路径 */
43
+ path: string;
44
+ /** 完整访问 URL */
45
+ url: string;
46
+ /** 检查结果状态 */
47
+ status: "ok" | "error" | "warning";
48
+ /** HTTP 状态码 */
49
+ httpStatus?: number;
50
+ /** 控制台 Error 数量 */
51
+ consoleErrors: number;
52
+ /** 控制台 Warning 数量 */
53
+ consoleWarns: number;
54
+ /** 资源加载失败数量 */
55
+ resourceErrors: number;
56
+ /** 页面是否有可见内容 */
57
+ hasContent: boolean;
58
+ /** 检查耗时(毫秒) */
59
+ duration: number;
60
+ /** 错误信息列表 */
61
+ messages: string[];
62
+ }
63
+ export interface PageHealthResult {
64
+ /** 发现的 Issue */
65
+ issues: Issue[];
66
+ /** 每个路由的检查结果 */
67
+ checkedRoutes: CheckedRoute[];
68
+ /** 截图文件路径 */
69
+ screenshots: string[];
70
+ /** 总耗时(毫秒) */
71
+ duration: number;
72
+ /** 使用的 baseUrl */
73
+ baseUrl: string;
74
+ }
75
+ /**
76
+ * 检查 Playwright 是否可用
77
+ */
78
+ export declare function isPlaywrightAvailable(): boolean;
79
+ /**
80
+ * 启动 dev server 并等待端口就绪
81
+ */
82
+ export declare function startDevServer(command: string, port: number, projectDir: string): Promise<ChildProcess>;
83
+ /**
84
+ * 运行页面健康检查
85
+ *
86
+ * @returns 检查结果(Issue 列表 + 路由详情)
87
+ */
88
+ export declare function runPageHealthCheck(options: PageHealthOptions): Promise<PageHealthResult>;
89
+ /**
90
+ * 格式化页面健康检查结果为终端报告
91
+ */
92
+ export declare function formatPageHealthReport(result: PageHealthResult): string;
93
+ /**
94
+ * 格式化页面健康检查结果为 JSON
95
+ */
96
+ export declare function formatPageHealthJson(result: PageHealthResult): object;
97
+ //# sourceMappingURL=page-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-health.d.ts","sourceRoot":"","sources":["../../src/integrations/page-health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,MAAM,WAAW,iBAAiB;IAC9B,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IACzB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;IACnC,eAAe;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,gBAAgB;IAChB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,gBAAgB;IAChB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,aAAa;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAUD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAQ/C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAqDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgO9F;AA6GD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA+CvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgBrE"}
@@ -0,0 +1,459 @@
1
+ "use strict";
2
+ /**
3
+ * Page Health Check — 页面运行时健康检查(v3.7.1)
4
+ *
5
+ * 结合 webapp-testing skill 的侦察-行动模式,对项目路由进行运行时验证:
6
+ * 1. 启动浏览器(Playwright),访问每个路由
7
+ * 2. 等待 networkidle,确保动态内容加载完成
8
+ * 3. 捕获控制台日志、资源加载失败、页面白屏
9
+ * 4. 截图保存,供人工核查
10
+ * 5. 将异常转换为 frontend-guardian Issue 格式
11
+ *
12
+ * 设计哲学:Playwright 是可选依赖,未安装时给出友好提示,不强制引入。
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.isPlaywrightAvailable = isPlaywrightAvailable;
16
+ exports.startDevServer = startDevServer;
17
+ exports.runPageHealthCheck = runPageHealthCheck;
18
+ exports.formatPageHealthReport = formatPageHealthReport;
19
+ exports.formatPageHealthJson = formatPageHealthJson;
20
+ const node_child_process_1 = require("node:child_process");
21
+ const node_fs_1 = require("node:fs");
22
+ const node_path_1 = require("node:path");
23
+ const indexer_js_1 = require("../engine/indexer.js");
24
+ // ── 常量 ───────────────────────────────────────────────────────────────────
25
+ const DEFAULT_TIMEOUT = 30000;
26
+ const DEFAULT_SERVE_PORT = 5173;
27
+ const SCREENSHOT_DIR = ".frontend-guardian/screenshots";
28
+ // ── 核心函数 ───────────────────────────────────────────────────────────────
29
+ /**
30
+ * 检查 Playwright 是否可用
31
+ */
32
+ function isPlaywrightAvailable() {
33
+ try {
34
+ // 尝试 require playwright 包
35
+ const pwPath = require.resolve("playwright");
36
+ return !!pwPath;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * 启动 dev server 并等待端口就绪
44
+ */
45
+ async function startDevServer(command, port, projectDir) {
46
+ const parts = command.split(" ");
47
+ const [cmd, ...args] = parts;
48
+ const child = (0, node_child_process_1.spawn)(cmd, args, {
49
+ cwd: projectDir,
50
+ stdio: ["ignore", "pipe", "pipe"],
51
+ detached: false,
52
+ });
53
+ // 等待端口就绪(轮询检查)
54
+ const ready = await waitForPort(port, 30000);
55
+ if (!ready) {
56
+ child.kill();
57
+ throw new Error(`Dev server 未在 30 秒内在端口 ${port} 就绪`);
58
+ }
59
+ return child;
60
+ }
61
+ /**
62
+ * 轮询等待端口就绪
63
+ */
64
+ async function waitForPort(port, timeoutMs) {
65
+ const start = Date.now();
66
+ while (Date.now() - start < timeoutMs) {
67
+ try {
68
+ const net = await import("node:net");
69
+ const socket = net.createConnection(port, "127.0.0.1");
70
+ await new Promise((resolve, reject) => {
71
+ socket.once("connect", () => {
72
+ socket.destroy();
73
+ resolve();
74
+ });
75
+ socket.once("error", reject);
76
+ });
77
+ return true;
78
+ }
79
+ catch {
80
+ await sleep(500);
81
+ }
82
+ }
83
+ return false;
84
+ }
85
+ function sleep(ms) {
86
+ return new Promise((resolve) => setTimeout(resolve, ms));
87
+ }
88
+ /**
89
+ * 并发控制辅助函数 —— 限制同时运行的异步任务数量
90
+ */
91
+ async function runWithConcurrency(items, concurrency, fn) {
92
+ const queue = [...items];
93
+ const workers = Array.from({ length: concurrency }, async () => {
94
+ while (true) {
95
+ const item = queue.shift();
96
+ if (!item)
97
+ break;
98
+ try {
99
+ await fn(item);
100
+ }
101
+ catch {
102
+ // 单个任务失败不阻断其他任务(错误已在 fn 内处理)
103
+ }
104
+ }
105
+ });
106
+ await Promise.all(workers);
107
+ }
108
+ /**
109
+ * 运行页面健康检查
110
+ *
111
+ * @returns 检查结果(Issue 列表 + 路由详情)
112
+ */
113
+ async function runPageHealthCheck(options) {
114
+ const start = Date.now();
115
+ const projectDir = (0, node_path_1.resolve)(options.projectDir);
116
+ // 1. 检测 Playwright
117
+ if (!isPlaywrightAvailable()) {
118
+ throw new Error("未检测到 Playwright。请安装: npm install -D playwright\n" +
119
+ "然后安装浏览器: npx playwright install chromium");
120
+ }
121
+ // 动态导入 Playwright(避免在模块加载时失败)
122
+ // @ts-ignore — playwright 是可选依赖,运行时检测
123
+ const pw = await import("playwright");
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ const chromium = pw.chromium;
126
+ // 2. 确定要检查的路由
127
+ let routes = options.routes || [];
128
+ if (routes.length === 0) {
129
+ const indexer = new indexer_js_1.ProjectIndexer(projectDir);
130
+ if (indexer.isValid()) {
131
+ const indexedRoutes = indexer.getRoutes();
132
+ routes = indexedRoutes.map((r) => r.path);
133
+ }
134
+ }
135
+ if (routes.length === 0) {
136
+ throw new Error("未检测到路由。请先运行 `fg-core . --build-index` 建立索引," +
137
+ "或通过 --routes 指定要检查的路由");
138
+ }
139
+ // 3. 确定 baseUrl
140
+ let baseUrl = options.baseUrl;
141
+ let serverProcess = null;
142
+ if (!baseUrl && options.serveCommand) {
143
+ const port = options.servePort || DEFAULT_SERVE_PORT;
144
+ serverProcess = await startDevServer(options.serveCommand, port, projectDir);
145
+ baseUrl = `http://localhost:${port}`;
146
+ }
147
+ if (!baseUrl) {
148
+ throw new Error("必须指定 --base-url 或 --serve(自动启动 dev server)");
149
+ }
150
+ // 4. 准备截图目录
151
+ const screenshotDir = options.screenshotDir
152
+ ? (0, node_path_1.resolve)(projectDir, options.screenshotDir)
153
+ : (0, node_path_1.resolve)(projectDir, SCREENSHOT_DIR);
154
+ if (options.screenshot !== false) {
155
+ if (!(0, node_fs_1.existsSync)(screenshotDir)) {
156
+ (0, node_fs_1.mkdirSync)(screenshotDir, { recursive: true });
157
+ }
158
+ }
159
+ // 5. 启动浏览器
160
+ const browser = await chromium.launch({ headless: true });
161
+ const context = await browser.newContext({
162
+ viewport: { width: 1280, height: 720 },
163
+ });
164
+ const checkedRoutes = [];
165
+ const issues = [];
166
+ const screenshots = [];
167
+ const checkConsole = options.checkConsole !== false;
168
+ const checkWhiteScreen = options.checkWhiteScreen !== false;
169
+ const checkResources = options.checkResources !== false;
170
+ const timeout = options.timeout || DEFAULT_TIMEOUT;
171
+ const concurrency = options.concurrency || 3;
172
+ let completed = 0;
173
+ const checkRoute = async (route) => {
174
+ const pageStart = Date.now();
175
+ const url = baseUrl + (route.startsWith("/") ? route : "/" + route);
176
+ const page = await context.newPage();
177
+ // 收集控制台日志和资源错误
178
+ const consoleErrors = [];
179
+ const consoleWarns = [];
180
+ const resourceErrors = [];
181
+ if (checkConsole) {
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ page.on("console", (msg) => {
184
+ const text = msg.text();
185
+ if (msg.type() === "error") {
186
+ consoleErrors.push(text);
187
+ }
188
+ else if (msg.type() === "warning") {
189
+ consoleWarns.push(text);
190
+ }
191
+ });
192
+ }
193
+ if (checkResources) {
194
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
195
+ page.on("requestfailed", (request) => {
196
+ const failure = request.failure();
197
+ resourceErrors.push(`${request.url()} — ${failure?.errorText || "unknown"}`);
198
+ });
199
+ }
200
+ let httpStatus;
201
+ let hasContent = true;
202
+ let status = "ok";
203
+ const messages = [];
204
+ try {
205
+ // 导航到页面并等待加载
206
+ const response = await page.goto(url, {
207
+ waitUntil: "networkidle",
208
+ timeout,
209
+ });
210
+ httpStatus = response?.status();
211
+ // HTTP 错误
212
+ if (httpStatus && httpStatus >= 400) {
213
+ status = "error";
214
+ messages.push(`HTTP ${httpStatus}`);
215
+ }
216
+ // 白屏检测
217
+ if (checkWhiteScreen) {
218
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
219
+ const bodyText = await page.evaluate(() => {
220
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
221
+ const body = globalThis.document.body;
222
+ return body ? body.innerText.trim().length : 0;
223
+ });
224
+ hasContent = bodyText > 0;
225
+ if (!hasContent) {
226
+ status = status === "error" ? "error" : "warning";
227
+ messages.push("页面可能白屏(body 无可见内容)");
228
+ }
229
+ }
230
+ // 资源加载失败
231
+ if (resourceErrors.length > 0) {
232
+ status = status === "error" ? "error" : "warning";
233
+ messages.push(`${resourceErrors.length} 个资源加载失败`);
234
+ }
235
+ // 控制台错误
236
+ if (consoleErrors.length > 0) {
237
+ status = status === "error" ? "error" : "warning";
238
+ messages.push(`${consoleErrors.length} 个控制台 Error`);
239
+ }
240
+ // 控制台警告(不升级状态,只记录)
241
+ if (consoleWarns.length > 0) {
242
+ if (status === "ok")
243
+ status = "warning";
244
+ messages.push(`${consoleWarns.length} 个控制台 Warning`);
245
+ }
246
+ }
247
+ catch (err) {
248
+ status = "error";
249
+ messages.push(`导航失败: ${err instanceof Error ? err.message : String(err)}`);
250
+ }
251
+ // 截图
252
+ if (options.screenshot !== false) {
253
+ const safeName = route.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 80);
254
+ const screenshotPath = (0, node_path_1.join)(screenshotDir, `${safeName}.png`);
255
+ try {
256
+ await page.screenshot({ path: screenshotPath, fullPage: true });
257
+ screenshots.push(screenshotPath);
258
+ }
259
+ catch {
260
+ // 截图失败不阻断
261
+ }
262
+ }
263
+ await page.close();
264
+ const pageDuration = Date.now() - pageStart;
265
+ completed++;
266
+ const checkedRoute = {
267
+ path: route,
268
+ url,
269
+ status,
270
+ httpStatus,
271
+ consoleErrors: consoleErrors.length,
272
+ consoleWarns: consoleWarns.length,
273
+ resourceErrors: resourceErrors.length,
274
+ hasContent,
275
+ duration: pageDuration,
276
+ messages,
277
+ };
278
+ checkedRoutes.push(checkedRoute);
279
+ // 生成 Issue
280
+ if (status !== "ok") {
281
+ issues.push(...routeToIssues(checkedRoute, projectDir, consoleErrors, resourceErrors));
282
+ }
283
+ };
284
+ try {
285
+ await runWithConcurrency(routes, concurrency, checkRoute);
286
+ }
287
+ finally {
288
+ await browser.close();
289
+ if (serverProcess) {
290
+ serverProcess.kill();
291
+ }
292
+ }
293
+ return {
294
+ issues,
295
+ checkedRoutes,
296
+ screenshots,
297
+ duration: Date.now() - start,
298
+ baseUrl,
299
+ };
300
+ }
301
+ /**
302
+ * 将路由检查结果转换为 Issue 列表
303
+ */
304
+ function routeToIssues(route, projectDir, consoleErrors, resourceErrors) {
305
+ const issues = [];
306
+ // HTTP 错误
307
+ if (route.httpStatus && route.httpStatus >= 400) {
308
+ issues.push({
309
+ ruleId: "page-health-http-error",
310
+ title: `页面返回 HTTP ${route.httpStatus}`,
311
+ description: `路由 ${route.path} 返回 HTTP ${route.httpStatus},页面可能不存在或服务器异常。`,
312
+ severity: "critical",
313
+ file: route.path,
314
+ line: 1,
315
+ column: 1,
316
+ meta: {
317
+ url: route.url,
318
+ httpStatus: route.httpStatus,
319
+ },
320
+ });
321
+ }
322
+ // 白屏
323
+ if (!route.hasContent) {
324
+ issues.push({
325
+ ruleId: "page-health-white-screen",
326
+ title: "页面可能白屏",
327
+ description: `路由 ${route.path} 加载后 body 无可见内容,可能为白屏或 JS 渲染异常。`,
328
+ severity: "critical",
329
+ file: route.path,
330
+ line: 1,
331
+ column: 1,
332
+ meta: {
333
+ url: route.url,
334
+ },
335
+ });
336
+ }
337
+ // 控制台错误
338
+ if (consoleErrors.length > 0) {
339
+ const uniqueErrors = [...new Set(consoleErrors)].slice(0, 5);
340
+ issues.push({
341
+ ruleId: "page-health-console-error",
342
+ title: `页面控制台报错 (${consoleErrors.length} 个)`,
343
+ description: `路由 ${route.path} 控制台出现 Error 日志。前 ${uniqueErrors.length} 条:\n` +
344
+ uniqueErrors.map((e) => ` - ${e}`).join("\n"),
345
+ severity: "warning",
346
+ file: route.path,
347
+ line: 1,
348
+ column: 1,
349
+ meta: {
350
+ url: route.url,
351
+ errorCount: consoleErrors.length,
352
+ errors: uniqueErrors,
353
+ },
354
+ });
355
+ }
356
+ // 资源加载失败
357
+ if (resourceErrors.length > 0) {
358
+ const uniqueResources = [...new Set(resourceErrors)].slice(0, 5);
359
+ issues.push({
360
+ ruleId: "page-health-resource-error",
361
+ title: `资源加载失败 (${resourceErrors.length} 个)`,
362
+ description: `路由 ${route.path} 有资源加载失败。前 ${uniqueResources.length} 个:\n` +
363
+ uniqueResources.map((r) => ` - ${r}`).join("\n"),
364
+ severity: "warning",
365
+ file: route.path,
366
+ line: 1,
367
+ column: 1,
368
+ meta: {
369
+ url: route.url,
370
+ resourceCount: resourceErrors.length,
371
+ resources: uniqueResources,
372
+ },
373
+ });
374
+ }
375
+ // 导航失败(非 HTTP 错误,而是超时/连接失败等)
376
+ if (route.status === "error" && !route.httpStatus && route.messages.some((m) => m.includes("导航失败"))) {
377
+ issues.push({
378
+ ruleId: "page-health-navigation-failed",
379
+ title: "页面导航失败",
380
+ description: `路由 ${route.path} 无法访问: ${route.messages.find((m) => m.includes("导航失败"))}`,
381
+ severity: "critical",
382
+ file: route.path,
383
+ line: 1,
384
+ column: 1,
385
+ meta: {
386
+ url: route.url,
387
+ },
388
+ });
389
+ }
390
+ return issues;
391
+ }
392
+ // ── 格式化输出 ─────────────────────────────────────────────────────────────
393
+ /**
394
+ * 格式化页面健康检查结果为终端报告
395
+ */
396
+ function formatPageHealthReport(result) {
397
+ const lines = [];
398
+ lines.push("🌐 页面健康检查报告");
399
+ lines.push(` 基础 URL: ${result.baseUrl}`);
400
+ lines.push(` 检查路由: ${result.checkedRoutes.length} 个`);
401
+ lines.push(` 总耗时: ${result.duration}ms`);
402
+ lines.push("");
403
+ const okCount = result.checkedRoutes.filter((r) => r.status === "ok").length;
404
+ const warnCount = result.checkedRoutes.filter((r) => r.status === "warning").length;
405
+ const errorCount = result.checkedRoutes.filter((r) => r.status === "error").length;
406
+ lines.push(` ✅ 正常: ${okCount} | ⚠️ 警告: ${warnCount} | ❌ 错误: ${errorCount}`);
407
+ lines.push("");
408
+ for (const route of result.checkedRoutes) {
409
+ const icon = route.status === "ok" ? "✅" : route.status === "warning" ? "⚠️" : "❌";
410
+ lines.push(` ${icon} ${route.path}`);
411
+ if (route.httpStatus) {
412
+ lines.push(` HTTP: ${route.httpStatus}`);
413
+ }
414
+ if (route.consoleErrors > 0) {
415
+ lines.push(` 控制台 Error: ${route.consoleErrors}`);
416
+ }
417
+ if (route.resourceErrors > 0) {
418
+ lines.push(` 资源失败: ${route.resourceErrors}`);
419
+ }
420
+ if (!route.hasContent) {
421
+ lines.push(` ⚠️ 页面可能白屏`);
422
+ }
423
+ if (route.duration > 5000) {
424
+ lines.push(` ⏱️ 加载耗时: ${route.duration}ms`);
425
+ }
426
+ }
427
+ if (result.screenshots.length > 0) {
428
+ lines.push("");
429
+ lines.push(` 📸 截图已保存 (${result.screenshots.length} 张)`);
430
+ for (const s of result.screenshots.slice(0, 5)) {
431
+ lines.push(` ${s}`);
432
+ }
433
+ if (result.screenshots.length > 5) {
434
+ lines.push(` ... 还有 ${result.screenshots.length - 5} 张`);
435
+ }
436
+ }
437
+ return lines.join("\n");
438
+ }
439
+ /**
440
+ * 格式化页面健康检查结果为 JSON
441
+ */
442
+ function formatPageHealthJson(result) {
443
+ return {
444
+ summary: {
445
+ baseUrl: result.baseUrl,
446
+ totalRoutes: result.checkedRoutes.length,
447
+ ok: result.checkedRoutes.filter((r) => r.status === "ok").length,
448
+ warning: result.checkedRoutes.filter((r) => r.status === "warning").length,
449
+ error: result.checkedRoutes.filter((r) => r.status === "error").length,
450
+ duration: result.duration,
451
+ issueCount: result.issues.length,
452
+ screenshotCount: result.screenshots.length,
453
+ },
454
+ routes: result.checkedRoutes,
455
+ issues: result.issues,
456
+ screenshots: result.screenshots,
457
+ };
458
+ }
459
+ //# sourceMappingURL=page-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-health.js","sourceRoot":"","sources":["../../src/integrations/page-health.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frontend-guardian-core",
3
- "version": "3.7.0",
3
+ "version": "3.7.2",
4
4
  "description": "Core analysis engine for frontend-guardian — AST-based scanning and auto-fixing",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",