# ADR-048: Dockerfile — install ripgrep and python deps for memory tools

## Статус
Accepted (2026-07-26)

## Контекст

После удаления плагина `@mathew-cf/opencode-memory` (PR #103, ADR-045) его зависимости больше не ставятся в Docker-контейнер. Memory-инструменты (`memory-search.ts`, `python -m src.memory`) теперь живут в самом репо (`.opencode/tools/` + `src/memory/`), но их runtime-deps (`@vscode/ripgrep`, `httpx`, `numpy`, `tenacity`) не попадали в образ. Результат: `memory-search` падал на отсутствии binary `rg`, `python -m src.memory` — на `import httpx`. Память в контейнере не работала вообще.

## Решение

Добавить в `Dockerfile` два слоя установки deps после `npm install -g opencode-ai repomix`:

1. **Node runtime deps** — `npm install -g @vscode/ripgrep` (глобально, в `/usr/local/lib/node_modules/`). Глобальная установка обходит bind-mount `./.opencode:/root/.config/opencode` который shadow'ит локальные node_modules в runtime.

2. **Python runtime deps** — `COPY pyproject.toml uv.lock /opt/memory/` + `COPY src/ /opt/memory/src/` + `uv sync --no-dev --frozen` в `/opt/memory/` (вне shadow-пути `/root/workspace/`). `ENV PYTHONPATH=/opt/memory/src` + `ENV PATH=/opt/memory/.venv/bin:$PATH` делают `python3 -m src.memory` рабочим из любого cwd. Volume `./app_data/workspaces:/root/workspace` не shadow'ит `/opt/memory/`.

Контейнер становится самодостаточным: память работает из коробки после `docker compose up -d --build`.

## Альтернативы

- **Вернуть плагин `@mathew-cf/opencode-memory`** — отвергнуто в PR #103 (плагин удалён, инструменты мигрированы в репо).
- **Ставить deps через `apt-get`** — `@vscode/ripgrep` и Python-пакеты не в Debian repos нужных версий; `uv`/`npm` дают детерминизм через lock-файлы.
- **Копировать весь `.opencode/` и `src/`** — раздувает образ; достаточно только manifest + lock для установки deps на этапе build.
- **Deps в `/root/.opencode/` + `/root/workspace/`** (первая попытка) — отвергнуто: bind-mount `./.opencode:/root/.config/opencode` и volume `./app_data/workspaces:/root/workspace` shadow'ят node_modules и `.venv/` в runtime. Deps установлены но не доступны. Исправлено: `/opt/memory/` (не shadow) + глобальный npm.