job51-gitlab-cr-node-jt-1 2.7.5 → 2.7.8

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.
@@ -45,39 +45,20 @@
45
45
  > - 如果项目现有接口多数没有显式参数判空逻辑,**不得建议添加**
46
46
  > - 参数校验形式应参考同文件/同模块其他接口的写法,保持一致性
47
47
  > - **仅在校验风格与同一文件中其他接口明显不一致时**,才需要提示
48
+ > - **⚠️ 老代码修改审查原则**(关键规则):
49
+ > - **审查范围限制**:对于已有代码的修改(不是新增),**只针对修改的具体内容进行评审**
50
+ > - **禁止建议周边逻辑改动**:**不得报告整体逻辑或相关逻辑的修改优化建议**(如"建议重构整个方法"、"建议优化周边调用链"等)
51
+ > - **原因**:
52
+ > - 贸然修改原有逻辑会引入风险,可能破坏已验证的稳定功能
53
+ > - 周边逻辑的改动不在当前需求点范围内,可能不会经过有效测试
54
+ > - 原有代码已经过开发自测和 QA 测试验证,应保持最小改动原则
55
+ > - **正确做法**:
56
+ > - 只审查变更行本身是否有运行时异常风险、安全问题等严重缺陷
57
+ > - 不建议对方法的整体逻辑、调用链、数据流等进行优化
58
+ > - 即使周边逻辑看起来可以优化,也**保持沉默**,不在本次 CR 中报告
48
59
 
49
60
  0. **Diff 数据结构与上下文读取规则**:
50
- > - **⚠️ 重要变更:按文件合并审查(多块临时文件)**:
51
- > - **临时文件可能包含同一文件的多个变更块**(解决了"同一方法被拆分成多个块"的问题)
52
- > - **临时文件格式**:每个块有明确的边界标识和行号信息
53
- > - **格式示例**:
54
- ```
55
- # ===== 文件: UserService.java =====
56
- # 变更块总数: 2
57
-
58
- # ===== 变更块 0 =====
59
- # 行号范围: 10 - 15
60
- # New Start: 10
61
- # New Count: 6
62
- # 行号计算: 此块内第1行代码 = 10, 每往下一行行号+1
63
-
64
- [上下文代码]
65
- + if (obj == null) return; ← 判空逻辑(块0)
66
-
67
- # ===== 变更块 1 =====
68
- # 行号范围: 50 - 53
69
- # New Start: 50
70
- # New Count: 4
71
-
72
- [上下文代码]
73
- + obj.getXxx(); ← 使用逻辑(块1)
74
-
75
- # ===== 文件信息总结 =====
76
- # ⚠️ 行号计算规则:找到问题所在块,从该块第1行代码开始计数
77
- ```
78
- > - **关键改进**:AI 能看到同一文件的所有变更块(块0判空 + 块1使用),**避免误报 NPE**
79
-
80
- > - **临时文件格式说明(旧版兼容)**:
61
+ > - **临时文件格式说明**:
81
62
  > - 文件分为两部分:`=== File Information ===` 和 `=== Diff Content ===`
82
63
  > - **File Information 部分**:
83
64
  > - `New Path`: 变更后的文件路径,格式如 `b/src/main/java/com/example/UserService.java`
@@ -352,6 +333,7 @@
352
333
  > - **禁止**在报告中输出错误代码示例(已经有行号定位了,不需要重复)
353
334
 
354
335
  19. **误报防控检查清单**(报告前必须确认):
336
+ > - [ ] **⚠️ 再次查阅代码确认(最高优先级)**:报告任何问题前,必须再次使用 Read 工具查阅相关代码文件。查阅范围包括:**代码所在方法、方法调用的上下游链路、相关依赖类/接口**。仔细确认代码逻辑,验证问题是否真实存在。禁止凭记忆或第一次分析就报告问题。
355
337
  > - [ ] **已安全处理验证**:代码是否已有判空/异常处理/边界检查?如是,省略该问题
