aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAge
* 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" />
* fix: set WorkingDirectory in PowerShell Invoke-AtuinSearch (#3351)James Brooks2026-03-26
| | | | | | | | | 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.
* fix: use printf to append fish shell init block (#3346)lif2026-03-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ## Summary - The existing sed-based fish config injection produced malformed output on some systems, concatenating 'atuin init fish | source' and 'end' onto the same line (issue #3192) - Replace the GNU/BSD sed detection block with a single printf append that writes a self-contained 'if status is-interactive' block - Remove the now-unnecessary sed dependency check from the installer ## Root cause sed backslash-newline replacement behaves inconsistently across GNU and BSD (macOS) implementations, causing the newline to be dropped on some systems. ## Fix Use printf to append a new 'if status is-interactive' block, consistent with how bash/zsh init lines are already added. ## Test plan - shellcheck -e SC2148 install.sh passes with no warnings - Idempotency preserved via existing grep -q duplicate guard Fixes #3192 Signed-off-by: majiayu000 <1835304752@qq.com>
* fix(powershell): handle non-FileSystem drives (#3353)Lucas Trzesniewski2026-03-26
| | | | | | | | | | | | | | | | | | | | | | | | | 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
* chore(ci): switch most workflows to depot ci (#3352)Ellie Huxtable2026-03-26
| | | | | | | | | | | | | | | | | | | | | | | Continuing the trend of shifting away from GitHub services. Depot is faster, and more reliable. Avoiding docker + release workflows for now, as those have been a pain in the ass to get correct. Will check and see if we can ensure the logs/etc can be public. I'm going to merge this, see how well it works, and if we're good delete the matching github workflows <!-- 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: remove unnecessary arboard/image-data default feature (#3345)Ross Williams2026-03-25
|
* chore: Prepare 18.13.5 (#3342)Michelle Tilley2026-03-24
|
* fix: Atuin Hex fails to init on bash and zsh (#3341)Michelle Tilley2026-03-24
| | | Fixes #3340
* docs: fix duplicated word in Kubernetes guide (#3338)Rohan Santhosh Kumar2026-03-24
|
* chore(release): prepare for release 18.13.4 (#3336)Michelle Tilley2026-03-23
|
* fix: Don't run 'atuin init' in 'atuin hex init' — each must be ↵Michelle Tilley2026-03-23
| | | | initialized separately (#3334)
* chore: Refactor CLI auth flows and token storage (#3317)Michelle Tilley2026-03-23
| | | | | | | 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.
* feat: hex init nu (#3330)Xavier Ruiz2026-03-23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - **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
* fix: Disable features in init when that feature is explicitly disabled (#3328)Michelle Tilley2026-03-23
| | | | | | | 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
* chore(ci): Tag docker images with semantic versions on tag creation (#3316)Chris Rose2026-03-21
| | | | | | | | | | | | | | | | | | - use the docker metadata action to add tags based on metadata - do not add the `latest` tag; it's discouraged for self-hosting safety - continue to include the SHA based tags for granularity Fixes https://github.com/atuinsh/atuin/issues/3202 <!-- 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
* feat: Allow running `atuin search -i` as subcommand on Windows (#3250)Lucas Trzesniewski2026-03-20
| | | | | | | | | | | | | | | | | 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
* docs: add inline_height_shell_up_key_binding (#3270)Adam Batkin2026-03-20
|
* fix: better tty check (#3313)Ellie Huxtable2026-03-20
| | | | | | | | | | | | | | | Our previous tty check could return true in environments where the tty device node exists, but cannot actually be opened. <!-- 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 a small atuin label to the ai box (#3309)Ellie Huxtable2026-03-20
| | | | | | | | | | | | <!-- 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: error if value not provided and no stdinEllie Huxtable2026-03-20
|
* feat: allow setting kv values from stdinEllie Huxtable2026-03-20
|
* fix: Clarify what data is sent when using Atuin AI during setup (only OS and ↵Michelle Tilley2026-03-19
| | | | | | shell) (#3290) Clarifies during `atuin setup` that Atuin AI does not send any shell history to the AI provider.
* fix: remove per-event mouse capture toggling that leaked ANSI to stdout (#3299)Michelle Tilley2026-03-19
| | | | | | | | | | 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
* fix(ai): restore url-quote-magic for ? in zsh (#3304)Alex Kirk2026-03-19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* fix: Call ensure_hub_session even if primary sync endpoint is self-hosted ↵Ellie Huxtable2026-03-19
|\ | | | | | | | | | | (#3301) Fixes https://discord.com/channels/954121165239115808/1484018882254602240
| * fix: Call ensure_hub_session even if primary sync endpoint is self-hostedMichelle Tilley2026-03-18
| |
* | fix: redirect tty0 when running setup (#3302)Ellie Huxtable2026-03-19
|\ \ | |/ |/| | | | | | | | | ## 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: redirect tty0 when running setupEllie Huxtable2026-03-18
|/
* docs: Remove 'experimental' status from Atuin Daemon (#3295)Ellie Huxtable2026-03-18
|\ | | | | What is says on the tin
| * docs: Remove 'experimental' status from Atuin DaemonMichelle Tilley2026-03-18
|/
* docs: fix typo in FAQ alternatives section (#3292)Rohan Santhosh Kumar2026-03-17
|
* chore: Replace atuin-ai rendering with component-oriented system (#3288)Michelle Tilley2026-03-17
|
* feat: Report distro name with OS for distro-specific commands (#3289)Michelle Tilley2026-03-17
|
* chore(ci): use github for macosEllie Huxtable2026-03-16
|
* chore(release): prepare for release 18.13.3 (#3285)Ellie Huxtable2026-03-16
|\ | | | | | | | | | | | | | | | | | | | | | | <!-- 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: update changelogEllie Huxtable2026-03-16
| |
| * chore(release): prepare for release 18.13.3Ellie Huxtable2026-03-16
|/
* chore: vendor nucleo-ext + fork, so we can depend on our changes properly ↵Ellie Huxtable2026-03-16
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (#3284) We cannot publish to crates.io without specifying a version, and we cannot do that without properly forking nucleo. We're shipping atuin-nucleo, but will likely drop this if we can get our changes upstream. This is highlighted in the README + manifest, and the original author is still included. Originally forked here: https://github.com/atuinsh/nucleo-ext cc @BinaryMuse - this should just be a vendor + restructure, but would appreciate the sanity check ## 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
| * vendor nucleo fork into atuin workspaceEllie Huxtable2026-03-16
| | | | | | | | | | | | | | | | | | | | | | | | 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
| * feat: Add custom filtering and scoring mechanismsMichelle Tilley2026-03-16
| |
| * Update readmeMichelle Tilley2026-03-16
| |
| * bring in base nucleoEllie Huxtable2026-03-16
| |\
| | * Squashed 'crates/atuin-nucleo/' content from commit 4253de9fEllie Huxtable2026-03-16
| | | | | | | | | | git-subtree-dir: crates/atuin-nucleo git-subtree-split: 4253de9faabb4e5c6d81d946a5e35a90f87347ee
| * specify version in all daemon atuin cratesEllie Huxtable2026-03-16
| |
* | feat: Allow headless account ops against Hub server (#3280)Michelle Tilley2026-03-16
| |