@wuyanbin/ai-code-review 1.1.13 → 1.1.15
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/dist/reviewer/index.d.ts.map +1 -1
- package/dist/reviewer/index.js +13 -4
- package/dist/reviewer/index.js.map +1 -1
- package/dist/reviewer/utils.d.ts +16 -0
- package/dist/reviewer/utils.d.ts.map +1 -1
- package/dist/reviewer/utils.js +258 -1
- package/dist/reviewer/utils.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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;AAwFxD;;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
|
@@ -27,6 +27,7 @@ const buildSystemPrompt = () => {
|
|
|
27
27
|
*/
|
|
28
28
|
const buildUserPrompt = (diff, rules) => {
|
|
29
29
|
const rulesBrief = rules.join("\n");
|
|
30
|
+
const addedLinesIndex = (0, utils_1.buildAddedLinesIndexText)(diff, 500);
|
|
30
31
|
return [
|
|
31
32
|
"请你只针对 diff 中【新增或修改】的代码行给出审查意见。",
|
|
32
33
|
"输出格式要求:必须返回严格的 JSON,形如:",
|
|
@@ -35,7 +36,8 @@ const buildUserPrompt = (diff, rules) => {
|
|
|
35
36
|
" {",
|
|
36
37
|
' "file": "src/xxx.tsx",',
|
|
37
38
|
' "line": 123,',
|
|
38
|
-
' "
|
|
39
|
+
' "code": "该行的完整代码内容(不含 +/- 前缀)",',
|
|
40
|
+
' "severity": "info",',
|
|
39
41
|
' "message": "问题描述(中文,简洁具体)",',
|
|
40
42
|
' "suggestion": "可选的修复建议或更佳写法(中文)"',
|
|
41
43
|
" }",
|
|
@@ -44,7 +46,14 @@ const buildUserPrompt = (diff, rules) => {
|
|
|
44
46
|
"注意:",
|
|
45
47
|
"1. 一定要保证输出是合法的 JSON,不能包含注释或多余文本;",
|
|
46
48
|
'2. 如果没有任何问题,也请返回 {"comments": []};',
|
|
47
|
-
"3.
|
|
49
|
+
"3. severity 只能是 info / warning / error 之一;",
|
|
50
|
+
"4. file 必须使用 diff 中出现的文件路径(不要带 a/ 或 b/ 前缀);",
|
|
51
|
+
"5. line 必须是 new file 侧的真实行号(也就是 @@ ... +<newStart> ... 计算出来的行号);",
|
|
52
|
+
"6. code 必须与该 file:line 对应的“目标行内容”一致(不包含 diff 的 +/- 前缀);",
|
|
53
|
+
"7. 你只能对【新增行(+)】发表评论;如果 line 不对应新增行,请改选最近的新增行。",
|
|
54
|
+
"",
|
|
55
|
+
"可评论行索引(仅 diff 中的新增行 +,用于精确选择 line 与 code):",
|
|
56
|
+
addedLinesIndex,
|
|
48
57
|
"",
|
|
49
58
|
"项目规范(摘要):",
|
|
50
59
|
rulesBrief,
|
|
@@ -78,7 +87,6 @@ const parseAIResponse = (content) => {
|
|
|
78
87
|
const reviewCode = async (diff, config) => {
|
|
79
88
|
// 先根据 ignore 规则过滤掉不需要审查的文件 diff
|
|
80
89
|
const effectiveDiff = (0, utils_1.filterDiffByIgnore)(diff, config.review?.ignore);
|
|
81
|
-
console.error("=== effectiveDiff ===\n", effectiveDiff);
|
|
82
90
|
if (!effectiveDiff || !effectiveDiff.trim()) {
|
|
83
91
|
console.error("[reviewer] diff 为空,跳过审查");
|
|
84
92
|
return { comments: [] };
|
|
@@ -105,7 +113,8 @@ const reviewCode = async (diff, config) => {
|
|
|
105
113
|
}
|
|
106
114
|
// 应用过滤和限制
|
|
107
115
|
let comments = result.comments || [];
|
|
108
|
-
|
|
116
|
+
// 关键:把 AI 的 file/line 纠偏到 diff 中真实存在的新增行,避免错贴到无关代码
|
|
117
|
+
comments = (0, utils_1.alignCommentsToDiffAddedLines)(effectiveDiff, comments);
|
|
109
118
|
// 过滤 severity
|
|
110
119
|
if (config.review?.severity) {
|
|
111
120
|
const severityOrder = { info: 0, warning: 1, error: 2 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reviewer/index.ts"],"names":[],"mappings":"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"}
|
package/dist/reviewer/utils.d.ts
CHANGED
|
@@ -15,4 +15,20 @@ export declare const shouldIgnoreFile: (filePath: string, ignorePatterns: string
|
|
|
15
15
|
* - 命中 ignore 的文件整块跳过
|
|
16
16
|
*/
|
|
17
17
|
export declare const filterDiffByIgnore: (diff: string, ignorePatterns: string[] | undefined) => string;
|
|
18
|
+
/**
|
|
19
|
+
* 将 diff 中所有新增行汇总成“可评论行索引”文本,帮助模型精确选择 line。
|
|
20
|
+
* 为避免 prompt 过大,默认最多输出 maxLines 条新增行索引。
|
|
21
|
+
*/
|
|
22
|
+
export declare const buildAddedLinesIndexText: (diff: string, maxLines?: number) => string;
|
|
23
|
+
/**
|
|
24
|
+
* 将 AI 返回的 file/line 纠偏到“diff 中真实存在的新增行”:
|
|
25
|
+
* - 优先用 comment.code(目标行内容)做匹配
|
|
26
|
+
* - 兜底用 comment.line 找最近的新增行
|
|
27
|
+
* - 若找不到对应文件或该文件无新增行,直接丢弃该条评论(避免错贴到无关代码)
|
|
28
|
+
*/
|
|
29
|
+
export declare const alignCommentsToDiffAddedLines: <T extends {
|
|
30
|
+
file: string;
|
|
31
|
+
line: number;
|
|
32
|
+
code?: string;
|
|
33
|
+
}>(diff: string, comments: T[]) => T[];
|
|
18
34
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAwB9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,OAG7D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,MAiEF,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAwB9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,OAG7D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,EAChB,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,gBAAgB,MAAM,EAAE,GAAG,SAAS,KACnC,MAiEF,CAAC;AA2JF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,iBAAc,KACb,MAuBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,GACxC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAEvD,MAAM,MAAM,EACZ,UAAU,CAAC,EAAE,KACZ,CAAC,EAwHH,CAAC"}
|
package/dist/reviewer/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.filterDiffByIgnore = exports.shouldIgnoreFile = exports.matchGlob = exports.globToRegExp = void 0;
|
|
3
|
+
exports.alignCommentsToDiffAddedLines = exports.buildAddedLinesIndexText = exports.filterDiffByIgnore = exports.shouldIgnoreFile = exports.matchGlob = exports.globToRegExp = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* 简单的 glob -> RegExp 转换,只覆盖当前项目常用模式:
|
|
6
6
|
*
|
|
@@ -100,4 +100,261 @@ const filterDiffByIgnore = (diff, ignorePatterns) => {
|
|
|
100
100
|
return kept.join("\n");
|
|
101
101
|
};
|
|
102
102
|
exports.filterDiffByIgnore = filterDiffByIgnore;
|
|
103
|
+
const normalizeDiffPath = (p) => p
|
|
104
|
+
.trim()
|
|
105
|
+
.replace(/^[ab]\//, "")
|
|
106
|
+
.replace(/^\.\//, "");
|
|
107
|
+
const normalizeLineForMatch = (s) => (s ?? "").replace(/\r/g, "").trim().replace(/\s+/g, " ");
|
|
108
|
+
const diceCoefficientBigram = (a, b) => {
|
|
109
|
+
const s1 = normalizeLineForMatch(a);
|
|
110
|
+
const s2 = normalizeLineForMatch(b);
|
|
111
|
+
if (!s1 && !s2)
|
|
112
|
+
return 1;
|
|
113
|
+
if (!s1 || !s2)
|
|
114
|
+
return 0;
|
|
115
|
+
if (s1 === s2)
|
|
116
|
+
return 1;
|
|
117
|
+
if (s1.length < 2 || s2.length < 2)
|
|
118
|
+
return 0;
|
|
119
|
+
const bigrams = (s) => {
|
|
120
|
+
const m = new Map();
|
|
121
|
+
for (let i = 0; i < s.length - 1; i++) {
|
|
122
|
+
const bg = s.slice(i, i + 2);
|
|
123
|
+
m.set(bg, (m.get(bg) ?? 0) + 1);
|
|
124
|
+
}
|
|
125
|
+
return m;
|
|
126
|
+
};
|
|
127
|
+
const b1 = bigrams(s1);
|
|
128
|
+
const b2 = bigrams(s2);
|
|
129
|
+
let intersection = 0;
|
|
130
|
+
for (const [bg, c1] of b1) {
|
|
131
|
+
const c2 = b2.get(bg) ?? 0;
|
|
132
|
+
intersection += Math.min(c1, c2);
|
|
133
|
+
}
|
|
134
|
+
const total = s1.length - 1 + (s2.length - 1);
|
|
135
|
+
return (2 * intersection) / total;
|
|
136
|
+
};
|
|
137
|
+
const parseUnifiedDiffAddedLines = (diff) => {
|
|
138
|
+
const files = new Map();
|
|
139
|
+
const lines = (diff ?? "").split("\n");
|
|
140
|
+
let currentFile = null;
|
|
141
|
+
let inHunk = false;
|
|
142
|
+
let oldLine = 0;
|
|
143
|
+
let newLine = 0;
|
|
144
|
+
const ensureFile = (filePath) => {
|
|
145
|
+
const key = normalizeDiffPath(filePath);
|
|
146
|
+
const existing = files.get(key);
|
|
147
|
+
if (existing)
|
|
148
|
+
return existing;
|
|
149
|
+
const created = {
|
|
150
|
+
file: key,
|
|
151
|
+
added: [],
|
|
152
|
+
addedByLine: new Map(),
|
|
153
|
+
};
|
|
154
|
+
files.set(key, created);
|
|
155
|
+
return created;
|
|
156
|
+
};
|
|
157
|
+
for (const raw of lines) {
|
|
158
|
+
const lineText = raw ?? "";
|
|
159
|
+
if (lineText.startsWith("diff --git ")) {
|
|
160
|
+
inHunk = false;
|
|
161
|
+
oldLine = 0;
|
|
162
|
+
newLine = 0;
|
|
163
|
+
currentFile = null;
|
|
164
|
+
const m = /^diff --git a\/(.+?) b\/(.+)$/.exec(lineText);
|
|
165
|
+
if (m) {
|
|
166
|
+
currentFile = normalizeDiffPath(m[2]);
|
|
167
|
+
ensureFile(currentFile);
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Prefer "+++ b/xxx" as the canonical path when present (rename/new file cases)
|
|
172
|
+
if (lineText.startsWith("+++ ")) {
|
|
173
|
+
// deleted file: "+++ /dev/null"
|
|
174
|
+
if (lineText.startsWith("+++ /dev/null")) {
|
|
175
|
+
currentFile = null;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const m = /^\+\+\+\s+b\/(.+)$/.exec(lineText);
|
|
179
|
+
if (m) {
|
|
180
|
+
currentFile = normalizeDiffPath(m[1]);
|
|
181
|
+
ensureFile(currentFile);
|
|
182
|
+
}
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (lineText.startsWith("@@")) {
|
|
186
|
+
// @@ -oldStart,oldLen +newStart,newLen @@
|
|
187
|
+
const m = /^@@\s+\-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/.exec(lineText);
|
|
188
|
+
if (!m) {
|
|
189
|
+
inHunk = false;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
inHunk = true;
|
|
193
|
+
oldLine = Number(m[1]) || 0;
|
|
194
|
+
newLine = Number(m[3]) || 0;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (!inHunk || !currentFile) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// hunk body
|
|
201
|
+
if (lineText.startsWith("+") && !lineText.startsWith("+++")) {
|
|
202
|
+
const idx = ensureFile(currentFile);
|
|
203
|
+
const content = lineText.slice(1);
|
|
204
|
+
idx.added.push({ line: newLine, content });
|
|
205
|
+
idx.addedByLine.set(newLine, content);
|
|
206
|
+
newLine += 1;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (lineText.startsWith("-") && !lineText.startsWith("---")) {
|
|
210
|
+
oldLine += 1;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (lineText.startsWith(" ")) {
|
|
214
|
+
oldLine += 1;
|
|
215
|
+
newLine += 1;
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// "" or other metadata
|
|
219
|
+
}
|
|
220
|
+
return files;
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* 将 diff 中所有新增行汇总成“可评论行索引”文本,帮助模型精确选择 line。
|
|
224
|
+
* 为避免 prompt 过大,默认最多输出 maxLines 条新增行索引。
|
|
225
|
+
*/
|
|
226
|
+
const buildAddedLinesIndexText = (diff, maxLines = 500) => {
|
|
227
|
+
const files = parseUnifiedDiffAddedLines(diff);
|
|
228
|
+
const rows = [];
|
|
229
|
+
let emitted = 0;
|
|
230
|
+
for (const [, idx] of files) {
|
|
231
|
+
for (const item of idx.added) {
|
|
232
|
+
if (emitted >= maxLines)
|
|
233
|
+
break;
|
|
234
|
+
rows.push(`[${idx.file}:${item.line}] ${item.content}`);
|
|
235
|
+
emitted += 1;
|
|
236
|
+
}
|
|
237
|
+
if (emitted >= maxLines)
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (rows.length === 0) {
|
|
241
|
+
return "(diff 中未检测到可评论的新增行)";
|
|
242
|
+
}
|
|
243
|
+
if (emitted >= maxLines) {
|
|
244
|
+
rows.push(`(注意:仅展示前 ${maxLines} 条新增行索引,后续新增行未展开)`);
|
|
245
|
+
}
|
|
246
|
+
return rows.join("\n");
|
|
247
|
+
};
|
|
248
|
+
exports.buildAddedLinesIndexText = buildAddedLinesIndexText;
|
|
249
|
+
/**
|
|
250
|
+
* 将 AI 返回的 file/line 纠偏到“diff 中真实存在的新增行”:
|
|
251
|
+
* - 优先用 comment.code(目标行内容)做匹配
|
|
252
|
+
* - 兜底用 comment.line 找最近的新增行
|
|
253
|
+
* - 若找不到对应文件或该文件无新增行,直接丢弃该条评论(避免错贴到无关代码)
|
|
254
|
+
*/
|
|
255
|
+
const alignCommentsToDiffAddedLines = (diff, comments) => {
|
|
256
|
+
if (!Array.isArray(comments) || comments.length === 0)
|
|
257
|
+
return [];
|
|
258
|
+
const files = parseUnifiedDiffAddedLines(diff);
|
|
259
|
+
const pickNearestByLine = (candidates, target) => {
|
|
260
|
+
let best = candidates[0];
|
|
261
|
+
let bestDist = Math.abs(best.line - target);
|
|
262
|
+
for (let i = 1; i < candidates.length; i++) {
|
|
263
|
+
const d = Math.abs(candidates[i].line - target);
|
|
264
|
+
if (d < bestDist) {
|
|
265
|
+
best = candidates[i];
|
|
266
|
+
bestDist = d;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return best;
|
|
270
|
+
};
|
|
271
|
+
const pickBestByCode = (candidates, code, preferredLine) => {
|
|
272
|
+
const target = normalizeLineForMatch(code);
|
|
273
|
+
// 1) exact match first
|
|
274
|
+
const exact = [];
|
|
275
|
+
for (const cand of candidates) {
|
|
276
|
+
if (normalizeLineForMatch(cand.content) === target) {
|
|
277
|
+
exact.push(cand);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (exact.length === 1)
|
|
281
|
+
return exact[0];
|
|
282
|
+
if (exact.length > 1) {
|
|
283
|
+
if (preferredLine != null && Number.isFinite(preferredLine)) {
|
|
284
|
+
return pickNearestByLine(exact, preferredLine);
|
|
285
|
+
}
|
|
286
|
+
return exact[0];
|
|
287
|
+
}
|
|
288
|
+
// 2) contains heuristic
|
|
289
|
+
const contains = [];
|
|
290
|
+
for (const cand of candidates) {
|
|
291
|
+
const n = normalizeLineForMatch(cand.content);
|
|
292
|
+
if (!n)
|
|
293
|
+
continue;
|
|
294
|
+
if (n.includes(target) || target.includes(n)) {
|
|
295
|
+
contains.push({ cand, score: 0.9 });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (contains.length === 1)
|
|
299
|
+
return contains[0].cand;
|
|
300
|
+
if (contains.length > 1) {
|
|
301
|
+
if (preferredLine != null && Number.isFinite(preferredLine)) {
|
|
302
|
+
return pickNearestByLine(contains.map((x) => x.cand), preferredLine);
|
|
303
|
+
}
|
|
304
|
+
return contains[0].cand;
|
|
305
|
+
}
|
|
306
|
+
// 3) fuzzy by dice coefficient
|
|
307
|
+
let best = null;
|
|
308
|
+
let bestScore = 0;
|
|
309
|
+
for (const cand of candidates) {
|
|
310
|
+
const score = diceCoefficientBigram(cand.content, code);
|
|
311
|
+
if (score > bestScore) {
|
|
312
|
+
bestScore = score;
|
|
313
|
+
best = cand;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// 阈值:过低的匹配宁愿不信,用 line 兜底
|
|
317
|
+
if (best && bestScore >= 0.55)
|
|
318
|
+
return best;
|
|
319
|
+
return null;
|
|
320
|
+
};
|
|
321
|
+
const aligned = [];
|
|
322
|
+
for (const c of comments) {
|
|
323
|
+
if (!c || !c.file)
|
|
324
|
+
continue;
|
|
325
|
+
const normalizedFile = normalizeDiffPath(c.file);
|
|
326
|
+
const idx = files.get(normalizedFile);
|
|
327
|
+
if (!idx || idx.added.length === 0) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
const preferredLine = typeof c.line === "number" && Number.isFinite(c.line) ? c.line : null;
|
|
331
|
+
let chosen = null;
|
|
332
|
+
if (typeof c.code === "string") {
|
|
333
|
+
chosen = pickBestByCode(idx.added, c.code, preferredLine);
|
|
334
|
+
}
|
|
335
|
+
if (!chosen) {
|
|
336
|
+
// 兜底:line 恰好命中新增行
|
|
337
|
+
if (preferredLine != null && idx.addedByLine.has(preferredLine)) {
|
|
338
|
+
chosen = {
|
|
339
|
+
line: preferredLine,
|
|
340
|
+
content: idx.addedByLine.get(preferredLine) ?? "",
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
else if (preferredLine != null) {
|
|
344
|
+
chosen = pickNearestByLine(idx.added, preferredLine);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
chosen = idx.added[0];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
aligned.push({
|
|
351
|
+
...c,
|
|
352
|
+
file: normalizedFile,
|
|
353
|
+
line: chosen.line,
|
|
354
|
+
// 保留 code(如果模型提供);若没提供则不要擅自填充,避免误导下游
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return aligned;
|
|
358
|
+
};
|
|
359
|
+
exports.alignCommentsToDiffAddedLines = alignCommentsToDiffAddedLines;
|
|
103
360
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/reviewer/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -41,6 +41,12 @@ export interface CodeReviewConfig {
|
|
|
41
41
|
export interface AIComment {
|
|
42
42
|
file: string;
|
|
43
43
|
line: number;
|
|
44
|
+
/**
|
|
45
|
+
* 用于将 AI 评论与 diff 行做精确对齐:
|
|
46
|
+
* - 期望为被评论“目标行”的完整行内容(不包含 diff 前缀 +/-/空格)
|
|
47
|
+
* - 允许为空字符串(表示空行)
|
|
48
|
+
*/
|
|
49
|
+
code?: string;
|
|
44
50
|
severity: Severity;
|
|
45
51
|
message: string;
|
|
46
52
|
suggestion?: string;
|
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;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,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,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"}
|