aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAge
* refactor: Replace ad-hoc dispatch with FSM + driver architecture (#3434)Michelle Tilley2026-04-21
| | | | | | | Replaces the tangled dispatch handler system (`tui/dispatch.rs`, `tui/state.rs`) with a pure finite state machine + driver architecture. The FSM handles all state transitions as explicit `(State, Event) → (NewState, Effects)` mappings. The driver executes IO effects and bridges the TUI to the FSM.
* docs: document show_numeric_shortcuts (#3433)ash2026-04-21
| | | | | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> This was added in https://github.com/atuinsh/atuin/pull/2863, but not documented at the time. ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* feat: Implement write_file tool with overwrite safety (#3432)Michelle Tilley2026-04-21
| | | | | | | | | | | | | | | | | | | | ## Summary Implements the `write_file` client-side tool — creates new files or overwrites existing ones with an explicit `overwrite` flag for safety. - **Overwrite flag**: Writing to an existing file without `overwrite: true` returns an error directing the LLM to set the flag or use `edit_file` for targeted changes. Prevents accidental overwrites. - **Snapshots**: Existing files are backed up before overwriting (same infrastructure as `edit_file`). - **Content preview**: Completed writes show the first 10 lines in gray with line numbers, plus "+ N more lines" for longer files. - **Atomic writes**: Uses `tempfile` + fsync + rename (same as `edit_file`). - **File tracker update**: After writing, the file is registered in the tracker so subsequent `edit_file` calls work without a separate read. - **Permission**: Shares the `"Write"` rule with `edit_file` — one permission covers both tools.
* feat: AI tool rendering overhaul + edit_file tool (#3423)Michelle Tilley2026-04-21
| | | | | | Overhaul of how AI tool calls are modeled, rendered, and displayed in the Atuin AI TUI. Fixes bugs in shell command output capture, implements the `edit_file` tool with full safety infrastructure, and adds a diff preview for edits.
* chore: Clarified note about regular expressions matching in path. (#3427)dotfrag2026-04-21
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* chore: update to rust 1.95 (#3426)Ellie Huxtable2026-04-21
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* chore(release): prepare for release 18.15.2 (#3421)Michelle Tilley2026-04-16
| | | | | | | | ## 18.15.2 ### Bug Fixes - Tab doesn't insert suggested command ([#3420](https://github.com/atuinsh/atuin/issues/3420))
* fix: Tab doesn't insert suggested command (#3420)Michelle Tilley2026-04-16
|
* chore: Fix Claude release skill to properly catch completed checksMichelle Tilley2026-04-16
|
* chore(release): prepare for release 18.15.1 (#3419)Michelle Tilley2026-04-15
|
* fix: Enter runs suggested command when selecting permissions (#3418)Michelle Tilley2026-04-15
|
* Update release skillMichelle Tilley2026-04-15
|
* chore(release): prepare for release 18.15.0 (#3417)Michelle Tilley2026-04-15
|
* fix: loss of loading spinners + tokio panic on exit (#3415)Michelle Tilley2026-04-14
|
* feat: Allow resuming previous AI sessions (#3407)Michelle Tilley2026-04-15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This PR introduces session continuation to Atuin AI. * Conversations with Atuin AI are stored in a local SQLite database * Upon startup, Atuin AI tries to find a session to resume based on its directory/workspace and the time since the last event * If found, Atuin AI will show a note that the session has been resumed, and an event is added to help the LLM know where the invocation boundaries are * If not, Atuin AI will create a new conversation * The user can create a new conversation with `/new` * The new setting `ai.session_continue_minutes`, which defaults to `60`, controls how old the last event in a session can be before it's no longer considered for automatic resuming. <img width="1055" height="593" alt="image" src="https://github.com/user-attachments/assets/3f9ff01a-ef64-44a9-b0e2-3a4252c5746f" /> ## Architecture A new `SessionService` trait defines an API contract for a service that can manage session data. `LocalSessionService` implements this, with `DaemonSessionService` a possible future extension point. `SessionManager` owns a `dyn SessionService` and delegates as appropriate.
* fix: dependency fix (#3414)Michael Zeller2026-04-14
| | | | | | | | | | | This was commented out in #3413 and needs to be fixed back up. It's possible we can drop this line altogether if CI passed before without it. ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* chore: add release script (#3411)Michelle Tilley2026-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ## Summary Adds release automation for Atuin in two forms: a standalone bash script (`scripts/release.sh`) and a Claude Code skill (`/release`). Both follow the same process: 1. Check dependencies (`git`, `gsed`, `cargo`, `gh`, `git-cliff`) 2. Detect current version from workspace `Cargo.toml`, prompt for new version 3. Clone to a clean temp directory, create release branch 4. Update versions across all `Cargo.toml` files (with escaped dots in the sed pattern) 5. `cargo check` to update `Cargo.lock` 6. Generate changelog with `git-cliff` and insert incrementally (preserves manual edits to old entries) 7. Commit, push, create PR with changelog in the body 8. Wait for PR merge, then tag and push 9. Publish to crates.io (stable only, `--no-verify` to avoid index-lag failures, graceful "already uploaded" handling for independently-versioned crates like atuin-nucleo) ### Changelog strategy - **Prereleases**: maintain a running `## [unreleased]` section with all changes since the last stable release - **Stable releases**: replace the `[unreleased]` section with a versioned `## X.Y.Z` heading covering the same span - cargo-dist reads `CHANGELOG.md` at the tagged commit for GitHub Release notes, so the edited changelog flows through automatically ### Bash script vs Claude Code skill | Bash script | `/release` skill | |---|---| | `read -p "Press Enter..."` | AskUserQuestion with structured options | | `$EDITOR CHANGELOG.md` | Shows the entry inline, edits conversationally | | `sleep 5` polling loop | Persistent Monitor with CI check summaries | | `echo -e "${GREEN}✓${NC}"` | Natural language progress reporting | | Must know the script exists | `/release 18.15.0` from any Claude Code session |
* feat: Enable atuin hex for illumos (#3413)Michael Zeller2026-04-14
| | | | | | | | | | | | | This bumps the `portable-pty` dep which itself has a dependency on a newer termios that knows about illumos. Unless this was pinned for a particular reason I think this is fine. With this dep bumped we can enable `atuin hex` on illumos. ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* feat: Add OCI standard labels to Dockerfile (#3412)Rufo Sanchez2026-04-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing Hi there! Just a small thing I noticed; I self-host an Atuin server via Docker and have started bumping my compose dependencies with Renovate. They have a feature that pulls the changelog and displays it in-line in the PR, which is handy when it works! - but currently this doesn't work for Atuin. According to [their documentation](https://docs.renovatebot.com/modules/datasource/docker/#description), the `org.opencontainers.image.source` label needs to point to the repository for them to grab release notes. Renovate cites their Dockerfile as an example, so I took a look at [the actual Dockerfile](https://github.com/renovatebot/renovate/blob/main/tools/docker/Dockerfile) to see if they had any other labels, and figured I'd pop those in as well. No particularly strong feelings on the labeling itself, styling, etc; so free free to make any changes deemed necessary :)
* fix: install script incorrectly tries to install opencode hooks (#3410)Michelle Tilley2026-04-14
|
* chore(release): prepare for release 18.14.1 (#3405)Ellie Huxtable2026-04-13
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* fix: Thread remote and content_length through system for server tool calls ↵Michelle Tilley2026-04-13
| | | | (#3404)
* docs: Add Tools & Permissions doc section (#3402)Michelle Tilley2026-04-13
|
* fix: ensure we can publish to crates (#3403)Ellie Huxtable2026-04-13
| | | | | | | | | | | | | | | include_str won't work outside of the crate boundary. Crates is so frustrating sometimes. <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* chore(release): prepare for release 18.14.0 (#3401)Ellie Huxtable2026-04-13
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* refactor: rename examples -> contrib (#3400)Ellie Huxtable2026-04-13
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: autoinstall ai shell history hooks (#3399)Ellie Huxtable2026-04-13
| | | | | | | | | | Follows our existing behaviour of automatically installing shell hooks, extend this for ai agents too ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: add pi hook installer (#3398)Ellie Huxtable2026-04-13
| | | | | | | | | | | | | | | Support installing the pi extension via `atuin hook install pi`. Bundle the extension in the binary and update the docs. <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: remove agent search from tui (#3397)Ellie Huxtable2026-04-13
| | | | | | | | | | | | | This is essentially not a useful place to search agent history Right now, using the CLI is the best way to explore this. We are looking into building another TUI for searching records more widely and in more detail ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: track coding agent shell usage (#3388)Ellie Huxtable2026-04-11
| | | | | | | | | | | https://github.com/user-attachments/assets/7868c7a4-6a91-4c93-ac6a-e8665cf1f799 ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* fix: ensure daemon is running (#3384)Ellie Huxtable2026-04-11
| | | | | | | | | | | | | | | | | | | Instead of only ensuring the daemon is running as part of writing history, route all calls through a function that ensures it's running if an error occurs. This fixes the case where a system boots, no commands run, and the user tries to search history. <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: add history tail for live monitoring view (#3389)Ellie Huxtable2026-04-11
| | | | | | | | | | Useful for watching what agents are doing, or viewing live info from other machines. Regardless I am liking it for debugging ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* chore: Prepare 18.14.0-beta.1 release (#3393)Michelle Tilley2026-04-10
|
* feat: Client-tool execution + permission system (#3370)Michelle Tilley2026-04-10
| | | | | | Adds client-side tool execution to Atuin AI, starting with `atuin_history`. The server can request tool calls, which are executed locally with a permission system, and results are sent back to continue the conversation.
* feat: add strip_trailing_whitespace, on by default (#3390)Ellie Huxtable2026-04-10
| | | | | | | | | | | | I can't think of any reason you would want this disabled by default - trailing whitespace means nothing, breaks dedupe, and wastes a few bytes closes #3387 ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* docs: Minor readability improvement to README (#3381)Anirudh Vempati2026-04-07
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* docs: cover prefix mode properly (#3383)Ellie Huxtable2026-04-07
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: add support for deleting all matching commands via keybindings (#3375)Ellie Huxtable2026-04-04
|
* feat: option to disable mouse support (#3372)依云2026-04-03
| | | | | | | | | | | | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing This adds an option to disable mouse support, so that the terminal handles mouse events, making it easy to select text. I've found myself needing to copy from history frequently recently and holding Shift is not convenient. However, this makes mouse scrolling not work as expected, e.g. in my case it scrolls six lines at a time. Also see #1209.
* fix(ui): when inverted, invert scroll events handling (#3373)依云2026-04-03
| | | | | | | | | | | | <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* docs: remove docker-compose duplication (#3376)Ellie Huxtable2026-04-03
| | | | | | | | | | | | | | It does not make sense to have two copies of it to keep in sync The user needs to read and edit this file anyway, so prefer keeping the docs copy resolves #3371 ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* feat: Add 'atuin config' subcommand for reading and setting config values ↵Michelle Tilley2026-03-31
| | | | | | (#3368) Adds a new `atuin config` command with three subcommands for inspecting and modifying `config.toml` without opening an editor.
* feat: opt-in to sharing last command with ai (#3367)Ellie Huxtable2026-03-31
| | | | | | | | | | This enables it to perform more effectively and give better suggestions. Same as send_cwd, disabled by default, opt in. ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
* fix(ui): make preview line breaking algorithm aware of CJK double-width ↵依云2026-03-31
| | | | | | | | | | | | | | | | | | | | | characters (#3360) <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing Or part of the command may be missing and the user may be misled to run a wrong command. --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* fix: resolve git worktrees to main repo in workspace filter (#3366)Paul Hinze2026-03-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes #3364 ## Summary When using `filter_mode = "workspace"`, each git worktree gets its own isolated history scope instead of sharing history with the main checkout. ## Root cause `in_git_repo()` walks up the directory tree looking for a `.git` entry. In a worktree, `.git` is a file (not a directory) containing a `gitdir:` pointer back to the main repo's `.git/worktrees/<name>`. Since `has_git_dir()` just checks `.exists()`, the worktree's own path becomes the workspace root, and the `WHERE cwd LIKE '<root>%'` filter isolates its history from the main repo and other worktrees. ## Fix Add `resolve_git_worktree()`, which reads the `.git` file when it's not a directory, parses the `gitdir:` pointer, and walks back up to find the parent containing a real `.git` directory. No new dependencies -- just a bit of file reading and path traversal. ## Testing Two new tests in `utils::tests`: - `in_git_repo_regular` -- baseline that normal repos still resolve correctly - `in_git_repo_worktree_resolves_to_main_repo` -- creates a simulated worktree layout and verifies it resolves to the main repo root Both pass locally, along with the full `atuin-common` test suite and `cargo clippy -- -D warnings`. --- Disclosure: I'm a Rust novice, and I put this together with help from Claude Code. I'm eager to learn more, so please let me know if anything doesn't feel like idiomatic Rust! ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* chore: Update to eye-declare 0.3.0 (#3365)Michelle Tilley2026-03-30
|
* fix: replace `e>|` with `|` in nushell integration to restore history ↵Hleb Shauchenka2026-03-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | recording (#3358) <!-- Thank you for making a PR! Bug fixes are always welcome, but if you're adding a new feature or changing an existing one, we'd really appreciate if you open an issue, post on the forum, or drop in on Discord --> ## Summary Fix nushell history recording completely broken since v18.13.0. No commands are recorded because `ATUIN_HISTORY_ID` is always set to an empty string. Closes #3308 ## Root Cause PR #3183 (first included in v18.13.0) changed the `_atuin_pre_execution` hook: ```diff - $env.ATUIN_HISTORY_ID = (atuin history start -- $cmd) + $env.ATUIN_HISTORY_ID = (atuin history start -- $cmd e>| complete | get stdout | str trim) ``` The intent was to silence DB errors (e.g. when disk is full) by using `complete` to swallow failures. However, `e>|` redirects exclusively stderr into the pipe, dropping stdout. `complete` then sees atuin's stdout in the `stderr` field and the `stdout` field is empty. The result is that `ATUIN_HISTORY_ID` is always empty, and no commands are ever recorded. All nushell versions are affected. Not only 0.111.0, as I incorrectly wrote in [the issue](https://github.com/atuinsh/atuin/issues/3308#issuecomment-4113840110). ## Fix Replace `e>|` with `|`. The `| complete | get stdout` pattern still silences errors: `complete` captures stdout, stderr, and exit code into a record, and `get stdout` discards the rest, preserving the error suppression from #3183 without breaking stdout capture. ## Testing Tested with nix shells across three nushell versions (0.98, 0.103, 0.111): **History recording:** | Version | `e>\| complete \| get stdout` | `\| complete \| get stdout` | |---------|-------------------------------|------------------------------| | 0.98 | empty (broken) | valid history ID | | 0.103 | empty (broken) | valid history ID | | 0.111 | empty (broken) | valid history ID | **Error silencing** (verified `| complete | get stdout` on a failing command): | Version | Error shown to user? | stdout field | |---------|---------------------|--------------| | 0.98 | No | empty | | 0.103 | No | empty | | 0.111 | No | empty | ## Checks - [x] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [x] I have checked that there are no existing pull requests for the same thing
* chore: Prepare 18.13.6 release (#3356)Michelle Tilley2026-03-27
|
* chore(deps): Update to eye-declare v0.2.0 (#3355)Michelle Tilley2026-03-27
| | | | | | | | | | | eye-declare v0.2.0 includes two relevant changes: * "Capture-phase" event handling lets us remove the special-case event handling in `InputBox` that allowed global keyboard binds to work; the `AtuinAi` component now handles this directly. * `Tracked::read()` allows reading fields in tracked state without triggering the dirty-tracking from the `DerefMut` implementation, allowing us to send messages on the app event bus without marking the containing state as dirty.
* feat: Use eye-declare for more performant and flexible AI TUI (#3343)Michelle Tilley2026-03-27
| | | | | | | | | | | | | | | | This PR replaces the mess of custom rendering code in Atuin AI with [eye-declare](https://github.com/BinaryMuse/eye-declare), and updates the TUI to feel more terminal-native: output appears inline and persists in scrollback, so you can scroll up and look at previous conversations for reference. The "review" state — which used to exist between the LLM generating a response and the user either executing or following up — has been removed; just start typing to follow up with the LLM, or press `enter` at the empty input box to execute the suggested command. <img width="1203" height="633" alt="image" src="https://github.com/user-attachments/assets/159ee447-9a2a-4edd-b56e-a79bf1aaaa94" />