Install
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.16.6
brew install vshulcz/tap/deja-vu
Changelog
Features
- feat(codex): read commands, output, files and edits from rollouts (#629)
- feat(cursor): read files, commands and edits from Cursor transcripts (#628)
- feat(opencode): index what commands printed, and whether they succeeded (#621)
- feat(stats): say what restore could hand back, before anyone needs it (#644)
- feat(statusline): what earlier sessions decided about the file in hand (#634)
- feat: add deja friction, the errors that recur across sessions (#622)
- feat: name the memory agents keep coming back to (#638)
- feat: name the wall the agents keep hitting on the first screen (#626)
- feat: tell the agent what this machine is missing, before it trips (#632)
Fixes
- fix(antigravity): tool steps are not speech, and sessions have a project (#651)
- fix(codex): do not panic on a tool result without a call_id (#631)
- fix(codex): duplicate turns with wrong roles; two documented flags that did nothing (#652)
- fix(codex): thread identity and injected preamble (#639)
- fix(files): distinguish a filtered file from a file that was never recorded (#665)
- fix(redact): remove a secret named in prose and quoted (#658)
- fix: a misspelled search flag is an error, not part of the query (#756)
- fix: a promoted note serves its latest correction first (#813)
- fix: a rejected attempt ranks below the decision that replaced it (#685)
- fix: an ambiguous elided id is refused, not silently doubled (#860)
- fix: an empty result names the states the user created (#687)
- fix: at equal rank the local session comes before an imported one (#712)
- fix: blame and forget report the state the tool is in (#650)
- fix: blame keeps a session that both mentions and edits the file (#724)
- fix: blame sees the sessions that edited the file, not only those that named it (#689)
- fix: bound the covering line by when the oldest work began (#787)
- fix: count a promoted note that has no source session (#815)
- fix: ctx rejects flags instead of searching for them (#722)
- fix: defer to the package manager that owns the binary in update (#776)
- fix: deja help names search (#754)
- fix: deja last and the first screen keep their order when timestamps tie (#714)
- fix: derive a title for imported sessions (#671)
- fix: doctor counts the transcripts it cannot place (#702)
- fix: doctor lists git alongside sqlite3 (#797)
- fix: doctor names a permission problem instead of blaming the store (#803)
- fix: doctor names the missing sqlite3 CLI instead of blaming the store (#793)
- fix: doctor reports a damaged index instead of calling it up to date (#736)
- fix: document the six flags deja help was missing (#758)
- fix: files names the project filter and marks truncated paths (#728)
- fix: files, ctx and restore point at the stores on an empty index (#835)
- fix: forget --before refuses an age of zero or less (#740)
- fix: forget --project clears borrowed note titles and names what it dropped (#691)
- fix: forget clears the title a promoted note borrowed from the session (#667)
- fix: forget says when it could not clear a borrowed title (#805)
- fix: forget says where the session was already pushed (#789)
- fix: friction distinguishes an empty store from one with no tool output (#706)
- fix: friction recognises the errors machines actually hit (#730)
- fix: handoff no longer warns that a session is '11d old old' (#744)
- fix: hooks ask for a rebuild when the index is damaged (#801)
- fix: hooks ask for a rebuild when the index is from another format version (#778)
- fix: hooks carry the rejection with the session it belongs to (#762)
- fix: hooks use the cwd the harness sends (#760)
- fix: impact stops calling a larger digest 'distilled (0x less)' (#732)
- fix: index explains a denied write instead of passing the syscall through (#799)
- fix: index reports a directory it could not read (#819)
- fix: index says when there is nothing to do (#825)
- fix: index says which harness it skipped for a missing sqlite3 (#795)
- fix: index the end of a long tool output, not just its head (#643)
- fix: install names the targets it found instead of just asking for one (#831)
- fix: keep notes without a project and promoted notes without a state (#772)
- fix: keep result-line ids distinguishable and resolvable (#708)
- fix: keep the tombstone until unforget's rebuild succeeds (#811)
- fix: last --role tool matches tool output (#718)
- fix: last prints a dash instead of 0001-01-01 (#766)
- fix: log --json returns [] on an empty log, and a number is not a flag (#734)
- fix: name a session after the assistant when no user turn can (#693)
- fix: name the cause when a borrowed title cannot be cleared (#809)
- fix: name the filter that emptied a search, and stop hinting on short words (#716)
- fix: name the rebuild window instead of the missing manifest (#823)
- fix: nine audit findings across privacy, dates, uninstall and the docs (#851)
- fix: point at --harness when two sessions share an id (#720)
- fix: point at the command when an empty search looks like a typo (#675)
- fix: point at the stores when a search finds an empty index (#833)
- fix: promote explains a locked notes file (#807)
- fix: re-derive session titles left over from older rules (#785)
- fix: reattach the signalLines doc and pin the splice order (#646)
- fix: recalled text cannot close the frame that quotes it (#656)
- fix: record blame calls so deja log covers what the agent was given (#683)
- fix: relative dates use the reader's zone (#768)
- fix: repair wiring when the binary moved (#774)
- fix: report a store that is only partly readable (#817)
- fix: restore refuses to overwrite, including the file the span came from (#726)
- fix: resume and handoff name a session that exists (#742)
- fix: say what period 'Recalls served' covers (#764)
- fix: say when a query has nothing to look up (#829)
- fix: say when a rejected session was moved below the rest (#695)
- fix: say when the trust policy is why an answer is empty (#681)
- fix: say which words matched on their own when nothing matched together (#827)
- fix: sessions stamped in the future are not today's work (#697)
- fix: shell completion offers deja search (#750)
- fix: show honours --offset and --limit without --json (#710)
- fix: show names the missing id before the missing flag (#821)
- fix: singular counts in the lines a first run prints (#738)
- fix: sources rejects arguments instead of ignoring them (#748)
- fix: stats says what an old store covers instead of drawing twelve empty bars (#704)
- fix: statusline names the same earlier session on every refresh (#669)
- fix: strip the harness preamble in cursor and gemini too (#649)
- fix: sync export rejects an unknown flag instead of exporting nothing (#746)
- fix: sync import fails on a path that is not a batch directory (#679)
- fix: the environment block arrives once, not once per path (#663)
- fix: the environment block obeys the policy table (#660)
- fix: the fallback title takes the earliest turn, matching import (#770)
- fix: three status messages report a state the tool is not in (#642)
- fix: two transcripts sharing an id are attributed the same way every build (#700)
- fix: unforget reports what it restored and rebuilds so the session comes back (#673)
- fix: uninstall no longer creates configs it was asked to clean (#677)
- fix: update leaves a source build alone unless forced (#752)
Performance
- perf(index): skip the CJK scan on bodies that contain no CJK (#640)
- perf: cut the first screen from 3.2s to 0.6s (#627)
- perf: read friction in one pass over the record log (#624)
Documentation
- docs: changelog for 0.16.6 (#836)
- docs: the rest of what 0.16.6 fixes (#858)
Other
- chore(packaging): pin scoop/winget manifests to 0.16.5 (#620)