Überspringen und zum Inhalt gehen →

OpenCodeReview (OCR)

OpenCodeReview (kurz OCR, CLI-Befehl ocr) ist ein Open-Source-Kommandozeilenwerkzeug, das mit Hilfe eines LLM (z. B. Claude, GPT, DeepSeek, lokale Modelle über Ollama, llama.cpp, …) automatisierte Code-Reviews auf Git-Diffs durchführt. OCR übernimmt die Dateiauswahl, Regelauflösung, Ausschlusslogik, Diff-Verarbeitung und delegiert die eigentliche inhaltliche Bewertung an ein LLM, das über ein Set von Tools (file_readcode_searchcode_comment, …) mit dem Code interagiert.

Das Projekt steht unter der Apache-2.0-Lizenz und wird von Alibaba gepflegt: https://github.com/alibaba/open-code-review.

Überblick & Grundkonzept

OCR liest einen Git-Diff (Arbeitsverzeichnis, ein einzelner Commit oder ein Branch-Vergleich), filtert die betroffenen Dateien nach konfigurierbaren Regeln, und startet für jede relevante Datei einen eigenen LLM-Sub-Agenten. Dieser Agent darf Werkzeuge aufrufen, um sich Kontext zu verschaffen (Diff anderer Dateien lesen, im Repo suchen, Datei-Inhalte lesen), und gibt am Ende strukturierte Review-Kommentare über das Tool code_comment aus.

Zentrale Eigenschaften:

  • Pro Datei ein eigener Kontext.
    Es gibt kein Cross-File-Reasoning im eigentlichen Sinn. Jede Datei wird in ihrer eigenen LLM-Konversation bewertet. Kontext aus anderen Dateien dient nur dem Verständnis, nie als Kommentarziel.
  • LLM-agnostisch.
    Anthropic- und OpenAI-kompatible Endpunkte werden nativ unterstützt, ebenso lokale Modelle über Ollama oder beliebige OpenAI-kompatible Gateways.
  • Deterministische Dateifilterung.
    Ein Filter entscheidet nachvollziehbar, welche Dateien überhaupt zum LLM geschickt werden.
  • Layered Regelsystem.
    Vier Prioritätsebenen (CLI-Flag → Projekt → global → eingebauter Systemstandard) bestimmen, worauf sich der Reviewer pro Dateityp konzentriert.
  • Vollständig lokal & nachvollziehbar.
    Jede Review-Session wird als JSONL-Transkript unter ~/.opencodereview/sessions/ gespeichert und kann im integrierten Web-Viewer inspiziert werden.
  • Delegationsfähig.
    Statt eines eigenen LLM-Zugangs kann OCR auch nur als „Scaffolding“ dienen und die eigentliche Review-Logik an einen Host-Agenten (z. B. Claude Code) abgeben (Delegation Mode).

Installation

Es gibt sechs unterstützte Installationswege.

NPM (empfohlen)

npm install -g @alibaba-group/open-code-review
https://www.npmjs.com/package/@alibaba-group/open-code-review

Bestimmte Version anheften: Aktuell „Verison 1.11.5“

npm install -g @alibaba-group/open-code-review@<version>

Automatische Updates.
Bei NPM-Installation hält sich ocr standardmäßig selbst aktuell bei jedem Aufruf prüft der Wrapper im Hintergrund die Registry (Cooldown: 18 Minuten, einstellbar über OCR_UPDATE_INTERVAL) und aktualisiert bei Bedarf automatisch, ohne den laufenden Review zu beeinträchtigen.

Automatische Updates deaktivieren mit:

export OCR_NO_UPDATE=1

Deinstallieren:

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

Homebrew (macOS / Linux)

brew install open-code-review
# Upgrade:
brew upgrade open-code-review

MacPorts (macOS)

sudo port install open-code-review
# Upgrade:
sudo port upgrade open-code-review

Installationsskript (curl | sh)

Praktisch für CI-Basisimages und Server ohne Node.js lädt direkt das statische GitHub-Release-Binary inklusive Prüfsummenverifikation:

curl -fsSL https://open-codereview.ai/install.sh | sh
VariableStandardZweck
OCR_INSTALL_DIR/usr/local/binZielort für die ocr-Binärdatei
OCR_VERSIONneuestes ReleaseFeste Version anheften (z. B. v1.9.3)

Unter Windows (PowerShell 5.1+):

irm https://open-codereview.ai/install.ps1 | iex

(analoge Variablen $env:OCR_INSTALL_DIR / $env:OCR_VERSION, Standardpfad %LOCALAPPDATA%\Programs\ocr).

GitHub-Release-Binary direkt

# macOS (Apple Silicon)
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-arm64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr

# Linux x86_64
curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-amd64
chmod +x ocr && sudo mv ocr /usr/local/bin/ocr

(analog für darwin-amd64linux-arm64windows-amd64.exewindows-arm64.exe).

Aus dem Quellcode bauen

Voraussetzungen: Go ≥ 1.25GitMake.

git clone https://github.com/alibaba/open-code-review.git
cd open-code-review
make build              # schreibt dist/opencodereview
sudo cp dist/opencodereview /usr/local/bin/ocr

Für andere Plattformen: make build-linux-amd64make build-linux-arm64make build-darwin-amd64make build-darwin-arm64make build-windows-amd64make build-windows-arm64, oder make build-all für alle sechs auf einmal. Mit make sha256sum wird zusätzlich eine sha256sum.txt erzeugt. Tests laufen über make test (LC_ALL=C go test -v -race -count=1 ./...).

Installation prüfen

ocr version
ocr --help
ocr review --help

Bei „command not found“: which ocr und $PATH prüfen.

Wo OCR seinen Zustand speichert

PfadInhalt
~/.opencodereview/config.jsonLLM-Endpunkt, Sprache, Telemetrie-Konfiguration
~/.opencodereview/rule.jsonOptionale globale Review-Regeln
~/.opencodereview/sessions/<encoded-repo-path>/<session-id>.jsonlJSONL-Transkript jeder Review-Session (für ocr viewer)
~/.opencodereview/{last-update-check,update.lock,update-available}Zustand der NPM-Wrapper-Updateprüfung
<repo>/.opencodereview/rule.jsonOptionale projektspezifische Regeln (commit-fähig)

OCR schreibt außer dem NPM-Binary-Download nichts außerhalb von ~/.opencodereview/. Das Verzeichnis löschen genügt für eine saubere Deinstallation.

Schnellstart (QuickStart)

Voraussetzungen: Git ≥ 2.41, Node.js ≥ 18, ein LLM-API-Schlüssel (nicht nötig bei Delegation Mode).

Schritt 1 — CLI installieren

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

added 2 packages in 19s
$> ocr version

open-code-review v1.9.3 (c35ddd722) windows/amd64
built at: 2026-08-14T03:35:43Z
https://github.com/alibaba/open-code-review

Schritt 2 — LLM konfigurieren

Bei Nutzung von Delegation Mode (z. B. innerhalb von Claude Code) liefert der Host-Agent das Modell — dieser Schritt entfällt dann.

Interaktiv:

ocr config provider

Führt durch die Auswahl eines eingebauten oder benutzerdefinierten Providers, API-Schlüssel-Eingabe, Modellwahl, speichert alles und testet die Verbindung mit ocr llm test. Modell später wechseln:

ocr config model

Nicht-interaktiv (CI / Skripte): Hier am Beispiel einer Konfiguration für Unsloth Studio mit einem unsloth/Qwen3.8-27B-GGUF:Q6_K Modell.

$> config set llm.url http://127.0.0.1:8888/v1
Set llm.url = http://127.0.0.1:8888/v1

$> ocr config set llm.auth_token sk-unsloth-xxx
Set llm.auth_token = sk-u***b4d3

$> ocr config set llm.model unsloth/Qwen3.8-27B-GGUF:Q6_K
Set llm.model = unsloth/Qwen3.8-27B-GGUF:Q6_K

$> ocr config set llm.use_anthropic false
Set llm.use_anthropic = false

Schritt 3 — Verbindung testen

$> ocr llm test

Source: OCR config file
URL:    http://127.0.0.1:8888/v1
Model:  unsloth/Qwen3.8-27B-GGUF:Q6_K
I am open-code-review, a command-line code review assistant developed by Alibaba.
✓ Connection test successful

no valid LLM endpoint configured → Schritt 2 erneut prüfen. 401/403 → Token falsch/abgelaufen.

Schritt 4 — Ersten Review starten

cd pfad/zu/deinem-repo

# Arbeitsbereich-Modus — Staged + Unstaged + Untracked (Standard)
ocr review

# Branch-Vergleich — Änderungen des Feature-Branches seit Abzweigung von main
ocr review --from main --to feature-branch

# Einzelner Commit
ocr review --commit abc123

Vorschau ohne LLM-Kosten:

ocr review --preview              # Arbeitsbereich
ocr review -c abc123 --preview    # Commit

Maschinenlesbare Ausgabe für andere Systeme:

ocr review --format json --audience agent > review.json

Konfiguration

Die Konfigurationsdatei liegt unter ~/.opencodereview/config.json. Das folgende Beispiel zeigt die Konfiguration für ocr mit einem Qwen3.8-27B Modell das in unsloth Studio läuft.

{
    "llm": {
        "url": "http://127.0.0.1:8888/v1",
        "auth_token": "sk-unsloth-xxxx",
        "model": "unsloth/Qwen3.8-27B-GGUF",
        "protocol": "openai",
        "use_anthropic": false
    }
}

Drei Bearbeitungswege:

  • Interaktives TUI
    ocr config provider / ocr config model, geführte Menüs.
  • Kommandozeile
    ocr config set <key> <value>, ideal für Skripte und CI.
  • Manuelle Bearbeitung
    direkte JSON-Bearbeitung (wird beim nächsten ocr config set-Schreibvorgang neu formatiert).

Modell konfigurieren

ocr config provider

Mit ocr config provider kann man den LLM Provider wählen. Man kann zwischen Official, Custom und Manual wählen.

Die drei Reiter am oberen Rand wechselt man mit Tab oder den Pfeiltasten, ausgewählt wird mit Enter, abgebrochen mit Esc.

Ohne konfiguriertes Modell schlägt ocr review fehl. Die einzige Ausnahme ist der Delegation Mode, bei dem der eigene Coding-Agent das Review mit seinem eigenen LLM ausführt.

