关于 deja-vu
deja-vu 是供编码 Agent 使用的本地会话记忆工具,可索引多个 Agent 保存的历史记录,并在需要时提供相关内容。它通过共享索引和会话启动自动回忆,帮助不同 Agent 重用以往的解决方案。
主要功能
- 01跨 Agent 会话索引
- 02本地搜索历史记录
- 03会话开始时自动回忆
- 04跨 Agent 交接会话
- 05索引时清理凭据
适用场景
- 01找回数月前解决过的问题
- 02让不同编码 Agent 复用历史决策
- 03排查命令失败或代码修改背景
MCP 相关
deja-vu 可将 MCP 回忆接入已检测到的 Agent,并提供会话启动回忆。安装配置会为支持的 Agent 添加 MCP;二进制单独使用也可搜索,无需 MCP。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| q | string | 否 | 要询问的内容:问题或确切词条;blame 请提供路径,fix 请逐字提供失败输出,remember 请提供事实。 |
| mode | enum | 是 | recall | context | blame | fix | how | orient | remember | handoff |
| limit | number | 否 | 最大结果数。 |
| harness | string | 否 | 可选筛选条件,编写它的 Agent:claude、codex、trae、opencode 等 37 个(`deja sources`)。 |
| project | string | 否 | 可选项目筛选条件;对于 remember,表示归档位置。 |
详细介绍
让你的编码 Agent 不再重复调试已经修复的问题。
Claude Code、Codex、Cursor 和另外 40 多种 Agent 已经会将每次会话保存到磁盘。 deja 会索引所有内容,追溯数月之久,并将重要部分交给当前正在工作的 Agent。
English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Español | Português | Français | Deutsch | Русский | Türkçe | हिन्दी

没人进行过搜索——Agent 自己调用了 deja。两个针对合成语料库的真实运行:没有发布任何人的历史记录。
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto
适用于 macOS 和 Linux;十秒安装,约十秒完成索引 · Windows、Homebrew、npm 等安装方式
| 召回率 LongMemEval-S 上 R@5 为 97.2% MemPalace 公布的数据为 96.6%,agentmemory 为 95.2% | Token 数 仅为 agentmemory 的一半 针对这台机器之前已经解决过的任务 | 索引时间 17.6 秒即可为 19,195 个会话建立索引 七种工具中的下一种需要 72 秒 |
我维护着 deja-vu,因此所有驱动、语料库和评分规则都在此仓库中 · 正面对比,以及如何重新运行你存疑的数据行 · 所有运行结果
文档 · 基准测试 · 对比情况 · 将其集成到你的工具中
觉得有用?在 GitHub 上为 deja-vu 点赞。
## 自行搜索在终端中不带参数运行 deja,即可搜索所有 Agent 的历史记录。它会先显示未提交更改所涉及的会话,然后显示此项目中最近的会话;随着你输入,列表会逐渐缩小。

