feat(mcp): add Serena MCP server with Docker-baked config #73

Merged
slaid098 merged 4 commits from feat/mcp/serena-server into main 2026-08-16 17:59:56 +03:00
Owner

Что сделано

  • docker/serena_config.yml — конфиг Serena (6 excluded_tools для *_memory, GUI-окно и web-dashboard выключены), версионируется в репо.
  • Dockerfile — 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 (конфиг запечён в образ, bind-mount не нужен).
  • .opencode/opencode.json — MCP-сервер serena (local, --context ide --project-from-cwd, timeout 300000); agent.memory-syncer.tools += "serena_*": false.
  • AGENTS.md — секция «Символьная навигация (Serena)» (CRITICAL-стиль: find_referencing_symbols перед изменением сигнатуры, rename_symbol/safe_delete_symbol вместо sed, get_diagnostics_for_file после правок; строка про --context ide/activate_project).
  • .opencode/agents/reviewer.md — дубль секции + 2 записи в «Known deterministic links» (serena_config.yml ↔ memory-syncer tools-map; секция AGENTS/reviewer ↔ serena MCP).
  • .opencode/skills/configure-opencode/SKILL.md — sync-процедура: правки Dockerfile требуют docker compose up -d --build, не только restart.

Почему

У агента нет символьной навигации (кто вызывает функцию, безопасный rename/delete, LSP-диагностика) — grep/read дают только текстовые совпадения. Serena (MCP-сервер на LSP, 40+ языков) закрывает это; совместимость с opencode заявлена авторами. Память Serena глушится Serena-side в одном месте (конфликт с opencode-memory недопустим), --context ide отключает дубли со встроенными инструментами opencode.

Watch out

