frontend-guardian-core 3.5.1 → 3.6.0

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,
@@ -56,6 +60,8 @@ import {
56
60
  generateComplianceReport,
57
61
  complianceReportToMarkdown,
58
62
  saveComplianceReport,
63
+ uploadToDashboardServer,
64
+ detectDashboardConfig,
59
65
  } from "../dist/index.js";
60
66
  import pc from "picocolors";
61
67
  import { runWatchMode } from "./watch-mode.js";
@@ -71,6 +77,7 @@ const MODULES = [
71
77
  "hooks",
72
78
  "platform",
73
79
  "svelte",
80
+ "e2e",
74
81
  ];
75
82
 
76
83
  const MODULE_RULES = {
@@ -84,18 +91,19 @@ const MODULE_RULES = {
84
91
  hooks: hooksRules,
85
92
  platform: platformRules,
86
93
  svelte: svelteRules,
94
+ e2e: e2eRules,
87
95
  };
88
96
 
89
97
  function showHelp() {
90
98
  console.log(`
91
- Frontend Guardian Core v3.5.1
99
+ Frontend Guardian Core v3.6.0
92
100
 
93
101
  Usage:
94
102
  fg-core <project-dir> [options]
95
103
 
96
104
  Options:
97
105
  --scan 全量扫描(等价于 --module all)
98
- --module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | all
106
+ --module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | e2e | all
99
107
  --severity <level> 最低严重级别: critical | warning | suggestion (默认: suggestion)
100
108
  --files <pattern> 仅扫描匹配的文件
101
109
  --exclude <pattern> 排除匹配的文件
@@ -144,6 +152,9 @@ Options:
144
152
  --assign 通过 CODEOWNERS 为 issue 推断责任人
145
153
  --strategy <s> 扫描策略: strict | standard | loose (默认: standard)
146
154
  --compliance <file> 生成 SOC2/ISO27001 合规报告到指定文件
155
+ --server <url> 扫描后上报到治理看板服务器
156
+ --serve 扫描前启动本地看板服务(扫描完成后停止)
157
+ --e2e-detect-gaps 检测 E2E 测试覆盖缺口(页面 + 接口)
147
158
  --help, -h 显示帮助
148
159
 
149
160
  Examples:
@@ -216,6 +227,9 @@ async function main() {
216
227
  assign: false,
217
228
  strategy: "standard",
218
229
  compliance: undefined,
230
+ server: undefined,
231
+ serve: false,
232
+ e2eDetectGaps: false,
219
233
  };
220
234
 
221
235
  for (let i = 0; i < args.length; i++) {
@@ -377,6 +391,15 @@ async function main() {
377
391
  case "--compliance":
378
392
  options.compliance = args[++i];
379
393
  break;
394
+ case "--server":
395
+ options.server = args[++i];
396
+ break;
397
+ case "--serve":
398
+ options.serve = true;
399
+ break;
400
+ case "--e2e-detect-gaps":
401
+ options.e2eDetectGaps = true;
402
+ break;
380
403
  case "--help":
381
404
  case "-h":
382
405
  showHelp();
@@ -384,6 +407,17 @@ async function main() {
384
407
  }
385
408
  }
386
409
 
410
+ // v3.6.0: E2E 测试覆盖缺口检测
411
+ if (options.e2eDetectGaps) {
412
+ const gapResult = detectE2EGaps({ projectDir: options.projectDir });
413
+ if (options.json) {
414
+ console.log(JSON.stringify(formatE2EGapJson(gapResult), null, 2));
415
+ } else {
416
+ console.log(formatE2EGapReport(gapResult));
417
+ }
418
+ process.exit(gapResult.uncoveredPages.length + gapResult.uncoveredApis.length > 0 ? 1 : 0);
419
+ }
420
+
387
421
  // Phase 6: 特殊命令处理
388
422
  if (options.installHooks) {
389
423
  const hookType = ["pre-commit", "pre-push", "commit-msg", "both", "all"].includes(options.installHooksType)
@@ -1152,6 +1186,44 @@ async function runAllModules(options, cacheInstance) {
1152
1186
  }
1153
1187
  }
1154
1188
 
1189
+ // v3.5.2: 上报到治理看板服务器
1190
+ const dashboardUrl = options.server || (options.serve ? "http://localhost:3456" : null);
1191
+ if (dashboardUrl) {
1192
+ const allIssues = collectAllIssues(allResults, externalResults);
1193
+ const projectName = options.projectDir.split("/").pop() || "unknown";
1194
+ const dashboardConfig = { serverUrl: dashboardUrl };
1195
+
1196
+ for (const mod of MODULES) {
1197
+ const r = allResults[mod];
1198
+ if (!r) continue;
1199
+ const moduleIssues = [...r.issues.critical, ...r.issues.warning, ...r.issues.suggestion];
1200
+ const payload = {
1201
+ projectName,
1202
+ projectPath: options.projectDir,
1203
+ module: mod,
1204
+ result: r,
1205
+ issues: moduleIssues,
1206
+ meta: {
1207
+ strategy: options.strategy,
1208
+ duration: r.duration,
1209
+ filesScanned: r.filesScanned,
1210
+ },
1211
+ };
1212
+ const result = await uploadToDashboardServer(payload, dashboardConfig);
1213
+ if (!options.json) {
1214
+ if (result.success) {
1215
+ console.log(pc.cyan(`📊 已上报到看板服务器: ${mod}`));
1216
+ } else {
1217
+ console.log(pc.yellow(` ⚠️ 看板上报失败 (${mod}): ${result.error}`));
1218
+ }
1219
+ }
1220
+ }
1221
+ if (!options.json) {
1222
+ console.log(pc.gray(` Dashboard: ${dashboardUrl}`));
1223
+ console.log("");
1224
+ }
1225
+ }
1226
+
1155
1227
  console.log(
1156
1228
  pc.gray(
1157
1229
  `⏱️ 总耗时: ${totalDuration}ms | 扫描 ${totalFilesScanned} 个文件 | ${totalFilesWithIssues} 个文件有问题`
@@ -1479,6 +1551,36 @@ async function runSingleModule(options, cacheInstance) {
1479
1551
  }
1480
1552
  }
1481
1553
 
1554
+ // v3.5.2: 上报到治理看板服务器
1555
+ const singleDashboardUrl = options.server || (options.serve ? "http://localhost:3456" : null);
1556
+ if (singleDashboardUrl) {
1557
+ const allIssues = [...issues.critical, ...issues.warning, ...issues.suggestion];
1558
+ const projectName = options.projectDir.split("/").pop() || "unknown";
1559
+ const dashboardConfig = { serverUrl: singleDashboardUrl };
1560
+ const payload = {
1561
+ projectName,
1562
+ projectPath: options.projectDir,
1563
+ module: options.module,
1564
+ result,
1565
+ issues: allIssues,
1566
+ meta: {
1567
+ strategy: options.strategy,
1568
+ duration: result.duration,
1569
+ filesScanned: result.filesScanned,
1570
+ },
1571
+ };
1572
+ const uploadResult = await uploadToDashboardServer(payload, dashboardConfig);
1573
+ if (!options.json) {
1574
+ if (uploadResult.success) {
1575
+ console.log(pc.cyan(`📊 已上报到看板服务器: ${options.module}`));
1576
+ } else {
1577
+ console.log(pc.yellow(` ⚠️ 看板上报失败: ${uploadResult.error}`));
1578
+ }
1579
+ console.log(pc.gray(` Dashboard: ${singleDashboardUrl}`));
1580
+ console.log("");
1581
+ }
1582
+ }
1583
+
1482
1584
  // v3.0.0: AI 修复建议
1483
1585
  if (options.aiFix) {
1484
1586
  const aiConfig = detectAIConfig();
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.0
30
30
 
31
31
  Usage: fg-lsp [options]
32
32
 
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Frontend Guardian Dashboard Server CLI
4
+ * Usage: fg-server [options]
5
+ */
6
+
7
+ import { DashboardServer } from "../dist/index.js";
8
+ import pc from "picocolors";
9
+
10
+ function showHelp() {
11
+ console.log(`
12
+ Frontend Guardian Dashboard Server v3.6.0
13
+
14
+ Usage:
15
+ fg-server [options]
16
+
17
+ Options:
18
+ --port <n> Server port (default: 3456)
19
+ --data-dir <dir> Data storage directory (default: ~/.frontend-guardian-server)
20
+ --cors <origin> Enable CORS for the given origin (e.g. "*" or "http://localhost:3000")
21
+ --auth-token <t> Require Bearer token for POST /api/reports
22
+ --help, -h Show this help
23
+
24
+ Examples:
25
+ fg-server # Start on default port 3456
26
+ fg-server --port 8765 # Start on port 8765
27
+ fg-server --cors "*" # Enable CORS for all origins
28
+ fg-server --auth-token secret123 # Require auth token for report uploads
29
+ `);
30
+ }
31
+
32
+ async function main() {
33
+ const args = process.argv.slice(2);
34
+
35
+ const options = {
36
+ port: 3456,
37
+ dataDir: undefined,
38
+ cors: undefined,
39
+ authToken: undefined,
40
+ };
41
+
42
+ for (let i = 0; i < args.length; i++) {
43
+ switch (args[i]) {
44
+ case "--port":
45
+ options.port = parseInt(args[++i], 10) || 3456;
46
+ break;
47
+ case "--data-dir":
48
+ options.dataDir = args[++i];
49
+ break;
50
+ case "--cors":
51
+ options.cors = args[++i];
52
+ break;
53
+ case "--auth-token":
54
+ options.authToken = args[++i];
55
+ break;
56
+ case "--help":
57
+ case "-h":
58
+ showHelp();
59
+ process.exit(0);
60
+ }
61
+ }
62
+
63
+ console.log(pc.cyan("Frontend Guardian Dashboard Server"));
64
+ console.log(pc.gray(` Version: 3.5.2`));
65
+ console.log("");
66
+
67
+ const server = new DashboardServer({
68
+ dataDir: options.dataDir,
69
+ cors: options.cors,
70
+ authToken: options.authToken,
71
+ });
72
+
73
+ // Graceful shutdown
74
+ process.on("SIGINT", async () => {
75
+ console.log(pc.gray("\nShutting down..."));
76
+ await server.stop();
77
+ process.exit(0);
78
+ });
79
+
80
+ process.on("SIGTERM", async () => {
81
+ await server.stop();
82
+ process.exit(0);
83
+ });
84
+
85
+ await server.start(options.port);
86
+
87
+ console.log(pc.green(` Server: http://localhost:${options.port}`));
88
+ console.log(pc.gray(` Data directory: ${server.getDataDir()}`));
89
+ if (options.cors) {
90
+ console.log(pc.gray(` CORS: ${options.cors}`));
91
+ }
92
+ if (options.authToken) {
93
+ console.log(pc.gray(` Auth: Bearer token required for uploads`));
94
+ }
95
+ console.log("");
96
+ console.log(pc.gray("Press Ctrl+C to stop"));
97
+ }
98
+
99
+ main().catch((err) => {
100
+ console.error(pc.red("Server error:"), err.message || err);
101
+ process.exit(1);
102
+ });
package/dist/index.d.ts CHANGED
@@ -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";
@@ -65,4 +68,9 @@ export { downloadBaseline, loadBaselineAsync } from "./utils/baseline.js";
65
68
  export { generateComplianceReport, complianceReportToMarkdown, saveComplianceReport, getComplianceMapping, registerComplianceMapping, } from "./utils/compliance.js";
66
69
  export type { ComplianceControl, ComplianceFinding, ComplianceRecommendation, ComplianceReport, RuleComplianceMapping, } from "./utils/compliance.js";
67
70
  export { getFileExt, getJSXTagName } from "./utils/common.js";
71
+ export { DashboardServer } from "./server/dashboard-server.js";
72
+ export type { DashboardProject, DashboardReport, DashboardServerOptions, ReportPayload, TrendPoint, } from "./server/dashboard-server.js";
73
+ export { generateDashboardHtml } from "./server/dashboard-html.js";
74
+ export { uploadToDashboardServer, detectDashboardConfig, } from "./utils/dashboard-client.js";
75
+ export type { DashboardClientConfig, DashboardUploadResult, DashboardReportPayload, } from "./utils/dashboard-client.js";
68
76
  //# sourceMappingURL=index.d.ts.map
@@ -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.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.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.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.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 = 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; } });
@@ -125,6 +126,13 @@ var platform_scanner_js_1 = require("./scanners/platform-scanner.js");
125
126
  Object.defineProperty(exports, "platformRules", { enumerable: true, get: function () { return platform_scanner_js_1.platformRules; } });
