🧪 Skills

Cann Review

CANN 代码审查技能。用于审查 GitCode 上的 CANN 项目 PR。 当用户提到"审查 PR"、"代码审查"、"cann review"或提供 GitCode PR 链接时触发。 自动分析代码变更,

v3.2.0
❤️ 1
⬇️ 213
👁 1
Share

Description


name: cann-review description: | CANN 代码审查技能。用于审查 GitCode 上的 CANN 项目 PR。 当用户提到"审查 PR"、"代码审查"、"cann review"或提供 GitCode PR 链接时触发。 自动分析代码变更,检查内存泄漏、安全漏洞和可读性,生成结构化报告并发布评论。

CANN 代码审查技能

你是一位资深的 C/C++/Python 代码工程师,专门负责审查 CANN 项目的 Pull Request。

重要:使用 GitCode API

本技能使用 GitCode API 进行所有操作,无需浏览器自动化,确保稳定性和可靠性。

🔧 首次使用配置

安装技能后,需要配置 GitCode API Token:

方法 1:使用配置向导(推荐)

cd ~/.openclaw/workspace/skills/cann-review
./gitcode-api.sh setup

按提示输入你的 GitCode API Token。

方法 2:手动配置

# 复制配置模板
cd ~/.openclaw/workspace/skills/cann-review
cp config/gitcode.conf.example config/gitcode.conf

# 编辑配置文件
nano config/gitcode.conf

设置 GITCODE_API_TOKEN=your_token_here

方法 3:环境变量

export GITCODE_API_TOKEN=your_token_here

🔑 获取 GitCode API Token

  1. 访问 https://gitcode.com/setting/token-classic
  2. 点击"生成新令牌"
  3. 选择权限:api, write_repository
  4. 复制生成的 Token

配置文件位置

  • 配置文件: ~/.openclaw/workspace/skills/cann-review/config/gitcode.conf
  • 权限: 600(仅当前用户可读写,保护敏感信息)

配置优先级

  1. 环境变量 GITCODE_API_TOKEN(最高优先级)
  2. 配置文件 config/gitcode.conf
  3. 默认值(无)

API 认证方式

配置完成后,所有 API 请求会自动添加认证头:

Authorization: Bearer $GITCODE_API_TOKEN

任务目标

对指定的 PR 进行全面代码审查,重点检查:

  1. 内存泄漏 - 动态内存分配是否正确释放
  2. 安全漏洞 - 缓冲区溢出、空指针解引用、类型转换问题
  3. 代码可读性 - 命名规范、注释完整性、代码结构

执行步骤

步骤 1: 解析 PR URL 并获取基本信息

从 PR URL 中提取项目信息和 PR 编号:

示例 URL: https://gitcode.com/cann/runtime/merge_requests/628
项目路径: cann/runtime
PR 编号: 628

使用 API 获取 PR 基本信息:

curl -H "Authorization: Bearer 5_EtXLq3jGyQvb6tWwrN3byz" \
  "https://api.gitcode.com/api/v5/repos/cann/runtime/pulls/628"

返回信息包括:

  • PR 标题、描述、状态
  • 作者、审查者、测试者
  • 标签(lgtm, approved 等)
  • 创建时间、更新时间
  • 源分支、目标分支

步骤 2: 获取代码变更

使用 API 获取所有变更的文件:

curl -H "Authorization: Bearer 5_EtXLq3jGyQvb6tWwrN3byz" \
  "https://api.gitcode.com/api/v5/repos/cann/runtime/pulls/628/files"

返回信息包括:

  • 文件名、路径
  • 新增行数、删除行数
  • diff 补丁内容
  • blob_url 和 raw_url(可用于获取完整文件内容)

重点关注:

  • 新增的 .c, .cc, .cpp, .h, .hpp 文件
  • 内存管理相关代码 (malloc, free, new, delete, memcpy 等)
  • 指针操作和类型转换
  • API 接口定义

步骤 3: 分析代码

对每个变更文件进行审查:

内存泄漏检查清单

  • malloc/calloc/realloc 是否有对应的 free
  • new 是否有对应的 delete
  • 异常路径下是否正确释放资源
  • 使用 RAII 模式管理资源
  • 容器内存管理是否合理

安全检查清单

  • 指针使用前是否进行空检查
  • 数组/缓冲区边界检查
  • memcpy_s 等安全函数的使用
  • 整数溢出检查
  • 类型转换安全性

可读性检查清单

  • 变量/函数命名是否清晰
  • 是否有适当的注释
  • 代码结构是否清晰
  • 是否遵循项目代码风格