Custom: eigener Provider

Der Reiter Custom enthält zunächst nur den Eintrag + Add custom provider. Damit legt man einen eigenen, OpenAI- oder Anthropic-kompatiblen Endpunkt an. Sinnvoll für interne Gateways, Proxys, firmeneigene Inferenz-Endpunkte oder Anbieter, die (noch) nicht in der offiziellen Liste stehen.

Ein selbst angelegter Provider wird gespeichert und erscheint bei jedem weiteren Aufruf von ocr config provider in dieser Liste, ist also wiederverwendbar. Das ist der Unterschied zu Manual: Custom legt einen benannten, dauerhaften Eintrag an, Manual überschreibt direkt die aktive LLM-Konfiguration.

Manual: Endpunkt direkt setzen

Manual konfiguriert den LLM-Endpunkt ohne Umweg über ein Preset. Die Ansicht zeigt zusätzlich die aktuell aktive Einstellung an. Das ist der typische Fall für lokal betriebene Modelle. Ein Modell, das über llama.cpp, LM Studio oder Ollama unter einer OpenAI-kompatiblen /v1-Route bereitgestellt wird. Mit Enter startet die Eingabemaske für URL, Token und Modellnamen.

Zu beachten: OCR arbeitet mit Tool-Calling. Lokale Modelle, die das nicht zuverlässig beherrschen, brechen das Review ab oder liefern leere Ergebnisse — der Verbindungstest allein sagt darüber noch nichts aus.

Official: eingebaute Provider

Der Standardreiter zeigt die mitgelieferten Provider-Presets. Endpunkt-URL und Protokoll sind darin bereits hinterlegt, man muss also nur noch den API-Key eintragen.

Folgende Provider sind mit vorkonfigurierter Basis-URL und Protokoll enthalten — es muss nur der API-Schlüssel eingetragen werden. Ist providers.<name>.api_key nicht gesetzt, greift OCR auf die entsprechende Umgebungsvariable zurück.

NameProtokollBasis-URLAPI-Key-Umgebungsvariable
anthropicanthropichttps://api.anthropic.comANTHROPIC_API_KEY
openaiopenaihttps://api.openai.com/v1OPENAI_API_KEY
dashscopeopenaihttps://dashscope.aliyuncs.com/compatible-mode/v1DASHSCOPE_API_KEY
dashscope-tokenplanopenaihttps://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1DASHSCOPE_TOKENPLAN_KEY
volcengineopenaihttps://ark.cn-beijing.volces.com/api/v3ARK_API_KEY
deepseekopenaihttps://api.deepseek.comDEEPSEEK_API_KEY
tencent-tokenhubopenaihttps://tokenhub.tencentmaas.com/v1TENCENT_TOKENHUB_API_KEY
hy-tokenplanopenaihttps://api.lkeap.cloud.tencent.com/plan/v3TENCENT_HUNYUAN_TOKENPLAN_KEY
iflytekopenaihttps://spark-api-open.xf-yun.com/v1SPARK_API_KEY
kimiopenaihttps://api.moonshot.cn/v1MOONSHOT_API_KEY
z-aiopenaihttps://open.bigmodel.cn/api/paas/v4Z_AI_API_KEY
mimoopenaihttps://api.xiaomimimo.com/v1MIMO_API_KEY
minimaxopenaihttps://api.minimax.io/v1MINIMAX_GLOBAL_API_KEY
minimax-cnopenaihttps://api.minimaxi.com/v1MINIMAX_API_KEY
baidu-qianfanopenaihttps://qianfan.baidubce.com/v2QIANFAN_API_KEY
siliconflowopenaihttps://api.siliconflow.com/v1SILICONFLOW_GLOBAL_API_KEY
siliconflow-cnopenaihttps://api.siliconflow.cn/v1SILICONFLOW_API_KEY
novitaopenaihttps://api.novita.ai/openaiNOVITA_API_KEY

Basis-URL eines eingebauten Providers überschreiben

Jeder eingebaute Provider hat eine feste Basis-URL. Um z. B. ein selbst gehostetes LiteLLM-Gateway zu verwenden, providers.<name>.url setzen:

ocr config set provider                   litellm
ocr config set model                      openai/gpt-5.4
ocr config set providers.litellm.api_key  "$LITELLM_API_KEY"
ocr config set providers.litellm.url      https://gateway.internal:8000/v1

Die gesetzte url hat Vorrang vor der Standard-Basis-URL. Ist sie nicht gesetzt (oder gelöscht), verwendet OCR den Standard.

Benutzerdefinierte Provider

Jeder nicht in der Tabelle gelistete Providername gilt als benutzerdefiniert und benötigt mindestens url und protocol (anthropicopenai oder openai-responses):

ocr config set provider                             my-gateway
ocr config set custom_providers.my-gateway.url      https://gateway.internal.com/v1
ocr config set custom_providers.my-gateway.protocol openai
ocr config set custom_providers.my-gateway.model    llama-3-70b
ocr config set custom_providers.my-gateway.api_key  "$MY_API_KEY"

openai-responses nutzen, wenn ein Modell die OpenAI Responses API (/v1/responses) benötigt:

ocr config set provider                                               openai-responses-gateway
ocr config set custom_providers.openai-responses-gateway.url          https://api.openai.com/v1
ocr config set custom_providers.openai-responses-gateway.protocol     openai-responses
ocr config set custom_providers.openai-responses-gateway.model        gpt-5
ocr config set custom_providers.openai-responses-gateway.api_key      "$OPENAI_API_KEY"

Ein lokales Ollama-Modell ist einfach ein benutzerdefinierter Provider, der auf den lokalen OpenAI-kompatiblen Endpunkt zeigt:

ocr config set provider                          ollama
ocr config set custom_providers.ollama.url       http://127.0.0.1:11434/v1
ocr config set custom_providers.ollama.protocol  openai
ocr config set custom_providers.ollama.model     qwen3:32b
ocr config set custom_providers.ollama.api_key   ollama

Ollama ignoriert den API-Schlüssel, aber benutzerdefinierte Provider verlangen einen nicht-leeren api_key (es gibt keinen Umgebungsvariablen-Fallback) — daher einen Platzhalterwert setzen. Das Modell selbst muss natives Tool-Calling unterstützen — siehe FAQ: „No tool calls parsed“.

Timeouts

Jede LLM-Anfrage hat einen HTTP-Timeout, standardmäßig 300 Sekunden. Drei Stellschrauben, zunehmender Geltungsbereich:

  • providers.<name>.timeout_sec / custom_providers.<name>.timeout_sec — pro Provider, in Sekunden.
  • llm.timeout_sec — für die veraltete llm-Sektion, in Sekunden.
  • Umgebungsvariable OCR_LLM_TIMEOUT — Ganzzahl Sekunden; überschreibt den Konfigurationswert für jeden Auflösungspfad.

timeout_sec wird nicht von ocr config set unterstützt — direkt in ~/.opencodereview/config.json bearbeiten:

{
  "custom_providers": 
  {
    "ollama": { 
      "url": "http://127.0.0.1:11434/v1", 
      "protocol": "openai", 
      "timeout_sec": 900 
    }
  }
}

Zusätzliche Retry-Statuscodes

Manche Provider verwenden untypische 4xx-Codes für vorübergehende Fehler (z. B. 403/400 für Rate-Limiting). retry_codes lässt OCR diese über den bestehenden SDK-Retry-Mechanismus erneut versuchen:

ocr config set llm.retry_codes 403,400
ocr config set custom_providers.my-gateway.retry_codes 403,400

Nur 4xx-Codes sind zulässig. 408409 und 429 werden bereits automatisch wiederholt und beim Lesen aus der Konfiguration ignoriert; bei Angabe über ocr config set gibt OCR eine Warnung aus und lässt sie beim Speichern weg. Alle 5xx-Antworten werden bereits automatisch wiederholt und können nicht zu retry_codes hinzugefügt werden.

Prompt-Limit pro Datei

Standardmäßig eine Obergrenze von 58.888 Tokens pro Dateireview. Für Modelle mit größerem Kontextfenster erhöhen:

$> ocr config set max_tokens 262144

Set max_tokens = 262144

Gilt für ocr review und ocr scan. Einmalige Überschreibung ohne dauerhafte Änderung:

$> ocr review --max-tokens 262144

$> ocr scan --max-tokens 262144

Das Flag hat Vorrang vor der gespeicherten Einstellung; ist keines gesetzt, gilt der Template-Standard. Das Limit gilt pro Datei und ist unabhängig vom Ausgabe-Token-Limit des Modells sowie von --max-tokens-budget (Gesamt-Token-Budget eines Laufs). Zurücksetzen mit ocr config unset max_tokens.

Verbindung prüfen

$> ocr llm test

Source: OCR config file
URL:    http://127.0.0.1:8888/v1
Model:  unsloth/Qwen3.8-27B-GGUF:Q6_K
I am open-code-review, a command-line code review assistant developed by Alibaba.
✓ Connection test successful

Bestehende Umgebungsvariablen wiederverwenden

Sind Claude Codes ANTHROPIC_*– oder OCRs eigene OCR_LLM_*-Umgebungsvariablen bereits gesetzt, übernimmt OCR sie automatisch — keine Konfigurationsdatei nötig.

CC-Switch nutzen

Bei Nutzung von CC-Switch mit aktiviertem Routing-Service genügt es, die Provider-url auf den lokalen Proxy zu zeigen:

# Claude (Anthropic-kompatibel)
ocr config set providers.anthropic.url http://127.0.0.1:15721

# Codex / OpenAI-kompatibel
ocr config set providers.<name>.url http://127.0.0.1:15721/v1

api_key kann ein beliebiger Wert sein.

Providerspezifische Felder senden

Manche Provider verlangen nicht-standardisierte Anfragefelder (z. B. Bedrock-artiges thinking). extra_body (wird in jede Anfrage gemergt) sendet sie ohne Quellcode-Änderung:

ocr config set providers.anthropic.extra_body '{"thinking":{"type":"disabled"}}'

Sitzungsaffinität für Prompt-Caching

OCR leitet für jede LLM-Konversation einen Prompt-Cache-Affinitätsschlüssel ab, gebunden an Review-Session und Aufgabentyp (<session-id>-<task-type>-<scope-hash>). Um dies zu nutzen, den Platzhalter {ocr_session_key} in extra_headers oder extra_body einbetten:

