Changelog
The changelog below is included from the repository root CHANGELOG.md.
Changelog
All notable changes to this project will be documented in this file.
[0.12.1] - 2026-05-28 [Changes][v0.12.1]
Documentation
- mdBook manual and GitHub Pages workflow (@srothgan): Add a repo-native manual and Pages deployment workflow.
Fixes
- CLI help examples (@srothgan): Remove the invalid installed-binary
--features perfexample.
[0.12.0] - 2026-05-21 Changes
Features
- Inline terminal chat runtime (#165, @srothgan): Replace the full-screen chat surface with inline terminal-owned rendering.
- Resolved action-based keymap (#166, @srothgan): Route shortcuts through semantic actions and generate help from the resolved keymap.
- macOS modifier key support (#159, @TomasWeisss): Support Command-key shortcuts in terminal modes.
Fixes
- Inline rendering stability (#165, @srothgan): Stabilize resume, resize, fullscreen return, slash notices, and active-turn state on the inline path.
- Tool-call and diff rendering (#152, #165, #166, @srothgan): Preserve diff indentation, show compact change counts, uncap plan markdown, and keep concrete tool output.
- Agent SDK bridge events (#165, @srothgan): Suppress
ToolSearchevents, protect the packaged bridge runtime, and accept fractional API retry delays.
UI
- Composer hints and Help tab (#165, #166, @srothgan): Move autocomplete into compact composer rows and Help into fullscreen config.
- Compact inline tools and todos (#165, @srothgan): Render todos inline and tighten standard tool body caps.
Documentation
- README billing and commands cleanup (#165, @srothgan): Document Agent SDK billing changes, custom slash commands, and remove the outdated Architecture section.
CI and Dependencies
- Agent SDK 0.3.146 refresh (#165, @srothgan): Update the Agent SDK bridge dependencies and package locks.
- Rust dependency updates (#151, #154, #155, #156, #157, #158, #160, #161, #162, #163, #164): Bump Rust dependencies and clarify the
randaudit ignore. - rustls-webpki advisory fix (#153): Bump
rustls-webpkito0.103.13forRUSTSEC-2026-0104.
[0.11.3] - 2026-04-19 Changes
Fixes
- Plan approval Ctrl shortcuts (@srothgan): Replace plain
y/nexit-plan approvals withCtrl+y/Ctrl+n.
[0.11.2] - 2026-04-19 Changes
Features
- Project-local Opus version controls (#146, @srothgan): Add
/opus-versionto pin the Opus alias per project.
Fixes
- Model alias cleanup and Opus naming (#146, @srothgan): Replace
Defaultwith the explicitopusalias and normalize dated Opus labels. - Dev versus installed bridge resolution (#146, @srothgan): Make
cargo runuse the repo bridge and installed builds use the bundled bridge. - Tool-call diff rendering and scrollbar lane (#138, @srothgan): Reserve a dedicated scrollbar column and keep diff content out of it.
- Versioned short model names (#139, @srothgan): Show resolved model versions in short model names.
- Bridge script resolution precedence (#142, @srothgan): Prefer the bundled bridge script and keep repo-local fallback debug-only.
- Update notice warning message (#143, @srothgan): Move upgrade hints from the footer into a warning system message.
- Terminal ANSI output rendering (#144, @srothgan): Preserve command-emitted ANSI colors in terminal tool output.
- Draft-focused inline prompts (#145, @srothgan): Keep pending prompts from stealing draft focus and move prompt handoff to
Tab.
CI and Dependencies
- Agent SDK 0.2.112 refresh (#141, @shyal): Bump
@anthropic-ai/claude-agent-sdkto0.2.112, updateEXPECTED_AGENT_SDK_VERSION, and refresh4.7fixtures.
[0.11.1] - 2026-04-16 Changes
Features
- Folder-local 1M context controls (@srothgan): Add
/1m-context enable|disable|statusto persistCLAUDE_CODE_DISABLE_1M_CONTEXTin.claude/settings.local.json, preserve neighboring local env keys, surface status, and point 1M-context recovery guidance at the new folder-local fallback
[0.11.0] - 2026-04-16 Changes
Features
- Agent SDK 0.2.104 migration (#135, @srothgan): Upgrade the bundled Claude Agent SDK from
0.2.74to0.2.104across the published package and local bridge; extend the Rust and TypeScript wire contract for current-model snapshots, runtime session state, API retry updates, settings parse errors, terminal reasons, task metadata, prompt suggestions, and refreshed tool metadata - Live session capability synchronization (#135, @srothgan): Reconcile current model and permission-mode support against the active SDK session instead of assuming startup-time state, and keep session/runtime status aligned through connect, resume, and turn lifecycle changes
- Task patch updates and subagent grouping (#135, @srothgan): Propagate incremental task patches and parent tool linkage so subagent child tool calls collapse under their root task while still surfacing focused hidden permission prompts when user input is required
- Welcome session snapshot and rotating tips (#135, @srothgan): Replace the welcome model badge with a lightweight snapshot showing version, subscription, cwd, and session ID, and rotate curated startup tips across sessions
- Backgrounded tool state badges (#135, @srothgan): Surface assistant-backgrounded Bash commands and backgrounded task state directly in tool cards and summaries
Fixes
- Resume ordering and runtime stability (#135, @srothgan): Preserve resumed history turn ordering and tighten turn/session state handling so reconnects, tool updates, and completion events stay consistent
- External API provider auth handling (#135, @srothgan): Respect external API providers during auth validation instead of assuming the bundled Claude auth path
- Permission and tool-result rendering cleanup (#135, @srothgan): Normalize SDK permission display and tool-result metadata, hide redundant permission headers, and treat killed tool calls as terminal failures in transcript rendering
- Ctrl+V paste path split (#135, @srothgan): Make
Ctrl+Vexclusively trigger image paste while keeping normal text paste on the standard input path - Collapsed in-progress subagent summaries (#135, @srothgan): Show substantially more context in collapsed in-progress subagent cards without expanding completed tool calls
Documentation
- Startup limitation note (#135, @srothgan): Document the current end-to-end startup latency constraint from the upstream Claude Agent SDK runtime in
README.md
CI and Dependencies
- Bump
@anthropic-ai/claude-agent-sdkfrom0.2.74to0.2.104in both the published package and bundled bridge (#135, @srothgan) - Add dedicated
agent-sdkCI foraudit,lint, andknip, and gate audit failures on direct dependency advisories only (#135, @srothgan) - Add
@anthropic-ai/sdk0.81.0,@biomejs/biome2.4.12, andknip6.4.1 to the bundled bridge toolchain (#135, @srothgan)
[0.10.0] - 2026-04-11 Changes
Features
- Clipboard image pasting (#104, @shyal): Paste images with
Ctrl+V, send them as PNG image blocks, and render renumbered inline[Image #N]badges in the draft - Live git branch tracking (#114, @srothgan): Replace
git branch --show-currentshell-outs with in-process HEAD parsing and a filesystem watcher so the footer updates while the app stays focused - Terminal tab activity indicator (#115, @srothgan): Drive the OSC 2 tab title from app state with active and idle indicators and restore the plain cwd title on shutdown
- Resume subcommand and startup picker (#116, @srothgan): Replace the
--resumeflag withclaude-rs resume, add a dedicated startup picker, and cap it to recent project sessions - App-owned file index with live updates (#117, @srothgan): Move
@mention search to a shared file index with scan streaming, prewarm, and incremental watcher updates across cwd and gitignore changes
Fixes
- Inline turn-scoped limit notices (#118, @srothgan): Dedup rate-limit and plan-limit notices inside the active assistant turn instead of appending duplicate trailing system rows
- Rename watcher convergence (#120, @srothgan): Re-scan parent subtrees on file-index rename events, handle root-level renames, and refresh the yanked
unicode-segmentationlockfile entry
Performance
- Structured logging and render-path optimization (#119, @srothgan): Standardize Rust and Agent SDK diagnostics, switch to JSON rolling logs, and cut chat hot-path cost with assembled render caching and cheaper spinner frames
Documentation
- Legal notice expansion (#113, @srothgan): Clarify the project’s relationship to Claude Code, the Agent SDK, Anthropic terms, and the recent source leak
CI and Dependencies
- Bump
uuidfrom 1.22.0 to 1.23.0 (#106, @dependabot) - Bump
notify-rustfrom 4.12.0 to 4.13.1 (#109, @dependabot) - Bump
similarfrom 2.7.0 to 3.0.0 (#110, @dependabot) - Bump
tokiofrom 1.50.0 to 1.51.0 (#111, @dependabot)
Project
- Collaboration template cleanup (#121, @srothgan): Simplify PR and issue templates, collapse
CODEOWNERS, and alignCONTRIBUTING.mdwith the current workflow
[0.9.0] - 2026-03-26 Changes
Features
- Two-line footer replaces header (#102): Remove the header and consolidate location, branch, mode badges, permission counts, and MCP auth hints into a two-row adaptive footer
Fixes
- Unified viewport geometry handling (#101): Single geometry entry point with separate width/height semantics and tail invalidation on topology changes
- Centralized geometry state and wrapped panel measurement (#101): Immediate resize geometry refresh and wrapped-text measurement replacing fixed-height panel assumptions
- Topology invalidation and batch message dirtiness (#101): Tracked insert/remove/clear paths own tool index and terminal ref repair
- Active turn ownership across history pruning (#101): Keep active assistant turn out of retention drop candidates and remap ownership after pruning
- Scroll anchor preservation (#101): Delay anchor restore until heights are exact and preserve anchors across pruning and marker operations
- Unified message layout model (#101): Shared
MessageLayoutreplaces split role-specific render/measure branches - Turn cleanup normalization (#101): Single cleanup boundary for resume, cancel, auth-required, connection-failure, and fatal exits
- Chat focus ownership (#101): Rebuild focus from surviving state on transitions and render selected prompt choices in rust orange
- Streaming invalidation and selection snapshots (#101): Refresh selection snapshots on redraw and protect active streaming assistant in cache budgeting
- Session state reset at authority boundaries (#101): Scope async responses to the active session epoch and discard stale results
- Persisted authority reconciliation (#101): Rederive trust state from current cwd on reconnect and clear stale session identity on failure boundaries
- Tool index rebuilds and multi-index sync (#101): Gate scope updates on successful lookup and normalize interaction queues to prevent stale prompt drops
- Display-width-aware copy (#101): Slice copied text by display columns so emoji, CJK, and combining marks match visual selection
- Esc cancel and queued submit lifecycle (#101): Clear deferred submit on Esc and let manual cancel override auto-resubmit
Performance
- Offscreen row skip and wrapped-height culling (#101): Render from the first visible message’s structural offset and use exact wrapped row coverage for culling
[0.8.4] - 2026-03-23 Changes
Fixes
- Chat bottom-height drift: Stop rendering and measuring the trailing separator row after the final chat message so auto-scroll no longer lands on a persistent empty line beneath the last Claude response; add regression tests for last-message rendering and height measurement
[0.8.3] - 2026-03-23 Changes
Performance
- Unified layout invalidation and progressive remeasure (#98): Replace the
dirty_fromsuffix watermark with per-message staleness tracking, separated prefix-sum dirtiness, and a visible-first remeasure plan; preserve scroll anchors across in-flight resize and global remeasure replacement; single-message updates do exact changed-message remeasure plus targeted prefix repair instead of invalidating the entire suffix - Incremental history retention accounting (#98): Cache per-message retained-byte estimates and maintain a rolling total so retention enforcement stops rescanning the full message list every cycle; cache tool
raw_inputbyte estimates to avoid repeated JSON serialization in hot paths - Incremental render cache budget (#98): Replace per-frame full cache budget scans with incremental slot metadata, rolling byte totals, and a pre-sorted eviction set rebuilt only when over budget
- Derive tool collapse state at render time (#98): Remove per-tool
collapsedfield;tools_collapsedis the session-level source of truth read at render time so Ctrl+O no longer walks and mutates every tool-call block - Index terminal tool-call refs (#98): Replace linear duplicate checks on terminal subscriptions with a
HashSetmembership index; route attach, detach, and rebuild through shared tracking helpers
Dependencies
- Bump
aws-lc-sysfrom 0.38.0 to 0.39.0 andaws-lc-rsfrom 1.16.1 to 1.16.2 (fixes RUSTSEC-2026-0044, RUSTSEC-2026-0048) - Bump
rustls-webpkifrom 0.103.9 to 0.103.10 (fixes RUSTSEC-2026-0049) - Bump
pulldown-cmarkfrom 0.13.1 to 0.13.3 (#97)
[0.8.2] - 2026-03-18 Changes
Fixes
- Startup service status handling: Keep startup Claude service warnings and errors as transcript messages only; status errors no longer clear the draft or block users from trying a request during partial or uneven outages
[0.8.1] - 2026-03-18 Changes
Fixes
- Startup session settings propagation: Pass configured
modelanddefaultPermissionModethrough the SDK’s top-level session startup options so new sessions start with the expected live model and permission mode instead of falling back to provisional defaults - Welcome banner model sync: Keep the welcome banner and header aligned through
Connecting..., provisionaldefault, and the first authoritative model update; freeze the welcome banner once the session model is resolved while allowing the header to continue tracking live model changes - Claude status relevance filtering: Query the status summary endpoint and only surface startup warnings for
Claude CodeandClaude API, avoiding false-positive outage banners caused by unrelated Anthropic components - Config cleanup: Remove obsolete MCP callback overlay code and stale config UI expectations left behind by the MCP management changes
[0.8.0] - 2026-03-17 Changes
Features
- Agent SDK 0.2.74 migration (#83): Upgrade from SDK 0.2.63 to 0.2.74; inline session settings replace per-flag overrides; agent progress summaries rendered in task tool-call bodies; model capability badges (adaptive thinking, fast mode, auto mode) shown in settings overlay
- AskUserQuestion support (#83): Dedicated question/response bridge path with horizontal and vertical option layouts; multi-select state tracking; inline annotation editing; question progress indicator; shared focus cycling infrastructure with permissions
- MCP management tab (#89): Live MCP server list with connection status indicators and tool counts;
/mcpslash command; server detail overlay with context-aware actions (reconnect, toggle, authenticate, clear auth); OAuth authentication flow with browser launch and manual callback URL entry; elicitation support for URL-based and form-based modes; stale status revalidation with 30-second cooldown auto-reconnect - Usage tab with quota visualization (#88, closes #87): Dual-source fetching (OAuth API first, CLI fallback); gauge bars with color-coded utilization (green/yellow/red); 5-hour, 7-day, and per-model quota windows; extra credits panel;
/usageslash command andrmanual refresh; 30-second TTL caching; OAuth credential expiry validation - Plugin management (#85): Three-section Plugins tab (Installed, Marketplace, Marketplace Sources) with CLI-backed operations; install/enable/disable/update/uninstall actions via overlay dialogs; marketplace source add/remove with text input; MCP capability badges;
/pluginsslash command; 5-second inventory cache with background refresh - Status tab and /status command (#80): Session, account, model, and settings information display; lazy account snapshot fetching via SDK; login method labels (Claude Max, API key variants); session name resolution with custom title/summary/prompt fallback chain; memory path and active setting sources display
- Unified syntax highlighting (#84): Replace
ansi-to-tuiwithsyntectfor theme-aware coloring across shell commands, code blocks, and terminal output; ANSI escape stripping state machine; automatic raw unified diff detection and semantic coloring; language-aware code highlighting with extension-based syntax detection - Session management enhancements (#83): Repository-scoped session discovery with worktree inclusion; session rename and AI-generated title actions in Status tab; text overlay for rename input with immediate visual feedback
- Tool output metadata (#83): Structured metadata for Bash (assistant-backgrounded badge, token-saver state), ExitPlanMode (ultraplan badge), TodoWrite (verification-needed badge), and Write/Edit (git repository labels in diff headers); MCP resource content typing with URI, MIME type, and blob saved-path hints
Fixes
- Paste-handled Enter suppression (#83): Treat paste-handled Enter as fully consumed in key dispatch; prevent suppressed paste newlines from falling through to non-char cleanup; restores inline multiline paste insertion for sub-1000 character payloads
- Bell notification fallback (#83): Restore bell alongside desktop notifications on terminals without OSC 9 support; keep auto notification routing aligned with pre-settings behavior
UI
- Config tab activation helper (#88): Centralized
activate_tabfunction for consistent tab-switch behavior across/plugins,/status,/usage,/mcp, and keyboard navigation - Shared text input widget (#85): Reusable
text_input_line()andrender_text_input_field()components used by Language, Session Rename, and Add Marketplace overlays - Setting stepping (#85): Left/Right arrow editing for enum settings (Theme, Notifications, EditorMode, DefaultPermissionMode) in config view
Performance
- Progressive resize height recomputation (#90): Replace synchronous full-remeasure on terminal width change with frame-budgeted progressive convergence; scroll anchor preservation across resize; per-message exactness tracking with expanding measurement frontiers around the visible window; measurement budget of max(12, viewport_height) messages and max(256, viewport_height * 8) wrapped lines per frame
- Background file walker for mentions (#81): Replace synchronous BFS with
ignorecrateWalkBuilderon a background thread; query refinement refilters from cache instead of restarting the walk; pre-computed lowercase path variants eliminate per-sort allocation; bounded channel (1024 entries) with 500-entry drain budget per tick - Input redraw and cache optimization (#82): Split input versioning into cursor-only and content epochs; syntax highlighting and height measurement caches keyed on content version; key handlers return visibility signals to suppress redraws for non-visual events; Windows paste burst jitter tolerance in pending confirmation window
- Background bash terminal detachment (#86): Detach terminal references when Bash tools reach completed or failed state; skip polling for non-running tools; prevent late bridge progress updates from reopening finalized tools; clear execute terminal references during forced tool finalization
- Dev/test profile tuning (#83): Line-tables-only debug info and disabled incremental builds for faster compilation
Licensing
- Apache-2.0: Switch project license from AGPL-3.0-or-later to Apache-2.0; SPDX single-line identifiers replace full header blocks across all source files
CI and Dependencies
- Bump
@anthropic-ai/claude-agent-sdkfrom 0.2.63 to 0.2.74 (#83) - Replace
ansi-to-tuiwithsyntect5.3.0 (#84) - Bump
tui-textarea-2from 0.10.1 to 0.10.2 (#82) - Add version comparison to release dry-run workflow to skip unchanged versions (#82)
[0.7.1] - 2026-03-12 Changes
Fixes
- npm rollback for installs and releases: Revert active package manager guidance, package scripts, and GitHub release workflows from
pnpmback tonpm; runtime reinstall guidance now recommendsnpm install -g - Leading blank row before Claude text: Trim leading rendered blank rows before the first visible assistant text block while preserving paragraph spacing for later content
- Deferred Enter submit stability: Plain
Enternow snapshots and restores the exact draft instead of mutating the input before submit, fixing hidden newline leaks when the cursor is in the middle of the text
[0.7.0] - 2026-03-12 Changes
Features
- Native
/loginand/logoutcommands (#67): Shell out toclaude auth login/logoutwith TUI suspend/resume; credential verification reads~/.claude/.credentials.jsondirectly; skip redundant operations when already authenticated or not authenticated - User settings system (#74): 14 persisted settings across three JSON files (
~/.claude/settings.json,<project>/.claude/settings.local.json,~/.claude.json); metadata-driven two-column config view with compact narrow-terminal fallback; toggle/cycle/overlay mutation with immediate persistence - Workspace trust (#74): Startup gated on per-project trust acceptance; path normalization for Windows drive letters, UNC paths, and symlinks; trust state persisted in
~/.claude.json - Session launch settings (#74): Saved preferences (model, language, permission mode, thinking mode, effort level) propagate into every new session via
SessionLaunchSettings; available models flowed back from SDK for dynamic UI - Cancel-and-resubmit (#68): Submitting while the agent is running cancels the current turn and auto-resubmits once ready; draft stays visible and editable throughout with cancellation spinner banner
- Desktop and bell notifications (#68, #74):
NotificationManagertracks terminal focus via DECSET 1004; fires bell + OS-native desktop toasts on permission requests and turn completion when unfocused; channel-based delivery (disabled, bell, OSC 9, desktop) driven by user preference - Compaction overhaul (#68):
/compactkeeps chat history and appends a success system message after the turn completes; input and keyboard blocked during compaction; auto-compaction clears silently without a banner - Cache observability (#69):
CacheMetricsaccumulator with rate-limited structured tracing; warn-level alerts for high utilization and eviction spikes with cooldown; integration test suite covering the full stream-to-split-to-measure-to-prefix-sums pipeline - Unified textarea input (#70): Replace snapshot-based input state plus shadow editor with one persistent
TextAreaas source of truth; fixes wrapped visual-row cursor navigation;&subagent autocomplete now eager, matching@and/behavior - Incremental mention search (#74): Replace repeated full rescans with incremental BFS (400 entries/tick budget) and 4-tier ranking;
.gitignoreawareness with global, local, and nested rule support; search threshold lowered from 3 characters to 1
Fixes
- Permission
allow_alwayspersistence (#68, #71): Synthesize persistentaddRulesfallback when the SDK omits suggestions, fixing silent degradation to one-time allow;allow_alwaysfallback now persists tolocalSettings - Paste burst reliability (#71): Reworked burst detection into a timing-based state machine (
Idle/Pending/Buffering) with idle flush; retro-capture cleanup for leaked leading characters; enter suppression during and immediately after paste; CRLF normalized to LF ininsert_str - Bridge
reject_oncematch arm (#68): Added missing match arm that caused spurious warning logs on every permission prompt
UI
- Help panel keyboard navigation (#67): Up/Down scroll and selection for Slash Commands and Subagents tabs; dynamic visible-item computation from wrapped text heights; fixed panel height across tabs; orange highlight for selected item
- Paragraph gap preservation (#74):
TextBlockstate with trailing spacing metadata preserves paragraph gaps in chat rendering - Built-in slash entries (#74):
/config,/login,/logoutappear in slash help and autocomplete - Input blocking during async commands (#67): General
CommandPendingstatus with dynamic spinner text used by/login,/logout,/mode,/model,/new-session,/resume
Performance
- Capacity-based byte accounting (#69): Replace heuristic message sizing with
IncrementalMarkdown::text_capacitymeasurement - Protected-bytes tracking (#69): Non-evictable streaming-tail blocks excluded from eviction targets in render budget enforcement
- Layout invalidation consolidation (#69):
InvalidationLevelenum andinvalidate_layouthelper replace ad-hoc invalidation across event flows
Refactoring
- Codebase split (#68):
ui/tool_call.rs,app/connect.rs,app/slash.rs,app/state.rs,app/events.rssplit into submodule directories (4-9 files each);bridge.tssplit into 8 files underbridge/; all public APIs preserved via re-exports - Usage pipeline removal (#68): Delete entire
usage_updatepipeline (bridge/usage.ts, UsageUpdate types, session/message token tracking, footer cost display) across TypeScript and Rust - Input state unification (#70): Remove rebuild/sync debt from snapshot-based input; route all input reads/writes through accessor + replace flows on a single
TextAreainstance
CI and Dependencies
- Bump
uuidfrom 1.21.0 to 1.22.0 (#72) - Bump
whichfrom 8.0.0 to 8.0.2 (#73) - Switch
tui-textarea-2from local path dependency to crates.io0.10.1(#70) - Switch remaining npm command surfaces to pnpm across workflows, docs, and scripts (#74)
[0.6.0] - 2026-03-03 Changes
Features
- Agent SDK 0.2.63 migration (#64): Upgrade from SDK 0.2.52 to 0.2.63; align bridge, wire types, and session APIs with the new SDK surface
- Fast mode support (#64): Wire fast mode state end-to-end from bridge to TUI; footer badge shows
FASTorFAST:CDduring cooldown; deduplicated state change emission - Rate limit updates (#64): Parse and display rate limit events with readable user-facing summaries including overage and reset timing
- Available agents and subagent autocomplete (#64): Wire
available_agents_updateacross bridge and rust layers;&ersand autocomplete for subagents; new Subagents help tab with two-column layout - Session resume via SDK-native APIs (#64): Replace legacy JSONL parsing with
resume_sessionbacked bylistSessionsandgetSessionMessages; align to SDK session metadata fields - Interactive plan approval (#61): Intercept
ExitPlanModeand render structured Approve/Reject widget with arrow navigation,y/nquick shortcuts, andallowedPromptsdisplay - Write diff capping (#61): Truncate Write tool diffs exceeding 50 lines to head/tail window with omission marker; auto-scroll on oversized writes; plan files exempted
- Startup service status checks (#65): Query status.claude.com during startup; emit warning or error system messages; lock input on outage-level errors
- Subagent thinking indicator (#60): Debounced (1500ms) idle indicator between subagent tool calls to avoid flicker; suppress normal spinner when subagent indicator is active
- System message severity levels (#64): Replace
SystemWarningwithMessageRole::Systemplus Info/Warning/Error severity with matching label colors - Slash command output in transcript (#64): Local slash command results now surface in assistant transcript
Fixes
- Context percentage formula (#61): Exclude
output_tokensfrom context calculation – Anthropic input formula is cache_read + cache_creation + input only; context % now updates as soon asinput_tokensarrive - Stale task scope cleanup (#65): Clear
active_task_idson tool scope reset to prevent subagent misclassification after cancelled tasks - Subagent indicator false positives (#65): Gate thinking indicator on active spinner state to prevent false idle rendering
- SDK rejection sanitization (#65): Harden bridge rejection replacement with exact and known-prefix matching only on failed tool results
- Saturating coordinate math (#65): Use saturating arithmetic for header, input, autocomplete, and todo padding to prevent overflow panics
UI
- Footer module extraction (#61): Move all footer logic into dedicated
src/ui/footer.rs; clean up imports inmod.rs - Autocomplete stabilization (#61): Stable popover width; shift left near right edge; UTF-8-safe case-insensitive highlight ranges
- Help overlay improvements (#64): Add subagents tab; move tab-switch hint into help title; rename footer hint from “Shortcuts + Commands” to “Help”
Refactoring
- Handler decomposition (#61): Split large connection/event/key/slash/message handlers into smaller helpers; remove
clippy::too_many_linessuppressions;FocusContextbuilder-style API
CI and Dependencies
- Bump
actions/upload-artifactfrom 6 to 7 (#62) - Bump
actions/download-artifactfrom 7 to 8 (#63) - Migrate from npm
package-lock.jsonto pnpmpnpm-lock.yamlin agent-sdk (#64)
[0.5.1] - 2026-02-27 Changes
Fixes
- Input smoothness during rapid keys: Restore frame rendering during non-paste active key bursts by narrowing suppression to confirmed paste bursts only; preserves paste placeholder anti-flicker behavior
[0.5.0] - 2026-02-27 Changes
Features
- Paste handling overhaul (#53): Character-count threshold (1000 chars) replaces line-count; placeholder label updated; session identity tracking prevents append across separate pastes; burst finalization scoped to newly pasted range only
- Turn error classification (#54):
TurnErrorstrings matched against known patterns (rate limit, plan limit, max turns, quota, 429); actionable recovery hint pushed as a system message in chat; unclassified errors preserve existing behavior
Fixes
- Typed
AppErrorenum (#54):NodeNotFound,AdapterCrashed,AuthRequired,ConnectionFailed,SessionNotFoundvariants with per-variant exit codes and user-facing messages
Performance
- Unified cache budgeting + LRU history retention (#52): Single cache budget across all message blocks; LRU eviction for long sessions; reduces memory growth on extended conversations
UI
- Footer three-column layout: Update hint and context percentage now render in separate right-aligned columns simultaneously instead of either-or
[0.4.1] - 2026-02-27 Changes
Fixes
- Dynamic bridge log levels (
client.rs): Bridge stderr lines are now routed to the correct tracing level –[sdk error]/panic lines go toerror!,[sdk warn]lines towarn!, and ordinary SDK chatter todebug!– instead of unconditionally emittingerror!for every line - Height cache invalidated on interruption (
events.rs):TurnCompleteandTurnErrornow callmark_message_layout_dirtyon the tail assistant message so the height cache is re-measured after a cancelled or failed turn, fixing stale layout after interruption
[0.4.0] - 2026-02-27 Changes
Features
- Agent SDK migration (#45, closes #23): Replace
@zed-industries/claude-code-acpwith the in-repo Agent SDK bridge; align permission suggestions with SDK session/always-allow scope - Session resume (#46, closes #22):
--resumeis cwd-aware and restores full transcript state; input locked while resuming; recent sessions shown in welcome context - Token and cost tracking (#47, closes #21): Footer shows live
Context: XX%; assistant turns show per-turn(Xk tok / $X.XX); compaction spinner during SDK-reported compaction - Slash command popovers and AskUserQuestion (#48): Variable-input slash commands show dynamic argument popovers; full
AskUserQuestionflow with option rendering and answer propagation
Fixes
- TodoWrite flicker (#45): Ignore transient payloads without a todos array so the list no longer clears and reappears mid-turn
- Failed Bash rendering (#45): Compress failed tool output to a single exit-code summary line instead of the full stderr dump
- Ctrl+C determinism (#46): Copy only when selection is non-empty and clear it after; otherwise quit
- Submission pipeline (#47): Single queue gate for submissions; cancel active turn before dispatching queued action; wait for turn-settle before ready
- Persisted tool-result normalization (#48): Strip leading box-drawing prefixes from tool result summaries
Performance
- Streaming frame cost (#49): Generation-keyed tool call measurement cache with O(1) fast path; terminal output delta-append; skip invalidation for no-op updates
Internal
- Agent SDK bridge modularized into focused modules (
commands.ts,tooling.ts,permissions.ts,usage.ts,history.ts,auth.ts,shared.ts) (#48) - Perf instrumentation markers for key invalidation, measurement, and snapshot paths (#49)
[0.3.0] - 2026-02-25 Changes
Features
- Startup update check (#30): Non-blocking check via GitHub Releases API with 24h cache, footer hint,
Ctrl+Udismiss,--no-update-check/CLAUDE_RUST_NO_UPDATE_CHECK=1opt-out - Shortcuts during connecting (#38): Navigation and help shortcuts work while ACP adapter connects; input keys remain blocked
- Global Ctrl+Q quit (#38): Safe quit available in all states including connecting and error
- Input height API and word wrapping (#40): Adopt tui-textarea-2 v0.10
TextArea::measure()for input sizing, switch toWrapMode::WordOrGlyph, remove customInputWrapCacheplumbing
Fixes
- Height cache recalculation (#39): Track dirty message index and re-measure non-tail messages when content or tool blocks change
- Error state and input locking (#39): Connection and turn failures surface immediately with quit hint; input blocked during connecting/error
- Scroll clamp after permission collapse (#39): Clamp overscroll when content shrinks; ease scroll position for smooth settling; consume Up/Down with single pending permission
- Permission shortcut reliability (#29):
Ctrl+Y/A/Nwork globally while prompts are pending with fallback option matching - Tool-call error rendering (#29): Improved error handling with raw_output fallback and cleaner failed-call display
CI and Dependencies
- Bump
actions/upload-artifact4 to 6,actions/setup-node4 to 6,actions/download-artifact5 to 7 (#31, #32, #33) - Bump
pulldown-cmarkfrom 0.13.0 to 0.13.1 (#34) - Unify cargo publish, binary build, GitHub release, and npm publish into one workflow (#30)
- Add
revertto allowed semantic PR title types (#37)
Internal
- Attempted migration to
claude-agent-acp(#29), reverted toclaude-code-acp(#37) due to feature parity gaps - Regression tests for height remeasurement, scroll clamp, permission keys, connecting shortcuts, and update check
[0.2.0] - 2026-02-22 Changes
Rename and Distribution
- Rename crate/package to
claude-code-rust - Rename command to
claude-rs - Update release workflows and artifacts to publish/build under the new names
[0.1.3] - 2026-02-21 Changes
Fixes
- Rescan files on each
@mention activation so new/deleted files are reflected during a session - Add keywords to npm package.json for better discoverability
[0.1.2] - 2026-02-21 Changes
UX and Interaction
- Add OS-level shutdown signal handling (
Ctrl+C/SIGTERM) so external interrupts also trigger graceful TUI teardown - Keep in-app
Ctrl+Ckey behavior for selection copy versus quit, while unifying shutdown through the existing cleanup path - Make chat scrollbar draggable with proportional thumb-to-content mapping
- Ensure scrollbar dragging can reach absolute top and bottom of chat history
[0.1.1] - 2026-02-21 Changes
CI and Release
- Replace release-plz with direct cargo and npm publish workflows
release-cargo.yml: publishes to crates.io on Cargo.toml version bumprelease-npm.yml: builds cross-platform binaries, creates verified GitHub Release, publishes to npm with provenance- Triggers based on Cargo.toml version changes instead of tag chaining
- Tags created by github-actions[bot] for verified provenance
- Remove release-plz.toml and cliff.toml
[0.1.0] - 2026-02-20 Changes
Release Summary
Claude Code Rust reaches a strong pre-1.0 baseline with near feature parity for core Claude Code terminal workflows:
- Native Rust TUI built with Ratatui and Crossterm
- ACP protocol integration via
@zed-industries/claude-code-acp - Streaming chat, tool calls, permissions, diffs, and terminal command output
- Modern input UX (multiline, paste burst handling, mentions, slash commands)
- Substantial rendering and scrolling performance work for long sessions
- Broad unit and integration test coverage across app state, events, permissions, and UI paths
The only major parity gap intentionally excluded from this release is token/cost usage display because the upstream ACP adapter currently does not emit usage data.
Architecture And Tooling
- Three-layer runtime design:
- Presentation: Rust + Ratatui
- Protocol: ACP over stdio
- Agent: Zed ACP adapter process
- Async runtime and event handling:
- Tokio runtime with ACP work kept on
LocalSet(!Sendfutures) mpscchannels between ACP client events and UI state machine
- Tokio runtime with ACP work kept on
- CLI and platform support:
- Clap-based CLI (
--model,--resume,--yolo,-C, adapter/log/perf flags) - Cross-platform adapter launcher fallback (explicit path, env path, global bin, npx)
- Windows-safe process resolution via
which
- Clap-based CLI (
Core Features
- Chat and rendering:
- Native markdown rendering including tables
- Inline code/diff presentation and tool-call block rendering
- Welcome/system/tool content unified in normal chat flow
- Input and commands:
tui-textarea-2powered editor path- Multiline paste placeholder pipeline and burst detection
@file/folder mention autocomplete with resource embedding- Slash command workflow with ACP-backed filtering and help integration
- Tool execution UX:
- Unified inline permission controls inside tool-call blocks
- Focus-aware keyboard routing for mention, todo, and permission contexts
- Better interruption semantics and stale spinner cleanup
- Internal ACP/adapter failures rendered distinctly from normal command failures
- Session and app UX:
- Parallel startup (TUI appears immediately while ACP connects in background)
- In-TUI connecting/auth failure messaging and login hinting
- Header model/location/branch context
- Help overlay and shortcut discoverability improvements
- Mouse selection and clipboard copy support
- Smooth chat scroll and minimal scroll position indicator
Performance Work
Performance optimization was a major release theme across recent commits:
- Block-level render caching and deduplicated markdown parsing
- Incremental markdown handling in streaming scenarios
- Prefix sums + binary search for first visible message
- Viewport culling for long-chat scaling
- Ground-truth height measurement and improved resize correctness
- Conditional redraw paths and optional perf diagnostics logging
- Additional targeted UI smoothing for scroll and scrollbar transitions
Reliability, Quality, And Tests
- Significant test investment across both unit and integration layers
- Current codebase includes over 400 Rust
#[test]cases - Dedicated integration suites for ACP events, tool lifecycle, permissions, state transitions, and internal failure rendering
- CI includes test, clippy (
-D warnings), fmt, MSRV, and lockfile checks
Release And Distribution Setup
- Rust crate is now publish-ready for crates.io as
claude-code-rust - CLI executable name is
claude-rs - npm global package added as
claude-code-rust:- installs
claude-rscommand - downloads matching GitHub release binary during
postinstall
- installs
- Tag-based GitHub Actions release workflow added for:
- cross-platform binary builds (Windows/macOS/Linux)
- GitHub release asset publishing
- npm publishing (when
NPM_TOKENis configured)
release-plzremains in place for release PR automation and changelog/version workflows
Known Limitations
- Slash command availability is intentionally conservative for this release:
/loginand/logoutare not offered- they remain excluded until ACP/Zed support is reliable enough for production use
- Token usage and cost tracking is blocked by current ACP adapter behavior:
UsageUpdateevents are not emittedPromptResponse.usageisNone
- Session resume (
--resume) is blocked on an upstream adapter release that contains a Windows path encoding fix