メインコンテンツまでスキップ

コンフィグ / スキーマ概要

.river-review.json(実行時コンフィグ)

リポジトリ直下に置く .river-review.json で、レビュー時のモデル設定や除外条件をカスタマイズできる。src/config/schema.mjs の Zod スキーマで検証し、存在しない場合は src/config/default.mjs のデフォルト値を使用する。

サポート項目とデフォルト

  • model
    • provider: openai(デフォルト)/ google / anthropicmodelName の prefix で実体クライアントが自動選択される(gpt|o1 → OpenAI, gemini → Gemini, claude → Anthropic)。Anthropic 対応は #804 で追加。
    • modelName: gpt-4o-mini(デフォルト)。例: claude-sonnet-4-6, gemini-2.0-flash
    • temperature: 0
    • maxTokens: 600(OpenAI/Gemini 向け。Anthropic クライアントは内部で max_tokens=4096 を固定使用する)
  • review
    • language: ja(日本語)/en(英語)。プロンプトの本文と出力言語を切り替える。
    • severity: normal(デフォルト)/strict/relaxed
    • additionalInstructions: 追加のレビューポリシー(配列)。プロンプト末尾に列挙される。
  • exclude
    • files: 変更差分から除外する 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.06.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: 25664000
    • budget.maxChars: 1024200000。char 上限と token 上限の両方が同時に効く。
    • budget.perSectionCaps: fullFile / tests / usages / config ごとの char 上限を個別指定する。
    • ranking.enabled: true で変更ファイルへの近接度に基づいた候補並び替えを有効化する。
    • ranking.weights: pathProximity / symbolUsage / siblingTest / commitRecency0.01.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.06.0。範囲内の値に修正する。
Unrecognized key(s) in object: 'unknownKey' (security.redact)スキーマに存在しないキーを追加している。キー名のタイポを確認し、不要なキーを削除する。

運用のヒント

  • CI でスキップさせたいラベルを prLabelsToIgnore に記載し、RIVER_PR_LABELS(例: RIVER_PR_LABELS=no-review,wip)または GitHub のイベントペイロードから読み取れるようにしておくと安全である。
  • 設定変更後は npm testnpm 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
    • categorycore / upstream / midstream / downstream で、ルーティングの第一キー。phase は後方互換のため残されている。
  • schemas/output.schema.json

    • 必須: issue / rationale / impact / suggestion / priority / skill_id
    • priorityP0P3 のいずれか

スキルは Markdown ファイルとして skills/{category}/ に配置し、npm run skills:validate でスキーマ検証ができる。