コンフィグ / スキーマ概要
.river-review.json(実行時コンフィグ)
リポジトリ直下に置く .river-review.json で、レビュー時のモデル設定や除外条件をカスタマイズできる。src/config/schema.mjs の Zod スキーマで検証し、存在しない場合は src/config/default.mjs のデフォルト値を使用する。
サポート項目とデフォルト
modelprovider:openai(デフォルト)/google/anthropic。modelNameの prefix で実体クライアントが自動選択される(gpt|o1→ OpenAI,gemini→ Gemini,claude→ Anthropic)。Anthropic 対応は #804 で追加。modelName:gpt-4o-mini(デフォルト)。例:claude-sonnet-4-6,gemini-2.0-flash。temperature:0maxTokens:600(OpenAI/Gemini 向け。Anthropic クライアントは内部でmax_tokens=4096を固定使用する)
reviewlanguage:ja(日本語)/en(英語)。プロンプトの本文と出力言語を切り替える。severity:normal(デフォルト)/strict/relaxedadditionalInstructions: 追加のレビューポリシー(配列)。プロンプト末尾に列挙される。
excludefiles: 変更差分から除外する glob パターン。prLabelsToIgnore: Pull Request ラベル名に対象キーワードが含まれていればスキップする設定。RIVER_PR_LABELS(カンマ区切り)または GitHub Actions のGITHUB_EVENT_PATHから取得したラベルと照合し、大文字小文字を無視した部分一致で判定する。
security(#692)redact.enabled:true(デフォルト)。LLM へ送る前段で repo-wide context とプロンプトの secret を伏字化する。redact.categories: カテゴリ単位で個別 ON/OFF。キーは以下。- 鍵類:
githubToken/openaiKey/anthropicKey/googleApiKey/awsAccessKey/awsSecretKey/privateKey - 認証:
bearerToken/databaseUrl/webhookUrl/oauthSecret/envAssignment - フォールバック:
highEntropy
- 鍵類:
redact.extraPatterns: 追加正規表現({ id, pattern, replacement? })。プロジェクト固有の鍵フォーマットに使う。redact.allowlist: 一致するトークンは redact しない(テスト固定値などの保護)。redact.denyFiles: コンテキスト収集の前段で読み飛ばす glob 追加分(既定の.env*/*.pem/*.key/secrets.*等に上乗せ)。redact.entropyThreshold:3.0〜6.0(既定4.5)。Shannon entropy を使った fallback 検出の閾値。redact.entropyMinLength: 既定24。fallback 検出の対象とする最小文字数。
memory(#687)suppressionEnabled:true(デフォルト)。Riverbed Memory に登録された suppression entry を反映する。falseで gate を完全バイパス(緊急対応用)。- suppression entry の
feedbackType(schemas/suppression-context.schema.json):accepted_risk: リスクを認識した上で残すと決めた指摘。HIGH_SEVERITY guard を通過できる唯一の値で、major/criticalの自動抑止にはこの値が必須(src/lib/suppression-apply.mjsの HIGH_SEVERITY guard)。false_positive: 誤検知。major/criticalは guard でブロックされ自動抑止されない(manual-handle 扱い)。minor/infoは自動抑止する。wont_fix: 修正しないと決めた指摘。false_positiveと同じくmajor/criticalは guard でブロックされる。not_relevant: 当該 PR / ファイルの文脈で関連が薄い指摘。major/criticalは guard でブロックされる。duplicate: 別エントリの fingerprint への参照。duplicateOfFingerprintフィールドで参照先を示せる(schema 上は任意だが運用上は記録推奨)。major/criticalは guard でブロックされる。
- CLI:
river suppression addで対話的に登録できる。- 必須フラグ:
--fingerprint <fp>/--feedback <type>/--rationale <text> - 任意フラグ:
--scope <pattern>/--severity <level>/--files <glob>/--expires <date>/--pr <num>
- 必須フラグ:
context(#689)reviewMode:tiny/medium/large。budget を省略するとsrc/lib/context-presets.mjsのプリセットを適用する。budgetを明示するとプリセットより優先される。budget.maxTokens:256〜64000。budget.maxChars:1024〜200000。char 上限と token 上限の両方が同時に効く。budget.perSectionCaps:fullFile/tests/usages/configごとの char 上限を個別指定する。ranking.enabled:trueで変更ファイルへの近接度に基づいた候補並び替えを有効化する。ranking.weights:pathProximity/symbolUsage/siblingTest/commitRecencyを0.0〜1.0で指定する。省略時は等重みを使用する。tokenizer:heuristicのみ受理する(将来拡張用)。
設定例
{
"model": { "provider": "openai", "modelName": "gpt-4o", "temperature": 0.2 },
"review": {
"language": "en",
"severity": "strict",
"additionalInstructions": ["Focus on security", "Prefer readable variable names"]
},
"exclude": {
"files": ["**/*.md", "docs/**"],
"prLabelsToIgnore": ["no-review", "wip"]
}
}
詳細設定例
security / memory / context など複雑なセクションを使う場合の設定例:
{
"security": {
"redact": {
"enabled": true,
"extraPatterns": [
{
"id": "my-api-key",
"pattern": "MYAPP_[A-Z0-9]{32}",
"replacement": "[REDACTED_MYAPP_KEY]"
}
],
"allowlist": ["test_token_placeholder"],
"denyFiles": ["config/secrets/**", "**/*.vault"],
"entropyThreshold": 4.5
}
},
"memory": {
"suppressionEnabled": true
},
"context": {
"reviewMode": "medium",
"budget": {
"maxTokens": 16000,
"perSectionCaps": {
"fullFile": 4000,
"tests": 2000,
"usages": 2000,
"config": 1000
}
},
"ranking": {
"enabled": true,
"weights": {
"pathProximity": 0.4,
"symbolUsage": 0.3,
"siblingTest": 0.2,
"commitRecency": 0.1
}
}
}
}
river suppression add コマンド呼び出し例:
river suppression add \
--fingerprint abc123def456 \
--feedback accepted_risk \
--rationale "Intentional use of high-entropy token in test fixture" \
--scope "src/auth/**" \
--severity major
期待される出力例:
Suppression entry added.
fingerprint : abc123def456
feedback : accepted_risk
scope : src/auth/**
severity : major
バリデーションエラーの例
src/config/schema.mjs の Zod スキーマによる検証が失敗した場合、以下のようなエラーが出力される。
| エラーメッセージ例 | 原因と修正方法 |
|---|---|
Invalid enum value. Expected 'google' | 'openai' | 'anthropic', received 'xyz' | model.provider に未サポートの値を指定している。google / openai / anthropic のいずれかに修正する。 |
Number must be less than or equal to 6 (security.redact.entropyThreshold) | entropyThreshold の範囲は 3.0〜6.0。範囲内の値に修正する。 |
Unrecognized key(s) in object: 'unknownKey' (security.redact) | スキーマに存在しないキーを追加している。キー名のタイポを確認し、不要なキーを削除する。 |
運用のヒント
- CI でスキップさせたいラベルを
prLabelsToIgnoreに記載し、RIVER_PR_LABELS(例:RIVER_PR_LABELS=no-review,wip)または GitHub のイベントペイロードから読み取れるようにしておくと安全である。 - 設定変更後は
npm testやnpm run lintでスキーマ整合性と挙動を確認する。
JSON Schema(スキル/出力)
River Review では、スキルや出力を JSON Schema で定義する。スキルは YAML frontmatter、出力は JSON を想定している。
-
schemas/skill.schema.json- 必須:
id/name/description/category(加えてphase/category/triggerのいずれか、applyTo/files/path_patterns/triggerのいずれかが必要) - 任意:
tags/severity/inputContext/outputKind/modelHint/dependencies categoryはcore/upstream/midstream/downstreamで、ルーティングの第一キー。phaseは後方互換のため残されている。
- 必須:
-
schemas/output.schema.json- 必須:
issue/rationale/impact/suggestion/priority/skill_id priorityはP0〜P3のいずれか
- 必須:
スキルは Markdown ファイルとして skills/{category}/ に配置し、npm run skills:validate でスキーマ検証ができる。