frontend-guardian-core 3.5.2 → 3.6.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
@@ -18,6 +18,10 @@ import {
18
18
  hooksRules,
19
19
  platformRules,
20
20
  svelteRules,
21
+ e2eRules,
22
+ detectE2EGaps,
23
+ formatE2EGapReport,
24
+ formatE2EGapJson,
21
25
  installGitHooks,
22
26
  uninstallGitHooks,
23
27
  hasGitHook,
@@ -58,6 +62,7 @@ import {
58
62
  saveComplianceReport,
59
63
  uploadToDashboardServer,
60
64
  detectDashboardConfig,
65
+ playwrightIntegration,
61
66
  } from "../dist/index.js";
62
67
  import pc from "picocolors";
63
68
  import { runWatchMode } from "./watch-mode.js";
@@ -73,6 +78,7 @@ const MODULES = [
73
78
  "hooks",
74
79
  "platform",
75
80
  "svelte",
81
+ "e2e",
76
82
  ];
77
83
 
78
84
  const MODULE_RULES = {
@@ -86,18 +92,19 @@ const MODULE_RULES = {
86
92
  hooks: hooksRules,
87
93
  platform: platformRules,
88
94
  svelte: svelteRules,
95
+ e2e: e2eRules,
89
96
  };
90
97
 
91
98
  function showHelp() {
92
99
  console.log(`
93
- Frontend Guardian Core v3.5.2
100
+ Frontend Guardian Core v3.6.1
94
101
 
95
102
  Usage:
96
103
  fg-core <project-dir> [options]
97
104
 
98
105
  Options:
99
106
  --scan 全量扫描(等价于 --module all)
100
- --module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | all
107
+ --module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | e2e | all
101
108
  --severity <level> 最低严重级别: critical | warning | suggestion (默认: suggestion)
102
109
  --files <pattern> 仅扫描匹配的文件
103
110
  --exclude <pattern> 排除匹配的文件
@@ -148,6 +155,8 @@ Options:
148
155
  --compliance <file> 生成 SOC2/ISO27001 合规报告到指定文件
149
156
  --server <url> 扫描后上报到治理看板服务器
150
157
  --serve 扫描前启动本地看板服务(扫描完成后停止)
158
+ --e2e-detect-gaps 检测 E2E 测试覆盖缺口(页面 + 接口)
159
+ --e2e-run 运行 Playwright E2E 测试并输出治理报告
151
160
  --help, -h 显示帮助
152
161
 
153
162
  Examples:
@@ -222,6 +231,8 @@ async function main() {
222
231
  compliance: undefined,
223
232
  server: undefined,
224
233
  serve: false,
234
+ e2eDetectGaps: false,
235
+ e2eRun: false,
225
236
  };
226
237
 
227
238
  for (let i = 0; i < args.length; i++) {
@@ -389,6 +400,12 @@ async function main() {
389
400
  case "--serve":
390
401
  options.serve = true;
391
402
  break;
403
+ case "--e2e-detect-gaps":
404
+ options.e2eDetectGaps = true;
405
+ break;
406
+ case "--e2e-run":
407
+ options.e2eRun = true;
408
+ break;
392
409
  case "--help":
393
410
  case "-h":
394
411
  showHelp();
@@ -396,6 +413,65 @@ async function main() {
396
413
  }
397
414
  }
398
415
 
416
+ // v3.6.0: E2E 测试覆盖缺口检测
417
+ if (options.e2eDetectGaps) {
418
+ const gapResult = detectE2EGaps({ projectDir: options.projectDir });
419
+ if (options.json) {
420
+ console.log(JSON.stringify(formatE2EGapJson(gapResult), null, 2));
421
+ } else {
422
+ console.log(formatE2EGapReport(gapResult));
423
+ }
424
+ process.exit(gapResult.uncoveredPages.length + gapResult.uncoveredApis.length > 0 ? 1 : 0);
425
+ }
426
+
427
+ // v3.6.1: 运行 Playwright E2E 测试
428
+ if (options.e2eRun) {
429
+ if (!playwrightIntegration.isAvailable(options.projectDir)) {
430
+ console.log(pc.yellow("⚠️ 未检测到 Playwright 配置(playwright.config.ts/js)或 playwright 包未安装"));
431
+ console.log(pc.gray(" 请先安装 Playwright: npm install -D @playwright/test"));
432
+ console.log(pc.gray(" 或初始化配置: npx playwright init"));
433
+ process.exit(1);
434
+ }
435
+
436
+ console.log(pc.cyan("🎭 正在运行 Playwright E2E 测试..."));
437
+ console.log(pc.gray(" 这可能需要几分钟(取决于测试数量和浏览器启动时间)"));
438
+ console.log("");
439
+
440
+ const start = Date.now();
441
+ const issues = playwrightIntegration.run(options.projectDir);
442
+ const duration = Date.now() - start;
443
+
444
+ if (options.json) {
445
+ console.log(JSON.stringify({
446
+ tool: "Playwright",
447
+ total: issues.length,
448
+ duration,
449
+ issues,
450
+ }, null, 2));
451
+ } else {
452
+ console.log(pc.cyan(`📊 Playwright 测试结果`));
453
+ console.log(pc.gray(` 耗时: ${duration}ms`));
454
+ if (issues.length === 0) {
455
+ console.log(pc.green(` ✅ 所有测试通过`));
456
+ } else {
457
+ console.log(pc.red(` ❌ ${issues.length} 个测试失败`));
458
+ for (const issue of issues) {
459
+ const severityColor = issue.severity === "critical" ? pc.red : pc.yellow;
460
+ console.log(severityColor(` [${issue.severity.toUpperCase()}] ${issue.title}`));
461
+ console.log(pc.gray(` ${issue.file}:${issue.line}`));
462
+ if (issue.description) {
463
+ const descLines = issue.description.split("\n").slice(0, 3);
464
+ for (const dl of descLines) {
465
+ console.log(pc.gray(` ${dl}`));
466
+ }
467
+ }
468
+ }
469
+ }
470
+ }
471
+
472
+ process.exit(issues.length > 0 ? 1 : 0);
473
+ }
474
+
399
475
  // Phase 6: 特殊命令处理
400
476
  if (options.installHooks) {
401
477
  const hookType = ["pre-commit", "pre-push", "commit-msg", "both", "all"].includes(options.installHooksType)
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.3.0
29
+ console.log(`Frontend Guardian LSP Server v3.6.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.5.2
12
+ Frontend Guardian Dashboard Server v3.6.1
13
13
 
14
14
  Usage:
15
15
  fg-server [options]
package/dist/index.d.ts CHANGED
@@ -41,7 +41,7 @@ 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, runAllExternalTools, } from "./integrations/index.js";
44
+ export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, playwrightIntegration, runAllExternalTools, } from "./integrations/index.js";
45
45
  export type { ExternalTool, ExternalToolResult } from "./integrations/index.js";
46
46
  export { i18nRules } from "./scanners/i18n-scanner.js";
47
47
  export { performanceRules } from "./scanners/performance-scanner.js";
@@ -53,6 +53,9 @@ export { componentRules } from "./scanners/component-scanner.js";
53
53
  export { hooksRules } from "./scanners/hooks-scanner.js";
54
54
  export { platformRules } from "./scanners/platform-scanner.js";
55
55
  export { svelteRules } from "./scanners/svelte-scanner.js";
56
+ export { e2eRules } from "./scanners/e2e-scanner.js";
57
+ export { detectE2EGaps, formatE2EGapReport, formatE2EGapJson, } from "./utils/e2e-gap-detector.js";
58
+ export type { E2EGapResult, E2EGapOptions, UncoveredPage, UncoveredApi, TestSuggestion, } from "./utils/e2e-gap-detector.js";
56
59
  export { IncrementalDiagnostic, createIncrementalDiagnostic } from "./ide/incremental-diagnostic.js";
57
60
  export type { DiagnosticResult, IncrementalDiagnosticOptions } from "./ide/incremental-diagnostic.js";
58
61
  export { runLSPServer } from "./ide/lsp-server.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,7 +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.detectDashboardConfig = exports.uploadToDashboardServer = exports.generateDashboardHtml = 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.svelteRules = exports.platformRules = exports.hooksRules = exports.componentRules = exports.crossFileRules = exports.namingRules = exports.securityRules = exports.a11yRules = exports.performanceRules = exports.i18nRules = exports.runAllExternalTools = 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;
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.detectDashboardConfig = exports.uploadToDashboardServer = exports.generateDashboardHtml = void 0;
9
10
  var rule_engine_js_1 = require("./engine/rule-engine.js");
10
11
  Object.defineProperty(exports, "RuleEngine", { enumerable: true, get: function () { return rule_engine_js_1.RuleEngine; } });
11
12
  Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return rule_engine_js_1.createEngine; } });
