job51-gitlab-cr-node-jt-1 2.6.10 → 2.7.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.
@@ -193,42 +193,41 @@
193
193
  > 1. 从 `@@` 之后开始编号:第 1 行、第 2 行、第 3 行...
194
194
  > 2. 绝对行号 = 编号 + new_start - 1
195
195
  > 3. 对于 `@@ -0,0 +1,N @@`(新增文件):绝对行号 = 编号
196
- > - **⚠️ 重要:忽略所有元数据行**(临时文件开头的 `# File Information`、`# New Path:` 等以 `# ` 开头的行都**不编号**,直接跳过)
196
+ > - **⚠️ 重要:忽略所有元数据行**(临时文件末尾的 `# File Information` 等以 `# ` 开头的行都**不编号**,直接跳过)
197
197
  > - **⚠️ 关键**:`@@ ... @@` 这一行本身**不编号**,从它**之后**的第一行才开始编号
198
198
  > - **⚠️ 行号计算示例**(必读):
199
199
  > - **示例 0:临时文件完整格式**(理解计数起点)
200
200
  ```
201
- # File Information (AI 请忽略这些元数据行,从 @@ 之后开始计数)
202
- # New Path: b/src/Test.java <-- 元数据行,忽略,直接跳过
203
- # Block Index: 0 <-- 元数据行,忽略,直接跳过
204
- # New Start: 29 <-- 元数据行,忽略,直接跳过
205
- # Diff Content Below
206
201
  @@ -28,8 +29,10 @@ <-- @@ 行,不编号!从下一行开始行号=29(new_start)
207
- public void method() { <-- 空格开头,行号 = 29(new_start)
208
- + Object obj = getXxx(); <-- + 开头,行号 = 30(29+1)← 问题在这,new_line=30
209
- + obj.toString(); <-- + 开头,行号 = 31(30+1)← 问题在这,new_line=31
210
- } <-- 空格开头,行号 = 32(31+1)
202
+ [代码行 1] <-- 空格开头,行号 = 29(new_start)
203
+ + [代码行 2] <-- + 开头,行号 = 30(29+1)← 问题在这,new_line=30
204
+ + [代码行 3] <-- + 开头,行号 = 31(30+1)← 问题在这,new_line=31
205
+ [代码行 4] <-- 空格开头,行号 = 32(31+1)
206
+ ...(diff 内容结束)
207
+ # File Information (AI 请忽略:这些是元数据,不计入行号)
208
+ # New Path: b/src/Test.java <-- 元数据在末尾,不影响计数
209
+ # New Start: 29
211
210
  ```
212
211
  > - **示例 1:新增文件** `@@ -0,0 +1,58 @@`(new_start=1)
213
212
  ```
214
213
  @@ -0,0 +1,58 @@
215
- +package com.job51.dev.bbs.service.impl; // 行号 = 1(new_start)
216
- + // 行号 = 2
217
- +import com.job51.dev.bbs.mapper.ForumMapper; // 行号 = 3
214
+ + [代码行 1] // 行号 = 1(new_start)
215
+ + [代码行 2] // 行号 = 2
216
+ + [代码行 3] // 行号 = 3
218
217
  ...
219
- +public class TestMultiIssuesService { // 行号 = 17
220
- + public Map<String, Object> getTestData(String forumId, String userId) { // 行号 = 27
221
- + Object forum = forumMapper.selectById(forumId); // 行号 = 28
222
- + String forumName = forum.toString(); // 行号 = 30 ← 问题在这,new_line = 30
223
- + Object firstPost = posts.get(0); // 行号 = 38 ← 问题在这,new_line = 38
218
+ + [代码行 17] // 行号 = 17
219
+ + [代码行 27] // 行号 = 27
220
+ + [代码行 28] // 行号 = 28
221
+ + [代码行 30] // 行号 = 30 ← 问题在这,new_line = 30
222
+ + [代码行 38] // 行号 = 38 ← 问题在这,new_line = 38
224
223
  ```
225
224
  > - **示例 2:已有文件修改** `@@ -42,3 +43,5 @@`(new_start=43)
226
225
  ```
227
226
  @@ -42,3 +43,5 @@
228
- public void method() { // 行号 = 43(new_start)
229
- + Object obj = service.getData(); // 行号 = 44(43+1)
230
- + obj.toString(); // 行号 = 45(44+1)← 问题在这,new_line = 45
231
- } // 行号 = 46(45+1)
227
+ [代码行 1] // 行号 = 43(new_start)
228
+ + [代码行 2] // 行号 = 44(43+1)
229
+ + [代码行 3] // 行号 = 45(44+1)← 问题在这,new_line = 45
230
+ [代码行 4] // 行号 = 46(45+1)
232
231
  ```
233
232
  > - **⚠️ 验证方法**(强制执行,输出前必须检查):
234
233
  > 1. **查看 diff 头的 new_start 和 new_count 值**:
@@ -7,11 +7,11 @@ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_IN
7
7
 
8
8
  1. **读取 diff 文件**:使用 Read 工具读取文件:$ARGUMENTS
9
9
 
10
- 2. **解析文件信息**:从 `# File Information` 部分提取
10
+ 2. **解析文件信息**:从文件末尾的 `# File Information` 部分提取
11
11
  - `Block Index`: 当前块索引号
12
12
  - `New Start`: 当前 diff 块在变更后文件中的起始行号(仅供参考)
13
- - `New Count`: 当前 diff 块的行数
14
13
  - `New Path` / `Old Path`: 文件路径(去掉 `a/` 或 `b/` 前缀)
