Ctrl K
ComunidadGuías…

opencode.jsonc

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  // Loaded from the trusted base-branch checkout via OPENCODE_CONFIG, so a PR cannot change its own review.
  // The read-only default (REVIEW_OPENCODE_CONFIG=default); opencode.ci.jsonc is the full-permission CI variant.
  "$schema": "https://opencode.ai/config.json",

  // Nothing here may reach into the PR tree: no `instructions`, no `skills`, no plugins.
  "update": "disable",
  "share": "disabled",
  "snapshots": false,
  // LSP servers would build the PR (rust-analyzer runs build scripts and proc macros).
  "lsp": false,
  "formatter": false,

  // Policies refuse every other provider, including the bundled free ones; a review talks to one endpoint only.
  "policies": [
    { "action": "provider.use", "resource": "*", "effect": "deny" },
    { "action": "provider.use", "resource": "anthropic-review", "effect": "allow" }
  ],

  "providers": {
    "anthropic-review": {
      "name": "Anthropic (review)",
      // Bundled in the opencode binary; its default endpoint is https://api.anthropic.com/v1.
      "package": "@opencode/ai/providers/anthropic",
      // Not ANTHROPIC_API_KEY, so no other provider opencode knows about can pick the key up.
      "env": ["ANTHROPIC_REVIEW_API_KEY"],
      "models": {
        "claude-sonnet-5-5": {
          "name": "Claude Sonnet 5.5",
          // REVIEW_MODEL_VARIANT and REVIEW_COORDINATOR_VARIANT pick one; opencode sends adaptive thinking and "output_config": { "effort": "<id>" }.
          "variants": [
            { "id": "low", "settings": { "thinking": { "type": "adaptive" }, "effort": "low" } },
            { "id": "medium", "settings": { "thinking": { "type": "adaptive" }, "effort": "medium" } },
            { "id": "high", "settings": { "thinking": { "type": "adaptive" }, "effort": "high" } },
            { "id": "xhigh", "settings": { "thinking": { "type": "adaptive" }, "effort": "xhigh" } },
            { "id": "max", "settings": { "thinking": { "type": "adaptive" }, "effort": "max" } }
          ],
          "limit": { "context": 1000000, "output": 128000 }
        }
      }
    },
    // Denied by the policy above; kept so switching back needs no new provider block.
    "deepseek-review": {
      "name": "DeepSeek (review)",
      // Bundled in the opencode binary, so nothing is installed at run time.
      "package": "@opencode/ai/providers/openai-compatible",
      "env": ["DEEPSEEK_API_KEY"],
      "settings": { "baseURL": "https://api.deepseek.com" },
      // DeepSeek reads max_tokens and returns its reasoning as reasoning_content.
      "compatibility": { "maxTokensField": "max_tokens", "reasoningField": "reasoning_content" },
      "models": {
        "deepseek-flash": {
          "name": "DeepSeek-V4.1-Flash",
          // Selected with REVIEW_MODEL_VARIANT=max; opencode sends "reasoning_effort": "max".
          "variants": [{ "id": "max", "settings": { "reasoningEffort": "max" } }],
          "limit": { "context": 1048576, "output": 393216 }
        }
      }
    }
  },

  "model": "anthropic-review/claude-sonnet-5-5",

  // Last match wins, so the "*" deny must come first; src/opencode.mjs selfCheck refuses any other allowed tool.
  "agents": {
    "ai-review-security": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-correctness": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-code-quality": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-performance": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-documentation": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-release": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-frontend": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-qa": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    },
    "ai-review-coordinator": {
      "mode": "primary",
      "model": "anthropic-review/claude-sonnet-5-5",
      "permissions": [
        { "action": "*", "resource": "*", "effect": "deny" },
        { "action": "read", "resource": "*", "effect": "allow" },
        { "action": "glob", "resource": "*", "effect": "allow" },
        { "action": "grep", "resource": "*", "effect": "allow" },
        { "action": "external_directory", "resource": "*", "effect": "deny" }
      ]
    }
  }
}