ClawSkills logoClawSkills

pr-reviewer

自动化的 GitHub PR 代码审查,包含差异分析、Lint 集成和结构化报告。在审查拉取请求、检查安全问题、

介绍

# PR Reviewer

GitHub 拉取请求的自动化代码审查。分析差异以发现安全问题、错误处理缺口、样式问题和测试覆盖率。

## 前置条件

- 已安装并经过身份验证的 `gh` CLI (`gh auth status`) - 仓库访问权限(至少为读取权限,发布评论需要写入权限) - 可选:`golangci-lint` 用于 Go 代码检查,`ruff` 用于 Python 代码检查

## 快速开始

```bash # Review all open PRs in current repo scripts/github/pr-reviewer.sh check

# Review a specific PR scripts/github/pr-reviewer.sh review 42

# Post review as GitHub comment scripts/github/pr-reviewer.sh post 42

# Check status of all open PRs scripts/github/pr-reviewer.sh status

# List unreviewed PRs (useful for heartbeat/cron integration) scripts/github/pr-reviewer.sh list-unreviewed ```

## 配置

设置这些环境变量,或者脚本会自动从当前的 git 仓库检测:

- `PR_REVIEW_REPO` — 格式为 `owner/repo` 的 GitHub 仓库(默认:从 `gh repo view` 检测) - `PR_REVIEW_DIR` — 用于代码检查的本地检出路径(默认:当前工作目录的 git 根目录) - `PR_REVIEW_STATE` — 状态文件路径(默认:`./data/pr-reviews.json`) - `PR_REVIEW_OUTDIR` — 报告输出目录(默认:`./data/pr-reviews/`)

## 写入目录

- **`PR_REVIEW_STATE`**(默认:`./data/pr-reviews.json`) — 跟踪已审查的 PR 及其 HEAD SHA - **`PR_REVIEW_OUTDIR`**(默认:`./data/pr-reviews/`) — Markdown 审查报告

## 检查内容

| 类别 | 图标 | 示例 | |----------|------|----------| | 安全 | 🔴 | 硬编码凭据、AWS 密钥、代码中的机密信息 | | 错误处理 | 🟡 | 丢弃的错误(Go `_ :=`)、裸 `except:`(Python)、未检查的 `Close()` | | 风险 | 🟠 | `panic()` 调用、`process.exit()` | | 样式 | 🔵 | 生产环境中的 `fmt.Print`/`print()`/`console.log`、非常长的行 | | 待办事项 | 📝 | TODO, FIXME, HACK, XXX 标记 | | 测试覆盖率 | 📊 | 源文件已更改但没有相应的测试更改 |

## 智能重新审查

跟踪每个 PR 的 HEAD SHA。仅当推送新提交时才重新审查。使用 `review <PR#>` 强制重新审查。

## 报告格式

报告以 markdown 文件形式保存在输出目录中。每份报告包括:

- PR 元数据(作者、分支、更改) - 提交列表 - 按语言/类型分类的更改文件 - 自动差异发现,包含文件、行、类别和上下文 - 测试覆盖率分析 - 本地代码检查结果(当仓库在本地检出时) - 总结裁定:🔴 安全问题 / 🟡 需要注意 / 🔵 次要备注 / ✅ 看起来不错

## 心跳/Cron 集成

添加到定期检查(心跳、cron 任务或 CI):

```bash UNREVIEWED=$(scripts/github/pr-reviewer.sh list-unreviewed) if [ -n "$UNREVIEWED" ]; then scripts/github/pr-reviewer.sh check fi ```

## 扩展

脚本中的分析模式按语言组织。通过在 `analyze_diff()` 函数中追加到相关的模式列表来添加新模式:

```python # Add a new Go pattern go_patterns.append((r'^\+.*os\.Exit\(', 'RISK', 'Direct os.Exit() — consider returning error')) ```

更多产品