frontend-guardian-core 3.7.0 → 3.7.1

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.1
105
109
 
106
110
  Usage:
107
111
  fg-core <project-dir> [options]
@@ -161,6 +165,12 @@ 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)
164
174
  --build-index 建立项目索引(预索引文件结构、符号、路由)
165
175
  --watch-index 监听文件变更并自动同步索引
166
176
  --index-status 查看项目索引状态
@@ -240,6 +250,12 @@ async function main() {
240
250
  serve: false,
241
251
  e2eDetectGaps: false,
242
252
  e2eRun: false,
253
+ pageHealth: false,
254
+ serveCommand: undefined,
255
+ servePort: undefined,
256
+ routes: undefined,
257
+ baseUrl: undefined,
258
+ screenshot: true,
243
259
  buildIndex: false,
244
260
  watchIndex: false,
245
261
  indexStatus: false,
@@ -416,6 +432,24 @@ async function main() {
416
432
  case "--e2e-run":
417
433
  options.e2eRun = true;
418
434
  break;
435
+ case "--page-health":
436
+ options.pageHealth = true;
437
+ break;
438
+ case "--serve":
439
+ options.serveCommand = args[++i];
440
+ break;
441
+ case "--port":
442
+ options.servePort = parseInt(args[++i], 10) || 5173;
443
+ break;
444
+ case "--routes":
445
+ options.routes = args[++i].split(",");
446
+ break;
447
+ case "--base-url":
448
+ options.baseUrl = args[++i];
449
+ break;
450
+ case "--no-screenshot":
451
+ options.screenshot = false;
452
+ break;
419
453
  case "--build-index":
420
454
  options.buildIndex = true;
421
455
  break;
@@ -491,6 +525,65 @@ async function main() {
491
525
  process.exit(issues.length > 0 ? 1 : 0);
492
526
  }
493
527
 
528
+ // v3.7.1: 页面健康检查
529
+ if (options.pageHealth) {
530
+ if (!isPlaywrightAvailable()) {
531
+ console.log(pc.yellow("⚠️ 未检测到 Playwright。页面健康检查需要 Playwright 支持。"));
532
+ console.log(pc.gray(" 安装: npm install -D playwright"));
533
+ console.log(pc.gray(" 安装浏览器: npx playwright install chromium"));
534
+ process.exit(1);
535
+ }
536
+
537
+ if (!options.baseUrl && !options.serveCommand) {
538
+ console.log(pc.yellow("⚠️ 请指定 --base-url 或 --serve"));
539
+ console.log(pc.gray(" 示例: fg-core . --page-health --serve \"npm run dev\" --port 5173"));
540
+ console.log(pc.gray(" 示例: fg-core . --page-health --base-url http://localhost:3000"));
541
+ process.exit(1);
542
+ }
543
+
544
+ console.log(pc.cyan("🌐 正在执行页面健康检查..."));
545
+ if (options.serveCommand) {
546
+ console.log(pc.gray(` 启动 dev server: ${options.serveCommand}`));
547
+ }
548
+ console.log(pc.gray(` 基础 URL: ${options.baseUrl || `http://localhost:${options.servePort || 5173}`}`));
549
+ console.log("");
550
+
551
+ try {
552
+ const result = await runPageHealthCheck({
553
+ projectDir: options.projectDir,
554
+ routes: options.routes,
555
+ baseUrl: options.baseUrl,
556
+ serveCommand: options.serveCommand,
557
+ servePort: options.servePort,
558
+ screenshot: options.screenshot,
559
+ });
560
+
561
+ if (options.json) {
562
+ console.log(JSON.stringify(formatPageHealthJson(result), null, 2));
563
+ } else {
564
+ console.log(formatPageHealthReport(result));
565
+ console.log("");
566
+
567
+ if (result.issues.length > 0) {
568
+ console.log(pc.cyan(`📋 发现 ${result.issues.length} 个问题:`));
569
+ for (const issue of result.issues) {
570
+ const color = issue.severity === "critical" ? pc.red : issue.severity === "warning" ? pc.yellow : pc.blue;
571
+ console.log(color(` [${issue.severity.toUpperCase()}] ${issue.title}`));
572
+ console.log(pc.gray(` ${issue.description.split("\n")[0]}`));
573
+ }
574
+ } else {
575
+ console.log(pc.green("✅ 所有页面检查通过"));
576
+ }
577
+ }
578
+
579
+ const hasError = result.issues.some((i) => i.severity === "critical");
580
+ process.exit(hasError ? 1 : 0);
581
+ } catch (err) {
582
+ console.error(pc.red("❌ 页面健康检查失败:"), err instanceof Error ? err.message : String(err));
583
+ process.exit(1);
584
+ }
585
+ }
586
+
494
587
  // v3.7.0: 索引状态查看
495
588
  if (options.indexStatus) {
496
589
  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.1
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.1
13
13
 
14
14
  Usage:
15
15
  fg-server [options]
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,95 @@
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
+ }
39
+ export interface CheckedRoute {
40
+ /** 路由路径 */
41
+ path: string;
42
+ /** 完整访问 URL */
43
+ url: string;
44
+ /** 检查结果状态 */
45
+ status: "ok" | "error" | "warning";
46
+ /** HTTP 状态码 */
47
+ httpStatus?: number;
48
+ /** 控制台 Error 数量 */
49
+ consoleErrors: number;
50
+ /** 控制台 Warning 数量 */
51
+ consoleWarns: number;
52
+ /** 资源加载失败数量 */
53
+ resourceErrors: number;
54
+ /** 页面是否有可见内容 */
55
+ hasContent: boolean;
56
+ /** 检查耗时(毫秒) */
57
+ duration: number;
58
+ /** 错误信息列表 */
59
+ messages: string[];
60
+ }
61
+ export interface PageHealthResult {
62
+ /** 发现的 Issue */
63
+ issues: Issue[];
64
+ /** 每个路由的检查结果 */
65
+ checkedRoutes: CheckedRoute[];
66
+ /** 截图文件路径 */
67
+ screenshots: string[];
68
+ /** 总耗时(毫秒) */
69
+ duration: number;
70
+ /** 使用的 baseUrl */
71
+ baseUrl: string;
72
+ }
73
+ /**
74
+ * 检查 Playwright 是否可用
75
+ */
76
+ export declare function isPlaywrightAvailable(): boolean;
77
+ /**
78
+ * 启动 dev server 并等待端口就绪
79
+ */
80
+ export declare function startDevServer(command: string, port: number, projectDir: string): Promise<ChildProcess>;
81
+ /**
82
+ * 运行页面健康检查
83
+ *
84
+ * @returns 检查结果(Issue 列表 + 路由详情)
85
+ */
86
+ export declare function runPageHealthCheck(options: PageHealthOptions): Promise<PageHealthResult>;
87
+ /**
88
+ * 格式化页面健康检查结果为终端报告
89
+ */
90
+ export declare function formatPageHealthReport(result: PageHealthResult): string;
91
+ /**
92
+ * 格式化页面健康检查结果为 JSON
93
+ */
94
+ export declare function formatPageHealthJson(result: PageHealthResult): object;
95
+ //# 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;CAC1B;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;AA8BD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0N9F;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,435 @@
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
+ * @returns 检查结果(Issue 列表 + 路由详情)
92
+ */
93
+ async function runPageHealthCheck(options) {
94
+ const start = Date.now();
95
+ const projectDir = (0, node_path_1.resolve)(options.projectDir);
96
+ // 1. 检测 Playwright
97
+ if (!isPlaywrightAvailable()) {
98
+ throw new Error("未检测到 Playwright。请安装: npm install -D playwright\n" +
99
+ "然后安装浏览器: npx playwright install chromium");
100
+ }
101
+ // 动态导入 Playwright(避免在模块加载时失败)
102
+ // @ts-ignore — playwright 是可选依赖,运行时检测
103
+ const pw = await import("playwright");
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ const chromium = pw.chromium;
106
+ // 2. 确定要检查的路由
107
+ let routes = options.routes || [];
108
+ if (routes.length === 0) {
109
+ const indexer = new indexer_js_1.ProjectIndexer(projectDir);
110
+ if (indexer.isValid()) {
111
+ const indexedRoutes = indexer.getRoutes();
112
+ routes = indexedRoutes.map((r) => r.path);
113
+ }
114
+ }
115
+ if (routes.length === 0) {
116
+ throw new Error("未检测到路由。请先运行 `fg-core . --build-index` 建立索引," +
117
+ "或通过 --routes 指定要检查的路由");
118
+ }
119
+ // 3. 确定 baseUrl
120
+ let baseUrl = options.baseUrl;
121
+ let serverProcess = null;
122
+ if (!baseUrl && options.serveCommand) {
123
+ const port = options.servePort || DEFAULT_SERVE_PORT;
124
+ serverProcess = await startDevServer(options.serveCommand, port, projectDir);
125
+ baseUrl = `http://localhost:${port}`;
126
+ }
127
+ if (!baseUrl) {
128
+ throw new Error("必须指定 --base-url 或 --serve(自动启动 dev server)");
129
+ }
130
+ // 4. 准备截图目录
131
+ const screenshotDir = options.screenshotDir
132
+ ? (0, node_path_1.resolve)(projectDir, options.screenshotDir)
133
+ : (0, node_path_1.resolve)(projectDir, SCREENSHOT_DIR);
134
+ if (options.screenshot !== false) {
135
+ if (!(0, node_fs_1.existsSync)(screenshotDir)) {
136
+ (0, node_fs_1.mkdirSync)(screenshotDir, { recursive: true });
137
+ }
138
+ }
139
+ // 5. 启动浏览器
140
+ const browser = await chromium.launch({ headless: true });
141
+ const context = await browser.newContext({
142
+ viewport: { width: 1280, height: 720 },
143
+ });
144
+ const checkedRoutes = [];
145
+ const issues = [];
146
+ const screenshots = [];
147
+ const checkConsole = options.checkConsole !== false;
148
+ const checkWhiteScreen = options.checkWhiteScreen !== false;
149
+ const checkResources = options.checkResources !== false;
150
+ const timeout = options.timeout || DEFAULT_TIMEOUT;
151
+ try {
152
+ for (const route of routes) {
153
+ const pageStart = Date.now();
154
+ const url = baseUrl + (route.startsWith("/") ? route : "/" + route);
155
+ const page = await context.newPage();
156
+ // 收集控制台日志和资源错误
157
+ const consoleErrors = [];
158
+ const consoleWarns = [];
159
+ const resourceErrors = [];
160
+ if (checkConsole) {
161
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
162
+ page.on("console", (msg) => {
163
+ const text = msg.text();
164
+ if (msg.type() === "error") {
165
+ consoleErrors.push(text);
166
+ }
167
+ else if (msg.type() === "warning") {
168
+ consoleWarns.push(text);
169
+ }
170
+ });
171
+ }
172
+ if (checkResources) {
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
+ page.on("requestfailed", (request) => {
175
+ const failure = request.failure();
176
+ resourceErrors.push(`${request.url()} — ${failure?.errorText || "unknown"}`);
177
+ });
178
+ }
179
+ let httpStatus;
180
+ let hasContent = true;
181
+ let status = "ok";
182
+ const messages = [];
183
+ try {
184
+ // 导航到页面并等待加载
185
+ const response = await page.goto(url, {
186
+ waitUntil: "networkidle",
187
+ timeout,
188
+ });
189
+ httpStatus = response?.status();
190
+ // HTTP 错误
191
+ if (httpStatus && httpStatus >= 400) {
192
+ status = "error";
193
+ messages.push(`HTTP ${httpStatus}`);
194
+ }
195
+ // 白屏检测
196
+ if (checkWhiteScreen) {
197
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
+ const bodyText = await page.evaluate(() => {
199
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
200
+ const body = globalThis.document.body;
201
+ return body ? body.innerText.trim().length : 0;
202
+ });
203
+ hasContent = bodyText > 0;
204
+ if (!hasContent) {
205
+ status = status === "error" ? "error" : "warning";
206
+ messages.push("页面可能白屏(body 无可见内容)");
207
+ }
208
+ }
209
+ // 资源加载失败
210
+ if (resourceErrors.length > 0) {
211
+ status = status === "error" ? "error" : "warning";
212
+ messages.push(`${resourceErrors.length} 个资源加载失败`);
213
+ }
214
+ // 控制台错误
215
+ if (consoleErrors.length > 0) {
216
+ status = status === "error" ? "error" : "warning";
217
+ messages.push(`${consoleErrors.length} 个控制台 Error`);
218
+ }
219
+ // 控制台警告(不升级状态,只记录)
220
+ if (consoleWarns.length > 0) {
221
+ if (status === "ok")
222
+ status = "warning";
223
+ messages.push(`${consoleWarns.length} 个控制台 Warning`);
224
+ }
225
+ }
226
+ catch (err) {
227
+ status = "error";
228
+ messages.push(`导航失败: ${err instanceof Error ? err.message : String(err)}`);
229
+ }
230
+ // 截图
231
+ if (options.screenshot !== false) {
232
+ const safeName = route.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 80);
233
+ const screenshotPath = (0, node_path_1.join)(screenshotDir, `${safeName}.png`);
234
+ try {
235
+ await page.screenshot({ path: screenshotPath, fullPage: true });
236
+ screenshots.push(screenshotPath);
237
+ }
238
+ catch {
239
+ // 截图失败不阻断
240
+ }
241
+ }
242
+ await page.close();
243
+ const pageDuration = Date.now() - pageStart;
244
+ const checkedRoute = {
245
+ path: route,
246
+ url,
247
+ status,
248
+ httpStatus,
249
+ consoleErrors: consoleErrors.length,
250
+ consoleWarns: consoleWarns.length,
251
+ resourceErrors: resourceErrors.length,
252
+ hasContent,
253
+ duration: pageDuration,
254
+ messages,
255
+ };
256
+ checkedRoutes.push(checkedRoute);
257
+ // 生成 Issue
258
+ if (status !== "ok") {
259
+ issues.push(...routeToIssues(checkedRoute, projectDir, consoleErrors, resourceErrors));
260
+ }
261
+ }
262
+ }
263
+ finally {
264
+ await browser.close();
265
+ if (serverProcess) {
266
+ serverProcess.kill();
267
+ }
268
+ }
269
+ return {
270
+ issues,
271
+ checkedRoutes,
272
+ screenshots,
273
+ duration: Date.now() - start,
274
+ baseUrl,
275
+ };
276
+ }
277
+ /**
278
+ * 将路由检查结果转换为 Issue 列表
279
+ */
280
+ function routeToIssues(route, projectDir, consoleErrors, resourceErrors) {
281
+ const issues = [];
282
+ // HTTP 错误
283
+ if (route.httpStatus && route.httpStatus >= 400) {
284
+ issues.push({
285
+ ruleId: "page-health-http-error",
286
+ title: `页面返回 HTTP ${route.httpStatus}`,
287
+ description: `路由 ${route.path} 返回 HTTP ${route.httpStatus},页面可能不存在或服务器异常。`,
288
+ severity: "critical",
289
+ file: route.path,
290
+ line: 1,
291
+ column: 1,
292
+ meta: {
293
+ url: route.url,
294
+ httpStatus: route.httpStatus,
295
+ },
296
+ });
297
+ }
298
+ // 白屏
299
+ if (!route.hasContent) {
300
+ issues.push({
301
+ ruleId: "page-health-white-screen",
302
+ title: "页面可能白屏",
303
+ description: `路由 ${route.path} 加载后 body 无可见内容,可能为白屏或 JS 渲染异常。`,
304
+ severity: "critical",
305
+ file: route.path,
306
+ line: 1,
307
+ column: 1,
308
+ meta: {
309
+ url: route.url,
310
+ },
311
+ });
312
+ }
313
+ // 控制台错误
314
+ if (consoleErrors.length > 0) {
315
+ const uniqueErrors = [...new Set(consoleErrors)].slice(0, 5);
316
+ issues.push({
317
+ ruleId: "page-health-console-error",
318
+ title: `页面控制台报错 (${consoleErrors.length} 个)`,
319
+ description: `路由 ${route.path} 控制台出现 Error 日志。前 ${uniqueErrors.length} 条:\n` +
320
+ uniqueErrors.map((e) => ` - ${e}`).join("\n"),
321
+ severity: "warning",
322
+ file: route.path,
323
+ line: 1,
324
+ column: 1,
325
+ meta: {
326
+ url: route.url,
327
+ errorCount: consoleErrors.length,
328
+ errors: uniqueErrors,
329
+ },
330
+ });
331
+ }
332
+ // 资源加载失败
333
+ if (resourceErrors.length > 0) {
334
+ const uniqueResources = [...new Set(resourceErrors)].slice(0, 5);
335
+ issues.push({
336
+ ruleId: "page-health-resource-error",
337
+ title: `资源加载失败 (${resourceErrors.length} 个)`,
338
+ description: `路由 ${route.path} 有资源加载失败。前 ${uniqueResources.length} 个:\n` +
339
+ uniqueResources.map((r) => ` - ${r}`).join("\n"),
340
+ severity: "warning",
341
+ file: route.path,
342
+ line: 1,
343
+ column: 1,
344
+ meta: {
345
+ url: route.url,
346
+ resourceCount: resourceErrors.length,
347
+ resources: uniqueResources,
348
+ },
349
+ });
350
+ }
351
+ // 导航失败(非 HTTP 错误,而是超时/连接失败等)
352
+ if (route.status === "error" && !route.httpStatus && route.messages.some((m) => m.includes("导航失败"))) {
353
+ issues.push({
354
+ ruleId: "page-health-navigation-failed",
355
+ title: "页面导航失败",
356
+ description: `路由 ${route.path} 无法访问: ${route.messages.find((m) => m.includes("导航失败"))}`,
357
+ severity: "critical",
358
+ file: route.path,
359
+ line: 1,
360
+ column: 1,
361
+ meta: {
362
+ url: route.url,
363
+ },
364
+ });
365
+ }
366
+ return issues;
367
+ }
368
+ // ── 格式化输出 ─────────────────────────────────────────────────────────────
369
+ /**
370
+ * 格式化页面健康检查结果为终端报告
371
+ */
372
+ function formatPageHealthReport(result) {
373
+ const lines = [];
374
+ lines.push("🌐 页面健康检查报告");
375
+ lines.push(` 基础 URL: ${result.baseUrl}`);
376
+ lines.push(` 检查路由: ${result.checkedRoutes.length} 个`);
377
+ lines.push(` 总耗时: ${result.duration}ms`);
378
+ lines.push("");
379
+ const okCount = result.checkedRoutes.filter((r) => r.status === "ok").length;
380
+ const warnCount = result.checkedRoutes.filter((r) => r.status === "warning").length;
381
+ const errorCount = result.checkedRoutes.filter((r) => r.status === "error").length;
382
+ lines.push(` ✅ 正常: ${okCount} | ⚠️ 警告: ${warnCount} | ❌ 错误: ${errorCount}`);
383
+ lines.push("");
384
+ for (const route of result.checkedRoutes) {
385
+ const icon = route.status === "ok" ? "✅" : route.status === "warning" ? "⚠️" : "❌";
386
+ lines.push(` ${icon} ${route.path}`);
387
+ if (route.httpStatus) {
388
+ lines.push(` HTTP: ${route.httpStatus}`);
389
+ }
390
+ if (route.consoleErrors > 0) {
391
+ lines.push(` 控制台 Error: ${route.consoleErrors}`);
392
+ }
393
+ if (route.resourceErrors > 0) {
394
+ lines.push(` 资源失败: ${route.resourceErrors}`);
395
+ }
396
+ if (!route.hasContent) {
397
+ lines.push(` ⚠️ 页面可能白屏`);
398
+ }
399
+ if (route.duration > 5000) {
400
+ lines.push(` ⏱️ 加载耗时: ${route.duration}ms`);
401
+ }
402
+ }
403
+ if (result.screenshots.length > 0) {
404
+ lines.push("");
405
+ lines.push(` 📸 截图已保存 (${result.screenshots.length} 张)`);
406
+ for (const s of result.screenshots.slice(0, 5)) {
407
+ lines.push(` ${s}`);
408
+ }
409
+ if (result.screenshots.length > 5) {
410
+ lines.push(` ... 还有 ${result.screenshots.length - 5} 张`);
411
+ }
412
+ }
413
+ return lines.join("\n");
414
+ }
415
+ /**
416
+ * 格式化页面健康检查结果为 JSON
417
+ */
418
+ function formatPageHealthJson(result) {
419
+ return {
420
+ summary: {
421
+ baseUrl: result.baseUrl,
422
+ totalRoutes: result.checkedRoutes.length,
423
+ ok: result.checkedRoutes.filter((r) => r.status === "ok").length,
424
+ warning: result.checkedRoutes.filter((r) => r.status === "warning").length,
425
+ error: result.checkedRoutes.filter((r) => r.status === "error").length,
426
+ duration: result.duration,
427
+ issueCount: result.issues.length,
428
+ screenshotCount: result.screenshots.length,
429
+ },
430
+ routes: result.checkedRoutes,
431
+ issues: result.issues,
432
+ screenshots: result.screenshots,
433
+ };
434
+ }
435
+ //# 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.1",
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",