# Als OpenAI-Feld (z. B. prompt_cache_key)
ocr config set providers.openai.extra_body '{"prompt_cache_key": "{ocr_session_key}"}'

# Als HTTP-Header (z. B. x-session-affinity)
ocr config set custom_providers.my-gateway.extra_headers "x-session-affinity={ocr_session_key}"

Review-Sprache konfigurieren

language bestimmt die Sprache der Review-Kommentare (Standard: Englisch):

$> ocr config set language Deutsch

Set language = Deutsch

CLI-Referenz

Übersicht

OpenCodeReview - AI-Powered Code Review CLI

Befehle:
  review, r    Code-Review starten
  rules        Review-Regeln prüfen und debuggen
  config       Konfiguration verwalten
  llm          LLM-Hilfsbefehle
  viewer       Web-UI für die Sitzungsansicht starten
  session, sessions  Gespeicherte Review-Sessions auflisten und untersuchen
  version      Versionsinformationen anzeigen
BefehlAliasFunktion
ocr reviewocr rCode-Review durchführen und Kommentare ausgeben
ocr scanocr sVollständige Dateien scannen, ohne Git-Diff nötig
ocr rules check <file>Zeigen, welche Regel für einen Dateipfad gilt und woher sie stammt
ocr config set <key> <value>Konfigurationswert dauerhaft speichern
ocr config unset custom_providers.<name>Benutzerdefinierten Provider löschen
ocr config providerInteraktives Provider-Setup
ocr config modelInteraktive Modellauswahl
ocr llm testKonfigurierten Endpunkt testen
ocr llm providersAlle eingebauten Provider auflisten
ocr session listocr sessions listocr session lsGespeicherte Sessions auflisten
ocr session show <id>ocr sessions show <id>Eine Session mit ihren Checkpoints untersuchen
ocr session comments <id>ocr sessions comments <id>Kommentare einer Session ausgeben
ocr viewerLokale Web-UI starten (localhost:5483)
ocr versionVersion, Commit, Plattform, Build-Datum, GitHub-URL

ocr review

Der Hauptbefehl. Löst einen Git-Diff auf, startet Pro-Datei-Sub-Agenten, sammelt Kommentare und gibt sie aus. Ohne Flags: Arbeitsbereich-Modus (Staged + Unstaged + Untracked im aktuellen Repo).

Flags

FlagKurzStandardBeschreibung
--repo <path>aktuelles VerzeichnisGit-Repository-Wurzel
--from <ref>Ausgangs-Ref für den Diff
--to <ref>Ziel-Ref; berechnet merge-base(from, to)..to
--commit <sha>-cEinzelnen Commit reviewen (gegen sein Elternobjekt)
--preview-pfalseNur Filterpipeline ausführen, kein LLM-Aufruf
--no-filterfalseAlle Kommentare behalten, REVIEW_FILTER_TASK-Nachbearbeitung überspringen
--resume <session-id>Von einer kompatiblen früheren Session fortsetzen
--format <fmt>-ftexttextjson oder sarif (SARIF 2.1.0 für GitHub Code Scanning)
--audience <who>humanhuman (Fortschrittsanzeige) oder agent (nur Endergebnis/JSON)
--background <text>-bZusätzlicher Anforderungs-/Geschäftskontext
--concurrency <n>8Maximale Anzahl parallel geprüfter Dateien
--timeout <minutes>10Frist pro Datei (0 deaktiviert)
--rule <path>Pfad zu einer benutzerdefinierten Regel-JSON
--max-tools <n>Template-StandardMaximale Tool-Aufruf-Runden pro Datei (0=30; 1–9 werden auf 10 angehoben)
--max-tokens <n>Konfiguration/TemplatePrompt-Token-Obergrenze pro Datei für diesen Lauf
--provider <name>Konfigurierten Provider für diesen Lauf wählen
--model <name>Aufgelöstes LLM-Modell für diesen Lauf überschreiben
--max-git-procs <n>16Maximale parallele Git-Subprozesse
--tools <path>eingebautBenutzerdefinierte Tool-Konfigurationsdatei

Modus-Flags schließen sich gegenseitig aus: entweder --from/--to, oder --commit, oder keines (Arbeitsbereich-Modus). Kombinieren ist ein Fehler. --resume unterstützt nur Range- oder Commit-Reviews und ist nicht mit --preview kombinierbar.

Modelwahl pro Lauf

ocr review --provider anthropic --model claude-opus-4-6 --format json
ocr scan --provider openai --model gpt-5.4 --format json

Ein explizites --provider wählt einen gespeicherten Eintrag vor der normalen Quellenauflösung. Ohne --provider gilt die klassische Reihenfolge: gespeicherte Konfiguration → vollständige OCR_LLM_*-Umgebung → vollständige Claude-Code-Umgebung → Shell-rc-Dateien. --model überschreibt nur das Modell innerhalb der gewonnenen Quelle.

Modi

Arbeitsbereich-Modus (Standard)

ocr review

Kombiniert git diff HEAD (bzw. Fallback git diff --staged, falls leer) mit untracked Dateien aus git ls-files --others --exclude-standard, die als vollständige Neuanlagen behandelt werden.

Range-Modus

ocr review --from main --to feature-branch

Berechnet merge-base(main, feature-branch)..feature-branch, sodass nur die vom Feature-Branch eingebrachten Änderungen sichtbar sind.

Commit-Modus

ocr review --commit abc123
ocr review -c abc123

Reviewt den Diff von git show abc123.

Unterbrochene Reviews fortsetzen

Jeder Lauf wird als Session-Log unter ~/.opencodereview/sessions/ gespeichert. Die Textausgabe zeigt die Session-ID nicht standardmäßig — dafür ocr session list/show oder --format json (Feld session_id) verwenden:

ocr session list
ocr session show <session-id>
ocr session comments <session-id>
ocr review --from main --to feature-branch --resume <session-id>
ocr review --commit abc123 --resume <session-id>

--resume ist strikt: Arbeitsbereich-Reviews sind nicht fortsetzbar, der Modus muss übereinstimmen, die aufgelösten Refs müssen zum selben Diff führen, ein Provider-/Modellwechsel muss explizit über --provider/--model angefordert werden, und --preview + --resume sind nicht kombinierbar. Ein abgelehntes Fortsetzen schreibt nichts (keine Session, kein LLM-Aufruf).

Ausgabeformate

Text (Standard, --audience human) — Fortschrittszeilen live, danach ein Block pro Kommentar mit Pfad, Zeilenbereich, umbrochenem Kommentartext und ggf. farbigem Diff. Abschließende Zusammenfassung mit Dateizahl, Kommentarzahl, Token-Verbrauch und Laufzeit.

Text (Agent, --audience agent) — identische Kommentare, aber ohne Fortschrittszeilen (geeignet für CI / Weiterverarbeitung durch andere Agenten).

JSON

ocr review --format json --audience agent
{
  "status": "success",
  "llm": { "provider": "anthropic", "model": "claude-opus-4-6" },
  "summary": {
    "files_reviewed": 9,
    "comments": 1,
    "total_tokens": 21344,
    "input_tokens": 18012,
    "output_tokens": 3332,
    "elapsed": "1m12s"
  },
  "comments": [
    {
      "path": "src/foo.go",
      "content": "Nebenläufiger Map-Zugriff ohne Lock — mit sync.RWMutex absichern.",
      "start_line": 42,
      "end_line": 47,
      "existing_code": "m[k] = v",
      "suggestion_code": "mu.Lock(); defer mu.Unlock(); m[k] = v",
      "thinking": "Beim Blick auf Zeile 42 fällt auf, dass die Map …"
    }
  ]
}
FeldBedeutung
statussuccesscompleted_with_warningscompleted_with_errors oder skipped
llmAufgelöste LLM-Identität (model immer vorhanden, provider nur bei benanntem Provider)
messageOptional, menschenlesbare Zusammenfassung
summaryAggregate des Laufs (fehlt bei skipped)
commentsImmer vorhanden, ggf. leer
warningsOptional — bei fehlgeschlagenen Sub-Agenten
session_idOptional — für --resume
resumeOptional — bei fortgesetzten Läufen

Bei keinen relevanten Dateien liefert der JSON-Modus eine skipped-Hülle statt eines leeren Kommentarfelds, damit „nichts zu reviewen“ von „keine Befunde“ unterscheidbar bleibt.

Exit-Codes

CodeBedeutung
0Review abgeschlossen (ggf. mit Warnungen, ggf. ohne Kommentare)
1Fataler Fehler — z. B. LLM-Endpunkt nicht auflösbar, alle Sub-Agenten fehlgeschlagen

ocr scan

Vollständiger Datei-Review ohne Git-Diff — nützlich zum Audit eines unbekannten Codebestands oder eines Verzeichnisses ohne aussagekräftigen Diff.

ocr scan --preview                              # Vorschau ohne LLM-Aufruf
ocr scan --path internal/agent                  # ein Verzeichnis
ocr scan --path internal/agent,internal/llm/client.go
ocr scan --exclude '**/generated/*,*.pb.go'
FlagKurzStandardBeschreibung
--path <list>ganzes RepoKommagetrennte Pfade/Verzeichnisse
--exclude <patterns>Kommagetrennte gitignore-artige Ausschlussmuster
--preview-pfalseDateien nur auflisten/filtern, kein LLM-Aufruf

ocr session

ocr session list [--limit 50] [--json]
ocr session show [--json] <session-id>
ocr session comments [--json] [--severity high] [--category bug,security] <session-id>
FlagStandardBeschreibung
--repo <path>aktuelles VerzeichnisBetroffenes Repository
--jsonfalseAusgabe als JSON
--limit <n> (nur list)20Maximalzahl der Sessions (0 = unbegrenzt)
--severity <list> (nur comments)allecriticalhighmediumlow
--category <list> (nur comments)allez. B. bugsecurity

ocr rules check

ocr rules check [--repo <path>] [--rule <path>] <file-path>

Zeigt Quellschicht, passendes Glob-Muster und den aufgelösten Regeltext für eine Datei.

$ ocr rules check src/main/java/com/example/Foo.java
File: src/main/java/com/example/Foo.java
Source: System built-in
Pattern: **/*.java
Rule:
────────────────────────────────────────
<Inhalt von java.md>
────────────────────────────────────────

ocr config

ocr config set <key> <value>
ocr config unset custom_providers.<name>
ocr config provider
ocr config model

Siehe Konfiguration für den vollständigen Schlüsselkatalog.

ocr llm

ocr llm test — löst den Endpunkt exakt wie ocr review auf, sendet eine Test-Konversation und gibt Quelle, URL, Modell und die Modellantwort aus.

ocr llm providers — listet alle eingebauten Provider in einer Dreispaltentabelle (Name, Protokoll, Basis-URL).

ocr viewer

ocr viewer                       # Standardport localhost:5483
ocr viewer --addr :3000          # auf allen Interfaces, Port 3000
ocr viewer --addr 0.0.0.0:8080   # alle Interfaces

Siehe Session Viewer.

ocr completion

# Bash — einmalig
source <(ocr completion bash)
# Bash — dauerhaft (Linux)
ocr completion bash > /etc/bash_completion.d/ocr
# Bash — dauerhaft (macOS)
ocr completion bash > $(brew --prefix)/etc/bash_completion.d/ocr

# Zsh — dauerhaft
ocr completion zsh > "${fpath[1]}/_ocr"

# Fish — einmalig
ocr completion fish | source
# Fish — dauerhaft
ocr completion fish > ~/.config/fish/completions/ocr.fish

# PowerShell — einmalig
ocr completion powershell | Out-String | Invoke-Expression
# PowerShell — dauerhaft: Skript erzeugen und im Profil per Dot-Sourcing einbinden
ocr completion powershell > ocr.ps1

ocr version

ocr version
ocr --version
ocr -V

Tipps & Fallstricke

  • --audience agent impliziert nicht --format json — beides steuert unterschiedliche Dinge (ruhige UI vs. strukturierte Ausgabe); bei Bedarf kombinieren.
  • --background ist eines der wirksamsten Flags für die Review-Qualität — Anforderungs-/PR-Text immer mitgeben, wenn OCR von einem anderen Agenten aus aufgerufen wird.
  • Eine Datei, deren Diff allein 80 % von MAX_TOKENS (Standard 58888) übersteigt, wird vor dem LLM-Aufruf verworfen — geloggt, aber nicht laufabbrechend.
  • Die Planungsphase wird automatisch übersprungen, wenn die geänderten Zeilen einer Datei unter PLAN_MODE_LINE_THRESHOLD (50) liegen.

Die eingebauten Tools

OCR liefert sechs eingebaute Tools, die das LLM während eines Reviews aufrufen kann.

Verfügbarkeit pro Phase

ToolPlanHauptZweck
task_done„Ich bin fertig“ signalisieren — beendet die Schleife
code_commentReview-Kommentar mit Zeilenbereich + Vorschlag ausgeben
file_readAusschnitt einer Datei im Nach-Änderungs-Zustand lesen
file_read_diffDiff einer anderen Datei lesen (Cross-File-Kontext)
file_findDateien nach Dateinamens-Stichwort finden
code_searchRepo-weite Suche (Literal oder Regex)

Kontext-Tools sind nur lesbarer Kontext, keine Kommentarziele. Der main_task-Prompt verbietet ausdrücklich Kommentare zu Befunden in anderen Dateien. file_readfile_read_difffile_find und code_search dienen nur dem besseren Verständnis der aktuellen Datei.

Mit --tools <path> lässt sich die Tool-Registry überschreiben (Tool deaktivieren, Beschreibung ändern, neues Tool auf Basis eines bestehenden Providers hinzufügen).

task_done

{ "name": "task_done", "input": { "state": "DONE" } }

state ist DONE (Standard) oder FAILED (fast nie die richtige Wahl). Wird sofort verarbeitet (vor der Session-Log-Speicherung) — der state-Wert beeinflusst weder Exit-Codes noch wird er persistiert.

code_comment

{
  "name": "code_comment",
  "input": {
    "path": "optional — Dateipfad-Override",
    "comments": [
      {
        "content": "Kommentartext in der konfigurierten Sprache",
        "existing_code": "Ausschnitt aus dem Diff zur Verankerung",
        "suggestion_code": "optionaler Fix-Ausschnitt",
        "thinking": "optional — Begründung des Modells"
      }
    ]
  }
}

comments ist ein Array — mehrere Kommentare pro Aufruf möglich. content und existing_code sind Pflichtfelder; suggestion_code optional, aber erwünscht. path wird meist automatisch von OCR eingefügt. thinking ist ein Laufzeit-only-Feld — nicht im an das Modell kommunizierten Schema, wird aber gespeichert, falls das Modell es trotzdem liefert.

Verankerungsalgorithmus — OCR sucht existing_code per dynamischem Sliding-Window im Diff:

  1. Hunk-Neuseite (Kontext + hinzugefügte Zeilen) → neue Zeilennummern. Bei Fehlschlag: Hunk-Altseite (Kontext + gelöschte Zeilen) → alte Zeilennummern.
  2. Voller Neu-Datei-Scan — falls kein Hunk-Match, wird die komplette Nach-Änderungs-Datei zeilenweise durchsucht.
  3. Re-Location-Task — bei anhaltendem Fehlschlag auf nicht-trivialen Diffs bittet OCR das Modell erneut um Verankerung.

Der Vergleich ist whitespace-unempfindlich. Als letzter Ausweg wird der Kommentar mit start_line=0 ausgeliefert — das signalisiert: „das Problem ist real, aber die genaue Stelle muss manuell gesucht werden“.

file_read

{ "name": "file_read", "input": { "file_path": "src/foo.go", "start_line": 10, "end_line": 80 } }
FeldPflichtStandardHinweis
file_pathjarelativ zur Repo-Wurzel
start_linenein11-indexiert
end_lineneinDateiendeinklusiv

Ausgabe: jede Inhaltszeile mit vorangestellter Zeilennummer und |-Trenner. Limit: 500 Zeilen pro Aufruf — größere Bereiche werden abgeschnitten (IS_TRUNCATED: true). Liest nur die geänderte Version — für die alte Version dient file_read_diff.

file_read_diff

{ "name": "file_read_diff", "input": { "path_array": ["src/api/handler.go", "src/db/queries.go"] } }

Liest den Diff einer oder mehrerer anderer Dateien im selben Änderungssatz. Nicht enthaltene Pfade werden stillschweigend übersprungen; sind alle angefragten Pfade nicht im Änderungssatz, liefert das Tool Error: diff not found for the requested paths.

file_find

{ "name": "file_find", "input": { "query_name": "UserService", "case_sensitive": false } }

Sucht Dateien nach Substring im Dateinamen (nicht im vollen Pfad). Bis zu 100 Treffer; darüber hinaus stillschweigend abgeschnitten (dann code_search verwenden). Kandidaten stammen aus git ls-files (Arbeitsbereich) bzw. git ls-tree (Range/Commit). Erweiterungslose Dateien werden übersprungen — außer MakefileDockerfileLICENSEVagrantfileContainerfile.

code_search

{
  "name": "code_search",
  "input": {
    "search_text": "TODO|FIXME",
    "file_patterns": ["*.go", ":(exclude)vendor/"],
    "case_sensitive": false,
    "use_perl_regexp": true
  }
}

Basiert auf git grep, versteht Pathspec-Syntax und beachtet .gitignore. Ergebnisse sind nach Datei gruppiert. Limit: 100 Treffer pro Datei. Leerer search_text liefert einen Fehler statt jede Zeile zu matchen.

Tools anpassen

Tool deaktivieren: tools.json kopieren, gewünschten Eintrag entfernen, dann ocr review --tools ./my-tools.json. Für einen „nur-Kommentar“-Reviewer beispielsweise nur code_comment und task_done behalten.

Tool umbeschreiben: name beibehalten (Provider werden intern über den Namen aufgelöst), description anpassen, um das Modell zu steuern.

Neue Tool-Namen erfordern Go-seitige Verdrahtung (internal/tool/definitions.go).

Review-Regeln (Rules)

Regeln bestimmen, worauf OCR pro Datei achtet. Sie liegen in JSON-Dateien auf drei Ebenen plus einem eingebauten Systemstandard.

Prioritätskette

PrioritätQuellePfadAnmerkung
1 (höchste)--rule-FlagbenutzerdefiniertCLI-Override, gewinnt immer
2Projekt-Konfiguration<repoDir>/.opencodereview/rule.jsoncommit-fähig
3Globale Konfiguration~/.opencodereview/rule.jsonnutzerweite Präferenzen
4 (niedrigste)Systemstandardeingebettete system_rules.jsondeckt gängige Sprachen ab

Fehlt eine höher priorisierte Datei, wird sie stillschweigend übersprungen (kein Fehler) — die Systemebene ist immer vorhanden.

Regeldatei-Format (Ebenen 1–3)

{
  "include": ["src/**/*.{ts,tsx}", "src/**/*.go"],
  "exclude": ["**/*.test.ts", "**/generated/**"],
  "rules": [
    {
      "path": "src/api/**/*.go",
      "rule": "Alle exportierten Handler müssen Anfragen validieren, bevor sie verwendet werden."
    },
    {
      "path": "**/*mapper*.xml",
      "rule": "SQL auf Injection-Risiken, Parameterfehler und fehlende schließende Tags prüfen."
    }
  ]
}
  • include — optional. Glob-Muster, die eingebaute Standard-Ausschlussmuster (v. a. Testdateien) umgehen. Keine Whitelist — nicht passende Dateien durchlaufen weiterhin die restlichen Gates.
  • exclude — optional. Muster für Dateien, die OCR nicht reviewen soll. Höchste Priorität im Filter.
  • rules — Array aus {path, rule}, in Deklarationsreihenfolge ausgewertet. Der erste passende path bestimmt den Prompt.

Regelauflösung pro Datei

  1. --rule (benutzerdefiniert) in Deklarationsreihenfolge.
  2. <repo>/.opencodereview/rule.json in Deklarationsreihenfolge.
  3. ~/.opencodereview/rule.json in Deklarationsreihenfolge.
  4. Eingebettete System-Regelschicht als Fallback.

Auszug der eingebetteten system_rules.json-Muster (relative Reihenfolge):