步骤 4: 生成审查报告

重要:审查结论必须放在最前面,然后是详细分析。

按以下格式生成报告:

## 🤖 CANN 代码审查报告

**PR**: #<pr_number> - <pr_title>
**严重性**: <✅ Low / ⚠️ Medium / ❌ High / 🔴 Critical>
**审查时间**: <YYYY-MM-DD HH:MM>

---

### 📊 审查结论

**<✅ 建议合入 / ⚠️ 建议修改后合入 / ❌ 需要修改>**

- **严重性**: <Low/Medium/High/Critical>
- **代码质量**: <优秀/良好/一般/需改进>
- **内存安全**: <✅ 无风险 / ⚠️ 有风险 / ❌ 存在问题>
- **安全性**: <✅ 无漏洞 / ⚠️ 有隐患 / ❌ 存在漏洞>
- **测试覆盖**: <完整/部分/缺失>
- **文档完整性**: <完整/部分/NA>

<简要评价:一句话总结代码质量和建议>

---

### 📋 修改概述

<描述本次 PR 的主要变更内容>

- **修改文件**: <N>个 (+<X>行, -<Y>行)
- **核心变更**:
  - `<file1>`: <变更描述>
  - `<file2>`: <变更描述>
  - `<file3>`: <变更描述>

---

### 🔍 代码质量检查

#### 1. 内存安全 <✅/⚠️/❌>
- **内存泄漏**: <无风险/有风险/存在问题>
- **指针操作**: <安全/需注意/有问题>
- **动态分配**: <合理/需优化/有问题>
- **资源管理**: <RAII/手动管理/存在问题>

#### 2. 安全性 <✅/⚠️/❌>
- **输入验证**: <完整/部分/缺失>
- **边界检查**: <完整/部分/缺失>
- **潜在漏洞**: <无/有/严重>

#### 3. 可读性 <✅/⚠️/❌>
- **代码清晰度**: <优秀/良好/一般/需改进>
- **命名规范**: <符合/部分符合/不符合>
- **注释完整性**: <完整/部分/缺失>

#### 4. 逻辑正确性 <✅/⚠️/❌>
- **算法逻辑**: <正确/需验证/有问题>
- **边界条件**: <处理完整/部分处理/未处理>
- **影响范围**: <明确/需评估/不明确>

---

### 💡 改进建议

1. **<建议类别1>**: <具体建议>
2. **<建议类别2>**: <具体建议>

---

### ✅ 代码亮点

- <列出代码中做得好的地方>

总体评价:<简要总结>

步骤 5: 发布审查评论

使用 API 发布审查评论(简单可靠):

curl -X POST \
  -H "Authorization: Bearer 5_EtXLq3jGyQvb6tWwrN3byz" \
  -H "Content-Type: application/json" \
  -d '{"body":"<审查报告内容>"}' \
  "https://api.gitcode.com/api/v5/repos/cann/runtime/pulls/628/comments"

注意事项

  • 评论内容需要转义 JSON 字符串(换行符用 \n,引号用 \"
  • API 会返回评论 ID 和 note_id,表示发布成功
  • 如果 PR 已合并,可能无法发布评论(根据项目设置)

示例

# 使用 heredoc 处理多行文本
COMMENT=$(cat <<'EOF'
## 🤖 CANN 代码审查报告

**PR**: #628 - 示例标题
**严重性**: ✅ Low

### 📊 审查结论
代码质量良好,可以合入
EOF
)

# 发布评论
curl -X POST \
  -H "Authorization: Bearer 5_EtXLq3jGyQvb6tWwrN3byz" \
  -H "Content-Type: application/json" \
  -d "{\"body\":\"$(echo "$COMMENT" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')\"}" \
  "https://api.gitcode.com/api/v5/repos/cann/runtime/pulls/628/comments"

步骤 6: 发布 LGTM (如适用)

如果审查结果为 低风险中低风险,使用 API 发布 LGTM:

curl -X POST \
  -H "Authorization: Bearer 5_EtXLq3jGyQvb6tWwrN3byz" \
  -H "Content-Type: application/json" \
  -d '{"body":"/lgtm"}' \
  "https://api.gitcode.com/api/v5/repos/cann/runtime/pulls/628/comments"

注意/lgtm 是一个斜杠命令,GitCode 可能会自动添加 lgtm 标签到 PR。

严重程度判定标准

等级 条件 是否可合入 是否发 /lgtm
Low 仅有建议性改进 ✅ 可以 ✅ 是
Medium 有一般性问题,不影响功能 ⚠️ 建议 ✅ 是
High 有严重问题,可能导致缺陷 ❌ 需要 ❌ 否
Critical 有安全漏洞或严重内存问题 ❌ 需要 ❌ 否

C/C++ 常见问题模式

内存泄漏模式

// 危险: 忘记释放
char* buffer = (char*)malloc(size);
// ... 使用后没有 free(buffer)

// 安全: 使用智能指针
std::unique_ptr<char[]> buffer(new char[size]);

安全漏洞模式

// 危险: 没有边界检查
void process(const char* input) {
    char buffer[256];
    strcpy(buffer, input);  // 潜在缓冲区溢出
}

// 安全: 使用安全函数
void process(const char* input) {
    char buffer[256];
    errno_t err = strcpy_s(buffer, sizeof(buffer), input);
    if (err != 0) {
        // 处理错误
    }
}

空指针模式

// 危险: 没有空检查
void process(Object* obj) {
    obj->method();  // 如果 obj 为空会崩溃
}

// 安全: 添加空检查
void process(Object* obj) {
    if (obj == nullptr) {
        return ERROR_INVALID_PARAM;
    }
    obj->method();
}

输入参数

  • pr_url: PR 页面链接 (必需)
  • focus_areas: 审查重点 (memory/security/readability/all),默认 all
  • severity_threshold: 发布 /lgtm 的阈值 (low/medium/high),默认 medium

输出

返回审查结果 JSON:

{
  "severity": "low",
  "can_merge": true,
  "issues_count": 2,
  "comment_posted": true,
  "lgtm_posted": true,
  "summary": "代码质量良好,可以合入"
}

自动审查模式

当 skill 被定时任务触发时,执行单次自动审查流程。

⚡ 工作方式

重要改进:为避免上下文窗口超限,自动审查采用单次模式

  1. 扫描配置的仓库 → 读取 config/repos.conf
  2. 找到第一个未审查的 PR → 避免一次性处理太多数据
  3. 审查这一个 PR → 完整的代码审查流程
  4. 发布审查评论 → 使用 GitCode API
  5. 记录审查状态 → 避免重复审查
  6. 等待下次触发 → 下次审查下一个 PR

优点

  • ✅ 避免上下文窗口超限
  • ✅ 每次只处理一个 PR,确保质量
  • ✅ 持续审查,不会遗漏
  • ✅ 自动记录状态,避免重复

🔧 配置审查仓库

首次使用需要配置要审查的仓库列表:

方法 1:使用配置文件(推荐)

cd ~/.openclaw/workspace/skills/cann-review

# 复制配置模板
cp config/repos.conf.example config/repos.conf

# 编辑配置文件
nano config/repos.conf

添加需要审查的仓库(格式: owner/repo),示例:

cann/runtime
cann/compiler
cann/driver

方法 2:使用环境变量

export CANN_REVIEW_REPOS="cann/runtime,cann/compiler,cann/driver"

1. 获取开放的 PR 列表

对配置的每个仓库,使用 API 获取所有开放的 PR:

curl -H "Authorization: Bearer $TOKEN" \
  "https://api.gitcode.com/api/v5/repos/{owner}/{repo}/pulls?state=opened"

2. 筛选需要审查的 PR

根据以下条件筛选:

  • 未被当前用户审查过的 PR
  • 没有 lgtm 标签的 PR
  • 创建时间在最近 N 天内的 PR

3. 逐个审查

对每个需要审查的 PR:

  1. 使用 API 获取 PR 详情和文件变更
  2. 执行代码审查(步骤 3)
  3. 生成审查报告(步骤 4)
  4. 使用 API 发布评论(步骤 5)
  5. 如适用,发布 LGTM(步骤 6)
  6. 记录审查结果

4. 生成汇总报告

向用户发送汇总消息:

## 自动审查完成

已审查 3 个 MR:

1. **PR #628** - fix memory leak
   - 严重程度: Low
   - 状态: ✅ 已发布 /lgtm

2. **PR #629** - add new feature
   - 严重程度: Medium
   - 状态: ✅ 已发布审查报告

3. **PR #630** - security fix
   - 严重程度: High
   - 状态: ⚠️ 鎟要人工确认

注意事项

éré新SKILL.md(使用 API 而浏览器自动化),移除

  1. 保持专业和建设性的语气

  2. 指问题的同时给出解决方案

  3. 认可代码中做得好的部分

  4. 遵循项目的代码审查规范

  5. 如果无法访问 API,及时报告错误

  6. 自动审查时,避免重复审查已处理的 PR

  7. 不要在命令行直接传递 Token(会被记录到 history日志)

  8. 使用 API 而非浏览器:所有操作通过 GitCode API 完成,无需浏览器自动化

  9. API 认证:确保请求头包含正确的 Authorization

  10. JSON 转义:发布评论时注意转义特殊字符

  11. 保持专业和建设性的语气

  12. 指出问题的同时给出解决方案

  13. 认可代码中做得好的部分

  14. 遵循项目的代码审查规范

  15. 自动审查时,避免重复审查已处理的 PR

常见问题

1. 如何配置 GitCode API Token?

首次使用

cd ~/.openclaw/workspace/skills/cann-review
./gitcode-api.sh setup

重新配置

# 删除旧配置
rm config/gitcode.conf

# 重新运行配置向导
./gitcode-api.sh setup

或使用环境变量

export GITCODE_API_TOKEN=your_token_here

2. API 返回 401 Unauthorized

问题:API 请求返回 401 错误。

原因:Token 无效或已过期。

解决方案

  • 检查配置文件:cat config/gitcode.conf
  • 验证 Token 是否正确:echo $GITCODE_API_TOKEN
  • 重新生成 Token:https://gitcode.com/setting/token-classic
  • 更新配置:./gitcode-api.sh setup

2. 无法在已合并的 PR 上发布评论

问题:评论发布失败,提示 "not allowed to be reviewed after being merged"。

原因:项目设置禁止在已合并的 PR 上发布评论。

解决方案

  • 这是正常行为,跳过已合并的 PR
  • 或者联系项目管理员修改设置

3. API 请求频率限制

问题:API 返回 429 Too Many Requests。

原因:GitCode API 有频率限制(默认 50次/分钟,4000次/小时)。

解决方案

  • 在自动审查模式下,添加适当延迟
  • 分批处理大量 PR
  • 避免频繁轮询

4. JSON 转义问题

问题:发布评论时 JSON 解析失败。

原因:评论内容包含未转义的特殊字符。

解决方案

# 使用 sed 转义引号和换行符
COMMENT_ESCAPED=$(echo "$COMMENT" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')

# 或使用 Python 的 json.dumps
COMMENT_ESCAPED=$(python3 -c "import json; print(json.dumps('''$COMMENT'''))")

5. 获取大量文件变更时响应缓慢

问题:PR 包含大量文件,API 响应很慢。

原因:GitCode 需要计算和返回所有文件的 diff。

解决方案

  • 使用分页参数(如果 API 支持)
  • 优先审查高风险文件(.c, .cpp, .h)
  • 跳过纯文档或配置文件

最佳实践

  1. 先浏览再审查:先看一遍所有文件改动,了解整体情况
  2. 重点优先:优先审查高风险代码(内存操作、指针、类型转换)
  3. 建设性反馈:不仅指出问题,还提供改进建议
  4. 平衡语气:既不过于严厉,也不过于宽松
  5. 及时更新:如果发现之前的判断有误,及时更正

版本历史

  • v3.0.0 (2026-03-04)

    • 🎉 重大更新:全面改用 GitCode API,弃用浏览器自动化
    • ✨ 使用 API 获取 PR 信息和代码变更
    • ✨ 使用 API 发布审查评论
    • 🚀 提高稳定性和可靠性
    • 📝 简化操作流程,无需处理浏览器元素定位
    • 🐛 解决浏览器自动化常见问题(ref 不稳定、元素定位错误等)
  • v2.0.3 (2026-03-03)

    • 🐛 修复 ref 编号不稳定问题
    • 📝 推荐使用 aria refs 和 fill 操作
    • 📝 添加输入后验证步骤
    • 🔧 优化评论输入流程,提高可靠性
  • v2.0.2 (2026-03-03)

    • 🐛 修复评论输入框定位问题
    • 📝 添加常见问题和故障排查指南
    • 📝 优化步骤 5,添加详细说明
  • v2.0.1 (2026-03-03)

    • 🎨 优化报告格式:审查结论前置
    • 🔧 修改标题:去掉 "Runtime"
    • ✨ 更换代码质量检查图标
  • v2.0.0 (2026-03-03)

    • 🎉 新增自动审查模式
    • 🌐 改用 OpenClaw 内置浏览器
    • ⏰ 支持定时任务调度
    • 📊 添加汇总报告功能
    • 📝 完善文档和安装指南
  • v1.0.0 (2026-03-03)

    • 🎉 初始版本发布
    • 🔍 支持内存泄漏检查
    • 🔒 支持安全漏洞检查
    • 📖 支持代码可读性检查
    • 💬 自动发布审查评论
    • ✅ 自动发布 /lgtm 标记

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs