Ваши кодинг-агенты больше не отлаживают заново то, что вы уже починили.
Claude Code, Codex, Cursor, OpenClaw, Gemini CLI, OpenCode, Hermes и ещё 36 агентов уже сохраняют каждую сессию на диск.
deja индексирует всю историю локально и возвращает нужный контекст через MCP и хуки — без LLM, один Go-бинарник.
Полнота 97.2% R@5 на LongMemEval-S все 500 вопросов · MemPalace 96.6%, agentmemory 95.2% на тех же 19,195 сессиях: 19/100 на первом месте, у ближайшего 14
Токены вдвое меньше токенов, чем у agentmemory 53,558 против 104,974 на уже решённой задаче 477 токенов на описание инструментов — меньше всех из семи
Индексация 13.6 с на индекс 19,195 сессий следующий из семи: 72 с 26 мс до первого ответа, медиана поиска 97 мс
## Установка
```sh
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto
```
Скрипт кладёт бинарник в `~/.local/bin`. Если этой папки ещё нет в `PATH`, вторая команда в той же оболочке не найдётся: запустите строку `next:`, которую печатает скрипт (в ней полный путь), или откройте новую оболочку, когда строка с `PATH` добавлена.
Если `raw.githubusercontent.com` недоступен, есть зеркало в npm, версия та же:
```sh
npm i -g @vshulcz/deja-vu --registry=https://registry.npmmirror.com
deja install --auto
```
Десять секунд на установку, около десяти на индекс. Вторая команда подключает MCP-recall к каждому найденному
агенту, включает отдачу контекста при старте сессии там, где агент это умеет, и строит первый индекс,
чтобы следующая сессия ничего не ждала.
Откройте новую сессию агента и спросите про то, что делали месяцы назад:
> мы уже разбирались с jwt refresh rotation? посмотри в своей памяти
Спрашивать и не обязательно: с включённым авто-recall агент уже на старте сессии знает, что в этом проекте
было решено. Чтобы поискать самому, запустите `deja`.
У opencode, DeepSeek Harness, Zed, Kimi Code, Codex CLI, Grok Build, OpenClaw, pi и Hermes есть пакеты в их
собственных экосистемах — для тех, кто привык ставить расширения оттуда:
```sh
opencode plugin opencode-deja
dsh plugin --profile web add dsh-deja
# Zed: найдите deja в панели расширений
# Kimi Code: /plugins install https://github.com/vshulcz/deja-vu
# Codex CLI: codex plugin marketplace add https://github.com/vshulcz/deja-vu && codex plugin add deja-vu@deja-vu
# Grok Build: grok plugin marketplace add vshulcz/deja-vu && grok plugin install deja
openclaw plugins install clawhub:@vshulcz/openclaw-deja && openclaw config set plugins.entries.deja-vu.hooks.allowConversationAccess true
pi install npm:@vshulcz/pi-deja
hermes plugins install deja-memory
```
`deja install --auto` подключает всё перечисленное само, так что любого из двух путей достаточно. Оба сразу
тоже не сломаются: пакет смотрит, что написал `deja install`, и дописывает только недостающее — без дублей
инструментов и без второго recall. Подробности в [`extensions/`](../../extensions).
Тот же поиск существует как skill, который поставит любой агент, читающий `SKILL.md`:
```sh
npx skills add https://github.com/vshulcz/deja-vu --skill deja-search # skills CLI: Claude Code, Cursor, Goose, Copilot…
openclaw skills install @vshulcz/deja-search # ClawHub
hermes skills install vshulcz/deja-vu/skills/deja-search # Hermes
```
Skill вызывает установленный бинарник `deja`, своего не несёт.
Другие способы: `brew install deja-vu`,
`go install github.com/vshulcz/deja-vu/cmd/deja@latest`, или `npx @vshulcz/deja-vu "запрос"`, чтобы
попробовать ничего не устанавливая. На Windows установочный скрипт выходит с `unsupported OS` — это
shell-скрипт; используйте `scoop install deja-vu` (есть в основном bucket Scoop) или `winget install vshulcz.deja-vu`, либо возьмите `deja-vu__windows_amd64.zip` из
[последнего релиза](https://github.com/vshulcz/deja-vu/releases/latest) и положите `deja.exe` в `PATH`.
Одного бинарника достаточно для полной работы: индексация, поиск, `show`, `ctx`, `blame`, `--json` и
вычистка секретов не требуют больше ничего. `deja install` подключает MCP к вашим агентам и включает recall
на старте сессии — это полезно, но не обязательно.
## Ищите сами
`deja` без аргументов в терминале открывает поиск по истории всех агентов. Сначала там сессии, стоящие
за вашими незакоммиченными изменениями, потом недавние в этом проекте, и список сужается по мере ввода.
- `↑↓` выбирает сессию, `↵` открывает её на совпадении, `n` и `N` переходят между совпадениями, `esc` возвращает назад. Внутри сессии `/` ищет слово, `]` и `[` прыгают между вашими вопросами.
- Строка поиска понимает фильтры: агент с двоеточием (`codex:`), `today`, `yesterday`, `week`, `month` и `in:<проект>`.
- `r` возобновляет сессию в агенте, который её записал. `o` продолжает её в любом другом агенте, и тот начинает с того, что сессия спрашивала, решила и оставила открытым.
- `tab` переключает между этим проектом, всеми проектами и Deleted — сессиями, которые их агент удалил, а deja ещё хранит; `R` возвращает такую на место.
- `?` показывает все клавиши, в `^k` остальное (скопировать id сессии или путь проекта, забыть сессию), в списке `q` выходит; `esc` возвращает на шаг назад, а из пустой строки поиска выходит.
С `DEJA_TUI=0` вместо экрана печатается текстовая сводка, она же `deja brief`. В pipe печатается, что
проиндексировано и какую команду запустить дальше.
## Что это даёт
**Решено в Codex — помнит Claude.** Сорок один кодинг-агент пишет каждый разговор в локальные файлы,
deja превращает эти файлы в слой памяти, который читают все они.
| | |
| --- | --- |
| **Поиск назад во времени** | `deja "connection pool exhausted"` ищет по гигабайтам, включая всё, что было до установки deja. Вопрос на естественном языке откатывается к режиму релевантности. Время — подсказка, а не фильтр. |
| **Recall между агентами** | MCP-инструмент `deja` в режиме `recall` в любом агенте отвечает «это мы чинили три недели назад», кто бы тогда ни чинил. |
| **Переживает компактацию** | Замерено на 43 компактациях: сводка сохранила 77% решений и 0.2% команд, которые вы запускали. Остальные 99.8% возвращает deja. В Claude Code и Codex deja записывает задачу, файлы и команды в момент начала компактации и один раз отдаёт их после неё. |
| **Recall в момент действия** | Перед тем как агент правит файл или запускает команду, хук `PreToolUse` называет прежние решения по этому файлу, рабочий вариант этой команды или программу, которой на этой машине просто нет. Когда команда падает, хук `PostToolUse` показывает, что запускали после той же ошибки на этой машине — ровно та пара, про которую агент сам не спросит. |
| **Индексируется работа, а не только слова** | Каждый открытый за ход файл, каждая запущенная команда с кодом возврата и точный фрагмент, который заменила правка. Ровно то, что теряет любая сводка. |
Ещё: `deja promote --state rejected` помечает отменённое решение, и дальше каждое попадание показывает,
что это пробовали и отвергли; попадание сообщает «4 файла этой сессии с тех пор изменились» и молчит, когда
судить не может; `deja sync ssh laptop` переносит память между машинами только дописыванием, без облака
посередине; `deja handoff --to codex` упаковывает текущий контекст, чтобы продолжить в другом агенте;
ключи, токены, JWT и блоки приватных ключей известных форм вырезаются при индексации — но совпадение по
шаблону не детектор секретов, незнакомая форма может пройти.
### Нарисуйте собственную работу
`deja stats --card` рисует прямо в терминале; дайте имя файла — запишет SVG для README вашего профиля.
Чтобы опубликовать в другом месте, [переведите в PNG](https://vshulcz.github.io/deja-vu/card/) — страница
конвертирует в вашем же браузере.
Полный справочник — на [сайте документации](https://vshulcz.github.io/deja-vu/).
## Приватность
Индексация и поиск локальны. Сеть нужна только `deja update`, `deja sync ssh`, проверке версии внутри
`deja doctor`, `deja embed`, который ходит на заданный вами эндпоинт (а когда семантический сайдкар собран, ещё и каждый поиск: он отправляет запрос на этот эндпоинт), и раз в день интерактивной команде,
чтобы узнать последний релиз. Эта проверка не отправляет данных сессий; `DEJA_OFFLINE=1` или
`DEJA_NO_UPDATE_NOTICE=1` её отключает.
Учётные данные вычищаются при индексации: ключи AWS, присваивания `api_key=` и `token=`, bearer-токены и
голые JWT, PEM-блоки приватных ключей, токены разных провайдеров, URL вида `scheme://user:pass@host`,
высокоэнтропийные значения, под которые нет правила, и пароли, написанные прозой — «the admin password
is …», где опереться не на что. Значение становится `[redacted:]`, текст вокруг остаётся доступным
для поиска. `deja share` и `deja sync export` чистят ещё раз при экспорте. Совпадение по шаблону не детектор
секретов: форма, которой нет в правилах, может пройти как есть — см. модель безопасности.
`deja forget` убирает сессии из перестроенного индекса и оставляет надгробие, так что следующий
`deja index` не поднимет их обратно из исходной истории.
[Модель безопасности](../../docs/SECURITY-MODEL.md) описывает потоки данных, границы вычистки, допущения о
доверии и проверку релизов.
## Командная строка
Голый `deja` в терминале открывает [экран поиска](#ищите-сами). С запросом или любой командой ниже он
печатает результат и завершается:
```text
$ deja "jwt refresh token"
[claude] api · Jul 8 · 8f31c0a9 — 2 matches
login started failing after refresh token rotation; jwt kid mismatch in tests
fixed by reloading jwks cache after rotateKey and adding a clock-skew test
[codex] web · Jul 1 · b77d91e2 — 1 match
refresh token cookie needed SameSite=Lax in local callback flow
```
| Команда | Что делает |
| --- | --- |
| `deja <запрос>` | Ищет по всей истории. Несколько слов — это AND, кавычки требуют точной последовательности; когда точного попадания нет, пробует словоформы и близкие написания. |
| `deja` | В терминале — экран поиска, описанный выше. `deja brief` вместо него печатает текстовую сводку: сегодняшние сессии, что отдала deja, недавняя работа и запрос, который стоит попробовать. |
| `deja wip` | Чем занималась прошлая сессия в этом каталоге: задача, к чему пришли, открытые файлы, последняя команда и упала ли она. Всё выведено из записей, без опоры на чьи-то заметки. |
| `deja blame <путь>[:строка]` | Какие сессии обсуждали этот файл, что решили и почему. Со строкой: коммит, изменивший её последним, и сессия, которая написала эту строку или текст, заменённый этим коммитом. |
| `deja files <тема>` | В обратную сторону: какие файлы на самом деле трогала работа по теме. |
| `deja how <инструмент>` | Как эту вещь реально запускают на этой машине, с настоящими аргументами, из команд, которые агенты уже выполняли. |
| `deja fix <ошибка>` | Что запускали после той же ошибки на этой машине, и после чего она больше не появлялась. Никогда не merge, force push или удаление. |
| `deja friction` | Ошибки, попавшие в три и больше разных сессий, с указанием, из каких они инструментов. |
| `deja ctx <запрос>` | Markdown-выжимка лучшего попадания вместе с кодом, который та сессия изменила, годная прямо в промпт. |
| `deja resume ` | Открывает найденную сессию заново в её родном инструменте. |
| `deja view` | Выгружает всю память в один локальный HTML-файл. Без сервера, ничего не уходит с машины. |
| `deja doctor [--deep]` | Самопроверка; с `--deep` сверяет индекс с исходными файлами. |
| `deja mcp` | MCP-сервер по stdio — тот самый, который подключает `deja install`. |
Полный справочник — в [документации команд](https://vshulcz.github.io/deja-vu/guide/commands.html).
### MCP-инструменты
Сервер отдаёт один инструмент `deja`, режим выбирается параметром `mode`: `recall`, `context`, `blame`,
`fix`, `how`, `orient`, `remember`, `handoff`. `deja install` подключает его сам — это важно знать только при ручной настройке
агента. Прежние шесть имён инструментов продолжают работать у уже подключённых клиентов.
Один инструмент вместо семи — это про стоимость, а не про стиль. Подключённый MCP-сервер отправляет описания
своих инструментов с каждым запросом, так что за них платят каждый ход независимо от того, вызвал агент
что-нибудь или нет: здесь 477 токенов против 8,283 у самого крупного из семи измеренных серверов. У самой
deja было 828, пока схему не свели к одному инструменту с режимами.
## Поддерживаемые инструменты
С включённым авто-recall Claude Code и Codex отдают deja текущую запись в момент начала компактации, и она
сохраняет то, что сводка вот-вот потеряет: задачу, выводы, файлы, чем закончилась каждая команда и что
осталось недоделанным. Следующий хук в той же сессии и том же рабочем каталоге возвращает это одним куском,
не больше 4 КБ, со строкой о том, менялся ли репозиторий с тех пор. `deja stats` считает количество вызовов
инструментов между компактацией и первой правкой — этим и меряли.
Подробности во [восстановлении после компактации](../../docs/compaction.md).
Claude Code · Cline · Codex CLI · opencode · aider · Gemini CLI · Cursor · Antigravity ·
Grok Build · Hermes · Goose · Qwen Code · Kimi Code · pi · omp (Oh My Pi) · OpenClaw ·
Copilot CLI · VS Code Copilot Chat · Amp · prime-agent (PrimeIntellect) · Roo Code ·
Continue · Crush · DeepSeek Harness · Cherry Studio · Senpi · gajae-code · Kimchi Coding ·
Command Code · ZCode · CodeWhale · Reasonix · Kiro · Kilo Code · CodeBuddy Code ·
TRAE CLI · Muse Code · Junie · JetBrains AI Assistant · Devin CLI · Windsurf / Devin Desktop · MiniMax Code · Zed.
Что именно каждый из них поддерживает — MCP-recall, авто-recall, skills, команды, resume, handoff — см. в
[матрице возможностей в английском README](../../README.md#supported-harnesses). Нестандартные пути к хранилищам
задаются переменными `DEJA_*_ROOT`, переменные миграции самих инструментов тоже учитываются.
### Агенты со своим пакетом
`deja install --auto` подключает эти так же, как остальные, и это всегда самый короткий путь. Заодно у
каждого есть пакет в своей экосистеме — для тех, кто ставит расширения оттуда:
| Агент | Пакет | Установка |
| --- | --- | --- |
| opencode | npm `opencode-deja` | `opencode plugin opencode-deja` |
| DeepSeek Harness | npm `dsh-deja` | `dsh plugin --profile web add dsh-deja` |
| Zed | `deja-context-server` | Zed → Extensions → deja |
| Kimi Code | плагин `deja` | `/plugins install https://github.com/vshulcz/deja-vu` |
| Codex CLI | плагин `deja-vu` | `codex plugin marketplace add https://github.com/vshulcz/deja-vu`, затем `codex plugin add deja-vu@deja-vu` |
| Grok Build | плагин `deja` | `grok plugin marketplace add vshulcz/deja-vu`, затем `grok plugin install deja` |
| OpenClaw | ClawHub и npm `@vshulcz/openclaw-deja` | `openclaw plugins install clawhub:@vshulcz/openclaw-deja` |
| pi (и omp) | npm `@vshulcz/pi-deja` | `pi install npm:@vshulcz/pi-deja` |
| Hermes | провайдер памяти `deja-memory` в каталоге плагинов Hermes | `hermes plugins install deja-memory` или с GitHub: `hermes plugins install vshulcz/deja-vu/extensions/hermes` |
Любого пути достаточно, оба вместе тоже не мешают: каждый пакет сначала читает то, что записал
`deja install`. opencode, dsh и OpenClaw дописывают только недостающее; Kimi, Grok, Codex и pi уступают,
если установщик уже всё подключил; в Zed обе стороны используют один и тот же id сервера. Так что порядок
установки значения не имеет.
Все они используют уже установленный вами deja, своя копия внутри пакета — только запасной вариант.
## Семантический recall, по желанию
Укажите `deja embed` на локальную Ollama, LM Studio или любой OpenAI-совместимый эндпоинт через
`DEJA_EMBED_URL`, и вопрос другими словами тоже попадёт. Без доступного рантайма лексический поиск и
MCP-recall работают как обычно.
## Доказательства
На 58% меньше токенов на задаче, которую эта машина уже решала · 88.9% hit@1 на LongMemEval-S (очищенный набор из 470 вопросов) · 71.9% на LoCoMo · поиск по гигабайтам истории за миллисекунды По 11 прогонов на плечо: 53,558 токенов против 126,222 без всякой памяти; на более поздней сборке, снова по 11 прогонов: 52,815 против 103,443 ·
во что обходится одна задача ·
оба стенда для оценки поиска лежат в этом репозитории и прогоняются на публичных датасетах за минуты ·
проверьте цифры сами