mc-ai-code-review 1.1.24

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.
Files changed (62) hide show
  1. package/bin/ai-code-review.js +28 -0
  2. package/dist/config.d.ts +14 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +68 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/formatters/index.d.ts +5 -0
  7. package/dist/formatters/index.d.ts.map +1 -0
  8. package/dist/formatters/index.js +21 -0
  9. package/dist/formatters/index.js.map +1 -0
  10. package/dist/formatters/rdjson.d.ts +17 -0
  11. package/dist/formatters/rdjson.d.ts.map +1 -0
  12. package/dist/formatters/rdjson.js +65 -0
  13. package/dist/formatters/rdjson.js.map +1 -0
  14. package/dist/index.d.ts +18 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +134 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/performanceReviewer/index.d.ts +17 -0
  19. package/dist/performanceReviewer/index.d.ts.map +1 -0
  20. package/dist/performanceReviewer/index.js +251 -0
  21. package/dist/performanceReviewer/index.js.map +1 -0
  22. package/dist/reviewer/index.d.ts +10 -0
  23. package/dist/reviewer/index.d.ts.map +1 -0
  24. package/dist/reviewer/index.js +115 -0
  25. package/dist/reviewer/index.js.map +1 -0
  26. package/dist/reviewer/modelAdapters/base.d.ts +14 -0
  27. package/dist/reviewer/modelAdapters/base.d.ts.map +1 -0
  28. package/dist/reviewer/modelAdapters/base.js +3 -0
  29. package/dist/reviewer/modelAdapters/base.js.map +1 -0
  30. package/dist/reviewer/modelAdapters/factory.d.ts +13 -0
  31. package/dist/reviewer/modelAdapters/factory.d.ts.map +1 -0
  32. package/dist/reviewer/modelAdapters/factory.js +21 -0
  33. package/dist/reviewer/modelAdapters/factory.js.map +1 -0
  34. package/dist/reviewer/modelAdapters/gemini.d.ts +11 -0
  35. package/dist/reviewer/modelAdapters/gemini.d.ts.map +1 -0
  36. package/dist/reviewer/modelAdapters/gemini.js +61 -0
  37. package/dist/reviewer/modelAdapters/gemini.js.map +1 -0
  38. package/dist/reviewer/modelAdapters/openai.d.ts +12 -0
  39. package/dist/reviewer/modelAdapters/openai.d.ts.map +1 -0
  40. package/dist/reviewer/modelAdapters/openai.js +54 -0
  41. package/dist/reviewer/modelAdapters/openai.js.map +1 -0
  42. package/dist/reviewer/parseResponse.d.ts +10 -0
  43. package/dist/reviewer/parseResponse.d.ts.map +1 -0
  44. package/dist/reviewer/parseResponse.js +97 -0
  45. package/dist/reviewer/parseResponse.js.map +1 -0
  46. package/dist/reviewer/utils.d.ts +44 -0
  47. package/dist/reviewer/utils.d.ts.map +1 -0
  48. package/dist/reviewer/utils.js +392 -0
  49. package/dist/reviewer/utils.js.map +1 -0
  50. package/dist/summarizer/index.d.ts +10 -0
  51. package/dist/summarizer/index.d.ts.map +1 -0
  52. package/dist/summarizer/index.js +142 -0
  53. package/dist/summarizer/index.js.map +1 -0
  54. package/dist/types.d.ts +92 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +6 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/utils.d.ts +5 -0
  59. package/dist/utils.d.ts.map +1 -0
  60. package/dist/utils.js +21 -0
  61. package/dist/utils.js.map +1 -0
  62. package/package.json +44 -0
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AI Code Review CLI 入口
5
+ * 用法:
6
+ * git diff ... | ai-code-review # 逐行代码规范审查
7
+ * git diff ... | ai-code-review --summary # 改动汇总
8
+ * git diff ... | ai-code-review --performance # 性能审查
9
+ */
10
+
11
+ const { reviewMain, summaryMain, performanceReviewMain } = require("../dist/index");
12
+
13
+ const isSummary = process.argv.includes("--summary");
14
+ const isPerformance = process.argv.includes("--performance");
15
+
16
+ let run;
17
+ if (isSummary) {
18
+ run = summaryMain;
19
+ } else if (isPerformance) {
20
+ run = performanceReviewMain;
21
+ } else {
22
+ run = reviewMain;
23
+ }
24
+
25
+ run().catch((error) => {
26
+ console.error("[ai-code-review] CLI 执行错误:", error);
27
+ process.exit(1);
28
+ });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 配置加载器
3
+ * 读取本地配置文件 + 环境变量
4
+ */
5
+ import { CodeReviewConfig } from "./types";
6
+ /**
7
+ * 加载配置
8
+ */
9
+ export declare const loadConfig: () => Promise<CodeReviewConfig>;
10
+ /**
11
+ * 验证配置完整性
12
+ */
13
+ export declare const validateConfig: (config: CodeReviewConfig) => boolean;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAW3C;;GAEG;AACH,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,gBAAgB,CAiC3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,gBAAgB,KAAG,OAczD,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * 配置加载器
4
+ * 读取本地配置文件 + 环境变量
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateConfig = exports.loadConfig = void 0;
8
+ const cosmiconfig_1 = require("cosmiconfig");
9
+ const explorer = (0, cosmiconfig_1.cosmiconfigSync)("aicr", {
10
+ searchPlaces: [
11
+ "aicr.config.js",
12
+ "aicr.config.ts",
13
+ ".aicr.config.js",
14
+ ".aicr.config.ts",
15
+ ],
16
+ });
17
+ /**
18
+ * 加载配置
19
+ */
20
+ const loadConfig = async () => {
21
+ // 1. 加载配置文件
22
+ const result = explorer.search();
23
+ if (result && result.filepath) {
24
+ console.error(`[config] Loaded config from: ${result.filepath}`);
25
+ }
26
+ else {
27
+ console.error("[config] No config file found, using defaults.");
28
+ }
29
+ const fileConfig = result?.config || {};
30
+ // 2. 合并配置(环境变量 > 配置文件 > 默认值)
31
+ const config = {
32
+ ai: {
33
+ model: fileConfig.ai?.model || "deepseek-chat",
34
+ endpoint: fileConfig.ai?.endpoint || "https://api.deepseek.com/chat/completions",
35
+ apiKey: process.env.MODEL_API_KEY || fileConfig.ai?.apiKey || "",
36
+ },
37
+ rules: {
38
+ custom: fileConfig.rules?.custom || [],
39
+ },
40
+ review: {
41
+ severity: fileConfig.review?.severity || "warning",
42
+ ignore: fileConfig.review?.ignore || [],
43
+ maxComments: fileConfig.review?.maxComments || 100,
44
+ },
45
+ summary: {
46
+ enabled: fileConfig.summary?.enabled ?? false,
47
+ },
48
+ };
49
+ console.error("[config] final config:", JSON.stringify(config));
50
+ return config;
51
+ };
52
+ exports.loadConfig = loadConfig;
53
+ /**
54
+ * 验证配置完整性
55
+ */
56
+ const validateConfig = (config) => {
57
+ if (!config.ai.apiKey) {
58
+ console.error("[config] 缺少 API Key,请通过环境变量 MODEL_API_KEY 或配置文件设置");
59
+ return false;
60
+ }
61
+ if (!config.ai.endpoint) {
62
+ console.error("[config] 缺少 API Endpoint");
63
+ return false;
64
+ }
65
+ return true;
66
+ };
67
+ exports.validateConfig = validateConfig;
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA8C;AAG9C,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,MAAM,EAAE;IACvC,YAAY,EAAE;QACZ,gBAAgB;QAChB,gBAAgB;QAChB,iBAAiB;QACjB,iBAAiB;KAClB;CACF,CAAC,CAAC;AAEH;;GAEG;AACI,MAAM,UAAU,GAAG,KAAK,IAA+B,EAAE;IAC9D,YAAY;IACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;IACjC,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,UAAU,GAA8B,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IAEnE,6BAA6B;IAC7B,MAAM,MAAM,GAAqB;QAC/B,EAAE,EAAE;YACF,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,IAAI,eAAe;YAC9C,QAAQ,EACN,UAAU,CAAC,EAAE,EAAE,QAAQ,IAAI,2CAA2C;YACxE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE;SACjE;QACD,KAAK,EAAE;YACL,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE;SACvC;QACD,MAAM,EAAE;YACN,QAAQ,EAAG,UAAU,CAAC,MAAM,EAAE,QAAgB,IAAI,SAAS;YAC3D,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE;YACvC,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,IAAI,GAAG;SACnD;QACD,OAAO,EAAE;YACP,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK;SAC9C;KACF,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAjCW,QAAA,UAAU,cAiCrB;AAEF;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,MAAwB,EAAW,EAAE;IAClE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CACX,mDAAmD,CACpD,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAdW,QAAA,cAAc,kBAczB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 格式化器索引
3
+ */
4
+ export * from './rdjson';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * 格式化器索引
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./rdjson"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Reviewdog JSON 格式化器
3
+ */
4
+ import { AIComment, RdjsonDiagnostic, RdjsonOutput } from "../types";
5
+ /**
6
+ * 构建空的 Rdjson 输出
7
+ */
8
+ export declare const buildEmptyRdjson: (sourceName?: string) => RdjsonOutput;
9
+ /**
10
+ * 将 AI 评论转换为 Reviewdog 诊断信息
11
+ */
12
+ export declare const buildDiagnosticsFromComments: (comments: AIComment[]) => RdjsonDiagnostic[];
13
+ /**
14
+ * 构建完整的 Rdjson 输出
15
+ */
16
+ export declare const buildRdjson: (comments: AIComment[], sourceName?: string) => RdjsonOutput;
17
+ //# sourceMappingURL=rdjson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rdjson.d.ts","sourceRoot":"","sources":["../../src/formatters/rdjson.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAY,MAAM,UAAU,CAAC;AAc/E;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,mBAA6B,KAC5B,YAGD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,4BAA4B,GACvC,UAAU,SAAS,EAAE,KACpB,gBAAgB,EAyBlB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,SAAS,EAAE,EACrB,mBAA6B,KAC5B,YAMF,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Reviewdog JSON 格式化器
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildRdjson = exports.buildDiagnosticsFromComments = exports.buildEmptyRdjson = void 0;
7
+ /**
8
+ * 转换 severity 到 Reviewdog 格式
9
+ */
10
+ const toRdjsonSeverity = (severity) => {
11
+ const map = {
12
+ error: "ERROR",
13
+ warning: "WARNING",
14
+ info: "INFO",
15
+ };
16
+ return map[severity] || "WARNING";
17
+ };
18
+ /**
19
+ * 构建空的 Rdjson 输出
20
+ */
21
+ const buildEmptyRdjson = (sourceName = "ai-code-review") => ({
22
+ source: { name: sourceName },
23
+ diagnostics: [],
24
+ });
25
+ exports.buildEmptyRdjson = buildEmptyRdjson;
26
+ /**
27
+ * 将 AI 评论转换为 Reviewdog 诊断信息
28
+ */
29
+ const buildDiagnosticsFromComments = (comments) => {
30
+ if (!Array.isArray(comments)) {
31
+ return [];
32
+ }
33
+ return comments
34
+ .filter((item) => item && item.file && item.line)
35
+ .map((item) => {
36
+ const baseMessage = item.message || "AI Code Review 提示";
37
+ const suggestion = item.suggestion ? `\n建议:${item.suggestion}` : "";
38
+ return {
39
+ message: `${baseMessage}${suggestion}`,
40
+ location: {
41
+ path: item.file,
42
+ range: {
43
+ start: {
44
+ line: Number(item.line) || 1,
45
+ column: 1,
46
+ },
47
+ },
48
+ },
49
+ severity: toRdjsonSeverity(item.severity),
50
+ };
51
+ });
52
+ };
53
+ exports.buildDiagnosticsFromComments = buildDiagnosticsFromComments;
54
+ /**
55
+ * 构建完整的 Rdjson 输出
56
+ */
57
+ const buildRdjson = (comments, sourceName = "ai-code-review") => {
58
+ const diagnostics = (0, exports.buildDiagnosticsFromComments)(comments);
59
+ return {
60
+ source: { name: sourceName },
61
+ diagnostics,
62
+ };
63
+ };
64
+ exports.buildRdjson = buildRdjson;
65
+ //# sourceMappingURL=rdjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rdjson.js","sourceRoot":"","sources":["../../src/formatters/rdjson.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAgC,EAAE;IAC5E,MAAM,GAAG,GAAmD;QAC1D,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;KACb,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;AACpC,CAAC,CAAC;AAEF;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAC9B,UAAU,GAAG,gBAAgB,EACf,EAAE,CAAC,CAAC;IAClB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;IAC5B,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AALU,QAAA,gBAAgB,oBAK1B;AAEH;;GAEG;AACI,MAAM,4BAA4B,GAAG,CAC1C,QAAqB,EACD,EAAE;IACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;SAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,OAAO;YACL,OAAO,EAAE,GAAG,WAAW,GAAG,UAAU,EAAE;YACtC,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE;oBACL,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC5B,MAAM,EAAE,CAAC;qBACV;iBACF;aACF;YACD,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AA3BW,QAAA,4BAA4B,gCA2BvC;AAEF;;GAEG;AACI,MAAM,WAAW,GAAG,CACzB,QAAqB,EACrB,UAAU,GAAG,gBAAgB,EACf,EAAE;IAChB,MAAM,WAAW,GAAG,IAAA,oCAA4B,EAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC5B,WAAW;KACZ,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,WAAW,eAStB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * AI Code Review 主入口
3
+ *
4
+ * 使用本地 .aicr.config.js + MODEL_API_KEY 调用 LLM 进行代码审查
5
+ */
6
+ /**
7
+ * Review 模式:逐行代码审查,输出 rdjson
8
+ */
9
+ export declare const reviewMain: () => Promise<void>;
10
+ /**
11
+ * Summary 模式:生成改动汇总报告,输出纯 Markdown 文本到 stdout
12
+ */
13
+ export declare const summaryMain: () => Promise<void>;
14
+ /**
15
+ * Performance Review 模式:性能审查,输出 rdjson
16
+ */
17
+ export declare const performanceReviewMain: () => Promise<void>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,IAAI,CA+B/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAwBhD,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,IAAI,CA+B1D,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * AI Code Review 主入口
4
+ *
5
+ * 使用本地 .aicr.config.js + MODEL_API_KEY 调用 LLM 进行代码审查
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.performanceReviewMain = exports.summaryMain = exports.reviewMain = void 0;
12
+ const minimist_1 = __importDefault(require("minimist"));
13
+ const config_1 = require("./config");
14
+ const formatters_1 = require("./formatters");
15
+ const reviewer_1 = require("./reviewer");
16
+ const performanceReviewer_1 = require("./performanceReviewer");
17
+ const summarizer_1 = require("./summarizer");
18
+ const utils_1 = require("./utils");
19
+ /**
20
+ * Review 模式:逐行代码审查,输出 rdjson
21
+ */
22
+ const reviewMain = async () => {
23
+ try {
24
+ const diff = await (0, utils_1.readStdin)();
25
+ if (!diff || !diff.trim()) {
26
+ console.error("[ai-code-review] 未读取到 diff,输出空诊断结果");
27
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)()));
28
+ process.exit(0);
29
+ }
30
+ const config = await (0, config_1.loadConfig)();
31
+ if (!(0, config_1.validateConfig)(config)) {
32
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)()));
33
+ process.exit(0);
34
+ }
35
+ const result = await (0, reviewer_1.reviewCode)(diff, config);
36
+ if (!result) {
37
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)()));
38
+ process.exit(0);
39
+ }
40
+ const output = (0, formatters_1.buildRdjson)(result.comments);
41
+ console.log(JSON.stringify(output));
42
+ }
43
+ catch (error) {
44
+ console.error("[ai-code-review] 未预期的错误:", error);
45
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)()));
46
+ process.exit(1);
47
+ }
48
+ };
49
+ exports.reviewMain = reviewMain;
50
+ /**
51
+ * Summary 模式:生成改动汇总报告,输出纯 Markdown 文本到 stdout
52
+ */
53
+ const summaryMain = async () => {
54
+ try {
55
+ const diff = await (0, utils_1.readStdin)();
56
+ if (!diff || !diff.trim()) {
57
+ console.error("[ai-code-review] 未读取到 diff,跳过汇总");
58
+ process.exit(0);
59
+ }
60
+ const config = await (0, config_1.loadConfig)();
61
+ if (!(0, config_1.validateConfig)(config)) {
62
+ process.exit(0);
63
+ }
64
+ const markdown = await (0, summarizer_1.generateSummary)(diff, config);
65
+ if (markdown) {
66
+ console.log(markdown);
67
+ }
68
+ }
69
+ catch (error) {
70
+ console.error("[ai-code-review] 汇总生成错误:", error);
71
+ process.exit(1);
72
+ }
73
+ };
74
+ exports.summaryMain = summaryMain;
75
+ const PERF_SOURCE_NAME = "ai-code-performance-review";
76
+ /**
77
+ * Performance Review 模式:性能审查,输出 rdjson
78
+ */
79
+ const performanceReviewMain = async () => {
80
+ try {
81
+ const diff = await (0, utils_1.readStdin)();
82
+ if (!diff || !diff.trim()) {
83
+ console.error("[ai-code-review] 未读取到 diff,输出空诊断结果");
84
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)(PERF_SOURCE_NAME)));
85
+ process.exit(0);
86
+ }
87
+ const config = await (0, config_1.loadConfig)();
88
+ if (!(0, config_1.validateConfig)(config)) {
89
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)(PERF_SOURCE_NAME)));
90
+ process.exit(0);
91
+ }
92
+ const result = await (0, performanceReviewer_1.reviewPerformance)(diff, config);
93
+ if (!result) {
94
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)(PERF_SOURCE_NAME)));
95
+ process.exit(0);
96
+ }
97
+ const output = (0, formatters_1.buildRdjson)(result.comments, PERF_SOURCE_NAME);
98
+ console.log(JSON.stringify(output));
99
+ }
100
+ catch (error) {
101
+ console.error("[ai-code-review] 性能审查未预期的错误:", error);
102
+ console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)(PERF_SOURCE_NAME)));
103
+ process.exit(1);
104
+ }
105
+ };
106
+ exports.performanceReviewMain = performanceReviewMain;
107
+ /**
108
+ * CLI 入口
109
+ * 用法:
110
+ * git diff ... | ai-code-review # 逐行代码规范审查
111
+ * git diff ... | ai-code-review --summary # 改动汇总
112
+ * git diff ... | ai-code-review --performance # 性能审查
113
+ *
114
+ * 环境变量:
115
+ * MODEL_API_KEY - 模型 API Key
116
+ */
117
+ if (require.main === module) {
118
+ const args = (0, minimist_1.default)(process.argv.slice(2));
119
+ let run;
120
+ if (args.summary) {
121
+ run = exports.summaryMain;
122
+ }
123
+ else if (args.performance) {
124
+ run = exports.performanceReviewMain;
125
+ }
126
+ else {
127
+ run = exports.reviewMain;
128
+ }
129
+ run().catch((error) => {
130
+ console.error("[ai-code-review] CLI 执行错误:", error);
131
+ process.exit(1);
132
+ });
133
+ }
134
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * AI Code Performance Reviewer 核心逻辑
3
+ *
4
+ * 与 reviewer 共享 diff 解析、响应解析、评论对齐等基础设施,
5
+ * 仅替换 prompt 和规则为性能审查专用版本。
6
+ *
7
+ * 与代码规范审查的区别:
8
+ * - 按单文件粒度调用模型(而非整个 diff 一次调用)
9
+ * - 仅审查 js/ts/tsx/jsx/vue 文件
10
+ */
11
+ import { CodeReviewConfig } from "../types";
12
+ import { parseAIResponse } from "../reviewer/parseResponse";
13
+ /**
14
+ * 执行 AI 性能审查(按单文件调用模型,仅审查 js/ts/tsx/jsx/vue 文件)
15
+ */
16
+ export declare const reviewPerformance: (diff: string, config: CodeReviewConfig) => Promise<ReturnType<typeof parseAIResponse>>;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performanceReviewer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAa,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAQvD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA0L5D;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CA2F5C,CAAC"}