@alibaba-group/open-code-review 1.6.4 → 1.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja-JP.md +47 -3
- package/README.ko-KR.md +45 -1
- package/README.md +45 -1
- package/README.ru-RU.md +45 -1
- package/README.zh-CN.md +45 -1
- package/imgs/benchmark-en.png +0 -0
- package/imgs/benchmark-ja.png +0 -0
- package/imgs/benchmark-zh.png +0 -0
- package/imgs/highlights-en.png +0 -0
- package/imgs/highlights-ja.png +0 -0
- package/imgs/highlights-zh.png +0 -0
- package/package.json +7 -7
package/README.ja-JP.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://goreportcard.com/report/github.com/alibaba/open-code-review"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/alibaba/open-code-review?style=flat-square" /></a>
|
|
17
17
|
<a href="https://github.com/alibaba/open-code-review/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/alibaba/open-code-review?style=flat-square" /></a>
|
|
18
18
|
<a href="https://deepwiki.com/alibaba/open-code-review"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
|
|
19
|
-
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://
|
|
19
|
+
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://img.shields.io/badge/OpenSSF-Silver-4C566A?style=flat-square" /></a>
|
|
20
20
|
</p>
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#supported-platforms"><img alt="Windows" src="https://img.shields.io/badge/Windows-supported-blue.svg" /></a>
|
|
@@ -38,7 +38,9 @@ Open Code ReviewはAIを活用したコードレビューCLIツールです。
|
|
|
38
38
|
|
|
39
39
|
Gitのdiffを読み取り、変更されたファイルをツール利用機能を持つエージェント経由で設定可能なLLMに送信し、行レベルの精度で構造化されたレビューコメントを生成します。エージェントはファイル全体の内容を読み取り、コードベースを検索し、コンテキストのために他の変更ファイルを参照し、深いレビューを生成できます — 単なる表面的なdiffへのフィードバックではありません。diffレビュー以外にも、`ocr scan` はファイル全体をレビューできます。不慣れなコードベースの監査や、意味のあるdiffがないディレクトリの検査に便利です。
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
詳細は[公式サイト](https://alibaba.github.io/open-code-review/)をご覧ください。
|
|
42
|
+
|
|
43
|
+

|
|
42
44
|
|
|
43
45
|
## ベンチマーク
|
|
44
46
|
|
|
@@ -54,7 +56,7 @@ Gitのdiffを読み取り、変更されたファイルをツール利用機能
|
|
|
54
56
|
| **平均時間 (Avg Time)** | レビューあたりの実時間 | CIパイプラインの待機時間に影響 |
|
|
55
57
|
| **平均トークン (Avg Token)** | レビューあたりの総トークン消費量 | APIコストに直接影響 |
|
|
56
58
|
|
|
57
|
-

|
|
58
60
|
|
|
59
61
|
## なぜOpen Code Reviewなのか?
|
|
60
62
|
|
|
@@ -565,6 +567,45 @@ OCRは4層の優先度チェーンを使ってレビュールールを解決し
|
|
|
565
567
|
- 各層の中では、ルールは宣言順に評価されます — 最初にマッチしたものが採用されます。
|
|
566
568
|
- ルールファイルが存在しない場合は、何も出力せずスキップされます。
|
|
567
569
|
|
|
570
|
+
**`rule` フィールドはインラインコンテンツとファイルパスの両方をサポートします。** システムは次の順序で自動判別します:
|
|
571
|
+
|
|
572
|
+
1. 値に改行が含まれる → **インラインコンテンツ**(複数行ルールがファイルパスと見なされることはありません)。
|
|
573
|
+
2. 値が単一行で、スペースを含まず、`.md` / `.txt` / `.markdown` で終わる → **ファイルパス**。
|
|
574
|
+
- 絶対パス(`/` で始まる)はそのまま使用されます。
|
|
575
|
+
- 相対パスはプロジェクトルートで解決されます。パストラバーサル(例: `../../etc/passwd.md`)はブロックされます。見つからない場合は `[WARN]` を出力し、ルールはクリアされます(インラインへのフォールバックなし)。
|
|
576
|
+
- ファイルはバリデーションを通過する必要があります:ホワイトリスト拡張子、≤ 512 KB、シンボリックリンク解決後のターゲットもホワイトリスト拡張子であること。バリデーションに失敗した場合、ルールはクリアされます。
|
|
577
|
+
3. それ以外 → **インラインコンテンツ**。
|
|
578
|
+
|
|
579
|
+
```json
|
|
580
|
+
{
|
|
581
|
+
"rules": [
|
|
582
|
+
{
|
|
583
|
+
"path": "**/*mapper*.xml",
|
|
584
|
+
"rule": "docs/sql-rules.md"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"path": "**/*.java",
|
|
588
|
+
"rule": "Always check for null safety and resource leaks"
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
"path": "**/*.go",
|
|
592
|
+
"rule": "shared/go-concurrency.md"
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"path": "**/*.py",
|
|
596
|
+
"rule": "/Users/me/team-rules/python.md"
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
- `docs/sql-rules.md` — 相対パス、`<project>/docs/sql-rules.md` から読み込み。
|
|
603
|
+
- `Always check for null safety…` — インライン文字列、そのまま使用。
|
|
604
|
+
- `shared/go-concurrency.md` — 相対パス、同様に解決。
|
|
605
|
+
- `/Users/me/team-rules/python.md` — 絶対パス、そのまま使用。
|
|
606
|
+
|
|
607
|
+
> 絶対パスはプロジェクト外のファイルにアクセスできますが、これは意図的な設計です。`rule.json` はメンテナが作成する信頼された入力のためです。共有ルールを共通パス(例:`/opt/company-rules/`)に置くことで、各プロジェクトへのコピーが不要になります。
|
|
608
|
+
|
|
568
609
|
### パスフィルタリング
|
|
569
610
|
|
|
570
611
|
ルールファイルでは `include` と `exclude` フィールドも使用でき、どのファイルをレビュー対象にするかを制御できます:
|
|
@@ -621,12 +662,14 @@ OCRは4層の優先度チェーンを使ってレビュールールを解決し
|
|
|
621
662
|
| `providers.<name>.models` | array | 対話的選択に使う任意のプロバイダーモデル一覧 |
|
|
622
663
|
| `providers.<name>.auth_header` | string | `x-api-key` \| `authorization` |
|
|
623
664
|
| `providers.<name>.extra_body` | object | すべてのリクエストボディにマージされるJSONオブジェクト |
|
|
665
|
+
| `providers.<name>.timeout_sec` | integer | リクエストごとのHTTPタイムアウト(秒)、デフォルト `300` |
|
|
624
666
|
| `providers.<name>.extra_headers` | string | カンマ区切りの `key=value` HTTPヘッダー |
|
|
625
667
|
| `custom_providers.<name>.*` | — | 任意の`models`を含む`providers.<name>.*`と同じフィールド |
|
|
626
668
|
| `llm.url` | string | `https://api.openai.com/v1/chat/completions` |
|
|
627
669
|
| `llm.auth_token` | string | `sk-xxxxxxx` |
|
|
628
670
|
| `llm.auth_header` | string | Anthropicのみ:`x-api-key` \| `authorization` |
|
|
629
671
|
| `llm.extra_body` | object | すべてのリクエストボディにマージされるJSONオブジェクト |
|
|
672
|
+
| `llm.timeout_sec` | integer | リクエストごとのHTTPタイムアウト(秒)、デフォルト `300` |
|
|
630
673
|
| `llm.extra_headers` | string | カンマ区切りの `key=value` HTTPヘッダー |
|
|
631
674
|
| `llm.model` | string | `claude-opus-4-6` |
|
|
632
675
|
| `llm.use_anthropic` | boolean | `true` \| `false` |
|
|
@@ -647,6 +690,7 @@ OCRは4層の優先度チェーンを使ってレビュールールを解決し
|
|
|
647
690
|
| `OCR_LLM_AUTH_HEADER` | Anthropic認証ヘッダー(`x-api-key`または`authorization`) |
|
|
648
691
|
| `OCR_LLM_EXTRA_HEADERS` | カンマ区切りの `key=value` HTTPヘッダー |
|
|
649
692
|
| `OCR_LLM_MODEL` | モデル名 |
|
|
693
|
+
| `OCR_LLM_TIMEOUT` | リクエストごとのHTTPタイムアウト(秒)、設定ファイルの `timeout_sec` を上書き |
|
|
650
694
|
| `OCR_USE_ANTHROPIC` | `true` = Anthropic、`false` = OpenAI |
|
|
651
695
|
|
|
652
696
|
|
package/README.ko-KR.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://goreportcard.com/report/github.com/alibaba/open-code-review"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/alibaba/open-code-review?style=flat-square" /></a>
|
|
17
17
|
<a href="https://github.com/alibaba/open-code-review/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/alibaba/open-code-review?style=flat-square" /></a>
|
|
18
18
|
<a href="https://deepwiki.com/alibaba/open-code-review"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
|
|
19
|
-
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://
|
|
19
|
+
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://img.shields.io/badge/OpenSSF-Silver-4C566A?style=flat-square" /></a>
|
|
20
20
|
</p>
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#supported-platforms"><img alt="Windows" src="https://img.shields.io/badge/Windows-supported-blue.svg" /></a>
|
|
@@ -38,6 +38,8 @@ Open Code Review는 AI 기반 코드 리뷰 CLI 도구입니다. Alibaba Group
|
|
|
38
38
|
|
|
39
39
|
이 도구는 Git diff를 읽고, 변경 파일을 tool-use 기능을 가진 agent를 통해 설정 가능한 LLM으로 전달한 뒤, 라인 단위 위치 정보가 포함된 구조화된 리뷰 코멘트를 생성합니다. agent는 전체 파일 내용 읽기, 코드베이스 검색, 다른 변경 파일 확인 등을 통해 맥락을 확보하고 표면적인 diff 피드백이 아닌 깊이 있는 리뷰를 수행할 수 있습니다. diff 리뷰 외에도 `ocr scan`은 전체 파일을 리뷰할 수 있어, 익숙하지 않은 코드베이스를 감사하거나 의미 있는 diff가 없는 디렉터리를 검토하는 데 유용합니다.
|
|
40
40
|
|
|
41
|
+
자세한 내용은 [공식 웹사이트](https://alibaba.github.io/open-code-review/)를 참조하세요.
|
|
42
|
+
|
|
41
43
|

|
|
42
44
|
|
|
43
45
|
## 벤치마크
|
|
@@ -565,6 +567,45 @@ OCR은 네 계층의 priority chain으로 review rule을 해석합니다. 각
|
|
|
565
567
|
- 각 계층 안에서는 rule이 선언 순서대로 평가되며 첫 번째 match가 선택됩니다.
|
|
566
568
|
- rule file이 없으면 조용히 건너뜁니다.
|
|
567
569
|
|
|
570
|
+
**`rule` 필드는 인라인 콘텐츠와 파일 경로를 모두 지원합니다.** 시스템이 다음 순서로 자동 판별합니다:
|
|
571
|
+
|
|
572
|
+
1. 값에 줄바꿈이 포함된 경우 → **인라인 콘텐츠** (여러 줄 규칙은 파일 경로로 간주되지 않습니다).
|
|
573
|
+
2. 값이 한 줄이고 공백이 없으며 `.md` / `.txt` / `.markdown`으로 끝나는 경우 → **파일 경로**.
|
|
574
|
+
- 절대 경로(`/`로 시작)는 그대로 사용됩니다.
|
|
575
|
+
- 상대 경로는 프로젝트 루트에서 확인합니다. 경로 탐색(예: `../../etc/passwd.md`)은 차단됩니다. 없으면 `[WARN]`을 출력하고 규칙이 지워집니다 (인라인으로 폴백 없음).
|
|
576
|
+
- 파일은 유효성 검사를 통과해야 합니다: 허용된 확장자, ≤ 512 KB, 심볼릭 링크 해석 후 대상도 허용된 확장자여야 합니다. 검증 실패 시 규칙이 지워집니다.
|
|
577
|
+
3. 그 외의 경우 → **인라인 콘텐츠**.
|
|
578
|
+
|
|
579
|
+
```json
|
|
580
|
+
{
|
|
581
|
+
"rules": [
|
|
582
|
+
{
|
|
583
|
+
"path": "**/*mapper*.xml",
|
|
584
|
+
"rule": "docs/sql-rules.md"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"path": "**/*.java",
|
|
588
|
+
"rule": "Always check for null safety and resource leaks"
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
"path": "**/*.go",
|
|
592
|
+
"rule": "shared/go-concurrency.md"
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"path": "**/*.py",
|
|
596
|
+
"rule": "/Users/me/team-rules/python.md"
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
- `docs/sql-rules.md` — 상대 경로, `<project>/docs/sql-rules.md`에서 로드.
|
|
603
|
+
- `Always check for null safety…` — 인라인 문자열, 그대로 사용.
|
|
604
|
+
- `shared/go-concurrency.md` — 상대 경로, 동일하게 해결.
|
|
605
|
+
- `/Users/me/team-rules/python.md` — 절대 경로, 그대로 사용.
|
|
606
|
+
|
|
607
|
+
> 절대 경로는 프로젝트 외부 파일에 접근할 수 있으며, 이는 의도된 설계입니다. `rule.json`은 프로젝트 메인테이너가 작성하는 신뢰된 입력입니다. 팀은 공유 규칙을 공통 경로(예: `/opt/company-rules/`)에 두어 각 프로젝트에 복사할 필요가 없습니다.
|
|
608
|
+
|
|
568
609
|
## Configuration Reference
|
|
569
610
|
|
|
570
611
|
Config file: `~/.opencodereview/config.json`
|
|
@@ -579,12 +620,14 @@ Config file: `~/.opencodereview/config.json`
|
|
|
579
620
|
| `providers.<name>.models` | array | 대화형 선택에 사용할 optional provider model 목록 |
|
|
580
621
|
| `providers.<name>.auth_header` | string | `x-api-key` \| `authorization` |
|
|
581
622
|
| `providers.<name>.extra_body` | object | 모든 요청 본문에 병합되는 JSON 객체 |
|
|
623
|
+
| `providers.<name>.timeout_sec` | integer | 요청당 HTTP timeout(초), 기본값 `300` |
|
|
582
624
|
| `providers.<name>.extra_headers` | string | 쉼표로 구분된 `key=value` HTTP 헤더 |
|
|
583
625
|
| `custom_providers.<name>.*` | — | optional `models`를 포함한 `providers.<name>.*`과 동일한 필드 |
|
|
584
626
|
| `llm.url` | string | `https://api.openai.com/v1/chat/completions` |
|
|
585
627
|
| `llm.auth_token` | string | `sk-xxxxxxx` |
|
|
586
628
|
| `llm.auth_header` | string | Anthropic only: `x-api-key` \| `authorization` |
|
|
587
629
|
| `llm.extra_body` | object | 모든 요청 본문에 병합되는 JSON 객체 |
|
|
630
|
+
| `llm.timeout_sec` | integer | 요청당 HTTP timeout(초), 기본값 `300` |
|
|
588
631
|
| `llm.extra_headers` | string | 쉼표로 구분된 `key=value` HTTP 헤더 |
|
|
589
632
|
| `llm.model` | string | `claude-opus-4-6` |
|
|
590
633
|
| `llm.use_anthropic` | boolean | `true` \| `false` |
|
|
@@ -605,6 +648,7 @@ Config file: `~/.opencodereview/config.json`
|
|
|
605
648
|
| `OCR_LLM_AUTH_HEADER` | Anthropic auth header (`x-api-key` 또는 `authorization`) |
|
|
606
649
|
| `OCR_LLM_EXTRA_HEADERS` | 쉼표로 구분된 `key=value` HTTP 헤더 |
|
|
607
650
|
| `OCR_LLM_MODEL` | Model name |
|
|
651
|
+
| `OCR_LLM_TIMEOUT` | 요청당 HTTP timeout(초), config file의 `timeout_sec`를 override |
|
|
608
652
|
| `OCR_USE_ANTHROPIC` | `true` = Anthropic, `false` = OpenAI |
|
|
609
653
|
|
|
610
654
|
## Telemetry
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://goreportcard.com/report/github.com/alibaba/open-code-review"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/alibaba/open-code-review?style=flat-square" /></a>
|
|
17
17
|
<a href="https://github.com/alibaba/open-code-review/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/alibaba/open-code-review?style=flat-square" /></a>
|
|
18
18
|
<a href="https://deepwiki.com/alibaba/open-code-review"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
|
|
19
|
-
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://
|
|
19
|
+
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://img.shields.io/badge/OpenSSF-Silver-4C566A?style=flat-square" /></a>
|
|
20
20
|
</p>
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#supported-platforms"><img alt="Windows" src="https://img.shields.io/badge/Windows-supported-blue.svg" /></a>
|
|
@@ -38,6 +38,8 @@ Open Code Review is an AI-powered code review CLI tool. It originated as Alibaba
|
|
|
38
38
|
|
|
39
39
|
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.
|
|
40
40
|
|
|
41
|
+
Visit the [official website](https://alibaba.github.io/open-code-review/) for more details.
|
|
42
|
+
|
|
41
43
|

|
|
42
44
|
|
|
43
45
|
## Benchmark
|
|
@@ -570,6 +572,45 @@ Layers 1–3 share the same JSON format:
|
|
|
570
572
|
- Within each layer, rules are evaluated in declaration order — the first match wins.
|
|
571
573
|
- If a rule file does not exist, it is silently skipped.
|
|
572
574
|
|
|
575
|
+
**The `rule` field supports both inline content and file paths.** The system auto-detects which one you mean:
|
|
576
|
+
|
|
577
|
+
1. If the value contains newlines → **inline content** (multi-line rules are never file paths).
|
|
578
|
+
2. If the value is a single line, contains no spaces, and ends with `.md` / `.txt` / `.markdown` → **file path**.
|
|
579
|
+
- Absolute paths (starting with `/`) are used directly.
|
|
580
|
+
- Relative paths are resolved against the project root. Path traversal (e.g. `../../etc/passwd.md`) is blocked. If not found, a `[WARN]` is emitted and the rule is cleared (no fallback to inline).
|
|
581
|
+
- The file must pass validation: whitelisted extension, ≤ 512 KB, and resolved symlink target must also be a whitelisted extension. If validation fails, the rule is cleared.
|
|
582
|
+
3. Otherwise → **inline content**.
|
|
583
|
+
|
|
584
|
+
```json
|
|
585
|
+
{
|
|
586
|
+
"rules": [
|
|
587
|
+
{
|
|
588
|
+
"path": "**/*mapper*.xml",
|
|
589
|
+
"rule": "docs/sql-rules.md"
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"path": "**/*.java",
|
|
593
|
+
"rule": "Always check for null safety and resource leaks"
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"path": "**/*.go",
|
|
597
|
+
"rule": "shared/go-concurrency.md"
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
"path": "**/*.py",
|
|
601
|
+
"rule": "/Users/me/team-rules/python.md"
|
|
602
|
+
}
|
|
603
|
+
]
|
|
604
|
+
}
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
- `docs/sql-rules.md` — relative path, resolved from `<project>/docs/sql-rules.md`.
|
|
608
|
+
- `Always check for null safety…` — inline string, used directly.
|
|
609
|
+
- `shared/go-concurrency.md` — relative path, same resolution.
|
|
610
|
+
- `/Users/me/team-rules/python.md` — absolute path, used directly.
|
|
611
|
+
|
|
612
|
+
> Absolute paths can access files outside the project directory — this is intentional. `rule.json` is authored by project maintainers, i.e. trusted input. Teams can store shared rules at a common path (e.g. `/opt/company-rules/`) instead of copying them into every project.
|
|
613
|
+
|
|
573
614
|
### Path Filtering
|
|
574
615
|
|
|
575
616
|
Rule files also support `include` and `exclude` fields to control which files enter the review scope:
|
|
@@ -626,12 +667,14 @@ Config file: `~/.opencodereview/config.json`
|
|
|
626
667
|
| `providers.<name>.models` | array | Optional provider model list for interactive selection |
|
|
627
668
|
| `providers.<name>.auth_header` | string | `x-api-key` \| `authorization` |
|
|
628
669
|
| `providers.<name>.extra_body` | object | JSON object merged into every request body |
|
|
670
|
+
| `providers.<name>.timeout_sec` | integer | Per-request HTTP timeout in seconds (default: `300`) |
|
|
629
671
|
| `providers.<name>.extra_headers` | string | Comma-separated `key=value` HTTP headers |
|
|
630
672
|
| `custom_providers.<name>.*` | — | Same fields as `providers.<name>.*`, including optional `models` |
|
|
631
673
|
| `llm.url` | string | `https://api.openai.com/v1/chat/completions` |
|
|
632
674
|
| `llm.auth_token` | string | `sk-xxxxxxx` |
|
|
633
675
|
| `llm.auth_header` | string | Anthropic only: `x-api-key` \| `authorization` |
|
|
634
676
|
| `llm.extra_body` | object | JSON object merged into every request body |
|
|
677
|
+
| `llm.timeout_sec` | integer | Per-request HTTP timeout in seconds (default: `300`) |
|
|
635
678
|
| `llm.extra_headers` | string | Comma-separated `key=value` HTTP headers |
|
|
636
679
|
| `llm.model` | string | `claude-opus-4-6` |
|
|
637
680
|
| `llm.use_anthropic` | boolean | `true` \| `false` |
|
|
@@ -652,6 +695,7 @@ Environment variables take precedence over the config file.
|
|
|
652
695
|
| `OCR_LLM_AUTH_HEADER` | Anthropic auth header (`x-api-key` or `authorization`) |
|
|
653
696
|
| `OCR_LLM_EXTRA_HEADERS` | Comma-separated `key=value` HTTP headers |
|
|
654
697
|
| `OCR_LLM_MODEL` | Model name |
|
|
698
|
+
| `OCR_LLM_TIMEOUT` | Per-request HTTP timeout in seconds (overrides config file `timeout_sec`) |
|
|
655
699
|
| `OCR_USE_ANTHROPIC` | `true` = Anthropic, `false` = OpenAI |
|
|
656
700
|
|
|
657
701
|
|
package/README.ru-RU.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://goreportcard.com/report/github.com/alibaba/open-code-review"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/alibaba/open-code-review?style=flat-square" /></a>
|
|
17
17
|
<a href="https://github.com/alibaba/open-code-review/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/alibaba/open-code-review?style=flat-square" /></a>
|
|
18
18
|
<a href="https://deepwiki.com/alibaba/open-code-review"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
|
|
19
|
-
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://
|
|
19
|
+
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://img.shields.io/badge/OpenSSF-Silver-4C566A?style=flat-square" /></a>
|
|
20
20
|
</p>
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#supported-platforms"><img alt="Windows" src="https://img.shields.io/badge/Windows-supported-blue.svg" /></a>
|
|
@@ -38,6 +38,8 @@ Open Code Review — это CLI-инструмент для код-ревью н
|
|
|
38
38
|
|
|
39
39
|
Инструмент читает git-диффы, отправляет изменённые файлы настраиваемой LLM через агента с поддержкой вызова инструментов (tool use) и генерирует структурированные ревью-комментарии с точностью до строки. Агент может читать полное содержимое файлов, искать по кодовой базе, заглядывать в другие изменённые файлы за контекстом и выполнять глубокое ревью — а не только давать поверхностные замечания по диффу. Помимо ревью диффов, `ocr scan` позволяет проверять файлы целиком — удобно для аудита незнакомой кодовой базы или каталогов без значимого диффа.
|
|
40
40
|
|
|
41
|
+
Подробнее на [официальном сайте](https://alibaba.github.io/open-code-review/).
|
|
42
|
+
|
|
41
43
|

|
|
42
44
|
|
|
43
45
|
## Бенчмарк
|
|
@@ -567,6 +569,45 @@ OCR разрешает правила ревью по цепочке приор
|
|
|
567
569
|
- Внутри каждого уровня правила проверяются в порядке объявления — побеждает первое совпадение.
|
|
568
570
|
- Если файл правил не существует, он молча пропускается.
|
|
569
571
|
|
|
572
|
+
**Поле `rule` поддерживает как встроенный текст, так и пути к файлам.** Система определяет тип автоматически:
|
|
573
|
+
|
|
574
|
+
1. Если значение содержит переносы строк → **встроенный текст** (многострочные правила никогда не считаются путями).
|
|
575
|
+
2. Если значение — одна строка, без пробелов, и заканчивается на `.md` / `.txt` / `.markdown` → **путь к файлу**.
|
|
576
|
+
- Абсолютные пути (начинающиеся с `/`) используются напрямую.
|
|
577
|
+
- Относительные пути проверяются в корне проекта. Выход за пределы директории (например, `../../etc/passwd.md`) блокируется. Если не найдены — выводится `[WARN]` и правило очищается (без fallback на inline).
|
|
578
|
+
- Файл должен пройти проверку: допустимое расширение, ≤ 512 KB, цель симлинка также должна иметь допустимое расширение. При ошибке проверки правило очищается.
|
|
579
|
+
3. Иначе → **встроенный текст**.
|
|
580
|
+
|
|
581
|
+
```json
|
|
582
|
+
{
|
|
583
|
+
"rules": [
|
|
584
|
+
{
|
|
585
|
+
"path": "**/*mapper*.xml",
|
|
586
|
+
"rule": "docs/sql-rules.md"
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
"path": "**/*.java",
|
|
590
|
+
"rule": "Always check for null safety and resource leaks"
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
"path": "**/*.go",
|
|
594
|
+
"rule": "shared/go-concurrency.md"
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"path": "**/*.py",
|
|
598
|
+
"rule": "/Users/me/team-rules/python.md"
|
|
599
|
+
}
|
|
600
|
+
]
|
|
601
|
+
}
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
- `docs/sql-rules.md` — относительный путь, загружается из `<project>/docs/sql-rules.md`.
|
|
605
|
+
- `Always check for null safety…` — встроенная строка, используется напрямую.
|
|
606
|
+
- `shared/go-concurrency.md` — относительный путь, аналогично.
|
|
607
|
+
- `/Users/me/team-rules/python.md` — абсолютный путь, используется напрямую.
|
|
608
|
+
|
|
609
|
+
> Абсолютные пути могут указывать на файлы вне директории проекта — это сделано намеренно. `rule.json` пишут мейнтейнеры проекта, это доверенный ввод. Команды могут хранить общие правила по единому пути (например, `/opt/company-rules/`) и не копировать их в каждый проект.
|
|
610
|
+
|
|
570
611
|
### Фильтрация путей
|
|
571
612
|
|
|
572
613
|
Файлы правил также поддерживают поля `include` и `exclude`, управляющие тем, какие файлы попадают в область ревью:
|
|
@@ -623,12 +664,14 @@ OCR разрешает правила ревью по цепочке приор
|
|
|
623
664
|
| `providers.<name>.models` | array | Необязательный список моделей для интерактивного выбора |
|
|
624
665
|
| `providers.<name>.auth_header` | string | `x-api-key` \| `authorization` |
|
|
625
666
|
| `providers.<name>.extra_body` | object | JSON-объект, добавляемый в каждое тело запроса |
|
|
667
|
+
| `providers.<name>.timeout_sec` | integer | Таймаут HTTP-запроса в секундах, по умолчанию `300` |
|
|
626
668
|
| `providers.<name>.extra_headers` | string | HTTP-заголовки `key=value` через запятую |
|
|
627
669
|
| `custom_providers.<name>.*` | — | Те же поля, что и `providers.<name>.*`, включая необязательное `models` |
|
|
628
670
|
| `llm.url` | string | `https://api.openai.com/v1/chat/completions` |
|
|
629
671
|
| `llm.auth_token` | string | `sk-xxxxxxx` |
|
|
630
672
|
| `llm.auth_header` | string | Только для Anthropic: `x-api-key` \| `authorization` |
|
|
631
673
|
| `llm.extra_body` | object | JSON-объект, добавляемый в каждое тело запроса |
|
|
674
|
+
| `llm.timeout_sec` | integer | Таймаут HTTP-запроса в секундах, по умолчанию `300` |
|
|
632
675
|
| `llm.extra_headers` | string | HTTP-заголовки `key=value` через запятую |
|
|
633
676
|
| `llm.model` | string | `claude-opus-4-6` |
|
|
634
677
|
| `llm.use_anthropic` | boolean | `true` \| `false` |
|
|
@@ -649,6 +692,7 @@ OCR разрешает правила ревью по цепочке приор
|
|
|
649
692
|
| `OCR_LLM_AUTH_HEADER` | Заголовок авторизации Anthropic (`x-api-key` или `authorization`) |
|
|
650
693
|
| `OCR_LLM_EXTRA_HEADERS` | HTTP-заголовки `key=value` через запятую |
|
|
651
694
|
| `OCR_LLM_MODEL` | Имя модели |
|
|
695
|
+
| `OCR_LLM_TIMEOUT` | Таймаут HTTP-запроса в секундах (переопределяет `timeout_sec` из файла конфигурации) |
|
|
652
696
|
| `OCR_USE_ANTHROPIC` | `true` = Anthropic, `false` = OpenAI |
|
|
653
697
|
|
|
654
698
|
|
package/README.zh-CN.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<a href="https://goreportcard.com/report/github.com/alibaba/open-code-review"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/alibaba/open-code-review?style=flat-square" /></a>
|
|
17
17
|
<a href="https://github.com/alibaba/open-code-review/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/alibaba/open-code-review?style=flat-square" /></a>
|
|
18
18
|
<a href="https://deepwiki.com/alibaba/open-code-review"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg" /></a>
|
|
19
|
-
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://
|
|
19
|
+
<a href="https://www.bestpractices.dev/projects/13328"><img alt="OpenSSF Best Practices" src="https://img.shields.io/badge/OpenSSF-Silver-4C566A?style=flat-square" /></a>
|
|
20
20
|
</p>
|
|
21
21
|
<p align="center">
|
|
22
22
|
<a href="#supported-platforms"><img alt="Windows" src="https://img.shields.io/badge/Windows-supported-blue.svg" /></a>
|
|
@@ -38,6 +38,8 @@ Open Code Review 是一款 AI 驱动的代码审查 CLI 工具。它的前身是
|
|
|
38
38
|
|
|
39
39
|
它读取 Git diff,通过具备工具调用能力的 Agent 将变更文件发送至可配置的 LLM,生成具有行级精度的结构化审查意见。Agent 可以读取完整文件内容、搜索代码库、检查其他变更文件以获取上下文,从而进行深度审查——而非仅停留在表面的 diff 反馈。除了 diff 审查,`ocr scan` 可以审查整个文件,适用于审计不熟悉的代码库或没有有意义 diff 的目录。
|
|
40
40
|
|
|
41
|
+
访问[官方网站](https://alibaba.github.io/open-code-review/)了解更多信息。
|
|
42
|
+
|
|
41
43
|

|
|
42
44
|
|
|
43
45
|
## 基准测试
|
|
@@ -555,6 +557,45 @@ OCR 通过四层优先级链解析评审规则。每层采用首次匹配原则
|
|
|
555
557
|
- 在每一层内,规则按声明顺序评估 —— 首次匹配生效。
|
|
556
558
|
- 如果规则文件不存在,将被静默跳过。
|
|
557
559
|
|
|
560
|
+
**`rule` 字段同时支持内联内容和文件路径。**系统按以下顺序自动判断:
|
|
561
|
+
|
|
562
|
+
1. 如果值包含换行 → **内联内容**(多行规则永远不会被当作文件路径)。
|
|
563
|
+
2. 如果值是单行、不含空格、且以 `.md` / `.txt` / `.markdown` 结尾 → **文件路径**。
|
|
564
|
+
- 绝对路径(以 `/` 开头)直接使用。
|
|
565
|
+
- 相对路径在项目根目录下查找,路径穿越(如 `../../etc/passwd.md`)会被拦截。找不到则 `[WARN]` 并清空该规则(不会回退为内联)。
|
|
566
|
+
- 文件需通过安全校验:白名单扩展名、≤ 512 KB、symlink 解析后目标也必须是白名单扩展名。校验失败则清空该规则。
|
|
567
|
+
3. 否则 → **内联内容**。
|
|
568
|
+
|
|
569
|
+
```json
|
|
570
|
+
{
|
|
571
|
+
"rules": [
|
|
572
|
+
{
|
|
573
|
+
"path": "**/*mapper*.xml",
|
|
574
|
+
"rule": "docs/sql-rules.md"
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"path": "**/*.java",
|
|
578
|
+
"rule": "始终检查空值安全和资源泄漏"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"path": "**/*.go",
|
|
582
|
+
"rule": "shared/go-concurrency.md"
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"path": "**/*.py",
|
|
586
|
+
"rule": "/Users/me/team-rules/python.md"
|
|
587
|
+
}
|
|
588
|
+
]
|
|
589
|
+
}
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
- `docs/sql-rules.md` — 相对路径,从 `<project>/docs/sql-rules.md` 加载。
|
|
593
|
+
- `始终检查空值安全…` — 内联字符串,直接使用。
|
|
594
|
+
- `shared/go-concurrency.md` — 相对路径,同上。
|
|
595
|
+
- `/Users/me/team-rules/python.md` — 绝对路径,直接使用。
|
|
596
|
+
|
|
597
|
+
> 绝对路径可以访问项目目录之外的文件,这是有意为之的设计——`rule.json` 由项目维护者编写,属于受信输入。团队可将共享规则放在统一路径下(如 `/opt/company-rules/`),无需在各项目中复制。
|
|
598
|
+
|
|
558
599
|
### 路径过滤
|
|
559
600
|
|
|
560
601
|
规则文件同时支持 `include` 和 `exclude` 字段,用于控制哪些文件进入审查范围:
|
|
@@ -611,12 +652,14 @@ OCR 通过四层优先级链解析评审规则。每层采用首次匹配原则
|
|
|
611
652
|
| `providers.<name>.models` | array | 用于交互式选择的可选供应商模型列表 |
|
|
612
653
|
| `providers.<name>.auth_header` | string | `x-api-key` \| `authorization` |
|
|
613
654
|
| `providers.<name>.extra_body` | object | 合并到每个请求体的 JSON 对象 |
|
|
655
|
+
| `providers.<name>.timeout_sec` | integer | 每次请求的 HTTP 超时时间(秒),默认 `300` |
|
|
614
656
|
| `providers.<name>.extra_headers` | string | 逗号分隔的 `key=value` HTTP 头 |
|
|
615
657
|
| `custom_providers.<name>.*` | — | 与 `providers.<name>.*` 相同的字段,包括可选的 `models` |
|
|
616
658
|
| `llm.url` | string | `https://api.openai.com/v1/chat/completions` |
|
|
617
659
|
| `llm.auth_token` | string | `sk-xxxxxxx` |
|
|
618
660
|
| `llm.auth_header` | string | 仅 Anthropic:`x-api-key` \| `authorization` |
|
|
619
661
|
| `llm.extra_body` | object | 合并到每个请求体的 JSON 对象 |
|
|
662
|
+
| `llm.timeout_sec` | integer | 每次请求的 HTTP 超时时间(秒),默认 `300` |
|
|
620
663
|
| `llm.extra_headers` | string | 逗号分隔的 `key=value` HTTP 头 |
|
|
621
664
|
| `llm.model` | string | `claude-opus-4-6` |
|
|
622
665
|
| `llm.use_anthropic` | boolean | `true` \| `false` |
|
|
@@ -637,6 +680,7 @@ OCR 通过四层优先级链解析评审规则。每层采用首次匹配原则
|
|
|
637
680
|
| `OCR_LLM_AUTH_HEADER` | Anthropic 认证头(`x-api-key` 或 `authorization`) |
|
|
638
681
|
| `OCR_LLM_EXTRA_HEADERS` | 逗号分隔的 `key=value` HTTP 头 |
|
|
639
682
|
| `OCR_LLM_MODEL` | 模型名称 |
|
|
683
|
+
| `OCR_LLM_TIMEOUT` | 每次请求的 HTTP 超时时间(秒),覆盖配置文件中的 `timeout_sec` |
|
|
640
684
|
| `OCR_USE_ANTHROPIC` | `true` = Anthropic,`false` = OpenAI |
|
|
641
685
|
|
|
642
686
|
|
package/imgs/benchmark-en.png
CHANGED
|
Binary file
|
|
Binary file
|
package/imgs/benchmark-zh.png
CHANGED
|
Binary file
|
package/imgs/highlights-en.png
CHANGED
|
Binary file
|
|
Binary file
|
package/imgs/highlights-zh.png
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alibaba-group/open-code-review",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.6",
|
|
4
4
|
"description": "OpenCodeReview CLI — AI-powered code review tool",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ocr": "bin/ocr.js"
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
"checksumPattern": "https://github.com/alibaba/open-code-review/releases/download/v{version}/sha256sum.txt"
|
|
29
29
|
},
|
|
30
30
|
"optionalDependencies": {
|
|
31
|
-
"@alibaba-group/ocr-darwin-arm64": "1.6.
|
|
32
|
-
"@alibaba-group/ocr-darwin-x64": "1.6.
|
|
33
|
-
"@alibaba-group/ocr-linux-arm64": "1.6.
|
|
34
|
-
"@alibaba-group/ocr-linux-x64": "1.6.
|
|
35
|
-
"@alibaba-group/ocr-win32-arm64": "1.6.
|
|
36
|
-
"@alibaba-group/ocr-win32-x64": "1.6.
|
|
31
|
+
"@alibaba-group/ocr-darwin-arm64": "1.6.6",
|
|
32
|
+
"@alibaba-group/ocr-darwin-x64": "1.6.6",
|
|
33
|
+
"@alibaba-group/ocr-linux-arm64": "1.6.6",
|
|
34
|
+
"@alibaba-group/ocr-linux-x64": "1.6.6",
|
|
35
|
+
"@alibaba-group/ocr-win32-arm64": "1.6.6",
|
|
36
|
+
"@alibaba-group/ocr-win32-x64": "1.6.6"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=14"
|