github vshulcz/deja-vu v0.22.0

3 hours ago

Bare deja at a terminal now opens a search screen over every agent's
history: type to search, read a session at the hit, resume it, or carry it
into another agent. It opens on the sessions behind your uncommitted change.
Junie and JetBrains AI Assistant are read, deja rules sync writes to 42
agents instead of 8, and recall called by an agent puts the project it works
in first, which took a planted answer from 20 to 43 of 56 real queries. A
transcript its agent deleted no longer makes every search answer stale. The
index version is now 69, so the store rebuilds once on the first run after
upgrading.

Added

  • Bare deja at a terminal opens a search screen over every agent's history. Type to search, read a session at the hit, resume it, or carry it into another agent with ctrl-o. It opens on the sessions behind your uncommitted change, and on a first run it builds the index behind the screen instead of before it. Pipes, TERM=dumb and DEJA_TUI=0 keep the text summary.
  • The first run of a new version says once what it brings: the top three changes in the terminal, one line in the session-start note.
  • An empty search in a terminal shows the surprised cat, and the first search that finds something shows the ready one, once per index.
  • An interactive command says, at most once a day, when a newer deja release is out, with the upgrade command for whatever installed it (deja update, brew, npm, scoop). The look at GitHub runs in a detached process and the next interactive command prints what it found, so no command waits on the network. Hooks, the MCP server, pipes, dev builds, deja update, deja doctor and deja version never start it, and DEJA_OFFLINE=1 or DEJA_NO_UPDATE_NOTICE=1 turns it off with no request made (#4622).
  • After a search that finds something, in a terminal, deja shows one short tip at most once a day, naming a command you may not have met: blame, fix, how or view, in rotation. It goes to stderr and never appears in a pipe, a script, a hook or --json (#4629).
  • Kimi Code and Kiro get the line about a file before an edit, and CodeWhale the fix pair for a failed command. None of them shows the model what that hook prints, so the line waits for the next hook that does: the next prompt on Kimi and Kiro, the next tool call or message on CodeWhale. CodeWhale also hands over the pre-tool line of a call that failed to run, which it sends back without it.
  • deja resume <id> --write-back puts a session the agent deleted back where the agent can reopen it, rebuilt from deja's index in the agent's own format. The file holds the user and assistant turns; tool calls and their output stay in deja, which keeps them and reads only what the agent appends later. Works for Claude Code, Codex, Gemini CLI, Qwen Code, pi, omp, gjc, Kimchi, Senpi, Kimi, Copilot CLI, CodeBuddy, Command Code, CodeWhale, Cline, OpenClaw, Continue, Grok Build and Kiro CLI, each checked by resuming the written file in the real CLI. For agents that keep sessions in a database, or whose format needs something the index lacks, it says what is missing. It never replaces a file and writes only inside the agent's store (#4617).
  • aider edits record both sides, read from the SEARCH/REPLACE block, unified diff or patch in the reply once aider says it applied them, so deja restore and line-level deja blame answer for aider sessions (#595).
  • VS Code Copilot Chat edits record the replaced text, read from the edit call's arguments, so deja restore and line-level deja blame answer for them. On one machine's store that is 638 spans where there were none. The extension's agent transcripts record both sides of an edit and its file (#595).
  • Junie and JetBrains AI Assistant are read. Junie gets junie and junie-auto (hooks, MCP, skill, /deja, rules, resume); AI Assistant gets jetbrains, the MCP server in ~/.ai/mcp/mcp.json. Agent chats that run Junie, Claude, Codex or another agent with its own store are left to that store (#3104).
  • deja rules sync writes to 42 agents, up from 8. The new ones are Copilot CLI and Chat, Cline, Roo, Continue, Kilo, Zed, Crush, Junie, Kiro, CodeBuddy, WorkBuddy, Cherry Studio, CodeWhale, Command Code, ZCode, Amp, TRAE CLI, TRAE IDE (~/.trae/user_rules), Hermes, aider, Antigravity, pi, omp, Senpi, gjc, prime-agent, Kimchi, dsh, Reasonix, Muse, Devin (~/.config/devin/AGENTS.md), OpenClaw (its workspace AGENTS.md) and Cursor CLI (~/.cursor/rules, which it reads only for projects under the home directory). A stand or the host's source showed each file reaching the model. Where a host loads only the first of several files, the block goes into the one already loaded, so opencode and Kilo no longer lose a ~/.claude/CLAUDE.md they were reading (#4805).
  • The harnesses page has a table of every hook surface per harness (digest, per-prompt, pre-tool, after-failure, compaction, MCP, handoff, session end, rules, statusline, reader), each with how it was checked and why a missing one is missing. A test installs every target and fails when the table and the wiring disagree (#4801).
  • deja recall <words> prints the page the MCP recall tool answers, for a skill or script that runs deja through the shell. deja search --json was the only option there and ran to 1-2 MB, which harnesses truncate to nothing (#4781).
  • New targets kimchi-auto, codewhale, codewhale-auto and cherrystudio-auto. kiro-auto also writes ~/.kiro/hooks/deja.json, which the IDE and kiro-cli --v3 run in every chat, and deja install kiro the skill. ZCode gets the shared skill and /deja (#4802).
  • A hook whose answer the host drops now hands it to the next hook of that session that reaches the model, once: Grok's session start and prompt ride its next tool hook, and Kimi's and Kiro's fix pair for a failed command rides the next prompt. goose gets the fix pair through a Stop hook that blocks once, the one hook answer it shows the model.
  • Antigravity, Crush and goose, which have no compaction event, get the compaction packet on the next hook that reaches the model, read from the turns their stores keep before the summary. Antigravity also gets the pre-edit line for the file a planner step edited.
  • Command Code, ZCode, CodeWhale and Amp get the compaction packet. None of them has a compaction hook; each keeps the turns before the summary (the transcript, the CLI database, a saved history, the full thread), and the next hook that reaches the model catches it up.
  • commandcode-auto writes a mod: the question's recall goes into its model calls, the session's end clears its live stamp, and the footer shows deja statusline. Amp's plugin writes each thread it runs to the thread store so deja can read it, and shows a status item.
  • deja aider recalls on every message on macOS and Linux. aider has no hooks, but it reads its read-only files right after it logs a message, so the wrapper serves one of them from a named pipe and answers with the recall for that message (#4801).
  • Crush's one hook carries the per-prompt recall and the previous command's fix pair, and Command Code's tool hook answers the newest question, since neither host fires a per-prompt hook.
  • deja statusline in the status line of Cursor CLI, Copilot CLI, Qwen Code, CodeBuddy Code, Grok Build, Kimi Code (0.30 and later) and TRAE CLI, from their -auto targets. opencode and Kilo CLI get it through a TUI plugin, VS Code through a local extension vscode-auto adds to the status bar, dsh under the web composer, and OpenClaw as a deja tab in the Control UI. A status line already set up there is left alone and install prints the line that runs both. The line finds the session from a session_id or sessionId when the host sends no transcript path.
  • goose's Stop block also carries the pre-edit line for each file the turn edited, and its SessionStart hook prints deja's status line as the banner goose shows when an interactive session opens. antigravity-auto puts deja statusline in agy's statusLine, stacked under agy's own line; the line finds an agy session by session_id, since every agy transcript is named transcript.jsonl.

Changed

  • deja doctor folds the stores that are simply not on this machine into one line, so the agents you use are not lost among thirty-odd missing rows. A store that was found, cannot be read, is excluded or unplugged, holds indexed sessions or carries advice (aider's) keeps its row. deja doctor --all lists every store (#4625).
  • deja index says how long the build took: the summary after a rebuild reads deja: indexed 3 sessions, 5 messages in 0.04s, and the first-index greeting ends in 0.05s too, whichever command built the index: deja index, deja search, deja warmup or bare deja (#4630).
  • Agents look up past decisions before the first edit in a task and before calling a change done, not only when asked about history. The skill, the MCP server instructions and the other agent-facing texts now say what deja holds: rules, banned or already-tried tools, checks required before merge, preferred values, owners. On a stand with ~1800 real sessions and 30 other skills, Claude Code applied the planted decision in 28-30 of 33 tasks, up from 14-15. opencode stayed at 15-17 (#4791).
  • The agent-facing blame answers in the same framed text as recall, fix and how instead of a JSON array: a numbered row per session in the [harness] project · id form, its title, the files it also worked on and its excerpts. The same 8 KB answer now carries all ten sessions where it carried five to seven, and a decision that was later taken back says so, which the JSON had no field for. deja blame --json is unchanged (#4634).

Fixed

  • One transcript its agent deleted made every search after it answer from the index as it was and start a background pass with nothing to do, and deja handoff printed the kept notice twice. A kept transcript is now marked in the index and no longer reads as a change.
  • deja log no longer says a compaction "stored nothing" when it stored the packet and only the edit count after it could not be measured. Every compaction on a host whose transcript deja reads through its own parser, such as TRAE CLI and Qwen Code, showed as lost.
  • CodeWhale's TUI got no fix pair for a failed command: its bash tool sends no receipt and reports the failure as "Failed to execute tool: …", and that prefix kept the error from matching. The pair now arrives with the next message.
  • The summary a harness writes when it compacts is indexed under the summary role for Codex, Copilot CLI, VS Code Copilot Chat, Antigravity, Kimi, pi, omp, prime-agent, Senpi, gjc, Kimchi, OpenClaw, Crush, Qwen Code, ZCode, Kilo Code, Roo Code and CodeWhale. Before, it was dropped, or filed as something the person or the agent said. Roo and Kilo's sliding-window note is no longer read as the person's words (#4801).
  • OpenClaw 2026.9.9 stores an event of 1 KiB or more zstd-compressed, and deja skipped those events; it decompresses them now, when zstd is installed.
  • A Cline CLI session removed with cline history delete stays searchable; deja took its deleted directory for a store that went away and dropped it.
  • A session with one hit reads 1 match, not 1 matches, in deja search and in the MCP recall listing (#4627).
  • deja search printed its results without colour even in a terminal: the output went through a counter for deja log, and the colour check only recognised a bare terminal, so the coloured header and highlighted matches never showed. It looks through the counter now; pipes, NO_COLOR and TERM=dumb stay plain (#4620).
  • An OpenClaw gateway session got the project digest twice on its first turn, once from the hook pack and once from the plugin, and the hook pack repeated it on every later turn. Both now ask under the session's id, once. The plugin's digest moved to an agent:bootstrap hook of its own, which also runs under openclaw agent --local and without allowConversationAccess; the ClawHub package does the same.
  • One session made of megabytes of tool output no longer tops recall's relevance tier for questions it never discussed. A match inside a tool record now counts half of one in what someone said, and a JSON dump is quoted as an excerpt only when nothing else in the session matched. On a real store of 1705 sessions the session that came first, third and third on three questions now ranks 8th, 14th and 10th; LongMemEval and LoCoMo do not move (#4780).
  • OpenClaw 2026.8.1 and later dropped the deja plugin's digest and per-prompt recall, and with them the packet after a compaction: the gateway runs a non-bundled plugin's agent_turn_prepare and before_prompt_build only with plugins.entries.deja.hooks.allowConversationAccess: true. deja install openclaw-auto now sets it and uninstall takes it out; it is left off for OpenClaw 2026.4.23 and older, which refuse to start on the key, and deja doctor says when it is missing. The ClawHub package cannot grant it to itself: its README gives the openclaw config set command, and the plugin names it in the gateway log and in /deja while the key is missing.
  • dsh 0.2.0-rc.2 failed every model request once deja install deepseek was in: its plugin inventory refuses a package.json without a version, and deja's had none.
  • A project .aider.conf.yml with its own read: list hid the home one, and with it deja's context file and rules: aider takes the first list it finds, and AIDER_READ replaces lists too. deja aider now passes the list aider would have taken plus deja's file on the command line.
  • The command install suggests for running your status line beside deja's kept deja's half on a second row when your script ended in a newline, and hosts that show only the first row dropped it.
  • The kimi, grok, openclaw, dsh, hermes, opencode and pi packages run every hook their deja install <x>-auto counterpart wires; a test installs each target and fails when its package misses one. The Hermes provider, Cline's plugin, the opencode 2.x plugin and the pi family now name the session they stamp live, so it is cleared at the end and kept out of its own recall. omp and pi give a new session its digest after /new. dsh ended sessions under session-<uuid> while stamping the bare uuid, so the stamp stayed; Cline under --yolo recalled its own [SYSTEM] reminder instead of the prompt. Shown on live stands for dsh, Cline, OpenClaw, Hermes and Kimi.
  • Two goose sessions no longer read each other's recall. Every deja goose shared one MOIM file, and plain goose wrote per-prompt recall into the global AGENTS.md every session reads; the wrapper now gives each process its own file and removes it on exit, and plain goose keeps the session-start digest only (#4795).
  • opencode 2.x: the turn after a compaction is recalled on what the person last said, not on the whole <conversation-checkpoint> summary (#4795).
  • opencode 1.x and Kilo no longer put the session digest into the title-generation request (#4795).
  • Compaction summaries from Zed, Cline (<id>.compaction.json) and Continue are indexed under the summary role. Continue rewrites its session file to the summary alone, so the index now keeps the turns it already held for that file, through a rebuild too (#4795).
  • The Reasonix extension no longer scans the 1.x sessions-v4 store for its session; 2.x names it in session.start before the first turn (#4795).
  • A kiro-cli --v3 session no longer carries a ... assistant turn for each time the model thought: V3 writes its thinking as an assistant record with the text encrypted.
  • After a Reasonix compaction the next turn gets deja's packet, as on the other hosts. It went only into the summarizer's guidance, and a summary that dropped it lost the commands and their outcomes.
  • deja resume --write-back for a Codex session whose thread is gone from Codex's state database writes the directory the session ran in, read from the files it worked on or from Codex's other threads in the same project. It wrote an empty cwd; with no directory anywhere it now says so instead.
  • Kilo Code's VS Code extension is marked auto-capable: it runs kilo serve, which loads the plugin deja install kilocode-auto writes (#4795).
  • A word whose last consonant English doubles finds its other forms: logging and logged reach log, and commit reaches committing. Asked about "structured logging", recall missed the session that only says "log". On the bench's 56 agent queries the answer reached the page in 48, up from 44. LongMemEval-S unchanged (#4785).
  • Kimchi's directory is always ~/.config/kimchi/harness; deja followed KIMCHI_CODING_AGENT_DIR and XDG_CONFIG_HOME, which Kimchi itself ignores. CodeWhale's <turn_meta> block is no longer indexed as the person's words (#4802).
  • recall asked inside a project no longer drops the project's own answer when the question also carries words only other projects use. Those words counted as typos under the project scope, so the project pass found nothing and the machine-wide answer stood. On the bench's 56 agent queries the project's session now comes first in 55, up from 51 (#4789).
  • recall called by an agent puts the sessions of the project it works in first, the way the prompt hook ranks, then the rest of the machine. On a stand with ~1800 real sessions behind one project, the planted answer reached the recall page for 43 of 56 real agent queries, up from 20 (#4778). A project passed to recall now filters it; it was accepted and ignored (#4779). A project given as a directory path, a git worktree included, scopes to that repository; a worktree path used to answer with nothing (#4784).
  • opencode keeps the per-prompt recall for the rest of the session. It reached the model only on the first call of a turn: opencode rebuilds every call from its store, and deja does not send a block twice, so after the agent's first tool call the recall was gone. Fixed in the generated plugin for 1.x and 2.x and in the opencode-deja package (#4786).
  • deja blame no longer quotes a JSON dump or a long file listing from tool output as a session's excerpt, or counts each path in it as a mention. deja's own --json output and web search results were the usual source (#4776).
  • deja doctor on Windows says when the CodeBuddy plugin is on but CodeBuddy finds no Git Bash to run its shell scripts, and points at deja install codebuddy-auto (#4753).
  • A word with ä, ö, ü or ß is found by its ASCII spelling and the other way round: mueller finds Müller, strasse finds Straße. Only muller did before (#4690).

Changelog

Features

  • feat(cli): deja recall prints the MCP recall page for skills and scripts (#4783)
  • feat(copilot): every hook surface in ~/.copilot/hooks/deja.json, VS Code Copilot Chat included (#4796)
  • feat(doctor): fold stores that are simply absent into one line; --all lists them (#4625) (#4837) (@vaibhav8a)
  • feat(mcp): blame answers the agent in recall's framed text, ten sessions where JSON fit five to seven (#4775)
  • feat(registry): record every hook surface per harness and test it against install (#4803)
  • feat: /deja for kiro, codewhale, trae and muse; hermes compaction without the memory provider (#4851)
  • feat: add Devin CLI harness (#4819) (@jijiamoer)
  • feat: agents look up past decisions before the first edit and before calling a change done (#4792)
  • feat: compaction packet, rules and status for Command Code, ZCode, CodeWhale and Amp (#4830)
  • feat: deja resume --write-back puts a deleted session back where the agent reopens it (#4848)
  • feat: deja statusline in the status line of eight more hosts (#4813)
  • feat: dropped hook answers and compaction packets ride the next hook that reaches the model (#4815)
  • feat: edit spans for Copilot Chat and aider (#4847)
  • feat: end the session in every host that has an end event (#4798)
  • feat: file and failure lines reach hosts that read context after the tool (#4808)
  • feat: goose edit line and status banner, agy status line, registry catches up for goose, crush and antigravity (#4826)
  • feat: handoff --exec opens 16 more hosts with the packet as their first prompt (#4817)
  • feat: interactive screen for bare deja at a terminal (#4880)
  • feat: kimchi-auto, codewhale, cherrystudio-auto and Kiro global hooks (#4809)
  • feat: mention a newer release at most once a day in an interactive command (#4622) (#4858) (@vaibhav8a)
  • feat: one tip a day after a search, in a terminal (#4629) (#4839) (@vaibhav8a)
  • feat: park kimi and kiro pre-edit lines and codewhale fix pairs for the next hook (#4853)
  • feat: per-message recall in deja aider, and keep a project's read: list (#4828)
  • feat: read Junie and JetBrains AI Assistant (#4849)
  • feat: rules and status line for the remaining hosts (#4832)
  • feat: rules sync reaches 32 agents, writing where each one already loads (#4805) (#4807)
  • feat: say how long indexing took (#4630) (#4836) (@vaibhav8a)

Fixes

  • fix(blame): skip JSON dumps and file listings in tool output as excerpts and mentions (#4777)
  • fix(cli): suggest mistyped commands before searching (#4820) (@Mar-garet)
  • fix(doctor): say when the CodeBuddy plugin cannot run on Windows without Git Bash (#4774)
  • fix(index): a kept transcript no longer makes the index stale forever (#4886)
  • fix(install): print paths under home as ~ in non-banner output (#4752) (@cestercian)
  • fix(mcp): recall says 1 match and 3 matches, not match(es) (#4846)
  • fix(opencode): per-prompt recall stays with its message after the agent's first tool call (#4788)
  • fix(recall): a project keeps its own answer when the question has words only other projects use (#4790)
  • fix(recall): a project named by its directory path, worktree included, scopes recall to that repository (#4787)
  • fix(recall): this project's sessions come first when an agent asks, and a named project filters (#4782)
  • fix(recall): tool-output matches count half on the relevance tier, and JSON dumps stop taking the excerpts (#4780) (#4840)
  • fix(search): logging and logged find log, and commit finds committing (#4804)
  • fix(search): mueller finds Müller and strasse finds Straße (#4773)
  • fix(tui): slow pastes, wide runes under boxes, tiny terminals, late searches (#4884)
  • fix(windows): two deferred lines in the same clock tick no longer overwrite each other (#4824)
  • fix: TRAE IDE rules sync and one OpenClaw digest per session (#4842)
  • fix: close five harness debts (codex cwd, rules count, openclaw access, kiro V3 reader, reasonix packet) (#4872)
  • fix: codewhale fix pair for a failed bash call; stand proof for deferred cells (#4857)
  • fix: compaction packet reaches every host with a compaction event (#4793) (#4799)
  • fix: doctor's Cherry Studio row, HERMES_HOME in source tests, manifest rename on Windows (#4844)
  • fix: goose shared recall, opencode checkpoint and title digest, dropped compaction summaries (#4800)
  • fix: grant OpenClaw conversation access so the plugin's digest and prompt recall run on 2026.8+ (#4834)
  • fix: index each host's compaction summary under the summary role (#4855)
  • fix: kiro and trae surfaces proven on stands; log no longer calls a stored compaction lost (#4860)
  • fix: one hit reads "1 match", not "1 matches" (#4627) (#4835) (@vaibhav8a)
  • fix: packages run every hook their installer wires, and every host names the session it stamps (#4811)
  • fix: search results are coloured in a terminal again (#4620) (#4838) (@vaibhav8a)
  • fix: show the daily tip only when stderr is a terminal too (#4870)
  • fix: what a new version brings shows with DEJA_OFFLINE=1 (#4890)

Documentation

  • docs: changelog for 0.22.0 (#4892)
  • docs: changelog for the interactive screen and what shipped with it (#4888)
  • docs: kiro mcp and V3 hooks proven on a logged-in stand; 2.22 maps SessionEnd to Stop (#4864)

Other

  • Say once what a new version brings on its first run (#4619) (#4882) (@theluckystrike)
  • Show a short welcome for a bare deja instead of the full usage block (#4878) (@theluckystrike)
  • Show the cat on an empty search and on the first recall (#4881) (@theluckystrike)
  • chore: pin the manifests to 0.21.7 (#4772)
  • ci(release): publish the deja-search skill to ClawHub with a stored token (#4862)
  • ci(release): read the ClawHub package version from package.latestVersion (#4868)
  • ci(release): skip ClawHub versions already live, check the token on every run (#4866)
  • ci: build and scan on Go 1.26.x, 1.25 gets no more stdlib fixes (#4877)
  • polish: CLI screens laid out for a terminal, plus fixes found on the snapshot pass (#4875)

Install

curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.22.0
brew install deja-vu

Don't miss a new deja-vu release

NewReleases is sending notifications on new releases.