356
338
  > - [ ] **逻辑一致性验证**:问题描述是否自相矛盾?(如"有判空但说未判空"、"逻辑正确但报告为问题")
357
339
  > - [ ] 已追踪读取相关方法实现,确认可能返回危险值
@@ -1,151 +1,121 @@
1
- ---
2
- name: simple-code-review
3
- description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_INFO
4
- ---
5
-
6
- ## 处理步骤
7
-
8
- 1. **读取 diff 文件**:使用 Read 工具读取文件:$ARGUMENTS
9
-
10
- 2. **识别临时文件类型**(关键步骤):
11
- - **类型 A:多块合并文件**(新格式,推荐)
12
- - 文件开头有 `# ===== 文件: [文件名] =====`
13
- - 包含多个 `# ===== 变更块 N =====` 标记
14
- - 每个块有独立的 `# New Start`、`# New Count`、`# 行号范围` 信息
15
- - **示例格式**:
16
- ```
17
- # ===== 文件: UserService.java =====
18
- # 变更块总数: 2
19
-
20
- # ===== 变更块 0 =====
21
- # 行号范围: 10 - 15
22
- # New Start: 10
23
- # New Count: 6
24
- [上下文代码]
25
- + if (obj == null) return; ← 判空逻辑(块0)
26
-
27
- # ===== 变更块 1 =====
28
- # 行号范围: 50 - 53
29
- # New Start: 50
30
- # New Count: 4
31
- [上下文代码]
32
- + obj.getXxx(); ← 使用逻辑(块1)
33
-
34
- # ===== 文件信息总结 =====
35
- # ⚠️ 行号计算规则:找到问题所在块,从该块第1行代码开始计数
36
- ```
37
- - **关键优势**:能看到同一文件的所有变更块(块0判空 + 块1使用),**避免误报 NPE**
38
-
39
- - **类型 B:单块文件**(旧格式,兼容)
40
- - 文件末尾有 `# File Information` 部分
41
- - 只包含一个 diff 块的内容
42
- - 从 `# New Start` `# New Count` 提取行号信息
43
-
44
- 3. **解析行号**(多块文件的关键规则):
45
- - **⚠️ 多块文件的行号计算方法**:
46
- 1. **识别问题所在的块**:通过 `# ===== 变更块 N =====` 标记
47
- 2. **读取该块的 New Start 值**:从块开头的 `# New Start: X` 提取
48
- 3. **从该块第1行代码开始计数**:行号 = New Start
49
- 4. **每往下一行(+ 或空格开头),行号 +1**
50
- 5. **- 开头的删除行不计数**,行号不增加
51
- 6. **示例**:
52
- - 问题在"变更块 1",该块 `# New Start: 50`
53
- - 从块内第1行代码开始计数,第2行是 `obj.getXxx()`
54
- - 行号 = 50 + 1 = 51
55
- 7. **⚠️ 强制验证**:输出前必须检查行号是否在该块范围内 `[New Start, New Start + New Count - 1]`
56
-
57
- - **单块文件的行号计算方法**(旧格式兼容):
58
- 1. 从文件末尾 `# File Information` 提取 `New Start` 和 `New Count`
59
- 2. 从第 1 行代码开始,行号 = `New Start`
60
- 3. 每往下一行(`+` 或空格开头),行号 +1
61
- 4. `-` 开头的删除行不计数
62
- 5. 验证行号范围 `[New Start, New Start + New Count - 1]`
63
-
64
- - **⚠️ 强制验证步骤**(所有文件类型必须执行):
65
- 1. 从元数据提取 `New Start` 和 `New Count`,计算行号范围
66
- 2. **逐个检查**每个问题的行号是否在该范围内
67
- 3. **如果任何行号超出范围,必须重新计数**
68
- 4. **禁止**直接使用从完整文件读取的行号
69
-
70
- 4. **读取上下文**:基于 New Path 读取变更后文件,涉及方法调用时追踪读取实现代码
71
- - **⚠️ 重要**:读取完整文件仅用于理解代码逻辑,**不得**直接使用完整文件中的行号
72
- - 如果从完整文件中定位到问题行号,**必须验证**该行号是否在 diff 块范围内
73
- - **验证公式**:`new_start <= 行号 <= new_start + new_count - 1`
74
- - **如果行号超出范围**:必须回到 diff 块内容,重新逐行计数
75
-
76
- 5. **执行审查**:按照 @.claude/rules/code-review-rules.md 中的规则进行审查
77
- - **⚠️ 多块文件的审查优势**:
78
- - 能看到同一文件的所有变更块(块0判空 + 块1使用)
79
- - **避免误报"块1未判空"**(因为能看到块0已有判空)
80
- - **跨块上下文分析**:合并同一文件多个块的信息,判断逻辑是否安全
81
-
82
- 6. **输出结果**:
83
- - 审查结果放入 `<REPORT>` 标签
84
- - 行号信息放入 `<LINE_INFO>` 标签(必须输出)
85
- - LINE_INFO 格式参考 @.claude/rules/code-review-rules.md 第 18 条
86
- - **问题和行号对应**:`<LINE_INFO>` 中的第 N 个元素对应第 N 个问题的行号
87
-
88
- ## 输出模板
89
-
90
- **⚠️ 强制格式要求(违反会导致解析失败)**:
91
-
92
- 1. **报告开头必须包含 `## 🤖 AI 代码审查结果`**:
93
- - **正确**:`<REPORT>\n## 🤖 AI 代码审查结果\n\n### 🔴 严重问题`
94
- - **错误**:`<REPORT>\n### 🔴 严重问题`(缺少主标题)
95
- - **错误**:`<REPORT>\n## 代码审查结果`(缺少 emoji)
96
-
97
- 2. **问题格式**:每个问题必须以 `**问题 N**:` 开头(N 为阿拉伯数字 1,2,3...)
98
- - **正确**:`**问题 1**:`、`**问题 2**:`
99
- - **错误**:`1. **xxx**`、`### 问题 1`、`**问题一**:`、`**问题 1**: xxx(行 43)`
100
-
101
- 3. **每个问题块只能有一个 `**文件及行号**:` 行**:
102
- - **正确**:每个问题块中 `**文件及行号**:` 只出现一次
103
- - **错误**:同一个问题块中出现两次 `**文件及行号**:` 行
104
-
105
- 4. **行号标注**:**禁止**在问题描述中写"(行 X)",行号只能通过 `<LINE_INFO>` 标签提供
106
-
107
- 5. **LINE_INFO**:必须与问题一一对应,第 N 个元素对应问题 N 的行号
108
-
109
- 6. **禁止输出错误代码示例**:已经有行号定位了,不需要重复输出错误代码
110
-
111
- 7. **必须输出 `<LINE_INFO>` 标签**:即使无问题也要输出空数组 `<LINE_INFO>[]</LINE_INFO>`
112
-
113
- 8. **修改建议中的代码格式**:
114
- - **必须使用 markdown 代码块**(```language ... ```)展示建议代码
115
- - **禁止**使用行内代码(\`xxx\`)展示多行代码示例
116
- - 代码块的语言根据文件类型自动选择(如 \`java\`、\`js\`、\`ts\`、\`py\`、\`go\` 等)
117
- - 示例:
118
- \`\`\`
119
- **修改建议**:添加空值检查
120
- \`\`\`java
121
- if ([变量] != null) {
122
- [方法调用];
123
- }
124
- \`\`\`
125
- \`\`\`
126
-
127
- <REPORT>
128
- ## 🤖 AI 代码审查结果
129
-
130
- ### 🔴 严重问题
131
-
132
- **问题 1**:[问题描述]<br/>
133
- **文件及行号**:[文件路径:行号]<br/>
134
- **修改建议**:[正确示例代码或说明]
135
-
136
- **问题 2**:[问题描述]<br/>
137
- **文件及行号**:[文件路径:行号]<br/>
138
- **修改建议**:[正确示例代码或说明]
139
-
140
- </REPORT>
141
-
142
- <LINE_INFO>
143
- [{"new_path":"文件路径","new_line":行号,"old_path":"文件路径","old_line":行号}]
144
- </LINE_INFO>
145
-
146
- **说明**:
147
- - 无问题时省略 `### 🔴 严重问题` 标题,但 `<LINE_INFO>` 必须输出(空数组:`[]`)
148
- - 每个问题以 `**问题 N**:` 开头,方便切分
149
- - **`<LINE_INFO>` 数组中的元素顺序必须与问题顺序一致**:第 1 个元素对应问题 1 的行号,第 2 个元素对应问题 2 的行号,以此类推
150
- - 行号:返回变更后文件中的绝对行号(从 1 开始计数),例如文件第 43 行则 `new_line = 43`
151
- - **无严重问题时,LINE_INFO 必须输出空数组 `[]`**
1
+ ---
2
+ name: simple-code-review
3
+ description: 代码审查技能,审查变更代码并输出 REPORT 和 LINE_INFO
4
+ ---
5
+
6
+ ## 处理步骤
7
+
8
+ 1. **读取 diff 文件**:使用 Read 工具读取文件:$ARGUMENTS
9
+
10
+ 2. **解析文件信息**:从文件末尾的 `# File Information` 部分提取
11
+ - `New Start`: 当前 diff 块在变更后文件中的起始行号
12
+ - `New Count`: 当前 diff 块的行数
13
+ - `New Path`: 文件路径(去掉 `a/` `b/` 前缀)
14
+ - **注意**:元数据在文件末尾,`@@` 行已被移除,不影响行号计数
15
+
16
+ 3. **解析行号**:**基于 diff 块内容逐行计数,计算绝对行号**
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` 等以 `# ` 开头的行都**不编号**,直接跳过
24
+ - **⚠️ 临时文件格式示例**(理解计数起点):
25
+ ```
26
+ [代码行 1] <-- 空格开头,行号 = 29(New Start=29)
27
+ + [代码行 2] <-- + 开头,行号 = 30(29+1
28
+ + [代码行 3] <-- + 开头,行号 = 31(30+1)
29
+ [代码行 4] <-- 空格开头,行号 = 32(31+1)
30
+ ...(diff 内容结束)
31
+ # File Information
32
+ # New Path: b/src/Test.java
33
+ # New Start: 29 <-- 元数据在末尾,提供行号计算起点
34
+ ```
35
+ - **⚠️ 强制验证步骤**(输出前必须执行):
36
+ 1. 从元数据提取 `New Start` 和 `New Count`,计算行号范围:`[New Start, New Start + New Count - 1]`
37
+ 2. **逐个检查**每个问题的行号是否在该范围内
38
+ 3. **如果任何行号超出范围,必须重新计数**
39
+ 4. **禁止**直接使用从完整文件读取的行号
40
+ - **示例**:
41
+ - `New Start: 1, New Count: 56` 的行号范围是 [1, 56],**不能返回 57、60 等超出范围的值**
42
+ - `New Start: 167, New Count: 6` 的行号范围是 [167, 172],**不能返回 <167 或 >172 的值**
43
+
44
+ 4. **读取上下文**:基于 New Path 读取变更后文件,涉及方法调用时追踪读取实现代码
45
+ - **⚠️ 重要**:读取完整文件仅用于理解代码逻辑,**不得**直接使用完整文件中的行号
46
+ - 如果从完整文件中定位到问题行号,**必须验证**该行号是否在 diff 块范围内
47
+ - **验证公式**:`new_start <= 行号 <= new_start + new_count - 1`
48
+ - **如果行号超出范围**:必须回到 diff 块内容,重新基于 `@@` 头之后逐行计数
49
+
50
+ 5. **执行审查**:按照 @.claude/rules/code-review-rules.md 中的规则进行审查
51
+
52
+ 6. **输出结果**:
53
+ - 审查结果放入 `<REPORT>` 标签
54
+ - 行号信息放入 `<LINE_INFO>` 标签(必须输出)
55
+ - LINE_INFO 格式参考 @.claude/rules/code-review-rules.md 18
56
+ - **问题和行号对应**:`<LINE_INFO>` 中的第 N 个元素对应第 N 个问题的行号
57
+
58
+ ## 输出模板
59
+
60
+ **⚠️ 强制格式要求(违反会导致解析失败)**:
61
+
62
+ 1. **报告开头必须包含 `## 🤖 AI 代码审查结果`**:
63
+ - **正确**:`<REPORT>\n## 🤖 AI 代码审查结果\n\n### 🔴 严重问题`
64
+ - **错误**:`<REPORT>\n### 🔴 严重问题`(缺少主标题)
65
+ - **错误**:`<REPORT>\n## 代码审查结果`(缺少 emoji)
66
+
67
+ 2. **问题格式**:每个问题必须以 `**问题 N**:` 开头(N 为阿拉伯数字 1,2,3...)
68
+ - **正确**:`**问题 1**:`、`**问题 2**:`
69
+ - **错误**:`1. **xxx**`、`### 问题 1`、`**问题一**:`、`**问题 1**: xxx(行 43)`
70
+
71
+ 3. **每个问题块只能有一个 `**文件及行号**:` 行**:
72
+ - **正确**:每个问题块中 `**文件及行号**:` 只出现一次
73
+ - **错误**:同一个问题块中出现两次 `**文件及行号**:`
74
+
75
+ 4. **行号标注**:**禁止**在问题描述中写"(行 X)",行号只能通过 `<LINE_INFO>` 标签提供
76
+
77
+ 5. **LINE_INFO**:必须与问题一一对应,第 N 个元素对应问题 N 的行号
78
+
79
+ 6. **禁止输出错误代码示例**:已经有行号定位了,不需要重复输出错误代码
80
+
81
+ 7. **必须输出 `<LINE_INFO>` 标签**:即使无问题也要输出空数组 `<LINE_INFO>[]</LINE_INFO>`
82
+
83
+ 8. **修改建议中的代码格式**:
84
+ - **必须使用 markdown 代码块**(```language ... ```)展示建议代码
85
+ - **禁止**使用行内代码(\`xxx\`)展示多行代码示例
86
+ - 代码块的语言根据文件类型自动选择(如 \`java\`、\`js\`、\`ts\`、\`py\`、\`go\` 等)
87
+ - 示例:
88
+ \`\`\`
89
+ **修改建议**:添加空值检查
90
+ \`\`\`java
91
+ if ([变量] != null) {
92
+ [方法调用];
93
+ }
94
+ \`\`\`
95
+ \`\`\`
96
+
97
+ <REPORT>
98
+ ## 🤖 AI 代码审查结果
99
+
100
+ ### 🔴 严重问题
101
+
102
+ **问题 1**:[问题描述]<br/>
103
+ **文件及行号**:[文件路径:行号]<br/>
104
+ **修改建议**:[正确示例代码或说明]
105
+
106
+ **问题 2**:[问题描述]<br/>
107
+ **文件及行号**:[文件路径:行号]<br/>
108
+ **修改建议**:[正确示例代码或说明]
109
+
110
+ </REPORT>
111
+
112
+ <LINE_INFO>
113
+ [{"new_path":"文件路径","new_line":行号,"old_path":"文件路径","old_line":行号}]
114
+ </LINE_INFO>
115
+
116
+ **说明**:
117
+ - 无问题时省略 `### 🔴 严重问题` 标题,但 `<LINE_INFO>` 必须输出(空数组:`[]`)
118
+ - 每个问题以 `**问题 N**:` 开头,方便切分
119
+ - **`<LINE_INFO>` 数组中的元素顺序必须与问题顺序一致**:第 1 个元素对应问题 1 的行号,第 2 个元素对应问题 2 的行号,以此类推
120
+ - 行号:返回变更后文件中的绝对行号(从 1 开始计数),例如文件第 43 行则 `new_line = 43`
121
+ - **无严重问题时,LINE_INFO 必须输出空数组 `[]`**