---
pr: 107
title: fix(docker): install ripgrep and python deps for memory tools
---

## Что сделано

Добавлены 2 шага в `Dockerfile` после `npm install -g opencode-ai repomix`:

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

2. **Python deps (`httpx`, `numpy`, `tenacity`)** — `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.

## Почему

После удаления плагина `@mathew-cf/opencode-memory` (PR #103) его deps больше не ставятся в контейнер. Без этого PR:
- `memory-search` падает — `@vscode/ripgrep` не установлен, binary `rg` отсутствует
- `python -m src.memory` падает — `import httpx` ModuleNotFoundError
- Память не работает в контейнере вообще

Первая попытка (коммит до `46eb81a`) ставила deps в `/root/.opencode/` и `/root/workspace/` — но volume `./app_data/workspaces:/root/workspace` shadow'ит `.venv/` и `src/`, а bind-mount `./.opencode:/root/.config/opencode` shadow'ит node_modules. Исправлено: deps в `/opt/memory/` (не shadow) + глобальный npm.

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

## Pending

—

## Watch out

- `npm install -g @vscode/ripgrep` — глобальная установка, обходит bind-mount shadow. Binary в `/usr/local/lib/node_modules/@vscode/ripgrep-linux-x64/bin/rg`.
- `/opt/memory/` — вне volume shadow, переживает пересборку. `.venv` в `/opt/memory/.venv/`.
- `PYTHONPATH=/opt/memory/src` — `import src.memory` работает из любого cwd (TS tools запускают `python3 -m src.memory` с `cwd: context.worktree`).
- `PATH=/opt/memory/.venv/bin:$PATH` — `python3` резолвится в `.venv/bin/python3` который видит httpx/numpy/tenacity.
- `uv sync --no-dev --frozen` строго по `uv.lock` — только runtime deps, детерминизм.
- Closes #108.