job51-gitlab-cr-node-jt-1 2.8.4 → 2.8.6

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.
@@ -7,7 +7,7 @@
7
7
  0. **「已安全处理」代码禁止报告**(关键规则):
8
8
  > - **如果代码已正确处理潜在风险(如已判空、已捕获异常、已有边界检查),则绝对禁止报告该问题**
9
9
  > - **如果分析结论包含"逻辑正确"、"无需修改"、"已有 XX 保护"、"符合安全编码规范"、"已正确处理该场景"等描述,必须省略该问题,不得输出报告**
10
- > - **示例**:`if (getErrCode() != null && getErrCode() == 0)` — 已判空后再比较,是安全编码,**禁止报告任何问题**
10
+ > - **示例**:判空检查后再进行值比较的逻辑(如:先检查对象非空,再访问其属性)— 已判空后再操作,是安全编码,**禁止报告任何问题**
11
11
  > - **自检问题**:输出前问自己"如果这段代码是安全的,我为什么要报告它?"
12
12
 
13
13
  1. **审查范围限制**(关键规则):
@@ -19,21 +19,21 @@
19
19
  2. **同一问题只报告一次**:
20
20
  > - 同一个空指针问题可能在多处出现(import 行、依赖注入行、方法调用行)
21
21
  > - **只在真正会执行出错的代码行上报告一次**
22
- > - 示例:`@Autowired UserTaskSDK userTaskSDK;` 和 `userTaskSDK.xxx()` 都有空指针风险
23
- > - **正确做法**:只在 `userTaskSDK.xxx()` 调用行报告,**禁止**在依赖注入行报告
22
+ > - 示例:依赖注入的字段声明和后续的方法调用行都存在空指针风险
23
+ > - **正确做法**:只在实际方法调用处报告(如调用 SDK 对象方法的位置),**禁止**在依赖注入行报告
24
24
 
25
25
  3. **禁止报告问题的位置**:
26
26
  > - import 导入语句行
27
27
  > - 类定义、package 声明行
28
28
  > - 方法签名行(除非签名本身有安全问题)
29
- > - 依赖注入/字段声明行(如 `@Autowired XXX xxx;`)
29
+ > - 依赖注入/字段声明行(如带有依赖注入注解的字段声明)
30
30
  > - 仅定义变量但未使用的行
31
31
  > - 其他不会直接导致运行时错误的位置
32
32
 
33
33
  4. **深度分析但精准报告**:
34
34
  > - **报告运行时异常风险前,必须先用 Read 工具追踪读取相关方法/函数的实现代码**
35
35
  > - 适用场景:空指针/空引用异常、类型转换异常、集合越界等所有运行时异常
36
- > - 示例:看到 `obj = service.getData(id); obj.getProperty()` 时,**必须先读取** `service.getData` 方法的源码,确认其返回值是否可能为 null
36
+ > - 示例:看到方法调用链式访问对象属性时(如:调用服务方法获取对象,再访问该对象属性),**必须先读取**该服务方法的源码,确认其返回值是否可能为 null
37
37
  > - 如果方法/函数内部已有防护措施(如返回默认对象、空对象模式、边界检查等),则**禁止报告**该问题
38
38
  > - **禁止仅凭代码表面形式判断运行时异常风险**
39
39
 
@@ -41,7 +41,7 @@
41
41
  > - **⚠️ 风格一致性原则**:参数校验、异常处理、注解使用等应与项目原有风格匹配,**不得报告"建议添加 XX 注解/XX 校验/XX 异常处理"** 这类问题。
42
42
  > - **⚠️ Controller/Client 接口参数校验放宽**:
43
43
  > - Controller 接口方法、Client 接口方法的参数校验**以项目原有风格为准**
44
- > - 如果项目现有接口多数没有添加 `@NotNull`、`@NotBlank`、`@Valid` 等校验注解,**不得建议添加**
44
+ > - 如果项目现有接口多数没有添加参数校验注解(如非空校验、格式校验等),**不得建议添加**
45
45
  > - 如果项目现有接口多数没有显式参数判空逻辑,**不得建议添加**
46
46
  > - 参数校验形式应参考同文件/同模块其他接口的写法,保持一致性
47
47
  > - **仅在校验风格与同一文件中其他接口明显不一致时**,才需要提示
@@ -86,14 +86,14 @@
86
86
  > - **必须读取完整方法上下文**:
87
87
  > - 审查前必须使用 Read 工具读取**整个方法**的代码,不只是 diff 块
88
88
  > - 分析方法开始处是否有判空保护、早期返回、断言等逻辑
89
- > - 示例:方法开头有 `if (accountInfo == null) return;`,后续 `accountInfo.getXxx()` **不应报告 NPE**
89
+ > - 示例:方法开头有判空检查并提前返回的逻辑,后续访问该对象属性的代码 **不应报告 NPE**
90
90
  > - **必须跨 diff 块分析同一文件/方法的上下文**:
