gitlab-ai-review 4.0.0 → 4.0.1
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/index.js +49 -24
- package/lib/gitlab-client.js +1 -6
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -205,19 +205,53 @@ export class GitLabAIReview {
|
|
|
205
205
|
// 调用 AI 一次性审查整个文件的所有变更(按文件批量)
|
|
206
206
|
const fileReview = await this.reviewFileChanges(change, meaningfulChanges);
|
|
207
207
|
|
|
208
|
+
// 智能合并修改块的评论
|
|
209
|
+
const mergedReviews = this.mergeModificationReviews(fileReview.reviews, meaningfulChanges);
|
|
210
|
+
|
|
208
211
|
// 根据 AI 返回的结果,只对有问题的行添加评论
|
|
209
|
-
for (const review of
|
|
212
|
+
for (const review of mergedReviews) {
|
|
210
213
|
if (review.hasIssue) {
|
|
211
214
|
try {
|
|
215
|
+
// 找到对应的变更
|
|
216
|
+
const relatedChange = meaningfulChanges.find(c =>
|
|
217
|
+
c.lineNumber === review.lineNumber ||
|
|
218
|
+
c.lineNumber === review.oldLine ||
|
|
219
|
+
c.lineNumber === review.newLine
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
// 构建评论位置参数
|
|
223
|
+
const positionParams = {
|
|
224
|
+
filePath: fileName,
|
|
225
|
+
oldPath: change.old_path,
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// 优先使用 hunk 的起始行(让评论定位到 diff 块的开头)
|
|
229
|
+
if (relatedChange && relatedChange.hunkRange) {
|
|
230
|
+
const isDeletion = relatedChange.type === 'deletion';
|
|
231
|
+
if (isDeletion) {
|
|
232
|
+
positionParams.oldLine = relatedChange.hunkRange.oldStart;
|
|
233
|
+
} else {
|
|
234
|
+
positionParams.newLine = relatedChange.hunkRange.newStart;
|
|
235
|
+
}
|
|
236
|
+
} else if (review.oldLine && review.newLine) {
|
|
237
|
+
// 修改块:同时指定两个行号
|
|
238
|
+
positionParams.oldLine = review.oldLine;
|
|
239
|
+
positionParams.newLine = review.newLine;
|
|
240
|
+
} else if (review.lineNumber) {
|
|
241
|
+
// 单独的删除或新增(fallback)
|
|
242
|
+
const isDeletion = relatedChange && relatedChange.type === 'deletion';
|
|
243
|
+
if (isDeletion) {
|
|
244
|
+
positionParams.oldLine = review.lineNumber;
|
|
245
|
+
} else {
|
|
246
|
+
positionParams.newLine = review.lineNumber;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
212
250
|
const commentResult = await this.gitlabClient.createLineComment(
|
|
213
251
|
this.config.project.projectId,
|
|
214
252
|
this.config.project.mergeRequestIid,
|
|
215
253
|
`🤖 **AI 代码审查**\n\n${review.comment}`,
|
|
216
|
-
|
|
217
|
-
filePath: fileName,
|
|
218
|
-
oldPath: change.old_path,
|
|
219
|
-
newLine: review.lineNumber,
|
|
220
|
-
}
|
|
254
|
+
positionParams
|
|
221
255
|
);
|
|
222
256
|
|
|
223
257
|
results.push({
|
|
@@ -464,36 +498,27 @@ export class GitLabAIReview {
|
|
|
464
498
|
for (const review of mergedReviews) {
|
|
465
499
|
if (review.hasIssue) {
|
|
466
500
|
try {
|
|
467
|
-
//
|
|
501
|
+
// 找到对应的变更
|
|
468
502
|
const relatedChange = meaningfulChanges.find(c =>
|
|
469
503
|
c.lineNumber === review.lineNumber ||
|
|
470
504
|
c.lineNumber === review.oldLine ||
|
|
471
505
|
c.lineNumber === review.newLine
|
|
472
506
|
);
|
|
473
507
|
|
|
474
|
-
//
|
|
508
|
+
// 构建评论位置参数
|
|
475
509
|
const positionParams = {
|
|
476
510
|
filePath: fileName,
|
|
477
511
|
oldPath: change.old_path,
|
|
478
512
|
};
|
|
479
513
|
|
|
480
|
-
//
|
|
514
|
+
// 优先使用 hunk 的起始行(让评论定位到 diff 块的开头)
|
|
481
515
|
if (relatedChange && relatedChange.hunkRange) {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
type: 'old',
|
|
489
|
-
old_line: relatedChange.hunkRange.oldStart,
|
|
490
|
-
},
|
|
491
|
-
end: {
|
|
492
|
-
line_code: `${relatedChange.hunkRange.newEnd}_${relatedChange.hunkRange.newEnd}`,
|
|
493
|
-
type: 'new',
|
|
494
|
-
new_line: relatedChange.hunkRange.newEnd,
|
|
495
|
-
},
|
|
496
|
-
};
|
|
516
|
+
const isDeletion = relatedChange.type === 'deletion';
|
|
517
|
+
if (isDeletion) {
|
|
518
|
+
positionParams.oldLine = relatedChange.hunkRange.oldStart;
|
|
519
|
+
} else {
|
|
520
|
+
positionParams.newLine = relatedChange.hunkRange.newStart;
|
|
521
|
+
}
|
|
497
522
|
} else if (review.oldLine && review.newLine) {
|
|
498
523
|
// 修改块:同时指定两个行号
|
|
499
524
|
positionParams.oldLine = review.oldLine;
|
package/lib/gitlab-client.js
CHANGED
|
@@ -92,18 +92,13 @@ export class GitLabClient {
|
|
|
92
92
|
old_path: lineInfo.oldPath || lineInfo.filePath,
|
|
93
93
|
};
|
|
94
94
|
|
|
95
|
-
//
|
|
95
|
+
// 设置行号(只能设置其中一个,或者两个都设置表示修改块)
|
|
96
96
|
if (lineInfo.newLine !== undefined) {
|
|
97
97
|
position.new_line = lineInfo.newLine;
|
|
98
98
|
}
|
|
99
99
|
if (lineInfo.oldLine !== undefined) {
|
|
100
100
|
position.old_line = lineInfo.oldLine;
|
|
101
101
|
}
|
|
102
|
-
|
|
103
|
-
// 如果提供了范围信息,使用范围评论
|
|
104
|
-
if (lineInfo.lineRange) {
|
|
105
|
-
position.line_range = lineInfo.lineRange;
|
|
106
|
-
}
|
|
107
102
|
|
|
108
103
|
return this.request(
|
|
109
104
|
`/projects/${encodeURIComponent(projectId)}/merge_requests/${mergeRequestIid}/discussions`,
|