@comate/zulu 1.4.0-beta.3 → 1.4.0-beta.5

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.
Files changed (39) hide show
  1. package/comate-engine/assets/skills/code-review/SKILL.md +6 -5
  2. package/comate-engine/assets/skills/code-review/agents/custom-reviewer.md +2 -2
  3. package/comate-engine/assets/skills/code-review/agents/meta-reviewer.md +2 -2
  4. package/comate-engine/assets/skills/code-review/agents/style-reviewer.md +72 -10
  5. package/comate-engine/assets/skills/code-review/references/dispatch-template.md +12 -12
  6. package/comate-engine/assets/skills/code-review/references/rules/Java/JAVA_STYLE_RULES.md +11 -5
  7. package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/SKILL.md +5 -8
  8. package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/long_running_task.md +0 -15
  9. package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/testing_strategy.md +1 -1
  10. package/comate-engine/assets/skills/create-image/SKILL.md +197 -201
  11. package/comate-engine/assets/skills/create-image/scripts/generate-image.ps1 +213 -0
  12. package/comate-engine/assets/skills/create-image/scripts/generate-image.sh +322 -0
  13. package/comate-engine/assets/skills/create-skill/SKILL.md +1 -2
  14. package/comate-engine/assets/skills/create-subagent/SKILL.md +11 -5
  15. package/comate-engine/assets/skills/get-ugate-token/SKILL.md +97 -13
  16. package/comate-engine/assets/skills/get-ugate-token/getUgateToken.py +99 -5
  17. package/comate-engine/node_modules/@baidu/comate-browser-use/dist/launch-chrome/index.js +1 -1
  18. package/comate-engine/node_modules/@baidu/comate-browser-use/package.json +5 -5
  19. package/comate-engine/node_modules/@comate/plugin-shared-internals/dist/index.js +1 -1
  20. package/comate-engine/package.json +1 -1
  21. package/comate-engine/server.js +149 -180
  22. package/dist/bundle/index.js +3 -3
  23. package/package.json +1 -1
  24. package/scripts/postinstall.js +4 -3
  25. package/comate-engine/assets/skills/code-review/evals/SKILL.md +0 -334
  26. package/comate-engine/assets/skills/code-review/evals/agents/gt-generator.md +0 -76
  27. package/comate-engine/assets/skills/code-review/evals/agents/miner.md +0 -87
  28. package/comate-engine/assets/skills/code-review/evals/agents/score-judge.md +0 -168
  29. package/comate-engine/assets/skills/code-review/evals/references/cli-query-template.md +0 -114
  30. package/comate-engine/assets/skills/code-review/evals/references/gt-schema.md +0 -77
  31. package/comate-engine/assets/skills/code-review/references/custom-rules/RULE_TEMPLATE.md +0 -141
  32. /package/comate-engine/assets/commands/{code-review-comate.md → code-review.md} +0 -0
  33. /package/comate-engine/assets/commands/{debug-comate.md → debug.md} +0 -0
  34. /package/comate-engine/assets/commands/{unit-test-comate.md → unit-test.md} +0 -0
  35. /package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/backend_dev.md +0 -0
  36. /package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/env_setup.md +0 -0
  37. /package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/frontend_dev.md +0 -0
  38. /package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/references/git_operations.md +0 -0
  39. /package/comate-engine/assets/skills/{create-automation-tasks-comate → create-automation}/scripts/check_config.py +0 -0
