Install
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.17.3
brew install vshulcz/tap/deja-vuChangelog
Features
- feat(assets): generate the SVG mark from the sprite, and wag the tail (#1243)
- feat(assets): give the cat a cat's timing (#1253)
- feat(assets): the cat breathes (#1254)
- feat(brand): a new mark, and every surface that carries it (#1240)
- feat(brief): read the terminal width instead of assuming 80 (#1367)
- feat(cline,qwen): turn tool calls and results into work records (#1237)
- feat(mark): the paws tuck in the air and spread on landing (#1259)
- feat(search): --session narrows a search to one session (#1362)
- feat(search): hand the ranking's own term weights down to the excerpt (#1267)
- feat(search): rank the whole question and its rare part, and take the better (#1266)
- feat(search): satisfying the AND is worth places, not everything (#1265)
- feat(site): give the home page a rhythm and somewhere to land (#1251)
- feat(site): repaint the site in the brand's colours, and put the mark on it (#1249)
- feat(stats): draw the card in the terminal, keep the SVG for a path (#1247)
- feat(zed): index the built-in agent's threads (#183) (#1281)
- feat: say what makes memory arrive, at the two moments it is missed (#1277)
- feat: ship a CLI skill for installs without MCP (#1371)
Fixes
- fix(blame): quote what was said about the file, not the first mention (#1330)
- fix(brief): the first screen named sessions the policy withholds (#1351)
- fix(cjk): repeat questions, superseded and related notes were off in CJK (#1349)
- fix(codex): doctor called a working hook untrusted, and an unrunnable one wired (#1262)
- fix(completion): offer every harness, not the eleven of a year ago (#1368)
- fix(ctx): the digest skipped the exchange that answered the query (#1323)
- fix(cursor): resolve the Windows IDE root through %APPDATA% (#1239)
- fix(digest): a conclusion cut to fit could arrive meaning the opposite (#1337)
- fix(digest): a session written in Chinese, Japanese or Korean digested to nothing (#1341)
- fix(digest): share and the handover tail said nothing when they cut (#1339)
- fix(docs): the harness count said seventeen in five of the seven places it appears (#1290)
- fix(doctor): reported embedding coverage search would not use (#1360)
- fix(doctor): two rows under "Hooks" were not hooks (#1275)
- fix(embed): refuse a vector sidecar built for an earlier index (#1356)
- fix(files): a path synced from Windows was never trimmed (#1315)
- fix(grok): index the run, not just the talk (#1361)
- fix(hook): the per-prompt recall stopped looking before it found anything (#1274)
- fix(index): a question in Chinese never counted as asked before (#1347)
- fix(index): a rewritten records file kept the old generation (#1358)
- fix(index): an id a session was synced under resolved to nothing (#1316)
- fix(index): an incremental update deleted the mined sidecars (#1296)
- fix(index): an incremental update wrote credentials into the mined pairs (#1300)
- fix(index): hook-tool never saw a command that became a habit after the last full build (#1299)
- fix(index): incremental updates never learned a new fix pair (#1297)
- fix(index): the one sidecar write that overwrites a good file was not atomic (#1302)
- fix(index): touched files stopped meaning worked-on-most after a batch (#1334)
- fix(install): stop replacing a skill someone has edited (#1285)
- fix(mark): drop the lean, give it a hop instead (#1258)
- fix(mark): squash and stretch, not a sliding slab (#1257)
- fix(mark): the blink was sliding the eyes down the face (#1255)
- fix(mark): the cat was hovering, not breathing (#1256)
- fix(mcp): how filtered by the CLI's trust policy, not the agent's (#1310)
- fix(mcp): the server took the blocking index lock it had just avoided (#1305)
- fix(recall): Chinese sessions were skipped as having nothing to say (#1343)
- fix(recall): the session-start block opened with "let me look at that" (#1282)
- fix(registry): the MCP registry description was six characters too long (#1271)
- fix(search): a long message hid the phrase that answered the query (#1319)
- fix(search): a project is its path segments, not any name containing it (#1276)
- fix(search): ctx and the prompt digest dated sessions in UTC, not the reader's zone (#1314)
- fix(search): length normalisation did nothing for Chinese sessions (#1345)
- fix(search): measure the tightest window, not the span between first mentions (#1268)
- fix(search): one decisive word is a match, not a weak one (#1261)
- fix(search): project scoping matched only one separator, and windows uses the other (#1287)
- fix(search): show the message that earned the rank, not the wordiest one (#1264)
- fix(search): the excerpt slid off the match in text that lowercases shorter (#1332)
- fix(search): the excerpt was cut around the first word, not the answer (#1328)
- fix(search): the first excerpt showed repetition, not the answer (#1326)
- fix(search): the relevance tier served records exact search hides (#1263)
- fix(site): the phone layout, which I had never actually looked at (#1250)
- fix(sources): a project is spelled the same on every platform (#1289)
- fix(sources): report the files deja reads, not the tree around them (#1363)
- fix(stats): the card was printing a line out of the reader's own history (#1252)
- fix(suggest): the first-run phrase came from withheld sessions (#1353)
- fix(sync): a bad import path came back as a raw syscall error on windows (#1288)
- fix(update): clear staging files an interrupted run left behind (#1364)
- fix: a greeting does not name the session (#1383)
- fix: a hook running during a rebuild no longer decides there is no index (#1390)
- fix: a recall payload does not pay twice for one answer (#1394)
- fix: a session that grows updates what is derived from its text (#1381)
- fix: agent tools say when the index is being rebuilt, instead of rebuilding inline (#1377)
- fix: an excerpt near the end of a message spends its whole window (#1396)
- fix: apply the exclude list where data leaves the machine (#1376)
- fix: bound a title the source authored like a derived one (#1406)
- fix: bound the status line in columns, not runes (#1398)
- fix: budget hits, files and restore against the terminal width (#1386)
- fix: budget the brief title in columns, not runes (#1401)
- fix: check for the swap before the open, not after (#1378)
- fix: count a wall's length in characters, not bytes (#1395)
- fix: count the same-fact floor in characters, not bytes (#1402)
- fix: cut agent-facing text on rune boundaries (#1391)
- fix: cut the answer line on a character, not on the byte cap (#1410)
- fix: do not print a negative age on the handoff receipt (#1404)
- fix: embed only what every trust activation allows (#1372)
- fix: excerpt the part of a message that discusses the term (#1387)
- fix: give every atomic write its own temp name (#1389)
- fix: impact credits honour the trust policy (#1380)
- fix: keep Japanese words whole across the marks written inside them (#1392)
- fix: keep an event from the future out of today and this week (#1409)
- fix: keep the digest headers on their own lines (#1408)
- fix: keep the evidence a fix pair needs until a second session confirms it (#1382)
- fix: measure proximity against every place, not a sample of one word's (#1393)
- fix: measure the files column in columns, not runes (#1399)
- fix: readers wait out the index swap instead of reporting it (#1375)
- fix: recognise the sentence ends Chinese and Japanese write (#1405)
- fix: say when a role search found nothing because the store records none of that kind (#1370)
- fix: scrub the show header like the context one (#1407)
- fix: strip what the terminal acts on from the files rows (#1400)
- fix: tell the agent how many sessions matched, not just how many came back (#1379)
- fix: the brief obeys one trust rule across the whole screen (#1373)
- fix: the greeting stops claiming an empty machine once history arrives (#1374)
Performance
- perf(index): count co-occurring pairs a shard at a time (#1366)
Documentation
- docs: changelog for 0.17.2 (#1270)
- docs: changelog for 0.17.3 (#1423)
- docs: name the windows download and say the binary alone is enough (#1369)
- docs: record what the conclusions budget actually does (#1397)
- docs: rework the README opening, and show the tool itself (#1242)
- docs: the README listed four MCP tools; the server serves six (#1244)
- docs: the no-hook harness count was stale and had inverted (#1293)
Other
- chore(packaging): pin scoop and winget to 0.17.1 (#1238)
- chore: drop smithery.yaml (#1241)
- chore: ignore Python's pycache (#1279)
- chore: pin the codex plugin version, drop one orphan asset (#1246)
- chore: things nothing was checking (#1245)
- ci: stop reinstalling shellcheck, cap the job at 10 minutes (#1324)
- ci: take the windows leg off the per-commit path, and drop -race there (#1236)
- refactor: the benchmark for the hook now runs the hook's own extraction (#1280)
- test(e2e): walk the path a user actually takes (#1283)
- test(index): pin session metadata to be the same whichever way the index got there (#1303)
- test(mcp): pin the tools/list payload to a token budget (#1291)
- test(mkcorpus): the corpus could not exercise friction, fix or restore (#1294)
- test(recall): pin that only the agent's own refusals drop a session (#1335)
- test(sync): hold a synced index to what a local one answers (#1278)
- test(windows): a test's HOME never reached windows, so the suite shared one home (#1292)