MusterRegeldokument
**/*.propertiesproperties.md — i18n/Konfigurationsdateien
**/*{mapper,dao}*.xmlmapper_dao_xml.md — MyBatis-artige Mapper-SQL
**/pom.xmlpom_xml.md — Maven-Abhängigkeiten
**/build.gradlebuild_gradle.md — Gradle-Abhängigkeiten
**/package.jsonpackage_json.md — NPM-Abhängigkeiten/Skripte
**/Cargo.tomlcargo_toml.md — Rust-Manifest
**/composer.jsoncomposer_json.md — Composer-Abhängigkeiten
**/*.{json,json5}json.md
.github/workflows/**/*.{yaml,yml}github_workflows.md
.github/**/*.{yaml,yml}github_config.md
**/*.{yaml,yml}yaml.md
**/*.javajava.md
**/*.gogo.md
**/*.{ftl,ftlh,ftlx}freemarker.md
**/*.etsarkts.md — ArkTS/HarmonyOS
**/*.astroastro.md
**/*.{ts,js,tsx,jsx}ts_js_tsx_jsx.md
**/*.{kt}kotlin.md
**/*.rsrust.md
**/*.{cpp,cc,hpp}cpp.md
**/*.cc.md
**/*.pypython.md
**/*.{php,phtml}php.md
**/*.protoprotobuf.md
**/*.po / **/*.potpo.md / pot.md
**/*.{graphql,gql}graphql.md
**/*.prismaprisma.md
**/*.jljulia.md
**/*.{tf,hcl,tfvars}terraform.md
**/*.bicepbicep.md
(Fallback)default.md

ocr rules check — welche Regel gewinnt

ocr rules check src/main/java/com/example/UserService.java
ocr rules check --rule custom.json src/main/resources/mapper/UserMapper.xml

Zeigt Quellschicht und Muster — ideal zum Debuggen „warum feuert meine Regel nicht?“.

Rezepte

Projektebene: Coding-Standard erzwingen (<repo>/.opencodereview/rule.json, commit-fähig):

{
  "rules": [
    { "path": "src/api/**/*.go", "rule": "Jeder öffentliche Handler muss `defer tx.Rollback()` direkt nach Transaktionsbeginn aufrufen." },
    { "path": "**/*mapper*.xml", "rule": "SQL auf Injection-Risiken, fehlende Parameterbindung und offene XML-Tags prüfen." }
  ]
}

Projektebene: generierten Code überspringen, nur src fokussieren:

{
  "include": ["src/**/*.{ts,tsx,js,jsx}"],
  "exclude": ["**/*.gen.ts", "**/generated/**"]
}

Pro-PR-Override:

ocr review --rule ./.review-rules-only-for-this-pr.json

Globale persönliche Präferenzen (~/.opencodereview/rule.json):

{
  "rules": [
    { "path": "**/*.{ts,tsx,js,jsx}", "rule": "Immer auf unbehandelte Promise-Rejections prüfen; bei `// eslint-disable` ohne Begründung warnen." }
  ]
}

MCP-Server als Werkzeugquelle

OCR kann als Model-Context-Protocol-(MCP)-Client agieren. Man verweist auf einen oder mehrere externe MCP-Server, und deren Tools stehen dem Review-Agenten zusätzlich zu den eingebauten Tools zur Verfügung.

Wann sinnvoll

  • Ticket-/Issue-Abgleich — verknüpftes Jira-/GitHub-Issue abrufen, um zu prüfen, ob die Änderung der Anforderung entspricht.
  • Docs / Wissensdatenbank — interne API-Dokumentation oder Coding-Standards, damit Kommentare auf die echten Hausregeln verweisen.
  • Individuelle Analyse — Linter, Schema-Validator, Abhängigkeits-Checker als Bedarfstool.

Reicht ein reines Lesen des Repos, decken die eingebauten Tools das bereits ab — MCP ist für Kontext außerhalb des Checkouts gedacht.

Konfiguration

# Minimal: nur ein Befehl
ocr config set mcp_servers.docs.command npx

# Argumente
ocr config set mcp_servers.docs.args '["-y", "@acme/docs-mcp-server"]'

# Freigegebene Tools einschränken
ocr config set mcp_servers.docs.tools '["search_docs", "get_page"]'

# Setup-Befehl vor Serverstart
ocr config set mcp_servers.docs.setup "npm install -g @acme/docs-mcp-server"

# Umgebungsvariablen
ocr config set mcp_servers.docs.env '["DOCS_TOKEN=secret", "DOCS_REGION=eu"]'

Entfernen:

ocr config unset mcp_servers.docs
FeldTypPflichtBeschreibung
commandstringAusführbare Datei, die den Server startet
argsstring[]Argumente für command
toolsstring[]Allowlist der zu registrierenden Tools (leer = alle)
setupstringEinmaliger Shell-Befehl vor Serverstart (5-Minuten-Timeout, läuft in der Repo-Wurzel)
envstring[]Zusätzliche KEY=VALUE-Umgebungsvariablen

Namenskonflikte

MCP-Tool-Namen teilen sich einen Namensraum mit den eingebauten Tools. Kollidiert ein Servertool mit einem eingebauten/reservierten Namen (file_readcode_searchtask_done, …) oder einem bereits registrierten anderen Server-Tool, wird es übersprungen und eine Warnung geloggt. Die erste Registrierung gewinnt.

Fehlerdiagnose

Alle MCP-Diagnosen gehen an stderr (Präfix [ocr]), niemals nach stdout:

  • Running setup for MCP server "x": …
  • failed to start MCP server "x": … — Subprozess verband nicht innerhalb 30 Sekunden, oder command ist nicht auf PATH.
  • tool "y" conflicts with built-in tool, skipping
  • allowed tool "y" not found in server's tool list — Tippfehler in tools prüfen.

Session Viewer (Web-UI)

ocr viewer ist ein kleiner, in die Binärdatei eingebetteter HTTP-Server, der vergangene Review-Sessions browserfreundlich darstellt — ohne externe Abhängigkeiten, direkt aus den JSONL-Dateien auf der Platte.

Starten

ocr viewer                       # localhost:5483
ocr viewer --addr :3000          # alle Interfaces, Port 3000
ocr viewer --addr 0.0.0.0:8080   # alle Interfaces

Standardadresse localhost:5483. Der Server hält den Vordergrund (Strg+C beendet ihn). Sessions werden bei jeder Anfrage neu aus ~/.opencodereview/sessions/ gelesen — ein laufender Review in einem anderen Terminal erscheint sofort nach Erzeugung seiner JSONL-Datei.

DNS-Rebinding-Schutz. Der Viewer prüft den Host-Header gegen eine Loopback-Allowlist (localhost127.0.0.1::1). Ein konkreter Bind-Host wird automatisch hinzugefügt, aber Wildcard-Binds (:30000.0.0.0::) nicht — Zugriff über eine LAN-IP liefert dann forbidden host. Für Wildcard-Zugriff OCR_VIEWER_ALLOWED_HOSTS mit kommagetrennter Hostliste setzen (z. B. OCR_VIEWER_ALLOWED_HOSTS=box.local,192.168.1.10).

Drei Seiten (Full Scan)

  • / Liste aller Repositories mit Sessions
  • /r/{repo} Sessionliste für ein Repo, neueste zuerst
  • /r/{repo}/{sessionID} Volles Detail einer Session

Session-Detail

Der Session-Detail-Screen ist die Detailansicht des Session Viewers. Er zeigt alles, was während einer einzelnen Review-Ausführung passiert ist: unter welchen Rahmenbedingungen sie lief, welche Dateien tatsächlich geprüft wurden, wie viele Tokens das gekostet hat, welche Befunde entstanden sind und wie der Agent zu diesen Befunden gekommen ist.

Man erreicht den Screen aus der Session-Liste, indem man eine Session auswählt.

Grundkonzept: Was ist eine Session?

Eine Session ist eine einzelne Ausführung eines Reviews — also das, was ein Aufruf von ocr review bzw. ocr scan erzeugt. Jede Session wird lokal persistiert und bekommt eine eindeutige Session-ID. Diese ID ist gleichzeitig der Wiederaufnahme-Schlüssel: Eine abgebrochene Session lässt sich mit --resume <session-id> fortsetzen.

Der Session Viewer liest diese gespeicherten Daten und stellt sie dar. Er ist eine reine Leseansicht:

  • Es wird kein Review neu ausgeführt und kein LLM aufgerufen.
  • Es werden keine Kommentare geändert, aufgelöst oder gepostet.
  • Alle Daten stammen aus dem lokalen Session-Verzeichnis.

Der Screen beantwortet damit drei Arten von Fragen:

FrageRelevanter Abschnitt
Wurde vollständig und korrekt geprüft?Session-Header, Coverage, Files Reviewed
Was hat das gekostet?Token Usage
Was wurde gefunden — und warum?Review Comments, Conversations

Aufbau des Screens

Der Screen ist als vertikale Abfolge eigenständiger Karten aufgebaut. Von oben nach unten:

  1. Kopfzeile mit Breadcrumb-Navigation
  2. Session-Header — Metadaten der Ausführung
  3. Coverage — Abdeckung der Dateiauswahl
  4. Token Usage — Verbrauch und Anzahl der LLM-Aufrufe
  5. Review Comments — die Befunde, filterbar und nach Datei gruppiert
  6. Files Reviewed — alle geprüften Dateien, auch die ohne Befund
  7. Conversations — der Gesprächsverlauf des Agents je Datei

Die Reihenfolge folgt bewusst dem Vertrauensaufbau: erst Rahmen, dann Vollständigkeit, dann Ergebnis, zuletzt Nachvollziehbarkeit. Karten mit einem Pfeilsymbol () sind zusammengeklappt und lassen sich per Klick öffnen; die Zahl am rechten Rand zeigt vorab, wie viel Inhalt dahinter steckt.

Kopfzeile

Die Kopfzeile enthält den Breadcrumb-Pfad Open Code Review Viewer / <Projekt> / <Session-ID>.

Der Projektname ist ein Link zurück zur Session-Liste dieses Projekts. Die Session-ID wird gekürzt dargestellt, weil UUIDs die Kopfzeile sonst dominieren würden — die vollständige ID steht im Session-Header darunter.

Session-Header

Der Header beschreibt den Rahmen, unter dem das Review lief. Diese Angaben sind die Voraussetzung dafür, Ergebnisse überhaupt einordnen zu können: Dieselbe Codebasis liefert mit einem anderen Modell oder einem anderen Diff-Bereich andere Befunde.