@@ -1,168 +0,0 @@
1
- # Precision Judge
2
-
3
- 你是一个代码审查评测的判分器。你的任务是判定 code-review skill 的输出是否发现了已知问题。
4
-
5
- ## 背景
6
-
7
- 评测流程:
8
- 1. 从 git 历史中取出 commit 的 diff
9
- 2. 样本分两类:
10
- - **bug-fix 样本**:从 bug-fix commit 中取出的**反转 diff**(修复后 → 修复前),模拟"有人提交了引入 bug 的代码"
11
- - **clean 样本**:从 feature/enhance commit 中取出的正常 diff(修改前 → 修改后)
12
- 3. GT 生成器和 code-review skill 都只看到 diff(不知道样本类型),各自独立产出分析结果
13
- 4. 你需要结合样本类型和 GT,判断 skill 的表现
14
-
15
- ## 输入
16
-
17
- - **样本类型**:`bug-fix` 或 `clean`(来自 candidates.json,不是 GT 生成器标注的)
18
- - **GT findings**: GT 生成器独立分析产出的 findings(可能为空)
19
- - **Predicted findings**: skill 在审查报告中实际说了什么
20
-
21
- ## 维度映射
22
-
23
- GT 的 `dimension` 与主 skill 的 `reviewer`/`category` 对应关系如下。判分时用此映射理解 skill 输出的分类含义:
24
-
25
- | GT `dimension` | 主 skill `reviewer` | 对应的 `category` 值 |
26
- |---|---|---|
27
- | `correctness` | `correctness` | `null-safety`, `type-error`, `data-structure`, `exception-handling`, `variable-param`, `string-format`, `control-flow`, `oop-error`, `framework-bug` |
28
- | `reliability` | `reliability` | `resource-leak`, `concurrency-race`, `thread-safety`, `db-operation`, `async-issue`, `auth-missing`, `auth-bypass`, `auth-logic-error`, `performance-issue` |
29
- | `style` | `style` | `code-format`, `naming-convention`, `code-style`, `comment-style`, `vue-style`, `react-style` |
30
- | `reuse` | `reuse` | `duplicate-function`, `inline-reimplementation`, `similar-pattern` |
31
-
32
- **注意**:
33
- - 判分时**不要因为 dimension/reviewer 不匹配就判定 miss**。GT 的 dimension 和 skill 输出的 reviewer/category 只是辅助信息,最终判分依据仍然是 `expected_review` 与 skill 输出的**语义一致性**。
34
- - 如果 GT finding 的 `dimension` 为 `efficiency` 或 `quality`(历史数据),将其映射到 `reliability`(performance-issue 等)。
35
-
36
- ## 判分逻辑
37
-
38
- ### 对于 bug-fix 样本
39
-
40
- bug-fix 样本使用反转 diff,diff 中的 `+` 行是引入 bug 的代码。skill 的任务是发现这些新引入代码中的问题。
41
-
42
- #### 情况 A:GT 有 findings
43
-
44
- 对每个 GT finding,判断 skill 是否命中:
45
-
46
- **命中(hit=1)**:skill 的输出和 GT 的 `expected_review` 语义一致,指向同一个底层问题。文件必须匹配,问题的核心相同。
47
-
48
- **未命中(hit=0)**:skill 说"审查通过"、发现了完全不同的文件、或发现了 GT 中没有的其他问题。
49
-
50
- #### 情况 B:GT 无 findings(bug 过于隐蔽,GT 也未发现)
51
-
52
- 此情况说明这个 bug 即使在反转 diff 中也很难看出。标记为 `gt_blind=true`。
53
- - 如果 skill 也没发现:`hit=0`,但 `gt_blind=true`(不计入 Recall 分母,因为 GT 也看不出来)
54
- - 如果 skill 反而发现了:`hit=1`,`gt_blind=true`(skill 表现超出 GT,是加分项)
55
-
56
- ### 对于 clean 样本
57
-
58
- #### 情况 A:GT 无 findings(GT 也认为 diff 无问题)
59
-
60
- **正确(correct=1)**:skill 说"审查通过"或"未发现需要阻断合入的问题",或只报告了 P3 级别的代码风格建议。
61
-
62
- **误报(false_positive=1)**:skill 报告了 P0/P1/P2 级别的问题。
63
-
64
- #### 情况 B:GT 有 findings(GT 独立发现了 clean 样本中的问题)
65
-
66
- 此情况说明这个 feature commit 实际上也存在问题。按 bug-fix 样本的逻辑判分:
67
- - 如果 skill 的 finding 和 GT 的 finding 语义匹配:`hit=1`(skill 正确发现了问题,不算误报)
68
- - 如果 skill 的 finding 和 GT 的 finding 不匹配:按正常逻辑判断是命中、未命中还是误报
69
-
70
- **关键**:当 GT 在 clean 样本上也发现了问题时,skill 发现同样的问题是正确行为,**绝不能算误报**。
71
-
72
- ## 输出
73
-
74
- 仅输出 JSON,不要包含任何其他内容:
75
-
76
- ### bug-fix 样本(GT 有 findings)
77
-
78
- ```json
79
- {
80
- "sample_type": "bug-fix",
81
- "gt_blind": false,
82
- "gt_count": 1,
83
- "pred_count": 3,
84
- "hits": 1,
85
- "false_positives": 2,
86
- "correct_negatives": 0,
87
- "details": [
88
- {
89
- "gt_idx": 0,
90
- "gt_description": "新引入代码的 bug 描述",
91
- "matched_pred": "skill 实际说了什么",
92
- "hit": true,
93
- "reason": "判定理由"
94
- }
95
- ]
96
- }
97
- ```
98
-
99
- ### bug-fix 样本(GT 也未发现 bug,gt_blind)
100
-
101
- ```json
102
- {
103
- "sample_type": "bug-fix",
104
- "gt_blind": true,
105
- "gt_count": 0,
106
- "pred_count": 1,
107
- "hits": 1,
108
- "false_positives": 0,
109
- "correct_negatives": 0,
110
- "details": [
111
- {
112
- "gt_idx": null,
113
- "gt_description": "GT 未发现问题(bug 过于隐蔽)",
114
- "matched_pred": "skill 实际发现的问题",
115
- "hit": true,
116
- "reason": "skill 在 GT 也看不出的情况下独立发现了 bug,超出 GT 基准"
117
- }
118
- ]
119
- }
120
- ```
121
-
122
- ### clean 样本(GT 无 findings,skill 也无问题)
123
-
124
- ```json
125
- {
126
- "sample_type": "clean",
127
- "gt_blind": false,
128
- "gt_count": 0,
129
- "pred_count": 0,
130
- "hits": 0,
131
- "false_positives": 0,
132
- "correct_negatives": 1,
133
- "details": []
134
- }
135
- ```
136
-
137
- ### clean 样本(GT 有 findings,skill 也发现了同样问题)
138
-
139
- ```json
140
- {
141
- "sample_type": "clean",
142
- "gt_blind": false,
143
- "gt_count": 1,
144
- "pred_count": 1,
145
- "hits": 1,
146
- "false_positives": 0,
147
- "correct_negatives": 0,
148
- "details": [
149
- {
150
- "gt_idx": 0,
151
- "gt_description": "GT 在 clean 样本中发现的问题",
152
- "matched_pred": "skill 发现的同样问题",
153
- "hit": true,
154
- "reason": "skill 和 GT 一致发现了 clean 样本中的真实问题,不算误报"
155
- }
156
- ]
157
- }
158
- ```
159
-
160
- ## 规则
161
-
162
- 1. **重点看 `expected_review`**:这是 GT 中最关键的判分依据。
163
- 2. **宽松但不过度宽松**:skill 的表述不需要和 GT 完全一致,但必须指向同一个底层问题。如果只是"同一个文件的不同问题",不算命中。
164
- 3. **P3 风格建议不算命中也不算误报**:如果 skill 只报告了命名风格、代码组织等 P3 问题,而 GT 是 P0/P1 的正确性 bug,这算未命中(不是误报)。
165
- 4. **误报只针对 P0-P2 级别**:skill 报告了一个不存在的 P0/P1/P2 问题才算误报。P3 不算。
166
- 5. **保守判定**:如果不确定,判定为 miss(hit=0)。
167
- 6. **尊重 GT 的盲审结果**:GT 生成器不知道样本类型,它的 findings 反映了"仅从 diff 能看出的问题"。当 GT 和 skill 一致发现问题时(即使在 clean 样本上),这是正确行为。
168
- 7. **gt_blind 标记**:当 bug-fix 样本的 GT 为空时,标记 `gt_blind=true`,这些样本在计算 Recall 时需要特殊处理。
@@ -1,114 +0,0 @@
1
- # CLI Query Template (Full Mode)
2
-
3
- Full mode 下,每个样本通过独立的 CLI 进程运行完整 code-review skill。本文件定义 CLI 命令模板和 query 模板。
4
-
5
- ## CLI 命令模板
6
-
7
- ### zulu
8
-
9
- ```bash
10
- zulu run \
11
- -l "{LICENSE}" \
12
- --activate-skill code-review \
13
- --cwd "{REPO}" \
14
- --display task \
15
- -q "{QUERY}"
16
- ```
17
-
18
- ### baidu-cc
19
-
20
- ```bash
21
- baidu-cc \
22
- -p "{QUERY}" \
23
- --allowedTools "Bash,Read,Write,Edit,Glob,Grep,Agent" \
24
- --cwd "{REPO}"
25
- ```
26
-
27
- > `baidu-cc` 走内部认证,不需要 license。`--allowedTools` 确保 CLI 进程拥有完整工具集以支持多 Agent pipeline。
28
-
29
- ## Query 模板
30
-
31
- 以下 query 用于每个 CLI 进程的 `-q` / `-p` 参数:
32
-
33
- ```
34
- 请审查以下代码变更。
35
-
36
- ## 范围(已确定,跳过 Step 1)
37
-
38
- 执行以下命令获取待审 diff:
39
- git diff {DIFF_BASE} {DIFF_TARGET} -- {SOURCE_FILES}
40
-
41
- 注意:范围已确定,不需要执行 Step 1 的范围检测逻辑。直接使用上述 diff 命令获取变更内容。
42
-
43
- ## 约束
44
-
45
- - 跳过 Step 1(范围检测):审查范围已由上述 diff 命令确定
46
- - 跳过 Step 8(用户交互):不要调用 ask_user_question,完成审查报告后直接结束
47
- - 输出格式严格按照 Step 6 的报告格式
48
-
49
- ## 审查要求
50
-
51
- - 不要预设代码中存在 bug。diff 可能是 bug 修复、功能新增、重构或其他任何类型的变更
52
- - 从正确性、可靠性、风格、复用四个维度进行审查
53
- - 如果代码实现正确且合理,直接说"审查通过",不要硬凑问题
54
- - 如果发现问题,按严重等级(P0-P3)分类输出
55
-
56
- 请从 Step 2 开始执行审查流程。
57
- ```
58
-
59
- ## 占位符说明
60
-
61
- | 占位符 | 来源 | 说明 |
62
- |--------|------|------|
63
- | `{REPO}` | 参数 `repo` | 目标 git 仓库绝对路径 |
64
- | `{LICENSE}` | 参数 `license` | zulu SaaS license key,仅 `cli=zulu` 时需要 |
65
- | `{DIFF_BASE}` | 根据样本类型决定 | bug-fix 样本:`commit`(反转方向);clean 样本:`parent_commit`(正常方向) |
66
- | `{DIFF_TARGET}` | 根据样本类型决定 | bug-fix 样本:`parent_commit`(反转方向);clean 样本:`commit`(正常方向) |
67
- | `{SOURCE_FILES}` | `candidates.json` 中的 `source_files` | 空格分隔的源码文件路径列表 |
68
- | `{QUERY}` | 上方 Query 模板填充后的完整文本 | CLI 的 prompt 参数 |
69
-
70
- ### Diff 方向规则
71
-
72
- | 样本类型 | diff 命令 | 含义 |
73
- |----------|-----------|------|
74
- | bug-fix | `git diff {COMMIT} {PARENT_COMMIT} -- {FILES}` | 反转 diff:修复后 → 修复前,模拟"引入 bug 的变更" |
75
- | clean | `git diff {PARENT_COMMIT} {COMMIT} -- {FILES}` | 正常 diff:修改前 → 修改后,"引入新功能的变更" |
76
-
77
- ## 设计说明
78
-
79
- ### 为什么跳过 Step 1
80
-
81
- 生产环境中 Step 1 通过 `git status` 探测工作区变更来确定审查范围。但 eval 场景下 diff 来自历史 commit 而非工作区,Step 1 的探测逻辑会走到错误分支。因此直接提供 diff 命令,跳过范围检测。
82
-
83
- ### 为什么跳过 Step 8
84
-
85
- Step 8 调用 `ask_user_question` 等待用户选择修复方案。eval 需要全自动运行数十个样本,不能每个都停下来等人交互。
86
-
87
- ### 为什么反转 bug-fix diff
88
-
89
- 真实的 code review 场景是审查"有人提交了一段新代码"。如果直接用 bug-fix commit 的 diff(修复前 → 修复后),skill 看到的是"有人在修 bug",会合理地认为"修复正确,审查通过"。反转后,skill 看到的是"有人提交了引入 bug 的代码",这才是测试 bug 检测能力的正确方式。Clean 样本本身就是"引入新功能",不需要反转。
90
-
91
- ### 信息对称
92
-
93
- Query 中**不包含** commit subject 和样本类型(bug-fix / clean),确保 skill 和 GT 生成器在相同信息条件下运行。
94
-
95
- ## Shell 并发控制模板
96
-
97
- 主 Agent 根据 `candidates.json` 生成完整脚本。以下是并发控制的关键模式:
98
-
99
- ```bash
100
- MAX_PARALLEL=5
101
- RUNNING=0
102
-
103
- for ARGS in "${SAMPLES[@]}"; do
104
- run_review $ARGS &
105
- RUNNING=$((RUNNING + 1))
106
- if [ "$RUNNING" -ge "$MAX_PARALLEL" ]; then
107
- wait -n 2>/dev/null || wait # bash 4.3+ 支持 wait -n,低版本回退到 wait 全部
108
- RUNNING=$((RUNNING - 1))
109
- fi
110
- done
111
- wait
112
- ```
113
-
114
- > `wait -n` 在 bash 4.3+ 可用,等待任一后台进程完成。低版本 bash 可用 `wait` 等待全部完成后再启动下一批。
@@ -1,77 +0,0 @@
1
- # Semantic Ground Truth Schema
2
-
3
- 每个被评估的样本对应一个 JSON 文件,存放在 `semantic_gt/` 目录下。
4
-
5
- ## 文件命名
6
-
7
- `<sample_id>.json`,例如 `sample-0001.json`(bug-fix 样本)或 `clean-0001.json`(clean 样本)
8
-
9
- ## Schema
10
-
11
- ### 有 findings 的样本
12
-
13
- GT 生成器从 diff 中独立判断新引入代码存在问题时产出:
14
-
15
- ```json
16
- {
17
- "sample_id": "sample-0001",
18
- "findings": [
19
- {
20
- "file": "packages/webview/src/components/Chat.tsx",
21
- "line_range": [754, 765],
22
- "dimension": "correctness",
23
- "severity": "P1",
24
- "description": "新引入的 hasAcceptedPath 是模块级单值变量,多文件采纳时只有最后一个被保护",
25
- "root_cause": "变量被设计为单值字符串而非 Set,导致跨文件的采纳操作互相覆盖",
26
- "expected_review": "新增的 hasAcceptedPath 守卫仅保护单一路径,多文件场景下后续采纳会覆盖先前状态;应改为 Set 或使用 Map 追踪所有已采纳路径"
27
- }
28
- ]
29
- }
30
- ```
31
-
32
- ### 无 findings 的样本
33
-
34
- GT 生成器从 diff 中独立判断新引入代码无明显问题时产出:
35
-
36
- ```json
37
- {
38
- "sample_id": "clean-0001",
39
- "findings": []
40
- }
41
- ```
42
-
43
- **注意**:GT 生成器不知道样本的真实类型(bug-fix 或 clean)。因此:
44
- - bug-fix 样本的 GT **通常**有 findings(反转 diff 中新增的 `+` 行就是有 bug 的代码),但如果 bug 非常隐蔽、仅从 diff 看不出来,GT 也可能为空
45
- - clean 样本的 GT **通常**为空,但如果 GT 生成器从 diff 中发现了新引入代码的真实问题,也可能有 findings
46
-
47
- 这是信息对称设计的核心:GT 的质量反映的是"仅从 diff 能看出多少问题",和 skill 的评判条件完全一致。
48
-
49
- ## 字段说明
50
-
51
- ### 顶层字段
52
-
53
- | 字段 | 类型 | 必填 | 说明 |
54
- |------|------|------|------|
55
- | `sample_id` | string | 是 | 样本 ID,与 candidates.json 中的 id 一致 |
56
- | `findings` | array | 是 | findings 数组,有问题时至少一条,无问题时为空数组 `[]` |
57
-
58
- ### Finding 字段
59
-
60
- | 字段 | 类型 | 必填 | 说明 |
61
- |------|------|------|------|
62
- | `findings[].file` | string | 是 | 相对于仓库根目录的文件路径 |
63
- | `findings[].line_range` | [int, int] | 是 | 问题所在的代码区域 |
64
- | `findings[].dimension` | string | 是 | `correctness` / `reliability` / `style` / `reuse`,与主 skill 的四个审查维度对齐 |
65
- | `findings[].severity` | string | 是 | `P0` / `P1` / `P2` / `P3` |
66
- | `findings[].description` | string | 是 | 描述**新引入的代码**存在什么问题(diff 中 `+` 行的缺陷) |
67
- | `findings[].root_cause` | string | 是 | 为什么存在这个问题(深层原因) |
68
- | `findings[].expected_review` | string | 是 | 一个优秀 reviewer 看到这个 diff 时应该指出什么(判分关键锚点) |
69
-
70
- ## 核心原则
71
-
72
- - **描述新引入代码的问题**:`description` 说"新引入的代码什么地方有问题"(diff 中 `+` 行的缺陷)
73
- - **expected_review 是判分锚点**:它描述 reviewer 看到这个 diff 时应该说什么,和 skill 的输出最直接可比
74
- - **一个问题 = 一条 finding**:不要按 diff hunk 展开,按逻辑问题聚合
75
- - **severity 反映问题严重度**:不是修复的重要性
76
- - **信息对称**:GT 生成器和 code-review skill 只能看到 diff,不能利用 commit subject、样本类型等额外信息
77
- - **独立判断**:GT 生成器不知道样本是 bug-fix 还是 clean,必须完全依赖 diff 内容判断
@@ -1,141 +0,0 @@
1
- # 自定义规则模板
2
-
3
- > **使用说明**
4
- >
5
- > 1. 复制此文件,重命名为你的规则集名称(如 `MY_PROJECT_RULES.md`、`TEAM_API_RULES.md`)
6
- > 2. 按照下方格式填写规则内容
7
- > 3. 将文件放在同一目录(`custom-rules/`)下,审查时会自动加载
8
- > 4. 本文件(`RULE_TEMPLATE.md`)本身不会被加载为规则
9
-
10
- ---
11
-
12
- ## 文件头(必填)
13
-
14
- ```yaml
15
- # 规则集名称(必填)
16
- title: 我的项目规则
17
-
18
- # 规则集描述(选填)
19
- description: 针对 XX 项目的业务规范和技术约束
20
-
21
- # 适用语言(选填)。留空 = 适用所有语言
22
- # 可选值: js, ts, go, java, python,逗号分隔
23
- applies_to: js, ts
24
-
25
- # 适用路径(选填)。只扫描匹配路径下的文件,支持通配符
26
- # 留空 = 不限制路径
27
- applies_to_path: src/api/**, src/service/**
28
- ```
29
-
30
- ---
31
-
32
- ## 规则格式说明
33
-
34
- 每条规则包含以下字段:
35
-
36
- | 字段 | 必填 | 说明 |
37
- |------|------|------|
38
- | 规则 ID | 是 | 格式建议:`前缀_序号`,如 `PROJ_01` |
39
- | 规则名称 | 是 | 简短描述,建议 10 字以内 |
40
- | 等级标记 | 是 | `[Critical]` / `[high]` / `[middle]` / `[low]` |
41
- | `category` | 否 | 问题分类标识,用于输出的 category 字段;留空则为 `custom-rule` |
42
- | `检测` | 是 | 描述触发此规则的代码模式,越具体越好 |
43
- | `排除` | 推荐 | 满足哪些条件时不报告此问题 |
44
- | `复核` | 选填 | 上报前必须额外确认的条件,避免误报 |
45
- | 代码示例 | 推荐 | 反例(错误写法)和正例(正确写法) |
46
-
47
- ---
48
-
49
- ## 规则示例
50
-
51
- 以下是几条示范规则,覆盖不同等级和场景,请参照格式编写你自己的规则。
52
-
53
- ---
54
-
55
- ### EXAMPLE_01. 禁止直接操作 DOM 绑定事件 [high]
56
- - **category**: `framework-misuse`
57
- - **检测**:在 Vue/React 组件中使用 `document.addEventListener` 或 `element.addEventListener` 绑定事件,而非框架提供的事件机制
58
- - **排除**:第三方库初始化必须手动绑定;在 `componentWillUnmount` / `onUnmounted` 中已有对应的 `removeEventListener`
59
- - **复核**:确认组件卸载时未清理事件监听,会导致内存泄漏
60
-
61
- ```javascript
62
- // 反例 — 未清理的 DOM 事件
63
- mounted() {
64
- document.addEventListener('keydown', this.handleKey)
65
- // 忘记在 beforeUnmount 中移除
66
- }
67
-
68
- // 正例 — 使用框架事件机制
69
- // <template><div @keydown="handleKey"></div></template>
70
-
71
- // 正例 — 如必须手动绑定,记得清理
72
- mounted() { document.addEventListener('keydown', this.handleKey) }
73
- beforeUnmount() { document.removeEventListener('keydown', this.handleKey) }
74
- ```
75
-
76
- ---
77
-
78
- ### EXAMPLE_02. API 接口必须校验返回的分页参数 [middle]
79
- - **category**: `boundary-condition`
80
- - **检测**:调用分页接口后直接使用 `data.list` 进行渲染,未检查 `data.total` 或 `data.hasMore` 是否存在
81
- - **排除**:接口明确文档标注 `list` 永不为 null;接口已有统一的响应拦截器处理
82
-
83
- ```javascript
84
- // 反例
85
- const { list } = await fetchPagedData({ page: 1 })
86
- this.items = list // list 为 null 时直接崩溃
87
-
88
- // 正例
89
- const { list = [], total = 0 } = await fetchPagedData({ page: 1 })
90
- this.items = list
91
- this.total = total
92
- ```
93
-
94
- ---
95
-
96
- ### EXAMPLE_03. 禁止在生产代码中使用 console.log [low]
97
- - **category**: `code-style`
98
- - **检测**:非测试文件中出现 `console.log(` 调用
99
- - **排除**:文件路径包含 `test`、`spec`、`__tests__`;注释标注了 `// dev-only`;文件是独立的调试工具脚本
100
-
101
- ---
102
-
103
- ### EXAMPLE_04. 用户输入必须通过 sanitize 函数处理 [Critical]
104
- - **category**: `reliability`
105
- - **检测**:将 `req.body`、`req.query`、`req.params` 中的字段直接拼入 SQL 查询字符串,或直接赋值给 `innerHTML`
106
- - **排除**:已通过 ORM 参数化查询;已通过 `DOMPurify.sanitize()` 或同等函数处理
107
- - **复核**:确认数据来源是用户可控的外部输入;确认目标是 SQL 或 HTML 上下文
108
-
109
- ```javascript
110
- // 反例 — SQL 注入风险
111
- const sql = `SELECT * FROM users WHERE name = '${req.query.name}'`
112
-
113
- // 反例 — XSS 风险
114
- element.innerHTML = req.body.content
115
-
116
- // 正例
117
- const sql = 'SELECT * FROM users WHERE name = ?'
118
- db.query(sql, [req.query.name])
119
-
120
- // 正例
121
- element.innerHTML = DOMPurify.sanitize(req.body.content)
122
- ```
123
-
124
- ---
125
-
126
- ## 规则编写技巧
127
-
128
- **写好「检测」的关键**:
129
- - 描述具体的代码模式,而非抽象原则。"在 `if` 条件中使用 `=`" 比 "避免赋值运算符" 更好
130
- - 如果依赖上下文(如"在循环内"、"未 await"),明确说明上下文范围
131
- - 可以引用具体的函数名、API 名、字段名
132
-
133
- **写好「排除」的关键**:
134
- - 想清楚哪些情况下这个模式是合理的
135
- - 排除条件越明确,误报越少
136
-
137
- **等级选择参考**:
138
- - `[Critical]`:必报、Meta-Review 不得降级,用于安全漏洞、数据损坏等
139
- - `[high]`:高概率有实际影响的问题
140
- - `[middle]`:影响可维护性或稳定性,但不紧急
141
- - `[low]`:纯规范/偏好类,可忽略