@@ -104,6 +105,7 @@ Object.defineProperty(exports, "allExternalTools", { enumerable: true, get: func
104
105
  Object.defineProperty(exports, "eslintIntegration", { enumerable: true, get: function () { return index_js_1.eslintIntegration; } });
105
106
  Object.defineProperty(exports, "typescriptIntegration", { enumerable: true, get: function () { return index_js_1.typescriptIntegration; } });
106
107
  Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get: function () { return index_js_1.stylelintIntegration; } });
108
+ Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return index_js_1.playwrightIntegration; } });
107
109
  Object.defineProperty(exports, "runAllExternalTools", { enumerable: true, get: function () { return index_js_1.runAllExternalTools; } });
108
110
  var i18n_scanner_js_1 = require("./scanners/i18n-scanner.js");
109
111
  Object.defineProperty(exports, "i18nRules", { enumerable: true, get: function () { return i18n_scanner_js_1.i18nRules; } });
@@ -125,6 +127,13 @@ var platform_scanner_js_1 = require("./scanners/platform-scanner.js");
125
127
  Object.defineProperty(exports, "platformRules", { enumerable: true, get: function () { return platform_scanner_js_1.platformRules; } });
126
128
  var svelte_scanner_js_1 = require("./scanners/svelte-scanner.js");
127
129
  Object.defineProperty(exports, "svelteRules", { enumerable: true, get: function () { return svelte_scanner_js_1.svelteRules; } });
