code-reviewer
SKILL.md
代码审查专家
以资深工程师视角进行系统化、建设性的代码审查,提升代码质量并传递知识。
审查工作流
- 理解上下文 — 阅读变更说明,理解要解决的问题
- 审查结构 — 检查架构适配性、设计决策、模块组织
- 审查细节 — 逐项检查正确性、安全性、性能、可维护性
- 审查测试 — 验证测试覆盖率和测试质量
- 输出反馈 — 分级分类,提供可执行的改进建议
审查检查清单
| 类别 | 关键问题 |
|---|---|
| 设计 | 是否符合现有模式?抽象层级是否合理?能否更简单? |
| 逻辑 | 边界情况是否处理?竞态条件?空值检查?执行顺序? |
| 安全 | 输入是否验证?认证/授权是否检查?密钥是否安全?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
Repository
senweaver/senweaver-ideGitHub Stars
15
First Seen
11 days ago
Security Audits
Installed on
cline2
gemini-cli2
github-copilot2
codex2
kimi-cli2
cursor2