14
+ - **注意**:元数据在文件末尾,不影响行号计数
15
15
 
16
16
  3. **解析行号**:**基于 diff 块内容逐行计数,计算绝对行号**
17
17
  - **⚠️ 重要**:行号计算规则详见 @.claude/rules/code-review-rules.md 第 13 条
@@ -26,20 +26,19 @@ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_IN
26
26
  1. 从 `@@` 之后开始编号:第 1 行、第 2 行、第 3 行...
27
27
  2. 绝对行号 = 编号 + new_start - 1
28
28
  3. 对于 `@@ -0,0 +1,N @@`(新增文件):绝对行号 = 编号
29
- - **忽略元数据行**:临时文件开头的 `# File Information`、`# New Path:` 等以 `# ` 开头的行都**不编号**,直接跳过
29
+ - **忽略元数据行**:文件末尾的 `# File Information` 等以 `# ` 开头的行都**不编号**,直接跳过
30
30
  - **⚠️ 关键**:`@@ ... @@` 这一行本身也不编号,从它**之后**的第一行才开始编号
31
31
  - **⚠️ 临时文件格式示例**(理解计数起点):
32
32
  ```
33
- # File Information (AI 请忽略这些元数据行,从 @@ 之后开始计数)
34
- # New Path: b/src/Test.java <-- 元数据行,忽略,不编号
35
- # Block Index: 0 <-- 元数据行,忽略,不编号
36
- # New Start: 29 <-- 元数据行,忽略,不编号
37
- # Diff Content Below
38
33
  @@ -28,8 +29,10 @@ <-- @@ 行,不编号!从下一行才开始计数
39
- public void method() { <-- 空格开头,行号 = 29(new_start)
40
- + Object obj = getXxx(); <-- + 开头,行号 = 30(29+1)
41
- + obj.toString(); <-- + 开头,行号 = 31(30+1)
42
- } <-- 空格开头,行号 = 32(31+1)
34
+ [代码行 1] <-- 空格开头,行号 = 29(new_start)
35
+ + [代码行 2] <-- + 开头,行号 = 30(29+1)
36
+ + [代码行 3] <-- + 开头,行号 = 31(30+1)
37
+ [代码行 4] <-- 空格开头,行号 = 32(31+1)
38
+ ...(diff 内容结束)
39
+ # File Information (AI 请忽略:这些是元数据,不计入行号) <-- 元数据在末尾,不影响计数
40
+ # New Path: b/src/Test.java
41
+ # New Start: 29
43
42
  ```
44
43
  - **⚠️ 强制验证步骤**(输出前必须执行):
45
44
  1. 从 diff 头提取 `new_start` 和 `new_count`,计算行号范围:`[new_start, new_start + new_count - 1]`
@@ -97,8 +96,8 @@ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_IN
97
96
  \`\`\`
98
97
  **修改建议**:添加空值检查
99
98
  \`\`\`java
100
- if (forum != null) {
101
- String forumName = forum.toString();
99
+ if ([变量] != null) {
100
+ [方法调用];
102
101
  }
103
102
  \`\`\`
104
103
  \`\`\`
@@ -1,7 +1,7 @@
1
1
  # GitLab Code Review AI Tool 技术文档
2
2
 
3
3
  **项目名称**: job51-gitlab-cr-node
4
- **当前版本**: 2.6.9
4
+ **当前版本**: 2.6.10
5
5
  **作者**: tao.jing
6
6
  **最后更新**: 2026-04-16
7
7
  **项目地址**: https://gitdev.51job.com/51jobweb/ai-agent
@@ -27,6 +27,13 @@
27
27
 
28
28
  ## 版本历史
29
29
 
30
+ ### v2.6.10 (2026-04-16)
31
+
32
+ **优化**:
33
+ - **添加临时文件格式调试日志**:输出临时文件前 10 行预览,用于确认元数据格式是否正确
34
+ - 可以在日志中看到临时文件的实际格式,确认 AI 是否正确忽略元数据行
35
+ - 帮助诊断行号计算偏移问题
36
+
30
37
  ### v2.6.9 (2026-04-16)
31
38
 
32
39
  **Bug 修复**:
package/index.js CHANGED
@@ -84,16 +84,15 @@ class GitLabCodeReviewer {
84
84
  debugLog(`diff 内容:${diffObject.diff}`);
85
85
  debugLog(`========== Diff Block ${blockIndex} 结束 ==========`);
86
86
 
87
- // 构造包含元数据的 diff 内容
88
- // 注意:元数据行以 '# ' 开头,AI 会忽略这些行,从 '@@' 之后开始计数
89
- const diffContentWithMetadata = `# File Information
87
+ // 构造临时文件内容:diff 内容在前,元数据在后
88
+ // 这样 AI 无法将元数据行误计数到行号中
89
+ const diffContentWithMetadata = `${diffObject.diff}
90
+
91
+ # File Information (AI 请忽略:这些是元数据,不计入行号)
90
92
  # New Path: ${diffObject.new_path || 'N/A'}
91
- # Old Path: ${diffObject.old_path || 'N/A'}
92
93
  # Block Index: ${blockIndex}
93
94
  # New Start: ${diffObject.line_info?.new_start || 1}
94
- # New Count: ${diffObject.line_info?.new_count || 1}
95
- # Diff Content Below (start counting line numbers from the first line after @@)
96
- ${diffObject.diff}`;
95
+ # 行号计算:从 @@ 之后开始计数,@@ 行和所有#开头的行都不计数`;
97
96
 
98
97
  // 将diff内容写入临时文件
99
98
  fs.writeFileSync(tmpFileName, diffContentWithMetadata);