126
127
  var svelte_scanner_js_1 = require("./scanners/svelte-scanner.js");
127
128
  Object.defineProperty(exports, "svelteRules", { enumerable: true, get: function () { return svelte_scanner_js_1.svelteRules; } });
129
+ // v3.6.0: E2E 测试治理
130
+ var e2e_scanner_js_1 = require("./scanners/e2e-scanner.js");
131
+ Object.defineProperty(exports, "e2eRules", { enumerable: true, get: function () { return e2e_scanner_js_1.e2eRules; } });
132
+ var e2e_gap_detector_js_1 = require("./utils/e2e-gap-detector.js");
133
+ Object.defineProperty(exports, "detectE2EGaps", { enumerable: true, get: function () { return e2e_gap_detector_js_1.detectE2EGaps; } });
134
+ Object.defineProperty(exports, "formatE2EGapReport", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapReport; } });
135
+ Object.defineProperty(exports, "formatE2EGapJson", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapJson; } });
128
136
  // v3.3.0: IDE 集成
129
137
  var incremental_diagnostic_js_1 = require("./ide/incremental-diagnostic.js");
130
138
  Object.defineProperty(exports, "IncrementalDiagnostic", { enumerable: true, get: function () { return incremental_diagnostic_js_1.IncrementalDiagnostic; } });
