aboutsummaryrefslogtreecommitdiffstats
path: root/crates (unfollow)
Commit message (Collapse)Author
2026-03-30fix: resolve git worktrees to main repo in workspace filter (#3366)Paul Hinze
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
2026-03-30chore: Update to eye-declare 0.3.0 (#3365)Michelle Tilley
2026-03-30fix: replace `e>|` with `|` in nushell integration to restore history ↵Hleb Shauchenka
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
2026-03-27chore: Prepare 18.13.6 release (#3356)Michelle Tilley
2026-03-27chore(deps): Update to eye-declare v0.2.0 (#3355)Michelle Tilley
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.
2026-03-27feat: Use eye-declare for more performant and flexible AI TUI (#3343)Michelle Tilley
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" />
2026-03-26fix: set WorkingDirectory in PowerShell Invoke-AtuinSearch (#3351)James Brooks
Fixes #3350 PowerShell's Set-Location (cd) doesn't update the process-level working directory, so the spawned search process sees a stale cwd and directory filter mode matches against the wrong directory. Setting `WorkingDirectory` on the `ProcessStartInfo` ensures the correct cwd is passed through.
2026-03-26fix(powershell): handle non-FileSystem drives (#3353)Lucas Trzesniewski
The current version generates the following error when PowerShell's current directory is on a [non-FileSystem drive](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_providers): > A parameter cannot be found that matches parameter name 'Raw'. Repro: <img width="475" height="166" alt="image" src="https://github.com/user-attachments/assets/72af2dd1-ff80-46e1-936d-808d0563796a" /> <!-- 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
2026-03-25fix: remove unnecessary arboard/image-data default feature (#3345)Ross Williams
2026-03-24chore: Prepare 18.13.5 (#3342)Michelle Tilley
2026-03-24fix: Atuin Hex fails to init on bash and zsh (#3341)Michelle Tilley
Fixes #3340
2026-03-23chore(release): prepare for release 18.13.4 (#3336)Michelle Tilley
2026-03-23fix: Don't run 'atuin init' in 'atuin hex init' — each must be ↵Michelle Tilley
initialized separately (#3334)
2026-03-23chore: Refactor CLI auth flows and token storage (#3317)Michelle Tilley
This PR eplaces the binary `is_hub_sync()` auth routing with an explicit `SyncAuth` enum that classifies the client's authentication state at runtime. This fixes a class of bugs where CLI session tokens were silently mis-stored or used with the wrong auth scheme during Hub migration.
2026-03-23feat: hex init nu (#3330)Xavier Ruiz
- **feat(hex): add nushell support for `atuin hex init`** - **docs(hex): add nushell hex setup instructions** This adds setup for nushell. It breaks the pattern of calling `eval $(atuin init)` on behalf of the user because nushell simply cannot do this. I tried to source the atuin.nu file and add the preamble to it, but it is part of the atuin package, so it made things too difficult. I think settling for separate init is ok. Partially addresses #3329. Please see #3323 as well. I was able to get it working and I am using these changes in my dotfiles: https://github.com/xav-ie/dots/compare/b1a8cf96b58f802396ac5103f0925e1434fc473c...696dbf31008395587353e3071f5296c459685a17 Basically, I just do as the new docs say and make sure to add hex init before regular init and source it. <!-- 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
2026-03-23fix: Disable features in init when that feature is explicitly disabled (#3328)Michelle Tilley
This PR updates `atuin init` to skip initializers for subfeatures when that subfeature is explicitly disabled with a setting value of `false`. For `ai.enabled = false`, this releases the question mark keybind. Fixes #3325
2026-03-20feat: Allow running `atuin search -i` as subcommand on Windows (#3250)Lucas Trzesniewski
This is the equivalent of #3208, but for Windows. ~The rendering performance is noticeably slower in this mode when refreshing a large part of the screen, but it's better than not having the feature at all.~ Fixed 🙂 The second commit fixes some unrelated warnings. /cc @BinaryMuse FYI ## 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
2026-03-20feat: add a small atuin label to the ai box (#3309)Ellie Huxtable
<!-- 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
2026-03-20feat: error if value not provided and no stdinEllie Huxtable
2026-03-20feat: allow setting kv values from stdinEllie Huxtable
2026-03-19fix: Clarify what data is sent when using Atuin AI during setup (only OS and ↵Michelle Tilley
shell) (#3290) Clarifies during `atuin setup` that Atuin AI does not send any shell history to the AI provider.
2026-03-19fix: remove per-event mouse capture toggling that leaked ANSI to stdout (#3299)Michelle Tilley
The per-event `EnableMouseCapture`/`DisableMouseCapture` in `handle_input` wrote directly to `std::io::stdout()`, causing ANSI escape sequences to leak into captured output when running under command substitution (e.g. `VAR=$(atuin search -i)`). This toggling became redundant when session-level mouse capture was added to `Stdout::new()`/`Stdout::drop()`. Fixes #3298
2026-03-19fix(ai): restore url-quote-magic for ? in zsh (#3304)Alex Kirk
I discovered that since #3178, typing or pasting a `?` in a URL no longer gets escaped by `url-quote-magic`. For example, pasting `https://example.com/search?q=foo&test` would result in `https://example.com/search?q=foo\&test` (leave the `?` unescaped, while `&` still worked correctly). The root cause is that Atuin binds `?` to `_atuin_ai_question_mark`, which bypasses `url-quote-magic` in two ways: 1. **Typed `?`**: the else branch (non-empty buffer) appended `?` directly to `LBUFFER` instead of delegating to `self-insert` which runs `url-quote-magic`. 2. **Pasted `?`**: `bracketed-paste-magic` only [activates widgets whose name matches `self-*`](https://github.com/zsh-users/zsh/blob/99f578897614f318cdad76402a7d2423ce176b5a/Functions/Zle/bracketed-paste-magic#L24). Since `_atuin_ai_question_mark` didn't match, pasted `?` characters fell through to `zle .self-insert` — the raw built-in that inserts literally without any URL escaping. The fix renames the widget to `self-atuin-ai-question-mark` (Note: I am not sure this is the best way but it is a relatively simple one). The `self-` prefix satisfies `bracketed-paste-magic`'s `active-widgets` pattern, so `?` in paste is processed by our widget and delegated to `zle self-insert`, restoring `url-quote-magic` behaviour. The typed case delegates to `zle self-insert` in the else branch for the same reason.
2026-03-18fix: Call ensure_hub_session even if primary sync endpoint is self-hostedMichelle Tilley
2026-03-17chore: Replace atuin-ai rendering with component-oriented system (#3288)Michelle Tilley
2026-03-17feat: Report distro name with OS for distro-specific commands (#3289)Michelle Tilley
2026-03-16chore(release): prepare for release 18.13.3Ellie Huxtable
2026-03-16vendor nucleo fork into atuin workspaceEllie Huxtable
Rename crates (nucleo → atuin-nucleo, nucleo-matcher → atuin-nucleo-matcher), add to workspace members and dependencies, update all import paths, remove vendored CI workflow, and suppress upstream clippy warnings. format codespell fixes clippy clappy
2026-03-16feat: Add custom filtering and scoring mechanismsMichelle Tilley
2026-03-16Update readmeMichelle Tilley
2026-03-16feat: Allow headless account ops against Hub server (#3280)Michelle Tilley
2026-03-16chore: symlink changelog so dist can pick it upEllie Huxtable
2026-03-16fix: Nushell 0.111; future Nushell 0.112 support (#3266)Stuart Carnie
Fix issue introduced by #3249. Nushell 0.112 will introduce the breaking change; not 0.111.
2026-03-16specify version in all daemon atuin cratesEllie Huxtable
2026-03-13chore(release): prepare for release 18.13.2 (#3264)Ellie Huxtable
I tried adding a windows arm64 build to the last release, which was perhaps a little naive of me. I thought it working on x86 windows and arm everything else would be enough 💀 ## 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
2026-03-13chore(release): prepare for release 18.13.1 (#3263)Ellie Huxtable
We were using buildjet as our runners previously, but it looks like they have gone under. Luckily, GitHub now provides the arm runners we need ## 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
2026-03-13chore(release): prepare for release 18.13.0 (#3262)Ellie Huxtable
<!-- 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
2026-03-12chore(release): prepare for release 18.13.0-beta.7 (#3259)Ellie Huxtable
<!-- 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
2026-03-12feat: Add `atuin setup` (#3257)Michelle Tilley
2026-03-12chore(release): prepare for release 18.13.0-beta.6 (#3258)Ellie Huxtable
<!-- 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
2026-03-11feat: Initialize Atuin AI by default with `atuin init` (#3255)Michelle Tilley
* Run Atuin AI's `init` during main `init` for bash, zsh, and fish * Note that logging into Hub will enable sync * Add instructions for users with existing sync accounts * Ensure daemon respects `auto_sync` setting * Update docs on disabling Atuin AI
2026-03-12fix: ctrl-c not exiting ai (#3256)Ellie Huxtable
<!-- 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 --> Listen to signals as well as state ## 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
2026-03-11chore(release): prepare for release 18.13.0-beta.5 (#3253)Ellie Huxtable
<!-- 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
2026-03-11feat: Allow authenticating with Atuin Hub (#3237)Michelle Tilley
## Summary This PR enables the Atuin CLI to authenticate with Atuin Hub, unifying authentication across CLI sync and Hub features (AI, runbooks, etc.). ### Key Changes - **Dual auth support**: New `AuthToken` enum supports both `Bearer` (Hub) and `Token` (legacy CLI) authentication - **Smart protocol selection**: New `sync_protocol` setting (`auto`/`hub`/`legacy`) determines auth method. By default, `api.atuin.sh` uses Hub auth; custom sync addresses use legacy auth - **Hub login flow**: `atuin login` now initiates an OAuth-like flow for Hub users—generates a code, user authorizes in browser, CLI polls for completion - **Account linking**: After Hub auth, silently attempts to link existing CLI sync account to Hub account for seamless migration - **Graceful fallback**: `sync_auth_token()` prefers Hub token when available, falls back to CLI session token ### Auth Flow 1. User runs `atuin login` (with default sync address) 2. CLI requests auth code from Hub, displays URL 3. User opens URL, logs in/registers on Hub 4. Hub attaches API token to code 5. CLI polls, receives token, saves as hub session 6. If user had existing CLI sync account, it's automatically linked ### Backward Compatibility - Existing self-hosted users: unaffected (legacy auth via `Token` header) - Existing `api.atuin.sh` users: continue working with CLI session until they run `atuin login` - New users: go through Hub flow automatically ## Test Plan - [ ] New user registration via Hub flow - [ ] Existing CLI user can still sync without changes - [ ] `atuin login` links CLI account to Hub account - [ ] Self-hosted users unaffected by changes - [ ] AI commands work after Hub auth --------- Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2026-03-10chore(release): prepare for release 18.13.0-beta.4 (#3252)Ellie Huxtable
<!-- 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
2026-03-10fix: support Nushell 0.111 (#3249)Stuart Carnie
The flag for `job spawn` changed, which prevents the script from compiling on Nushell 0.111+. ## 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
2026-03-09chore: upgrade axum 0.7 to 0.8 to deduplicate with tonic's axumEllie Huxtable
atuin-server used axum 0.7 while tonic already pulled in axum 0.8, resulting in both versions compiled into the binary. Migrates to axum 0.8: path params use {param} syntax, FromRequestParts uses native async traits (dropping async-trait dep from atuin-server).
2026-03-09feat: use pty proxy for rendering tui popups without clearing the terminal ↵Ellie Huxtable
(#3234) It feels much, much nicer this way. This has also been asked for pretty consistently since we made inline rendering the default. Now we can have everything :) Maintains a shadow vt100 renderer so that we can restore the terminal state upon popup close. This happens on a background thread, so our impact on terminal performance should still be super minimal, if anything ## 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
2026-03-09feat: Allow running `atuin search -i` as subcommand (#3208)Michelle Tilley
Allow `atuin search -i` to work in command substitution contexts like `VAR=$(atuin search -i)`. Previously this would fail with "The cursor position could not be read within a normal duration" because stdout was captured by the subshell, preventing terminal queries from working. Changes: - When stdout isn't a terminal, fall back to /dev/tty for TUI rendering (Unix only) - Force fullscreen mode in this case (inline mode requires cursor position queries that don't work with captured stdout) - Write the selected command to stdout (instead of stderr) when stdout is captured, so it gets assigned to the variable Fixes #3207
2026-03-05feat: Allow setting multipliers for frequency, recency, and frecency scores ↵Michelle Tilley
(#3235)