Compartilhando Config do OpenCode: Agentes em Camadas, Permissoes e Exemplo Completo

Por canxin3 minutos de leitura


Índice

  1. 1. Ordem de merge e precedencia
  2. 2. Campos de configuracao no topo
  3. 3. Design em camadas de agentes
    1. 3.1 LocalReader
    2. 3.2 LocalScribe (padrao)
    3. 3.3 OmniReader
    4. 3.4 OmniScribe
  4. 4. Estrutura de providers e catalogo de modelos
    1. 4.1 Estrutura JSON comum de modelo
    2. 4.2 Referencia de campos de modelo
  5. 5. Carregamento de plugins
    1. 5.1 opencode-planpilot (npm)
    2. 5.2 opencode-workbench (npm)
  6. 6. Config completa (referencia)

1. Ordem de merge e precedencia

Precedencia (baixo -> alto):

  1. Remote .well-known/opencode
  2. Global ~/.config/opencode/opencode.json
  3. OPENCODE_CONFIG
  4. Project opencode.json
  5. Diretorios .opencode
  6. OPENCODE_CONFIG_CONTENT

Recomendacao: mantenha defaults duraveis no global; mantenha regras especificas por repositorio.

2. Campos de configuracao no topo

Campos principais de nivel superior:

{
  "$schema": "https://opencode.ai/config.json",
  "default_agent": "LocalScribe",
  "model": "my_oai/gpt-5.3-codex",
  "small_model": "my_oai/gpt-5.3-codex",
  "autoupdate": false,
  "compaction": {
    "auto": true,
    "prune": true
  },
  "agent": { ... },
  "plugin": [ ... ],
  "provider": { ... }
}

Notas de campo:

3. Design em camadas de agentes

Limites reais com base nos valores atuais de permission (tabela unica):

Agentereadeditexternal_directorybashConclusao
LocalReaderread.* = allow (inclui *.env)askaskaskleitura direta no workspace; fora do workspace exige confirmacao
LocalScriberead.* = allow (inclui *.env)* = allow, *../* = denyallow* = allow, padroes perigosos sao askleitura global; escrita tipicamente no workspace
OmniReaderread.* = allow (inclui *.env)askallowaskleitura global; escrita exige confirmacao
OmniScribe* = allow (inclui read)* = allowallow* = allow, padroes perigosos sao askleitura/escrita global

LocalScribe e “tipicamente gravavel no workspace” porque traversal e bloqueado por *../* = deny. Para escrita estritamente dentro do workspace, ajuste external_directory para ask ou deny.

Built-ins desativados:

"agent": {
  "build": { "disable": true },
  "docs": { "disable": true },
  "plan": { "disable": true }
}

3.1 LocalReader

"LocalReader": {
  "description": "Read-first agent; asks for non-read actions",
  "mode": "all",
  "permission": {
    "*": "ask",
    "bash": "ask",
    "edit": "ask",
    "glob": "allow",
    "grep": "allow",
    "list": "allow",
    "read": {
      "*": "allow",
      "*.env": "allow",
      "*.env.*": "allow"
    },
    "plan_enter": "deny",
    "plan_exit": "deny",
    "todoread": "deny",
    "todowrite": "deny"
  }
}

3.2 LocalScribe (padrao)

"LocalScribe": {
  "description": "Reads any path; writes only inside workspace",
  "mode": "all",
  "permission": {
    "*": "allow",
    "bash": {
      "*": "allow",
      "sudo *": "ask",
      "su *": "ask",
      "rm -rf *": "ask",
      "rm -fr *": "ask",
      "mkfs* *": "ask",
      "reboot *": "ask",
      "shutdown *": "ask",
      "dd *": "ask"
    },
    "edit": {
      "*": "allow",
      "*../*": "deny"
    },
    "external_directory": "allow",
    "plan_enter": "deny",
    "plan_exit": "deny",
    "todoread": "deny",
    "todowrite": "deny"
  }
}

3.3 OmniReader

"OmniReader": {
  "description": "Read-first agent for all paths; asks for non-read actions",
  "mode": "all",
  "permission": {
    "*": "ask",
    "external_directory": "allow",
    "read": {
      "*": "allow",
      "*.env": "allow",
      "*.env.*": "allow"
    },
    "bash": "ask",
    "edit": "ask"
  }
}

3.4 OmniScribe

"OmniScribe": {
  "description": "Dangerous full access read/write anywhere",
  "mode": "all",
  "permission": {
    "*": "allow",
    "bash": {
      "*": "allow",
      "sudo *": "ask",
      "rm -rf *": "ask",
      "mkfs* *": "ask"
    },
    "external_directory": "allow",
    "plan_enter": "deny",
    "plan_exit": "deny"
  }
}

4. Estrutura de providers e catalogo de modelos

Tres providers:

Estrutura de provider:

  1. metadados: name, npm
  2. opcoes de conexao: options.baseURL, options.apiKey, options.setCacheKey
  3. mapa models: um objeto por modelo

4.1 Estrutura JSON comum de modelo

"provider": {
  "my_oai": {
    "name": "my_oai",
    "npm": "@ai-sdk/openai",
    "options": {
      "apiKey": "{env:OAI_API_KEY}",
      "baseURL": "https://your-gateway.example/v1",
      "setCacheKey": true
    },
    "models": {
      "gpt-5.3-codex": {
        "name": "gpt-5.3-codex",
        "attachment": true,
        "limit": {
          "context": 400000,
          "output": 128000
        },
        "modalities": {
          "input": ["text", "image", "pdf"],
          "output": ["text"]
        },
        "options": {
          "store": false,
          "include": ["reasoning.encrypted_content"]
        },
        "variants": {
          "high": { "reasoningEffort": "high", "reasoningSummary": "auto", "textVerbosity": "medium" },
          "medium": { "reasoningEffort": "medium", "reasoningSummary": "auto", "textVerbosity": "medium" },
          "low": { "reasoningEffort": "low", "reasoningSummary": "auto", "textVerbosity": "medium" },
          "xhigh": { "reasoningEffort": "xhigh", "reasoningSummary": "auto", "textVerbosity": "medium" }
        }
      }
    }
  }
}

4.2 Referencia de campos de modelo

CampoTipoSignificado
namestringnome de exibicao
attachmentbooleanse anexos estao habilitados
limit.contextnumberjanela total de contexto
limit.outputnumbermaximo de tokens de saida
modalities.inputstring[]modalidades de entrada, ex.: text/image/pdf
modalities.outputstring[]modalidades de saida, geralmente text
options.storebooleantoggle de armazenamento da requisicao
options.includestring[]campos extras retornados
variantsobjectperfis de raciocinio por modelo

5. Carregamento de plugins

Configuracao de plugins:

"plugin": [
  "opencode-planpilot",
  "opencode-workbench"
]

5.1 opencode-planpilot (npm)

5.2 opencode-workbench (npm)

6. Config completa (referencia)

Para evitar duplicacao enorme nesta versao localizada, recomendo usar o mesmo bloco JSONC completo da versao em ingles e manter apenas os textos explicativos traduzidos neste artigo.

Link direto: English

Comentários