opencode-config/docs/decisions/024-pr-57-memory-plugin-dockerfile.md
Sergey 89a4d947fd
fix(docker): install opencode-memory plugin in Dockerfile (#57)
* fix(docker): install @mathew-cf/opencode-memory plugin in Dockerfile

* test(docker): add Dockerfile npm install test

* docs(handoff): set PR number 57 in handoff + ADR-024

---------

Co-authored-by: opencode-agent <agent@slaid098.dev>
2026-07-24 22:07:18 +03:00

4.1 KiB
Raw Blame History

ADR-024 (PR #57): Install @mathew-cf/opencode-memory plugin in Dockerfile

Статус

Accepted (2026-07-24)

Контекст

opencode.json ссылается на MCP plugin @mathew-cf/opencode-memory с конфигурацией memoryDir. Плагин предоставляет три MCP tool'а: memory_save (коммит в memory repo, используется memory-syncer subagent'ом), memory_search (semantic + keyword search по заметкам), memory_list (browsing по категориям).

Однако Dockerfile не устанавливал плагин через npm install -g — строка содержала только opencode-ai и repomix. Без установки opencode молча пропускает плагин, на который ссылается конфиг: MCP tools недоступны, memory-syncer не может коммитить, search/list не работают.

Дополнительно: @mathew-cf/opencode-memory тянет @mathew-cf/rag-cli как dependency для semantic search. RAG CLI — native binary, требует GLIBC 2.39. Базовый image node:20-slim (Debian Bookworm) поставляется с GLIBC 2.36. Semantic search через RAG не запускается (несовместимость glibc). Memory plugin деградирует до keyword search (grep) — этого достаточно для базовых сценариев memory_search и memory_list.

Решение

Добавить @mathew-cf/opencode-memory в существующую строку npm install -g в Dockerfile:

RUN npm install -g opencode-ai repomix @mathew-cf/opencode-memory --unsafe-perm

Один RUN layer, все три пакета ставятся вместе. Дополнительно — 6 тестов в tests/test_dockerfile.py (parsed + raw check на наличие плагина и opencode-ai, anti-split check на одну строку install), чтобы предотвратить регрессию.

Semantic search / RAG CLI

GLIBC-несовместимость RAG CLI на node:20-slimизвестная проблема, НЕ блокер. Memory plugin работает с keyword search (grep) без RAG. Полный fix semantic search (смена base image на node:20-bookworm с обновлённым glibc, или node:20 на Debian Trixie с GLIBC 2.40) — вне scope этого PR.

Альтернативы

  • Отдельный RUN layer для @mathew-cf/opencode-memory — отклонено: лишний image layer, дублирование --unsafe-perm, затрудняет grep-проверку (тест test_single_npm_install_line_has_all_packages явно запрещает разбивку). Все пакеты ставятся в один layer.

  • Установить плагин через opencode plugin auto-load (копирование в ~/.local/share/opencode/plugins/) — отклонено: opencode.json уже ссылается на пакет по имени ("@mathew-cf/opencode-memory"), npm install — стандартный путь установки npm-пакетов. Копирование файлов дублировало бы установку и сломало бы update path (npm update -g).

  • Сменить base image на node:20-bookworm (GLIBC 2.36 → 2.40) для RAG CLI — отклонено: node:20-bookworm (full image) весит ~1GB против ~200MB node:20-slim, тянет лишние пакеты. Semantic search — опциональная фича, keyword search покрывает базовые сценарии. Смена base image — отдельная задача с тестированием всех зависимостей (chromium, gh, cloudflared, ffmpeg).

  • Не устанавливать плагин, убрать ссылку из opencode.json — отклонено: memory-syncer subagent и memory workflow зависят от MCP tools. Без плагина memory pipeline (MEMORY phase в pipeline-driver) не работает.