Конфиг переписан в каноническом виде OpenCode 2: права заданы
списком permissions, MCP-серверы — в mcp.servers. Убраны устаревшие
default_agent и выключенный playwright, а также комментарий про
снятый плагин. Пример возврата SearXNG в README поправлен под новую
схему. Лишний симлинк opencode/skills удалён: OpenCode сам читает
~/.agents/skills.
Встроенные websearch и webfetch дают более полную выдачу, поэтому
локальные MCP-серверы поиска больше не нужны. SearXNG оставлен
в docker/searxng как резерв: добавлен README с запуском и возвратом
MCP-сервера. Заодно поправлено описание OpenCode в AGENTS.md.
- ключ Context7 подставляется через {env:...}: с ${env:...} в заголовок
уходил лишний $
- убраны устаревшие в V2 разрешения write и patch, их покрывает edit
- удалён слишком широкий шаблон *shadow*
- в permission-reviewer.md отмечено, что система отключена
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Плагин настроен и проверен (jev через Zen + прокси, enforce+deny),
но признан не стоящим использования: хрупкая цепочка, нервные
эскалации, запертая сессия. Запись в opencode.json отключена
(закомментирована), выводы — в docs/research/.
У glm-5.3-flash в подписке opencode-go лимиты в 4 раза выше, чем у
deepseek-v4.1-flash, при сравнимом интеллекте. outputFormat json_schema:
модель поддерживает structured output (по models.dev).
escalationReviewer ссылался на deepseek/deepseek-flash - такого провайдера
нет, каждая эскалация Jev падала с 'Reviewer model is unavailable'.
Заменено на opencode-go/deepseek-v4.1-flash (подписка, в 2 раза дешевле
Zen): outputFormat text (у модели нет json_schema), variant high
(none не поддерживается, есть только low/high/max).
Профили дублировали работу permission-reviewer статическими списками:
их deny обходили ревьюер и давали отказы без причины (git push). Теперь
решения об ask принимает плагин; статикой оставлены только deny на чтение
секретов - детерминированная гарантия, LLM-ревьюеру не доверяем.
- opencode.json: default_agent -> build, убраны статические списки
и deny на git push (решение за ревьюером)
- permission-reviewer.jsonc: actorProfiles переключены на встроенные
build/plan
- install.sh: блок линковки agents заменён чисткой старого симлинка;
добавлено копирование permission-reviewer.jsonc в ~/.config/opencode
(плагин читает его только оттуда - раньше тюнинг не применялся)
- тесты: проверка чистки симлинка и копирования конфига ревьюера
- Зачем: Jev (System One) решает за ~0.6 с против 4 с у чат-модели,
но на тонком контексте занижает confidence (0.6 < 0.7) и эскалировал
даже тривиальные команды.
- Что: model=opencode/jev-1.13-free (ключ OPENCODE_API_KEY из
~/.env.secrets, нужен export); escalationReviewer=deepseek/deepseek-flash
для неуверенных решений; actorProfiles для safe-build/safe-plan.
- Проверка: прогон printf → allow (low, 0.97), аудит пишется;
fail-closed при отсутствии ключа подтверждён (эскалация, не allow).
- Зачем: allow-правило "cat *" в safe-агентах пропускало чтение
~/.ssh/*, ~/.env.secrets и подобного без ask, мимо ревьюера.
- Что: deny-паттерны на .ssh, id_rsa/id_ed25519, .pem, shadow, .env*,
*.secrets*, .netrc в safe-build и safe-plan; .env.example оставлен allow.
Префиксные паттерны — заслон от буквальных случаев; обход через
интерпретаторы остаётся на ревьюере (он видит содержимое скриптов).
- Проверка: прогон cat ~/.ssh/config → Permission denied до выполнения,
содержимое в вывод не попало.
- Зачем: плагин читает конфиг с O_NOFOLLOW и молча игнорирует симлинк
(проверено doctor: со слинкованным файлом применяются дефолты).
- Что: добавлен .stow-local-ignore; файл деплоится копией в
~/.config/opencode/, репозиторий остаётся источником истины.
- Проверка: doctor видит файл и применяет model=deepseek/deepseek-flash.
- Зачем: плагин больше не используется, а в OpenCode 2 он не грузится (V1-формат) и даёт ошибку на старте.
- Что: из opencode.json удалена опция plugin с репозиторием obra/superpowers.
- Проверка: opencode plugin list больше не показывает superpowers; JSON валиден; V1 и V2 читают конфиг как раньше.
- Зачем:
- необходимо подключить набор skills для расширения возможностей агента Opencode.
- Что:
- добавлена опция plugin с указанием репозитория superpowers в opencode.json.
- Проверка:
- cat opencode/.config/opencode/opencode.json.
- Зачем:
- порт 57458 попадал в динамический диапазон Hyper-V (49152–65535), что блокировало запуск контейнера на WSL2.
- Что:
- порт изменён с 57458 на 26745 в docker-compose.yml.
- обновлён SEARXNG_URL в конфиге MCP opencode.
- Проверка:
- docker compose up -d && curl -s -o /dev/null -w "%{http_code}" http://localhost:26745/
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- модели в opencode не имели доступа к поиску без платных API.
- Что:
- добавлен docker-compose для SearXNG (localhost:57458, без valkey).
- секрет подставляется из .env через generate-config.sh при старте.
- добавлен MCP-сервер searxng в конфиг opencode.
- env_file с fallback: .env.sample работает из коробки, .env опционален.
- Проверка:
- cd docker/searxng && docker compose up -d.
- curl http://localhost:57458/search?q=test&format=json.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- duckduckgo-mcp (npx) требует bun, которого нет в системе.
- Что:
- убран websearch из permissions (инструмент не существует в opencode).
- команда заменена на uvx duckduckgo-mcp-server (Python, работает без bun).
- Проверка:
- перезапустить opencode, убедиться что инструменты duckduckgo доступны.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- доступ к поиску в интернете для моделей без внешних MCP-серверов.
- Что:
- добавлен "websearch": "ask" в секцию permission.
- Проверка:
- открыть opencode, убедиться что websearch доступен как инструмент.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Зачем:
- конфигурационный файл содержит лишние комментарии, которые можно удалить.
- Что:
- удалены комментарии с пояснениями в opencode.json.
- удалены лишние пустые строки для компактности.
- добавлен перевод строки в конце файла.
- Проверка:
- валидация JSON: cat opencode/.config/opencode/opencode.json | jq empty.
- Зачем:
- необходим дополнительный уровень безопасности для предотвращения случайных изменений в репозитории
- Что:
- создан агент safe-plan для безопасного планирования (read-only)
- создан агент safe-build с защищенным доступом к shell
- установлен default_agent: "safe-plan"
- обновлены глобальные permissions: все операции требуют подтверждения, git push запрещен
- добавлен share: "manual"
- Проверка:
- проверка конфигурации через OpenCode UI
Зачем: переход на новый формат хранения скиллов для лучшей организации и расширяемости.
Что: удалён .skill.md файл, создана директория skills/conventional-commits/ с новой структурой.
Проверка: ls -la opencode/.config/opencode/skills/
Зачем: настройка рабочего окружения для инструмента opencode с поддержкой conventional commits.
Что: созданы конфигурационные файлы, добавлен bashrc, gitignore, документация и skill для коммитов.
Проверка: git status, проверка наличия файлов в opencode/.config/.