Skip to content

Releases: odtorres/aura

1.2.25 — 2026-05-09

Choose a tag to compare

@github-actions github-actions released this 09 May 19:37

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.rs shrinks 11,624 → 11,276 lines. No
    behavior change: App::run_task and App::get_tasks are inherent
    methods, so callers in input.rs resolve them identically. Mirrors
    the app/lifecycle.rs + app/updates.rs seam 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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 10 May 13:40

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:
    • EnableMouseCapture only enables button + drag tracking
      (CSI ?1002h), so bare-motion MouseEventKind::Moved events
      never reached the app. Startup now also emits CSI ?1003h
      (any-event tracking) and shutdown emits CSI ?1003l.
    • The mouse loop's catch-all _ => {} arm dropped Moved even
      if it had arrived. The handler now updates the highlight via a
      new ContextMenu::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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 06 May 23:59

Release Notes

Fixed

  • No more stale .git/index.lock from Aura's source-control poll —
    the 2 s git status poll could exceed the worker's 8 s wall-clock
    timeout on slow filesystems, at which point the worker SIGKILLed
    git mid-write and orphaned .git/index.lock. The next git add
    in any terminal would then fail with Unable to create '.git/index.lock': File exists until the user removed it manually.
    Multiple changes harden this end-to-end:
    • REFRESH_TIMEOUT raised 8 s → 30 s so a slow git status no
      longer trips the kill path on a normal workload.
    • On timeout, the worker now sends SIGTERM and waits up to 500 ms
      for git to release its lock cleanly before escalating to
      SIGKILL (Unix only — Command::kill is the fallback elsewhere).
    • After a forced kill, the worker sweeps .git/index.lock if 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.lock is present, so an external git add running
      in a terminal can't race Aura's poll.

Internal

  • New process-wide git_cli_lock() mutex serializes every git
    subprocess that originates from Aura — both the async worker and
    the synchronous GitRepo write 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 authoritative git_dir(),
    so the lock check works in worktrees and submodules where .git
    is a file rather than a directory.
  • New libc dep (cfg(unix)-gated on the tui crate) for raw
    SIGTERM delivery.

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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 30 Apr 19:17

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_menu now 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.

Internal

  • New screen_to_char_idx helper 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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 30 Apr 14:14

Release Notes

Performance & responsiveness — major

  • Async git worker — every slow git shellout 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,
    and git commit all gain hard wall-clock timeouts (8 s for refresh,
    30 s for commit) and pipe Stdio::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-section RefreshState
    (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 has commit.gpgsign=true, so the user knows
    signing must be non-interactive.
  • git commit -m (legacy path) gets Stdio::null() — even the
    commit_with_conversation path that doesn't go through the worker
    no longer leaves stdin open to a non-existent TTY.

Performance — bounded growth

  • ChatPanel.items capped 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.commands capped at 1000 with ring-buffer
    semantics — terminal-heavy sessions plateau in RSS.
  • App.file_mtimes is now evicted on tab close; the HashMap
    used to grow monotonically across an editing session.
  • (App.jump_list already had a 100-entry cap; verified during
    audit.)

Performance — hot path

  • New Buffer.revision monotonic 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_moved debounces full-buffer find_all scans:
    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_predictions skips 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.rs rewritten around request_refresh
    • apply_event. Public method signatures gain a &GitWorker
      parameter (stage_selected, stage_all, unstage_selected,
      discard_selected, discard_staged_selected, commit).
  • crates/core/src/buffer.rs gains the revision field + 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 rippling Sender<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_highlights still 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::metadata poll onto file_watcher thread.

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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 30 Apr 02:32

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 existing set_yank / clipboard
    ring / Buffer::insert plumbing so it interoperates with vim-style
    registers. New context_menu module 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 had scroll_up/scroll_down methods but the wheel only
    scrolled the underlying text buffer. handle_mouse_scroll now
    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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 29 Apr 22:11

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-level cursor_word_matches and search_matches caches index
    into the previously-active buffer's rope and were not cleared on tab
    switch, so draw_word_highlights / draw_search_highlights would
    call Rope::char_to_line with stale indices. Fixed by (a) clearing
    the caches when open_file actually 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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 26 Apr 15:39

Release Notes

Changed

  • Chat panel: single source of truth for messages — the legacy
    Vec<ChatMessage> array that mirrored the richer Vec<ChatItem>
    list ("legacy, kept for compatibility") is gone. Every chat
    consumer (the panel renderer, the :export markdown writer, the
    conversation-store loader, the streaming finalisation, the system
    message pusher, the tool-call adder/resulter) now reads from and
    writes to items only. The :export writer pattern-matches on
    ChatItem::Text vs ChatItem::ToolCall to emit a richer markdown
    with tool-call summaries that the legacy path threw away.

Internal

  • Removed the ChatMessage struct and the ChatPanel.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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 26 Apr 15:33

Release Notes

Internal

  • Tightened the tui crate's public surface — only app, render,
    tab, and config are still pub mod (the surfaces consumed by the
    aura editor binary, the render benches, and the integration test
    scaffold). The remaining 60 modules dropped to pub(crate) mod. This
    surfaces 19 forward-looking-API items that were invisible to the
    dead-code lint when they were pub and 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 | sh

Download 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

Choose a tag to compare

@github-actions github-actions released this 26 Apr 15:32

Release Notes

Changed

  • Single codepath for diff viewing — the long-running migration where
    App::diff_view (a per-app overlay) lived alongside Tab::diff (a
    per-tab field) is complete. The overlay field is gone; every diff
    opener now routes through a single new App::open_diff_tab(diff)
    helper which constructs a fresh tab, attaches the diff, switches to
    Mode::Diff, and lets app.tabs.close_active() close it. The four
    call sites that previously stuffed an overlay (the :diff two-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's diff field rather than spawning new tabs each step.
  • Side effect: the unsaved-changes diff is now a proper tab — pressing
    Esc returns to the underlying tab via close_active() instead of
    flipping a global flag, and the diff scroll keys (j/k/G/g/
    Ctrl+d/Ctrl+u) are now routed correctly through Mode::Diff for
    this opener (previously the overlay was drawn while the editor
    stayed in Mode::Normal, so scroll keys did the wrong thing).

Internal

  • Removed the dual-fallback branches (app.tab().diff.or(app.diff_view))
    in render.rs:191, 1141, 1226. Removed the six else if let Some(dv) = &mut app.diff_view fallbacks in handle_diff (input.rs
    scroll/jump keys + Esc + Enter handlers). Removed App::diff_view
    field at app/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 | sh

Download 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