91
91
  > - 同一个文件/方法可能被拆分成多个 diff 块,**必须合并所有块一起分析**
92
- > - 示例:块 A 显示删除了 `obj.setValue(xxx)`,块 B 显示新增了 `if(condition) obj.setValue(yyy)`
92
+ > - 示例:块 A 显示删除了对象属性赋值语句,块 B 显示新增了条件判断后的对象属性赋值语句
93
93
  > - 这种情况下**不应报告**"删除了 set 值会影响数据",因为块 B 已有新的 set 逻辑
94
94
  > - **必须分析方法内联上下文**:
95
95
  > - 对于在同一方法内的代码,必须分析完整的上下文逻辑
96
- > - 示例:方法开始处已有 `if (obj == null) return;`,后续有 `obj.getProperty()` 调用
96
+ > - 示例:方法开始处已有判空检查并提前返回的逻辑,后续有访问对象属性的调用
97
97
  > - **结论**:不应报告空指针问题,因为已有前置判空保护
98
98
  > - **确认后再报告**:
99
99
  > - 如果方法/函数内部已处理边界情况(如返回默认对象、空对象、默认值等),则**不应**标记为问题
@@ -105,21 +105,21 @@
105
105
 
106
106
  > - **⚠️ 免报告场景识别(强制执行)**:
107
107
  > - **工具类方法安全调用**:以下工具类方法内部已处理 null 检查,不应报告空指针问题:
108
- > - `CollectionUtils.isEmpty()/isNotEmpty()`(Apache Commons、Spring 版本)
109
- > - `StringUtils.isEmpty()/isBlank()/isNotBlank()`(Apache Commons Lang3)
110
- > - `Strings.isNullOrEmpty()`(Guava)
111
- > - `Objects.isNull()/nonNull()`(JDK)
108
+ > - 集合工具类的判空方法(Apache Commons、Spring 版本)
109
+ > - 字符串工具类的判空判白方法(Apache Commons Lang3)
110
+ > - 字符串判空工具方法(Guava)
111
+ > - 对象判空工具方法(JDK)
112
112
  > - **框架校验逻辑**:框架/库自带的校验逻辑不应报告为代码缺陷:
113
- > - Spring/Bean Validation: `@NotNull`, `@NotBlank`, `@NotEmpty`, `@NonNull`
113
+ > - Spring/Bean Validation: 参数非空校验注解、格式校验注解等
114
114
  > - Feign Client 参数校验、MyBatis/JPA 实体字段约束
115
- > - Lombok `@NonNull` 注解生成的代码
115
+ > - Lombok 非空注解生成的代码
116
116
  > - **返回类型确定性**:
117
117
  > - 基本类型(int, boolean):不可能为 null
118
- > - 明确返回空集合的方法(如 `return Collections.emptyList()`)
119
- > - 有 `@NotNull` 注解或 `Objects.requireNonNull()` 保护的方法
118
+ > - 明确返回空集合的方法(如返回空集合的工具方法)
119
+ > - 有非空注解或对象非空校验方法保护的方法
120
120
  > - **早期返回模式**:
121
121
  > - 方法开头已有判空/边界检查并提前返回的代码,后续逻辑**不应报告**空指针问题
122
- > - 示例:`if (query == null || list.isEmpty()) return emptyList;` 后续有正常业务逻辑,**不应报告**问题
122
+ > - 示例:方法开头有判空或边界检查并提前返回空结果的逻辑,后续有正常业务逻辑,**不应报告**问题
123
123
  > - **禁止报告"代码简化建议"类问题**:
124
124
  > - **禁止**建议"移除变量声明,直接 return xxx.stream()..."
125
125
  > - **禁止**建议"合并变量声明和返回语句"
@@ -146,9 +146,9 @@
146
146
  > - 仅定义变量但未使用的行
147
147
  > - 其他不会直接导致运行时错误的位置
148
148
  > - **Feign Client 远程调用返回值校验**:
149
- > - Feign Client 接口调用(如 `xxClient.getXxx()`)的返回值**不纳入空指针审查范围**
149
+ > - Feign Client 接口调用(如客户端接口的方法调用)的返回值**不纳入空指针审查范围**
150
150
  > - Feign 框架会在调用失败时抛出异常,而不是返回 null
151
- > - 示例:`Result<UserTaskPop> userTaskPop = userTaskClient.getUserTaskPop(accountId);` 后续调用 `userTaskPop.requestSucceeded()` **不应报告 NPE 问题**
151
+ > - 示例:调用远程服务接口获取结果对象,后续调用该结果对象的成功判断方法 **不应报告 NPE 问题**
152
152
  5. 使用当前系统时间填充 `[当前时间]`,并根据实际变更内容计算 `[文件数量]`;