↑↓选择会话,↵跳转到匹配内容处打开,n和N在匹配项之间切换,esc返回。在会话中,/查找词语,]和[在你提问的轮次之间跳转。- 搜索框接受筛选条件:带冒号的 Agent(
codex:)、today、yesterday、week、month和in:<project>。 ^s按日期标题列出结果,最新的排在最前;再次按下则恢复最佳匹配优先。脚本中运行deja search --sort date可实现相同效果。r在编写该会话的 Agent 中恢复会话。o则在任何其他 Agent 中继续会话,并提供会话中提出的问题、做出的决定和未完成的事项作为起点。tab在此项目、所有项目和 Deleted 之间切换;Deleted 显示 Agent 已删除、但 deja 仍保留的会话;按R可恢复会话。D在确认后从 Agent 和 deja 中删除会话(脚本中运行deja delete <id>)。?列出所有按键,^k显示其余操作(复制会话 ID 或项目路径、忘记会话),q从列表退出;esc返回,并在搜索框为空时退出。
设置 DEJA_TUI=0 后,会改为打印文本摘要,也就是 deja brief 的输出。通过管道运行时,它会打印已索引的内容以及下一步要运行的命令。
亮点
- 开箱即满。 安装前数月的历史记录从第一天起即可搜索:在数 GB 的数据中运行
deja "connection pool exhausted"。 - 一份记忆,适用于每个 Agent。 在 Codex 中找到的修复方案,也能在 Claude Code、Cursor 或 opencode 中找回;所有四十三种 Agent共用同一索引。
- 无需主动询问。 在会话开始时、编辑文件或运行命令之前,以及命令失败之后,都会提供相关回忆。
- 压缩后依然可用。 在 43 次实测压缩中,摘要保留了 77% 的决定和 0.2% 的命令;deja 会补回其余内容(原理)。
- 索引实际工作,而不只是对话。 每轮打开的文件、带退出状态的命令,以及编辑所替换的确切文本片段。
- 知道哪些方案奏效。
deja promote <id> --state rejected会标记被撤销的决定,之后每次命中都会注明该方案曾尝试过,以及放弃的原因;--state accepted可撤销该标记。 - 提醒你情况有变。 命中结果会提示 本次会话操作过的 4 个文件已有更改;无法判断时则保持安静。
- 本地运行,保护隐私。 不需要模型或服务;只有启用语义回忆时才会使用嵌入。索引构建时会清除密钥和令牌(隐私)。
- 随你迁移。 使用
deja sync ssh laptop在设备之间同步,无需经过云端;使用deja handoff --to codex在另一个 Agent 中继续。 - 单个 Go 二进制文件。 支持 macOS、Linux 和 Windows,可通过 Homebrew、Scoop、winget、npm 或
go install安装。
将自己的工作化为卡片
deja stats --card 会在终端中绘制卡片;提供文件名则会生成 SVG,可用于个人资料 README。若要发布到其他地方,可以将其转换为 PNG——该页面会在你的浏览器中完成转换。
完整的功能参考请参阅文档。
安装
在 macOS 和 Linux 上,开头的两条命令就是完整的安装步骤:
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto
该脚本会将二进制文件放入 ~/.local/bin。如果该目录尚未添加到 PATH,那么在同一个 shell 中运行第二条命令时会提示找不到命令:请运行脚本打印的 next: 行(其中包含完整路径),或者添加 PATH 配置行后打开一个新的 shell。

十秒即可安装,大约十秒即可建立索引,之后就能派上用场。第二条命令会将 MCP 记忆检索接入它找到的所有 Agent,在 Agent 支持的情况下启用会话开始时的记忆检索,并建立首个索引,这样下次会话就不必再等它完成。
开启一个新的 Agent 会话,然后问它几个月前做过的事:
我们之前处理过 JWT 刷新轮换吗?查一下你的记忆
你也不必特意询问——启用自动记忆检索后,Agent 在会话开始时就已经知道你在该项目中解决过什么问题。想亲自查找的话,运行 deja。
其他安装方式,以及如果你不想安装全部内容该怎么做
可以运行 brew install deja-vu、go install github.com/vshulcz/deja-vu/cmd/deja@latest,或者运行 npx @vshulcz/deja-vu "query",无需安装即可试用。支持将 MCP 服务作为捆绑包导入的桌面应用,可以打开最新版本中的 .mcpb;其中包含二进制文件。
Claude Code、Qwen 和 OpenClaw 也可以从各自的市场获取同一个插件包(Codex 有自己的插件包,位于提供独立插件包的 Harness表格中;Cursor 的插件包位于 cursor-plugin/)。
Copilot CLI 也支持安装,但只安装技能,因此请在其中使用 deja install copilot-auto:
claude plugin marketplace add vshulcz/deja-vu && claude plugin install deja-vu@deja-vu
在 Windows 上,安装脚本会因 unsupported OS 而退出——它是一个 shell 脚本。请使用 Scoop(所有 Scoop 安装都自带 main bucket),或使用 Windows 自带的 winget:
scoop install deja-vu
winget install vshulcz.deja-vu
也可以从最新版本下载 deja-vu_<version>_windows_amd64.zip,并将 deja.exe 放到 PATH 中,例如 %USERPROFILE%\.local\bin。
仅有二进制文件即可完整支持搜索:索引、搜索、show、ctx、blame、--json 和脱敏都不需要其他内容。deja install 用于将 MCP 接入你的 Agent 并启用会话开始时的记忆检索——值得安装,但并非必需。在仅安装二进制文件的配置中,deja doctor 会将每个 MCP 目标报告为 config missing,或在已安装 Agent 的位置报告为 not-wired;这表示当前配置正常运行。deja warmup 还会在 ~/.agents/skills/deja-search/SKILL.md 中放置一个技能文件,向 Agent 说明 CLI 的使用约定——包括 deja recall、ctx、blame、如何阅读记忆检索页面以及如何请求下一页——这样即使没有 MCP,它也知道可以搜索历史记录。仓库中的副本位于 skills/deja-search/SKILL.md。
deja install --all 相当于不启用会话开始时的记忆检索的 --auto:Agent 会在决定调用时从记忆中获取回答,而不是在每个会话开始时都调用。 Agent 设置指南介绍了每种 Harness 支持的功能、aider 的只读上下文文件,以及 Windows 的 cmd /c deja mcp 包装命令。
写入每个 Agent 自有指导文件的内容
安装过程还会为检测到的各类工具写入用户级指导:Claude Code、Codex、opencode、Gemini CLI、Antigravity、Qwen、Kimi Code、pi、Senpi、Copilot、VS Code Copilot Chat、Goose、OpenClaw、Hermes、Roo Code、omp、Amp、prime-agent、DeepSeek Harness、Continue、Crush、CodeBuddy Code、WorkBuddy、Zed、TRAE CLI、TRAE IDE、Muse Code、CodeWhale、ZCode 和 Junie 都会获得各自的指导文件(或写入配置的 `XDG_CONFIG_HOME`)。重新运行会重写 deja 的技能文件或标记区块,不会更改周围的用户内容。使用 `deja install --all --no-guidance` 可选择不安装指导;Grok Build 和 Devin CLI 会在 `~/.agents/skills` 中获得共享技能,因为它们会读取该位置;旁边写入的 `~/.grok/GROK.md` 是给共用该目录的另一个无关社区 CLI 使用的。Cursor 没有用户级指令文件,因此会在 `~/.agents/skills` 中获得共享技能——这是 Cursor 读取技能的四个位置之一——仅在内容看起来相关时读取,而不是在每次会话中读取。Kilo Code、gajae-code、Kimchi、Command Code、Cherry Studio 和 Reasonix 会获得该技能;MiniMax Code 会在插件包内获得该技能;Kiro 则会在其各自的安装目标中获得该技能和一个 steering 文件。隐私
索引和搜索都在本地进行。网络仅用于 deja update、deja sync ssh、deja doctor 中的版本检查、针对你配置的端点运行 deja embed(以及语义侧车文件构建完成后,每次搜索都会将查询发送到该端点),还有交互式命令每天查询一次最新版本。该查询不会发送会话数据;设置 DEJA_OFFLINE=1 可将其关闭,设置任意值的 DEJA_NO_UPDATE_NOTICE 也可关闭,同时还会隐藏新版本首次运行时显示的提示。
构建索引时会剔除凭据:云服务和提供商的密钥、令牌和 JWT、PEM 区块、URL 中的密码或正文中提及的密码。每项都会替换为 [redacted:<kind>],其周围的文本仍可搜索。源转录仍会保留这些内容(一台机器的 42 个会话中共有 84 项):deja secrets 会列出相关会话,但不会打印任何凭据值;deja secrets --scrub 会重写可处理的凭据,并在文件旁保留原始文件。
deja forget 会删除会话,并在重建索引时继续保持删除状态。~/.config/deja/exclude 可按每行一个项目排除项目,或使用 harness:opencode 排除整个存储库。安全模型说明了数据流,以及无法通过脱敏捕获的内容。
CLI
在终端中直接运行 deja 会打开搜索界面。指定查询或运行以下任一命令时,它会打印结果并退出:
$ 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 <query> | 搜索所有历史记录。多个词按 AND 逻辑匹配,引号中的短语必须连续出现;如果查询没有精确匹配项,则会尝试匹配词形和相近拼写,此时子串会匹配到包含它的词(code 会找到 opencode)。--sort date 会优先列出最新的匹配项。 |
deja | 在终端中打开上述全屏搜索。deja brief 则会打印文字摘要:今天的会话、deja 提供的内容、近期工作,以及一条可尝试的搜索。 |
deja wip | 查看该目录中最近一个会话在做什么:任务、已确定的结论、正在处理的文件、最后执行的命令,以及命令是否失败——这些信息从对话记录中提取,而非来自某人记得写下的笔记。 |
deja blame <path>[:line] | 查看讨论过某个文件的会话、做出的决定及原因。指定行号时:查看最后修改该行的提交,以及编写该行或提交所替换文本的会话。--attribution 只打印行号相关的答案;使用 --json 时以 JSON 格式打印;--git-note 会将其记录到 refs/notes/deja。 |
deja files <topic> | 反向查询:查看某个主题相关的工作实际涉及了哪些文件。 |
deja how <tool> | 查看这台机器实际上如何运行某个工具,包括之前的 Agent 使用过的真实标志。 |
deja fix <error> | 查看这台机器之前遇到同一错误后执行了什么操作,以及错误后来没有再次出现的情况。绝不会执行合并、强制推送或删除操作。 |
deja friction | 查看在至少三个不同会话中出现的错误,以及对应的运行环境。 |
如果裸查询的第一个词至少有四个字符,且与某个命令名只差一个字符,deja 会将该命令名打印到 stderr,然后照常搜索。deja search <query> 会跳过建议。
使用搜索结果,并在机器之间迁移数据
使用搜索结果
| 命令 | 功能 |
|---|---|
deja ctx <query> | 以 Markdown 格式整理最佳匹配项的摘要,并附上其修改过的代码,可直接通过管道传入提示词。 |
deja recall <words> | MCP recall 工具提供给 Agent 的页面:约 4 KB,优先展示当前项目的信息。适用于通过 shell 运行 deja 的技能和脚本。 |
deja resume <id> | 在原生运行环境中重新打开找到的会话。--app 会在 ChatGPT 桌面应用中打开 Codex 会话。 |
deja restore <path> | 还原 Agent 替换掉的文本片段,内容取自其编辑记录中的 old_string。绝不会覆盖原文件。 |
deja promote <id> | 将会话提炼为经过整理的笔记,并附上来源、标签和生命周期状态。笔记的优先级高于原始对话记录。 |
deja share <id> | 为同事生成经过清理的会话摘要,并预先清除其中的机密信息。 |
迁移和检查
| 命令 | 功能 |
|---|---|
deja sync export/import/ssh | 在机器之间迁移记忆。带水印、仅追加且幂等。 |
deja view | 将全部记忆显示为一个本地 HTML 文件。无需服务端,文件也不会离开这台机器。 |
deja stats | 汇总你的 Agent 工作。--card 会在终端中绘制卡片;--card <file>.svg 会生成用于个人资料的卡片;--html 会生成可浏览的时间线。 |
deja secrets [--scrub] | 查看哪些会话的源对话记录中包含凭据,以及凭据类型。绝不会打印凭据值。--scrub 会改写可以清理的记录,并在文件旁保留原文件。 |
deja rules [sync] | 将常驻规则保存在 ~/.config/deja/rules.md 中;sync 会将这些规则作为标记区块复制到每个已安装 Agent 的全局规则文件中。 |
deja rules candidates [--json] [--limit n] [--since 90d] | 查看你在所有工具中纠正 Agent 的对话轮次,并标注所属会话。让 Agent 建议规则,它会将这些内容分组;只有你选择后才会写入。 |
deja doctor [--deep] | 自我诊断;使用 --deep 时,还会验证索引是否与源数据一致。 |
deja mcp | stdio MCP 服务,也是 deja install 配置的服务。 |
MCP 工具
该服务提供一个带有 mode 的工具 deja;deja install 会将其接入。每轮一个工具定义占用 477 个令牌,而在第零天测量的七个服务中,最大者占用 8,283 个令牌。六个较旧的工具名称(recall、recall_context、blame、fix、how、remember)仍会响应。deja mcp --context-search 是一个独立服务,提供单个 context_search 工具,适用于 Qwen Code 的 External Context MCP Profile v1(Qwen 页面)。
参数和返回结构
| 工具 | 参数 | 返回值 |
|---|---|---|
deja | mode、q、harness?、project?、limit? | 取决于下方的模式。 |
q 会承载该模式所询问的内容。下方各模式对应的名称仍可使用;但它们不再声明,因为无论是否调用工具,每轮都会读取架构。
| 模式 | q 的内容 | 还会读取 | 返回值 |
|---|---|---|---|
recall | 问题,或准确的错误字符串、名称或标志 | harness?、limit?、offset? | 密集的匹配片段,最多 4KB。 |
context | 与 recall 相同 | harness? | 最匹配会话的 Markdown 摘要,以及该会话修改的代码。 |
blame | 文件路径 | harness?、project?、since?、limit?、all? | 讨论过某个文件的会话。 |
fix | 原样的失败输出 | limit? | 此机器此前遇到相同错误后运行或修改的内容。 |
how | 工具或目标,例如 go test | project?、limit? | 此处 Agent 实际运行过的命令。 |
orient | 无——它会询问项目情况 | project?、limit? | 过去的会话在此处运行过的命令及其处理过的文件。 |
remember | 一条持久事实或决定 | project?、tags? | 存储一条持久决定,以供日后回忆。 |
handoff | 会话 ID 或 harness 名称;留空则选择此处最新的会话 | harness? | 另一个会话的目标、常驻指示、最新结论、已通过的检查及停止位置,以便继续该会话。 |
支持的 harness
aider · Amp · Antigravity · Claude Code · Cline · Codex CLI · Copilot CLI · VS Code Copilot Chat · Cursor · DeepSeek Harness · Gemini CLI · Goose · Grok Build · Hermes · Kimi Code · omp (Oh My Pi) · OpenClaw · opencode · Continue · Crush · pi · prime-agent (PrimeIntellect) · Qwen Code · Cherry Studio · Senpi · gajae-code · Kimchi Coding · Command Code · ZCode · Kiro · Kilo Code · Roo Code · Zed · Devin CLI · CodeWhale · Junie · JetBrains AI Assistant · Windsurf / Devin Desktop · CodeBuddy Code · Reasonix · TRAE CLI · Muse Code · MiniMax Code。
各自支持的功能
| Harness | MCP 召回 | 自动召回 | Skill | 命令 | 恢复会话 | 交接 | 依赖 | | --- | :-: | :-: | :-: | :-: | :-: | :-: | --- | | aider | ⚠ | ✅ | ✕ | ⚠ | ✕ | ✅ | deja aider | | Amp | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 从 0.0.1774963753 起,线程实时存储在 ampcode.com 上;deja 会读取其插件写出的线程,以及较旧的本地线程 | | Antigravity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Claude Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Cline | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Codex CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Copilot CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | VS Code Copilot Chat | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | — | | Cursor | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3(IDE 聊天、CLI 工具输出) | | DeepSeek Harness | ✅ | ✅ | ✅ | ✅ | ✕ | ✅ | zstd | | Gemini CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Goose | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | deja goose | | Grok Build | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3(grok-dev 存储) | | Hermes | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 | | Kimi Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | omp (Oh My Pi) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | OpenClaw | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3(2026.8+ 存储);.zst 归档和压缩事件需要 zstd(2026.9.9+) | | opencode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 | | Continue | ✅ | ⚠ | ✅ | ✅ | ✅ | ✅ | — | | Crush | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | sqlite3 | | pi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | prime-agent (PrimeIntellect) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Qwen Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | | Cherry Studio | ✅ | ✅ | ✅ | ✕ | ✕ | 粘贴 | 在“设置” -> MCP 中导入一次服务;为 Agent 启用该 Skill | | Senpi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | gajae-code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | Kimchi Coding | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | Command Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | ZCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CLI 数据库需要 sqlite3 | | Kiro | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CLI 数据库需要 sqlite3 | | Kilo Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CLI 存储需要 sqlite3 | | Roo Code | ✅ | ✕ | ✅ | ✅ | ✅ | 粘贴 | roo CLI(编辑器任务需在编辑器中重新打开) | | Zed | ✅ | ✕ | ✅ | ✅ | ✕ | 粘贴 | sqlite3 + zstd | | Devin CLI | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | sqlite3 | | CodeWhale | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | Junie | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | JetBrains AI Assistant | ✅ | ⚠ | ⚠ | ⚠ | ✕ | 粘贴 | 无 | | Windsurf / Devin Desktop | ✅ | ⚠ | ✅ | ✅ | ✕ | 粘贴 | 无 | | CodeBuddy Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | Reasonix | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 1.x 会话需要 zstd | | TRAE CLI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | Muse Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 无 | | MiniMax Code | ✅ | ✅ | ✅ | ✕ | ✅ | ✅ | `deja resume` 和 `deja handoff --to mcode --exec` 需要 MiniMax Code CLI(`mcode`);会话工作区需要 `sqlite3` |✅ 可用 · — 可实现,尚未构建 · ✕ 该 Harness 不具备此机制 · ⚠ 取决于 Harness 本身 · ? 尚未调查
TRAE IDE 已接入,但无法读取:其聊天记录存储在加密数据库中。deja install trae-ide
会添加 MCP 服务和 Skill,而 trae-ide-auto 会添加钩子;只有在“设置” > Hooks 中启用后,
TRAE IDE 才会运行这些钩子。
自定义存储位置通过 DEJA_*_ROOT 变量设置,同时也会遵循各 Agent 自己的路径迁移
变量。
会话格式注册表记录了每种 Harness
经观察得到的路径、记录架构和角色映射,并通过合成测试数据确保这些说明与解析器保持一致。
拥有独立软件包的 Harness
deja install --auto 会像配置其他 Harness 一样配置这里列出的所有 Harness,这是最简便的方式。它们也在各自的生态系统中提供软件包,适合从相应生态系统安装扩展,而不是通过 CLI 安装的用户:
| Harness | 软件包 | 安装 |
|---|---|---|
| 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 → 扩展 → 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-vu,或从 GitHub 安装:hermes plugins install vshulcz/deja-vu/extensions/hermes |
两种方式都可以单独使用,一起使用也不会重复做任何事:每个软件包都会读取 deja install 已写入的内容,并使用你已有的 deja。
在 Spec Kit 项目中,扩展会添加 /speckit.deja-vu.recall,用于在实现功能之前搜索过去的会话:
specify extension add deja-vu --from https://github.com/vshulcz/deja-vu/releases/latest/download/deja-spec-kit.zip
同样的搜索功能也提供为技能,任何加载 SKILL.md 的 Agent 都可以使用:
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
该技能会调用上述安装步骤中的 deja 二进制文件;它本身不包含该文件。
语义回忆(可选)
通过 DEJA_EMBED_URL 将 deja embed 指向本地 Ollama、LM Studio 或兼容 OpenAI 的端点,改写后的查询也能匹配到结果。如果没有可访问的运行时,词法搜索和 MCP 回忆功能会照常运行。OpenAI Platform 可使用其标准密钥:
export OPENAI_API_KEY='sk-...'
export DEJA_EMBED_URL='https://api.openai.com/v1/embeddings'
export DEJA_EMBED_MODEL='text-embedding-3-small'
deja embed
本地运行时、其他端点以及向量的成本
如果未设置 DEJA_EMBED_URL,deja 会探测 localhost:11434 和 localhost:1234,因此会自动发现已在运行 Ollama 或 LM Studio 的机器,无需用户指定。设置 DEJA_EMBED_OFF=1 或 DEJA_EMBED_URL=off 可关闭探测;其他已配置的 DEJA_EMBED_URL 仍会优先生效。
对于其他需要身份验证的兼容 OpenAI 端点,请显式设置 DEJA_EMBED_KEY:
export DEJA_EMBED_URL='https://example.com/v1/embeddings'
export DEJA_EMBED_MODEL='embedding-model'
export DEJA_EMBED_KEY='...'
deja embed
DEJA_EMBED_KEY 优先级最高。只有在 URL 为 HTTPS 的 api.openai.com 时才会自动使用 OPENAI_API_KEY;绝不会隐式将它发送到本地或第三方端点。
使用指令前缀训练的模型(例如多语言 E5 系列)需要在两端都添加前缀。DEJA_EMBED_QUERY_PREFIX 会加在每个搜索查询前,DEJA_EMBED_PASSAGE_PREFIX 会加在每段已索引文本前;两者默认均为空:
export DEJA_EMBED_MODEL='multilingual-e5-small'
export DEJA_EMBED_QUERY_PREFIX='query: '
export DEJA_EMBED_PASSAGE_PREFIX='passage: '
deja embed
段落前缀属于 sidecar 的模型名称的一部分,因此更改前缀会重新嵌入所有内容;搜索也会忽略使用其他模型或前缀生成的向量(并提示一次)。
sidecar 与索引放在一起,文件名为 .vectors.bin,而不是存储在 index.db 中。对于维度为 1,024 的模型,每 1k 条消息的 Float32 向量约占 4 MB。远程端点会接收经过脱敏的已索引文本,截断至约 2k 个字符,但不会接收原始源文件。使用 Ollama 或 LM Studio 时,嵌入操作会在本地完成,无需密钥。
毫秒级检索;在 LongMemEval-S 上,清理后的 470 个问题集 hit@1 为 88.1%,全部 500 个问题的 hit@1 为 87.4%;在 LoCoMo 检索上,hit@1 为 70.5%。对于这台机器之前已经解决过的任务,token 数减少了 58%:两种方案各运行 11 次,未接入任何内容时分别为 53,558 和 126,222;在后续版本中交替运行两种方案时,分别为 52,815 和 103,443。两个检索测试工具都包含在此仓库中,可在几分钟内使用公开数据集运行:基准测试 · 单个任务的成本。
其余数据由 deja bench 测量:
deja bench recall # ranking floor: 100 queries, half Russian, CI fails if recall drops
deja bench context # 30 seeded task chains plus five negative controls
deja bench block # does the answer survive into what deja hands over
deja bench prompt # what the per-prompt hook fires on, and what it fires on wrongly
deja bench ingest # what an update costs: unchanged, a turn, a new transcript, a rename, a rewrite
deja bench read # what it costs to read a database-backed store, and what one long value does to it
仓库内基准测试的测量内容,以及真实存储中的检索成本
bench block 提出了其他测试无法回答的问题:拿到正确的会话后,区块是否包含该会话最终确定的内容。每个主题由 8 个会话讨论,其中一个会话会在自己的记录中途而非末尾确定答案。因此,基线方案——命中结果中最新的几轮对话——得分为零,而得分高于零的方案必须做出正确选择。
| 方案 | 是否包含答案 | token 中位数 |
|---|---|---|
deja-block(会话起始区块) | 1.00 | 665 |
deja-digest(上下文摘要) | 1.00 | 1656 |
newest-turn(基线) | 0.00 | 289 |
cold | 0.00 | 0 |
上下文实验将 deja-recall 与 full-history、naive grep 和 cold context 进行比较。使用默认种子时:
| 方案 | token 中位数 | 覆盖率中位数 | 负控 token 数 |
|---|---|---|---|
| deja-recall | 1,096 | 1.00 | 0 |
| full-history | 80,547 | 1.00 | 78,145 |
| naive-grep | 273,238 | 1.00 | 0 |
| cold | 0 | 0.00 | 0 |
事实覆盖率与 grep 原始日志相同,但 token 数约减少 250 倍;与完整重放匹配的会话相比,token 数约减少 70 倍;在没有相关历史事实的对话链中,则不会注入任何内容。语料生成器和相关性标签均由经过常规审核的 Go 代码实现。在相信任何数据之前,请先审查“相关”的定义,包括我们自己的数据。
在包含 2,419 个会话、179k 条消息和 1.9 GB 对话记录的真实存储中测得:
| 测量项 | 结果 |
|---|---|
| 进程内检索 | 中位数 0.7–0.8 ms(deja bench recall,100 次查询,其中一半为俄语);在 LongMemEval-S 的文本集合上约为 15 ms |
deja <query>,端到端 | 在该存储中,中位数约为 0.2 s:包括进程启动、检查所有存储的新鲜度、排序和打印 |
| 单独的新鲜度检查 | 没有变更时约为 50 ms |
| 索引大小 | 200 MB,约占语料的 10% |
此后,同一存储已增长到 2,754 个会话、358k 条消息和 5.7 GB。对其执行冷启动完整构建耗时 71 s,并生成 232 MB 的索引——占语料的 4%;随着对话记录不断重复,这一比例会下降。端到端中位数仍为 0.25 s。
索引支持增量更新。会话文件增长时,只会重新读取该文件;文件被重写时,其新记录会追加,旧记录则在原位置清零。在包含 40,000 个会话的存储中,扫描 20 个被重写的对话记录耗时 1.7 s,峰值内存不到 1 GB;搜索大多数会话中都包含的一个词,耗时约 1 秒。
工作原理
在 ~/.cache/deja 中创建本地倒排索引:解析 JSONL 和 SQLite 存储,编辑凭据,写入仅追加的 records.bin 和 token 桶,并在 manifest.gob 中跟踪每个文件的状态,使后续运行只导入发生变化的内容。MCP 服务、统计、分享和同步功能都读取同一个索引。详见docs/ARCHITECTURE.md。
常见问题
有任何内容会离开我的机器吗?
不会,除非你主动要求。请参阅数据流。
日志中已有的密钥怎么办?
它们仍保留在原始运行环境文件中,这些文件就是 Agent 的数据;`deja secrets` 会列出包含这些内容的会话,方便你轮换和删除,`--scrub` 会重写它能够访问的对话记录。索引构建时会剥离已知格式的内容——AWS 密钥、`api_key=`/`token=` 赋值、Bearer 令牌和裸 JWT、PEM 块、提供商令牌、高熵值——因此这些内容不会进入摘要、分享内容或同步导出数据。模式匹配不等于秘密检测:无法识别的格式可能会通过。请参阅[安全模型](docs/SECURITY-MODEL.md#redaction-boundary)。它会拖慢我的 Agent 吗?
检索是在本地索引中进行的词法查找: 中位耗时为 0.7–0.8 ms,不需要等待模型。钩子还会增加进程启动时间,并检查存储的新鲜度:在 1.9 GB 的存储上,端到端耗时约为 0.2 s;对于包含 19k 个会话的索引,每次提示词触发的钩子耗时为 0.59 s。
可以阻止它自动重新索引吗?
可以。在繁忙的服务器上,设置 DEJA_NO_AUTO_INDEX=1 或在 ~/.config/deja/policy.json 中设置 "auto_index": false,即可停止所有自动更新。搜索、MCP 检索和钩子会使用最近一次完成的索引作答,并说明索引的更新时间;deja 不会自行启动任何写入操作。你可以通过 cron 或 systemd 计时器运行 deja index。
可以只为搜索建立索引吗?
可以。设置 DEJA_SEARCH_ONLY=1 或在 ~/.config/deja/policy.json 中设置 "search_only": true,即可跳过对修复、命令和共现关系的挖掘,减少约五分之一的构建 CPU 开销;该设置会在下次运行 deja index 时生效。搜索、检索和 blame 的工作方式不变;deja fix 会提示该索引仅供搜索使用。用于避免将命令、工具输出、路径和编辑内容纳入索引的 DEJA_INDEX_* 开关,以及每个开关会关闭的内容,详见命令指南。
我需要改变工作方式吗?
不需要。Agent 会自行调用检索功能;启用自动检索后,它在会话开始时就能了解项目之前的决策。
这与其他记忆工具有什么不同?
| deja | 记忆平台 (Mem0、Letta、memU) | 会话搜索 (cass) | |
|---|---|---|---|
| 能了解安装前的工作内容 | 是 | 否 | 是 |
| 记录步骤 | 无,对话记录就是记忆 | Agent 或你的代码写入事实 | 无 |
| 需要 LLM 或嵌入密钥 | 否 | 是 | 可选 |
| 无需请求即可检索 | 会话开始时及工具运行前 | 否 | 否 |
engram 是记录优先类工具中最出色的一款;如果这种模式适合你,值得一试。不过它启动时仍是空的,只了解 Agent 选择保存的内容。完整对比涵盖了其中 15 款工具。
Claude Code 会话历史存储在哪里?可以搜索吗?
Claude Code 的会话历史位于
~/.claude/projects,每个会话对应一个 JSONL 文件;Codex 将会话保存在 ~/.codex/sessions,Cursor 则使用 SQLite 数据库 state.vscdb。deja 会直接读取这些文件:直接运行 deja 会打开搜索和阅读界面,deja search 可通过脚本执行这些操作,deja last 会列出各个 Agent 的近期会话,deja view 会将完整历史记录作为一个本地页面打开。各个 Agent 的路径见会话存储位置。
我的 Claude Code 会话历史消失了。它被删除了吗?
Claude Code 会删除超过 30 天的对话记录(`~/.claude/settings.json` 中的 `cleanupPeriodDays`),而 `claude --resume` 只会列出剩余记录。清理前已由 deja 建立索引的会话,即使文件已删除,仍可搜索;每周会在会话开始时显示保留了多少条记录,以及可用 `deja resume --write-back` 恢复的 ID。详情:[磁盘上的会话文件](https://vshulcz.github.io/deja-vu/guide/session-files-on-disk.html)。Windows 怎么样?
已有构建版本,CI 也会在 Windows 上运行测试套件。macOS 和 Linux 是经过充分验证的平台。欢迎在 #9 分享使用反馈。
一个项目分布在多个检出目录中。能否让 recall 将它们视为一个项目?
项目以 Agent 运行所在的目录命名,因此,单体仓库的每个检出目录,以及为任务创建的每个工作树,都是各自独立的项目;钩子也只会从当前所在的项目中 recall。将这些目录列在 ~/.config/deja/projects 中,每行一个 <path> = <name>:
~/work/monorepo = work
~/work/worktrees = work
此后,所列路径下的每个目录在索引、钩子和 recall 中都会被视为该项目;匹配路径中最长的优先。编辑该文件不会重命名已建立索引的内容:deja index 和 deja doctor 会提示何时需要重建索引,而 deja index --rebuild 会将对话记录仍在磁盘上的会话归入新名称。文件创建前建立索引的会话在此之前仍会按其自身的检出目录匹配;已保留但对话记录已删除的会话,以及 deja remember 笔记,会保留归档时使用的名称。排除文件优先:按仓库自身名称排除的仓库仍会被排除,匹配别名名称的规则则会排除整个目录树。
如何清除所有内容?
deja uninstall --all
rm -rf ~/.cache/deja ~/.local/share/deja ~/.config/deja
索引位于 ~/.cache/deja,你的 remember 和 promote 笔记位于 ~/.local/share/deja,规则、排除列表、项目别名和钩子启动器位于 ~/.config/deja(若设置了 XDG_DATA_HOME 和 XDG_CONFIG_HOME,则位于对应目录下;在 Windows 上,笔记位于 %AppData%\deja)。
指南
围绕具体场景编写,而非围绕功能编写:
- 你的 Agent 会记得之前的对话吗? — 各个 Agent 会在会话之间保留什么,又会丢弃什么
- 磁盘上的会话文件 —
~/.claude/projects会变得多大,以及删除它会有什么代价 - Agent 丢失了你之前的上下文 — 崩溃、清除上下文,或会话恢复后内容为空时该怎么办
- 上下文窗口已满 — 压缩会保留什么、如何衡量,以及还有什么替代做法
- 恢复昨天的会话 — 在所有 Agent 中找到该会话,并在所属 Agent 中重新打开
- Agent 重复犯你已经修正过的错误
- 找到你解决过问题的会话
- 为什么 Agent 会在会话之间遗忘 · 各个 Agent 将历史记录保存在何处
- 恢复已删除的 Claude Code 会话 · Claude Code:找不到具有该会话 ID 的对话 · Codex 恢复会话 · 删除旧的 Claude Code 会话
- 安装当天,各种记忆工具分别了解什么 · 记忆插件对比
- 压缩会丢弃什么 · 切换 Agent · 审计 Agent · 导出对话 · 跨设备同步 · 记忆的成本 按运行环境:Claude Code · Codex · Cursor · Windsurf · opencode · DeepSeek Harness · Kimi Code · Zed · Grok Build · Gemini CLI · Qwen Code · OpenClaw · Goose · Cline · pi · Hermes · Copilot CLI · Copilot Chat · aider · Amp · Antigravity · Continue · Crush · Roo Code · Kilo Code · Kiro · Cherry Studio · Oh My Pi · prime-agent · Senpi · Kimchi · Command Code · ZCode · gjc · CodeWhale · Reasonix
在自己的历史记录上试用
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto
安装只需 10 秒左右,索引也大约需要 10 秒。你的 Agent 下次开启会话时,就已经知道你在该项目中解决过的问题——包括安装之前的所有内容。
贡献
运行 make build test lint,然后参阅 CONTRIBUTING.md。添加运行环境请从解析器注册表开始。优先事项和非目标列于 ROADMAP.md。适合新手的议题已添加标签。
支持
请通过 issues 提交错误和问题。 如果你认为某项内容可能被利用,请改用 SECURITY.md 中的私密安全公告链接。关于 deja 会读取什么、绝不会发送什么,以及如何排除项目或忘记会话,请参阅隐私。
许可证
MIT © Vladislav Shulcz
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。