* 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>
4.1 KiB
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 против ~200MBnode: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) не работает.