FeldBedeutung
SessionVollständige Session-ID. Wird für --resume und zum Melden von Problemen benötigt.
CWDArbeitsverzeichnis, in dem der Review-Aufruf ausgeführt wurde.
BRANCHAktiver Git-Branch zum Zeitpunkt der Ausführung.
MODEDer Review-Modus, siehe unten.
COMMITReferenz auf den geprüften Stand. Je nach Modus der geprüfte Commit oder der HEAD-Stand des Arbeitsverzeichnisses.
MODELDas konkret verwendete Modell, inklusive Provider- bzw. Quantisierungs-Kennung.
DURATIONReine Laufzeit des Reviews.
FILESAnzahl der Dateien, die für das Review ausgewählt wurden.
STATUSEndzustand der Session.
Review-Modi

Der Modus bestimmt, woher die zu prüfenden Änderungen stammen:

  • workspace — alle Änderungen im Arbeitsverzeichnis (staged, unstaged, untracked).
  • range — die Änderungen eines Branches gegenüber seinem Abzweigpunkt (--from / --to, Merge-Base).
  • commit — genau ein Commit (--commit <sha>).
  • scan — vollständige Dateien statt eines Diffs (ocr scan); nützlich für Audits von fremdem Code oder Verzeichnissen ohne aussagekräftige Historie.
Status
  • complete — Das Review ist regulär durchgelaufen.
  • running — Die Session läuft noch; die Kennzahlen sind vorläufig.
  • interrupted — Die Ausführung wurde abgebrochen und kann per --resume fortgesetzt werden.
  • failed — Die Session wurde durch einen Fehler beendet.

Bei allem außer complete sind Coverage- und Finding-Zahlen als Zwischenstand zu lesen, nicht als Aussage über die Qualität der Änderung.

Coverage

Coverage beantwortet die Frage, ob wirklich alles Relevante geprüft wurde. Der Hintergrund: Die Dateiauswahl in Open Code Review ist ein deterministischer Schritt und keine Modellentscheidung. Genau deshalb lässt sie sich als harte Zahl anzeigen — und genau deshalb ist diese Zahl belastbar.

Die Karte zeigt fünf Zähler:

ZählerBedeutung
SelectedDateien, die die Auswahl- und Filterlogik als reviewrelevant bestimmt hat. Die Bezugsgröße für alles Weitere.
CompletedDateien, die in dieser Session vollständig geprüft wurden.
ReusedDateien, deren Ergebnis aus einer früheren Session übernommen wurde, weil sich der Inhalt nicht geändert hat. Typisch bei --resume und bei wiederholten Reviews desselben Stands — spart Zeit und Tokens.
FailedDateien, deren Prüfung fehlgeschlagen ist, etwa durch Timeouts, Provider-Fehler oder Kontextüberläufe.
WaivedDateien, die bewusst übersprungen wurden, z. B. durch Ausschlussregeln, Größenlimits oder als generiert erkannte Artefakte.

Lesehilfe: Selected sollte der Summe der übrigen vier Zähler entsprechen. Weicht das ab, läuft die Session noch oder wurde abgebrochen.

Ein Wert größer null bei Failed ist das wichtigste Warnsignal des Screens: Für diese Dateien liegt kein Ergebnis vor, und das Fehlen von Befunden bedeutet dort ausdrücklich nicht „keine Probleme gefunden“. Ein hoher Waived-Wert ist dagegen meist unkritisch, lohnt aber einen Blick in die Filterkonfiguration — er kann auch bedeuten, dass eine Ausschlussregel zu breit greift.

Token Usage

Diese Karte macht die Kosten der Session transparent.

KennzahlBedeutung
Prompt TokensAn das Modell gesendete Tokens: Regeln, Diffs, Dateiinhalte, Tool-Ergebnisse.
Completion TokensVom Modell erzeugte Tokens: Befunde, Zwischenüberlegungen, Tool-Aufrufe.
Total TokensSumme beider Werte — die relevante Größe für Abrechnung und Vergleich.
LLM RequestsAnzahl der einzelnen Modellaufrufe in dieser Session.

Zwei Beobachtungen sind normal und erklären das übliche Zahlenbild:

  • Prompt-Tokens dominieren deutlich. Ein Review liest sehr viel Kontext und schreibt vergleichsweise wenig Text. Ein Verhältnis von vielen Prompt- zu wenigen Completion-Tokens ist der Regelfall, kein Fehler.
  • Es gibt mehr Requests als Dateien. Dateien werden zu Review-Einheiten gebündelt, die als Sub-Agents mit eigenem Kontext laufen; hinzu kommen Tool-Aufrufe sowie die separaten Schritte zur Positionierung und Reflexion der Kommentare. Jeder dieser Schritte ist ein eigener Aufruf.
File breakdown

Hinter File breakdown liegt die Aufschlüsselung des Verbrauchs pro Datei. Damit lassen sich Ausreißer identifizieren — einzelne große oder stark verzweigte Dateien verursachen häufig einen überproportionalen Anteil der Gesamtkosten. Das ist der übliche Startpunkt, wenn Reviews im CI zu teuer oder zu langsam werden.

Review Comments

Die zentrale Karte des Screens. Die Überschrift nennt die Gesamtzahl der Befunde (findings) der Session.

Filter

Zwei unabhängige Filterleisten schränken die Liste ein. Jede Schaltfläche zeigt die Anzahl der Befunde in dieser Ausprägung, sodass die Verteilung schon vor dem Filtern sichtbar ist.

Severity — wie dringend ein Befund ist:

  • High — sollte vor dem Merge behoben werden; funktionale Fehler oder Sicherheitsprobleme mit realer Auswirkung.
  • Medium — sollte behoben werden, blockiert aber nicht zwingend.
  • Low — Hinweis, oft stilistischer oder vorbeugender Natur.

Category — worum es inhaltlich geht:

  • Bug — fehlerhaftes Verhalten, etwa Nullzugriffe, falsche Randfälle, Race Conditions.
  • Security — Schwachstellen wie SQL-Injection, XSS, fehlende Validierung oder Autorisierung.
  • Performance — unnötiger Aufwand, etwa N+1-Abfragen oder Arbeit in heißen Pfaden.
  • Maintainability — Lesbarkeit, Struktur, Duplikate, fehlende Fehlerbehandlung.

Beide Dimensionen sind orthogonal: Ein Security-Befund kann Low sein, ein Maintainability-Befund High. Die Filter wirken kombiniert (UND-Verknüpfung), All setzt die jeweilige Dimension zurück.

Gruppierung nach Datei

Die Befunde sind nach Datei gruppiert, mit der Anzahl der Kommentare je Datei am rechten Rand. Aufgeklappt zeigt jede Gruppe die einzelnen Kommentare mit Zeilenbezug, Beschreibung des Problems und — soweit vorhanden — einem konkreten Korrekturvorschlag.

Der Zeilenbezug stammt aus einem eigenen Positionierungsschritt und nicht aus einer Schätzung des Modells. Er sollte daher exakt auf die betroffene Stelle zeigen.

Files Reviewed

Diese Karte listet alle geprüften Dateien auf — auch die ohne jeden Befund.

Das ist kein redundanter Inhalt, sondern der entscheidende Gegencheck zu den Review Comments: Nur hier lässt sich unterscheiden zwischen „Datei wurde geprüft und war sauber“ und „Datei taucht nirgends auf, weil sie gar nicht geprüft wurde“. Wenn eine Änderung verdächtig wenige Befunde produziert, ist dieser Abschnitt die erste Anlaufstelle.

Zusammen mit den Coverage-Zählern ergibt sich daraus ein vollständiges Bild der Abdeckung.

Conversations

Hier lässt sich der Ablauf des Reviews nachvollziehen: der Gesprächsverlauf des Agents je Datei bzw. Review-Einheit — die verwendeten Prompts und Regeln, die Tool-Aufrufe (Datei lesen, Codebasis durchsuchen, andere geänderte Dateien einsehen), deren Ergebnisse und die Antworten des Modells.

Typische Anlässe, hier hineinzuschauen:

  • Falsch-positiver Befund — welchen Kontext hatte der Agent, als er den Befund erzeugte?
  • Erwarteter Befund fehlt — wurde die relevante Stelle überhaupt gelesen?
  • Auffälliger Token-Verbrauch — welche Tool-Aufrufe haben den Kontext aufgebläht?
  • Regelentwicklung — hat eine eigene Regel wie beabsichtigt gegriffen?

Für die tägliche Arbeit ist dieser Abschnitt selten nötig. Für das Tuning von Regeln, Modellen und Konfiguration ist er die wichtigste Quelle.

Typische Arbeitsabläufe

Ergebnis eines Reviews triagieren Status im Header prüfen → Coverage auf Failed prüfen → Review Comments auf High filtern → Befunde abarbeiten → mit Medium fortfahren.

Kosten oder Laufzeit analysieren Duration und LLM Requests mit früheren Sessions vergleichen → File breakdown öffnen → Ausreißer identifizieren → bei Bedarf Filter- oder Bundling-Konfiguration anpassen.

Unerwartetes Ergebnis untersuchen Files Reviewed prüfen, ob die betroffene Datei enthalten ist → falls ja, die zugehörige Conversation öffnen → falls nein, Coverage und Ausschlussregeln prüfen.

Hinweise

  • Der Screen ist schreibgeschützt. Alle Aktionen — erneutes Review, Wiederaufnahme, Konfigurationsänderungen — laufen über die CLI.
  • Die dargestellten Daten liegen lokal im Session-Verzeichnis. Der Viewer lädt nichts hoch.
  • Sessions enthalten Quellcode und Prompts. Beim Teilen von Screenshots oder Exporten gelten dieselben Vertraulichkeitsanforderungen wie für das Repository selbst.

Speicherformat auf der Platte

~/.opencodereview/sessions/
└── <path-encoded-repo-path>/
    └── <session-id>.jsonl

Jede Zeile ist ein Ereignis (llm_requestllm_responsetool_call, …). Zum Speicherplatzsparen einfach ganze Sessiondateien löschen — der Viewer generiert den Index beim nächsten Aufruf neu.

Datenschutz

Die JSONL-Transkripte enthalten alles, was an das LLM gesendet und zurückgegeben wurde, einschließlich Diff-Code. Sie liegen ausschließlich lokal — OCR lädt sie nirgendwohin hoch. Bei sensiblem Code: Sessiondateien regelmäßig löschen, oder in CI mit temporärem HOME arbeiten, damit nichts persistiert wird.

