Repository navigation
Releases: odtorres/aura
Releases · odtorres/aura
Release list
1.2.25 — 2026-05-09
Release Notes
Internal
- Phase E second wedge: Task Runner extracted into
app/tasks.rs—
continues the ongoing decomposition of the monolithic
crates/tui/src/app/mod.rs.run_task,get_tasks, and
auto_detect_tasks(~348 lines covering Cargo / npm / Make / Go /
Mix / Dart / Zig / sbt / Stack-Cabal / Python detection) now live
in their own file.mod.rsshrinks 11,624 → 11,276 lines. No
behavior change:App::run_taskandApp::get_tasksare inherent
methods, so callers ininput.rsresolve them identically. Mirrors
theapp/lifecycle.rs+app/updates.rsseam established in the
first wedge (9a67c2e).
Install aura 1.2.25
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.25/aura-installer.sh | shDownload aura 1.2.25
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.24 — 2026-05-07
Release Notes
Fixed
- Context menu items highlight on mouse hover — the right-click
popup (Cut / Copy / Paste / Delete / Select All) was stuck showing
the first enabled item as selected no matter where the mouse moved
inside the menu. Two issues:EnableMouseCaptureonly enables button + drag tracking
(CSI ?1002h), so bare-motionMouseEventKind::Movedevents
never reached the app. Startup now also emitsCSI ?1003h
(any-event tracking) and shutdown emitsCSI ?1003l.- The mouse loop's catch-all
_ => {}arm droppedMovedeven
if it had arrived. The handler now updates the highlight via a
newContextMenu::hover_at(col, row)while the menu is visible.
Click-to-activate (action_at) and keyboard navigation are
unchanged.
Install aura 1.2.24
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.24/aura-installer.sh | shDownload aura 1.2.24
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.23 — 2026-05-06
Release Notes
Fixed
- No more stale
.git/index.lockfrom Aura's source-control poll —
the 2 sgit statuspoll could exceed the worker's 8 s wall-clock
timeout on slow filesystems, at which point the workerSIGKILLed
gitmid-write and orphaned.git/index.lock. The nextgit add
in any terminal would then fail withUnable to create '.git/index.lock': File existsuntil the user removed it manually.
Multiple changes harden this end-to-end:REFRESH_TIMEOUTraised 8 s → 30 s so a slowgit statusno
longer trips the kill path on a normal workload.- On timeout, the worker now sends
SIGTERMand waits up to 500 ms
for git to release its lock cleanly before escalating to
SIGKILL(Unix only —Command::killis the fallback elsewhere). - After a forced kill, the worker sweeps
.git/index.lockif it
appeared during the killed run, so an orphan can't survive past
the operation that created it. Pre-existing locks (from another
process) are left alone. - The 2 s auto-refresh tick now skips firing while
.git/index.lockis present, so an externalgit addrunning
in a terminal can't race Aura's poll.
Internal
- New process-wide
git_cli_lock()mutex serializes everygit
subprocess that originates from Aura — both the async worker and
the synchronousGitRepowrite paths (stage_file,unstage_file,
commit,checkout_branch, all stash ops, …) take the same lock,
so internal git ops can't race each other either. - New
GitRepo::is_locked()uses gix's authoritativegit_dir(),
so the lock check works in worktrees and submodules where.git
is a file rather than a directory. - New
libcdep (cfg(unix)-gated on the tui crate) for raw
SIGTERMdelivery.
Install aura 1.2.23
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.23/aura-installer.sh | shDownload aura 1.2.23
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.22 — 2026-04-30
Release Notes
Fixed
- Right-click → Paste now lands at the click position — when the
right-click context menu shipped in v1.2.19, the right-click never
moved the editor cursor. So clicking on line 50 and choosing Paste
inserted the clipboard wherever the cursor happened to be (often a
completely different line).open_context_menunow matches the
behaviour of VS Code / Sublime / most native editors:- Right-click inside an existing visual selection → keep the
selection (so Copy / Cut still operate on the highlighted region). - Right-click anywhere else → drop the selection, move the cursor
to the click position, then open the menu. Paste lands where you
clicked.
- Right-click inside an existing visual selection → keep the
Internal
- New
screen_to_char_idxhelper that maps a screen point to a buffer
char index without mutating cursor state — used to hit-test "is the
click inside the current selection?".
Install aura 1.2.22
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.22/aura-installer.sh | shDownload aura 1.2.22
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.20 — 2026-04-30
Release Notes
Performance & responsiveness — major
- Async git worker — every slow
gitshellout now runs on a
dedicated worker thread instead of the UI loop.git status,
git rev-list --left-right --count(ahead/behind),git stash list,
andgit commitall gain hard wall-clock timeouts (8 s for refresh,
30 s for commit) and pipeStdio::null()for stdin so pre-commit
hooks and GPG prompts can no longer hang the editor waiting for a
TTY it can't provide. The 2 s sidebar refresh tick and panel click
handler now just send commands to the worker and return immediately;
results arrive via a per-frame event drain alongside LSP/MCP. New
crates/tui/src/git_worker.rs(340 LOC, 4 unit tests covering
porcelain parsing and the kill-on-timeout path). - Source-control panel state machine —
SourceControlPanel.refresh
is gone; the panel now tracks per-sectionRefreshState
(Idle/InFlight/Stale) and coalesces overlapping requests so
the 2 s tick can't stack up into a thundering herd on slow repos.
A small spinner glyph in the panel header confirms the UI is alive
during long status scans, and a red error row surfaces timeouts /
commit failures in-place. A yellow status banner appears once at
startup if the repo hascommit.gpgsign=true, so the user knows
signing must be non-interactive. git commit -m(legacy path) getsStdio::null()— even the
commit_with_conversationpath that doesn't go through the worker
no longer leaves stdin open to a non-existent TTY.
Performance — bounded growth
ChatPanel.itemscapped at 500 with a FIFO drop and an elision
banner row; long conversations no longer leak memory or pay
per-frame iteration cost over hours.EmbeddedTerminal.commandscapped at 1000 with ring-buffer
semantics — terminal-heavy sessions plateau in RSS.App.file_mtimesis now evicted on tab close; theHashMap
used to grow monotonically across an editing session.- (
App.jump_listalready had a 100-entry cap; verified during
audit.)
Performance — hot path
- New
Buffer.revisionmonotonic counter (bumps on every insert /
delete / undo / redo /restore_to). Used as a cache invalidation
key for downstream caches in this and follow-up releases. notify_cursor_moveddebounces full-bufferfind_allscans:
caches(word, revision, matches)and skips when both are
unchanged; otherwise gates rescans to a 120 ms debounce window.
A 10k-line file's "rapid cursor sweep" no longer regenerates the
cursor-word match list on every keystroke.update_edit_predictionsskips the per-frame history walk +
diagnostics clone when neither the buffer revision nor the cursor
row changed since the previous frame.
Internal
- New module
crates/tui/src/git_worker.rs. crates/tui/src/source_control.rsrewritten aroundrequest_refreshapply_event. Public method signatures gain a&GitWorker
parameter (stage_selected,stage_all,unstage_selected,
discard_selected,discard_staged_selected,commit).
crates/core/src/buffer.rsgains therevisionfield + accessor;
every mutation path bumps it.- 4 new unit tests in
git_worker(porcelain parser, child kill on
timeout, fast-child happy path).
Deferred to follow-up release
mpsc::channel()→sync_channel(1024)for LSP/MCP/DAP/watcher
event channels. Requires ripplingSender<T>→SyncSender<T>
through many call sites; lower priority now that the worst stall
trigger (sync git on main) is gone.- Tree-sitter incremental parsing (
refresh_highlightsstill does
rope.to_string()+ full re-parse on a 40 ms debounce; works fine
in practice but room to improve). - Per-line render style cache, minimap line-vector cache, bracket-
depth lazy rebuild — deferred to land alongside tree-sitter
incremental so the cache key story stays consistent. - Move 2 s mtime
fs::metadatapoll ontofile_watcherthread.
Install aura 1.2.20
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.20/aura-installer.sh | shDownload aura 1.2.20
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.19 — 2026-04-29
Release Notes
Added
- Right-click context menu in the editor — right-clicking inside
the editor area now opens a small popup with Cut, Copy, Paste,
Delete, and Select All. Items that need a selection (Cut / Copy /
Delete) are dimmed and disabled when none is active. The menu is
navigable with Up/Down + Enter, dismissed with Esc, click outside,
or any other key. Wired into the existingset_yank/ clipboard
ring /Buffer::insertplumbing so it interoperates with vim-style
registers. Newcontext_menumodule with 6 unit tests. - Mouse-wheel scroll now works in every editor view — the diff
view (single-buffer git diff) and the 3-panel merge conflict editor
already hadscroll_up/scroll_downmethods but the wheel only
scrolled the underlying text buffer.handle_mouse_scrollnow
dispatches based on what's actually in front of the user: merge view
scrolls all three panels in sync, diff view scrolls its own
cumulative-line index, plain text buffers behave as before.
Install aura 1.2.19
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.19/aura-installer.sh | shDownload aura 1.2.19
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.18 — 2026-04-29
Release Notes
Fixed
- Click-to-open file no longer panics — opening a file by clicking
it in the file tree could panic ropey with "Char index out of bounds"
when the new buffer was smaller than the previous one. The
app-levelcursor_word_matchesandsearch_matchescaches index
into the previously-active buffer's rope and were not cleared on tab
switch, sodraw_word_highlights/draw_search_highlightswould
callRope::char_to_linewith stale indices. Fixed by (a) clearing
the caches whenopen_fileactually switches the active tab and
(b) defensively skipping any cached match whose indices fall outside
the active rope at render time.
Install aura 1.2.18
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.18/aura-installer.sh | shDownload aura 1.2.18
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.17 — 2026-04-26
Release Notes
Changed
- Chat panel: single source of truth for messages — the legacy
Vec<ChatMessage>array that mirrored the richerVec<ChatItem>
list ("legacy, kept for compatibility") is gone. Every chat
consumer (the panel renderer, the:exportmarkdown writer, the
conversation-store loader, the streaming finalisation, the system
message pusher, the tool-call adder/resulter) now reads from and
writes toitemsonly. The:exportwriter pattern-matches on
ChatItem::TextvsChatItem::ToolCallto emit a richer markdown
with tool-call summaries that the legacy path threw away.
Internal
- Removed the
ChatMessagestruct and theChatPanel.messages
field; updated 5 chat-panel unit tests to match against
ChatItem::Text { role, content, .. }patterns.
Install aura 1.2.17
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.17/aura-installer.sh | shDownload aura 1.2.17
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.16 — 2026-04-26
Release Notes
Internal
- Tightened the tui crate's public surface — only
app,render,
tab, andconfigare stillpub mod(the surfaces consumed by the
auraeditor binary, the render benches, and the integration test
scaffold). The remaining 60 modules dropped topub(crate) mod. This
surfaces 19 forward-looking-API items that were invisible to the
dead-code lint when they werepuband crate-external (the lint
conservatively assumed an unknown caller existed). Each affected
module (acp_server,apply_model,file_watcher,image_preview,
lsp,mcp_client,mcp_server,notebook,remote,
speculative,todo_panel) now has a module-level
#![allow(dead_code)]plus a one-line comment explaining what the
unused items are reserved for (protocol surface, future bulk-action
UI, future "browse remote dir" command, etc). Net result: dead-code
lint stays useful for accidentally-unused code in the rest of the
crate, while genuine forward-looking API items don't generate noise.
Install aura 1.2.16
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.16/aura-installer.sh | shDownload aura 1.2.16
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
1.2.15 — 2026-04-26
Release Notes
Changed
- Single codepath for diff viewing — the long-running migration where
App::diff_view(a per-app overlay) lived alongsideTab::diff(a
per-tab field) is complete. The overlay field is gone; every diff
opener now routes through a single newApp::open_diff_tab(diff)
helper which constructs a fresh tab, attaches the diff, switches to
Mode::Diff, and letsapp.tabs.close_active()close it. The four
call sites that previously stuffed an overlay (the:difftwo-file
command, the unsaved-changes diff command, and the agent multi-file
review's initial-open + revert-empty paths) all share the helper.
Cycling within the agent diff (next_agent_diff) replaces the
active tab'sdifffield rather than spawning new tabs each step. - Side effect: the unsaved-changes diff is now a proper tab — pressing
Escreturns to the underlying tab viaclose_active()instead of
flipping a global flag, and the diff scroll keys (j/k/G/g/
Ctrl+d/Ctrl+u) are now routed correctly throughMode::Difffor
this opener (previously the overlay was drawn while the editor
stayed inMode::Normal, so scroll keys did the wrong thing).
Internal
- Removed the dual-fallback branches (
app.tab().diff.or(app.diff_view))
inrender.rs:191,1141,1226. Removed the sixelse if let Some(dv) = &mut app.diff_viewfallbacks inhandle_diff(input.rs
scroll/jump keys + Esc + Enter handlers). RemovedApp::diff_view
field atapp/mod.rs:668. 357 tests still pass workspace-wide,
zero clippy warnings.
Install aura 1.2.15
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/odtorres/aura/releases/download/v1.2.15/aura-installer.sh | shDownload aura 1.2.15
| File | Platform | Checksum |
|---|---|---|
| aura-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| aura-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| aura-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| aura-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| aura-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |