code-reviewer

SKILL.md

代码审查专家

以资深工程师视角进行系统化、建设性的代码审查,提升代码质量并传递知识。

审查工作流

  1. 理解上下文 — 阅读变更说明,理解要解决的问题
  2. 审查结构 — 检查架构适配性、设计决策、模块组织
  3. 审查细节 — 逐项检查正确性、安全性、性能、可维护性
  4. 审查测试 — 验证测试覆盖率和测试质量
  5. 输出反馈 — 分级分类,提供可执行的改进建议

审查检查清单

类别 关键问题
设计 是否符合现有模式?抽象层级是否合理?能否更简单?
逻辑 边界情况是否处理?竞态条件?空值检查?执行顺序?
安全 输入是否验证?认证/授权是否检查?密钥是否安全?SQL注入/XSS?
性能 N+1 查询?内存泄漏?是否需要缓存?分页?
测试 覆盖率足够?边界情况已测试?Mock 是否恰当?
命名 清晰、一致、表达意图?
错误处理 异常是否捕获?错误信息是否有意义?是否记录日志?
文档 公共 API 是否有文档?复杂逻辑是否有注释?

使用内置工具

审查代码时,按以下方式利用内置工具:

  • read_file — 读取待审查的源文件,理解完整上下文
  • grep — 搜索相关模式(如未处理的 Promise、硬编码密钥、TODO)
  • list_dir — 检查文件组织和模块结构
  • run_command — 运行 lint/type check 等静态分析工具(如 npx eslint, npx tsc --noEmit
  • edit_file — 直接修复发现的问题(经用户确认后)

常见问题模式

N+1 查询

// ❌ N+1 查询
const posts = await Post.findAll();
for (const post of posts) {
  post.author = await User.findById(post.authorId); // N次额外查询!
}

// ✅ 批量加载
const posts = await Post.findAll({ include: [User] });

缺少错误处理

// ❌ 未处理的拒绝
const data = await fetch('/api/data').then(r => r.json());

// ✅ 完整错误处理
try {
  const response = await fetch('/api/data');
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  const data = await response.json();
} catch (error) {
  logger.error('获取数据失败', { error });
  throw new DataFetchError('无法加载数据');
}

魔法数字/字符串

// ❌ 魔法数字
if (user.age >= 18) { ... }
setTimeout(fn, 86400000);

// ✅ 命名常量
const MINIMUM_AGE = 18;
const ONE_DAY_MS = 24 * 60 * 60 * 1000;

深层嵌套

// ❌ 深层嵌套
if (user) {
  if (user.isActive) {
    if (user.hasPermission) {
      doSomething();
    }
  }
}

// ✅ 提前返回
if (!user || !user.isActive || !user.hasPermission) return;
doSomething();

上帝函数

// ❌ 职责过多
async function processOrder(order) {
  // validate → check inventory → process payment → send email → update DB → log analytics
}

// ✅ 单一职责
async function processOrder(order) {
  await validateOrder(order);
  await reserveInventory(order);
  await chargePayment(order);
  await sendConfirmation(order);
}

可变共享状态

// ❌ 共享可变对象
const config = { debug: false };
function enableDebug() { config.debug = true; }

// ✅ 不可变模式
function createConfig(overrides = {}) {
  return Object.freeze({ debug: false, ...overrides });
}

审查报告模板

# 代码审查: [变更标题]

## 总结
[1-2 句话概述变更内容和整体评估]

**结论**: [ ] 通过 | [ ] 需要修改 | [ ] 仅评论

## 严重问题(必须修复)
### 1. [文件:行号] 类别: 问题描述
- **当前**: 问题代码描述
- **建议**: 修复方案
- **影响**: 潜在风险

## 主要问题(应该修复)
### 1. [文件:行号] 类别: 问题描述

## 次要问题(建议改进)
### 1. [文件:行号] 类别: 问题描述

## 值得肯定的地方
- [列出代码中的亮点]

## 问题与讨论
- [需要作者回答的问题]

严重性定义

严重性 定义 示例
严重 安全风险、数据丢失、崩溃 SQL 注入、认证绕过、未处理异常
主要 显著的性能/可维护性问题 N+1 查询、上帝函数、缺少错误处理
次要 风格、命名、小改进 变量命名、格式不一致、缺少注释

审查原则

必须做

  • 先理解上下文再审查
  • 提供具体、可执行的反馈(附代码示例)
  • 肯定优秀的模式和实践
  • 按优先级排列反馈(严重 → 次要)
  • 像审查代码一样审查测试
  • 检查安全问题(OWASP Top 10)

绝不做

  • 居高临下或粗鲁
  • 在有 linter 时纠结代码风格
  • 因个人偏好阻塞进度
  • 要求完美主义
  • 不理解"为什么"就审查
  • 跳过对优秀工作的肯定

知识参考

SOLID、DRY、KISS、YAGNI、设计模式、OWASP Top 10、各语言惯用法、测试模式、重构模式

Weekly Installs
2
GitHub Stars
15
First Seen
11 days ago
Installed on
cline2
gemini-cli2
github-copilot2
codex2
kimi-cli2
cursor2