npx claudepluginhub taptap/claude-plugins-marketplaceThis skill uses the workspace's default tool permissions.
---
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Automates semantic versioning and release workflow for Claude Code plugins: bumps versions in package.json, marketplace.json, plugin.json; verifies builds; creates git tags, GitHub releases, changelogs.
本 Skill 为只读顾问 — 仅分析代码,不做任何修改。自动检测运行环境(Claude Code / Codex),选择最佳审查模式:Agent Team 双视角辩论(Claude Code)或串行双视角交叉验证(Codex)。支持项目自定义审查清单。
根据用户输入确定审查目标:
| 输入 | 动作 |
|---|---|
| MR/PR URL | → MR 审查流程 |
明确的本地变更 / --uncommitted | → 本地审查流程 |
Commit SHA / HEAD / HEAD~N | → 本地审查 |
| 分支名 | → 本地审查 |
| 无参数 | → 自动检测,见下方 |
| 模糊输入 | → 使用 AskUserQuestion 澄清,不猜测 |
git status --porcelaingit log --oneline -10
git branch --show-current
git log --oneline @{upstream}..HEAD 2>/dev/null # 未推送的提交
git log --oneline HEAD..@{upstream} 2>/dev/null # 远程领先的提交
# 检查当前分支是否有已开启的 MR/PR
# GitLab:
glab api "projects/{project_path_encoded}/merge_requests?source_branch=$(git branch --show-current)&state=opened" --repo {host}/{project_path} 2>/dev/null
# GitHub:
gh pr list --head "$(git branch --show-current)" --state open --json number,title,url 2>/dev/null
使用 AskUserQuestion 生成动态选项(最多 4 个),按相关性排序:
通过环境变量判断当前运行环境,选择审查模式:
| 环境变量 | 运行环境 | 审查模式 |
|---|---|---|
CLAUDECODE=1 | Claude Code | 模式 A:Agent Team(审查 + 辩论) |
其他(如 CODEX_CI=1) | Codex / 其他 AI 工具 | 模式 B:串行双视角审查 |
检测方式:在 shell 中检查 echo $CLAUDECODE,如果输出为 1 则走模式 A,否则走模式 B。
仅在 Claude Code 环境(
CLAUDECODE=1)下使用此模式。
此引擎同时用于 MR 审查流程和本地审查流程。
审查前先加载审查清单,支持项目自定义(与 CI 模板 .claude-reviewer 使用相同路径):
.claude/skills/code-reviewing/review-checklist.md.agents/skills/code-reviewing/review-checklist.md团队可在项目的
.claude/skills/code-reviewing/review-checklist.md(或.agents/skills/code-reviewing/review-checklist.md)放置自定义清单,格式需遵循## N. Title (SEVERITY)section header 规范(参考插件内置 checklist)。本地审查和 CI 审查共用同一份 checklist。
审查引擎支持项目专属规则(与通用 checklist 职责分离):
.claude/skills/code-reviewing/review-rules.md.agents/skills/code-reviewing/review-rules.md## 开头的规则 section → 将内容追加到 Agent Team 成员的 prompt审查时,Agent Team 成员需同时应用:
项目审查规则的 finding 在报告中混入对应严重级别 section(🚫/⚠️/💡),末尾标注
[项目规则: 规则名]以区分来源。检查清单表格新增"📋 项目规则"行(仅当存在实际规则时显示)。格式规范参见插件内置的 review-rules.md 模板注释。
Agent Team(审查 + 辩论,单阶段)
┌──────────────────────────────────────────────┐
│ Member 1: Claude Reviewer (opus) │
│ - 读取 diff + 源文件(有完整上下文) │
│ - 应用审查清单全部维度 │
│ - 产出发现列表 │
│ ◄─ SendMessage ─▶ │
│ Member 2: Codex Reviewer (opus) │
│ - 通过 Bash 运行 codex(无 sandbox) │
│ - 解析 Codex 输出 + 读源文件补充验证 │
│ - 如果 Codex 不可用 → 降级为独立 Claude 审查 │
│ │
│ 辩论:双方审查完成后互相分享发现,逐条质疑/验证 │
│ 达成共识 → TaskUpdate 标记结论 │
└──────────────────────┬───────────────────────┘
│
Lead 收集结论
→ 最终报告
合计:2 个 Opus agent team 成员 + 可选 Codex CLI 调用。 单阶段:每个成员自己审查 + 辩论,上下文天然完整。
同时启动 Member-1 和 Member-2(model="opus", run_in_background=true)。
关键:prompt 必须包含完整数据。Lead 在前序步骤中已收集的 diff 全文、checklist 全文、review-rules(如有)必须直接嵌入每个成员的 Agent prompt 参数中。不要只传摘要或引用 — 成员是独立 agent,无法访问 Lead 的上下文。
Member 1 — Claude Reviewer:
Agent prompt 必须按以下结构拼接({...} 处替换为实际内容,不可省略任何段):
你是 code review 专家(Claude Reviewer),在 code-review 团队中工作。
你是刚刚启动的新 agent,尚未执行任何审查。你必须从头开始分析下方的 diff。
## 你的任务
审查 {仓库名} 的{未提交变更/分支变更/MR变更},然后与 codex-reviewer 辩论达成共识。
## 审查阶段
1. 仔细分析下方提供的 diff,追踪完整调用链(使用 Read/Grep 工具读取源文件验证上下文)
2. 逐条应用下方审查清单的全部维度
3. 对每个发现输出:文件、行号、问题描述、严重级别(HIGH/MEDIUM/LOW)、所属维度
4. 深度分析:追踪完整调用链,不跳过可疑路径
5. 与下方的历史审查发现对比(如有)— 标记已修复/已忽略的问题
## 辩论阶段
6. 审查完成后,将你的发现列表通过 SendMessage 发给 codex-reviewer
7. 收到对方的发现后,逐条讨论,像科学辩论一样质疑/验证
- "调用方是否在更高层处理了这个 nil?"
- "我还发现了另一条有相同问题的调用路径"
8. 达成共识后用 TaskUpdate 标记结论
=== DIFF START ===
{Lead 收集的完整 diff 输出,即 git diff 的原始输出}
=== DIFF END ===
=== CHECKLIST START ===
{checklist 文件全文内容}
=== CHECKLIST END ===
=== PROJECT REVIEW RULES START ===
{review-rules 文件全文内容,如无则写"无项目审查规则"}
=== PROJECT REVIEW RULES END ===
=== PREVIOUS FINDINGS ===
{上次审查发现 + 忽略列表,如无则写"首次审查,无历史发现"}
=== PREVIOUS FINDINGS END ===
Member 2 — Codex Reviewer:
Agent prompt 必须按以下结构拼接:
你是 code review 专家(Codex Reviewer),在 code-review 团队中工作。你有 Codex CLI 作为额外工具。
你是刚刚启动的新 agent,尚未执行任何审查。你必须从头开始分析。
## 你的任务
审查 {仓库名} 的{未提交变更/分支变更/MR变更},然后与 claude-reviewer 辩论达成共识。
## 审查阶段
1. 通过 Bash 运行 codex review(timeout 设为 600000,即 10 分钟):
- 本地未提交变更:Bash(command: "codex review --uncommitted 2>&1", timeout: 600000)
- MR/分支审查:Bash(command: "codex review --base origin/{target_branch} 2>&1", timeout: 600000)
2. 解析 Codex 输出为发现列表
3. 自己也读源文件补充验证,不完全依赖 Codex 输出
4. 如果 codex 未安装或执行失败 → 降级为独立 Claude 审查(使用不同于对方的分析视角,重点关注边界条件和隐含假设)
5. 仍然参与辩论,不因 Codex 不可用而退出
## 辩论阶段
6. 审查完成后,将发现列表通过 SendMessage 发给 claude-reviewer
7. 收到对方的发现后,逐条讨论质疑/验证
8. 达成共识后用 TaskUpdate 标记结论
=== DIFF START ===
{Lead 收集的完整 diff 输出,即 git diff 的原始输出}
=== DIFF END ===
=== CHECKLIST START ===
{checklist 文件全文内容}
=== CHECKLIST END ===
=== PROJECT REVIEW RULES START ===
{review-rules 文件全文内容,如无则写"无项目审查规则"}
=== PROJECT REVIEW RULES END ===
两个成员通过 SendMessage 讨论每个发现:
在 Codex 或其他非 Claude Code 环境下使用此模式。无需 Agent Team。
参考 cross-validation 模式:先调用 Claude CLI 做第一轮审查,然后当前 agent 做第二轮审查,最后交叉验证两份结果。
通过 shell 调用 Claude CLI,获取 Claude 的独立审查结果:
# 未提交变更
claude -p "你是代码审查专家。审查以下 diff,逐条列出问题,格式:file:line | HIGH/MEDIUM/LOW | 问题描述。只输出问题列表,不要其他内容。
$(git diff)" --output-format text 2>&1
# 分支/MR 变更
claude -p "你是代码审查专家。审查以下 diff,逐条列出问题,格式:file:line | HIGH/MEDIUM/LOW | 问题描述。只输出问题列表,不要其他内容。
$(git diff origin/{target_branch}...HEAD)" --output-format text 2>&1
降级处理:如果 claude 未安装或执行失败(命令返回非 0),claude_findings 设为空列表,继续执行 B-Step 2。
独立分析同一份 diff(不参考 Claude 的结果),产出 agent_findings 列表:
file:line | HIGH/MEDIUM/LOW | 问题描述拿 claude_findings 和 agent_findings 做 file:line 匹配:
| 发现来源 | 标记 | 分类 |
|---|---|---|
| 双方在同一 file 同一区域都发现 | Claude+Codex | 🚫 Blocking(高置信度) |
| 仅 Claude 发现 | Claude | ⚠️ Warning(需人工确认) |
| 仅当前 agent 发现 | Codex | ⚠️ Warning(需人工确认) |
| 风格/文档类建议 | - | 💡 Suggestion |
"同一区域"判定:同一文件中行号差距 ≤ 5 行且问题描述语义相近。
如果 claude_findings 为空(Claude 未安装),所有发现标记为 Codex,全部归为 ⚠️ Warning。
复用审查评论模板格式输出。签名行根据 Claude 是否参与调整:
Powered by Codex + Claude CodePowered by Codex从 URL 提取 host、project_path、mr_iid。
GitLab: https://{host}/{namespace}/{project}/-/merge_requests/{iid}
GitHub: https://github.com/{owner}/{repo}/pull/{number}
对于自托管 GitLab(如 git.tapsvc.com),glab 不加 --repo 会默认指向 gitlab.com,导致 404。必须指定:
GitLab:
glab api projects/{project_path_encoded}/merge_requests/{mr_iid} --repo {host}/{project_path}
URL 编码 project_path:/ → %2F
GitHub:
gh pr view {number} --repo {owner}/{repo} --json number,title,body,author,headRefName,baseRefName,url,commits
提取:source_branch、target_branch、sha、title、author、web_url
审查在隔离的 worktree 中运行,避免干扰用户的工作目录。
repo_dir: ~/.cache/code-review/{host}/{project_path}
worktree_dir: ~/.cache/code-review/{host}/{project_path}/.worktrees/{YYYYMMDD}-{HHMMSS}-mr-{mr_iid}
cache_base=~/.cache/code-review
repo_dir="${cache_base}/{host}/{project_path}"
worktree_base="${cache_base}/{host}/{project_path}/.worktrees"
remote_url="git@{host}:{project_path}.git"
# 1. 复用本地已有仓库
local_origin=$(git remote get-url origin 2>/dev/null || true)
if [ -d "$repo_dir/.git" ]; then
# 缓存仓库已存在
cd "$repo_dir"
elif [ "$local_origin" = "$remote_url" ]; then
# 当前工作目录就是目标仓库
repo_dir="$(git rev-parse --show-toplevel)"
cd "$repo_dir"
else
# 全新克隆
mkdir -p "$(dirname "$repo_dir")"
git clone "$remote_url" "$repo_dir"
cd "$repo_dir"
fi
# 2. 精确 fetch 只需要的分支
git fetch origin \
"{source_branch}:refs/remotes/origin/{source_branch}" \
"{target_branch}:refs/remotes/origin/{target_branch}"
# 3. 创建 worktree
worktree_name="$(date +%Y%m%d-%H%M%S)-mr-{mr_iid}"
worktree_dir="${worktree_base}/${worktree_name}"
mkdir -p "$worktree_base"
git worktree add "$worktree_dir" "origin/{source_branch}" --detach
cd "$worktree_dir"
git diff "origin/${target_branch}...HEAD"
三点 ... 仅显示源分支相对于合并基点的变更,与 MR/PR UI 一致。
GitLab:
glab api projects/{project_id}/merge_requests/{mr_iid}/notes --repo {host}/{project_path}
GitHub:
gh api repos/{owner}/{repo}/issues/{number}/comments
查找以 ## Automated Code Review 开头的评论。记录 note_id/comment_id,提取上次审查的 commit SHA,收集已报告的问题。
从步骤 5 获取的审查评论之后的回复中,扫描忽略关键词:
忽略: [问题关键词] 或 忽略:[问题关键词]ignore: [keyword]匹配到的 issue 在步骤 7 中传递给 Claude Reviewer,标记为 已忽略。
已修复的问题不需要手动标记 — re-review 时自动对比代码变更:如果相关代码确实修改了 → 自动标记为 已修复。
运行审查引擎(根据环境检测选择模式 A 或模式 B),以 target_branch 为基准。
将之前的审查发现(步骤 5)和已忽略的问题(步骤 6)传递给 Claude Reviewer,以便在报告中标记已修复/已忽略的问题。
检测当前用户是否为 MR 作者:
# GitLab: 获取当前认证用户
current_user=$(glab api user --hostname={host} 2>/dev/null | python3 -c "import json,sys; print(json.load(sys.stdin).get('username',''))")
# GitHub:
current_user=$(gh api user --jq '.login')
| 条件 | 评论方式 | 自动批准 |
|---|---|---|
| 当前用户 == MR 作者(自己的 MR) | 发 comment | ❌ 不 approve |
| 当前用户 != MR 作者(别人的 MR) | 发 comment | ✅ 条件性 approve |
格式参见审查评论模板。
将评论写入唯一的临时文件,然后通过 API 发布。使用 -F(不是 -f)上传文件内容 — -f body="@file" 会发送字面字符串 @file 而不是文件内容。
发布策略判断:
从步骤 5 获取的 notes 列表中判断更新还是新建:
system=true 的 notes,得到用户评论列表note_idnote_id 匹配步骤 5 找到的)→ 原地更新> ⚠️ 此评论已过期,最新审查见下方。,原内容包裹在 <details><summary>历史审查记录</summary>...</details> 中GitLab:
comment_file="/tmp/review_comment_${mr_iid}_$(date +%s).md"
# 使用 Write tool 写入评论内容
if [ "$last_user_note_id" = "$existing_review_note_id" ]; then
# 审查评论仍是最后一条 → 原地更新
glab api projects/{project_id}/merge_requests/{mr_iid}/notes/{note_id} \
--repo {host}/{project_path} -X PUT -F body="@${comment_file}"
else
# 有新评论插入 → 折叠旧评论 + 创建新评论
if [ -n "$existing_review_note_id" ]; then
fold_file="/tmp/review_fold_${mr_iid}_$(date +%s).md"
# 使用 Write tool 写入折叠内容
glab api projects/{project_id}/merge_requests/{mr_iid}/notes/${existing_review_note_id} \
--repo {host}/{project_path} -X PUT -F body="@${fold_file}"
rm -f "$fold_file"
fi
glab api projects/{project_id}/merge_requests/{mr_iid}/notes \
--repo {host}/{project_path} -X POST -F body="@${comment_file}"
fi
rm -f "$comment_file"
GitHub:
comment_file="/tmp/review_comment_${number}_$(date +%s).md"
if [ "$last_user_comment_id" = "$existing_review_comment_id" ]; then
gh api repos/{owner}/{repo}/issues/comments/{comment_id} \
-X PATCH -F body="@${comment_file}"
else
if [ -n "$existing_review_comment_id" ]; then
fold_file="/tmp/review_fold_${number}_$(date +%s).md"
gh api repos/{owner}/{repo}/issues/comments/${existing_review_comment_id} \
-X PATCH -F body="@${fold_file}"
rm -f "$fold_file"
fi
gh pr comment {number} --repo {owner}/{repo} --body-file "$comment_file"
fi
rm -f "$comment_file"
如果讨论中有未解决的问题,进行回复。
前提:当前用户 != MR 作者(自己的 MR 不自动批准)。
条件:审查结果中无 HIGH 且无 MEDIUM 级别的 confirmed/uncertain finding。LOW 级别和建议不阻塞批准。
符合条件时执行批准:
GitLab:
glab api projects/{project_id}/merge_requests/{mr_iid}/approve --repo {host}/{project_path} -X POST
GitHub:
gh pr review {number} --repo {owner}/{repo} --approve
cd "$repo_dir"
git worktree remove "$worktree_dir" 2>/dev/null || true
在当前目录工作,无需 clone 或 worktree。
git diff --staged
git diff
git ls-files --others --exclude-standard
运行审查引擎(根据环境检测选择模式 A 或模式 B),以默认分支为基准。
Member 2 的 Codex CLI 使用 --uncommitted 替代 --base:
codex review --uncommitted 2>&1
不发布评论。直接使用相同的清单格式输出:
## Review Summary
**Scope**: [X files changed, Y insertions, Z deletions]
**Intent**: [Brief description]
### 检查清单
| 类别 | 状态 | 备注 |
|------|------|------|
| 安全性 | ✅/⚠️/❌ | ... |
| 逻辑正确性 | ✅/⚠️/❌ | ... |
| 资源管理 | ✅/⚠️/➖ | ... |
| API 与兼容性 | ✅/⚠️/➖ | ... |
| 代码质量 | ✅/⚠️ | ... |
### 🚫 阻塞问题 / ⚠️ 警告 / 💡 建议
...
### Conclusion
✅ LGTM. Ready for commit.
-- OR --
❌ Issues found. Please resolve blocking issues before committing.
当存在 confirmed 或 uncertain 的 finding 时,必须逐条让用户确认处理方式,禁止自动跳过。
仅当所有 finding 均为 dismissed 时才可直接输出 LGTM 结论。
确认流程:
对每个 confirmed 或 uncertain 的 finding,使用 AskUserQuestion 询问处理方式:
问题:"Finding #N:[简述问题] — 如何处理?"
选项:
- "忽略(已知风险)" — 确认知悉,不修复
- "后续 PR 处理" — 记录为待办,本次不修复
- "立即修复" — 中断流程,先修复再重新审查
处理规则:
结论格式(含用户决策):
### Conclusion
✅ LGTM(用户已确认所有非阻塞问题)
用户决策记录:
- Finding #1: [问题简述] → 后续 PR 处理
- Finding #2: [问题简述] → 忽略(已知风险)
优先保证审查评论的可见性。如果上次审查评论是最后一条非系统评论,则原地更新;否则创建新评论(旧评论折叠标注),确保审查结果在评论区底部可见。
## Automated Code Review
**概要**:[一句话总结变更内容]
### 检查清单
| 类别 | 状态 | 备注 |
|------|------|------|
| 安全性 | ✅/⚠️/❌ | [简述] |
| 逻辑正确性 | ✅/⚠️/❌ | [简述] |
| 资源管理 | ✅/⚠️/➖ | [简述] |
| API 与兼容性 | ✅/⚠️/➖ | [简述] |
| 代码质量 | ✅/⚠️ | [简述] |
| 📋 项目规则 | ✅/⚠️/❌ | [简述,仅当存在项目审查规则时显示此行] |
说明:✅ 通过 | ⚠️ 警告 | ❌ 未通过 | ➖ 不适用
### 🚫 阻塞问题
- `file.go:42` — 问题描述
### ⚠️ 警告
- `util.py:8` — 警告描述
### 💡 建议
- 建议描述
### ✅ 已修复(自上次评审)
- ~~`file.go:10` - 之前报告的问题~~ ✓ 已在 {new_sha_short} 修复
### ✅ 已忽略(应评审者请求)
- ~~`config.go:5` - 问题描述~~ → 由 @reviewer 忽略
---
**状态**:已批准 ✅ / 待处理(还有 X 个阻塞问题)
---
*Powered by Claude Code (Opus 4.6) + Codex CLI*
*回复 `忽略: [问题关键词]` 可标记为已忽略,re-review 时自动识别。已修复的问题会自动检测。*
注:如果 Codex 不可用(降级),签名行显示为
Powered by Claude Code (Opus 4.6)。
git add。.claude/skills/code-reviewing/review-checklist.md(或 .agents/skills/code-reviewing/review-checklist.md)放置自定义审查清单,格式遵循 ## N. Title (SEVERITY) 规范。本地和 CI 共用同一份。.claude/skills/code-reviewing/review-rules.md(或 .agents/skills/code-reviewing/review-rules.md)定义专属规则。规则按 scope 匹配变更文件,仅对匹配文件执行检查。空模板(仅 HTML 注释)不影响审查。本地和 CI 共用。