frontend-guardian-core 2.8.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
@@ -40,6 +40,12 @@ import {
40
40
  detectFixBotConfig,
41
41
  HistoryReport,
42
42
  generateDashboard,
43
+ detectMonorepo,
44
+ scanWorkspace,
45
+ formatWorkspaceReport,
46
+ formatWorkspaceJson,
47
+ AIFixSuggester,
48
+ detectAIConfig,
43
49
  } from "../dist/index.js";
44
50
  import pc from "picocolors";
45
51
  import { runWatchMode } from "./watch-mode.js";
@@ -72,7 +78,7 @@ const MODULE_RULES = {
72
78
 
73
79
  function showHelp() {
74
80
  console.log(`
75
- Frontend Guardian Core v2.8.0
81
+ Frontend Guardian Core v3.0.0
76
82
 
77
83
  Usage:
78
84
  fg-core <project-dir> [options]
@@ -115,6 +121,12 @@ Options:
115
121
  --history-module <m> 历史记录按模块过滤(配合 --history)
116
122
  --history-limit <n> 历史记录显示条数限制(默认 20)
117
123
  --generate-dashboard 生成团队趋势看板 HTML 页面
124
+ --monorepo 启用 Monorepo 模式:自动检测 workspace 并扫描所有子包
125
+ --workspace <name> 仅扫描指定 workspace 包(可多次使用,配合 --monorepo)
126
+ --skip-package <name> 跳过指定 workspace 包(可多次使用,配合 --monorepo)
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)
118
130
  --help, -h 显示帮助
119
131
 
120
132
  Examples:
@@ -174,6 +186,12 @@ async function main() {
174
186
  historyModule: undefined,
175
187
  historyLimit: 20,
176
188
  generateDashboard: false,
189
+ monorepo: false,
190
+ workspace: [],
191
+ skipPackage: [],
192
+ crossDeps: true,
193
+ aiFix: false,
194
+ aiModel: undefined,
177
195
  };
178
196
 
179
197
  for (let i = 0; i < args.length; i++) {
@@ -292,6 +310,24 @@ async function main() {
292
310
  case "--generate-dashboard":
293
311
  options.generateDashboard = true;
294
312
  break;
313
+ case "--monorepo":
314
+ options.monorepo = true;
315
+ break;
316
+ case "--workspace":
317
+ options.workspace.push(args[++i]);
318
+ break;
319
+ case "--skip-package":
320
+ options.skipPackage.push(args[++i]);
321
+ break;
322
+ case "--no-cross-deps":
323
+ options.crossDeps = false;
324
+ break;
325
+ case "--ai-fix":
326
+ options.aiFix = true;
327
+ break;
328
+ case "--ai-model":
329
+ options.aiModel = args[++i];
330
+ break;
295
331
  case "--help":
296
332
  case "-h":
297
333
  showHelp();
@@ -404,6 +440,75 @@ async function main() {
404
440
  process.exit(0);
405
441
  }
406
442
 
443
+ // v2.9.0: Monorepo 模式
444
+ if (options.monorepo) {
445
+ const mono = detectMonorepo(options.projectDir);
446
+ if (!mono.isMonorepo) {
447
+ console.log(pc.yellow(`⚠️ 未检测到 monorepo workspace 配置(pnpm-workspace.yaml / lerna.json / nx.json / package.json workspaces)`));
448
+ console.log(pc.gray(` 将在项目根目录执行常规扫描...`));
449
+ if (options.module === "all") {
450
+ await runAllModules(options);
451
+ } else {
452
+ await runSingleModule(options);
453
+ }
454
+ return;
455
+ }
456
+
457
+ if (!options.json) {
458
+ console.log(pc.cyan("📦 Monorepo Workspace 模式"));
459
+ console.log(pc.gray(` 工具: ${mono.tool}`));
460
+ console.log(pc.gray(` 发现 ${mono.packages.length} 个子包`));
461
+ if (options.workspace.length > 0) {
462
+ console.log(pc.gray(` 仅扫描: ${options.workspace.join(", ")}`));
463
+ }
464
+ if (options.skipPackage.length > 0) {
465
+ console.log(pc.gray(` 跳过: ${options.skipPackage.join(", ")}`));
466
+ }
467
+ console.log("");
468
+ }
469
+
470
+ const workspaceResult = await scanWorkspace({
471
+ projectDir: options.projectDir,
472
+ module: options.module === "all" ? undefined : options.module,
473
+ minSeverity: options.minSeverity,
474
+ noCluster: !options.cluster,
475
+ external: options.external,
476
+ cache: options.cache,
477
+ configFile: options.configFile,
478
+ files: options.files,
479
+ exclude: options.exclude,
480
+ skipLargeFilesThreshold: options.skipLargeFilesThreshold,
481
+ analyzeCrossDeps: options.crossDeps,
482
+ onlyPackages: options.workspace.length > 0 ? options.workspace : undefined,
483
+ skipPackages: options.skipPackage.length > 0 ? options.skipPackage : undefined,
484
+ });
485
+
486
+ if (options.json) {
487
+ console.log(JSON.stringify(formatWorkspaceJson(workspaceResult), null, 2));
488
+ process.exit(workspaceResult.summary.issuesBySeverity.critical > 0 ? 1 : 0);
489
+ }
490
+
491
+ console.log(formatWorkspaceReport(workspaceResult));
492
+
493
+ // 详细输出各包的 issues
494
+ for (const pr of workspaceResult.packageResults) {
495
+ if (!pr.success || pr.result.total === 0) continue;
496
+
497
+ console.log(pc.cyan(`\n📦 ${pr.package.name} (${pr.package.path})`));
498
+ const allIssues = [...pr.result.issues.critical, ...pr.result.issues.warning, ...pr.result.issues.suggestion];
499
+ for (const issue of allIssues) {
500
+ printIssue(issue, issue.severity === "critical" ? pc.red : issue.severity === "warning" ? pc.yellow : pc.blue);
501
+ }
502
+ }
503
+
504
+ console.log(pc.gray(`\n⏱️ 总耗时: ${workspaceResult.summary.totalDuration}ms | 扫描 ${workspaceResult.summary.totalFilesScanned} 个文件`));
505
+
506
+ if (workspaceResult.summary.issuesBySeverity.critical > 0) {
507
+ process.exit(1);
508
+ }
509
+ return;
510
+ }
511
+
407
512
  if (options.watch) {
408
513
  const scanFn = options.module === "all" ? runAllModules : runSingleModule;
409
514
  // v2.6.0: Watch 模式复用 SmartCache,实现缓存预热
@@ -872,6 +977,45 @@ async function runAllModules(options, cacheInstance) {
872
977
  }
873
978
  }
874
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
+
875
1019
  // v2.8.0: 保存完整扫描报告
876
1020
  if (options.saveReport) {
877
1021
  const hr = new HistoryReport(options.projectDir);
@@ -1213,6 +1357,44 @@ async function runSingleModule(options, cacheInstance) {
1213
1357
  }
1214
1358
  }
1215
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
+
1216
1398
  console.log(
1217
1399
  pc.gray(
1218
1400
  `⏱️ 耗时: ${result.duration}ms | 扫描 ${result.filesScanned} 个文件 | ${result.filesWithIssues} 个文件有问题`
package/dist/index.d.ts CHANGED
@@ -19,6 +19,12 @@ export { HistoryReport } from "./utils/history-report.js";
19
19
  export type { HistoryEntry, TrendAnalysis, FullReport } from "./utils/history-report.js";
20
20
  export { generateDashboard } from "./utils/dashboard.js";
21
21
  export type { DashboardOptions } from "./utils/dashboard.js";
22
+ export { detectMonorepo, analyzeCrossPackageDeps } from "./utils/monorepo.js";
23
+ export type { MonorepoInfo, WorkspacePackage, CrossPackageIssue, MonorepoTool } from "./utils/monorepo.js";
24
+ export { scanWorkspace, formatWorkspaceReport, formatWorkspaceJson } from "./utils/workspace-scanner.js";
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";
22
28
  export { uploadReport, detectUploadConfig } from "./utils/report-uploader.js";
23
29
  export type { UploadConfig, UploadResult } from "./utils/report-uploader.js";
24
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.typescriptIntegration = exports.eslintIntegration = exports.allExternalTools = exports.autoPublishComment = exports.createPublisher = 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.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 = 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; } });
@@ -39,6 +39,19 @@ Object.defineProperty(exports, "HistoryReport", { enumerable: true, get: functio
39
39
  // v2.8.0: 趋势看板
40
40
  var dashboard_js_1 = require("./utils/dashboard.js");
41
41
  Object.defineProperty(exports, "generateDashboard", { enumerable: true, get: function () { return dashboard_js_1.generateDashboard; } });
42
+ // v2.9.0: Monorepo 工作区支持
43
+ var monorepo_js_1 = require("./utils/monorepo.js");
44
+ Object.defineProperty(exports, "detectMonorepo", { enumerable: true, get: function () { return monorepo_js_1.detectMonorepo; } });
45
+ Object.defineProperty(exports, "analyzeCrossPackageDeps", { enumerable: true, get: function () { return monorepo_js_1.analyzeCrossPackageDeps; } });
46
+ var workspace_scanner_js_1 = require("./utils/workspace-scanner.js");
47
+ Object.defineProperty(exports, "scanWorkspace", { enumerable: true, get: function () { return workspace_scanner_js_1.scanWorkspace; } });
48
+ Object.defineProperty(exports, "formatWorkspaceReport", { enumerable: true, get: function () { return workspace_scanner_js_1.formatWorkspaceReport; } });
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; } });
42
55
  // v2.5.0: 报告上传
43
56
  var report_uploader_js_1 = require("./utils/report-uploader.js");
44
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":";AAAA;;;GAGG;;;;AAEH,0DAAmE;AAA1D,4GAAA,UAAU,OAAA;AAAE,8GAAA,YAAY,OAAA;AAEjC,8CAA+C;AAAtC,sGAAA,UAAU,OAAA;AAEnB,mDAAmE;AAA1D,2GAAA,YAAY,OAAA;AAAE,6GAAA,cAAc,OAAA;AAsBrC,uDAAiF;AAAxE,yGAAA,QAAQ,OAAA;AAAE,2GAAA,UAAU,OAAA;AAAE,0GAAA,SAAS,OAAA;AAAE,wGAAA,OAAO,OAAA;AACjD,mEAAgE;AAAvD,wHAAA,iBAAiB,OAAA;AAC1B,6DAAsD;AAA7C,8GAAA,UAAU,OAAA;AACnB,yDAA2E;AAAlE,4GAAA,UAAU,OAAA;AAAE,uHAAA,qBAAqB,OAAA;AAC1C,qDAAmG;AAA1F,+GAAA,eAAe,OAAA;AAAE,iHAAA,iBAAiB,OAAA;AAAE,0GAAA,UAAU,OAAA;AAAE,2GAAA,WAAW,OAAA;AACpE,2DAA6E;AAApE,mHAAA,gBAAgB,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAE3C,+DAA0D;AAAjD,kHAAA,aAAa,OAAA;AAGtB,eAAe;AACf,qDAAyD;AAAhD,iHAAA,iBAAiB,OAAA;AAG1B,eAAe;AACf,iEAA8E;AAArE,kHAAA,YAAY,OAAA;AAAE,wHAAA,kBAAkB,OAAA;AAGzC,mBAAmB;AACnB,iDAAmE;AAA1D,uGAAA,SAAS,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAGtC,4BAA4B;AAC5B,mDAA0I;AAAjI,8GAAA,eAAe,OAAA;AAAE,kHAAA,mBAAmB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,8GAAA,eAAe,OAAA;AAG5G,0BAA0B;AAC1B,kDAAmE;AAA1D,yGAAA,aAAa,OAAA;AAAE,uGAAA,WAAW,OAAA;AAGnC,0CAA0C;AAC1C,0EAM2C;AALvC,6HAAA,qBAAqB,OAAA;AACrB,+HAAA,uBAAuB,OAAA;AACvB,4HAAA,oBAAoB,OAAA;AACpB,uHAAA,eAAe,OAAA;AACf,uHAAA,eAAe,OAAA;AAGnB,qBAAqB;AACrB,4DAKoC;AAJhC,kHAAA,iBAAiB,OAAA;AACjB,yHAAA,wBAAwB,OAAA;AACxB,+GAAA,cAAc,OAAA;AACd,kHAAA,iBAAiB,OAAA;AAIrB,2DAMiC;AAL7B,oHAAA,iBAAiB,OAAA;AACjB,oHAAA,iBAAiB,OAAA;AACjB,wHAAA,qBAAqB,OAAA;AACrB,kHAAA,eAAe,OAAA;AACf,qHAAA,kBAAkB,OAAA;AAItB,kBAAkB;AAClB,oDAMiC;AAL7B,4GAAA,gBAAgB,OAAA;AAChB,6GAAA,iBAAiB,OAAA;AACjB,iHAAA,qBAAqB,OAAA;AACrB,gHAAA,oBAAoB,OAAA;AACpB,+GAAA,mBAAmB,OAAA;AAIvB,8DAAuD;AAA9C,4GAAA,SAAS,OAAA;AAElB,4EAAqE;AAA5D,0HAAA,gBAAgB,OAAA;AACzB,8DAAuD;AAA9C,4GAAA,SAAS,OAAA;AAClB,sEAA+D;AAAtD,oHAAA,aAAa,OAAA;AACtB,kEAA2D;AAAlD,gHAAA,WAAW,OAAA;AACpB,0EAAkE;AAAzD,uHAAA,cAAc,OAAA;AACvB,wEAAiE;AAAxD,sHAAA,cAAc,OAAA;AACvB,gEAAyD;AAAhD,8GAAA,UAAU,OAAA;AACnB,sEAA+D;AAAtD,oHAAA,aAAa,OAAA;AACtB,kEAA2D;AAAlD,gHAAA,WAAW,OAAA;AACpB,+CAA8D;AAArD,uGAAA,UAAU,OAAA;AAAE,0GAAA,aAAa,OAAA"}
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"}