job51-gitlab-cr-node-jt-1 2.7.0 → 2.7.2
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/.claude/rules/code-review-rules.md +21 -31
- package/.claude/skills/simple-code-review/SKILL.md +19 -28
- package/index.js +10 -7
- package/log.txt +1779 -0
- package/package.json +1 -1
|
@@ -184,35 +184,26 @@
|
|
|
184
184
|
> - **行号定义**:行号是**变更后文件中的绝对行号**(从 1 开始计数,即该行在完整文件中的实际行号)
|
|
185
185
|
> - **⚠️ 关键规则:如何计算绝对行号**(强制执行,推荐方法 A):
|
|
186
186
|
> - **方法 A:直接从 new_start 开始递增**(推荐,不易出错)
|
|
187
|
-
> 1.
|
|
188
|
-
> 2.
|
|
187
|
+
> 1. 从元数据中读取 `New Start` 值
|
|
188
|
+
> 2. 从第 1 行代码开始,行号 = `New Start`
|
|
189
189
|
> 3. 每往下一行(`+` 开头或空格开头),行号 +1
|
|
190
190
|
> 4. `-` 开头的删除行**不计数**,行号不增加
|
|
191
|
-
> 5.
|
|
192
|
-
> -
|
|
193
|
-
> 1. 从 `@@` 之后开始编号:第 1 行、第 2 行、第 3 行...
|
|
194
|
-
> 2. 绝对行号 = 编号 + new_start - 1
|
|
195
|
-
> 3. 对于 `@@ -0,0 +1,N @@`(新增文件):绝对行号 = 编号
|
|
196
|
-
> - **⚠️ 重要:忽略所有元数据行**(临时文件开头的 `# File Information`、`# New Path:` 等以 `# ` 开头的行都**不编号**,直接跳过)
|
|
197
|
-
> - **⚠️ 关键**:`@@ ... @@` 这一行本身**不编号**,从它**之后**的第一行才开始编号
|
|
191
|
+
> 5. 示例:`New Start: 1` 时,第 1 行代码行号=1,第 2 行行号=2,以此类推
|
|
192
|
+
> - **⚠️ 重要:忽略所有元数据行**(临时文件末尾的 `# File Information` 等以 `# ` 开头的行都**不编号**,直接跳过)
|
|
198
193
|
> - **⚠️ 行号计算示例**(必读):
|
|
199
194
|
> - **示例 0:临时文件完整格式**(理解计数起点)
|
|
200
195
|
```
|
|
201
|
-
|
|
202
|
-
# New Path: b/src/Test.java <-- 元数据行,忽略,直接跳过
|
|
203
|
-
# Block Index: 0 <-- 元数据行,忽略,直接跳过
|
|
204
|
-
# New Start: 29 <-- 元数据行,忽略,直接跳过
|
|
205
|
-
# Diff Content Below
|
|
206
|
-
@@ -28,8 +29,10 @@ <-- @@ 行,不编号!从下一行开始行号=29(new_start)
|
|
207
|
-
[代码行 1] <-- 空格开头,行号 = 29(new_start)
|
|
196
|
+
[代码行 1] <-- 空格开头,行号 = 29(New Start=29)
|
|
208
197
|
+ [代码行 2] <-- + 开头,行号 = 30(29+1)← 问题在这,new_line=30
|
|
209
198
|
+ [代码行 3] <-- + 开头,行号 = 31(30+1)← 问题在这,new_line=31
|
|
210
199
|
[代码行 4] <-- 空格开头,行号 = 32(31+1)
|
|
200
|
+
...(diff 内容结束)
|
|
201
|
+
# File Information
|
|
202
|
+
# New Start: 29 <-- 元数据在末尾,提供行号计算起点,不参与计数
|
|
211
203
|
```
|
|
212
|
-
> - **示例 1:新增文件**
|
|
204
|
+
> - **示例 1:新增文件** `New Start: 1, New Count: 58`
|
|
213
205
|
```
|
|
214
|
-
|
|
215
|
-
+ [代码行 1] // 行号 = 1(new_start)
|
|
206
|
+
+ [代码行 1] // 行号 = 1(New Start)
|
|
216
207
|
+ [代码行 2] // 行号 = 2
|
|
217
208
|
+ [代码行 3] // 行号 = 3
|
|
218
209
|
...
|
|
@@ -222,32 +213,31 @@
|
|
|
222
213
|
+ [代码行 30] // 行号 = 30 ← 问题在这,new_line = 30
|
|
223
214
|
+ [代码行 38] // 行号 = 38 ← 问题在这,new_line = 38
|
|
224
215
|
```
|
|
225
|
-
> - **示例 2:已有文件修改**
|
|
216
|
+
> - **示例 2:已有文件修改** `New Start: 43`
|
|
226
217
|
```
|
|
227
|
-
|
|
228
|
-
[代码行 1] // 行号 = 43(new_start)
|
|
218
|
+
[代码行 1] // 行号 = 43(New Start)
|
|
229
219
|
+ [代码行 2] // 行号 = 44(43+1)
|
|
230
220
|
+ [代码行 3] // 行号 = 45(44+1)← 问题在这,new_line = 45
|
|
231
221
|
[代码行 4] // 行号 = 46(45+1)
|
|
232
222
|
```
|
|
233
223
|
> - **⚠️ 验证方法**(强制执行,输出前必须检查):
|
|
234
|
-
> 1.
|
|
235
|
-
> -
|
|
236
|
-
> -
|
|
224
|
+
> 1. **从元数据提取 `New Start` 和 `New Count` 值**:
|
|
225
|
+
> - `New Start: 1, New Count: N` → 行号范围 = [1, N]
|
|
226
|
+
> - `New Start: X, New Count: Y` → 行号范围 = [X, X + Y - 1]
|
|
237
227
|
> 2. **确保所有问题的行号在范围内**
|
|
238
|
-
> 3.
|
|
228
|
+
> 3. **如果任何行号超出范围,说明计算错误,必须重新计数**
|
|
239
229
|
> 4. **⚠️ 特别场景:读取完整项目文件后的行号处理**
|
|
240
230
|
> - 如果你读取了完整的项目文件(通过 Read 工具)来追踪问题位置
|
|
241
231
|
> - **必须验证:该行是否在 diff 块范围内**
|
|
242
|
-
> - 验证公式:`
|
|
232
|
+
> - 验证公式:`New Start <= 行号 <= New Start + New Count - 1`
|
|
243
233
|
> - **如果行号超出范围,说明你定位的行不在当前 diff 块内**
|
|
244
234
|
> - **正确做法**:放弃从完整文件读取的行号,重新基于 diff 块内容逐行计数
|
|
245
|
-
> -
|
|
235
|
+
> - 示例:`New Start: 1, New Count: 56` 范围是 [1, 56],如果你在完整文件中定位到第 60 行 → **该行不在 diff 块内,不能用**
|
|
246
236
|
> - **原因**:GitLab API 只能评论 diff 块范围内的行
|
|
247
237
|
> 5. **输出前最终验证**:
|
|
248
|
-
> - 对于每个问题的行号 X,问自己:"X -
|
|
249
|
-
> -
|
|
250
|
-
> -
|
|
238
|
+
> - 对于每个问题的行号 X,问自己:"X - New Start + 1 是否等于我从 diff 块第 1 行开始数的位置?"
|
|
239
|
+
> - 如果不等,说明计算错误,必须重新从第 1 行代码逐行计数
|
|
240
|
+
> - 示例:`New Start: 1, New Count: 56` 的行号范围是 [1, 56],**不能返回 57、60 等超出范围的值**
|
|
251
241
|
> - 示例:`@@ -167,7 +167,6 @@` 的 diff 块,new_start=167, new_count=6,行号范围是 [167, 172]
|
|
252
242
|
> - **关键**:绝对行号必须通过 diff 块内计数计算,且结果必须在 diff 块范围 [new_start, new_start + new_count - 1] 内
|
|
253
243
|
|
|
@@ -7,48 +7,39 @@ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_IN
|
|
|
7
7
|
|
|
8
8
|
1. **读取 diff 文件**:使用 Read 工具读取文件:$ARGUMENTS
|
|
9
9
|
|
|
10
|
-
2.
|
|
11
|
-
- `
|
|
12
|
-
- `New Start`: 当前 diff 块在变更后文件中的起始行号(仅供参考)
|
|
10
|
+
2. **解析文件信息**:从文件末尾的 `# File Information` 部分提取
|
|
11
|
+
- `New Start`: 当前 diff 块在变更后文件中的起始行号
|
|
13
12
|
- `New Count`: 当前 diff 块的行数
|
|
14
|
-
- `New Path
|
|
13
|
+
- `New Path`: 文件路径(去掉 `a/` 或 `b/` 前缀)
|
|
14
|
+
- **注意**:元数据在文件末尾,`@@` 行已被移除,不影响行号计数
|
|
15
15
|
|
|
16
16
|
3. **解析行号**:**基于 diff 块内容逐行计数,计算绝对行号**
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
5. 示例:`@@ -0,0 +1,58 @@` 之后的第一行行号=1,第二行行号=2,以此类推
|
|
25
|
-
- **方法 B:先编号再转换**
|
|
26
|
-
1. 从 `@@` 之后开始编号:第 1 行、第 2 行、第 3 行...
|
|
27
|
-
2. 绝对行号 = 编号 + new_start - 1
|
|
28
|
-
3. 对于 `@@ -0,0 +1,N @@`(新增文件):绝对行号 = 编号
|
|
29
|
-
- **忽略元数据行**:临时文件开头的 `# File Information`、`# New Path:` 等以 `# ` 开头的行都**不编号**,直接跳过
|
|
30
|
-
- **⚠️ 关键**:`@@ ... @@` 这一行本身也不编号,从它**之后**的第一行才开始编号
|
|
17
|
+
- **行号计算方法**:
|
|
18
|
+
1. 从元数据中读取 `New Start` 值
|
|
19
|
+
2. 从第 1 行代码开始,行号 = `New Start`
|
|
20
|
+
3. 每往下一行(`+` 开头或空格开头),行号 +1
|
|
21
|
+
4. `-` 开头的删除行**不计数**,行号不增加
|
|
22
|
+
5. 示例:`New Start: 1` 时,第 1 行代码行号=1,第 2 行行号=2,以此类推
|
|
23
|
+
- **忽略元数据行**:文件末尾的 `# File Information` 等以 `# ` 开头的行都**不编号**,直接跳过
|
|
31
24
|
- **⚠️ 临时文件格式示例**(理解计数起点):
|
|
32
25
|
```
|
|
33
|
-
|
|
34
|
-
# New Path: b/src/Test.java <-- 元数据行,忽略,不编号
|
|
35
|
-
# Block Index: 0 <-- 元数据行,忽略,不编号
|
|
36
|
-
# New Start: 29 <-- 元数据行,忽略,不编号
|
|
37
|
-
# Diff Content Below
|
|
38
|
-
@@ -28,8 +29,10 @@ <-- @@ 行,不编号!从下一行才开始计数
|
|
39
|
-
[代码行 1] <-- 空格开头,行号 = 29(new_start)
|
|
26
|
+
[代码行 1] <-- 空格开头,行号 = 29(New Start=29)
|
|
40
27
|
+ [代码行 2] <-- + 开头,行号 = 30(29+1)
|
|
41
28
|
+ [代码行 3] <-- + 开头,行号 = 31(30+1)
|
|
42
29
|
[代码行 4] <-- 空格开头,行号 = 32(31+1)
|
|
30
|
+
...(diff 内容结束)
|
|
31
|
+
# File Information
|
|
32
|
+
# New Path: b/src/Test.java
|
|
33
|
+
# New Start: 29 <-- 元数据在末尾,提供行号计算起点
|
|
43
34
|
```
|
|
44
35
|
- **⚠️ 强制验证步骤**(输出前必须执行):
|
|
45
|
-
1.
|
|
36
|
+
1. 从元数据提取 `New Start` 和 `New Count`,计算行号范围:`[New Start, New Start + New Count - 1]`
|
|
46
37
|
2. **逐个检查**每个问题的行号是否在该范围内
|
|
47
38
|
3. **如果任何行号超出范围,必须重新计数**
|
|
48
39
|
4. **禁止**直接使用从完整文件读取的行号
|
|
49
40
|
- **示例**:
|
|
50
|
-
-
|
|
51
|
-
-
|
|
41
|
+
- `New Start: 1, New Count: 56` 的行号范围是 [1, 56],**不能返回 57、60 等超出范围的值**
|
|
42
|
+
- `New Start: 167, New Count: 6` 的行号范围是 [167, 172],**不能返回 <167 或 >172 的值**
|
|
52
43
|
|
|
53
44
|
4. **读取上下文**:基于 New Path 读取变更后文件,涉及方法调用时追踪读取实现代码
|
|
54
45
|
- **⚠️ 重要**:读取完整文件仅用于理解代码逻辑,**不得**直接使用完整文件中的行号
|
package/index.js
CHANGED
|
@@ -84,16 +84,19 @@ class GitLabCodeReviewer {
|
|
|
84
84
|
debugLog(`diff 内容:${diffObject.diff}`);
|
|
85
85
|
debugLog(`========== Diff Block ${blockIndex} 结束 ==========`);
|
|
86
86
|
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
const
|
|
87
|
+
// 解析 diff 内容,移除 @@ 行,将其信息放入元数据
|
|
88
|
+
// 这样 AI 不会把 @@ 行误计数
|
|
89
|
+
const diffLines = diffObject.diff.split('\n');
|
|
90
|
+
const codeLines = diffLines.filter(line => !line.startsWith('@@')).join('\n');
|
|
91
|
+
|
|
92
|
+
// 构造临时文件内容:纯代码在前,元数据在后
|
|
93
|
+
const diffContentWithMetadata = `${codeLines}
|
|
94
|
+
|
|
95
|
+
# File Information
|
|
90
96
|
# New Path: ${diffObject.new_path || 'N/A'}
|
|
91
|
-
# Old Path: ${diffObject.old_path || 'N/A'}
|
|
92
|
-
# Block Index: ${blockIndex}
|
|
93
97
|
# New Start: ${diffObject.line_info?.new_start || 1}
|
|
94
98
|
# New Count: ${diffObject.line_info?.new_count || 1}
|
|
95
|
-
#
|
|
96
|
-
${diffObject.diff}`;
|
|
99
|
+
# 行号计算:从第 1 行代码开始计数,第 1 行行号=NewStart,每往下一行行号 +1,#开头的元数据行不计数`;
|
|
97
100
|
|
|
98
101
|
// 将diff内容写入临时文件
|
|
99
102
|
fs.writeFileSync(tmpFileName, diffContentWithMetadata);
|