Integrationen

Agent Skill

Registriert OCR als aufrufbaren „Skill“ für Agenten-Frameworks — inklusive Voraussetzungsprüfungen, Aufrufworkflow und Triage-Rubrik (Hoch/Mittel/Niedrig).

Installation:

# Option 1: npx skills add (empfohlen)
npx skills add alibaba/open-code-review --skill open-code-review

# Option 2: manuelles Kopieren (systemweit)
mkdir -p ~/.claude/skills
cp -R /pfad/zu/open-code-review/skills/open-code-review ~/.claude/skills/

# Option 3: für den pi.dev coding agent
pi install npm:pi-open-code-review

Der Skill installiert die ocr-CLI beim ersten Lauf selbst nach, wenn nötig. Ein konfiguriertes LLM muss aber vorab vorhanden sein — der Skill kann das nicht selbst erledigen und hält an, um den Nutzer zu fragen.

Ablauf eines /open-code-review-Aufrufs:

  1. Voraussetzungsprüfung (which ocrocr llm test).
  2. Bei Bedarf: automatische CLI-Installation via NPM, ohne Rückfrage.
  3. Kein LLM konfiguriert? → Anhalten, zwei unterstützte Optionen zeigen (Umgebungsvariablen oder ocr config set …), auf API-Schlüssel warten — keine erfundenen Zugangsdaten.
  4. Geschäftskontext aus dem Reviewziel extrahieren (--background).
  5. ocr review --audience agent --background "…" [--commit | --from/--to] ausführen.
  6. JSON-Kommentare nach Hoch/Mittel/Niedrig gruppieren (Bugs/Sicherheitsprobleme = Hoch, Nitpicks und wahrscheinliche Fehlalarme werden stillschweigend verworfen), Markdown-Zusammenfassung rendern.
  7. Bei „review und fix“: sichere Fixes für Hoch/Mittel inline anwenden; sonst vorher fragen.

Anthropic Agent SDK:

from anthropic_agent_sdk import Agent

agent = Agent(
    skill_paths=["/pfad/zu/open-code-review/skills/open-code-review"],
)
agent.run("Review meine gestagten Änderungen — Fokus auf Race Conditions.")

Claude-Code-Plugin (Slash Command)

Installiert einen fertigen Befehl, der OCR Ende-zu-Ende innerhalb von Claude Code ausführt: Diff reviewen, Befunde klassifizieren, automatisch Fixes anwenden.

Installation über Plugin-Marketplace (empfohlen) — innerhalb Claude Code:

/plugin marketplace add alibaba/open-code-review
/plugin install open-code-review@open-code-review

Registriert /open-code-review:review.

Alternativ — Befehlsdatei direkt kopieren:

mkdir -p .claude/commands
curl -o .claude/commands/open-code-review.md \
  https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/review.md

(Registriert als /open-code-review, ohne :review-Suffix.)

Nutzung:

/open-code-review:review
/open-code-review:review review this PR against main
/open-code-review:review focus on race conditions in commit abc123

Ohne Argumente → Arbeitsbereich-Modus; mit Commit-Erwähnung → --commit; mit Branch-Vergleich → --from/--to. OCR-Flags können auch direkt durchgereicht werden.

Unterschied zum Agent Skill: Dieser Befehl wendet standardmäßig Fixes automatisch an — die richtige Oberfläche für „review und aufräumen“ statt „zeig mir nur den Diff“.

Delegation Mode

OCR übernimmt die deterministische Ingenieursarbeit (Dateiauswahl, Regelauflösung), während der Host-Agent (Claude Code, Codex, Cursor, Open Code, Qoder, pi.dev, …) den eigentlichen Review mit seiner eigenen LLM-Fähigkeit durchführt. Kein eigener LLM-Endpunkt auf OCR-Seite nötig — die bestehende Subscription-Quote des Host-Agenten wird genutzt.

Wann sinnvoll:

  1. Der Coding-Agent läuft auf einem Abo-Plan und dessen Quote soll wiederverwendet werden.
  2. Nur die „Scaffolding“-Funktion von OCR wird gebraucht (Dateifilterung, Regelauflösung, Ausschlusslogik) — der Host-Agent übernimmt alle LLM-Überlegungen.
  3. Eine eigene Agenten-Pipeline benötigt strukturierte Eingaben (Dateiliste + Regeln) für einen eigenen Review-Schritt.

Voraussetzung:

which ocr || npm install -g @alibaba-group/open-code-review

Keine LLM-Konfiguration nötig — Delegation Mode ruft auf OCR-Seite nie ein LLM auf.

Skill/Command installieren:

# Claude Code — Command
mkdir -p .claude/commands
curl -o .claude/commands/delegate-review.md \
  https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/delegate-review.md

# Beliebiger Agent — Skill
npx skills add alibaba/open-code-review --skill open-code-review-delegate

Ablauf:

  1. Vorschau — was reviewt werden soll:ocr delegate preview [--from <ref> --to <ref>] [--commit <hash>] [--exclude <patterns>] Liefert Modus, Ref-Metadaten, Liste der review-fähigen Dateien und Ausschlussgründe.
  2. Regeln für Dateien abrufen:ocr delegate rule <path1> <path2> ... Ausgabe nach gemeinsamem Regeltext gruppiert.
  3. Diffs holen — direkt per Git (git diff HEAD -- <path>git show <commit> -- <path>, …).
  4. Jede Datei reviewen — Diff aus Schritt 3 + passende Regelgruppe aus Schritt 2 als Checkliste, ggf. mit weiterer Kontextrecherche.
  5. Bericht — Klassifikation nach Schweregrad: Kritisch/Hoch (immer melden), Mittel (mit Kontext melden), Niedrig (stillschweigend verwerfen, außer klar wertvoll).

Vergleich der Integrationsmodi:

ModusWer ruft das LLM auf?Anwendungsfall
Agent SkillOCRAgent ruft ocr review auf; OCR steuert den vollen Review
Command (Claude Code)OCRSlash-Command in Claude Code; OCR steuert den Review
Pi-Paket (/ocr)OCRSlash-Command + Skill in Pi; OCR steuert den Review
Delegation ModeHost-AgentOCR liefert Scaffolding; der Agent steuert den Review

Pi (pi.dev)

Das Paket pi-open-code-review bringt OCR nach demselben Funktionsprinzip wie die Claude-Code- und Codex-Integrationen in Pi: OCR bleibt die Review-Engine, Pi liefert einen Skill für natürlichsprachliche Anfragen und einen Slash-Command für den expliziten Aufruf. Paketseite: https://pi.dev/packages/pi-open-code-review.

Was das Paket mitbringt:

  • einen Skill open-code-review für natürlichsprachliche Review-Anfragen,
  • einen einzigen Slash-Command, /ocr, für explizite Review-, Fix- und Scan-Workflows.

Voraussetzungen

/ocr prüft vor jedem Lauf, ob die offizielle OCR-CLI vorhanden ist. Fehlt ocr, wird sie automatisch nachinstalliert:

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

OCR benötigt weiterhin seine eigene LLM-Konfiguration, bevor ein Review laufen kann:

ocr llm test

Die Installation dieses Pi-Pakets konfiguriert keine API-Schlüssel und ändert nicht den Modell-Provider von Pi selbst — OCR verwendet ausschließlich seine eigene, separat konfigurierte LLM-Anbindung (siehe Konfiguration).

Installation

Über npm (empfohlen):

pi install npm:pi-open-code-review

Für die lokale Entwicklung aus einem Checkout heraus:

pi install /pfad/zu/pi-open-code-review

Für einen einmaligen Testlauf, ohne das Paket dauerhaft in die Einstellungen zu übernehmen:

pi -e /pfad/zu/pi-open-code-review

Nutzung

/ocr ist der einzige vom Paket bereitgestellte Slash-Command. Er unterstützt sowohl natürlichsprachliche Anfragen als auch präzise OCR-Unterbefehle. reviewfix und scan sind dabei Unterbefehle, die auf OCR-Workflows abgebildet werden — keine eigenständigen Pi-Befehle:

/ocr review
/ocr review --from main --to feature-branch
/ocr review --commit abc123
/ocr fix --from main --to feature-branch
/ocr scan --path src

Natürlichsprachliche /ocr-Eingaben werden an den Pi-Agenten zurückgeleitet, der mit Hilfe des open-code-review-Skills selbst entscheidet, ob ein Arbeitsbereich-Review, ein vollständiger Datei-Scan, ein Commit-Review, ein Branch-Vergleich oder ein Fix-Workflow angebracht ist:

/ocr Review meine aktuellen, noch nicht committeten Änderungen.
/ocr Schau dir den Code unter src/auth an — Fokus auf Sicherheitsprobleme.
/ocr Vergleiche diesen Branch mit main und reviewe die Unterschiede.

Der präzise Modus greift automatisch, sobald der Text mit reviewfixscan oder einem Flag wie --commit beginnt. Intern führt die Extension OCR mit maschinenlesbarer Ausgabe aus:

ocr review --format json --audience agent
# bzw. für den Scan-Modus:
ocr scan --format json --audience agent

Verhalten

  • Der Standard-Review prüft Staged-, Unstaged- und Untracked-Änderungen im Arbeitsbereich — identisch zum Verhalten der reinen OCR-CLI.
  • Fehlt ocr, versucht /ocr die offizielle @alibaba-group/open-code-review-CLI nachzuinstallieren (analog zum Codex-Plugin-Ablauf).
  • Vor jedem Review führt /ocr zunächst ocr llm test aus und stoppt mit einer Setup-Anleitung, falls OCRs Modell-Provider nicht konfiguriert ist.
  • /ocr fix bedeutet: zunächst reviewen, danach Pi bitten, präzise High- und Medium-Befunde zu beheben.
  • /ocr review --preview und /ocr scan --preview zeigen OCRs Text-Vorschau direkt an, statt JSON zu erzwingen.
  • /ocr review bearbeitet nie Dateien, außer der Nutzer bittet ausdrücklich um eine Behebung (Fix).
  • Bei natürlichsprachlichen /ocr-Anfragen interpretiert der Pi-Agent die Anfrage über den open-code-review-Skill, statt sie als OCR-Flags zu parsen.
  • Befunde mit geringer Konfidenz werden von den Skill-Regeln standardmäßig herausgefiltert, außer der Nutzer bittet explizit um alle Kommentare.
  • Das Paket leitet nur eine konservative Allowlist an OCR-Flags durch, um unbeabsichtigtes Shell-Verhalten zu vermeiden.