130
+ // v3.6.0: E2E 测试治理
131
+ var e2e_scanner_js_1 = require("./scanners/e2e-scanner.js");
132
+ Object.defineProperty(exports, "e2eRules", { enumerable: true, get: function () { return e2e_scanner_js_1.e2eRules; } });
133
+ var e2e_gap_detector_js_1 = require("./utils/e2e-gap-detector.js");
134
+ Object.defineProperty(exports, "detectE2EGaps", { enumerable: true, get: function () { return e2e_gap_detector_js_1.detectE2EGaps; } });
135
+ Object.defineProperty(exports, "formatE2EGapReport", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapReport; } });
136
+ Object.defineProperty(exports, "formatE2EGapJson", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapJson; } });
128
137
  // v3.3.0: IDE 集成
129
138
  var incremental_diagnostic_js_1 = require("./ide/incremental-diagnostic.js");
130
139
  Object.defineProperty(exports, "IncrementalDiagnostic", { enumerable: true, get: function () { return incremental_diagnostic_js_1.IncrementalDiagnostic; } });
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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"}
@@ -10,6 +10,8 @@ import { stylelintIntegration as _stylelintIntegration } from "./stylelint.js";
10
10
  export { _eslintIntegration as eslintIntegration };
11
11
  export { _typescriptIntegration as typescriptIntegration };
12
12
  export { _stylelintIntegration as stylelintIntegration };
13
+ import { playwrightIntegration as _playwrightIntegration } from "./playwright.js";
14
+ export { _playwrightIntegration as playwrightIntegration };
13
15
  /** 所有可用的外部工具列表 */
14
16
  export declare const allExternalTools: import("./base.js").ExternalTool[];
15
17
  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;AAEzD,kBAAkB;AAClB,eAAO,MAAM,gBAAgB,oCAAsE,CAAC;AAGpG,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;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"}
@@ -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.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.hasPackage = exports.eslintSeverityToFg = exports.runCommand = exports.runAllExternalTools = void 0;
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;
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; } });
@@ -16,8 +16,16 @@ const typescript_js_1 = require("./typescript.js");
16
16
  Object.defineProperty(exports, "typescriptIntegration", { enumerable: true, get: function () { return typescript_js_1.typescriptIntegration; } });
17
17
  const stylelint_js_1 = require("./stylelint.js");
18
18
  Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get: function () { return stylelint_js_1.stylelintIntegration; } });
19
+ // v3.6.1: Playwright E2E 测试集成
20
+ const playwright_js_1 = require("./playwright.js");
21
+ Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return playwright_js_1.playwrightIntegration; } });
19
22
  /** 所有可用的外部工具列表 */
