* 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>
36 lines
No EOL
4.1 KiB
Markdown
36 lines
No EOL
4.1 KiB
Markdown
# 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) не работает. |