# 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`: ```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) не работает.