FAQ — häufige Probleme

Konfiguration & Start

no valid LLM endpoint configured OCR hat die komplette Endpunkt-Auflösungskette durchlaufen und kein vollständiges (URL, Token, Modell)-Tripel gefunden. Entweder ocr config set llm.url/llm.auth_token/llm.model setzen, OCR_LLM_URL/OCR_LLM_TOKEN/OCR_LLM_MODEL exportieren, oder — bei bereits vorhandenem Claude-Code-Setup — ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN/ANTHROPIC_MODEL exportieren. Danach ocr llm test zur Verifikation.

ocr llm test zeigt die falsche Quelle OCR nutzt das erste vollständige Tripel, nicht das letzte. Enthält die Konfigurationsdatei bereits alle drei llm.*-Schlüssel, werden Umgebungsvariablen ignoriert. Um der Umgebung Vorrang zu geben: Konfigurationsschlüssel löschen oder auf die neuen Werte umsetzen.

401 / 403 von ocr llm test Token fehlt Scope, ist abgelaufen oder falscher Anbieter. Anthropic und OpenAI nutzen unterschiedliche Auth-Header und URL-Formen — llm.use_anthropic muss zur URL passen: Anthropic-URLs enden auf /v1/messages (use_anthropic=true), OpenAI-kompatible auf /v1/chat/completions (use_anthropic=false).

not a git repository ocr review läuft git diff gegen das aktuelle Verzeichnis. Entweder ins Repo wechseln oder --repo /pfad/zum/repo übergeben.

„No tool calls parsed“ (lokale Modelle / Ollama)

[ocr] No tool calls parsed for src/foo.go, retrying...
[ocr] Max tool requests reached for src/foo.go.

OCR steuert den Review vollständig über Tool-Aufrufe. Das Modell muss natives Tool-Calling unterstützen. Ein Modell, das Tool-Aufrufe nur im Text (oder in <think>-Blöcken) beschreibt, funktioniert nicht mit OCR, egal wie der Prompt angepasst wird (qwen3.8-27B ist ein gängiges Beispiel). Modelle mit nativer Tool-Unterstützung, z. B. qwen3, funktionieren einwandfrei. Für Ollama: Modelle mit Tools-Tag verwenden (https://ollama.com/search?c=tools).

Unterstützt das Modell Tools, ist aber auf lokaler Hardware langsam: LLM-Timeout erhöhen (siehe Timeouts).

Filterung & Regeln

Meine Datei wird nicht reviewt ocr review --preview (kostenlos) zeigt jede Kandidatendatei mit dem Grund für Behalten/Verwerfen:

GrundLösung
binarynichts zu tun — Binärdateien haben keinen reviewbaren Text
user_excludeMuster aus der eigenen exclude-Liste entfernen
unsupported_extEndung zur include-Liste hinzufügen
default_pathDatei zu include hinzufügen — überschreibt eingebaute Testdatei-Ausschlüsse
deletednichts zu tun — kein neuer Inhalt zum Reviewen

Meine benutzerdefinierte Regel feuert nicht ocr rules check <file-path> zeigt Schicht und Glob-Muster durchgängig. Falsche Schicht meist wegen Deklarationsreihenfolge — spezifischere Regel weiter nach vorne in rules verschieben.

Klammererweiterung funktioniert nicht {ts, tsx} mit Leerzeichen matcht tsx still nicht — Leerzeichen entfernen.

Reviews

Datei zeigt null Kommentare — wurde sie überhaupt reviewt? ocr viewer öffnen, die main_task-Spur der Datei prüfen: Tool-Aufrufe + endet mit task_done = sauberer Review. Kein main_task-Block = Datei wurde vor dem Review gefiltert (siehe Filterung & Regeln oben).

Kommentare mit start_line: 0 und end_line: 0 OCR konnte den Kommentar nicht präzise verankern — meist paraphrasierter existing_code oder ungewöhnliche Diff-Formatierung (CRLF, gemischte Tabs/Spaces). Der Kommentar ist trotzdem real, nur nicht automatisch platziert.

Token-Schwelle überschritten

[ocr] WARNING: prompt tokens (94000) exceed 80% of max_tokens(58888) for src/big.sql

Datei zum exclude hinzufügen (falls autogeneriert), großen Refactor in kleinere Commits aufteilen, oder --commit-Modus für eine Serie kleiner Commits nutzen.

Planungsphase dauert lange bei kleiner Datei ocr review --preview prüfen — liegt lines.changed über PLAN_MODE_LINE_THRESHOLD (Standard 50), läuft die Planungsphase absichtlich.

„Max tool requests reached“ Modell hat 30 (MAX_TOOL_REQUEST_TIMES) Runden ohne task_done verbraucht. Bereits erzeugte Kommentare bleiben erhalten. Häufige Ursachen: Modell befolgt „task_done bei Fertigstellung“ nicht gut genug (stärkeres Modell wählen), ein Tool schlägt wiederholt fehl, oder die Datei ist schlicht groß (--max-tools <n> anpassen).

Manche Sub-Agenten scheitern; der Lauf gibt trotzdem Exit-Code 0 Das ist Beabsichtigt. Ein fehlerhafter Sub-Agent soll nicht einen 20-Dateien-Review kippen. Exit-Code 0, sobald irgendetwas erfolgreich war; nur ein vollständig fehlgeschlagener Lauf (null erfolgreiche Sub-Agenten) liefert einen Fehler-Exit-Code.

CI-Lauf ist deutlich langsamer als lokal Meist Modell-Rate-Limits (--concurrency senken) oder kalter Cache (erster Lauf nach Deploy profitiert nicht vom Prompt-Caching).

Ausgabe & Integration

--audience agent zeigt trotzdem Fortschrittszeilen Das ist vermutlich stderr. Zum vollständigen Unterdrücken: ocr review --audience agent 2>/dev/null.

JSON-Ausgabe ist { "files_reviewed": 0, "comments": [] } Absichtlich — unterscheidet „nichts zu reviewen“ von „keine Befunde in reviewten Dateien“ (dann schlicht ein leeres []).

Wo liegen Session-JSONLs?

~/.opencodereview/sessions/<path-encoded-repo-path>/<session-id>.jsonl

Pfadkodierung: / und \ → -: → _. Mit ocr viewer durchstöbern; Verzeichnis löschen für kompletten Verlaufs-Reset.

Performance & Kosten

Wie sehe ich, was Tokens kosten? Telemetrie aktivieren und ocr.llm.tokens_usedocr.llm.requests_totalocr.llm.request_duration_seconds beobachten (siehe Telemetrie).

Warum sind meine Reviews so teuer? Planungsphase kostet einen extra LLM-Aufruf ab 50 Zeilen; MAX_TOOL_REQUEST_TIMES = 30 ist großzügig bemessen — je mehr Runden genutzt werden, desto teurer; Speicherkompression selbst ist ein LLM-Aufruf.

Wie reduziere ich LLM-Aufrufe? include-Liste einschränken, --concurrency bei Burst-Preisen senken, --background nutzen (oft entfallen dadurch file_read/code_search-Roundtrips).

Datenschutz & Sicherheit

Sendet OCR meinen Code irgendwohin? OCR sendet Diffs (und optional Read-Tool-Ausschnitte) an den konfigurierten LLM-Endpunkt. Sonst verlässt nichts die eigene Maschine. Session-JSONLs und Regeldateien sind rein lokal. Das content_logging-Flag gatet aktuell keinen Codepfad. Prompt-/Antwortinhalte werden nie an einen Collector exportiert, unabhängig vom Wert.

Kann ich Geheimnisse vor dem Senden redigieren? Kein eingebautes Feature. Empfohlen: Secrets grundsätzlich nicht committen, Dateien mit Secret-Material in exclude aufnehmen, git diff --no-textconv-Filter oder Pre-Commit-Redaktion nutzen. Eine native „Redaktionsregel“ ist auf der Roadmap.

Deinstallation

npm uninstall -g @alibaba-group/open-code-review        # NPM-Installation
sudo rm /usr/local/bin/ocr                              # Binary-Installation
rm -rf ~/.opencodereview                                # kompletter Zustand

Schnellreferenz-Tabellen

Wichtigste Standardwerte

EinstellungStandardwert
Prompt-Token-Obergrenze pro Datei (MAX_TOKENS)58.888
Maximale Tool-Aufruf-Runden pro Datei30
Concurrency (parallele Dateien)8
Timeout pro Datei10 Minuten
LLM-HTTP-Timeout300 Sekunden
Schwellwert für die Planungsphase50 geänderte Zeilen
Diff-Kontextzeilen3
Viewer-Standardadresselocalhost:5483
NPM-Update-Cooldown18 Minuten

Wichtigste Umgebungsvariablen

VariableZweck
OCR_LLM_URL / OCR_LLM_TOKEN / OCR_LLM_MODELEndpunkt-Trias (Fallback-Ebene)
ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN / ANTHROPIC_MODELWiederverwendung der Claude-Code-Konfiguration
OCR_LLM_TIMEOUTLLM-Anfrage-Timeout in Sekunden
OCR_NO_UPDATEAutomatische NPM-Updates deaktivieren
OCR_UPDATE_INTERVALUpdate-Check-Intervall in Minuten
OCR_ENABLE_TELEMETRYTelemetrie aktivieren
OTEL_EXPORTER_OTLP_ENDPOINT / _PROTOCOLOTLP-Zielkonfiguration
OCR_VIEWER_ALLOWED_HOSTSWildcard-Host-Allowlist für den Viewer
OCR_CONTENT_LOGGINGreserviert, derzeit wirkungslos

Wichtigste Dateipfade

PfadInhalt
~/.opencodereview/config.jsonZentrale Konfiguration
~/.opencodereview/rule.jsonGlobale Regeln
<repo>/.opencodereview/rule.jsonProjektregeln
~/.opencodereview/sessions/…JSONL-Session-Transkripte

Diese Anleitung wurde auf Basis der offiziellen OCR-Dokumentation (open-codereview.ai) zusammengestellt und ins Deutsche übertragen. Für die jeweils aktuellste Fassung und den Quellcode siehe das GitHub-Repository.