frontend-guardian-core 2.9.0 → 3.0.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
@@ -44,6 +44,8 @@ import {
44
44
  scanWorkspace,
45
45
  formatWorkspaceReport,
46
46
  formatWorkspaceJson,
47
+ AIFixSuggester,
48
+ detectAIConfig,
47
49
  } from "../dist/index.js";
48
50
  import pc from "picocolors";
49
51
  import { runWatchMode } from "./watch-mode.js";
@@ -76,7 +78,7 @@ const MODULE_RULES = {
76
78
 
77
79
  function showHelp() {
78
80
  console.log(`
79
- Frontend Guardian Core v2.9.0
81
+ Frontend Guardian Core v3.0.0
80
82
 
81
83
  Usage:
82
84
  fg-core <project-dir> [options]
@@ -123,6 +125,8 @@ Options:
123
125
  --workspace <name> 仅扫描指定 workspace 包(可多次使用,配合 --monorepo)
124
126
  --skip-package <name> 跳过指定 workspace 包(可多次使用,配合 --monorepo)
125
127
  --no-cross-deps 禁用跨包依赖分析(配合 --monorepo)
128
+ --ai-fix 启用 AI 修复建议(需配置 FG_AI_API_KEY 环境变量)
129
+ --ai-model <model> 指定 AI 模型(如 gpt-4o-mini / claude-3-5-sonnet,配合 --ai-fix)
126
130
  --help, -h 显示帮助
127
131
 
128
132
  Examples:
@@ -186,6 +190,8 @@ async function main() {
186
190
  workspace: [],
187
191
  skipPackage: [],
188
192
  crossDeps: true,
193
+ aiFix: false,
194
+ aiModel: undefined,
189
195
  };
190
196
 
191
197
  for (let i = 0; i < args.length; i++) {
@@ -316,6 +322,12 @@ async function main() {
316
322
  case "--no-cross-deps":
317
323
  options.crossDeps = false;
318
324
  break;
325
+ case "--ai-fix":
326
+ options.aiFix = true;
327
+ break;
328
+ case "--ai-model":
329
+ options.aiModel = args[++i];
330
+ break;
319
331
  case "--help":
320
332
  case "-h":
321
333
  showHelp();
@@ -965,6 +977,45 @@ async function runAllModules(options, cacheInstance) {
965
977
  }
966
978
  }
967
979
 
980
+ // v3.0.0: AI 修复建议
981
+ if (options.aiFix) {
982
+ const aiConfig = detectAIConfig();
983
+ if (aiConfig) {
984
+ if (options.aiModel) {
985
+ aiConfig.model = options.aiModel;
986
+ }
987
+ console.log(pc.cyan("🤖 正在生成 AI 修复建议..."));
988
+ const suggester = new AIFixSuggester(aiConfig);
989
+ const allIssues = collectAllIssues(allResults, externalResults);
990
+ // 只给没有自动修复的 issue 生成 AI 建议
991
+ const issuesWithoutFix = allIssues.filter((i) => !i.fix);
992
+ if (issuesWithoutFix.length > 0) {
993
+ const suggestions = await suggester.suggestFixes(issuesWithoutFix.slice(0, 5), options.projectDir);
994
+ if (suggestions.length > 0) {
995
+ console.log(pc.cyan(` ✅ 生成 ${suggestions.length} 个 AI 修复建议`));
996
+ for (const s of suggestions) {
997
+ const confidenceIcon = s.confidence === "high" ? pc.green("●") : s.confidence === "medium" ? pc.yellow("●") : pc.red("●");
998
+ console.log(pc.cyan(`\n 📄 ${s.issue.file}:${s.issue.line}`));
999
+ console.log(pc.yellow(` [${s.issue.ruleId}] ${s.issue.title}`));
1000
+ console.log(pc.gray(` AI 置信度: ${confidenceIcon} ${s.confidence}`));
1001
+ if (s.explanation) {
1002
+ console.log(pc.gray(` 说明: ${s.explanation}`));
1003
+ }
1004
+ console.log(pc.gray(` 模型: ${s.model}`));
1005
+ }
1006
+ } else {
1007
+ console.log(pc.gray(" 未生成 AI 修复建议"));
1008
+ }
1009
+ } else {
1010
+ console.log(pc.gray(" 所有问题都有自动修复,无需 AI 建议"));
1011
+ }
1012
+ console.log("");
1013
+ } else {
1014
+ console.log(pc.yellow(" ⚠️ 未检测到 AI 配置。请设置 FG_AI_API_KEY 或 OPENAI_API_KEY 环境变量。"));
1015
+ console.log("");
1016
+ }
1017
+ }
1018
+
968
1019
  // v2.8.0: 保存完整扫描报告
969
1020
  if (options.saveReport) {
970
1021
  const hr = new HistoryReport(options.projectDir);
@@ -1306,6 +1357,44 @@ async function runSingleModule(options, cacheInstance) {
1306
1357
  }
1307
1358
  }
1308
1359
 
1360
+ // v3.0.0: AI 修复建议
1361
+ if (options.aiFix) {
1362
+ const aiConfig = detectAIConfig();
1363
+ if (aiConfig) {
1364
+ if (options.aiModel) {
1365
+ aiConfig.model = options.aiModel;
1366
+ }
1367
+ console.log(pc.cyan("\n🤖 正在生成 AI 修复建议..."));
1368
+ const suggester = new AIFixSuggester(aiConfig);
1369
+ const allIssues = [...issues.critical, ...issues.warning, ...issues.suggestion];
1370
+ const issuesWithoutFix = allIssues.filter((i) => !i.fix);
1371
+ if (issuesWithoutFix.length > 0) {
1372
+ const suggestions = await suggester.suggestFixes(issuesWithoutFix.slice(0, 5), options.projectDir);
1373
+ if (suggestions.length > 0) {
1374
+ console.log(pc.cyan(` ✅ 生成 ${suggestions.length} 个 AI 修复建议`));
1375
+ for (const s of suggestions) {
1376
+ const confidenceIcon = s.confidence === "high" ? pc.green("●") : s.confidence === "medium" ? pc.yellow("●") : pc.red("●");
1377
+ console.log(pc.cyan(`\n 📄 ${s.issue.file}:${s.issue.line}`));
1378
+ console.log(pc.yellow(` [${s.issue.ruleId}] ${s.issue.title}`));
1379
+ console.log(pc.gray(` AI 置信度: ${confidenceIcon} ${s.confidence}`));
1380
+ if (s.explanation) {
1381
+ console.log(pc.gray(` 说明: ${s.explanation}`));
1382
+ }
1383
+ console.log(pc.gray(` 模型: ${s.model}`));
1384
+ }
1385
+ } else {
1386
+ console.log(pc.gray(" 未生成 AI 修复建议"));
1387
+ }
1388
+ } else {
1389
+ console.log(pc.gray(" 所有问题都有自动修复,无需 AI 建议"));
1390
+ }
1391
+ console.log("");
1392
+ } else {
1393
+ console.log(pc.yellow(" ⚠️ 未检测到 AI 配置。请设置 FG_AI_API_KEY 或 OPENAI_API_KEY 环境变量。"));
1394
+ console.log("");
1395
+ }
1396
+ }
1397
+
1309
1398
  console.log(
1310
1399
  pc.gray(
1311
1400
  `⏱️ 耗时: ${result.duration}ms | 扫描 ${result.filesScanned} 个文件 | ${result.filesWithIssues} 个文件有问题`
package/dist/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export { detectMonorepo, analyzeCrossPackageDeps } from "./utils/monorepo.js";
23
23
  export type { MonorepoInfo, WorkspacePackage, CrossPackageIssue, MonorepoTool } from "./utils/monorepo.js";
24
24
  export { scanWorkspace, formatWorkspaceReport, formatWorkspaceJson } from "./utils/workspace-scanner.js";
25
25
  export type { WorkspaceScanResult, PackageScanResult, WorkspaceSummary, WorkspaceScanOptions } from "./utils/workspace-scanner.js";
26
+ export { AIFixSuggester, detectAIConfig, generateAIFixSuggestions } from "./utils/ai-fix-suggester.js";
27
+ export type { AIConfig, AIProvider, AIFixSuggestion } from "./utils/ai-fix-suggester.js";
26
28
  export { uploadReport, detectUploadConfig } from "./utils/report-uploader.js";
27
29
  export type { UploadConfig, UploadResult } from "./utils/report-uploader.js";
28
30
  export { runFixBot, detectFixBotConfig } from "./utils/fix-bot.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
@@ -4,8 +4,8 @@
4
4
  * 导出所有公共 API
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.detectPublisherConfig = exports.GitLabMRPublisher = exports.GitHubPRPublisher = exports.isGuardianComment = exports.COMMENT_MARKER = exports.generatePRCommentSummary = exports.generatePRComment = 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.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.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.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 = void 0;
7
+ exports.isGuardianComment = exports.COMMENT_MARKER = exports.generatePRCommentSummary = exports.generatePRComment = 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.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.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.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 = void 0;
9
9
  var rule_engine_js_1 = require("./engine/rule-engine.js");
10
10
  Object.defineProperty(exports, "RuleEngine", { enumerable: true, get: function () { return rule_engine_js_1.RuleEngine; } });
11
11
  Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return rule_engine_js_1.createEngine; } });
@@ -47,6 +47,11 @@ var workspace_scanner_js_1 = require("./utils/workspace-scanner.js");
47
47
  Object.defineProperty(exports, "scanWorkspace", { enumerable: true, get: function () { return workspace_scanner_js_1.scanWorkspace; } });
48
48
  Object.defineProperty(exports, "formatWorkspaceReport", { enumerable: true, get: function () { return workspace_scanner_js_1.formatWorkspaceReport; } });
49
49
  Object.defineProperty(exports, "formatWorkspaceJson", { enumerable: true, get: function () { return workspace_scanner_js_1.formatWorkspaceJson; } });
50
+ // v3.0.0: AI 修复建议
51
+ var ai_fix_suggester_js_1 = require("./utils/ai-fix-suggester.js");
52
+ Object.defineProperty(exports, "AIFixSuggester", { enumerable: true, get: function () { return ai_fix_suggester_js_1.AIFixSuggester; } });
53
+ Object.defineProperty(exports, "detectAIConfig", { enumerable: true, get: function () { return ai_fix_suggester_js_1.detectAIConfig; } });
54
+ Object.defineProperty(exports, "generateAIFixSuggestions", { enumerable: true, get: function () { return ai_fix_suggester_js_1.generateAIFixSuggestions; } });
50
55
  // v2.5.0: 报告上传
51
56
  var report_uploader_js_1 = require("./utils/report-uploader.js");
52
57
  Object.defineProperty(exports, "uploadReport", { enumerable: true, get: function () { return report_uploader_js_1.uploadReport; } });
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,85 @@
1
+ /**
2
+ * AI Fix Suggester — LLM 驱动的 Issue 修复建议
3
+ *
4
+ * v3.0.0 功能:
5
+ * 1. 为无自动修复的 Issue 生成 AI 修复建议
6
+ * 2. 为低置信度修复提供替代方案
7
+ * 3. 支持 OpenAI / Claude API
8
+ * 4. 建议缓存避免重复调用
9
+ */
10
+ import type { Issue, Fix, FixConfidence } from "../types.js";
11
+ /** AI 提供商 */
12
+ export type AIProvider = "openai" | "claude" | "auto";
13
+ /** AI 修复建议结果 */
14
+ export interface AIFixSuggestion {
15
+ /** 原始 Issue */
16
+ issue: Issue;
17
+ /** AI 生成的修复 */
18
+ fix: Fix;
19
+ /** AI 修复的置信度 */
20
+ confidence: FixConfidence;
21
+ /** AI 对修复的解释 */
22
+ explanation?: string;
23
+ /** 使用的模型 */
24
+ model?: string;
25
+ }
26
+ /** AI 配置 */
27
+ export interface AIConfig {
28
+ /** 提供商 */
29
+ provider: AIProvider;
30
+ /** API Key */
31
+ apiKey: string;
32
+ /** 模型名称 */
33
+ model: string;
34
+ /** API 基础 URL(可选,用于自定义端点) */
35
+ baseUrl?: string;
36
+ /** 最大 token 数 */
37
+ maxTokens?: number;
38
+ /** 温度 */
39
+ temperature?: number;
40
+ /** 是否启用缓存 */
41
+ cacheEnabled?: boolean;
42
+ /** 缓存目录 */
43
+ cacheDir?: string;
44
+ }
45
+ /** 从环境变量检测 AI 配置 */
46
+ export declare function detectAIConfig(): AIConfig | null;
47
+ /**
48
+ * AI 修复建议器
49
+ */
50
+ export declare class AIFixSuggester {
51
+ private config;
52
+ private cacheDir?;
53
+ constructor(config: AIConfig);
54
+ /**
55
+ * 为单个 Issue 生成 AI 修复建议
56
+ */
57
+ suggestFix(issue: Issue, projectDir: string): Promise<AIFixSuggestion | null>;
58
+ /**
59
+ * 批量生成 AI 修复建议
60
+ */
61
+ suggestFixes(issues: Issue[], projectDir: string): Promise<AIFixSuggestion[]>;
62
+ /** 构建给 LLM 的 prompt */
63
+ private buildPrompt;
64
+ /** 调用 LLM API */
65
+ private callLLM;
66
+ /** 调用 Claude API */
67
+ private callClaude;
68
+ /** 调用 OpenAI API */
69
+ private callOpenAI;
70
+ /** 解析 LLM 响应 */
71
+ private parseResponse;
72
+ /** 读取源代码文件 */
73
+ private readSource;
74
+ /** 生成缓存 key */
75
+ private getCacheKey;
76
+ /** 读取缓存 */
77
+ private readCache;
78
+ /** 写入缓存 */
79
+ private writeCache;
80
+ }
81
+ /**
82
+ * 为 Issue 列表生成 AI 修复建议的便捷函数
83
+ */
84
+ export declare function generateAIFixSuggestions(issues: Issue[], projectDir: string, config?: Partial<AIConfig>): Promise<AIFixSuggestion[]>;
85
+ //# sourceMappingURL=ai-fix-suggester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-fix-suggester.d.ts","sourceRoot":"","sources":["../../src/utils/ai-fix-suggester.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,aAAa;AACb,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC5B,eAAe;IACf,KAAK,EAAE,KAAK,CAAC;IACb,eAAe;IACf,GAAG,EAAE,GAAG,CAAC;IACT,gBAAgB;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,YAAY;AACZ,MAAM,WAAW,QAAQ;IACrB,UAAU;IACV,QAAQ,EAAE,UAAU,CAAC;IACrB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oBAAoB;AACpB,wBAAgB,cAAc,IAAI,QAAQ,GAAG,IAAI,CAiChD;AAED;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,MAAM,EAAE,QAAQ;IAO5B;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAmCnF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAanF,uBAAuB;IACvB,OAAO,CAAC,WAAW;IAgCnB,iBAAiB;YACH,OAAO;IAOrB,oBAAoB;YACN,UAAU;IAyBxB,oBAAoB;YACN,UAAU;IAwBxB,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAiCrB,cAAc;IACd,OAAO,CAAC,UAAU;IAqBlB,eAAe;IACf,OAAO,CAAC,WAAW;IAQnB,WAAW;IACX,OAAO,CAAC,SAAS;IAYjB,WAAW;IACX,OAAO,CAAC,UAAU;CAYrB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B"}
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ /**
3
+ * AI Fix Suggester — LLM 驱动的 Issue 修复建议
4
+ *
5
+ * v3.0.0 功能:
6
+ * 1. 为无自动修复的 Issue 生成 AI 修复建议
7
+ * 2. 为低置信度修复提供替代方案
8
+ * 3. 支持 OpenAI / Claude API
9
+ * 4. 建议缓存避免重复调用
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AIFixSuggester = void 0;
13
+ exports.detectAIConfig = detectAIConfig;
14
+ exports.generateAIFixSuggestions = generateAIFixSuggestions;
15
+ const node_fs_1 = require("node:fs");
16
+ const node_path_1 = require("node:path");
17
+ const node_crypto_1 = require("node:crypto");
18
+ /** 从环境变量检测 AI 配置 */
19
+ function detectAIConfig() {
20
+ const provider = process.env.FG_AI_PROVIDER || "auto";
21
+ const apiKey = process.env.FG_AI_API_KEY || process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY || "";
22
+ if (!apiKey) {
23
+ return null;
24
+ }
25
+ // 自动推断提供商
26
+ let detectedProvider = provider;
27
+ if (provider === "auto") {
28
+ if (process.env.ANTHROPIC_API_KEY) {
29
+ detectedProvider = "claude";
30
+ }
31
+ else if (process.env.OPENAI_API_KEY || process.env.FG_AI_API_KEY) {
32
+ detectedProvider = "openai";
33
+ }
34
+ }
35
+ // 默认模型
36
+ const defaultModel = detectedProvider === "claude"
37
+ ? "claude-3-5-sonnet-20241022"
38
+ : "gpt-4o-mini";
39
+ return {
40
+ provider: detectedProvider,
41
+ apiKey,
42
+ model: process.env.FG_AI_MODEL || defaultModel,
43
+ baseUrl: process.env.FG_AI_BASE_URL,
44
+ maxTokens: parseInt(process.env.FG_AI_MAX_TOKENS || "2048", 10),
45
+ temperature: parseFloat(process.env.FG_AI_TEMPERATURE || "0.2"),
46
+ cacheEnabled: process.env.FG_AI_CACHE !== "false",
47
+ cacheDir: process.env.FG_AI_CACHE_DIR,
48
+ };
49
+ }
50
+ /**
51
+ * AI 修复建议器
52
+ */
53
+ class AIFixSuggester {
54
+ config;
55
+ cacheDir;
56
+ constructor(config) {
57
+ this.config = config;
58
+ if (config.cacheEnabled !== false) {
59
+ this.cacheDir = config.cacheDir || (0, node_path_1.join)(process.cwd(), ".frontend-guardian", "ai-cache");
60
+ }
61
+ }
62
+ /**
63
+ * 为单个 Issue 生成 AI 修复建议
64
+ */
65
+ async suggestFix(issue, projectDir) {
66
+ const cacheKey = this.getCacheKey(issue);
67
+ // 尝试从缓存读取
68
+ if (this.cacheDir) {
69
+ const cached = this.readCache(cacheKey);
70
+ if (cached) {
71
+ return { ...cached, issue };
72
+ }
73
+ }
74
+ // 读取源代码
75
+ const source = this.readSource(issue.file, projectDir, issue.line);
76
+ if (!source) {
77
+ return null;
78
+ }
79
+ // 构建 prompt
80
+ const prompt = this.buildPrompt(issue, source);
81
+ try {
82
+ const response = await this.callLLM(prompt);
83
+ const suggestion = this.parseResponse(response, issue);
84
+ if (suggestion && this.cacheDir) {
85
+ this.writeCache(cacheKey, suggestion);
86
+ }
87
+ return suggestion;
88
+ }
89
+ catch (err) {
90
+ // 静默失败,返回 null
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * 批量生成 AI 修复建议
96
+ */
97
+ async suggestFixes(issues, projectDir) {
98
+ const results = [];
99
+ for (const issue of issues) {
100
+ const suggestion = await this.suggestFix(issue, projectDir);
101
+ if (suggestion) {
102
+ results.push(suggestion);
103
+ }
104
+ }
105
+ return results;
106
+ }
107
+ /** 构建给 LLM 的 prompt */
108
+ buildPrompt(issue, source) {
109
+ return `You are an expert frontend code reviewer. Given the following code issue, provide a precise fix.
110
+
111
+ Issue Details:
112
+ - Rule: ${issue.ruleId}
113
+ - Title: ${issue.title}
114
+ - Description: ${issue.description}
115
+ - File: ${issue.file}
116
+ - Line: ${issue.line}, Column: ${issue.column}
117
+ - Severity: ${issue.severity}
118
+
119
+ Source Code (around the issue):
120
+ \`\`\`
121
+ ${source}
122
+ \`\`\`
123
+
124
+ Please provide:
125
+ 1. The fixed code snippet (only the corrected version, no explanations)
126
+ 2. A brief explanation of the fix
127
+ 3. Your confidence in this fix: high / medium / low
128
+
129
+ Format your response as:
130
+ FIX:
131
+ <corrected code snippet>
132
+
133
+ EXPLANATION:
134
+ <brief explanation>
135
+
136
+ CONFIDENCE:
137
+ <high|medium|low>`;
138
+ }
139
+ /** 调用 LLM API */
140
+ async callLLM(prompt) {
141
+ if (this.config.provider === "claude") {
142
+ return this.callClaude(prompt);
143
+ }
144
+ return this.callOpenAI(prompt);
145
+ }
146
+ /** 调用 Claude API */
147
+ async callClaude(prompt) {
148
+ const url = this.config.baseUrl || "https://api.anthropic.com/v1/messages";
149
+ const response = await fetch(url, {
150
+ method: "POST",
151
+ headers: {
152
+ "Content-Type": "application/json",
153
+ "x-api-key": this.config.apiKey,
154
+ "anthropic-version": "2023-06-01",
155
+ },
156
+ body: JSON.stringify({
157
+ model: this.config.model,
158
+ max_tokens: this.config.maxTokens || 2048,
159
+ temperature: this.config.temperature || 0.2,
160
+ messages: [{ role: "user", content: prompt }],
161
+ }),
162
+ });
163
+ if (!response.ok) {
164
+ throw new Error(`Claude API error: ${response.status} ${response.statusText}`);
165
+ }
166
+ const data = await response.json();
167
+ return data.content[0]?.text || "";
168
+ }
169
+ /** 调用 OpenAI API */
170
+ async callOpenAI(prompt) {
171
+ const url = this.config.baseUrl || "https://api.openai.com/v1/chat/completions";
172
+ const response = await fetch(url, {
173
+ method: "POST",
174
+ headers: {
175
+ "Content-Type": "application/json",
176
+ Authorization: `Bearer ${this.config.apiKey}`,
177
+ },
178
+ body: JSON.stringify({
179
+ model: this.config.model,
180
+ max_tokens: this.config.maxTokens || 2048,
181
+ temperature: this.config.temperature || 0.2,
182
+ messages: [{ role: "user", content: prompt }],
183
+ }),
184
+ });
185
+ if (!response.ok) {
186
+ throw new Error(`OpenAI API error: ${response.status} ${response.statusText}`);
187
+ }
188
+ const data = await response.json();
189
+ return data.choices[0]?.message?.content || "";
190
+ }
191
+ /** 解析 LLM 响应 */
192
+ parseResponse(response, issue) {
193
+ const fixMatch = response.match(/FIX:\s*\n?([\s\S]*?)(?=\n?EXPLANATION:|\n?CONFIDENCE:|$)/);
194
+ const explanationMatch = response.match(/EXPLANATION:\s*\n?([\s\S]*?)(?=\n?CONFIDENCE:|$)/);
195
+ const confidenceMatch = response.match(/CONFIDENCE:\s*(high|medium|low)/i);
196
+ if (!fixMatch) {
197
+ return null;
198
+ }
199
+ const fixedCode = fixMatch[1].trim();
200
+ const explanation = explanationMatch ? explanationMatch[1].trim() : undefined;
201
+ const confidenceStr = confidenceMatch ? confidenceMatch[1].toLowerCase() : "medium";
202
+ const confidence = ["high", "medium", "low"].includes(confidenceStr) ? confidenceStr : "medium";
203
+ // 构建 Fix 对象
204
+ // 简单实现:替换整行代码
205
+ const fix = {
206
+ text: fixedCode,
207
+ start: { line: issue.line, column: issue.column },
208
+ end: { line: issue.endLine || issue.line, column: issue.endColumn || issue.column + 1 },
209
+ confidence,
210
+ description: explanation,
211
+ };
212
+ return {
213
+ issue,
214
+ fix,
215
+ confidence,
216
+ explanation,
217
+ model: this.config.model,
218
+ };
219
+ }
220
+ /** 读取源代码文件 */
221
+ readSource(filePath, projectDir, issueLine) {
222
+ const fullPath = (0, node_path_1.resolve)(projectDir, filePath);
223
+ if (!(0, node_fs_1.existsSync)(fullPath)) {
224
+ return null;
225
+ }
226
+ try {
227
+ const content = (0, node_fs_1.readFileSync)(fullPath, "utf-8");
228
+ const lines = content.split("\n");
229
+ // 提取 issue 周围的代码(前后 5 行)
230
+ const startLine = Math.max(0, issueLine - 6);
231
+ const endLine = Math.min(lines.length, issueLine + 5);
232
+ const contextLines = lines.slice(startLine, endLine);
233
+ // 添加行号
234
+ return contextLines.map((line, idx) => `${startLine + idx + 1}: ${line}`).join("\n");
235
+ }
236
+ catch {
237
+ return null;
238
+ }
239
+ }
240
+ /** 生成缓存 key */
241
+ getCacheKey(issue) {
242
+ const hash = (0, node_crypto_1.createHash)("sha256")
243
+ .update(`${issue.file}|${issue.ruleId}|${issue.line}|${issue.column}|${issue.title}`)
244
+ .digest("hex")
245
+ .slice(0, 16);
246
+ return hash;
247
+ }
248
+ /** 读取缓存 */
249
+ readCache(key) {
250
+ if (!this.cacheDir)
251
+ return null;
252
+ try {
253
+ const cachePath = (0, node_path_1.join)(this.cacheDir, `${key}.json`);
254
+ if (!(0, node_fs_1.existsSync)(cachePath))
255
+ return null;
256
+ const raw = (0, node_fs_1.readFileSync)(cachePath, "utf-8");
257
+ return JSON.parse(raw);
258
+ }
259
+ catch {
260
+ return null;
261
+ }
262
+ }
263
+ /** 写入缓存 */
264
+ writeCache(key, suggestion) {
265
+ if (!this.cacheDir)
266
+ return;
267
+ try {
268
+ if (!(0, node_fs_1.existsSync)(this.cacheDir)) {
269
+ (0, node_fs_1.mkdirSync)(this.cacheDir, { recursive: true });
270
+ }
271
+ const cachePath = (0, node_path_1.join)(this.cacheDir, `${key}.json`);
272
+ (0, node_fs_1.writeFileSync)(cachePath, JSON.stringify(suggestion, null, 2), "utf-8");
273
+ }
274
+ catch {
275
+ // 忽略缓存写入失败
276
+ }
277
+ }
278
+ }
279
+ exports.AIFixSuggester = AIFixSuggester;
280
+ /**
281
+ * 为 Issue 列表生成 AI 修复建议的便捷函数
282
+ */
283
+ async function generateAIFixSuggestions(issues, projectDir, config) {
284
+ const detected = detectAIConfig();
285
+ if (!detected) {
286
+ return [];
287
+ }
288
+ const mergedConfig = {
289
+ ...detected,
290
+ ...config,
291
+ };
292
+ const suggester = new AIFixSuggester(mergedConfig);
293
+ return suggester.suggestFixes(issues, projectDir);
294
+ }
295
+ //# sourceMappingURL=ai-fix-suggester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-fix-suggester.js","sourceRoot":"","sources":["../../src/utils/ai-fix-suggester.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": "2.9.0",
3
+ "version": "3.0.0",
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",