arinhub-code-reviewer
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCode Reviewer
代码审查工具
Orchestrate a comprehensive code review by running multiple review strategies in parallel, merging and deduplicating findings into a review file. Supports both remote PRs and local uncommitted changes.
通过并行运行多种审查策略来统筹全面的代码审查,将审查结果合并并去重后写入审查文件。支持远程PR和本地未提交的变更。
Input
输入
- PR number or URL (optional): Accepts ,
123, or full URL. If omitted, reviews local changes.#123
- PR编号或URL(可选):支持、
123或完整URL。如果省略,则审查本地变更。#123
Procedure
流程
1. Determine Review Target
1. 确定审查目标
- Remote PR: If the user provides a PR number or URL (e.g., "Review PR #123"), target that remote PR. Set .
MODE=remote - Local Changes: If no specific PR is mentioned, or if the user asks to "review my changes", target the current local file system changes (staged and unstaged). Set .
MODE=local
- 远程PR:如果用户提供了PR编号或URL(例如“Review PR #123”),则以该远程PR为审查目标。设置。
MODE=remote - 本地变更:如果未指定具体PR,或者用户要求“review my changes”,则以当前本地文件系统的变更(已暂存和未暂存)为审查目标。设置。
MODE=local
2. Resolve Identifier and Repository
2. 解析标识与仓库
If :
MODE=remoteExtract the PR number. Determine the repository name from git remote or the provided URL.
PR_NUMBER=<extracted number>
REPO_NAME=<repository name, e.g. "my-app">
REVIEW_FILE=~/.agents/arinhub/code-reviews/pr-code-review-${REPO_NAME}-${PR_NUMBER}.mdIf :
MODE=localDetermine the repository name from git remote. Use the current branch name for identification, sanitizing slashes to dashes so file paths remain valid.
REPO_NAME=<repository name>
BRANCH_NAME=$(git branch --show-current | tr '/' '-')
REVIEW_FILE=~/.agents/arinhub/code-reviews/local-code-review-${REPO_NAME}-${BRANCH_NAME}.mdCreate and directories if they do not exist.
~/.agents/arinhub/code-reviews/~/.agents/arinhub/diffs/若:
MODE=remote提取PR编号。从git远程仓库或提供的URL中确定仓库名称。
PR_NUMBER=<提取的编号>
REPO_NAME=<仓库名称,例如"my-app">
REVIEW_FILE=~/.agents/arinhub/code-reviews/pr-code-review-${REPO_NAME}-${PR_NUMBER}.md若:
MODE=local从git远程仓库确定仓库名称。使用当前分支名称作为标识,将斜杠替换为短横线以确保文件路径有效。
REPO_NAME=<仓库名称>
BRANCH_NAME=$(git branch --show-current | tr '/' '-')
REVIEW_FILE=~/.agents/arinhub/code-reviews/local-code-review-${REPO_NAME}-${BRANCH_NAME}.md如果和目录不存在,则创建它们。
~/.agents/arinhub/code-reviews/~/.agents/arinhub/diffs/3. Initialize Review File
3. 初始化审查文件
If :
MODE=remoteCreate the review file with a header:
markdown
undefined若:
MODE=remote创建带有头部信息的审查文件:
markdown
undefinedPR Review: ${REPO_NAME} #${PR_NUMBER}
PR审查:${REPO_NAME} #${PR_NUMBER}
Date: <current date>
PR: <PR URL>
日期: <当前日期>
PR: <PR URL>
Issues
问题
<!-- Issues from parallel review agents merged below. No duplicates. -->
**If `MODE=local`:**
Create the review file with a header:
```markdown<!-- 以下是并行审查Agent合并后的问题,无重复项。 -->
**若`MODE=local`:**
创建带有头部信息的审查文件:
```markdownLocal Review: ${REPO_NAME} (${BRANCH_NAME})
本地审查:${REPO_NAME} (${BRANCH_NAME})
Date: <current date>
Branch: ${BRANCH_NAME}
日期: <当前日期>
分支: ${BRANCH_NAME}
Issues
问题
<!-- Issues from parallel review agents merged below. No duplicates. -->
undefined<!-- 以下是并行审查Agent合并后的问题,无重复项。 -->
undefined4. Prepare Diff and Working Tree
4. 准备Diff与工作区
Save the diff to a shared file so subagents can read it. In remote mode, also check out the PR branch so tools that require a working tree (e.g., ) operate on the correct code.
react-doctorIf :
MODE=remotebash
DIFF_FILE=~/.agents/arinhub/diffs/pr-diff-${REPO_NAME}-${PR_NUMBER}.diff将Diff保存到共享文件中,以便子Agent读取。在远程模式下,还需检出PR分支,确保需要工作区的工具(如)能基于正确的代码运行。
react-doctor若:
MODE=remotebash
DIFF_FILE=~/.agents/arinhub/diffs/pr-diff-${REPO_NAME}-${PR_NUMBER}.diffSave the current branch so we can return to it after the review.
保存当前分支,以便审查完成后返回。
ORIGINAL_BRANCH=$(git branch --show-current)
ORIGINAL_BRANCH=$(git branch --show-current)
Stash any uncommitted local changes to prevent data loss during checkout.
暂存所有未提交的本地变更,防止检出PR时数据丢失。
git stash --include-untracked -m "arinhub-code-reviewer: auto-stash before PR checkout"
gh pr diff ${PR_NUMBER} > ${DIFF_FILE}
git stash --include-untracked -m "arinhub-code-reviewer: auto-stash before PR checkout"
gh pr diff ${PR_NUMBER} > ${DIFF_FILE}
Check out the PR branch to ensure the working tree reflects the PR code for subagents that require it (e.g., react-doctor).
检出PR分支,确保工作区与PR代码一致,供需要工作区的子Agent(如react-doctor)使用。
gh pr checkout ${PR_NUMBER}
**If `MODE=local`:**
```bash
DIFF_FILE=~/.agents/arinhub/diffs/local-diff-${REPO_NAME}-${BRANCH_NAME}.diff
git diff HEAD > "${DIFF_FILE}"No checkout is needed in local mode — the working tree already contains the changes.
gh pr checkout ${PR_NUMBER}
**若`MODE=local`:**
```bash
DIFF_FILE=~/.agents/arinhub/diffs/local-diff-${REPO_NAME}-${BRANCH_NAME}.diff
git diff HEAD > "${DIFF_FILE}"本地模式无需检出分支——工作区已包含变更内容。
5. Detect React Code
5. 检测React代码
Spawn a subagent to analyze and determine whether the changes contain React code. The subagent must read the diff file and return or .
${DIFF_FILE}HAS_REACT=trueHAS_REACT=falseSet if any of these conditions are found in the diff:
HAS_REACT=true- File extensions: Changed files include ,
.tsx, or paths under common React directories (e.g.,.jsx,components/,hooks/)pages/ - React core imports: ,
import ... from 'react',import ... from "react",require('react')require("react") - React DOM: ,
import ... from 'react-dom'import ... from 'react-dom/client' - JSX syntax: Diff hunks contain JSX elements (,
<Component,<div,/>)React.createElement - React hooks: Usage of ,
useState,useEffect,useRef,useMemo,useCallback,useContext,useReducer, or customuseLayoutEffecthooksuse* - React ecosystem packages: Imports from ,
react-router,react-hook-form,@tanstack/react-query,@tanstack/react-table,react-redux,zustand,jotai,recoil,next,@next/,styled-components, or similar React-centric libraries@emotion/
Otherwise set .
HAS_REACT=false启动一个子Agent来分析,判断变更中是否包含React代码。该子Agent必须读取Diff文件并返回或。
${DIFF_FILE}HAS_REACT=trueHAS_REACT=false如果Diff中存在以下任一条件,则设置:
HAS_REACT=true- 文件扩展名:变更文件包含、
.tsx,或位于常见React目录下(例如.jsx、components/、hooks/)pages/ - React核心导入:、
import ... from 'react'、import ... from "react"、require('react')require("react") - React DOM:、
import ... from 'react-dom'import ... from 'react-dom/client' - JSX语法:Diff块中包含JSX元素(、
<Component、<div、/>)React.createElement - React Hooks:使用了、
useState、useEffect、useRef、useMemo、useCallback、useContext、useReducer或自定义useLayoutEffecthooksuse* - React生态包:导入了、
react-router、react-hook-form、@tanstack/react-query、@tanstack/react-table、react-redux、zustand、jotai、recoil、next、@next/、styled-components或类似的React相关库@emotion/
否则设置。
HAS_REACT=false6. Launch Parallel Review Subagents
6. 启动并行审查子Agent
Spawn subagents in parallel (do not wait for one to finish before starting the next). Subagents A, B, and C must return ONLY a structured list of issues using the format from the Issue Format Reference section below. Subagent D (if launched) must return both a structured list of issues and the full diagnostic report (the report is appended separately in Step 9). No subagent may submit a review — they only return findings.
react-doctorPass the diff file path () to each subagent so they can read the diff directly. Inform each subagent that the working tree is already on the correct branch (PR branch in remote mode, current branch in local mode). No subagent should run or switch branches.
${DIFF_FILE}gh pr checkout- If : spawn four subagents (A, B, C, D).
HAS_REACT=true - If : spawn three subagents (A, B, C) — skip Subagent D.
HAS_REACT=false
并行启动子Agent(无需等待前一个完成再启动下一个)。子Agent A、B、C必须仅返回结构化的问题列表,格式参考下方的“问题格式参考”部分。子Agent D(若启动)必须同时返回结构化的问题列表和完整的诊断报告(报告将在步骤9中单独追加)。所有子Agent不得提交审查——仅返回审查结果。
react-doctor将Diff文件路径()传递给每个子Agent,以便它们直接读取Diff。告知每个子Agent工作区已处于正确分支(远程模式下为PR分支,本地模式下为当前分支)。禁止任何子Agent运行或切换分支。
${DIFF_FILE}gh pr checkout- 若:启动四个子Agent(A、B、C、D)。
HAS_REACT=true - 若:启动三个子Agent(A、B、C)——跳过子Agent D。
HAS_REACT=false
Subagent A: code-reviewer
子Agent A: code-reviewer
If : Spawn a subagent to review PR using the skill. Pass for diff context.
If : Spawn a subagent to review local changes using the skill. Pass for diff context.
MODE=remote${PR_NUMBER}code-reviewer${DIFF_FILE}MODE=localcode-reviewer${DIFF_FILE}Instruct it to return only the list of issues found — no review submission.
若: 启动一个子Agent,使用 skill审查PR 。传递作为Diff上下文。
若: 启动一个子Agent,使用 skill审查本地变更。传递作为Diff上下文。
MODE=remotecode-reviewer${PR_NUMBER}${DIFF_FILE}MODE=localcode-reviewer${DIFF_FILE}要求它仅返回发现的问题列表——不得提交审查。
Subagent B: octocode-roast
子Agent B: octocode-roast
Spawn a subagent to invoke the skill. Pass so it can read the diff directly.
octocode-roast${DIFF_FILE}If : Instruct it to review the diff in for PR .
If : Instruct it to review the diff in for local changes.
MODE=remote${DIFF_FILE}${PR_NUMBER}MODE=local${DIFF_FILE}Instruct it to return only the list of issues found — no review submission.
启动一个子Agent调用 skill。传递以便它直接读取Diff。
octocode-roast${DIFF_FILE}若: 要求它审查中PR 的Diff。
若: 要求它审查中的本地变更Diff。
MODE=remote${DIFF_FILE}${PR_NUMBER}MODE=local${DIFF_FILE}要求它仅返回发现的问题列表——不得提交审查。
Subagent C: pr-review-toolkit
子Agent C: pr-review-toolkit
If : Spawn a subagent to review PR using the command with mode. Pass for diff context.
If : Spawn a subagent to review local changes using the command with mode. Pass for diff context.
MODE=remote${PR_NUMBER}pr-review-toolkit:review-prall parallel${DIFF_FILE}MODE=localpr-review-toolkit:review-prall parallel${DIFF_FILE}Instruct it to return only the list of issues found — no review submission.
若: 启动一个子Agent,使用命令、以模式审查PR 。传递作为Diff上下文。
若: 启动一个子Agent,使用命令、以模式审查本地变更。传递作为Diff上下文。
MODE=remotepr-review-toolkit:review-prall parallel${PR_NUMBER}${DIFF_FILE}MODE=localpr-review-toolkit:review-prall parallel${DIFF_FILE}要求它仅返回发现的问题列表——不得提交审查。
Subagent D: react-doctor (only if HAS_REACT=true
)
HAS_REACT=true子Agent D: react-doctor(仅当HAS_REACT=true
时启动)
HAS_REACT=trueSpawn a subagent to run on the working tree. The tool runs via and requires the working tree to be on the correct branch (already ensured by Step 4).
react-doctornpx -y react-doctor@latest . --verbose --diffIf : Inform the subagent that the PR branch is already checked out. Instruct it to review the React code in the current working tree with diff context from .
If : Inform the subagent that the working tree already contains the local changes. Instruct it to review the React code in the current working tree with diff context from .
MODE=remote${DIFF_FILE}MODE=local${DIFF_FILE}Instruct it to diagnose React-specific issues (performance, hooks misuse, component anti-patterns, security) and return both the structured list of issues (using the Issue Format Reference) and the full diagnostic report. No review submission.
react-doctor启动一个子Agent在工作区运行。该工具通过运行,要求工作区处于正确分支(步骤4已确保)。
react-doctornpx -y react-doctor@latest . --verbose --diff若: 告知子Agent PR分支已检出。要求它结合的Diff上下文,审查当前工作区中的React代码。
若: 告知子Agent工作区已包含本地变更。要求它结合的Diff上下文,审查当前工作区中的React代码。
MODE=remote${DIFF_FILE}MODE=local${DIFF_FILE}要求它诊断React相关问题(性能、Hooks误用、组件反模式、安全),并返回结构化的问题列表(遵循问题格式参考)和完整的诊断报告。不得提交审查。
react-doctor7. Merge and Deduplicate Issues
7. 合并并去重问题
Collect issues from all subagents (three or four, depending on ) and deduplicate:
HAS_REACT- Parse each subagent's response into individual issues.
- For each issue, create a fingerprint from: +
file path+line number range.concern category - Two issues are duplicates if they share the same file, overlapping line ranges (within ±5 lines), and address the same concern (use semantic comparison, not exact string matching).
- When duplicates are found, keep the most detailed/actionable version.
- Tag each kept issue with its source(s): ,
[code-reviewer],[octocode-roast],[pr-review-toolkit], or combination if multiple agents found it.[react-doctor]
收集所有子Agent的问题(根据状态为3或4个)并去重:
HAS_REACT- 将每个子Agent的响应解析为单个问题。
- 为每个问题生成指纹:+
文件路径+ 问题类别。行号范围 - 如果两个问题的文件相同、行号范围重叠(±5行以内)且关注的问题相同(使用语义比较,而非精确字符串匹配),则视为重复。
- 发现重复问题时,保留最详细/可操作的版本。
- 为每个保留的问题标记来源:、
[code-reviewer]、[octocode-roast]、[pr-review-toolkit],若多个Agent发现同一问题则标记组合来源。[react-doctor]
8. Write Issues to Review File
8. 将问题写入审查文件
Append deduplicated issues to the review file, grouped by severity:
markdown
undefined按严重程度分组,将去重后的问题追加到审查文件中:
markdown
undefinedCritical
严重问题
-
[source]— Description of the issue.
path/to/file.ts:42ts// the problematic code from the PR diff const result = unsafeOperation(input);diff- const result = unsafeOperation(input); + const result = safeOperation(sanitize(input));
-
[来源]— 问题描述。
path/to/file.ts:42ts// PR Diff中的问题代码 const result = unsafeOperation(input);diff- const result = unsafeOperation(input); + const result = safeOperation(sanitize(input));
Improvements
优化建议
-
[source]— Description of the issue.
path/to/file.ts:88-95ts// the problematic code from the PR diff items.forEach((item) => { process(item); });diff- items.forEach(item => { - process(item); - }); + await Promise.all(items.map(item => process(item)));
-
[来源]— 问题描述。
path/to/file.ts:88-95ts// PR Diff中的问题代码 items.forEach((item) => { process(item); });diff- items.forEach(item => { - process(item); - }); + await Promise.all(items.map(item => process(item)));
Nitpicks
细节优化
-
[source]— Description of the issue.
path/to/file.ts:12ts// the relevant code snippet let x = getValue();
Total issues: N (X critical, Y improvements, Z nitpicks)
Sources: code-reviewer, octocode-roast, pr-review-toolkit[, react-doctor] (include react-doctor only if HAS_REACT=true)
undefined-
[来源]— 问题描述。
path/to/file.ts:12ts// 相关代码片段 let x = getValue();
总问题数: N(X个严重问题,Y个优化建议,Z个细节优化)
来源: code-reviewer, octocode-roast, pr-review-toolkit[, react-doctor](仅当HAS_REACT=true时包含react-doctor)
undefined9. React Health Report (only if HAS_REACT=true
)
HAS_REACT=true9. React健康报告(仅当HAS_REACT=true
时)
HAS_REACT=trueIf , append the full output from the subagent (Subagent D) to the review file under a dedicated section:
HAS_REACT=truereact-doctormarkdown
undefined若,将子Agent D(react-doctor)的完整输出追加到审查文件的专属章节中:
HAS_REACT=truemarkdown
undefinedReact Health
React健康状况
<full react-doctor report>
```
This section captures React-specific diagnostics (performance, hooks, component patterns, security) separately from the general deduplicated issues above.
If , skip this section entirely.
HAS_REACT=false<完整的react-doctor报告>
本章节单独记录React特定的诊断信息(性能、Hooks、组件模式、安全),与上方的通用去重问题区分开。
若`HAS_REACT=false`,则跳过本章节。10. Verify Requirements Coverage
10. 验证需求覆盖
Spawn a subagent to verify requirements coverage using the skill. Pass the diff file path () so the subagent can read the diff directly without fetching it again. The subagent must return the full requirements coverage report in markdown format.
arinhub-verify-requirements-coverage${DIFF_FILE}If : Pass PR and to the subagent. It will use the diff file for analysis and resolve the linked issue automatically.
MODE=remote${PR_NUMBER}${DIFF_FILE}If : Pass to the subagent. The subagent will attempt to extract the linked issue number from the branch name (e.g., , , ). If no issue can be determined, the subagent will skip coverage verification and report that no linked issue was found.
MODE=local${DIFF_FILE}feature/42-descriptionfix/42issue-42-descriptionAppend the returned coverage report to the end of the review file under a new section:
markdown
undefined启动一个子Agent,使用 skill验证需求覆盖。传递Diff文件路径(),以便子Agent直接读取Diff,无需再次获取。子Agent必须返回完整的Markdown格式需求覆盖报告。
arinhub-verify-requirements-coverage${DIFF_FILE}若: 传递PR 和给子Agent。它将使用Diff文件进行分析,并自动解析关联的需求。
MODE=remote${PR_NUMBER}${DIFF_FILE}若: 传递给子Agent。子Agent将尝试从分支名称中提取关联的需求编号(例如、、)。若无法确定需求,则子Agent将跳过覆盖验证,并报告未找到关联需求。
MODE=local${DIFF_FILE}feature/42-descriptionfix/42issue-42-description将返回的覆盖报告追加到审查文件的新章节中:
markdown
undefinedRequirements Coverage
需求覆盖
<coverage report content from arinhub-verify-requirements-coverage>
```
<来自arinhub-verify-requirements-coverage的覆盖报告内容>
undefined11. Submit PR Review (only if MODE=remote
)
MODE=remote11. 提交PR审查(仅当MODE=remote
时)
MODE=remoteSkip this step if .
MODE=localSpawn a subagent to submit the review for PR using the skill. Pass the review file path () so the subagent reads issues from it. The subagent must follow the procedure for deduplication against existing PR comments before submission.
${PR_NUMBER}arinhub-submit-code-review${REVIEW_FILE}arinhub-submit-code-review本地模式跳过此步骤。
启动一个子Agent,使用 skill提交PR 的审查。传递审查文件路径(),以便子Agent从中读取问题。子Agent必须遵循的流程,在提交前与现有PR评论去重。
arinhub-submit-code-review${PR_NUMBER}${REVIEW_FILE}arinhub-submit-code-review12. Restore Working Tree (only if MODE=remote
)
MODE=remote12. 恢复工作区(仅当MODE=remote
时)
MODE=remoteSkip this step if .
MODE=localReturn to the original branch and restore any stashed changes from Step 4:
bash
git checkout ${ORIGINAL_BRANCH}本地模式跳过此步骤。
返回原分支,并恢复步骤4中暂存的变更:
bash
git checkout ${ORIGINAL_BRANCH}Restore stashed changes if the stash was created in Step 4.
若步骤4中创建了暂存,则恢复暂存的变更。
git stash list | grep -q "arinhub-code-reviewer: auto-stash" && git stash pop
undefinedgit stash list | grep -q "arinhub-code-reviewer: auto-stash" && git stash pop
undefined13. Report to User
13. 向用户报告
If :
MODE=remotePresent a summary:
- Path to the review file
- Total issues found (by severity)
- PR coverage percentage
- Whether the review was submitted successfully
- The PR URL for reference
If :
MODE=localPresent the review file () content to the user and a summary:
${REVIEW_FILE}- Path to the review file
- Total issues found (by severity)
- Requirements coverage percentage (if available)
- Branch name and list of changed files reviewed
若:
MODE=remote展示摘要信息:
- 审查文件路径
- 发现的总问题数(按严重程度分类)
- PR需求覆盖百分比
- 审查是否提交成功
- 参考用的PR URL
若:
MODE=local向用户展示审查文件()的内容及摘要:
${REVIEW_FILE}- 审查文件路径
- 发现的总问题数(按严重程度分类)
- 需求覆盖百分比(若可用)
- 分支名称及已审查的变更文件列表
Issue Format Reference
问题格式参考
Each issue in a subagent response must follow this structure:
markdown
- **Severity:** critical | improvement | nitpick
**File:** path/to/file.ts
**Line(s):** 42 (or 42-50)
**Description:** Clear explanation of the problem.
**Code:**
```ts
// the problematic code from the PR diff
const result = unsafeOperation(input);
```
**Suggestion:**
```diff
- const result = unsafeOperation(input);
+ const result = safeOperation(sanitize(input));
```子Agent响应中的每个问题必须遵循以下结构:
markdown
- **Severity:** critical | improvement | nitpick
**File:** path/to/file.ts
**Line(s):** 42(或42-50)
**Description:** 清晰的问题说明。
**Code:**
```ts
// PR Diff中的问题代码
const result = unsafeOperation(input);
```
**Suggestion:**
```diff
- const result = unsafeOperation(input);
+ const result = safeOperation(sanitize(input));
```Important Notes
重要说明
- Review subagents run in parallel to minimize total review time (three or four, depending on whether the changes contain React code).
- The subagent is only launched when the diff contains
react-doctor/.tsxfiles or React imports. This avoids unnecessary React diagnostics on non-React changes..jsx - The review file is the single source of truth — all findings are merged there before submission.
- Deduplication uses semantic comparison: if two agents flag the same concern on the same code, only one entry is kept.
- The review file persists at for future reference and audit.
~/.agents/arinhub/code-reviews/ - If a subagent fails or times out, proceed with results from the remaining agents and note the failure in the review file.
- The diff file persists at and is shared read-only across all subagents. The PR branch checkout happens once in Step 4 before subagents launch — no subagent should run
~/.agents/arinhub/diffs/or switch branches on its own.gh pr checkout - In , step 11 (Submit PR Review) is skipped — the review is output only to the review file and presented to the user. Step 10 (Verify Requirements Coverage) runs if a linked issue can be determined from the branch name or user input.
MODE=local
- 审查子Agent并行运行以减少总审查时间(根据变更是否包含React代码,启动3或4个)。
- 仅当Diff中包含/
.tsx文件或React导入时,才会启动.jsx子Agent。避免对非React变更进行不必要的React诊断。react-doctor - 审查文件是唯一的可信来源——所有审查结果在提交前都会合并到该文件中。
- 去重采用语义比较:如果两个Agent标记了同一代码的同一问题,仅保留一条记录。
- 审查文件将保存在,供后续参考和审计。
~/.agents/arinhub/code-reviews/ - 若某个子Agent失败或超时,将继续使用其他Agent的结果,并在审查文件中记录失败情况。
- Diff文件保存在,所有子Agent均可只读访问。PR分支的检出仅在步骤4中进行一次,子Agent启动前完成——禁止任何子Agent自行运行
~/.agents/arinhub/diffs/或切换分支。gh pr checkout - 本地模式下,跳过步骤11(提交PR审查)——审查结果仅输出到审查文件并展示给用户。步骤10(验证需求覆盖)仅当能从分支名称或用户输入中确定关联需求时才会运行。