* docs(agents): add Config Edits rule linking configure-opencode skill * docs(configure-opencode): expand scope rule to AGENTS, skills, agents, commands * docs(handoff): scaffold handoff and ADR-078 for config-edits rule * docs(handoff): set PR number 181 in handoff and ADR-078 --------- Co-authored-by: opencode-agent <agent@opencode.local>
12 KiB
| name | description |
|---|---|
| configure-opencode | Use when adding, changing, or removing MCP servers, providers, permissions, agents, plugins, or any block in opencode.json. Always writes to .opencode/opencode.json in slaid098/opencode-config (project-local, auto-discovered, zero env var). Also when user says "добавь MCP", "подключи интеграцию", "пропиши permissions", "добавь провайдера", "измени конфиг opencode", "куда писать конфиг". |
configure-opencode
Канонический скилл для правок opencode.json в репо slaid098/opencode-config. Фиксирует контракт «куда писать конфиг» и форматы блоков. Конфиг-репо — это шаблон, который клонируют пользователи.
1. Каноническое правило (canonical rule)
- Всегда пишем конфиг в
.opencode/opencode.jsonв репоslaid098/opencode-config(project-local, auto-discovered). opencode автоматически подхватывает.opencode/opencode.jsonпри запуске — без env var, без bind-mount, без symlink. - Репо
slaid098/opencode-configсам по себе — шаблон, который пользователь клонирует:git clone … && opencodeв корне клона — и конфиг работает. - НЕ создавать отдельный project-local
opencode.jsonв других репо (например.opencode/opencode.jsonвother-repo) для глобальных настроек. Глобальные правки идут вslaid098/opencode-config. - НЕ спрашивать пользователя «куда писать конфиг» — ответ всегда
.opencode/opencode.jsonвslaid098/opencode-config. - Исключение: явный override-сценарий (project-local конфиг нужен для изоляции в конкретном проекте) — тогда указать явно в комментарии к изменению.
- Docker (опционально): для контейнерного запуска можно bind-mount
.opencode/→~/.config/opencode/(см.docker-compose.yml) — но это optional path, не канон. Репо обязан работать и bare-opencodeв клона.
1.1. Scope правила «куда писать» (не только opencode.json)
Каноническое правило «всегда workspace clone slaid098/opencode-config, никогда ~/.config/opencode/» распространяется на все артефакты конфига opencode, а не только на opencode.json:
.opencode/opencode.json— конфиг (MCP, providers, permissions, …).AGENTS.md(корень репо) — глобальные правила/инструкции..opencode/skills/<name>/SKILL.md— скиллы..opencode/agents/<name>.md— сабагенты..opencode/commands/<name>.md— слэш-команды.
Архитектура bind-mount (Docker-сетап):
~/.config/opencode/внутри контейнера — это bind-mount из хост-сорса/root/dockers/opencode-config/.opencode/(НЕconfig/).- Глобальный
AGENTS.md(~/.config/opencode/AGENTS.md) — отдельный ro-mount из корня репо. - Любая правка файлов в
~/.config/opencode/напрямую физически меняет файлы на хост-сорсе в обход git. Другой агент коммитит из workspace clone и пушит → на хостеgit pull→ конфликт (host-source уже имеет uncommitted изменения).
Правильно (sync процедура):
- Правка в workspace clone
/root/workspace/opencode-config/→commit+git push. - На хосте:
git pull(обновляет/root/dockers/opencode-config/.opencode/). docker compose restart opencode(MCP/skills/agents грузятся при старте контейнера — до рестарта правки не видны).
Запрещено: редактировать ~/.config/opencode/ внутри контейнера напрямую (это bind-mount, ro AGENTS.md, bypass git → конфликты при git pull на хосте).
2. Применение изменений
commit+pushв репоslaid098/opencode-config(черезcommittool).- Перед каждым
commit—git statusдля проверки staged set.committool НЕ делаетgit add— коммитит только уже staged файлы. Используйgit add <конкретные-пути>, НЕgit add -A(иначе лишние файлы уйдут в коммит). Если в индексе лишнее (напримерmemory-savestage'нул всё черезgit add -A) — сначалаgit restore --staged <file>, потом коммить. - В клонах:
git pull+ рестарт opencode (MCP-серверы, skills, agents грузятся при старте — см.add-skill/SKILL.md). До рестарта правки не видны. - Для Docker-сетапа:
git pullна хосте +docker compose restart opencode(или эквивалент) — MCP/skills/agents грузятся при старте контейнера.
3. Структура top-level ключей opencode.json
$schema— JSON-schema URL для автокомплита в IDE.plugin— npm-пакет плагина (например@mathew-cf/opencode-memory).skills.paths— массив путей к skill-директориям (по умолчанию[".opencode/skills"]).compaction— настройки сжатия контекста.disabled_providers— массив отключённых провайдеров.provider— current provider config (см. ниже).permission— permission rules (read/bash, см. ниже).agent— per-agent overrides (frontmatter-like, переопределяет per-agent).mcp— MCP-серверы (remote/local, см. ниже).
4. MCP-форматы
Remote (streamable-HTTP):
"<name>": {
"type": "remote",
"url": "https://example.com/mcp",
"enabled": true,
"timeout": 300000
}
Local (subprocess):
"<name>": {
"type": "local",
"command": ["npx", "-y", "<package>"],
"enabled": true
}
Env-плейсхолдеры: "{env:VAR_NAME}" — значение подставляется из env. НЕ хардкодить секреты (API keys, tokens) в JSON. Пример: "url": "{env:MY_API_URL}", "--api-key", "{env:MY_API_KEY}".
timeout — в миллисекундах, обязателен для медленных MCP (LLM-агенты, скрапинг). Для быстрых (well-known manifests) — можно опустить (default).
5. Provider-формат
"provider": {
"npm": "<package-name>",
"options": {
"baseURL": "https://api.example.com/v1",
"apiKey": "{env:PROVIDER_API_KEY}"
},
"models": {
"<model-id>": {
"limit": { "context": 128000, "output": 8192 },
"reasoning": true,
"modalities": ["text", "image"],
"variants": ["<variant-id>"]
}
}
}
6. Permissions
read— массив glob-паттернов для разрешённых read-путей (например["**/*"]или["./src/**"]).bash— объект"<pattern>": "<action>"где:action—"allow","ask", или"deny".pattern— glob-паттерн bash-команды (например"git push*","gh pr merge*","python3*").
- Семантика
findLast: при нескольких матчах побеждает последнее правило (last wins). Это значит порядок правил имеет значение. - Три состояния:
allow— команда выполняется без подтверждения.ask— opencode спрашивает пользователя перед выполнением.deny— команда блокируется (deny-лог вopencode.log).
- Guard: после правок
permission.bashзапускать локальноpython3 .opencode/scripts/check-permissions.py— детектирует опасные паттерны (напримерgh pr checks*, см. ADR-006). CI (permissions-check.yml) запускает тот же скрипт. - См. ADR-006 (детерминированный guard), ADR-005 (Actions API вместо Checks API в allow-list'ах).
7. Gotchas
- Рестарт обязателен: правки в
.opencode/opencode.jsonНЕ видны opencode до рестарта (MCP/skills/agents грузятся при старте). В клонах — рестарт opencode; в Docker —docker compose restart opencode. - env-плейсхолдеры не хардкод: секреты в
.env(не в git), плейсхолдер"{env:VAR}"вopencode.json(в git). Пример:MY_API_URL,MY_API_KEY,MY_TUNNEL_TOKEN. OPENCODE_CONFIG_DIRenv var (power-user/Docker): указывает на директорию сopencode.json— загружается ПОСЛЕ.opencode/и МОЖЕТ переопределять его. Канонический путь.opencode/не требует этого env var;OPENCODE_CONFIG_DIRнужен только для кастомного layout (Docker, power-user).findLastсемантика: при конфликте правил побеждает последнее. Если добавитьdenyпослеallow—denywins. Еслиallowпослеdeny—allowwins. Порядок имеет значение.- CI проверяет permissions:
permissions-check.ymlзапускается на PR с изменениями.opencode/opencode.json,.opencode/agents/**,.opencode/scripts/check-permissions.py. Локальная проверка перед commit:python3 .opencode/scripts/check-permissions.py→ exit 0, "OK: No dangerous permission rules found."
8. Commit message
- Формат:
feat(config): .../chore(config): .../fix(config): ...(conventional commits, English, ≤72 chars). - Перед commit —
git statusдля проверки staged set (committool НЕ делаетgit add— коммитит только уже staged файлы; НЕgit add -A, иначе лишние файлы уйдут в коммит). Затем использоватьcommittool (валидация формата встроена), проверитьgit log --oneline -20, match existing style. - Примеры:
feat(config): add integrations MCP server,fix(config): correct timeout for integrations discover tool.
9. Не дублировать блоки между репо
.opencode/opencode.jsonвslaid098/opencode-config— единственный источник правды для конфига. Репо сам по себе — шаблон, который клонируют.- Project-local
opencode.jsonв других репо — только для явного override (например отключить MCP для конкретного проекта). В 99% случаев не нужен — клонируйslaid098/opencode-configили используйinstructionsarray с remote URLs.