Find a file
ben7am1n 0c44f1049e
Some checks are pending
CI / test (push) Waiting to run
CI / windows (push) Waiting to run
CI / cross-compile (amd64, darwin) (push) Waiting to run
CI / cross-compile (amd64, windows) (push) Waiting to run
CI / cross-compile (arm64, darwin) (push) Waiting to run
CI / cross-compile (arm64, linux) (push) Waiting to run
CI / cross-compile (arm64, windows) (push) Waiting to run
CodeQL Advanced / Analyze (go) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
fix(diff): surface git's own message when a diff command fails (#1039)
* fix(diff): surface git's own message when a diff command fails

GetDiff runs git through runGit, which captures stdout and stderr together,
then discarded that output on every failure path. A user whose `git show`
failed saw only:

    Error: review failed: load diffs: get diffs: git show failed: exit status 129

The exit status alone cannot distinguish an unsupported option from a bad
revision or a permission problem, so diagnosing #972 meant asking the reporter
to re-run the command by hand to see what git actually said.

Quote git's output in the error for the three diff-producing paths (range,
commit, workspace-tracked). The same failure now reads:

    ... git show failed: exit status 129: error: unknown option `diff-merges=first-parent'

Output is capped, keeping the tail, because runGit's combined output means a
command that failed partway through carries a prefix of real diff along with
the diagnosis. The cap cuts on a rune boundary: git speaks the user's locale,
and #972 came from a Japanese-language Windows install, so a byte-wise cut
would replace a confusing error with an unreadable one.

The other runGit callers deliberately swallow errors and fall back, so they
are left alone.

* test(diff): pin which command speaks when both workspace diffs fail

Addresses review feedback on the two-stage fallback in workspaceTrackedDiff.
Reaching `git diff --staged` means `git diff HEAD` already failed, and in
the case the fallback exists for -- a repository with no commits -- it failed
with "bad revision 'HEAD'", which is expected rather than diagnostic.
Surfacing both would put that benign message ahead of the one describing what
actually blocked the review, so the behavior is deliberate and now has a test
saying so.

* fix(diff): quote stderr, not combined output, when git fails

Review feedback: a `git show` killed mid-write contributed a 2036-byte tail
made entirely of diff content, with no diagnosis anywhere in it. SIGKILL
leaves stderr empty, so keeping the tail kept repository source -- and
whatever that source contains.

That string does not stay local. reviewResultError hands it to
span.RecordError (review_cmd.go:259), and signal.NotifyContext (:99) puts
Ctrl-C on the path that reaches it, so the leak had a route to whatever
telemetry backend is configured. classifyItemError guards the run manifest
against raw error text for the same reason.

Add runGitSplit and give the three diff-producing callers stderr alone. Git
writes its diagnosis to stderr by construction, since die() writes there, so
this loses nothing a reader wants and cannot carry diff. Mirrors runGitGrep in
internal/tool/code_search.go, cancellation guard included: a signalled process
reports the signal rather than the reason, so a cancelled run now says
"context deadline exceeded" instead of "signal: killed" -- which also lets
classifyItemError reach its timeout class instead of the generic provider one.

The three failure modes this PR targets write to stderr, so their messages are
byte-identical and #972 still gets its diagnosis.

workspaceTrackedDiff returns stderr separately rather than overloading its
first return value, which also retires the dual-meaning the earlier review
flagged.

Also fix the regression test asserting "fatal:"/"error:", which git
translates: under zh_CN the line opens with a translated prefix, so it passed
only because CI runs in English. Anchor on the object name instead, the one
part no locale rewrites -- the same pairing isNotGitRepoError uses.

* docs(diff): correct the reasons recorded around gitFailure

Two comments described mechanisms that are not there.

The cancellation assertion in TestGetDiff_CancelledMidWriteReportsCancellation
credited classifyItemError with reading the error's type. It never sees it:
GetDiff is reached through loadDiffs, whose failure is recorded at agent.go:284
as a fixed SetRunFailure(RunFailureInput, "failed to resolve review input")
without inspecting err. classifyItemError has a single call site, agent.go:712,
for per-item subtask errors. Neither reviewResultError nor main.go branches on
the type either, so nothing downstream observes it today.

What the assertion actually holds is runGitSplit's cancellation guard: the leak
assertion above it passes either way, since quoting stderr alone keeps stdout
out of the error, so without this second assertion the guard could be removed
silently. Verified by dropping the guard -- only this assertion fails.

gitDiagLimit and gitFailure still justified themselves by runGit's combined
output, which no caller passes anymore. The ceiling and the keep-the-tail rule
both survive on stderr, but for a different reason: die() exits the process, so
the fatal is last, behind any warnings. Parameter renamed out -> stderr to match
what the three call sites pass.

No behavior change. make test, go vet, gofmt, english-only and coverage (94.0%)
all pass.

---------

Co-authored-by: kite <lizhengfeng.lzf@alibaba-inc.com>
2026-08-24 21:47:47 +08:00
.agents/plugins fix(plugin): separate client marketplace registrations (#908) 2026-08-16 19:49:49 +08:00
.claude/commands refactor(background): treat --background and --background-file as mutually exclusive with file precedence (#1016) 2026-08-20 18:03:28 +08:00
.claude-plugin fix(plugin): separate client marketplace registrations (#908) 2026-08-16 19:49:49 +08:00
.github chore(ci): change dependabot schedule from weekly to monthly (#998) 2026-08-18 21:52:48 +08:00
bin fix(updater): discard stale version hints (#720) 2026-08-17 22:35:46 +08:00
cmd/opencodereview feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
examples chore(examples): add explicit --audience agent to codeup_ci and action.yml (#1004) 2026-08-19 21:34:16 +08:00
extensions/vscode fix(vscode): list merge commit files (#1029) 2026-08-21 16:11:58 +08:00
imgs feat(benchmark): add Qwen3.8-Max results and show version inline per row (#726) 2026-08-05 12:52:15 +08:00
internal fix(diff): surface git's own message when a diff command fails (#1039) 2026-08-24 21:47:47 +08:00
npm fix: normalize repository.url with git+ prefix to suppress npm publish warnings 2026-06-23 20:29:45 +08:00
pages feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
plugins/open-code-review refactor(background): treat --background and --background-file as mutually exclusive with file precedence (#1016) 2026-08-20 18:03:28 +08:00
scripts fix(updater): discard stale version hints (#720) 2026-08-17 22:35:46 +08:00
skills refactor(background): treat --background and --background-file as mutually exclusive with file precedence (#1016) 2026-08-20 18:03:28 +08:00
.gitattributes fix(LE): normalize line endings via .gitattributes (#858) 2026-08-12 14:55:58 +08:00
.gitignore docs: add AGENTS.md and track CLAUDE.md for shared agent guidelines (#826) 2026-08-10 18:01:39 +08:00
.npmignore feat: add platform-specific npm packages to eliminate postinstall download 2026-06-17 14:17:03 +08:00
action.yml chore(examples): add explicit --audience agent to codeup_ci and action.yml (#1004) 2026-08-19 21:34:16 +08:00
AGENTS.md chore(ci): fail CI when unapproved non-English text appears in source files (#876) 2026-08-13 14:43:55 +08:00
ASSURANCE_CASE.md feat(viewer): add defense-in-depth security headers (#735) 2026-08-05 17:42:20 +08:00
CLAUDE.md docs: add AGENTS.md and track CLAUDE.md for shared agent guidelines (#826) 2026-08-10 18:01:39 +08:00
CODE_OF_CONDUCT.md docs: fix code of conduct reporting links (#968) 2026-08-17 11:45:20 +08:00
CONTRIBUTING.ja-JP.md chore: add SPDX license headers and automated verification (#740) 2026-08-05 21:26:27 +08:00
CONTRIBUTING.ko-KR.md chore: add SPDX license headers and automated verification (#740) 2026-08-05 21:26:27 +08:00
CONTRIBUTING.md fix(LE): normalize line endings via .gitattributes (#858) 2026-08-12 14:55:58 +08:00
CONTRIBUTING.ru-RU.md chore: add SPDX license headers and automated verification (#740) 2026-08-05 21:26:27 +08:00
CONTRIBUTING.zh-CN.md chore: add SPDX license headers and automated verification (#740) 2026-08-05 21:26:27 +08:00
go.mod feat(providers): add AWS Bedrock as a built-in provider with native SigV4 auth (#705) 2026-08-20 10:22:45 +08:00
go.sum feat(providers): add AWS Bedrock as a built-in provider with native SigV4 auth (#705) 2026-08-20 10:22:45 +08:00
GOVERNANCE.md docs: add GOVERNANCE.md, CODE_OF_CONDUCT.md and clean up SECURITY.md 2026-06-26 19:38:37 +08:00
install.ps1 feat(installation): support asset download via OCR_GITHUB_MIRROR (#893) 2026-08-19 09:45:32 +08:00
install.sh feat(installation): support asset download via OCR_GITHUB_MIRROR (#893) 2026-08-19 09:45:32 +08:00
LICENSE docs(license): update copyright holder to project contributors (#560) 2026-07-28 20:31:16 +08:00
Makefile chore(ci): fail CI when unapproved non-English text appears in source files (#876) 2026-08-13 14:43:55 +08:00
package.json fix(updater): discard stale version hints (#720) 2026-08-17 22:35:46 +08:00
README.ja-JP.md feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
README.ko-KR.md feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
README.md feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
README.ru-RU.md feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
README.zh-CN.md feat(cli): add --output flag to write review/scan results to a file (#852) 2026-08-24 15:37:29 +08:00
ROADMAP.md docs(roadmap): mark MCP as shipped and add delegate mode 2026-07-09 13:42:45 +08:00
SECURITY.md feat(ci): add Sigstore attestation for release artifacts 2026-06-26 22:18:03 +08:00

OpenCodeReview logo

OpenCodeReview

alibaba%2Fopen-code-review | Trendshift alibaba%2Fopen-code-review | Trendshift

npm Build status License Ask DeepWiki OpenSSF Best Practices

Windows macOS Linux Claude Code Codex Cursor

English | 简体中文 | 日本語 | 한국어 | Русский


What is Open Code Review?

Open Code Review is an AI-powered code review CLI tool. It originated as Alibaba Group's internal official AI code review assistant — over the past two years, it has served tens of thousands of developers and identified millions of code defects. After thorough validation at massive scale, we incubated it into an open source project for the community. Simply configure a model endpoint to get started.

It reads Git diffs, sends changed files to a configurable LLM via an agent with tool-use capabilities, and generates structured review comments with line-level precision. The agent can read full file contents, search the codebase, inspect other changed files for context, and produce deep reviews — not just surface-level diff feedback. Beyond diff review, ocr scan reviews entire files for auditing unfamiliar codebases or directories that have no meaningful diff.

Visit the official website for more details.

Highlights

Benchmark

Compared to general-purpose agents (Claude Code), Open Code Review achieves significantly higher Precision and F1 with the same underlying model, while consuming only ~1/9 of the tokens and completing reviews faster. Note that its Recall is lower than general-purpose agents — a deliberate trade-off favoring precision over noise.

A real-world code review benchmark built from 50 popular open-source repositories, 200 real Pull Requests, and 10 programming languages — cross-validated by 80+ senior engineers (1,505 annotated ground-truth issues).

Hugging Face Explore the AACR-Bench dataset on Hugging Face.

Metric What it measures Why it matters
F1 Harmonic mean of precision and recall Best single number for overall review quality
Precision Proportion of reported issues that are real defects Higher = fewer false alarms to triage
Recall Proportion of real defects that are found Higher = fewer issues slip through review
Avg Time Wall-clock time per review Matters for CI pipeline latency
Avg Token Total tokens consumed per review Directly impacts API cost

Benchmark

Why Open Code Review?

The Problem with General-Purpose Agents

If you've used general-purpose agents like Claude Code with Skills for code review, you've likely encountered these pain points:

  • Incomplete coverage — On larger changesets, agents tend to "cut corners," selectively reviewing only some files and missing others.
  • Position drift — Reported issues frequently don't match the actual code location, with line numbers or file references drifting off target.
  • Unstable quality — Natural-language-driven Skills are hard to debug, and review quality fluctuates significantly with minor prompt variations.

The root cause: a purely language-driven architecture lacks hard constraints on the review process.

Core Design: Deterministic Engineering × Agent Hybrid

Open Code Review's core philosophy is to combine deterministic engineering with an agent, each handling what it does best.

Deterministic Engineering — Hard Constraints

For review steps that must not go wrong, engineering logic — not the language model — guarantees correctness:

  • Precise file selection — Determines exactly which files need review and which should be filtered, ensuring no important change is missed.
  • Smart file bundling — Groups related files into a single review unit (e.g., message_en.properties and message_zh.properties are bundled together). Each bundle runs as a sub-agent with isolated context — a divide-and-conquer strategy that stays stable on very large changesets and naturally supports concurrent review.
  • Fine-grained rule matching — Matches review rules to each file's characteristics, keeping the model's attention sharply focused and eliminating information noise at the source. Compared to purely language-driven rule guidance, template-engine-based rule matching is more stable and predictable.
  • External positioning and reflection modules — Independent comment-positioning and comment-reflection modules systematically improve both the location accuracy and content accuracy of AI feedback.

Agent — Dynamic Decision-Making

The agent's strengths are concentrated where they matter most — dynamic decisions and dynamic context retrieval:

  • Scenario-tuned prompts — Prompt templates deeply optimized for code review, improving effectiveness while reducing token consumption.
  • Scenario-tuned toolset — Distilled from deep analysis of tool-call traces in large-scale production data — including call frequency distributions, per-tool repetition rates, and the impact of new tools on the overall call chain — resulting in a purpose-built toolset that is more stable and predictable for code review than a generic agent toolkit.

How to Use

Prerequisites

  • Git >= 2.41 — Open Code Review relies on Git for diff generation, code search, and repository operations.

CLI

Install

npm install -g @alibaba-group/open-code-review

After installation, the ocr command is available globally.

For other installation methods (install script, GitHub Release binary, from source), see Installation.

Quick Start

1. Configure LLM

You must configure an LLM before reviewing code, unless you use Delegation Mode.

ocr config provider          # Select a built-in provider or add a custom one
ocr config model             # Pick a model for the active provider

Provider setup

The interactive UI guides you through provider selection, API key entry, and model configuration, then automatically tests connectivity.

For CLI setup, environment variables, custom providers, and other advanced configuration, see Configuration.

2. Review

cd your-project

# Workspace mode — review all staged, unstaged, and untracked changes
ocr review

# Branch range — reviews feature-branch's changes since it diverged from main (merge-base mode)
ocr review --from main --to feature-branch

# Single commit
ocr review --commit abc123

# Resume an interrupted range or commit review
ocr session list
ocr review --from main --to feature-branch --resume <session-id>

# Full-file scan — review whole files instead of a diff (no git history needed)
ocr scan                          # scan the entire repository
ocr scan --path internal/agent    # scan a directory or specific files
ocr scan --resume <session-id>   # resume an interrupted full-file scan

# Save results to a file (recommended for AI host agents)
ocr review --format json --output result.json

# Delegation mode — let your AI coding agent perform the review itself
# OCR handles file selection and rule resolution; no LLM configuration needed
ocr delegate preview
ocr delegate rule src/main.go src/handler.go

Documentation

Full documentation lives at open-codereview.ai/docs:

  • Quickstart — install and run your first review
  • Installation — all platforms and package managers
  • CLI Reference — every command and flag
  • Review Rules — customize review rules with path filtering and targeting
  • Configuration — config keys and environment variables
  • MCP Server — extend the review agent with external tools
  • Coding Agent Integrations — choose the platform you use
    • Claude Code — install a plugin with review slash commands
    • Codex — install a plugin with callable review skills
    • Cursor — install a plugin with portable review skills
    • OpenCode — install native review tools and slash commands
    • QCA Forward — run delegation mode with the QCA host model and a ready-to-publish template
    • Skill-compatible agents — install the portable agent skill
  • Review Execution Modes — after integration, choose which LLM performs the review
  • CI/CD Integration — GitHub Actions, GitLab CI, GitFlic CI, and Gerrit integration
  • Session Viewer — browse and replay review sessions in browser
  • Telemetry — OpenTelemetry integration for observability
  • FAQ — common questions and troubleshooting

Contributing

This project exists thanks to all the people who contribute. See CONTRIBUTING.md for development setup, coding guidelines, and how to submit pull requests.

License

Apache-2.0 — Copyright 2026 Alibaba