All notable changes to atty are documented here. This file is maintained automatically by release-please; manual entries below that point are merged into the relevant release on the next run.
0.8.0 (2026-06-28)
- atti: lifecycle CLI for atty (install + doctor + version) (#383) (e5feedd)
- attop: capability report + metrics-off guidance (wizard step 2) (#505) (81eccc4)
- attop: capability-aware landing + atty-installed check (wizard step 1) (#504) (b21e922)
- attop: consented shell-integration write (wizard step 3b) (#509) (92772e4)
- attop: dashboard binary skeleton (P2) (#491) (8029e90)
- attop: Fleet panel (P2) (#494) (ed253c8)
- attop: Guard panel (P2) (#493) (922ee57)
- attop: i18n string table — en + de (P2) (#498) (c626b36)
- attop: in-app Help screen with the keybinding + env reference (#501) (9dfa103)
- attop: live Home screen + metrics client (P2) (#492) (d976c44)
- attop: report the daemon compiled features on Setup (wizard step 4) (#510) (f0fcc1b)
- attop: Setup/Doctor screen (P2) (#497) (fcf18f0)
- attop: shell-integration detection on Setup (wizard step 3a) (#507) (e5183ee)
- attop: ship the dashboard as an installable binary (#511) (56c3975)
- attop: theming — palette + glyph sets (P2) (#496) (0b2b2c8)
- atty-guard,sandbox: --ebpf-mode flag + 50-ebpf-loader scenario (#337) (5009e3d)
- atty-guard: #347 PR 1 — kernel-side warn-mode (no EPERM + warn_pids) (#358) (69e46c7)
- atty-guard: #347 PR 2a — SubscribeWarnEvents RPC + broadcast infrastructure (#359) (d32a565)
- atty-guard: #347 PR 2b — ringbuf consumer thread + sandbox scenario 54 (#360) (0acd596)
- atty-guard: configurable eBPF enforcement depth (one_level/ancestry/propagate) (#478) (9fd5df2)
- atty-guard: configurable ONNX SLM via tract (SecureBERT 2 + Qwen2 5-Coder) (#116) (090bc5e)
- atty-guard: dashboard metrics API (P1a) (#487) (e326671)
- atty-guard: eBPF AF_ALG socket() tracepoint — copy.fail-class kernel-LPE detector (654a520)
- atty-guard: eBPF AF_ALG tracepoint — copy-fail-class kernel-LPE detector (#117) (654a520)
- atty-guard: runtime security-profile switch (SetProfile RPC + CLI) (#489) (369666f)
- atty-guard: security profiles + smart routing policy (Phase 1) (#482) (968ef84)
- atty-guard: security profiles Phase 2 — WATCH scope + audit/session (#483) (d1c3bf6)
- atty-guard: security profiles Phase 3 A — strict binary deny-map (#484) (25f4a18)
- atty-guard: security profiles Phase 3 A+ — strict basename deny via bpf_loop (#485) (f2ce567)
- atty-guard: Tier-2 backend trait + Heuristic impl (V2-C plumbing) (#109) (81c03f7)
- atty-guard: V2-A sidecar daemon — UDS + Tier-1 classifier + threat map (#105) (cfba772)
- atty-guard: V2-B eBPF skeleton — kernel sources + Rust loader API (#110) (dcb48fa)
- atty-guard: V2-B impl — libbpf-rs LSM attach + BPF map write-through (#113) (fdec184)
- atty-guard: V2-C — configurable ONNX SLM via tract (SecureBERT 2.0 + Qwen2.5-Coder) (090bc5e)
- atty-guard: V2-E packaging — hardened systemd-user unit + installer (#108) (06cf4d8)
- atty-guard: V2-F live OSV-dev lookup for npm Tier-1 misses (#118) (c62d598)
- atty-guard: V2-F live OSV.dev lookup for npm install <pkg> Tier-1 misses (c62d598)
- atuin: --intent flag wiring + LineState.committedIntent (#47) (2d6e14a)
- atuin: delete_scope config — default .exact via fuzzy + ^…$ anchors (166e534)
- atuin: provideGhostList + src/modules/_lib.zig shared helpers (ad53afa)
- atuin: tag LLM-authored commits via --author atty:llm (#29) (5a4bf53)
- bench: add zig build bench harness + benchmarking plan (#477) (2438e8a)
- build: atty-guard in release bins + Makefile targets + cargo CI (#132) (3daf257)
- cli:
atty init [shell]prints shell-integration snippet for eval (044c6e5) - cursor_dsr: DSR-6n reply interceptor + stdin filter (#101) (0c53037)
- cursor_tracker: track column + OSC 133 anchors (#100) (5e13cf8)
- dispatch,llm: modules register their own default_bindings (#70) (245e7e8)
- e2e: per-scenario config + ghost_accept + statusbar_visible scenarios (91245c2)
- ghost: multi-row pick list — provideGhostList + Ctrl+1..9 / Esc+1..9 (774b71e)
- guard: atom-fetcher caps + opt-in commit pinning (#208) (98103d7)
- guardrail: author-aware Rule with AuthorMask + Behavior (#27) (0257dbb)
- guardrail: per-rule .mode — confirm / confirm_once / block / silent_block (a690d18)
- guardrail: split rule types into rules.zig + add extra_rules merge (#33) (be8db06)
- history: Ctrl+Shift+D deletes matching line, status bar flashes (5cb85e6)
- history: shell-native history module (6f0e816)
- incognito: Ctrl+Shift+I toggle + kitty kbd + status bar segment (795170c)
- incognito: muted-red style for the 🔒 segment (d9d53f6)
- input-tracking: DSR + 1-row grid emulator to recover line state from shell redraws (3185e53)
- keymap,proxy: Alt+H global keybindings cheat-sheet (#67) (45bd3e1)
- keymap: Ctrl+Tab also accepts the ghost suggestion (db435f6)
- line-state: author propagation (#26) (e2dfacf)
- llm,keymap: Ctrl+Up/Down jump focus between chat panel and shell (#77) (244abb4)
- llm,proxy: cursor restore lands on prompt-end col + DSR at key moments (#102) (6757d5d)
- llm,tests: live-Ollama tests + chat UX fixes (#65) (cecc609)
- llm/doctor: conclusion turn-count summary + bash DEBUG-trap checks (#45) (cac0c97)
- llm: #: prompt → LLM command generation, async via worker thread (9446414)
- llm: #: prompt → LLM command generation, async via worker thread (eb230f4)
- llm: add Gemini CLI provider presets (#471) (dff1a62)
- llm: AI mode foundation + Alt+A single-prompt action (#19) (9479354)
- llm: Alt+M model cycling + Alt+H help overlay (#20) (594f8fb)
- llm: Alt+R now opens a picker overlay listing all persisted dialogs (#241) (47c5417)
- llm: Alt+R recalls the most recent persisted dialog (#240) (22ad943)
- llm: auto-defocus inline chat on dialog action=exec (#170) (0df3727)
- llm: basic markdown → ANSI SGR renderer for chat panel (#179) (e3b7cf7)
- llm: bind Shift+Up/Shift+Down to chat_scroll_up/down (#237) (165e6bf)
- llm: chat panel footer + End-snaps-to-tail (#182) (1acfded)
- llm: chat panel model indicator + Alt+M gate (#174) (133e20e)
- llm: chat panel polish — held arrows repaint, Up/Down nav, Ctrl+C clears (#392) (07caf7b)
- llm: chat panel UX — emoji width, word wrap, multi-line input, resize (#175) (a7c4aa9)
- llm: chat persistence cleanup — explicit enable + default path + rotation (#69) (a9da596)
- llm: chat recall resumes the same provider session (#406) (29b6275)
- llm: chat scroll — Alt+PageUp/Down bindings + max-offset clamp fix (#412) (debb5db)
- llm: chat scrollback — PageUp/PageDown for overlay + inline (#94) (7f91bd0)
- llm: chat surface defaults to dialog + Alt+T auto toggle + chrome polish (#180) (c65381d)
- llm: chat-overlay phase 2a — Alt+C alt-screen overlay (open/close + render) (#56) (a8e43e8)
- llm: chat-overlay phase 2b — chat input + LLM-driven open (#59) (9f814fa)
- llm: Claude-code-style question UX in chat overlay (#214) (7f0b25d)
- llm: Claude-code-style question UX in chat overlay (#224) (7f0b25d)
- llm: collapse observation turns to a line-count stub in the inline panel (#344) (d2bb481)
- llm: color statusbar AI icon + highlight shortcut tokens (#53) (d0ce656)
- llm: conclusion banner + Alt+C re-show (chat-overlay phase 1) (#48) (5fab7cd)
- llm: Ctrl+D closes the chat panel and overlay (#89) (3b4c64f)
- llm: dynamic system context (OS + cwd + git) for the model (#74) (30b9011)
- llm: Esc exits AI mode (binds to llm_exec_cancel) (#34) (5146447)
- llm: exec dialog (Alt+S) — multi-turn LLM loop with OSC 133 capture (#21) (b1f074b)
- llm: fenced-action protocol + lenient parser (#177) (9502c19)
- llm: file-backed chat history via Config.chat_persist_path (#68) (701675e)
- llm: full chat input editing — arrows, Home/End, Ctrl+A/E/U/K/W, mid-line insert (#93) (6b769a3)
- llm: handle .question action — latch prompt, accept free-form answer (#38) (8a68b82)
- llm: inform single-mode prompt about atty's modes + chat overlay (#60) (0707ea4)
- llm: inject configurable env vars as model context (79308c7)
- llm: inline chat panel (Alt+C) above the statusbar (#64) (628f584)
- llm: live signals while typing
#: …prefix (cursor + statusbar) + push prompts to history (a62631b) - llm: memorize chat panel height across panel close (#405) (a66fede)
- llm: mode-toggle redesign for dialog/auto + bash ;C emitter (#44) (6093a4c)
- llm: Model struct — name + per-model knobs as one unit (#66) (3293685)
- llm: multi-choice question UI via ghost_list pick (#46) (7cae0e7)
- llm: multi-line chat input — bracketed paste + Alt+Enter (#390) (a838655)
- llm: one-line explanation alongside the injected command (3b2418b)
- llm: per-dialog NDJSON persistence — auto-save every turn (#238) (9e9b4ff)
- llm: per-mode + multi-provider via providers array (#169) (afd887b)
- llm: per-provider prompt extensions for agentic CLIs (#473) (8dd3c59)
- llm: per-row chat scroll windowing (closes #213) (#242) (c25d44b)
- llm: render question pick-list in inline chat panel (#308) (#324) (2b39922)
- llm: render SGR colors in full-size chat observation turns (#311 Part B) (3f67b5e)
- llm: render SGR colors in full-size chat observation turns (partial #311) (#325) (3f67b5e)
- llm: show first user line in Alt+R recall picker (#328) (1493064)
- llm: structured assistant-turn rendering in the chat overlay (#95) (af00bee)
- llm: subprocess provider — claude -p and friends (#158) (74c2a05)
- llm: subprocess session continuation (#166) (4d11401)
- llm: subprocess streaming output (stream-json) (#165) (f6af0a8)
- llm: subprocess wall-clock timeout enforcement (#164) (3a12df9)
- llm: support a static
api_basein config — no env required (47bc039) - llm: timeline-rail prefixes for chat turns (Proposal G v1) (#404) (75d4c67)
- llm: transparent failure — surface every "nothing happened" reason as a hint (56d9eab)
- llm: wire auto-exec (Alt+Shift+S) (#37) (4edb236)
- makefile:
make register-shelladds atty to /etc/shells (#389) (5a20920) - metrics: metrics_exporter module (dashboard P1b) (#488) (bfbafb4)
- module,llm: ctx.shell_alt_screen_active + restyled conclusion banner (#58) (7e93fee)
- mouse: #304 PR 4a — SGR 1006 mouse-event parser (#362) (067eb04)
- mouse: #304 PR 4b — onMouseClick dispatch hook + MouseAction (#363) (8dd7b03)
- mouse: #304 PR 4c — proxy stdin intercept + Mouse config subsystem (#364) (def559c)
- mouse: #304 PR 4d — emit DECSET SGR-1006 on startup, pop on exit (#365) (df56882)
- mouse: #304 PR 4e — path-detector helper (pure, tested) (#366) (54ed5bf)
- mouse: #304 PR 4f — mouse_links module wiring (#367) (9fef863)
- mouse: #304 PR 4g — mouse_urls module with whitelist trust gate (#368) (86e0f12)
- mouse: #304 PR 4h — ask_each banner + session-trust (final) (#369) (f5c72eb)
- operator-ux: doctor sidecar checks + workflow doc + named-threat scenarios (#139) (b67b9fd)
- osc133: auto-detected marker support, falls back to keystroke tracking (9bc9e3b)
- osc133: edge_offsets point at the leading ESC, not the terminator (#36) (84a6847)
- phase 2 — LLM module + statusbar hint/error slots + atty init (7ddd8f2)
- proxy,llm: PTY ring buffer for back-pressure during overlay (#61) (3286add)
- proxy: cursor-row tracker + scenario-fixtures harness + delete-history-after-uparrow fix (#18) (086af92)
- proxy: ghost_accept_word also stops at
/(path-segment walk) (#76) (0d25eea) - proxy: subprocess-context tracking — cross-host history via atuin --cwd (#16) (ffb1863)
- proxy: suspend ghost overlay + history recording while in a subprocess (#15) (c25e12a)
- proxy: sync line_state with OSC 133 capture (Arrow Up + completion + paste) (e8095c5)
- sandbox: 4 core scenarios — install, cross-UID, sudo atoms, auto-Block (#335) (c41f678)
- sandbox: 62-onnx-fallback — fail-closed posture for explicit Tier-2 ONNX (#342) (1ba9c21)
- sandbox: docker-based e2e scenario harness with smoke test (#334) (9fb3742)
- sandbox: eBPF scenarios 51 + 52 + kernel-side image build (#348) (fbbc407)
- sandbox: ONNX scenarios 60 + 61 + per-scenario image override (#346) (81a8d05)
- sandbox: real-incident replay scenarios 70 / 71 / 72 (#355) (45eff39)
- sandbox: scenario docker-config typo guard + securityfs probe split (#343) (9fb81dd)
- sandbox: Tier-B per-mode eBPF overhead benchmark (Phase 3) (#479) (0d915c9)
- security_guard: #209 — atom-fetcher drift detection + pin-init bootstrap (#243) (79983a8)
- security_guard: #347 PR 3 — Alt+Shift+W warn-event dump (#370) (a7ecc3b)
- security_guard: #347 PR 3 — atty-side warn subscriber + status segment (#361) (e37b1d0)
- security_guard: atty-guard --print-features probe (#149) (9b4f6fe)
- security_guard: atty-guard as system daemon under atty user (#140) (02405c9)
- security_guard: configurable Alt+P profile-switch mode with sudo default (#502) (c469389)
- security_guard: externalise flagged-npm list + Shai-Hulud seeds + scoped-pkg fix (#114) (2666ade)
- security_guard: first-class eBPF install path (#151) (6f54726)
- security_guard: flagged-URL matcher + design for semi-automatic updates (#115) (9327f55)
- security_guard: in-atty profile switch (Alt+P) + statusbar indicator (#490) (d989a4e)
- security_guard: inline [a]/[B] prompt + session trust/block (#142) (d8fa4ca)
- security_guard: mediated CLI + per-user trust store (#141) (4b0f69e)
- security_guard: migrate trust cache to daemon-side (#147) (e41080b)
- security_guard: PID-tree threat marking + statusbar 🛡 indicator (4cc5085)
- security_guard: PID-tree threat marking + statusbar threat indicator (#112) (4cc5085)
- security_guard: system-fetched atom corpus with permission gate (#150) (300f36a)
- security_guard: Tier-1 pre-Enter pattern matcher (V1 MVP) (#104) (993148a)
- security_guard: UDS client wires the atty-guard sidecar in (#106) (18c8183)
- security_guard: V2-G AtomMatcher — Aho-Corasick over flagged_atoms-txt (#119) (11c8fe3)
- security_guard: V2-H sliding-context-window for SLM + Tier-2 hint plumbing (#120) (f3aab0a)
- security_guard: V2-I baked-in atom fetcher (GTFOBins + cron) (#121) (45509c3)
- security_guard: V2-I-2 — Sigma + LOLBAS atom sources (#125) (3aac69e)
- security_guard: V2-J — threat-level accumulator (multi-hit Tier-1 + SLM) (#126) (a0fcf90)
- security_guard: V2-J-2 — opt-in auto-Block escalation + manual test runner (#127) (ef60362)
- statusbar: add hint row above status text (78398ae)
- statusbar: blank padding row between hint and status + dedicated hint_style (a029acb)
- statusbar: DECSTBM-reserved bottom row + module statusText hook (4003649)
- statusbar: errors render as muted-red notifications in their own slot (4c80c9b)
- test: atty ↔ guard ↔ SLM integration test framework (#136) (2380f80)
- trace: env-var-gated diagnostic logging at proxy boundaries (#90) (c11128d)
- Fix: (f87cbb1)
- address copilot review round 1 on PR #5 (0816613)
- address copilot review round 2 on PR #5 (aaa9e12)
- address copilot review round 2 on PR #7 — capture UTF-8 bytes in OSC 133 input (3f51566)
- address copilot review round 3 on PR #5 (9a85d09)
- address copilot review round 4 on PR #5 — stale comments on statusbar constructors (591b801)
- address copilot review round 5 on PR #5 (159fb8d)
- address copilot review round 6 on PR #5 (f358726)
- address copilot review round 7 on PR #5 — stale comments after earlier rounds (56144e5)
- atty-guard: arm/clear the kernel deny-map on runtime profile switch (#499) (224de04)
- atty-guard: audit batch 2 — Rust bugs (trust_store, threat-map, log redaction, atom OOM) (#307) (a20c23b)
- atty-guard: authorize warn-event subscriptions + bound subscriber slots (#440) (85befe1)
- atty-guard: bound classify reason/matched + trust_list to the client read buffer (#450) (d3dd144)
- atty-guard: bound write_locks + sweep stale tmp files (closes #251, #252) (#321) (8b4e79f)
- atty-guard: build+install the BPF object on --with-ebpf; add CAP_MAC_ADMIN (#442) (6ac34a1)
- atty-guard: char-boundary-safe slicing in npm_parser + osv (no UTF-8 panic) (#448) (fdab771), closes #421
- atty-guard: count distinct signals (not raw hits) for auto-Block (#441) (9db90dd)
- atty-guard: fsync the sibling atomic-write paths (#468) (27e26be)
- atty-guard: fsync write_atomic and set perms before rename (#459) (8153f7d)
- atty-guard: gate classify pid upgrade cross-UID + cap OSV fan-out (#451) (0a51b4f)
- atty-guard: graceful SIGTERM/SIGINT/SIGHUP handling (#276) (#314) (7b4fc7f)
- atty-guard: harden sudo_target_uid against env injection (#271) (#301) (cd2a90b)
- atty-guard: harden the atom-fetch pipeline (accumulation cap, quality gate, write perms) (#449) (6cbbdaa)
- atuin: bounded record FIFO, threshold-only sync timing, joined final sync (#027 #028 #030) (#261) (13e9093)
- atuin: implement deleteHistoryMatch — Ctrl+Shift+D now reaches atuin too (b210d37)
- atuin: order autosuggestions newest-first via --reverse (#474) (bb27e35)
- audit batch 1 — Zig bugs (#286, #287, #288) (32af600)
- audit batch 1 — Zig bugs (worker, proxy, history) (#306) (32af600)
- audit batch 3 — security MEDs (live-tracking warn, LLM endpoint ANSI sanitize) (#309) (30ca068)
- build: make test / itest / e2e forward TARGET; Linux defaults to musl (b607d5c)
- ci: release-please squash-merge auto-tag + populate Release body (#133) (852a7de)
- cli:
atty init— drop ATTY export, pass shell through, add OSC 133 (f8853e1) - config: default ghost pick-list (list_count) to off (#453) (e9125c3)
- config: ghost.list_count ships off (0) by default (e9125c3)
- config: reject unknown config declarations on both sides (#454) (2bf1a9a)
- csiu: translate printable ASCII + drop modified VT-CSI (Windsurf integrated terminal) (#124) (e2b7881)
- cursor_dsr: gate ESC interception on outstanding query — unblocks Esc bindings (#135) (3af4bae)
- dispatch: isolate per-module errors in delete-history fan-out (ea61e59)
- dispatch: isolate per-module errors in delete-history fan-out (954c791)
- docs: use last URL segment as sidebar module label (#385) (91c0a1e)
- doctor: capture DEBUG trap in outer scope (function-local hides it) (#98) (f29d58f)
- e2e: make delete_history_match_after_uparrow deterministic (#24) (e2ce456)
- e2e: rewrite stale LLM configs and refresh goldens for current rendering (#373) (66a10a2)
- ghost_accept: gather fresh suggestion, don't require ghost.visible (6ed10c1)
- ghost_list: dynamic activation, atuin-Ctrl+R style — no permanent dead space (c1cdefb)
- ghost_list: inflate statusbar reservation so shell pushes prompt above the list (fe6d19e)
- ghost_list: paint with absolute CUP, anchored to bottom rows (c56aee2)
- ghost: drop input-path renderGhost — was racing the shell echo (eff5aa1)
- guard: --config load failures now exit non-zero (#231) (30541fd)
- guard: --config load failures now exit non-zero (was fall-open) (30541fd)
- guard: authorize set_threat_level — non-root callers limited to own PIDs (#188) (d1619f9), closes #187
- guard: bounded thread pool + idle read timeout (#193) (1c84f34)
- guard: canonicalize socket path for lock so symlink aliases collide (#218) (a91ae2c)
- guard: cap + prune OSV lookup cache (#233) (a4996aa)
- guard: drop ProtectProc=invisible — incompatible with set_threat_level auth (#206) (2fdba32)
- guard: honor [tier2] backend in config (cli > config > default) (#232) (f87cbb1)
- guard: network.conf drop-in for osv-live + atoms-fetch (#195) (fc369c3), closes #187
- guard: post-merge review-fixups for PRs #231 / #232 (#234) (af6ce63)
- guardrail: banner never fired end-to-end + dispatchLineCommit ran past .swallow (e72586a)
- guardrail: re-check rules on mixed-chunk Enter (#269) (#299) (2361eb1)
- guard: single-instance flock guard on socket startup (#192) (5543bcc)
- history: seek to tail on load; stream-filter file on delete (#438) (464ffa8)
- incognito: three real bugs from manual testing (d7bd349)
- input-tracking: three race-condition fixes after live-test off-by-one (77a127b)
- keymap: csiUToLegacy drops release/repeat events (vim doubles) (#129) (c8e414a)
- kitty: re-enable disambiguate flag + intercept unmapped CSI-u (e8d304b)
- kitty: translate CSI-u back to legacy bytes for Ctrl+letter, Esc, Tab, … (90c4e5d)
- line_state,proxy: Left arrow no longer 'deletes' chars via ghost overlay (#73) (d675c01)
- line_state: carry partial CSI across reads (no continuation-byte injection) (#446) (3a0c64b)
- line_state: ghost over-paint after Arrow-Up — Ctrl-A + cursor-motion CSI handling (#122) (ebf7fac)
- line_state: preserve cursor across mid-line delete syncFromCapture (#239) (9da0845)
- line_state: syncFromCapture preserves cursor_pos on unchanged buffer (#128) (7177491)
- llm: address copilot review round 2 (09110dc)
- llm: address copilot review round 3 — tolerate whitespace in
"content":key (688a557) - llm: address copilot review round 4 — strip C1 control codepoints (security) (58a0708)
- llm: address copilot review round 5 — non-blocking shutdown + URL slash normalisation (da9b120)
- llm: address copilot review round 6 — normalise LLM_API_BASE trailing slash too (7141c30)
- llm: Alt+Shift+C opens an empty overlay instead of refusing (#236) (3c821f1)
- llm: bound \uXXXX skip in extractCommand; expand escape tests to cover \f and malformed \u (99094b9)
- llm: cap concurrent orphan HTTP fetches to bound resource leak (#219) (4cc2c9a)
- llm: chain multi-line exec commands with
&&so they run as one (#395) (82a09ab) - llm: chat close cursor + idle-state shortcut discoverability (#78) (6044c4e)
- llm: chat exec continuation stalled when focus parked on shell (#393) (f637ea3)
- llm: chat panel UX — divider repaint on cycle + drop 3-row truncation (#176) (6e1bd79)
- llm: chat shortcuts back into statusbar + bump response/turn byte caps (#184) (6efe797)
- llm: clamp overlay pick-list rows; musl-safe recall seek; scale worker stack (#447) (e2d9c8f)
- llm: clear cached chat cursor on exec completion (#303) (#323) (c61264f)
- llm: conclusion banner wraps multi-line reason instead of right-drifting (#178) (9ee294d)
- llm: copilot review round 1 — stale-response guard + security strip + body cap (d63fb0d)
- llm: dead in_flight_notified field, misleading timeout_ms doc, escape-handler bug in extractCommand (48007dd)
- llm: decode \uXXXX JSON escapes (was silently dropping shell metas) (4c4cb86)
- llm: decode JSON unicode escapes — shell metas no longer dropped (#91) (4c4cb86)
- llm: direct recall load + Alt+r resends the last prompt (#475) (da1324b)
- llm: done-action reason truncated at parse + chat-mode render (#212) (f9f2b00)
- llm: drop io arg from std.http.Client.deinit (zig 0.16 API drift) (1da54a2)
- llm: enforce HTTP timeout_ms via sub-thread + watchdog (#190) (24286ea), closes #187
- llm: exec-no-return — process OSC 133 edges even when dialog idle (#396) (5b2389a)
- llm: free-text answer to a chat question clears the picker chrome (#410) (75477b0)
- llm: full-screen overlay renders exec turns with the new box (#408) (40165b0)
- llm: heap-allocate chat_overlay_buf for unbounded turn content (#221) (cdb3128)
- llm: heap-allocate chat_overlay_buf so long-reason turns don't overflow (cdb3128)
- llm: inline .done reason — reserve 2 cols for ✓ prefix in wrap budget (#217) (6766465)
- llm: inline
.donereason — reserve 2 cols for ✓ prefix in wrap budget (6766465) - llm: inline chat panel — defensive clears for ghost rows (#411) (94940a7)
- llm: inline-chat paint CUP-restores cursor to shell row (#79) (a7fbc74)
- llm: kill subprocess process group on timeout (#194) (ea3d537)
- llm: kitty kbd Alt bindings + configurable Enter trigger (#40) (f79a1bf)
- llm: move default_bindings INSIDE configure() — Alt+* keys were dead (#72) (c29077e)
- llm: multi-line exec commands stage as bracketed paste, not && chain (#409) (c69e8d8)
- llm: overlay layout robustness + rebind Alt+C→inline / Alt+Shift+C→overlay (#63) (d8811e7)
- llm: preserve chat turns on subprocess timeout + Alt+r retry (#394) (9de14af)
- llm: recall picker arrow keys + auto-close inline panel on Alt+R (#318) (#322) (c1494be)
- llm: sanitize dialog-mode exec commands before injection (#437) (f247400)
- llm: seek to end of large persist file (#191) (f6755ba)
- llm: surface DIALOG/AUTO mode hint whenever state machine engaged (#92) (ce0dfc3)
- llm: use usize for hex-skip counter; clarify \u test comment (9ef15c5)
- llm: write subprocess stdin from a thread to avoid full-duplex deadlock (#457) (40f2eaa)
- OS-portable monotonic clock and open flags across modules (#466) (4f1df6e)
- osc133: treat ;A as prompt-active so partial emitters get ghost text (#17) (6e5abe7)
- proxy: byte-stream CSI-u translation in hidden-input fast path (abdeda1)
- proxy: defer atty paints when shell is mid-escape (#387) (58e2756)
- proxy: drop shell-fired CPR replies that leak through DsrParser gate (#235) (bc83b69)
- proxy: errno-gated write retry — don't spin on unrecoverable errors (45471ac)
- proxy: forward CPR replies to foreground commands (#470) (5d85fca)
- proxy: gate ghost_accept on !cursor_moved so mid-line Right doesn't paste history (#97) (4e74b38)
- proxy: reactivate statusbar when LLM chat overlay closes (#96) (7d62a4c)
- proxy: redact hidden input — short-circuit input pipeline while ECHO is off (a984322)
- proxy: redact password input — don't track keystrokes while ECHO is off (ea412d2)
- proxy: refine hidden-input gate so interactive shells stop tripping CSI-u redaction (a7b387b)
- proxy: refine hidden-input gate to ICANON && !ECHO — restore CSI-u translation in interactive shells (08e8fe2)
- proxy: refuse non-TTY stdio and harden SIGPIPE handling (#51) (9183deb)
- proxy: scroll shell content up when inline panel grows past cursor (#103) (c2774a8)
- proxy: shell-alt-screen TUIs (k9s, vim, less) see Esc on first press (#181) (a214dbc)
- proxy: shell-alt-screen TUIs see Esc on the first press (a214dbc)
- proxy: suppress ghost re-engagement after mid-line insert post-recall (#386) (83d33a7)
- proxy: suspend statusbar and give app full rows on alt-screen entry (#14) (74cc7f4)
- proxy: translate CSI-u inside the hidden-input fast path (99f5f93)
- proxy: treat EAGAIN as error.WriteFailed in writeFully (6281c62)
- release: create releases with assets atomically for immutable releases (#514) (e633301)
- repo hygiene + Darwin-portable clock and open flags (audit #435) (51be76b)
- repo hygiene and Darwin-portable clock/open flags (#464) (51be76b)
- security_guard: #022 + #023 — atoms list --fetched + drop stale libonnxruntime refs (#250) (3f6ef37)
- security_guard: #024 + #025 — serialize trust-store writes, retain cap-blocked hashes (#248) (d013073)
- security_guard: clear daemon threat mark when local state clears (#230) (52810e4)
- security_guard: close UDS fd on classify timeout (#272) (#302) (47ca882)
- security_guard: decouple config parsing from tier2-onnx feature (#032) (#266) (ad10374)
- security_guard: fail-closed on explicit ONNX backend load failure (#026) (#260) (a91b390)
- security_guard: forward context to atty-guard daemon classify (#189) (fd837c7)
- security_guard: OSV checks all installed packages, not just the first (#029) (#262) (c2a0bc9)
- security_guard: parse daemon ok/error envelopes for mutation RPCs (#207) (4bede99)
- security_guard: PID-threat verdict worst-wins escalation (#268) (#273) (fb6c269)
- security_guard: re-probe a disabled daemon; seed trust only on success (#443) (4691ebd)
- security_guard: reject non-hex hashes in TrustCache add (#270) (#300) (b2ac5b2)
- security_guard: structural UDS response parse + echoed-id validation (#452) (3a23470)
- statusbar: activate parks cursor at (1,1), not in reserved area (1808fbb)
- statusbar: clear screen on activate for consistent fresh start (accc89d)
- statusbar: re-assert DECSTBM when inline TUIs clobber it (#249) (#253) (ffc7100)
- tests: drop deleted atom_fetcher_lolbas scenario from full run (#455) (ac2c9b7)
- TOCTOU defense in slaveIsHiddenInput + clear desyncs chat state (#283, #305) (#313) (5749511)
- line_state: bulk-append printable runs in applyInput (#289) (#319) (4c3d758)
- llm/paint: swap page_allocator for stack-backed FBA (#285) (#316) (f47682a)
- llm: chat input fast-path — skip scrollback rewalk on typing (#186) (b8d687a)
- llm: unify stream-json result + session_id walkers (#172) (ee2d377)
- proxy: fast-path master-read for escape-free chunks (#62) (eb02f56)
- atty-guard: extract dispatch arms into per-request handlers (#280) (9ae6134)
- atty-guard: extract dispatch arms into per-request handlers (closes #280) (#326) (9ae6134)
- atty-guard: remove the unconsumed trace_execve tracepoint (#481) (54804cd)
- atty-guard: split atom_fetcher into per-domain submodules (closes #281) (#327) (114463a)
- atty-guard: split atom_fetcher.rs into per-domain modules (#281) (114463a)
- config: every subsystem is a struct (style guide commitment) (74ae7af)
- config: group statusbar fields into atty.StatusBar struct (d0d0f15)
- config: split user config from defaults (dwm-style) (734da31)
- defaults: swap atuin → history in the default tuple (18be9bc)
- extract tests to sibling files across the codebase (#82) (6010ed2)
- ghost_list: sweep dead anchor/RenderMode plumbing + docs (425bbbd)
- guardrail: split Match union + match helpers into submodule folder (#31) (aa1faae)
- history: split pure format helpers into submodule folder (#25) (d692dfc)
- keymap: extract keymap.match() + tests, use from proxy (f8926fb)
- keymap: split into submodule folder (#22) (79c498b)
- llm-tests: split the bundled tests file along the new sibling boundaries (#87) (9702d65)
- llm: dynamic per-response buffers (lifts inline fixed-size reservation) (#185) (e069eaa)
- llm: extract 1700 lines of inline tests to a sibling tests file (#81) (458f21f)
- llm: extract 1700 lines of inline tests to llm/tests.zig (458f21f)
- llm: extract Config struct into llm/types.zig (#32) (49b2d2c)
- llm: extract dialog teardown helpers (dialogReset + abortDialog) (#55) (a1b34dc)
- llm: extract dialog types + pure helpers to llm/dialog.zig (#42) (2b00ddf)
- llm: extract env-var resolution helpers to llm/env.zig (#49) (a0830fb)
- llm: extract hooks + dialog state machine to a sibling factory (#86) (e29a802)
- llm: extract paint surface to a sibling factory module (#83) (011c39b)
- llm: extract turn ring + capture + latch helpers (#52) (567e675)
- llm: extract worker thread + HTTP RPC + extract helpers to llm/worker.zig (#43) (99b7308)
- llm: heap-promote captured_output + last_assistant_json off Runtime (#35) (14ccaa3)
- llm: split pure parse helpers into submodule folder (#28) (9b583d3)
- main: extract args.zig parser + tests (7 cases) (8037b1e)
- main: extract inline shell snippets to src/snippets/ (3f0356e)
- main: extract inline shell snippets to src/snippets/ files (#315) (3f0356e)
- proxy: extract status_text.zig — pure segment assembly + tests (98c02db)
- proxy: hoist keymap import + name kitty kbd push/pop bytes (0e416a4)
- proxy: split pure I/O helpers into submodule folder (#30) (e0a928e)
- split hooks_tests into 4 topic-focused siblings (#400) (3dc5607)
- split hooks_tests.zig into 4 topic-focused siblings (3dc5607)
- split line_state_tests into input + commit stripes (#397) (69e0acc)
- split line_state_tests.zig into input + commit stripes (69e0acc)
- split llm_tests into parse + status stripes (#401) (a22d729)
- split llm_tests.zig into parse + status stripes (a22d729)
- split paint_tests into panel + render + chrome stripes (#399) (0baf52f)
- split paint_tests.zig into panel + render + chrome stripes (0baf52f)
- split worker_tests into subprocess + stream stripes (#398) (0f7b3a8)
- split worker_tests.zig into subprocess + stream stripes (0f7b3a8)
- style: promote Style to a first-class atty.Style with presets (d2898f7)
- subprocess: split into submodule folder (#23) (a1823ae)
- add 5 more chat UI/UX proposals (F-J) (#403) (f91119a)
- add CLAUDE.md for fresh-agent orientation (86d5f28)
- added Alt+Shift+R / Alt+r to the llm.md keybinding table and (452d14e)
- atuin: refresh provider/architecture/modules docs for FIFO + sync + delete (#033) (#267) (7b6651c)
- audit batch — V-table refresh + paint skip semantics (closes #298) (#320) (9506e1c)
- audit batch 5 — fix doc drift across atty + atty-guard (#298) (e175050)
- audit batch 5 — partial doc drift fixes (#298) (#312) (e175050)
- audit tracker for 2026-06-12 full-repo review (#413-#435) (b109cee)
- audit tracker for 2026-06-12 full-repo review (#436) (b109cee)
- chat UI/UX proposals (5 options) (#402) (1b11054)
- clarify gatherGhostText priority + atuin/history race window (8347363)
- config: correct the Terminal section and stale binding/statusbar comments (#456) (fe6c216)
- dashboard: design-of-record for the attop TUI + metrics API (#486) (24c39f5)
- document the attop dashboard (screens, themes, i18n, keybindings) (#500) (5121854)
- document the attop dashboard and capability wizard (#512) (6c1c77f)
- fix stale CLAUDE/module/atuin/llm comments and invariants (#463) (77fba37)
- getting-started: git-clone install path, promote shell-rc, safer demo (#352) (b23db11)
- guard-design: sweep stale 'next step' + LOLBAS + atom-path claims (#198) (6450623)
- guard: correct status drift — V2-B / V2-C / V2-F / V2-I all shipped (5269ccb)
- guard: correct status drift — V2-B/C/F/I all shipped (#220) (5269ccb)
- guard: rewrite README security model section (#196) (60e0f3d)
- image-paste research — protocol survey + phased atty plan (#407) (e01fc80)
- install: threat-model paragraph for the atty group (#298) (5dc6a9a)
- install: threat-model paragraph for the atty group (partial #298) (#317) (5dc6a9a)
- llm: catch up on fenced-action protocol + new chat bindings (#183) (9a706ab)
- llm: renderOverlayTurnContent arena comment matches impl (#222) (b5594a6)
- mark #413 done in audit tracker (0bc444d)
- mark #414 done in audit tracker (7209551)
- mark #415 done in audit tracker (367218e)
- mark #416 done in audit tracker (7d92780)
- mark #417 done in audit tracker (bc297b3)
- mark #418 done in audit tracker (606d512)
- mark #419 done in audit tracker (keymap prefix-match → #445) (d7f4b6f)
- mark #420 done in audit tracker (c90eabc)
- mark #421 done in audit tracker (02ded50)
- mark #422 done in audit tracker (e2a8b0d)
- mark #423 done in audit tracker (11a8b2b)
- mark #424 done in audit tracker (0038cf2)
- mark #425 done in audit tracker (e5c1452)
- mark #426 done in audit tracker (a48e89b)
- mark #427 done in audit tracker (81b3fce)
- mark #428 done in audit tracker (04c900d)
- mark #429 done in audit tracker (2cfe9c2)
- mark #430 done in audit tracker (dc3a323)
- mark #431 done in audit tracker (857492e)
- mark #432 done in audit tracker (96269e0)
- mark #433 done (server-side); e2e daemon-verdict deferred to #461 (94a49d9)
- mark #434 done in audit tracker (5ca50ef)
- mark #435 done — audit #413-#435 fully closed (535bf14)
- modules: correct atty-guard socket path + user-unit reference (#197) (413131b), closes #187
- osc133: document the marker integration in architecture.md (2e72d32)
- phase-2 surface (LLM module, new hooks, statusbar slots, floating TOC) (bb8090a)
- post-architecture-rewrite cleanup for CLAUDE and atty-guard README (#152) (6ab578b)
- providers: correct vi-mode hjkl mechanism — model desync, not uncertain flag (4aa37d6)
- providers: correct vi-mode hjkl mechanism (#223) (4aa37d6)
- providers: tab completion with OSC 133 (#171) (67fa354)
- proxy: state-machine diagram for run() phase order (partial #298) (d597fb6)
- record the eBPF enforcement-depth decision rationale (#480) (9a5d643)
- reflect recently-shipped features (4d1c938)
- reflect recently-shipped features (#65-#70) (#71) (4d1c938)
- refresh for Alt bindings + enter_action + atty doctor (#41) (6af52ae)
- refresh for kitty Alt bindings + enter_action + atty doctor (6af52ae)
- refresh stale Atuin defaults + atom-refresh help + OSC 133 roadmap (#031) (#263) (cfb8f2b)
- refresh stale claims across READMEs + sandbox + integration (#357) (09f63af)
- rewrite README and refresh the docs set (#476) (452d14e)
- roadmap: defer PR M (atuin submodule split) (5941f63)
- roadmap: mark #21 merged + add PR P (fix surviving e2e flake) (ccf1597)
- roadmap: mark PR #26 (line-state author) merged (fd1deb9)
- roadmap: mark PR #33 (guardrail rules.zig + extra_rules) merged (55c5d01)
- roadmap: mark PR #36 (osc133 edge offset) merged (d6ed008)
- roadmap: mark PR #37 (auto-exec) merged (4e455f5)
- roadmap: mark PRs #27 / #28 / #29 / #30 merged (ae38de6)
- roadmap: mark PRs #31 + #32 merged; defer remaining refactor slices (ee6b0d0)
- roadmap: mark PRs #34 (Esc) + #35 (heap-promote) merged (5af2cec)
- rough outlines for chat-overlay phase 2 + security guard (#54) (f49a415)
- security_guard: document UDS hot-path blocking contract (#282) (#310) (378de4b)
- security_guard: mark V1+V2-A+V2-D shipped; sequence V2-B/C/E (#107) (206f51c)
- security_guard: surface module + atty-guard in CLAUDE + modules docs (#111) (ed82289)
- security_guard: V1+V2-A+V2-D shipped; mark next steps (206f51c)
- security: three-component architecture (PTY + eBPF + SLM daemon) (#75) (2c4214c)
- shared terminal_example component + LLM page demo (#354) (6d1718d)
- sidebar TOC with scroll-spy — keep 78ch content width (996f938)
- sidebar TOC with scroll-spy — keep 78ch content width, add TOC to architecture + providers (c8439d1)
- site: adopt starship-style layout (#154) (ce43146)
- site: surface attop on the site and fix the Modules nav affordance (#513) (2050bd6)
- site: user-facing refactor + interactive playback demo (#153) (cd8b128)
- split modules page for security_guard / mouse_links / mouse_urls (#382) (7f3d947)
- split providers page into per-module pages + sidebar drawer (#384) (5739855)
- surface security_guard module + atty-guard sidecar in CLAUDE.md / modules.md (ed82289)
- surface the full-suite install path + modules TOC (#379) (bb5b2a6)
- surface V2-J-2 auto-Block + atty-side REFUSED path (#130) (7c1b570)
- sweep — mouse stack (#304) + warn-mode overlay (#347) (#371) (a9acc91)
- widen home-page column — no TOC sidebar to share width with (1935732)
- widen home-page column to match doc-page total width (#13) (1935732)
0.7.0 (2026-06-02)
- docs: use last URL segment as sidebar module label (#385) (91c0a1e)
- proxy: suppress ghost re-engagement after mid-line insert post-recall (#386) (83d33a7)
- split modules page for security_guard / mouse_links / mouse_urls (#382) (7f3d947)
- split providers page into per-module pages + sidebar drawer (#384) (5739855)
- surface the full-suite install path + modules TOC (#379) (bb5b2a6)
0.6.0 (2026-06-01)
-
atty-guard,sandbox: --ebpf-mode flag + 50-ebpf-loader scenario (#337) (5009e3d)
-
atty-guard: #347 PR 1 — kernel-side warn-mode (no EPERM + warn_pids) (#358) (69e46c7)
-
atty-guard: #347 PR 2a — SubscribeWarnEvents RPC + broadcast infrastructure (#359) (d32a565)
-
atty-guard: #347 PR 2b — ringbuf consumer thread + sandbox scenario 54 (#360) (0acd596)
-
guard: atom-fetcher caps + opt-in commit pinning (#208) (98103d7)
-
llm: Alt+R now opens a picker overlay listing all persisted dialogs (#241) (47c5417)
-
llm: Alt+R recalls the most recent persisted dialog (#240) (22ad943)
-
llm: auto-defocus inline chat on dialog action=exec (#170) (0df3727)
-
llm: basic markdown → ANSI SGR renderer for chat panel (#179) (e3b7cf7)
-
llm: bind Shift+Up/Shift+Down to chat_scroll_up/down (#237) (165e6bf)
-
llm: chat panel model indicator + Alt+M gate (#174) (133e20e)
-
llm: chat panel UX — emoji width, word wrap, multi-line input, resize (#175) (a7c4aa9)
-
llm: chat surface defaults to dialog + Alt+T auto toggle + chrome polish (#180) (c65381d)
-
llm: Claude-code-style question UX in chat overlay (#214) (7f0b25d)
-
llm: Claude-code-style question UX in chat overlay (#224) (7f0b25d)
-
llm: collapse observation turns to a line-count stub in the inline panel (#344) (d2bb481)
-
llm: fenced-action protocol + lenient parser (#177) (9502c19)
-
llm: per-dialog NDJSON persistence — auto-save every turn (#238) (9e9b4ff)
-
llm: per-mode + multi-provider via providers array (#169) (afd887b)
-
llm: per-row chat scroll windowing (closes #213) (#242) (c25d44b)
-
llm: render question pick-list in inline chat panel (#308) (#324) (2b39922)
-
llm: render SGR colors in full-size chat observation turns (#311 Part B) (3f67b5e)
-
llm: render SGR colors in full-size chat observation turns (partial #311) (#325) (3f67b5e)
-
llm: show first user line in Alt+R recall picker (#328) (1493064)
-
llm: subprocess provider — claude -p and friends (#158) (74c2a05)
-
llm: subprocess streaming output (stream-json) (#165) (f6af0a8)
-
llm: subprocess wall-clock timeout enforcement (#164) (3a12df9)
-
mouse: #304 PR 4a — SGR 1006 mouse-event parser (#362) (067eb04)
-
mouse: #304 PR 4b — onMouseClick dispatch hook + MouseAction (#363) (8dd7b03)
-
mouse: #304 PR 4c — proxy stdin intercept + Mouse config subsystem (#364) (def559c)
-
mouse: #304 PR 4d — emit DECSET SGR-1006 on startup, pop on exit (#365) (df56882)
-
mouse: #304 PR 4e — path-detector helper (pure, tested) (#366) (54ed5bf)
-
mouse: #304 PR 4f — mouse_links module wiring (#367) (9fef863)
-
mouse: #304 PR 4g — mouse_urls module with whitelist trust gate (#368) (86e0f12)
-
mouse: #304 PR 4h — ask_each banner + session-trust (final) (#369) (f5c72eb)
-
sandbox: 4 core scenarios — install, cross-UID, sudo atoms, auto-Block (#335) (c41f678)
-
sandbox: 62-onnx-fallback — fail-closed posture for explicit Tier-2 ONNX (#342) (1ba9c21)
-
sandbox: docker-based e2e scenario harness with smoke test (#334) (9fb3742)
-
sandbox: eBPF scenarios 51 + 52 + kernel-side image build (#348) (fbbc407)
-
sandbox: ONNX scenarios 60 + 61 + per-scenario image override (#346) (81a8d05)
-
sandbox: real-incident replay scenarios 70 / 71 / 72 (#355) (45eff39)
-
sandbox: scenario docker-config typo guard + securityfs probe split (#343) (9fb81dd)
-
security_guard: #209 — atom-fetcher drift detection + pin-init bootstrap (#243) (79983a8)
-
security_guard: #347 PR 3 — Alt+Shift+W warn-event dump (#370) (a7ecc3b)
-
security_guard: #347 PR 3 — atty-side warn subscriber + status segment (#361) (e37b1d0)
-
operator-ux: doctor sidecar checks + workflow doc + named-threat scenarios (#139) (b67b9fd)
-
security_guard: atty-guard --print-features probe (#149) (9b4f6fe)
-
security_guard: atty-guard as system daemon under atty user (#140) (02405c9)
-
security_guard: first-class eBPF install path (#151) (6f54726)
-
security_guard: inline [a]/[B] prompt + session trust/block (#142) (d8fa4ca)
-
security_guard: mediated CLI + per-user trust store (#141) (4b0f69e)
-
security_guard: migrate trust cache to daemon-side (#147) (e41080b)
-
security_guard: system-fetched atom corpus with permission gate (#150) (300f36a)
- Fix: (f87cbb1)
- atty-guard: audit batch 2 — Rust bugs (trust_store, threat-map, log redaction, atom OOM) (#307) (a20c23b)
- atty-guard: bound write_locks + sweep stale tmp files (closes #251, #252) (#321) (8b4e79f)
- atty-guard: graceful SIGTERM/SIGINT/SIGHUP handling (#276) (#314) (7b4fc7f)
- atty-guard: harden sudo_target_uid against env injection (#271) (#301) (cd2a90b)
- atuin: bounded record FIFO, threshold-only sync timing, joined final sync (#027 #028 #030) (#261) (13e9093)
- audit batch 1 — Zig bugs (#286, #287, #288) (32af600)
- audit batch 1 — Zig bugs (worker, proxy, history) (#306) (32af600)
- audit batch 3 — security MEDs (live-tracking warn, LLM endpoint ANSI sanitize) (#309) (30ca068)
- guard: --config load failures now exit non-zero (#231) (30541fd)
- guard: --config load failures now exit non-zero (was fall-open) (30541fd)
- guard: authorize set_threat_level — non-root callers limited to own PIDs (#188) (d1619f9), closes #187
- guard: bounded thread pool + idle read timeout (#193) (1c84f34)
- guard: canonicalize socket path for lock so symlink aliases collide (#218) (a91ae2c)
- guard: cap + prune OSV lookup cache (#233) (a4996aa)
- guard: drop ProtectProc=invisible — incompatible with set_threat_level auth (#206) (2fdba32)
- guard: honor [tier2] backend in config (cli > config > default) (#232) (f87cbb1)
- guard: network.conf drop-in for osv-live + atoms-fetch (#195) (fc369c3), closes #187
- guard: post-merge review-fixups for PRs #231 / #232 (#234) (af6ce63)
- guardrail: re-check rules on mixed-chunk Enter (#269) (#299) (2361eb1)
- guard: single-instance flock guard on socket startup (#192) (5543bcc)
- line_state: preserve cursor across mid-line delete syncFromCapture (#239) (9da0845)
- llm: Alt+Shift+C opens an empty overlay instead of refusing (#236) (3c821f1)
- llm: cap concurrent orphan HTTP fetches to bound resource leak (#219) (4cc2c9a)
- llm: chat panel UX — divider repaint on cycle + drop 3-row truncation (#176) (6e1bd79)
- llm: chat shortcuts back into statusbar + bump response/turn byte caps (#184) (6efe797)
- llm: clear cached chat cursor on exec completion (#303) (#323) (c61264f)
- llm: conclusion banner wraps multi-line reason instead of right-drifting (#178) (9ee294d)
- llm: done-action reason truncated at parse + chat-mode render (#212) (f9f2b00)
- llm: enforce HTTP timeout_ms via sub-thread + watchdog (#190) (24286ea), closes #187
- llm: heap-allocate chat_overlay_buf for unbounded turn content (#221) (cdb3128)
- llm: heap-allocate chat_overlay_buf so long-reason turns don't overflow (cdb3128)
- llm: inline .done reason — reserve 2 cols for ✓ prefix in wrap budget (#217) (6766465)
- llm: inline
.donereason — reserve 2 cols for ✓ prefix in wrap budget (6766465) - llm: kill subprocess process group on timeout (#194) (ea3d537)
- llm: recall picker arrow keys + auto-close inline panel on Alt+R (#318) (#322) (c1494be)
- llm: seek to end of large persist file (#191) (f6755ba)
- proxy: drop shell-fired CPR replies that leak through DsrParser gate (#235) (bc83b69)
- proxy: shell-alt-screen TUIs (k9s, vim, less) see Esc on first press (#181) (a214dbc)
- proxy: shell-alt-screen TUIs see Esc on the first press (a214dbc)
- security_guard: #022 + #023 — atoms list --fetched + drop stale libonnxruntime refs (#250) (3f6ef37)
- security_guard: #024 + #025 — serialize trust-store writes, retain cap-blocked hashes (#248) (d013073)
- security_guard: clear daemon threat mark when local state clears (#230) (52810e4)
- security_guard: close UDS fd on classify timeout (#272) (#302) (47ca882)
- security_guard: decouple config parsing from tier2-onnx feature (#032) (#266) (ad10374)
- security_guard: fail-closed on explicit ONNX backend load failure (#026) (#260) (a91b390)
- security_guard: forward context to atty-guard daemon classify (#189) (fd837c7)
- security_guard: OSV checks all installed packages, not just the first (#029) (#262) (c2a0bc9)
- security_guard: parse daemon ok/error envelopes for mutation RPCs (#207) (4bede99)
- security_guard: PID-threat verdict worst-wins escalation (#268) (#273) (fb6c269)
- security_guard: reject non-hex hashes in TrustCache add (#270) (#300) (b2ac5b2)
- statusbar: re-assert DECSTBM when inline TUIs clobber it (#249) (#253) (ffc7100)
- TOCTOU defense in slaveIsHiddenInput + clear desyncs chat state (#283, #305) (#313) (5749511)
- line_state: bulk-append printable runs in applyInput (#289) (#319) (4c3d758)
- llm/paint: swap page_allocator for stack-backed FBA (#285) (#316) (f47682a)
- llm: chat input fast-path — skip scrollback rewalk on typing (#186) (b8d687a)
- llm: unify stream-json result + session_id walkers (#172) (ee2d377)
- atty-guard: extract dispatch arms into per-request handlers (#280) (9ae6134)
- atty-guard: extract dispatch arms into per-request handlers (closes #280) (#326) (9ae6134)
- atty-guard: split atom_fetcher into per-domain submodules (closes #281) (#327) (114463a)
- atty-guard: split atom_fetcher.rs into per-domain modules (#281) (114463a)
- llm: dynamic per-response buffers (lifts inline fixed-size reservation) (#185) (e069eaa)
- main: extract inline shell snippets to src/snippets/ (3f0356e)
- main: extract inline shell snippets to src/snippets/ files (#315) (3f0356e)
- atuin: refresh provider/architecture/modules docs for FIFO + sync + delete (#033) (#267) (7b6651c)
- audit batch — V-table refresh + paint skip semantics (closes #298) (#320) (9506e1c)
- audit batch 5 — fix doc drift across atty + atty-guard (#298) (e175050)
- audit batch 5 — partial doc drift fixes (#298) (#312) (e175050)
- getting-started: git-clone install path, promote shell-rc, safer demo (#352) (b23db11)
- guard-design: sweep stale 'next step' + LOLBAS + atom-path claims (#198) (6450623)
- guard: correct status drift — V2-B / V2-C / V2-F / V2-I all shipped (5269ccb)
- guard: correct status drift — V2-B/C/F/I all shipped (#220) (5269ccb)
- guard: rewrite README security model section (#196) (60e0f3d)
- install: threat-model paragraph for the atty group (#298) (5dc6a9a)
- install: threat-model paragraph for the atty group (partial #298) (#317) (5dc6a9a)
- llm: catch up on fenced-action protocol + new chat bindings (#183) (9a706ab)
- llm: renderOverlayTurnContent arena comment matches impl (#222) (b5594a6)
- modules: correct atty-guard socket path + user-unit reference (#197) (413131b), closes #187
- providers: correct vi-mode hjkl mechanism — model desync, not uncertain flag (4aa37d6)
- providers: correct vi-mode hjkl mechanism (#223) (4aa37d6)
- providers: tab completion with OSC 133 (#171) (67fa354)
- proxy: state-machine diagram for run() phase order (partial #298) (d597fb6)
- refresh stale Atuin defaults + atom-refresh help + OSC 133 roadmap (#031) (#263) (cfb8f2b)
- refresh stale claims across READMEs + sandbox + integration (#357) (09f63af)
- security_guard: document UDS hot-path blocking contract (#282) (#310) (378de4b)
- shared terminal_example component + LLM page demo (#354) (6d1718d)
- sweep — mouse stack (#304) + warn-mode overlay (#347) (#371) (a9acc91)
- post-architecture-rewrite cleanup for CLAUDE and atty-guard README (#152) (6ab578b)
- site: adopt starship-style layout (#154) (ce43146)
- site: user-facing refactor + interactive playback demo (#153) (cd8b128)
0.5.0 (2026-05-19)
- atty-guard: configurable ONNX SLM via tract (SecureBERT 2 + Qwen2 5-Coder) (#116) (090bc5e)
- atty-guard: eBPF AF_ALG socket() tracepoint — copy.fail-class kernel-LPE detector (654a520)
- atty-guard: eBPF AF_ALG tracepoint — copy-fail-class kernel-LPE detector (#117) (654a520)
- atty-guard: Tier-2 backend trait + Heuristic impl (V2-C plumbing) (#109) (81c03f7)
- atty-guard: V2-A sidecar daemon — UDS + Tier-1 classifier + threat map (#105) (cfba772)
- atty-guard: V2-B eBPF skeleton — kernel sources + Rust loader API (#110) (dcb48fa)
- atty-guard: V2-B impl — libbpf-rs LSM attach + BPF map write-through (#113) (fdec184)
- atty-guard: V2-C — configurable ONNX SLM via tract (SecureBERT 2.0 + Qwen2.5-Coder) (090bc5e)
- atty-guard: V2-E packaging — hardened systemd-user unit + installer (#108) (06cf4d8)
- atty-guard: V2-F live OSV-dev lookup for npm Tier-1 misses (#118) (c62d598)
- atty-guard: V2-F live OSV.dev lookup for npm install <pkg> Tier-1 misses (c62d598)
- atuin: --intent flag wiring + LineState.committedIntent (#47) (2d6e14a)
- atuin: tag LLM-authored commits via --author atty:llm (#29) (5a4bf53)
- build: atty-guard in release bins + Makefile targets + cargo CI (#132) (3daf257)
- cursor_dsr: DSR-6n reply interceptor + stdin filter (#101) (0c53037)
- cursor_tracker: track column + OSC 133 anchors (#100) (5e13cf8)
- dispatch,llm: modules register their own default_bindings (#70) (245e7e8)
- guardrail: author-aware Rule with AuthorMask + Behavior (#27) (0257dbb)
- guardrail: split rule types into rules.zig + add extra_rules merge (#33) (be8db06)
- keymap,proxy: Alt+H global keybindings cheat-sheet (#67) (45bd3e1)
- line-state: author propagation (#26) (e2dfacf)
- llm,keymap: Ctrl+Up/Down jump focus between chat panel and shell (#77) (244abb4)
- llm,proxy: cursor restore lands on prompt-end col + DSR at key moments (#102) (6757d5d)
- llm,tests: live-Ollama tests + chat UX fixes (#65) (cecc609)
- llm/doctor: conclusion turn-count summary + bash DEBUG-trap checks (#45) (cac0c97)
- llm: AI mode foundation + Alt+A single-prompt action (#19) (9479354)
- llm: Alt+M model cycling + Alt+H help overlay (#20) (594f8fb)
- llm: chat persistence cleanup — explicit enable + default path + rotation (#69) (a9da596)
- llm: chat scrollback — PageUp/PageDown for overlay + inline (#94) (7f91bd0)
- llm: chat-overlay phase 2a — Alt+C alt-screen overlay (open/close + render) (#56) (a8e43e8)
- llm: chat-overlay phase 2b — chat input + LLM-driven open (#59) (9f814fa)
- llm: color statusbar AI icon + highlight shortcut tokens (#53) (d0ce656)
- llm: conclusion banner + Alt+C re-show (chat-overlay phase 1) (#48) (5fab7cd)
- llm: Ctrl+D closes the chat panel and overlay (#89) (3b4c64f)
- llm: dynamic system context (OS + cwd + git) for the model (#74) (30b9011)
- llm: Esc exits AI mode (binds to llm_exec_cancel) (#34) (5146447)
- llm: exec dialog (Alt+S) — multi-turn LLM loop with OSC 133 capture (#21) (b1f074b)
- llm: file-backed chat history via Config.chat_persist_path (#68) (701675e)
- llm: full chat input editing — arrows, Home/End, Ctrl+A/E/U/K/W, mid-line insert (#93) (6b769a3)
- llm: handle .question action — latch prompt, accept free-form answer (#38) (8a68b82)
- llm: inform single-mode prompt about atty's modes + chat overlay (#60) (0707ea4)
- llm: inline chat panel (Alt+C) above the statusbar (#64) (628f584)
- llm: mode-toggle redesign for dialog/auto + bash ;C emitter (#44) (6093a4c)
- llm: Model struct — name + per-model knobs as one unit (#66) (3293685)
- llm: multi-choice question UI via ghost_list pick (#46) (7cae0e7)
- llm: structured assistant-turn rendering in the chat overlay (#95) (af00bee)
- llm: wire auto-exec (Alt+Shift+S) (#37) (4edb236)
- module,llm: ctx.shell_alt_screen_active + restyled conclusion banner (#58) (7e93fee)
- osc133: edge_offsets point at the leading ESC, not the terminator (#36) (84a6847)
- proxy,llm: PTY ring buffer for back-pressure during overlay (#61) (3286add)
- proxy: cursor-row tracker + scenario-fixtures harness + delete-history-after-uparrow fix (#18) (086af92)
- proxy: ghost_accept_word also stops at
/(path-segment walk) (#76) (0d25eea) - proxy: subprocess-context tracking — cross-host history via atuin --cwd (#16) (ffb1863)
- proxy: suspend ghost overlay + history recording while in a subprocess (#15) (c25e12a)
- security_guard: externalise flagged-npm list + Shai-Hulud seeds + scoped-pkg fix (#114) (2666ade)
- security_guard: flagged-URL matcher + design for semi-automatic updates (#115) (9327f55)
- security_guard: PID-tree threat marking + statusbar 🛡 indicator (4cc5085)
- security_guard: PID-tree threat marking + statusbar threat indicator (#112) (4cc5085)
- security_guard: Tier-1 pre-Enter pattern matcher (V1 MVP) (#104) (993148a)
- security_guard: UDS client wires the atty-guard sidecar in (#106) (18c8183)
- security_guard: V2-G AtomMatcher — Aho-Corasick over flagged_atoms-txt (#119) (11c8fe3)
- security_guard: V2-H sliding-context-window for SLM + Tier-2 hint plumbing (#120) (f3aab0a)
- security_guard: V2-I baked-in atom fetcher (GTFOBins + cron) (#121) (45509c3)
- security_guard: V2-I-2 — Sigma + LOLBAS atom sources (#125) (3aac69e)
- security_guard: V2-J — threat-level accumulator (multi-hit Tier-1 + SLM) (#126) (a0fcf90)
- security_guard: V2-J-2 — opt-in auto-Block escalation + manual test runner (#127) (ef60362)
- trace: env-var-gated diagnostic logging at proxy boundaries (#90) (c11128d)
- csiu: translate printable ASCII + drop modified VT-CSI (Windsurf integrated terminal) (#124) (e2b7881)
- doctor: capture DEBUG trap in outer scope (function-local hides it) (#98) (f29d58f)
- e2e: make delete_history_match_after_uparrow deterministic (#24) (e2ce456)
- keymap: csiUToLegacy drops release/repeat events (vim doubles) (#129) (c8e414a)
- line_state,proxy: Left arrow no longer 'deletes' chars via ghost overlay (#73) (d675c01)
- line_state: ghost over-paint after Arrow-Up — Ctrl-A + cursor-motion CSI handling (#122) (ebf7fac)
- line_state: syncFromCapture preserves cursor_pos on unchanged buffer (#128) (7177491)
- llm: chat close cursor + idle-state shortcut discoverability (#78) (6044c4e)
- llm: decode \uXXXX JSON escapes (was silently dropping shell metas) (4c4cb86)
- llm: decode JSON unicode escapes — shell metas no longer dropped (#91) (4c4cb86)
- llm: inline-chat paint CUP-restores cursor to shell row (#79) (a7fbc74)
- llm: kitty kbd Alt bindings + configurable Enter trigger (#40) (f79a1bf)
- llm: move default_bindings INSIDE configure() — Alt+* keys were dead (#72) (c29077e)
- llm: overlay layout robustness + rebind Alt+C→inline / Alt+Shift+C→overlay (#63) (d8811e7)
- llm: surface DIALOG/AUTO mode hint whenever state machine engaged (#92) (ce0dfc3)
- osc133: treat ;A as prompt-active so partial emitters get ghost text (#17) (6e5abe7)
- proxy: gate ghost_accept on !cursor_moved so mid-line Right doesn't paste history (#97) (4e74b38)
- proxy: reactivate statusbar when LLM chat overlay closes (#96) (7d62a4c)
- proxy: refuse non-TTY stdio and harden SIGPIPE handling (#51) (9183deb)
- proxy: scroll shell content up when inline panel grows past cursor (#103) (c2774a8)
- proxy: suspend statusbar and give app full rows on alt-screen entry (#14) (74cc7f4)
- extract tests to sibling files across the codebase (#82) (6010ed2)
- guardrail: split Match union + match helpers into submodule folder (#31) (aa1faae)
- history: split pure format helpers into submodule folder (#25) (d692dfc)
- keymap: split into submodule folder (#22) (79c498b)
- llm-tests: split the bundled tests file along the new sibling boundaries (#87) (9702d65)
- llm: extract 1700 lines of inline tests to a sibling tests file (#81) (458f21f)
- llm: extract 1700 lines of inline tests to llm/tests.zig (458f21f)
- llm: extract Config struct into llm/types.zig (#32) (49b2d2c)
- llm: extract dialog teardown helpers (dialogReset + abortDialog) (#55) (a1b34dc)
- llm: extract dialog types + pure helpers to llm/dialog.zig (#42) (2b00ddf)
- llm: extract env-var resolution helpers to llm/env.zig (#49) (a0830fb)
- llm: extract hooks + dialog state machine to a sibling factory (#86) (e29a802)
- llm: extract paint surface to a sibling factory module (#83) (011c39b)
- llm: extract turn ring + capture + latch helpers (#52) (567e675)
- llm: extract worker thread + HTTP RPC + extract helpers to llm/worker.zig (#43) (99b7308)
- llm: heap-promote captured_output + last_assistant_json off Runtime (#35) (14ccaa3)
- llm: split pure parse helpers into submodule folder (#28) (9b583d3)
- proxy: split pure I/O helpers into submodule folder (#30) (e0a928e)
- subprocess: split into submodule folder (#23) (a1823ae)
- reflect recently-shipped features (4d1c938)
- reflect recently-shipped features (#65-#70) (#71) (4d1c938)
- refresh for Alt bindings + enter_action + atty doctor (#41) (6af52ae)
- refresh for kitty Alt bindings + enter_action + atty doctor (6af52ae)
- roadmap: defer PR M (atuin submodule split) (5941f63)
- roadmap: mark #21 merged + add PR P (fix surviving e2e flake) (ccf1597)
- roadmap: mark PR #26 (line-state author) merged (fd1deb9)
- roadmap: mark PR #33 (guardrail rules.zig + extra_rules) merged (55c5d01)
- roadmap: mark PR #36 (osc133 edge offset) merged (d6ed008)
- roadmap: mark PR #37 (auto-exec) merged (4e455f5)
- roadmap: mark PRs #27 / #28 / #29 / #30 merged (ae38de6)
- roadmap: mark PRs #31 + #32 merged; defer remaining refactor slices (ee6b0d0)
- roadmap: mark PRs #34 (Esc) + #35 (heap-promote) merged (5af2cec)
- rough outlines for chat-overlay phase 2 + security guard (#54) (f49a415)
- security_guard: mark V1+V2-A+V2-D shipped; sequence V2-B/C/E (#107) (206f51c)
- security_guard: surface module + atty-guard in CLAUDE + modules docs (#111) (ed82289)
- security_guard: V1+V2-A+V2-D shipped; mark next steps (206f51c)
- security: three-component architecture (PTY + eBPF + SLM daemon) (#75) (2c4214c)
- surface security_guard module + atty-guard sidecar in CLAUDE.md / modules.md (ed82289)
- surface V2-J-2 auto-Block + atty-side REFUSED path (#130) (7c1b570)
- widen home-page column — no TOC sidebar to share width with (1935732)
- widen home-page column to match doc-page total width (#13) (1935732)
0.4.0 (2026-05-13)
- cli:
atty init [shell]prints shell-integration snippet for eval (044c6e5) - llm: #: prompt → LLM command generation, async via worker thread (9446414)
- llm: inject configurable env vars as model context (79308c7)
- llm: live signals while typing
#: …prefix (cursor + statusbar) + push prompts to history (a62631b) - llm: one-line explanation alongside the injected command (3b2418b)
- llm: support a static
api_basein config — no env required (47bc039) - llm: transparent failure — surface every "nothing happened" reason as a hint (56d9eab)
- phase 2 — LLM module + statusbar hint/error slots + atty init (7ddd8f2)
- proxy: sync line_state with OSC 133 capture (Arrow Up + completion + paste) (e8095c5)
- statusbar: add hint row above status text (78398ae)
- statusbar: blank padding row between hint and status + dedicated hint_style (a029acb)
- statusbar: errors render as muted-red notifications in their own slot (4c80c9b)
- address copilot review round 1 on PR #5 (0816613)
- address copilot review round 2 on PR #5 (aaa9e12)
- address copilot review round 2 on PR #7 — capture UTF-8 bytes in OSC 133 input (3f51566)
- address copilot review round 3 on PR #5 (9a85d09)
- address copilot review round 4 on PR #5 — stale comments on statusbar constructors (591b801)
- address copilot review round 5 on PR #5 (159fb8d)
- address copilot review round 6 on PR #5 (f358726)
- address copilot review round 7 on PR #5 — stale comments after earlier rounds (56144e5)
- build: make test / itest / e2e forward TARGET; Linux defaults to musl (b607d5c)
- cli:
atty init— drop ATTY export, pass shell through, add OSC 133 (f8853e1) - dispatch: isolate per-module errors in delete-history fan-out (ea61e59)
- dispatch: isolate per-module errors in delete-history fan-out (954c791)
- llm: address copilot review round 2 (09110dc)
- llm: address copilot review round 3 — tolerate whitespace in
"content":key (688a557) - llm: address copilot review round 4 — strip C1 control codepoints (security) (58a0708)
- llm: address copilot review round 5 — non-blocking shutdown + URL slash normalisation (da9b120)
- llm: address copilot review round 6 — normalise LLM_API_BASE trailing slash too (7141c30)
- llm: bound \uXXXX skip in extractCommand; expand escape tests to cover \f and malformed \u (99094b9)
- llm: copilot review round 1 — stale-response guard + security strip + body cap (d63fb0d)
- llm: dead in_flight_notified field, misleading timeout_ms doc, escape-handler bug in extractCommand (48007dd)
- llm: drop io arg from std.http.Client.deinit (zig 0.16 API drift) (1da54a2)
- llm: use usize for hex-skip counter; clarify \u test comment (9ef15c5)
- proxy: byte-stream CSI-u translation in hidden-input fast path (abdeda1)
- proxy: errno-gated write retry — don't spin on unrecoverable errors (45471ac)
- proxy: redact hidden input — short-circuit input pipeline while ECHO is off (a984322)
- proxy: redact password input — don't track keystrokes while ECHO is off (ea412d2)
- proxy: refine hidden-input gate so interactive shells stop tripping CSI-u redaction (a7b387b)
- proxy: refine hidden-input gate to ICANON && !ECHO — restore CSI-u translation in interactive shells (08e8fe2)
- proxy: translate CSI-u inside the hidden-input fast path (99f5f93)
- proxy: treat EAGAIN as error.WriteFailed in writeFully (6281c62)
- phase-2 surface (LLM module, new hooks, statusbar slots, floating TOC) (bb8090a)
- sidebar TOC with scroll-spy — keep 78ch content width (996f938)
- sidebar TOC with scroll-spy — keep 78ch content width, add TOC to architecture + providers (c8439d1)
0.3.0 (2026-05-13)
- atuin: delete_scope config — default .exact via fuzzy + ^…$ anchors (166e534)
- atuin: provideGhostList + src/modules/_lib.zig shared helpers (ad53afa)
- atuin: record on Enter + manual sync via CLI (b615bba)
- config: accept-ghost takes a list of keys + recover from uncertain (2c00a82)
- e2e: per-scenario config + ghost_accept + statusbar_visible scenarios (91245c2)
- get.sh: symlink installed binary to source build dir (ccde793)
- ghost: configurable overlay style via atty.ghost.Style (43bf695)
- ghost: multi-row pick list — provideGhostList + Ctrl+1..9 / Esc+1..9 (774b71e)
- guardrail: per-rule .mode — confirm / confirm_once / block / silent_block (a690d18)
- history: add shell-native history module (32f8eed)
- history: Ctrl+Shift+D deletes matching line, status bar flashes (5cb85e6)
- history: shell-native history module (6f0e816)
- incognito: Ctrl+Shift+I toggle + kitty kbd + status bar segment (795170c)
- incognito: muted-red style for the 🔒 segment (d9d53f6)
- input-tracking: DSR + 1-row grid emulator to recover line state from shell redraws (3185e53)
- keymap: Ctrl+Tab also accepts the ghost suggestion (db435f6)
- make: add link/unlink targets for live dev binary (94fe9c6)
- osc133: auto-detected marker support, falls back to keystroke tracking (9bc9e3b)
- statusbar: DECSTBM-reserved bottom row + module statusText hook (4003649)
- test: add e2e framework with VT grid and visual snapshots (f2f49b9)
- atuin: implement deleteHistoryMatch — Ctrl+Shift+D now reaches atuin too (b210d37)
- atuin: newest match first, async sync, right-arrow accepts ghost (fcaecda)
- atuin: suggestion_ttl_ms = 0 disables the timer; new default (1341b42)
- ghost_accept: gather fresh suggestion, don't require ghost.visible (6ed10c1)
- ghost_list: dynamic activation, atuin-Ctrl+R style — no permanent dead space (c1cdefb)
- ghost_list: inflate statusbar reservation so shell pushes prompt above the list (fe6d19e)
- ghost_list: paint with absolute CUP, anchored to bottom rows (c56aee2)
- ghost: drop input-path renderGhost — was racing the shell echo (eff5aa1)
- guardrail: banner never fired end-to-end + dispatchLineCommit ran past .swallow (e72586a)
- incognito: three real bugs from manual testing (d7bd349)
- input-tracking: three race-condition fixes after live-test off-by-one (77a127b)
- kitty: re-enable disambiguate flag + intercept unmapped CSI-u (e8d304b)
- kitty: translate CSI-u back to legacy bytes for Ctrl+letter, Esc, Tab, … (90c4e5d)
- statusbar: activate parks cursor at (1,1), not in reserved area (1808fbb)
- statusbar: clear screen on activate for consistent fresh start (accc89d)
- config: every subsystem is a struct (style guide commitment) (74ae7af)
- config: generalise key bindings as { bytes, action } pairs (6ac581b)
- config: group statusbar fields into atty.StatusBar struct (d0d0f15)
- config: split user config from defaults (dwm-style) (734da31)
- defaults: swap atuin → history in the default tuple (18be9bc)
- ghost_list: sweep dead anchor/RenderMode plumbing + docs (425bbbd)
- keymap: extract keymap.match() + tests, use from proxy (f8926fb)
- main: extract args.zig parser + tests (7 cases) (8037b1e)
- proxy: extract status_text.zig — pure segment assembly + tests (98c02db)
- proxy: hoist keymap import + name kitty kbd push/pop bytes (0e416a4)
- style: promote Style to a first-class atty.Style with presets (d2898f7)
- add CLAUDE.md for fresh-agent orientation (86d5f28)
- clarify gatherGhostText priority + atuin/history race window (8347363)
- keymap, atuin record/sync, onLineCommit, e2e (247a4f1)
- osc133: document the marker integration in architecture.md (2e72d32)
- refresh Zig version references to 0.16 (7aef0df)
0.2.0 (2026-05-13)
- atuin: delete_scope config — default .exact via fuzzy + ^…$ anchors (166e534)
- atuin: provideGhostList + src/modules/_lib.zig shared helpers (ad53afa)
- atuin: record on Enter + manual sync via CLI (b615bba)
- config: accept-ghost takes a list of keys + recover from uncertain (2c00a82)
- e2e: per-scenario config + ghost_accept + statusbar_visible scenarios (91245c2)
- get.sh: symlink installed binary to source build dir (ccde793)
- ghost: configurable overlay style via atty.ghost.Style (43bf695)
- ghost: multi-row pick list — provideGhostList + Ctrl+1..9 / Esc+1..9 (774b71e)
- guardrail: per-rule .mode — confirm / confirm_once / block / silent_block (a690d18)
- history: add shell-native history module (32f8eed)
- history: Ctrl+Shift+D deletes matching line, status bar flashes (5cb85e6)
- history: shell-native history module (6f0e816)
- incognito: Ctrl+Shift+I toggle + kitty kbd + status bar segment (795170c)
- incognito: muted-red style for the 🔒 segment (d9d53f6)
- input-tracking: DSR + 1-row grid emulator to recover line state from shell redraws (3185e53)
- keymap: Ctrl+Tab also accepts the ghost suggestion (db435f6)
- make: add link/unlink targets for live dev binary (94fe9c6)
- osc133: auto-detected marker support, falls back to keystroke tracking (9bc9e3b)
- statusbar: DECSTBM-reserved bottom row + module statusText hook (4003649)
- test: add e2e framework with VT grid and visual snapshots (f2f49b9)
- atuin: implement deleteHistoryMatch — Ctrl+Shift+D now reaches atuin too (b210d37)
- atuin: newest match first, async sync, right-arrow accepts ghost (fcaecda)
- atuin: suggestion_ttl_ms = 0 disables the timer; new default (1341b42)
- ghost_accept: gather fresh suggestion, don't require ghost.visible (6ed10c1)
- ghost_list: dynamic activation, atuin-Ctrl+R style — no permanent dead space (c1cdefb)
- ghost_list: inflate statusbar reservation so shell pushes prompt above the list (fe6d19e)
- ghost_list: paint with absolute CUP, anchored to bottom rows (c56aee2)
- ghost: drop input-path renderGhost — was racing the shell echo (eff5aa1)
- guardrail: banner never fired end-to-end + dispatchLineCommit ran past .swallow (e72586a)
- incognito: three real bugs from manual testing (d7bd349)
- input-tracking: three race-condition fixes after live-test off-by-one (77a127b)
- kitty: re-enable disambiguate flag + intercept unmapped CSI-u (e8d304b)
- kitty: translate CSI-u back to legacy bytes for Ctrl+letter, Esc, Tab, … (90c4e5d)
- statusbar: activate parks cursor at (1,1), not in reserved area (1808fbb)
- statusbar: clear screen on activate for consistent fresh start (accc89d)
- config: every subsystem is a struct (style guide commitment) (74ae7af)
- config: generalise key bindings as { bytes, action } pairs (6ac581b)
- config: group statusbar fields into atty.StatusBar struct (d0d0f15)
- config: split user config from defaults (dwm-style) (734da31)
- defaults: swap atuin → history in the default tuple (18be9bc)
- ghost_list: sweep dead anchor/RenderMode plumbing + docs (425bbbd)
- keymap: extract keymap.match() + tests, use from proxy (f8926fb)
- main: extract args.zig parser + tests (7 cases) (8037b1e)
- proxy: extract status_text.zig — pure segment assembly + tests (98c02db)
- proxy: hoist keymap import + name kitty kbd push/pop bytes (0e416a4)
- style: promote Style to a first-class atty.Style with presets (d2898f7)
- add CLAUDE.md for fresh-agent orientation (86d5f28)
- clarify gatherGhostText priority + atuin/history race window (8347363)
- keymap, atuin record/sync, onLineCommit, e2e (247a4f1)
- osc133: document the marker integration in architecture.md (2e72d32)
- refresh Zig version references to 0.16 (7aef0df)
Initial public scaffold.
- PTY proxy with low-level POSIX setup (
posix_openpt/grantpt/unlockpt), termios raw-mode RAII guard, SIGWINCH/SIGCHLD propagation via self-pipe. - Comptime-composed module framework (
Dispatcher(modules)) withonInput/onOutput/provideGhostText/onTickhooks. Missing hooks are statically eliminated from the binary via@hasDecl. - Atuin module: async worker thread + one-slot mailbox; subprocess
backend via
atuin search; socket backend stub; TTL-driven suggestion expiry. - Guardrail module: substring/prefix rule engine; swallow-on-Enter
- confirm-on-Enter UX; configurable rule list.
- Ghost-text overlay state machine (DECSC/DECRC + dim/italic SGR), with idempotent re-render to avoid flicker under tick refresh.
- Best-effort line-state tracking with
uncertainflag for unmodelled input sequences. - Single-file
src/config.zigis the Suckless-style user-editable config.-Dconfig=pathflag (ormake CONFIG=…) for out-of-tree configs.
- README + GitHub Pages site at https://atty.sh with terminal-aesthetic Jekyll layout.
docs/architecture.md,docs/modules.md,docs/providers.md.
build.zigwithrun,test,itesttargets;-Doptimize/-Dtarget/-Dconfig.- Multi-stage
Dockerfile(Debian builder → minimal runtime). Makefilefor the developer UX (build,test,install,docker,docker-binary).scripts/install.shone-shot Docker →./dist/atty.
ci.yml:zig fmt --check, build, unit + integration tests, end-to-end smoke, docker-builder smoke, binary artifact upload.pages.yml: Jekyll → GitHub Pages on push to main.