Gate-заключение (сверка со встроенным LSP opencode, https://opencode.ai/docs/lsp/): встроенный LSP opencode даёт только diagnostics как обратную связь агенту (серверы стартуют по расширению файла, lsp по умолчанию выключен). Символьное ядро Serena (find_referencing_symbols, find_implementations, rename_symbol, safe_delete_symbol, replace_symbol_body, insert_before/after_symbol, get_symbols_overview, get_diagnostics_for_file) встроенным LSP не покрывается — перекрытие только по get_diagnostics_for_file (диагностика). Scope НЕ сужается: Serena остаётся полной, MCP-запись не урезана.

  • Первый старт pyright через uvx докачивает зависимости в слой контейнера — после recreate первый ответ медленный (минута-две), это норма.
  • --project-from-cwd: если от cwd нет .git/.serena — проект не активируется; в --context ide activate_project при стартовом проекте отключён (задокументировано в AGENTS.md-секции).
  • docker/serena_config.yml не попадает под .dockerignore (app_data/, .git, **/node_modules — docker/ не исключён).
  • jq в образе отсутствует — валидность JSON проверена python3 -c "json.load(...)".

Pending

—

Closes #70

Closes #70

## Что сделано - `docker/serena_config.yml` — конфиг Serena (6 `excluded_tools` для `*_memory`, GUI-окно и web-dashboard выключены), версионируется в репо. - `Dockerfile` — `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` (конфиг запечён в образ, bind-mount не нужен). - `.opencode/opencode.json` — MCP-сервер `serena` (local, `--context ide --project-from-cwd`, timeout 300000); `agent.memory-syncer.tools` += `"serena_*": false`. - `AGENTS.md` — секция «Символьная навигация (Serena)» (CRITICAL-стиль: `find_referencing_symbols` перед изменением сигнатуры, `rename_symbol`/`safe_delete_symbol` вместо sed, `get_diagnostics_for_file` после правок; строка про `--context ide`/activate_project). - `.opencode/agents/reviewer.md` — дубль секции + 2 записи в «Known deterministic links» (serena_config.yml ↔ memory-syncer tools-map; секция AGENTS/reviewer ↔ serena MCP). - `.opencode/skills/configure-opencode/SKILL.md` — sync-процедура: правки `Dockerfile` требуют `docker compose up -d --build`, не только `restart`. ## Почему У агента нет символьной навигации (кто вызывает функцию, безопасный rename/delete, LSP-диагностика) — grep/read дают только текстовые совпадения. Serena (MCP-сервер на LSP, 40+ языков) закрывает это; совместимость с opencode заявлена авторами. Память Serena глушится Serena-side в одном месте (конфликт с opencode-memory недопустим), `--context ide` отключает дубли со встроенными инструментами opencode. ## Watch out **Gate-заключение (сверка со встроенным LSP opencode, https://opencode.ai/docs/lsp/):** встроенный LSP opencode даёт только **diagnostics** как обратную связь агенту (серверы стартуют по расширению файла, `lsp` по умолчанию выключен). Символьное ядро Serena (`find_referencing_symbols`, `find_implementations`, `rename_symbol`, `safe_delete_symbol`, `replace_symbol_body`, `insert_before/after_symbol`, `get_symbols_overview`, `get_diagnostics_for_file`) встроенным LSP **не покрывается** — перекрытие только по `get_diagnostics_for_file` (диагностика). Scope НЕ сужается: Serena остаётся полной, MCP-запись не урезана. - Первый старт pyright через uvx докачивает зависимости в слой контейнера — после recreate первый ответ медленный (минута-две), это норма. - `--project-from-cwd`: если от cwd нет `.git`/`.serena` — проект не активируется; в `--context ide` activate_project при стартовом проекте отключён (задокументировано в AGENTS.md-секции). - `docker/serena_config.yml` не попадает под `.dockerignore` (`app_data/`, `.git`, `**/node_modules` — docker/ не исключён). - `jq` в образе отсутствует — валидность JSON проверена `python3 -c "json.load(...)"`. ## Pending — Closes #70 Closes #70
docs(skill): note Dockerfile rebuild in configure-opencode sync
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 3s
CI / bootstrap (pull_request) Successful in 6s
Permission Security Check / check (pull_request) Successful in 7s
CI / lint (pull_request) Successful in 28s
CI / typecheck (pull_request) Successful in 29s
CI / complexity (pull_request) Successful in 29s
CI / test (3.13) (pull_request) Successful in 1m42s
c0f6773313
Author
Owner

Code Review Summary

Качественный PR: Serena MCP-сервер с Docker-baked конфигом, per-agent запретом serena tools для memory-syncer и согласованными обновлениями документации (AGENTS.md, reviewer.md, configure-opencode skill). Cross-file impact проанализирован автором — Known deterministic links обновлены, JSON валиден, CI green, PR body полный (Что сделано / Почему / Watch out / Pending осмысленны, gate-заключение по встроенному LSP opencode задокументировано).

Positives

  • Dockerfile:20-23 Конфиг Serena запечён в образ (COPY docker/serena_config.yml /root/.serena/) — bind-mount не нужен, версионирование в репо.
  • opencode.json:437 serena_*: false для memory-syncer — конфликт с opencode-memory исключён точечно, остальные агенты получают tools.
  • opencode.json:474-489 MCP-запись корректна: local-тип, timeout 300000 для LSP-сервера, флаги GUI/dashboard выключены.
  • reviewer.md:428-437 Known deterministic links дополнены обеими новыми связями (serena_config.yml ↔ tools-map; секция AGENTS/reviewer ↔ MCP-сервер) — cross-file impact задокументирован.
  • configure-opencode/SKILL.md Sync-процедура корректно различает restart (MCP/skills) и up -d --build (Dockerfile) — правки Dockerfile без пересборки были бы не видны.
  • Watch out в PR body честно покрывает риски: unpinned latest, первый старт pyright, --project-from-cwd без .git, .dockerignore не исключает docker/.

Suggestions (info, not blocking)

  • Dockerfile:20 [reproducibility] uv tool install -p 3.13 serena-agent без пина версии — пересборка образа может подтянуть новую мажорную версию с изменённым MCP-контрактом. Trade-off осознанный и задокументирован в PR body, но при следующей пересборке стоит рассмотреть пин (serena-agent==<version>), т.к. wildcard serena_* в tools-map устойчив к переименованиям, а вот CLI-флаги (--enable-gui-log-window и т.д.) — нет.
  • reviewer.md:431 [docs] Описание связи excluded_tools: *_memory неточно: в serena_config.yml перечислены 6 конкретных имён, из которых list_memories и rename_memory не матчатся паттерну *_memory. Стоит уточнить формулировку (например, «6 memory-tools»).
  • PR body [hygiene] Closes #70 продублирован дважды в конце body — безвредно, но лишняя строка.
  • opencode.json:474 [info] MCP-сервер включён глобально для всех агентов — LSP-проекты будут активироваться в любом cwd с .git/.serena, что добавляет фоновую нагрузку на контейнер. Задумано (секция в AGENTS.md для всех агентов), но при росте числа репо в workspace стоит мониторить потребление памяти.

Verdict: APPROVE

## Code Review Summary Качественный PR: Serena MCP-сервер с Docker-baked конфигом, per-agent запретом serena tools для memory-syncer и согласованными обновлениями документации (AGENTS.md, reviewer.md, configure-opencode skill). Cross-file impact проанализирован автором — Known deterministic links обновлены, JSON валиден, CI green, PR body полный (Что сделано / Почему / Watch out / Pending осмысленны, gate-заключение по встроенному LSP opencode задокументировано). ### Positives - **Dockerfile:20-23** Конфиг Serena запечён в образ (`COPY docker/serena_config.yml /root/.serena/`) — bind-mount не нужен, версионирование в репо. - **opencode.json:437** `serena_*: false` для memory-syncer — конфликт с opencode-memory исключён точечно, остальные агенты получают tools. - **opencode.json:474-489** MCP-запись корректна: local-тип, timeout 300000 для LSP-сервера, флаги GUI/dashboard выключены. - **reviewer.md:428-437** Known deterministic links дополнены обеими новыми связями (serena_config.yml ↔ tools-map; секция AGENTS/reviewer ↔ MCP-сервер) — cross-file impact задокументирован. - **configure-opencode/SKILL.md** Sync-процедура корректно различает `restart` (MCP/skills) и `up -d --build` (Dockerfile) — правки Dockerfile без пересборки были бы не видны. - **Watch out** в PR body честно покрывает риски: unpinned latest, первый старт pyright, `--project-from-cwd` без `.git`, `.dockerignore` не исключает `docker/`. ### Suggestions (info, not blocking) - **Dockerfile:20** [reproducibility] `uv tool install -p 3.13 serena-agent` без пина версии — пересборка образа может подтянуть новую мажорную версию с изменённым MCP-контрактом. Trade-off осознанный и задокументирован в PR body, но при следующей пересборке стоит рассмотреть пин (`serena-agent==<version>`), т.к. wildcard `serena_*` в tools-map устойчив к переименованиям, а вот CLI-флаги (`--enable-gui-log-window` и т.д.) — нет. - **reviewer.md:431** [docs] Описание связи `excluded_tools: *_memory` неточно: в `serena_config.yml` перечислены 6 конкретных имён, из которых `list_memories` и `rename_memory` не матчатся паттерну `*_memory`. Стоит уточнить формулировку (например, «6 memory-tools»). - **PR body** [hygiene] `Closes #70` продублирован дважды в конце body — безвредно, но лишняя строка. - **opencode.json:474** [info] MCP-сервер включён глобально для всех агентов — LSP-проекты будут активироваться в любом cwd с `.git`/`.serena`, что добавляет фоновую нагрузку на контейнер. Задумано (секция в AGENTS.md для всех агентов), но при росте числа репо в workspace стоит мониторить потребление памяти. ### Verdict: APPROVE
slaid098 deleted branch feat/mcp/serena-server 2026-08-16 17:59:56 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!73
No description provided.