@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.
- package/bin/ai-code-review.js +8 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -8
- package/dist/index.js.map +1 -1
- package/dist/reviewer/index.d.ts.map +1 -1
- package/dist/reviewer/index.js +75 -6
- package/dist/reviewer/index.js.map +1 -1
- package/dist/summarizer/index.d.ts +10 -0
- package/dist/summarizer/index.d.ts.map +1 -0
- package/dist/summarizer/index.js +117 -0
- package/dist/summarizer/index.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/bin/ai-code-review.js
CHANGED
|
@@ -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
|
-
|
|
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
|
});
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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;
|
package/dist/config.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
50
|
-
* git diff ... |
|
|
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,
|
|
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
|
|
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;
|
|
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"}
|
package/dist/reviewer/index.js
CHANGED
|
@@ -66,19 +66,88 @@ const buildUserPrompt = (diff, rules) => {
|
|
|
66
66
|
* 解析 AI 返回的 JSON(兼容代码块包裹)
|
|
67
67
|
*/
|
|
68
68
|
const parseAIResponse = (content) => {
|
|
69
|
-
|
|
70
|
-
const
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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":";AAAA;;GAEG;;;AAGH,mCAIiB;AACjB,qDAAoE;AAEpE;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,0CAA0C;IAC1C,aAAa;IACb,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG,GAAW,EAAE;IACrC,OAAO,+DAA+D,CAAC;AACzE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,KAAe,EAAU,EAAE;IAChE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,eAAe,GAAG,IAAA,gCAAwB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE7D,OAAO;QACL,gCAAgC;QAChC,yBAAyB;QACzB,GAAG;QACH,iBAAiB;QACjB,OAAO;QACP,8BAA8B;QAC9B,oBAAoB;QACpB,uCAAuC;QACvC,2BAA2B;QAC3B,mCAAmC;QACnC,wCAAwC;QACxC,OAAO;QACP,KAAK;QACL,GAAG;QACH,KAAK;QACL,kCAAkC;QAClC,oCAAoC;QACpC,4CAA4C;QAC5C,6CAA6C;QAC7C,kEAAkE;QAClE,yDAAyD;QACzD,+CAA+C;QAC/C,EAAE;QACF,4CAA4C;QAC5C,eAAe;QACf,EAAE;QACF,WAAW;QACX,UAAU;QACV,EAAE;QACF,eAAe;QACf,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,OAAe,EAAqB,EAAE;IAC7D,
|
|
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 返回的评论
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|