20
- exports.allExternalTools = [eslint_js_1.eslintIntegration, typescript_js_1.typescriptIntegration, stylelint_js_1.stylelintIntegration];
23
+ exports.allExternalTools = [
24
+ eslint_js_1.eslintIntegration,
25
+ typescript_js_1.typescriptIntegration,
26
+ stylelint_js_1.stylelintIntegration,
27
+ playwright_js_1.playwrightIntegration,
28
+ ];
21
29
  // Phase 5+6: 格式化器集成
22
30
  var formatter_js_1 = require("./formatter.js");
23
31
  Object.defineProperty(exports, "detectFormatter", { enumerable: true, get: function () { return formatter_js_1.detectFormatter; } });
@@ -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,kBAAkB;AACL,QAAA,gBAAgB,GAAG,CAAC,6BAAkB,EAAE,qCAAsB,EAAE,mCAAqB,CAAC,CAAC;AAEpG,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,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,12 @@
1
+ /**
2
+ * Playwright 外部工具集成(v3.6.1)
3
+ *
4
+ * 调用 `npx playwright test --reporter=json` 执行 E2E 测试,
5
+ * 解析 JSON 报告并将失败的测试用例转换为 frontend-guardian Issue 格式。
6
+ *
7
+ * 设计理念:skill 作为统一入口,用户无需记忆多个命令。
8
+ * `fg-core . --external` 自动触发 Playwright 测试并聚合结果。
9
+ */
10
+ import type { ExternalTool } from "./base.js";
11
+ export declare const playwrightIntegration: ExternalTool;
12
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/integrations/playwright.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAgG9C,eAAO,MAAM,qBAAqB,EAAE,YAkHnC,CAAC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Playwright 外部工具集成(v3.6.1)
4
+ *
5
+ * 调用 `npx playwright test --reporter=json` 执行 E2E 测试,
6
+ * 解析 JSON 报告并将失败的测试用例转换为 frontend-guardian Issue 格式。
7
+ *
8
+ * 设计理念:skill 作为统一入口,用户无需记忆多个命令。
9
+ * `fg-core . --external` 自动触发 Playwright 测试并聚合结果。
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.playwrightIntegration = void 0;
13
+ const base_js_1 = require("./base.js");
14
+ const node_fs_1 = require("node:fs");
15
+ const node_path_1 = require("node:path");
16
+ /** 检测项目是否配置了 Playwright */
17
+ function hasPlaywrightConfig(projectDir) {
18
+ const configNames = [
19
+ "playwright.config.ts",
20
+ "playwright.config.js",
21
+ "playwright.config.mjs",
22
+ "playwright.config.cjs",
23
+ ];
24
+ for (const name of configNames) {
25
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(projectDir, name))) {
26
+ return true;
27
+ }
28
+ }
29
+ return false;
30
+ }
31
+ /** 从错误堆栈中提取文件路径和行号 */
32
+ function extractLocationFromStack(stack) {
33
+ if (!stack)
34
+ return {};
35
+ // 匹配堆栈中的文件路径和行号
36
+ // 例如:at /project/tests/login.spec.ts:15:23
37
+ const match = stack.match(/at\s+(?:.*\s+\()?(.+?):(\d+):(\d+)\)?/);
38
+ if (match) {
39
+ return {
40
+ file: match[1],
41
+ line: parseInt(match[2], 10),
42
+ column: parseInt(match[3], 10),
43
+ };
44
+ }
45
+ return {};
46
+ }
47
+ exports.playwrightIntegration = {
48
+ name: "Playwright",
49
+ isAvailable(projectDir) {
50
+ // 优先检查配置文件,避免全局安装的 playwright 包导致误判
51
+ if (hasPlaywrightConfig(projectDir)) {
52
+ return true;
53
+ }
54
+ // 检查 package.json 中是否有 @playwright/test 依赖
55
+ try {
56
+ const pkgPath = (0, node_path_1.join)(projectDir, "package.json");
57
+ if ((0, node_fs_1.existsSync)(pkgPath)) {
58
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf-8"));
59
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
60
+ if (deps["@playwright/test"] || deps["playwright"]) {
61
+ return true;
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // ignore
67
+ }
68
+ return false;
69
+ },
70
+ run(projectDir, _files) {
71
+ // 执行 Playwright 测试,输出 JSON 报告
72
+ // --reporter=json 输出到 stdout
73
+ // --quiet 减少噪音输出
74
+ const stdout = (0, base_js_1.runCommand)("npx playwright test --reporter=json --quiet", projectDir, 300000 // 5 分钟超时,E2E 测试可能较慢
75
+ );
76
+ if (!stdout) {
77
+ return [];
78
+ }
79
+ let report;
80
+ try {
81
+ report = JSON.parse(stdout);
82
+ }
83
+ catch {
84
+ // JSON 解析失败,可能是 Playwright 未安装或配置错误
85
+ return [];
86
+ }
87
+ const issues = [];
88
+ // 解析 suites 中的失败测试
89
+ if (report.suites) {
90
+ for (const suite of report.suites) {
91
+ for (const spec of suite.specs) {
92
+ if (spec.ok)
93
+ continue; // 跳过通过的测试
94
+ for (const test of spec.tests) {
95
+ for (const result of test.results) {
96
+ if (result.status === "passed" || result.status === "skipped")
97
+ continue;
98
+ const errorMsg = result.error?.message || "测试失败";
99
+ const stack = result.error?.stack || "";
100
+ const location = result.error?.location || extractLocationFromStack(stack);
101
+ // 从错误堆栈中提取文件和行号
102
+ const loc = location || extractLocationFromStack(stack);
103
+ issues.push({
104
+ ruleId: "playwright-test-failed",
105
+ title: `${spec.title} (${test.projectName})`,
106
+ description: formatErrorDescription(errorMsg, stack, result.steps),
107
+ severity: "critical",
108
+ file: loc.file || suite.file,
109
+ line: loc.line || 1,
110
+ column: loc.column || 1,
111
+ source: errorMsg,
112
+ meta: {
113
+ tool: "playwright",
114
+ testTitle: spec.title,
115
+ suiteTitle: suite.title,
116
+ projectName: test.projectName,
117
+ status: result.status,
118
+ duration: result.duration,
119
+ retry: result.retry,
120
+ file: suite.file,
121
+ },
122
+ });
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // 解析全局 errors(如 beforeAll/afterAll 钩子失败)
129
+ if (report.errors) {
130
+ for (const error of report.errors) {
131
+ const loc = error.location || extractLocationFromStack(error.stack);
132
+ issues.push({
133
+ ruleId: "playwright-setup-error",
134
+ title: "Playwright 全局错误",
135
+ description: error.message || "未知错误",
136
+ severity: "critical",
137
+ file: loc.file || "",
138
+ line: loc.line || 1,
139
+ column: loc.column || 1,
140
+ source: error.stack || error.message,
141
+ meta: {
142
+ tool: "playwright",
143
+ stack: error.stack,
144
+ },
145
+ });
146
+ }
147
+ }
148
+ return issues;
149
+ },
150
+ };
151
+ /** 格式化错误描述,包含堆栈和步骤信息 */
152
+ function formatErrorDescription(message, stack, steps) {
153
+ const parts = [message];
154
+ if (steps && steps.length > 0) {
155
+ const failedStep = steps.find((s) => s.error);
156
+ if (failedStep) {
157
+ parts.push(`\n失败步骤: ${failedStep.title} (${failedStep.duration}ms)`);
158
+ if (failedStep.error?.message) {
159
+ parts.push(` 错误: ${failedStep.error.message}`);
160
+ }
161
+ }
162
+ }
163
+ // 只保留堆栈的前 5 行,避免过长
164
+ if (stack) {
165
+ const stackLines = stack.split("\n").slice(0, 5);
166
+ parts.push(`\n堆栈:\n${stackLines.join("\n")}`);
167
+ }
168
+ return parts.join("");
169
+ }
170
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../src/integrations/playwright.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * E2E 测试代码治理 Scanner(v3.6.0)
3
+ *
4
+ * 检测 Playwright / Cypress 测试代码中的反模式和质量问题:
5
+ * 1. 硬编码 CSS 选择器(推荐 data-testid)
6
+ * 2. 固定时长等待(page.waitForTimeout)
7
+ * 3. UI 操作后缺少接口断言(waitForResponse)
8
+ * 4. 测试用例缺少错误处理
9
+ * 5. 测试文件命名不规范
10
+ * 6. 选择器过度依赖类名(.class 而非 role/data-testid)
11
+ *
12
+ * 不依赖 Playwright 运行时,纯文本/AST 扫描。
13
+ */
14
+ import type { Rule } from "../types.js";
15
+ export declare const e2eRules: Rule[];
16
+ //# sourceMappingURL=e2e-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/e2e-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAC;AAgB3D,eAAO,MAAM,QAAQ,EAAE,IAAI,EAoQ1B,CAAC"}