153
153
  6. 所有占位符必须被真实内容替换;
154
154
  > - **修改建议中的代码示例**:
@@ -158,13 +158,13 @@
158
158
  > - **代码风格一致性**:建议代码应遵循项目现有风格(工具类方法、函数式编程、命名约定等)
159
159
  > - **⚠️ 禁止报告不存在的代码**:
160
160
  > - **错误代码示例必须是 diff 中实际存在的代码**(`+` 开头或空格开头的行)
161
- > - **禁止编造 diff 中没有的代码**,如报告中出现 `if (!serviceCode.endsWith("01"))` 但 diff 中根本没有这行代码
161
+ > - **禁止编造 diff 中没有的代码**,如报告中出现某个条件判断但 diff 中根本没有这行代码
162
162
  > - **禁止报告与 diff 无关的代码片段**,所有问题涉及的代码必须能在当前 diff 块中找到
163
163
  > - **输出前验证**:检查错误代码示例中的每一行,确认都能在 diff 的 `+` 开头或空格开头的行中找到
164
164
  7. 若无某类问题(如无严重问题),则**完全省略该部分**;
165
165
  8. 若同一级别问题有多个,在对应标题下按原代码顺序依次展示;
166
166
  > - **⚠️ 跨块去重规则**:**同一文件中由同一根本原因导致的问题,只报告一次**
167
- > - 示例:同一方法 `userTaskSDK.xxx()` 在文件中多处被调用,若都存在未判空问题,**合并为一条报告**
167
+ > - 示例:同一对象的同一方法在文件中多处被调用,若都存在未判空问题,**合并为一条报告**
168
168
  > - 判断标准:**文件 + 问题类型 + 根本原因**三者相同即为重复问题
169
169
  9. **严重问题(🔴)**:
170
170
  > - 安全漏洞(SQL 注入、命令注入、敏感信息泄露)
@@ -181,8 +181,7 @@
181
181
  > - 导致核心功能失效或产生错误业务结果
182
182
  > - 引入构建失败、测试失败或高危依赖漏洞
183
183
  > - **⚠️ 问题行号定位规则**:
184
- > - 空指针问题:报告在**实际访问对象属性/方法的行**(如 `obj.getId()`),不是变量定义行
185
- > - 示例:`UserTaskPop pop = sdk.method(); log.debug(pop.getId())` 问题应报告在 `pop.getId()` 行,不是 `sdk.method()` 或变量定义行
184
+ > - 空指针问题:报告在**实际访问对象属性/方法的行**(如访问对象的 ID 属性),不是变量定义行
186
185
  > - **每个 diff 块只报告本块内实际会出错的代码**,不要在无关的 diff 块(如 package 行、import 行、类定义行)报告问题
187
186
 
188
187
  11. **问题分级规则**:
@@ -255,10 +254,6 @@
255
254
  14. `<REPORT>` 标签示例中的问题块数量仅用于展示格式,实际数量由 review 结果决定;
256
255
 
257
256
  15. **输出前验证流程**:
258
- > - **块内去重检查**:**同一 diff 块内由同一根本原因导致的问题,只报告一次**
259
- > - 示例:同一个变量 `userTaskSDK` 在块内多处被调用,若都存在未判空问题,**合并为一条报告**
260
- > - 方法:**按「变量名 + 问题类型 + 根本原因」进行去重**,相同组合的问题只保留第一个
261
- > - **注意**:每个 diff 块是独立审查的,无法跨块去重,只需保证当前块内不重复
262
257
  > - **代码示例验证**:确保错误代码示例不包含 `-` 开头的已删除代码
263
258
  > - **删除代码验证**:**逐条检查问题涉及的代码行,确认不是 `-` 开头的已删除代码**
264
259
  > - **安全问题验证**:确保不针对已删除代码报告安全问题
@@ -270,9 +265,8 @@
270
265
  > - **错误代码选取**:必须从变更后实际存在的代码中选取(`+` 开头或空格开头)
271
266
  > - **⚠️ 违例后果**:对 `-` 开头的代码报告问题是严重误报,必须避免
272
267
  > - **⚠️ 问题报告位置规则**:
273
- > - **空指针/未判空问题**:只报告在**实际调用方法访问返回值的行**(如 `obj.getXxx()`),而不是方法调用或变量定义的行
274
- > - **示例**:`UserTaskPop pop = sdk.method(); pop.getId()` 问题应报告在 `pop.getId()` 这一行,而不是 `sdk.method()` 或变量定义行
275
- > - **依赖注入/字段声明**:如 `@Autowired UserTaskSDK userTaskSDK;`,**禁止**在此行报告空指针问题
268
+ > - **空指针/未判空问题**:只报告在**实际调用方法访问返回值的行**,而不是方法声明用或变量定义的行
269
+ > - **依赖注入/字段声明**:**禁止**在依赖注入/字段声明处报告空指针问题
276
270
  > - **Import 语句**:**禁止**在 import 行报告任何问题
