--- pr: 57 title: install @mathew-cf/opencode-memory plugin in Dockerfile --- # PR #57: install @mathew-cf/opencode-memory plugin in Dockerfile ## Что сделано - `Dockerfile:34` — в строку `npm install -g opencode-ai repomix --unsafe-perm` добавлен `@mathew-cf/opencode-memory`. Итоговая строка: ```dockerfile RUN npm install -g opencode-ai repomix @mathew-cf/opencode-memory --unsafe-perm ``` Единственное изменение в Dockerfile, больше ничего не трогалось. - `tests/test_dockerfile.py` — новый файл, 6 тестов: - `test_dockerfile_exists` — файл существует на repo root - `test_memory_plugin_in_npm_install` — `npm install -g` строка содержит `@mathew-cf/opencode-memory` (parsed check по строкам с `npm install -g`) - `test_memory_plugin_in_npm_install_raw` — raw text содержит `@mathew-cf/opencode-memory` (belt-and-suspenders) - `test_opencode_ai_present` — `npm install -g` строка содержит `opencode-ai` (regression guard — не удалить случайно) - `test_opencode_ai_present_raw` — raw text содержит `opencode-ai` - `test_single_npm_install_line_has_all_packages` — все три пакета (`opencode-ai`, `repomix`, `@mathew-cf/opencode-memory`) в одной строке install (anti-split: запрещает разбивать install по нескольким RUN layer'ам) - Проверки raw-text grep (без Docker build), по паттерну `test_docker_compose.py` (parsed + raw, belt-and-suspenders). - ADR-024 + этот handoff. ## Почему После миграции opencode-config на linux-1 обнаружено: `@mathew-cf/opencode-memory` MCP plugin НЕ установлен в контейнере. `opencode.json` ссылается на плагин: ```json "@mathew-cf/opencode-memory", { "memoryDir": "{env:OPENCODE_MEMORY_DIR}" } ``` Но без `npm install -g` opencode молча пропускает плагин — MCP tools недоступны: - `memory_save` — memory-syncer subagent не может коммитить в memory repo - `memory_search` — нет semantic/keyword search - `memory_list` — нет browsing по категориям Добавление пакета в существующую строку `npm install -g` — минимальное изменение: один layer, все три пакета ставятся за один RUN, без нового layer'а. ## Pending — (нет) ## Watch out - **RAG CLI требует GLIBC 2.39, node:20-slim имеет GLIBC 2.36 — semantic search НЕ работает.** `@mathew-cf/opencode-memory` тянет `@mathew-cf/rag-cli` как dependency для semantic search. RAG CLI (native binary) требует GLIBC 2.39, а `node:20-slim` (Debian Bookworm) поставляется с GLIBC 2.36. Semantic search через RAG падает с ошибкой совместимости glibc. Memory plugin работает с **keyword search (grep)** без RAG — этого достаточно для `memory_search` и `memory_list`. Semantic search — опциональная фича, это **известная проблема, НЕ блокер**. Workaround: keyword search покрывает базовые сценарии. Полный fix semantic search потребует другого base image (например, `node:20-bookworm` с обновлённым glibc, или `node:20` на Debian Trixie с GLIBC 2.40) — вне scope этого PR. - **Все три пакета в одной строке install** — тест `test_single_npm_install_line_has_all_packages` намеренно запрещает разбивку install по нескольким RUN layer'ам. Разбиение добавило бы лишние image layers и скрыло бы, какой пакет отсутствует, при grep-проверке Dockerfile. - **Anti-regression тесты (raw + parsed)** — дублирующие raw-проверки добавлены намеренно (как в `test_docker_compose.py`): parsed-check может пропустить edge case (многострочный install, кавычки), raw-check ловит строку напрямую. Оба должны оставаться. - **`opencode-ai` regression guard** — тест `test_opencode_ai_present` (+ raw) защищает от случайного удаления `opencode-ai` при редактировании строки install. `opencode-ai` — основной пакет, без него контейнер не запустится (ENTRYPOINT `opencode`). - ADR number = 024 (sequential, следующий после 023), НЕ PR number.