feat(mcp): add Serena MCP server with Docker-baked config #70
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Зачем: у агента нет символьной навигации по коду (кто вызывает функцию, безопасный rename/delete, диагностика LSP без запуска тестов) — grep/read дают только текстовые совпадения. Serena (github.com/oraios/serena, MIT, MCP-сервер на LSP, 40+ языков) закрывает это. Совместимость с opencode заявлена авторами.
Текущее состояние:
Dockerfile— node:22-trixie-slim, Python 3.13 (apt), uv в /usr/local/bin (ставится сUV_INSTALL_DIR=/usr/local/bin), PATH-правка только/opt/memory/.venv/bin.docker-compose.yml: bind-mounts/root/.config/opencode,/root/.local/share/opencode,/root/workspace,/root/.ssh;/root/.serenaНЕ покрыт mount'ами (не персистентен)..opencode/opencode.jsonmcp-секция: browser, context7, antidetect-browser, integrations (строки ~440-473);agent.memory-syncerуже имеет tools-map..dockerignore:app_data/,.git,**/node_modules.Принятые при планировании решения (не пересматривать): Serena ставится latest (без пина версии); конфиг Serena версионируется в репо и запекается в образ через COPY; собственная память Serena отключается через
excluded_toolsв её конфиге (конфликт с нашей opencode-memory недопустим); режим--context ide(отключает дубли с встроенными инструментами opencode: create_text_file, read_file, execute_shell_command, find_file, list_dir); memory-syncer не получает serena_*; ALLOWED-список оркестратора в AGENTS.md НЕ расширяется; новых ADR-файлов в docs/decisions не создавать.Задача
docker/serena_config.yml(версионируется в репо):Dockerfile: после строки установки uv добавитьRUN UV_TOOL_BIN_DIR=/usr/local/bin uv tool install -p 3.13 serena-agent(latest, без пина) иCOPY docker/serena_config.yml /root/.serena/serena_config.yml(выполняется под root, дом = /root). Проверить, чтоdocker/serena_config.ymlне попадает под .dockerignore..opencode/opencode.json: вmcpдобавить серверserena:{"type": "local", "command": ["serena", "start-mcp-server", "--context", "ide", "--project-from-cwd", "--enable-gui-log-window", "false", "--open-web-dashboard", "false"], "enabled": true, "timeout": 300000}. Вagent.memory-syncer.toolsдобавить"serena_*": false.AGENTS.md: новая секция## Символьная навигация (Serena)— жёсткие императивные триггеры в CRITICAL-стиле: (а) ПЕРЕД изменением сигнатуры/контракта публичного символа — ОБЯЗАТЕЛЬНОfind_referencing_symbols; (б) переименование/удаление символа — ТОЛЬКОrename_symbol/safe_delete_symbol, НЕ sed/текстовый replace; (в) ПОСЛЕ правок файла —get_diagnostics_for_file. Правка в workspace clone/root/workspace/opencode-config/, sync по процедуре из skillconfigure-opencode..opencode/agents/reviewer.md: дубль той же секции + запись в существующую секцию «Known deterministic links» (строки ~403-421) про триггеры Serena..opencode/skills/configure-opencode/SKILL.md: в sync-процедуру добавить упоминание, что правкиDockerfileтребуютdocker compose up -d --build(а не толькоrestart).docker-compose.ymlи README не меняются.Контракты
serena; type local; команда ровно как в п.4; timeout 300000 (старт LSP медленный).docker/serena_config.yml— ключи ровно как в п.2 (snake_case, boolean YAML).Инварианты
*_memoryточнее write/read/list/edit/delete/rename) недоступна ни одному агенту — глушится Serena-side в одном месте (serena_config.yml), НЕ per-agent.memory-syncer: всеserena_*запрещены./root/workspace/opencode-config/, никогда в~/.config/opencode/напрямую.docs/decisions/не создавать.Граничные случаи
--project-from-cwd: если от cwd нет.git/.serena— проект не активируется, сервер предложит activate_project; в--context ideactivate_project отключён при стартовом проекте — задокументировать в AGENTS.md-секции одной строкой, если gate подтвердит.Влияние на связанные компоненты
tests/test_permissions.py(ключи agent.tools поимённые — добавлениеserena_*не ломает) иtests/test_agent_frontmatter.py(пинят только frontmatter reviewer/memory-syncer): зелёные обязательны..github/workflows/permissions-check.ymlтриггерится по путям.opencode/opencode.jsonи.opencode/agents/**— проверок по mcp-сеции нет, нарушений быть не должно..opencode/skills/configure-opencode/SKILL.md— paired update (п.7).reviewer.md— paired update (п.6).Вне scope
/root/.serena(отклонено: конфиг запечён в образ).Критерии приемки
docker buildобраза успешен; в образеserena --helpотрабатывает из /usr/local/bin./root/.serena/serena_config.ymlс 6 записями в excluded_tools.jq empty .opencode/opencode.jsonпроходит;pytest tests/(test_permissions.py, test_agent_frontmatter.py) зелёные.