277
271
  > - **同一变量多次使用**:只在第一次可能出错的地方报告一次
278
272
  > - **禁止**在类定义、package、import、方法签名等位置报告与这些行无关的问题
@@ -294,7 +288,7 @@
294
288
  > - 确认没有对已删除代码报告任何问题
295
289
  > - **步骤 7:问题定位验证**
296
290
  > - 确认问题报告在**真正会执行出错的行**上
297
- > - 空指针问题:报告在实际调用 `obj.getXxx()` 的行,不是变量定义行
291
+ > - 空指针问题:报告在实际调用的行,不是变量定义行
298
292
  > - 禁止在 package、import、类定义、方法签名等位置报告无关问题
299
293
 
300
294
  18. **输出格式**:严格参照 SKILL.md 模板,无某类问题时省略对应部分;
@@ -366,7 +360,7 @@
366
360
  > - [ ] 已追踪读取相关方法实现,确认可能返回危险值
367
361
  > - [ ] 已跨 diff 块分析,确认不是已被新逻辑替代的删除代码
368
362
  > - [ ] 已分析方法内联上下文,确认没有前置判空保护
369
- > - [ ] 已确认不是工具类方法(如 `CollectionUtils.isNotEmpty`)的安全调用
363
+ > - [ ] 已确认不是工具类方法的安全调用
370
364
  > - [ ] 已确认不是框架校验逻辑覆盖的场景
371
365
  > - [ ] 已确认不是返回空集合或有不返回 null 保证的方法
372
366
  > - [ ] **已确认问题不是"风格偏好"类问题**(如建议添加项目惯例中不存在的注解/校验/异常处理)
@@ -374,7 +368,7 @@
374
368
  > - [ ] **已执行跨块去重**:同一文件同一根本原因的问题只报告一次
375
369
  > - [ ] **已验证问题位置**:问题报告在真正会执行出错的行上,而非 package/import/类定义/方法签名等位置
376
370
  > - [ ] **已确认报告不自相矛盾**:
377
- > - 如果代码已有 `if (obj != null)` 判空检查,**禁止**报告"未判空"问题
371
+ > - 如果代码已有判空检查,**禁止**报告"未判空"问题
378
372
  > - 如果分析结论包含"当前代码逻辑正确"、"无需修改"、"已有 XX 保护"等描述,**禁止**将该问题报告为严重问题
379
373
  > - **报告前自检**:问题描述、错误代码、修改建议三者逻辑必须一致,不得出现"有判空但说未判空"的矛盾
380
374
  > - **建议写法**:如果确实想提醒注意某行为,但代码已正确处理,应省略该问题,不输出报告
package/index.js CHANGED
@@ -856,16 +856,15 @@ ${allReportsText}
856
856
  let targetLine = null;
857
857
  let skipReason = null;
858
858
 
859
- // 验证文件路径是否匹配当前 diff
859
+ // 验证文件路径是否匹配当前 diff 块(检测AI幻觉)
860
860
  if (problemInfo.new_path && diff_info.new_path &&
861
861
  problemInfo.new_path !== diff_info.new_path) {
862
- skipReason = `AI 返回的文件路径 ${problemInfo.new_path} 与当前 diff 块文件 ${diff_info.new_path} 不匹配,可能存在AI幻觉`;
863
- debugLog(`第 ${i + 1} 个问题 ${skipReason}`);
862
+ console.warn(`⚠️ 检测到AI幻觉:第 ${i + 1} 个问题的文件路径 ${problemInfo.new_path} 与当前 diff 块文件 ${diff_info.new_path} 不匹配,跳过该问题的评论发布`);
863
+ continue; // 直接跳过,不发布评论
864
864
  }
865
865
 
866
- // 只有文件路径匹配时,才继续验证行号
867
- if (!skipReason) {
868
- if (problemInfo.old_line && !problemInfo.new_line) {
866
+ // 验证行号是否在 diff 块范围内
867
+ if (problemInfo.old_line && !problemInfo.new_line) {
869
868
  // 删除代码,使用 old_line
870
869
  if (oldCount === 0) {
871
870
  skipReason = `删除文件的 diff 块 (old_count=${oldCount}),无法使用 old_line`;
@@ -902,7 +901,6 @@ ${allReportsText}
902
901
  };
903
902
  }
904
903
  }
905
- } // 文件路径验证条件块结束
906
904
 
907
905
  if (!targetLine) {
908
906
  // 无法解析行号或行号超出范围,使用一般讨论