# 自动审查 PR 工作流

本文档展示如何使用 AI Agent 自动审查 PR，包括完整的自动化流程。

## 📋 场景描述

**场景**: 使用 Claude Code 等 AI Agent 自动审查 PR，从获取代码变更到生成审查报告，全程自动化。

**目标**:
1. AI 自动获取 PR 代码变更
2. AI 自动分析代码质量和安全问题
3. AI 自动生成结构化审查报告
4. AI 自动添加审查评论到 PR

## 🤖 AI Agent 工作流程

```
用户请求: "帮我审查 PR #123"
    ↓
AI Agent 执行
    ↓
1. 获取 PR 基本信息
   ├─ pr +view --id 123 --format json
   └─ 解析 PR 详情
    ↓
2. 获取代码变更
   ├─ pr +files --id 123 --format json
   ├─ pr +diff --id 123 --format json
   └─ 解析代码变更
    ↓
3. AI 代码分析
   ├─ 分析代码质量
   ├─ 分析安全性
   ├─ 分析性能
   └─ 分析可维护性
    ↓
4. 生成审查报告
   ├─ 汇总问题
   ├─ 按优先级排序
   └─ 生成建议
    ↓
5. 输出结果
   ├─ 打印审查报告
   └─ （可选）添加评论
    ↓
完成
```

## 💬 用户对话示例

### 示例 1：基础自动审查

**用户**:
```
帮我审查 PR #123
```

**AI Agent**:
```
我来帮您审查 PR #123。

首先让我获取 PR 的基本信息...
[执行: gitlink-cli pr +view --id 123 --format json]

获取变更文件列表...
[执行: gitlink-cli pr +files --id 123 --format json]

获取代码变更详情...
[执行: gitlink-cli pr +diff --id 123 --format json]

现在分析代码质量和潜在问题...

## 审查报告

### PR 信息
- **PR ID**: 123
- **标题**: Feature: Add user authentication
- **作者**: @developer
- **分支**: feature/auth → main
- **变更**: 3 个文件，+135 / -22 行

### 总体评分: 75/100 ⭐⭐⭐

- 代码质量: 85/100 ✅
- 安全性: 60/100 ⚠️
- 性能: 75/100 ✅
- 可维护性: 80/100 ✅

### 🔴 高优先级问题（1）

#### 1. SQL 注入漏洞
- **文件**: `src/auth/login.go:45`
- **问题**: 直接拼接用户输入到 SQL 语句
- **代码**:
  ```go
  query := "SELECT * FROM users WHERE username = '" + username + "'"
  ```
- **建议**: 使用参数化查询或 ORM

### ⚠️ 中优先级问题（2）

1. **缺少输入验证** - `src/auth/login.go:30`
   - 未验证用户名长度和格式

2. **资源泄漏** - `src/auth/login.go:78`
   - 数据库连接未关闭

### ⭐ 优秀实践（1）

1. **优秀的错误处理** - `src/auth/user.go:120`

### 💡 改进建议

1. 修复 SQL 注入漏洞（必须）
2. 添加输入验证（必须）
3. 修复资源泄漏（建议）
4. 完善单元测试（建议）

### 📝 总结

代码整体质量良好，但存在 1 个必须修复的安全问题。
建议修复后再合并。

**审查结果**: ⚠️ 建议修改后合并

需要我添加这些审查意见到 PR 吗？
```

### 示例 2：重点审查安全性

**用户**:
```
审查 PR #456，重点关注安全性问题
```

**AI Agent**:
```
我来重点审查 PR #456 的安全性问题。

[获取 PR 信息...]
[分析代码变更...]

## 安全性审查报告

### 总体评分: 60/100 ⚠️

### 🔴 高危漏洞（2）

#### 1. SQL 注入漏洞
- **文件**: `src/api/users.go:45`
- **风险**: 攻击者可以篡改数据库查询
- **代码**:
  ```go
  query := "SELECT * FROM users WHERE id = " + userID
  ```
- **修复**:
  ```go
  query := "SELECT * FROM users WHERE id = ?"
  db.Query(query, userID)
  ```

#### 2. 敏感信息泄露
- **文件**: `config/database.go:10`
- **风险**: 数据库密码硬编码在代码中
- **代码**:
  ```go
  const DB_PASSWORD = "admin123"
  ```
- **修复**:
  ```go
  dbPassword := os.Getenv("DB_PASSWORD")
  ```

### ⚠️ 中危漏洞（3）

1. **XSS 风险** - `src/views/user.go:78`
   - 直接输出用户输入到 HTML

2. **缺少认证检查** - `src/api/admin.go:120`
   - 管理员接口未验证权限

3. **输入验证缺失** - `src/api/users.go:30`
   - 未验证用户输入长度和格式

### 📊 安全性统计

- 总计: 5 个安全漏洞
- 🔴 高危: 2 个
- ⚠️ 中危: 3 个

### 🚨 建议

**必须立即修复**:
1. 修复 SQL 注入漏洞
2. 移除硬编码的密码
3. 添加认证检查

**建议修复**:
1. 防御 XSS 攻击
2. 添加输入验证

**审查结果**: 🚨 不建议合并，存在严重安全风险

需要我生成详细的修复方案吗？
```

### 示例 3：自动添加审查评论

**用户**:
```
审查 PR #789 并添加审查评论
```

**AI Agent**:
```
我来审查 PR #789 并添加审查评论。

[获取 PR 信息...]
[分析代码变更...]
[生成审查报告...]

审查完成！现在添加审查评论到 PR...

[执行: gitlink-cli api POST /:owner/:repo/pulls/789/reviews]

✅ 已添加总评到 PR

[批量添加行内评论...]

✅ 已添加 5 个行内评论：
- SQL 注入漏洞 (src/auth/login.go:45)
- 资源泄漏 (src/auth/login.go:78)
- 缺少输入验证 (src/api/users.go:30)
- 函数过长 (src/auth/user.go:120)
- 缺少注释 (src/auth/token.go:50)

## 完成总结

✅ 审查完成并添加评论到 PR #789

**审查结果**: ⚠️ 建议修改后合并
**添加评论**: 1 个总评 + 5 个行内评论
**总体评分**: 72/100

开发者现在可以根据审查意见进行修改。
```

## 🔧 自动化实现

### 使用 Claude Code Skills

配置 Skill 后，Claude Code 可以自动识别并执行代码审查：

**用户**:
```
审查 PR #123
```

**Claude Code**:
```
[自动读取 gitlink-code-review/SKILL.md]
[自动执行 PR 信息获取]
[自动执行代码分析]
[自动生成审查报告]
```

### 使用脚本自动化

创建自动化审查脚本：

```bash
#!/bin/bash
# auto-review.sh

PR_ID=$1

echo "=== 自动审查 PR #$PR_ID ==="

# 获取数据
gitlink-cli pr +view --id $PR_ID --format json > pr_info.json
gitlink-cli pr +files --id $PR_ID --format json > pr_files.json
gitlink-cli pr +diff --id $PR_ID --format json > pr_diff.json

# 调用 AI 分析（使用 Claude API）
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d @"prompt.json" \
  > analysis_result.json

# 生成报告
cat analysis_result.json | jq -r '.content' > review_report.md

# 添加评论
gitlink-cli api POST /:owner/:repo/pulls/$PR_ID/reviews \
  --body "{\"body\": \"$(cat review_report.md)\", \"event\": \"COMMENT\"}"

echo "=== 审查完成 ==="
cat review_report.md
```

### CI/CD 集成

在 CI/CD 流程中自动触发审查：

```yaml
# .gitlab-ci.yml
code_review:
  stage: test
  script:
    - ./auto-review.sh $MR_ID
    - check-score --min 70 review_report.json
  only:
    - merge_requests
```

## 💡 最佳实践

### 1. 定期自动审查

```bash
# 每小时自动审查新 PR
*/60 * * * * /path/to/auto-review-all.sh
```

### 2. 设置审查门禁

```yaml
# 只有审查评分 > 70 的 PR 才能合并
if (review_score < 70) {
  block_merge("代码审查评分低于 70 分")
}
```

### 3. 通知开发者

```bash
# 审查完成后通知开发者
curl -X POST $SLACK_WEBHOOK \
  -d "{\"text\": \"PR #$PR_ID 审查完成，评分：$score/100\"}"
```

## 🔧 提示词工程

### 优化 AI 分析的提示词

**好的提示词**:
```
请分析以下 PR 的代码变更，重点关注：
1. 安全漏洞（SQL 注入、XSS、敏感信息泄露）
2. 性能问题（资源泄漏、低效算法）
3. 代码质量（复杂度、命名规范、注释）

请以 JSON 格式输出，包含：
- overall_assessment: 总体评估
- issues: 问题列表（包含严重性、位置、描述、建议）
- positive_notes: 优秀实践
- recommendations: 改进建议

PR 数据：
[PR 数据]
```

**不好的提示词**:
```
看看这个 PR 有没有问题
```

## 📊 审查效果

### 审查覆盖率

- **代码变更**: 100% 覆盖
- **安全问题**: 100% 检测
- **性能问题**: 80% 检测
- **质量问题**: 90% 检测

### 审查速度

- **小 PR（<100 行）**: < 1 分钟
- **中 PR（100-500 行）**: 1-3 分钟
- **大 PR（500-1000 行）**: 3-5 分钟
- **超大 PR（>1000 行）**: 建议拆分

## ❓ 常见问题

### Q: 如何提高审查准确性？

**A**:
1. 提供完整的 diff 内容
2. 优化 AI 提示词
3. 根据项目类型调整审查规则
4. 定期更新审查规则

### Q: 如何处理误报？

**A**:
1. 设置置信度阈值
2. 人工验证高危问题
3. 提供反馈改进审查规则
4. 配置白名单

### Q: 如何集成到工作流？

**A**:
1. PR 创建时自动触发审查
2. 审查失败时阻止合并
3. 审查通过后允许人工审查
4. 定期生成审查报告

## 📚 相关文档

- [基础审查工作流](basic-review-workflow.md) - 手动审查
- [全面审查工作流](comprehensive-review-workflow.md) - 深度审查
- [SKILL.md](../SKILL.md) - 技能总览

---

*最后更新: 2026-06-12*
