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

36 lines
No EOL
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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