@wuyanbin/ai-code-review 1.1.16 → 1.1.18

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.
@@ -2,11 +2,17 @@
2
2
 
3
3
  /**
4
4
  * AI Code Review CLI 入口
5
+ * 用法:
6
+ * git diff ... | ai-code-review # 逐行 review
7
+ * git diff ... | ai-code-review --summary # 改动汇总
5
8
  */
6
9
 
7
- const { main } = require("../dist/index");
10
+ const { main, summaryMain } = require("../dist/index");
8
11
 
9
- main().catch((error) => {
12
+ const isSummary = process.argv.includes("--summary");
13
+ const run = isSummary ? summaryMain : main;
14
+
15
+ run().catch((error) => {
10
16
  console.error("[ai-code-review] CLI 执行错误:", error);
11
17
  process.exit(1);
12
18
  });
@@ -1 +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,CA8B3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,gBAAgB,KAAG,OAczD,CAAC"}
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 CHANGED
@@ -42,6 +42,9 @@ const loadConfig = async () => {
42
42
  ignore: fileConfig.review?.ignore || [],
43
43
  maxComments: fileConfig.review?.maxComments || 100,
44
44
  },
45
+ summary: {
46
+ enabled: fileConfig.summary?.enabled ?? false,
47
+ },
45
48
  };
46
49
  console.error("[config] final config:", JSON.stringify(config));
47
50
  return config;
@@ -1 +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;KACF,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA9BW,QAAA,UAAU,cA8BrB;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,yCAAyC,CAC1C,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"}
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,yCAAyC,CAC1C,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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,11 @@
2
2
  * AI Code Review 主入口
3
3
  */
4
4
  /**
5
- * 主函数
5
+ * Review 模式:逐行代码审查,输出 rdjson
6
6
  */
7
- export declare const main: () => Promise<void>;
7
+ export declare const reviewMain: () => Promise<void>;
8
+ /**
9
+ * Summary 模式:生成改动汇总报告,输出 rdjson(单条 diagnostic 包含 Markdown)
10
+ */
11
+ export declare const summaryMain: () => Promise<void>;
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,eAAO,MAAM,IAAI,QAAa,OAAO,CAAC,IAAI,CAoCzC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,IAAI,CAoC/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA6BhD,CAAC"}
package/dist/index.js CHANGED
@@ -2,16 +2,21 @@
2
2
  /**
3
3
  * AI Code Review 主入口
4
4
  */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
5
8
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.main = void 0;
9
+ exports.summaryMain = exports.reviewMain = void 0;
10
+ const minimist_1 = __importDefault(require("minimist"));
7
11
  const config_1 = require("./config");
8
12
  const formatters_1 = require("./formatters");
9
13
  const reviewer_1 = require("./reviewer");
14
+ const summarizer_1 = require("./summarizer");
10
15
  const utils_1 = require("./utils");
11
16
  /**
12
- * 主函数
17
+ * Review 模式:逐行代码审查,输出 rdjson
13
18
  */
14
- const main = async () => {
19
+ const reviewMain = async () => {
15
20
  try {
16
21
  // 1. 加载配置
17
22
  const config = await (0, config_1.loadConfig)();
@@ -43,16 +48,48 @@ const main = async () => {
43
48
  process.exit(1);
44
49
  }
45
50
  };
46
- exports.main = main;
51
+ exports.reviewMain = reviewMain;
52
+ /**
53
+ * Summary 模式:生成改动汇总报告,输出 rdjson(单条 diagnostic 包含 Markdown)
54
+ */
55
+ const summaryMain = async () => {
56
+ const emptySummaryRdjson = {
57
+ source: { name: "ai-code-review-summary" },
58
+ diagnostics: [],
59
+ };
60
+ try {
61
+ const config = await (0, config_1.loadConfig)();
62
+ if (!(0, config_1.validateConfig)(config)) {
63
+ console.log(JSON.stringify(emptySummaryRdjson));
64
+ process.exit(0);
65
+ }
66
+ const diff = await (0, utils_1.readStdin)();
67
+ if (!diff || !diff.trim()) {
68
+ console.error("[ai-code-review] 未读取到 diff,跳过汇总");
69
+ console.log(JSON.stringify(emptySummaryRdjson));
70
+ process.exit(0);
71
+ }
72
+ const output = await (0, summarizer_1.generateSummary)(diff, config);
73
+ console.log(JSON.stringify(output));
74
+ }
75
+ catch (error) {
76
+ console.error("[ai-code-review] 汇总生成错误:", error);
77
+ console.log(JSON.stringify(emptySummaryRdjson));
78
+ process.exit(1);
79
+ }
80
+ };
81
+ exports.summaryMain = summaryMain;
47
82
  /**
48
83
  * CLI 入口
49
- * 兼容直接执行 dist/index.js 的场景:
50
- * git diff ... | node dist/index.js | reviewdog ...
84
+ * 用法:
85
+ * git diff ... | ai-code-review # 逐行 review
86
+ * git diff ... | ai-code-review --summary # 改动汇总
51
87
  */
52
88
  if (require.main === module) {
53
- (0, exports.main)().catch((error) => {
89
+ const args = (0, minimist_1.default)(process.argv.slice(2));
90
+ const run = args.summary ? exports.summaryMain : exports.reviewMain;
91
+ run().catch((error) => {
54
92
  console.error("[ai-code-review] CLI 执行错误:", error);
55
- console.log(JSON.stringify((0, formatters_1.buildEmptyRdjson)()));
56
93
  process.exit(1);
57
94
  });
58
95
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAAsD;AACtD,6CAA6D;AAC7D,yCAAwC;AACxC,mCAAoC;AACpC;;GAEG;AACI,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IAC5C,IAAI,CAAC;QACH,UAAU;QACV,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAU,GAAE,CAAC;QAElC,UAAU;QACV,IAAI,CAAC,IAAA,uBAAc,EAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,GAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,aAAa;QACb,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAS,GAAE,CAAC;QAE/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,GAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAU,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,GAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW;QACX,MAAM,MAAM,GAAG,IAAA,wBAAW,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,GAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AApCW,QAAA,IAAI,QAoCf;AAEF;;;;GAIG;AACH,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAA,YAAI,GAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,GAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAwFxD;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAmE3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAgKxD;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAmE3B,CAAC"}
@@ -66,19 +66,88 @@ const buildUserPrompt = (diff, rules) => {
66
66
  * 解析 AI 返回的 JSON(兼容代码块包裹)
67
67
  */
68
68
  const parseAIResponse = (content) => {
69
- // 兼容 ```json ... ``` 代码块的情况
70
- const contentText = content
69
+ console.error("[reviewer] AI 返回内容:", content);
70
+ const stripFences = (s) => (s ?? "")
71
71
  .replace(/^```(?:json)?\s*/i, "")
72
72
  .replace(/```$/i, "")
73
73
  .trim();
74
+ const extractJsonObject = (s) => {
75
+ const text = stripFences(s);
76
+ const start = text.indexOf("{");
77
+ const end = text.lastIndexOf("}");
78
+ if (start >= 0 && end > start)
79
+ return text.slice(start, end + 1);
80
+ return text;
81
+ };
82
+ /**
83
+ * 修复 JSON 字符串字面量中的非法控制字符(未转义的 \n/\r/\t 或其他 0x00-0x1F)
84
+ * 典型症状:SyntaxError: Bad control character in string literal
85
+ */
86
+ const escapeControlCharsInJsonStrings = (json) => {
87
+ let out = "";
88
+ let inString = false;
89
+ let escape = false;
90
+ for (let i = 0; i < json.length; i++) {
91
+ const ch = json[i];
92
+ if (!inString) {
93
+ if (ch === '"')
94
+ inString = true;
95
+ out += ch;
96
+ continue;
97
+ }
98
+ // inString === true
99
+ if (escape) {
100
+ out += ch;
101
+ escape = false;
102
+ continue;
103
+ }
104
+ if (ch === "\\") {
105
+ out += ch;
106
+ escape = true;
107
+ continue;
108
+ }
109
+ if (ch === '"') {
110
+ out += ch;
111
+ inString = false;
112
+ continue;
113
+ }
114
+ const code = ch.charCodeAt(0);
115
+ if (code < 0x20) {
116
+ // JSON 字符串内不允许出现裸控制字符,必须转义
117
+ if (ch === "\n")
118
+ out += "\\n";
119
+ else if (ch === "\r")
120
+ out += "\\r";
121
+ else if (ch === "\t")
122
+ out += "\\t";
123
+ else if (ch === "\b")
124
+ out += "\\b";
125
+ else if (ch === "\f")
126
+ out += "\\f";
127
+ else
128
+ out += `\\u${code.toString(16).padStart(4, "0")}`;
129
+ continue;
130
+ }
131
+ out += ch;
132
+ }
133
+ return out;
134
+ };
135
+ const contentText = extractJsonObject(content);
74
136
  try {
75
137
  return JSON.parse(contentText);
76
138
  }
77
139
  catch (parseError) {
78
- console.error("[reviewer] AI 返回内容 JSON 解析失败");
79
- console.error("[reviewer] 原始内容:", content);
80
- console.error(parseError);
81
- return null;
140
+ // 尝试修复常见“字符串内控制字符未转义”问题后再解析
141
+ try {
142
+ const repaired = escapeControlCharsInJsonStrings(contentText);
143
+ return JSON.parse(repaired);
144
+ }
145
+ catch (parseError2) {
146
+ console.error("[reviewer] AI 返回内容 JSON 解析失败");
147
+ console.error("[reviewer] 原始内容:", content);
148
+ console.error(parseError2);
149
+ return null;
150
+ }
82
151
  }
83
152
  };
84
153
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 代码改动汇总模块
3
+ * 基于 git diff 生成结构化的 Markdown 改动摘要,输出 rdjson 供 reviewdog 发布
4
+ */
5
+ import { CodeReviewConfig, RdjsonOutput } from "../types";
6
+ /**
7
+ * 生成代码改动汇总,返回 rdjson 格式输出
8
+ */
9
+ export declare const generateSummary: (diff: string, config: CodeReviewConfig) => Promise<RdjsonOutput>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/summarizer/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAuF1D;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,OAAO,CAAC,YAAY,CAoCtB,CAAC"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * 代码改动汇总模块
4
+ * 基于 git diff 生成结构化的 Markdown 改动摘要,输出 rdjson 供 reviewdog 发布
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateSummary = void 0;
8
+ const utils_1 = require("../reviewer/utils");
9
+ const factory_1 = require("../reviewer/modelAdapters/factory");
10
+ const buildSummarySystemPrompt = () => {
11
+ return [
12
+ "你是一位资深开发工程师,擅长分析代码改动并生成清晰的技术摘要。",
13
+ "你需要根据给定的 Git diff,生成一份结构化的代码改动汇总报告。",
14
+ "报告使用 Markdown 格式,语言为中文,内容简洁准确。",
15
+ ].join("");
16
+ };
17
+ const buildSummaryUserPrompt = (diff) => {
18
+ return [
19
+ "请根据以下 Git diff 生成一份代码改动汇总报告。",
20
+ "",
21
+ "要求:",
22
+ "1. 直接输出 Markdown 文本,不要包裹在代码块中;",
23
+ "2. 按以下结构组织内容:",
24
+ "",
25
+ "## 概述",
26
+ "用 1-2 句话简要说明本次改动的整体目的和范围。",
27
+ "",
28
+ "## 主要变更",
29
+ "按以下类别分类列出(跳过没有对应改动的类别):",
30
+ "- **新功能**:新增的组件、页面、服务等",
31
+ "- **Bug 修复**:修复的问题及修复方案",
32
+ "- **重构优化**:代码结构调整、性能优化等",
33
+ "- **依赖更新**:package.json 等依赖变更",
34
+ "- **配置调整**:配置文件的修改",
35
+ "",
36
+ "每个变更项用简短的描述说明改了什么、为什么改。",
37
+ "",
38
+ "## 受影响文件",
39
+ "用表格列出所有改动文件:",
40
+ "| 文件路径 | 变更类型 | 说明 |",
41
+ "| --- | --- | --- |",
42
+ "",
43
+ "变更类型为:新增 / 修改 / 删除。",
44
+ "",
45
+ "## 注意事项",
46
+ '列出需要关注的点,例如 breaking changes、需要额外测试的地方、潜在风险等。如果没有则写"无"。',
47
+ "",
48
+ "---",
49
+ "",
50
+ "下面是 Git diff:",
51
+ diff,
52
+ ].join("\n");
53
+ };
54
+ /**
55
+ * 从 AI 返回的内容中清理 Markdown(去除可能的代码块包裹)
56
+ */
57
+ const cleanMarkdownResponse = (content) => {
58
+ let text = content.trim();
59
+ if (text.startsWith("```markdown")) {
60
+ text = text.slice("```markdown".length);
61
+ }
62
+ else if (text.startsWith("```md")) {
63
+ text = text.slice("```md".length);
64
+ }
65
+ else if (text.startsWith("```")) {
66
+ text = text.slice(3);
67
+ }
68
+ if (text.endsWith("```")) {
69
+ text = text.slice(0, -3);
70
+ }
71
+ return text.trim();
72
+ };
73
+ const buildSummaryRdjson = (markdown) => ({
74
+ source: { name: "ai-code-review-summary" },
75
+ diagnostics: [
76
+ {
77
+ message: markdown,
78
+ location: {
79
+ path: "__summary__",
80
+ range: { start: { line: 0, column: 0 } },
81
+ },
82
+ severity: "INFO",
83
+ },
84
+ ],
85
+ });
86
+ const buildEmptySummaryRdjson = () => ({
87
+ source: { name: "ai-code-review-summary" },
88
+ diagnostics: [],
89
+ });
90
+ /**
91
+ * 生成代码改动汇总,返回 rdjson 格式输出
92
+ */
93
+ const generateSummary = async (diff, config) => {
94
+ const effectiveDiff = (0, utils_1.filterDiffByIgnore)(diff, config.review?.ignore);
95
+ if (!effectiveDiff || !effectiveDiff.trim()) {
96
+ console.error("[summarizer] diff 为空,跳过汇总");
97
+ return buildEmptySummaryRdjson();
98
+ }
99
+ if (!config.ai.apiKey || !config.ai.endpoint) {
100
+ console.error("[summarizer] 缺少 API 配置");
101
+ return buildEmptySummaryRdjson();
102
+ }
103
+ const systemPrompt = buildSummarySystemPrompt();
104
+ const userPrompt = buildSummaryUserPrompt(effectiveDiff);
105
+ const modelAdapter = (0, factory_1.createModelAdapterFactory)(config.ai.endpoint, config.ai.apiKey);
106
+ console.error("[summarizer] 正在调用 AI 生成汇总报告...");
107
+ const rawContent = await modelAdapter.call(config.ai.model, systemPrompt, userPrompt);
108
+ if (!rawContent) {
109
+ console.error("[summarizer] AI 未返回有效内容");
110
+ return buildEmptySummaryRdjson();
111
+ }
112
+ const markdown = cleanMarkdownResponse(rawContent);
113
+ console.error("[summarizer] 汇总报告生成完成");
114
+ return buildSummaryRdjson(markdown);
115
+ };
116
+ exports.generateSummary = generateSummary;
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/summarizer/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -27,6 +27,12 @@ export interface ReviewConfig {
27
27
  ignore?: string[];
28
28
  maxComments?: number;
29
29
  }
30
+ /**
31
+ * 汇总报告配置
32
+ */
33
+ export interface SummaryConfig {
34
+ enabled?: boolean;
35
+ }
30
36
  /**
31
37
  * 完整配置接口
32
38
  */
@@ -34,6 +40,7 @@ export interface CodeReviewConfig {
34
40
  ai: AIConfig;
35
41
  rules?: RulesConfig;
36
42
  review?: ReviewConfig;
43
+ summary?: SummaryConfig;
37
44
  }
38
45
  /**
39
46
  * AI 返回的评论
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;aAChB,CAAC;SACH,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;aAChB,CAAC;SACH,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wuyanbin/ai-code-review",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
4
4
  "description": "AI-powered code review tool for GitLab CI/CD",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",