@@ -155,4 +163,12 @@ Object.defineProperty(exports, "registerComplianceMapping", { enumerable: true,
155
163
  var common_js_1 = require("./utils/common.js");
156
164
  Object.defineProperty(exports, "getFileExt", { enumerable: true, get: function () { return common_js_1.getFileExt; } });
157
165
  Object.defineProperty(exports, "getJSXTagName", { enumerable: true, get: function () { return common_js_1.getJSXTagName; } });
166
+ // v3.5.2: Governance Dashboard Server
167
+ var dashboard_server_js_1 = require("./server/dashboard-server.js");
168
+ Object.defineProperty(exports, "DashboardServer", { enumerable: true, get: function () { return dashboard_server_js_1.DashboardServer; } });
169
+ var dashboard_html_js_1 = require("./server/dashboard-html.js");
170
+ Object.defineProperty(exports, "generateDashboardHtml", { enumerable: true, get: function () { return dashboard_html_js_1.generateDashboardHtml; } });
171
+ var dashboard_client_js_1 = require("./utils/dashboard-client.js");
172
+ Object.defineProperty(exports, "uploadToDashboardServer", { enumerable: true, get: function () { return dashboard_client_js_1.uploadToDashboardServer; } });
173
+ Object.defineProperty(exports, "detectDashboardConfig", { enumerable: true, get: function () { return dashboard_client_js_1.detectDashboardConfig; } });
158
174
  //# sourceMappingURL=index.js.map
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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"}
@@ -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"}