job51-gitlab-cr-node-jt-1 2.5.7 → 2.5.9

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.
@@ -181,44 +181,58 @@
181
181
  12. 最终输出必须以 `<REPORT>` 开始,以 `</REPORT>` 结束;
182
182
 
183
183
  13. **行号计算规范**:
184
- > - **行号定义**:行号是变更后文件中的**绝对行号**(从 1 开始计数)
185
- > - **⚠️ 关键规则:基于 diff 块内容逐行计数**(强制执行):
186
- > - **禁止**读取完整文件后计算绝对行号
187
- > - **必须**基于 diff 块内容,从 `@@ ... @@` 头之后的第一行开始逐行计数
188
- > - **⚠️ 重要:忽略所有元数据行**(如 `=== File Information ===`、`=== Diff Content ===`、`New Path:` 等)
189
- > - 计数规则:
190
- > - **从 `@@ ... @@` 行之后的第一行开始计数**(不是从文件第一行,不是从元数据开始)
191
- > - `+` 开头的新增代码:计入行号
192
- > - 空格开头的上下文代码:计入行号
193
- > - `-` 开头的删除代码:**不计入**行号(已删除)
194
- > - **行号 = 从 `@@` 头之后到该行的累计行数**
195
- > - **问题行号 = 该行在 diff 块中的位置(从 @@ 头之后开始算第 1 行)**
184
+ > - **行号定义**:行号是**变更后文件中的绝对行号**(从 1 开始计数,即该行在完整文件中的实际行号)
185
+ > - **⚠️ 关键规则:如何计算绝对行号**(强制执行):
186
+ > - **必须**基于当前 diff 块内容,从 `@@ ... @@` 头之后开始逐行计数
187
+ > - **⚠️ 重要:忽略所有元数据行**(如 `=== File Information ===`、`=== Diff Content ===`、`New Path:`、`New Start:`、`New Count:` 等)
188
+ > - **计数步骤**:
189
+ > 1. 从 `@@ ... @@` 行之后的第一行开始,按顺序给每一行编号(第 1 行、第 2 行、第 3 行...)
190
+ > 2. `+` 开头的新增代码:编号
191
+ > 3. 空格开头的上下文代码:编号
192
+ > 4. `-` 开头的删除代码:**不编号**(已删除)
193
+ > 5. **绝对行号 = 编号 + new_start - 1**
194
+ > - **简化理解**:
195
+ > - 对于 `@@ -0,0 +1,N @@`(新增文件):`绝对行号 = 编号`(因为 new_start=1
196
+ > - 对于 `@@ -old_start,old_count +new_start,new_count @@`(修改文件):`绝对行号 = 编号 + new_start - 1`
196
197
  > - **⚠️ 行号计算示例**(必读):
197
- > - 示例 1:新增文件 `@@ -0,0 +1,58 @@`(58 行新文件)
198
+ > - **示例 1:新增文件** `@@ -0,0 +1,58 @@`(58 行新文件,new_start=1)
198
199
  ```
199
200
  @@ -0,0 +1,58 @@
200
- +package com.job51.dev.bbs.service.impl; // 行号 = 1
201
- + // 行号 = 2
202
- +import com.job51.dev.bbs.mapper.ForumMapper; // 行号 = 3
201
+ +package com.job51.dev.bbs.service.impl; // 编号=1 → 绝对行号 = 1 + 1 - 1 = 1
202
+ + // 编号=2 → 绝对行号 = 2
203
+ +import com.job51.dev.bbs.mapper.ForumMapper; // 编号=3 → 绝对行号 = 3
203
204
  ...
204
- +public class TestMultiIssuesService { // 行号 = 17
205
- + public Map<String, Object> getTestData(String forumId, String userId) { // 行号 = 27
206
- + Object forum = forumMapper.selectById(forumId); // 行号 = 28
207
- + String forumName = forum.toString(); // 行号 = 30 ← 问题在这,new_line = 30
208
- + Object firstPost = posts.get(0); // 行号 = 38 ← 问题在这,new_line = 38
205
+ +public class TestMultiIssuesService { // 编号=17 → 绝对行号 = 17
206
+ + public Map<String, Object> getTestData(String forumId, String userId) { // 编号=27 → 绝对行号 = 27
207
+ + Object forum = forumMapper.selectById(forumId); // 编号=28 → 绝对行号 = 28
208
+ + String forumName = forum.toString(); // 编号=30 → 绝对行号 = 30 ← 问题在这,new_line = 30
209
+ + Object firstPost = posts.get(0); // 编号=38 → 绝对行号 = 38 ← 问题在这,new_line = 38
209
210
  ```
210
- > - 示例 2:已有文件修改 `@@ -42,3 +43,5 @@`
211
+ > - **示例 2:已有文件修改** `@@ -42,3 +43,5 @@`(new_start=43, new_count=5)
211
212
  ```
212
213
  @@ -42,3 +43,5 @@
213
- public void method() { // 行号 = 43(上下文行,保留)
214
- + Object obj = service.getData(); // 行号 = 44
215
- + obj.toString(); // 行号 = 45 ← 问题在这,new_line = 45
214
+ public void method() { // 编号=1 → 绝对行号 = 1 + 43 - 1 = 43
215
+ + Object obj = service.getData(); // 编号=2 → 绝对行号 = 2 + 43 - 1 = 44
216
+ + obj.toString(); // 编号=3 → 绝对行号 = 3 + 43 - 1 = 45 ← 问题在这,new_line = 45
216
217
  }
217
218
  ```
218
- > - **⚠️ 验证方法**:输出前检查行号是否合理
219
- > - 对于 `@@ -0,0 +1,N @@` 的新文件,最大行号应该是 N
220
- > - 如果报告的行号超过 diff 块的 `new_count`,说明计算错误
221
- > - **关键**:问题行号必须准确指向变更后代码在 diff 块中的位置(从 `@@` 头之后计数)
219
+ > - **⚠️ 验证方法**(强制执行,输出前必须检查):
220
+ > 1. **查看 diff 头的 new_start new_count 值**:
221
+ > - `@@ -0,0 +1,N @@` → 行号范围 = [1, N]
222
+ > - `@@ -old_start,old_count +new_start,new_count @@` 行号范围 = [new_start, new_start + new_count - 1]
223
+ > 2. **确保所有问题的行号在范围内**
224
+ > 3. **如果行号超出范围,说明计算错误,必须重新计算**
225
+ > 4. **⚠️ 特别场景:读取完整项目文件后的行号处理**
226
+ > - 如果你读取了完整的项目文件(通过 Read 工具)来追踪问题位置
227
+ > - **必须验证:该行是否在 diff 块范围内**
228
+ > - 验证公式:`new_start <= 行号 <= new_start + new_count - 1`
229
+ > - **如果行号超出范围,说明你定位的行不在当前 diff 块内**
230
+ > - **正确做法**:放弃从完整文件读取的行号,重新基于 diff 块内容逐行计数
231
+ > - 示例:diff 块 `@@ -0,0 +1,56 @@` 范围是 [1, 56],如果你在完整文件中定位到第 60 行 → **该行不在 diff 块内,不能用**
232
+ > - **原因**:GitLab API 只能评论 diff 块范围内的行
233
+ > - 示例:`@@ -0,0 +1,56 @@` 的 diff 块,行号范围是 [1, 56],**不能返回 57、60 等超出范围的值**
234
+ > - 示例:`@@ -167,7 +167,6 @@` 的 diff 块,new_start=167, new_count=6,行号范围是 [167, 172]
235
+ > - **关键**:绝对行号必须通过 diff 块内计数计算,且结果必须在 diff 块范围 [new_start, new_start + new_count - 1] 内
222
236
 
223
237
  14. `<REPORT>` 标签示例中的问题块数量仅用于展示格式,实际数量由 review 结果决定;
224
238
 
@@ -13,31 +13,21 @@ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_IN
13
13
  - `New Count`: 当前 diff 块的行数
14
14
  - `New Path` / `Old Path`: 文件路径(去掉 `a/` 或 `b/` 前缀)
15
15
 
16
- 3. **解析行号**:**基于 diff 块内容逐行计数**
16
+ 3. **解析行号**:**基于 diff 块内容逐行计数,计算绝对行号**
17
17
  - **⚠️ 重要**:行号计算规则详见 @.claude/rules/code-review-rules.md 第 13 条
18
- - **禁止**读取完整文件后计算绝对行号
19
- - **必须**基于 diff 块内容,从 `@@ ... @@` 头之后开始逐行计数
20
- - **忽略元数据行**:忽略 `=== File Information ===`、`=== Diff Content ===`、`New Path:` 等所有元数据行
21
- - **计数起点**:从 `@@ -0,0 +1,N @@` `@@ -old,count +new,count @@` 之后的第一行开始计数(该行 = 行号 1)
22
- - **⚠️ 行号计算示例**:
23
- ```
24
- @@ -0,0 +1,56 @@
25
- +package com.job51.dev.bbs.controller; // 行号 = 1
26
- + // 行号 = 2
27
- +import java.util.List; // 行号 = 3
28
- ...
29
- +public class Test { // 行号 = 17
30
- + public void method() { // 行号 = 18
31
- + Object obj = service.getData(); // 行号 = 19
32
- + obj.toString(); // 行号 = 20 ← 问题在这,new_line = 20
33
- + }
34
- +}
35
- ```
36
- - 行号定义:行号是变更后文件中的绝对行号(从 1 开始计数)
37
- - **验证方法**:输出前检查行号是否合理
38
- - 对于 `@@ -0,0 +1,N @@` 的新文件,最大行号应该是 N
39
- - 如果报告的行号超过 diff 块的 `new_count`,说明计算错误
40
- - 例如:如果新增代码在 diff 块的第 43 行,则 `new_line = 43`
18
+ - **必须**基于当前 diff 块内容,从 `@@ ... @@` 头之后开始逐行计数
19
+ - **忽略元数据行**:忽略 `=== File Information ===`、`=== Diff Content ===`、`New Path:`、`New Start:`、`New Count:` 等所有元数据行
20
+ - **计数步骤**:
21
+ 1. `@@ ... @@` 之后的第一行开始,给每一行编号(第 1 行、第 2 行...)
22
+ 2. `+` 开头的新增代码:编号;空格开头的上下文代码:编号;`-` 开头的删除代码:不编号
23
+ 3. **绝对行号 = 编号 + new_start - 1**
24
+ - **简化计算**:
25
+ - 对于 `@@ -0,0 +1,N @@`(新增文件):`绝对行号 = 编号`(因为 new_start=1
26
+ - 对于 `@@ -old_start,old_count +new_start,new_count @@`(修改文件):`绝对行号 = 编号 + new_start - 1`
27
+ - **验证方法**(输出前必须检查):
28
+ - 查看 diff 头的 `new_start` 和 `new_count` 值
29
+ - 确保所有问题的行号在范围 `[new_start, new_start + new_count - 1]` 内
30
+ - 示例:`@@ -0,0 +1,56 @@` 的行号范围是 [1, 56],**不能返回 57、60 等超出范围的值**
41
31
 
42
32
  4. **读取上下文**:基于 New Path 读取变更后文件,涉及方法调用时追踪读取实现代码
43
33
 
@@ -1,7 +1,7 @@
1
1
  # GitLab Code Review AI Tool 技术文档
2
2
 
3
3
  **项目名称**: job51-gitlab-cr-node
4
- **当前版本**: 2.5.6
4
+ **当前版本**: 2.5.8
5
5
  **作者**: tao.jing
6
6
  **最后更新**: 2026-04-16
7
7
  **项目地址**: https://gitdev.51job.com/51jobweb/ai-agent
@@ -849,6 +849,8 @@ npm run dev
849
849
 
850
850
  | 版本 | 日期 | 变更说明 |
851
851
  |------|------|----------|
852
+ | **2.5.8** | 2026-04-16 | **行号计算规则修正**:修正行号定义为"文件的绝对行号",但强调必须通过 diff 块内计数计算。问题根因:(1) 规则第 13 条错误地将行号定义为"diff 块内的相对行号",与 GitLab API 需要的绝对行号冲突;(2) AI 读取完整文件后定位到 diff 块范围之外的行(如第 60 行),导致行号验证失败。修复方案:(1) 更新 `code-review-rules.md` 第 13 条,明确行号是**变更后文件中的绝对行号**;(2) 修正计算方法:`绝对行号 = 从 @@ 头之后的编号 + new_start - 1`;(3) 添加强制验证步骤:输出前必须检查 `new_start <= 行号 <= new_start + new_count - 1`;(4) 添加特别场景处理:读取完整文件后必须验证行号是否在 diff 块范围内,超出范围则必须放弃该行号,重新基于 diff 块计数;(5) 更新 `SKILL.md` 第 3 步,同步更新行号计算方法 |
853
+ | **2.5.7** | 2026-04-16 | **行号计算规则修复**:修复 AI 返回的行号超出 diff 块范围的问题。问题根因:AI 读取完整源文件后返回文件的绝对行号,而不是基于 diff 块的相对行号。修复方案:(1) 更新 `code-review-rules.md` 第 13 条,明确行号是**diff 块内的相对行号**,不是文件的绝对行号;(2) 添加行号验证规则:最大行号不能超过 diff 块的 `new_count` 值;(3) 简化 `SKILL.md` 中的行号计算说明,将详细规则移至 rules 文件;(4) 在 rules 中添加强制验证步骤:输出前必须检查 diff 头的 `new_count` 值,确保所有问题行号 ≤ new_count |
852
854
  | **2.5.6** | 2026-04-16 | **当前版本**:技术文档更新 |
853
855
  | 2.4.10 | 2026-04-16 | **行号验证逻辑修复**:修复 AI 返回的行号超出 diff 块范围导致 GitLab API 400 错误的问题。新增功能:(1) 在 `postSingleCommentToGitLab` 方法中添加行号验证逻辑,检查 AI 返回的行号是否在 diff 块有效范围内 `[oldStart, oldEnd]` 或 `[newStart, newEnd]`;(2) 支持删除文件(`new_count=0`)的行号处理,将 AI 返回的 `new_line` 自动映射为 `old_line`;(3) 当行号超出范围时,自动降级为一般讨论(general discussion),避免 GitLab API 报错;(4) 增强 diff 块信息日志输出,包含 `old_start/old_count/old_end/new_start/new_count/isDeleteFile` 完整信息 |
854
856
  | 2.4.9 | 2026-04-16 | **代码优化与性能指标收集**:(1) 删除已废弃的 `reviewDiffWithClaude` 方法,精简 79 行代码;(2) 添加 GitLab 版本信息缓存机制,避免重复 API 调用;(3) 实现日志分级系统(DEBUG/INFO/WARN/ERROR),支持通过 `LOG_LEVEL` 环境变量控制输出级别;(4) 实现完整的性能指标收集器 `MetricsCollector`,收集 diff 块大小/文件类型/耗时分布,慢调用分析 (>10 秒),AI/API 调用成功率,评论发布统计等 |