## 설치
```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
```
설치에 10초, 색인에 10초쯤 걸립니다. 두 번째 명령은 찾아낸 모든 에이전트에 MCP recall을 연결하고,
지원하는 곳에서는 세션 시작 시 회상을 켜고, 첫 색인을 만들어 둡니다. 다음 세션이 기다릴 일이 없도록.
새 에이전트 세션을 열고 몇 달 전에 했던 일을 물어보세요:
> jwt refresh rotation 전에 다뤄본 적 있나? 기억을 찾아봐
굳이 묻지 않아도 됩니다. 자동 회상을 켜 두면 세션이 열리는 순간 에이전트는 이 프로젝트에서 무엇을
해결했는지 이미 알고 있습니다. 직접 찾아보려면 `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`이 써 둔 것을 읽고 빠진 부분만 채우므로, 도구가 중복 등록되거나
회상이 두 번 일어나지 않습니다. 자세한 내용은 [`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`(Scoop 기본 main 버킷에 있습니다)나 `winget install vshulcz.deja-vu`를 쓰거나 [최신 릴리스](https://github.com/vshulcz/deja-vu/releases/latest)에서
`deja-vu__windows_amd64.zip`을 받아 `deja.exe`를 `PATH`에 두세요.
바이너리 하나만으로도 온전한 설치입니다. 색인, 검색, `show`, `ctx`, `blame`, `--json`, 비밀정보 제거는
다른 무엇도 필요로 하지 않습니다. `deja install`이 하는 일은 MCP를 에이전트에 연결하고 세션 시작 회상을
켜는 것입니다. 있으면 좋지만 선택 사항입니다.
## 직접 검색하기
터미널에서 인자 없이 `deja`를 실행하면 모든 에이전트의 기록을 검색하는 화면이 열립니다. 아직 커밋하지 않은
변경 뒤에 있는 세션부터 보여 주고, 그다음 이 프로젝트의 최근 세션이 이어지며, 입력할수록 목록이 좁혀집니다.
- `↑↓`로 세션을 고르고, `↵`로 일치한 곳에서 열고, `n`과 `N`으로 일치 항목 사이를 오가며, `esc`로 돌아갑니다. 세션 안에서는 `/`로 단어를 찾고, `]`와 `[`로 내가 한 질문 사이를 오갑니다.
- 검색창은 필터도 받습니다. 콜론을 붙인 에이전트(`codex:`), `today`, `yesterday`, `week`, `month`, `in:`입니다.
- `r`은 세션을 작성한 에이전트에서 재개합니다. `o`는 다른 아무 에이전트에서 이어가며, 그 에이전트는 세션이 무엇을 물었고 무엇을 결정했고 무엇을 남겨 두었는지를 갖고 시작합니다.
- `tab`은 이 프로젝트, 모든 프로젝트, Deleted 사이를 전환합니다. Deleted는 에이전트가 지웠지만 deja가 아직 가진 세션이고, `R`로 하나를 되돌려 놓습니다.
- `?`는 모든 키를 보여 주고, `^k`에는 나머지(세션 id나 프로젝트 경로 복사, 세션 잊기)가 있으며, 목록에서 `q`는 종료하고, `esc`는 한 단계 뒤로 가며 검색창이 비어 있으면 종료합니다.
`DEJA_TUI=0`이면 화면 대신 텍스트 요약을 출력하며, `deja brief`와 같은 내용입니다. 파이프로 연결하면 무엇이
색인되었는지와 다음에 실행할 명령을 출력합니다.
## 무엇을 얻나
**Codex에서 해결하면 Claude가 기억합니다.** 마흔한 개의 코딩 에이전트가 모든 대화를 로컬 파일에 쓰고,
deja는 그 파일들을 모두가 읽을 수 있는 하나의 기억 계층으로 바꿉니다.
| | |
| --- | --- |
| **과거로 향하는 검색** | `deja "connection pool exhausted"`는 deja를 설치하기 이전 것까지 포함해 수 기가바이트를 훑습니다. 자연어 질문은 관련도 모드로 넘어갑니다. 시간은 힌트이지 필터가 아닙니다. |
| **에이전트를 넘는 회상** | MCP의 `deja` 도구는 `recall` 모드로, 어느 에이전트에서든 "이건 3주 전에 고쳤다"고 답합니다. 그때 누가 고쳤든 상관없이. |
| **압축 이후에도 남습니다** | 43번의 컨텍스트 압축에서 측정: 요약은 결정의 77%와 실행한 명령의 0.2%를 지켰습니다. 나머지 99.8%는 deja가 돌려줍니다. Claude Code와 Codex에서는 압축이 시작되는 순간 deja가 작업, 파일, 명령을 적어 두고 압축이 끝난 뒤 한 번 돌려줍니다. |
| **행동하는 바로 그 순간의 회상** | 에이전트가 파일을 고치거나 명령을 실행하기 직전에 `PreToolUse` 훅이 이 파일에 대한 이전 결정, 이 명령이 실제로 통하는 형태, 또는 이 컴퓨터에 아예 없는 프로그램을 말해 줍니다. 명령이 실패하면 `PostToolUse` 훅이 이 컴퓨터에서 같은 오류 뒤에 무엇을 실행했는지 보여 줍니다. 에이전트가 스스로 묻지 않는 바로 그 한 쌍입니다. |
| **말이 아니라 작업을 색인합니다** | 각 턴에서 연 파일, 실행한 명령과 종료 코드, 편집이 대체한 정확한 조각. 어떤 요약이든 놓치는 부분이 바로 그것입니다. |
그 밖에: `deja promote --state rejected`는 뒤집힌 결정을 표시하고, 이후 모든 검색 결과에 시도했다가
기각되었음이 함께 나옵니다. 검색 결과는 "이 세션이 다룬 파일 4개가 그 뒤 변경됨"을 알리고, 판단할 수 없을
때는 말하지 않습니다. `deja sync ssh laptop`은 기계 사이에서 기억을 옮기며, 추가만 할 뿐 중간에 클라우드가
없습니다. `deja handoff --to codex`는 현재 컨텍스트를 묶어 다른 에이전트에서 이어가게 합니다. 알려진 형태의
키, 토큰, JWT, 개인 키 블록은 색인 시점에 제거됩니다. 다만 패턴 매칭은 비밀정보 탐지기가 아니라서 모르는
형태는 지나갈 수 있습니다.
### 자기 작업을 그려 보기
`deja stats --card`는 터미널에 바로 그립니다. 파일 이름을 주면 프로필 README에 넣을 SVG를 씁니다.
다른 곳에 올리려면 [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 개인 키 블록, 각 제공자의 토큰, `scheme://user:pass@host` 형태의 URL, 어떤 규칙에도 걸리지 않는
고엔트로피 값, 그리고 산문 속에 쓰인 비밀번호("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` | stdio MCP 서버. `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이었습니다.
## 지원하는 도구
자동 회상을 켜면 Claude Code와 Codex는 압축이 시작될 때 현재 기록을 deja에 넘기고, deja는 요약이 곧 잃을
것을 남깁니다. 작업, 결론, 파일, 각 명령이 어떻게 끝났는지, 무엇이 아직 남았는지. 같은 세션, 같은 작업
디렉터리의 다음 훅이 그것을 4 KB를 넘지 않는 한 덩어리로 돌려주고, 저장소가 그 뒤 바뀌었는지 한 줄로
덧붙입니다. `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 회상, 자동 회상, skill, 명령, 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 | Hermes 플러그인 카탈로그의 메모리 공급자 `deja-memory` | `hermes plugins install deja-memory`, 또는 GitHub에서: `hermes plugins install vshulcz/deja-vu/extensions/hermes` |
어느 쪽이든 하나면 충분하고 둘 다 해도 탈이 없습니다. 각 패키지는 먼저 `deja install`이 써 둔 설정을
읽습니다. opencode, dsh, OpenClaw는 빠진 부분만 채우고, Kimi, Grok, Codex, pi는 설치기가 이미 연결했다면
물러섭니다. Zed에서는 양쪽이 같은 server id를 씁니다. 그래서 설치 순서는 상관없습니다.
모두 여러분이 이미 설치한 deja를 사용하며, 패키지 안에 든 것은 대비책일 뿐입니다.
## 선택적인 의미 기반 회상
`DEJA_EMBED_URL`로 `deja embed`를 로컬 Ollama, LM Studio 또는 OpenAI 호환 엔드포인트에 가리키면
다른 표현으로 물어도 걸립니다. 쓸 수 있는 런타임이 없으면 어휘 검색과 MCP 회상은 평소대로 동작합니다.
## 근거
이 컴퓨터가 이미 해결한 작업에서 토큰 58% 절감 · LongMemEval-S(470문항 정제 세트)에서 hit@1 88.9% · LoCoMo에서 71.9% · 수 기가바이트 기록을 밀리초 단위로 조회 한쪽당 11회 실행: 53,558 토큰 대 아무것도 연결하지 않았을 때의 126,222, 이후 빌드에서 다시 11회 실행: 103,443 대비 52,815 ·
작업 하나를 끝내는 비용 ·
검색 평가 하네스 두 개 모두 이 저장소에 있고 공개 데이터셋에서 몇 분이면 돕니다 ·
숫자를 직접 확인하세요