mcpField
D
deja-vu

deja-vu

本地服务
vshulcz.github.io记忆与知识1.3k今天更新

关于 deja-vu

deja-vu 是供编码 Agent 使用的本地会话记忆工具,可索引多个 Agent 保存的历史记录,并在需要时提供相关内容。它通过共享索引和会话启动自动回忆,帮助不同 Agent 重用以往的解决方案。

主要功能

  1. 01跨 Agent 会话索引
  2. 02本地搜索历史记录
  3. 03会话开始时自动回忆
  4. 04跨 Agent 交接会话
  5. 05索引时清理凭据

适用场景

  1. 01找回数月前解决过的问题
  2. 02让不同编码 Agent 复用历史决策
  3. 03排查命令失败或代码修改背景

MCP 相关

deja-vu 可将 MCP 回忆接入已检测到的 Agent,并提供会话启动回忆。安装配置会为支持的 Agent 添加 MCP;二进制单独使用也可搜索,无需 MCP。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"vshulcz-deja-vu": {
"command": "npx",
"args": [
"-y",
"@vshulcz/deja-vu"
]
}
}
}
启动命令npx -y @vshulcz/deja-vu

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@vshulcz/deja-vu0.23.2

工具

1

收录的工具列表 · 更新于 今天

参数类型必填说明
qstring否要询问的内容:问题或确切词条;blame 请提供路径,fix 请逐字提供失败输出,remember 请提供事实。
modeenum是recall | context | blame | fix | how | orient | remember | handoff
limitnumber否最大结果数。
harnessstring否可选筛选条件,编写它的 Agent:claude、codex、trae、opencode 等 37 个(`deja sources`)。
projectstring否可选项目筛选条件;对于 remember,表示归档位置。

详细介绍

deja-vu

让你的编码 Agent 不再重复调试已经修复的问题。

Claude Code、Codex、Cursor 和另外 40 多种 Agent 已经会将每次会话保存到磁盘。 deja 会索引所有内容,追溯数月之久,并将重要部分交给当前正在工作的 Agent。

English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Español | Português | Français | Deutsch | Русский | Türkçe | हिन्दी

同一个问题两次交给同一个 Agent:没有记忆时,它对此毫无记录;使用 deja 时,它会根据八个月前的决定作答

没人进行过搜索——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,因此所有驱动、语料库和评分规则都在此仓库中 · 正面对比,以及如何重新运行你存疑的数据行 · 所有运行结果

CI 发布 MCP Toplist MIT 许可证

文档 · 基准测试 · 对比情况 · 将其集成到你的工具中

觉得有用?在 GitHub 上为 deja-vu 点赞。

## 自行搜索

在终端中不带参数运行 deja,即可搜索所有 Agent 的历史记录。它会先显示未提交更改所涉及的会话,然后显示此项目中最近的会话;随着你输入,列表会逐渐缩小。

在 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——该页面会在你的浏览器中完成转换。

deja 统计卡片:以热力图展示一年来的 Agent 会话、会话所属的 Agent,以及最长的会话

完整的功能参考请参阅文档。

安装

在 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。

deja 首次建立索引后显示的内容:标记、找到的 Agent,以及从你自己的历史记录中提取的查询

十秒即可安装,大约十秒即可建立索引,之后就能派上用场。第二条命令会将 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 mcpstdio MCP 服务,也是 deja install 配置的服务。
完整参考:[命令](https://vshulcz.github.io/deja-vu/guide/commands.html)和 [JSON 输出](docs/json-output.md)。
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 页面)。

参数和返回结构
工具参数返回值
dejamode、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 testproject?、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软件包安装
opencodenpm opencode-dejaopencode plugin opencode-deja
DeepSeek Harnessnpm dsh-dejadsh plugin --profile web add dsh-deja
Zeddeja-context-serverZed → 扩展 → deja
Kimi Code插件 deja/plugins install https://github.com/vshulcz/deja-vu
Codex CLI插件 deja-vucodex plugin marketplace add https://github.com/vshulcz/deja-vu,然后运行 codex plugin add deja-vu@deja-vu
Grok Build插件 dejagrok plugin marketplace add vshulcz/deja-vu,然后运行 grok plugin install deja
OpenClawClawHub 和 npm @vshulcz/openclaw-dejaopenclaw plugins install clawhub:@vshulcz/openclaw-deja
pi(以及 omp)npm @vshulcz/pi-dejapi 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.00665
deja-digest(上下文摘要)1.001656
newest-turn(基线)0.00289
cold0.000

上下文实验将 deja-recall 与 full-history、naive grep 和 cold context 进行比较。使用默认种子时:

方案token 中位数覆盖率中位数负控 token 数
deja-recall1,0961.000
full-history80,5471.0078,145
naive-grep273,2381.000
cold00.000

事实覆盖率与 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)。

指南

围绕具体场景编写,而非围绕功能编写:

在自己的历史记录上试用

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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。