fix(env): clear fish completions when setting/unsetting shell aliases#8324
fix(env): clear fish completions when setting/unsetting shell aliases#8324
Conversation
Fish's `alias` command internally creates completion entries via
`--wraps`. When mise removed an alias with `functions -e`, those
completions were left behind. Similarly, when creating an alias, any
pre-existing completions for that name could conflict.
Add `complete -e {name}` to both set_alias and unset_alias in the fish
shell implementation to properly manage completions.
Fixes #8322
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary of ChangesHello @jdx, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request addresses an issue with Fish shell alias completions by modifying how aliases are set and unset. It ensures that Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
The pull request correctly addresses the issue of stale or leaked fish shell completions when managing aliases. By adding complete -e {name} before setting or unsetting an alias, it ensures that any existing completions (including those inherited via --wraps) are cleared, allowing the new alias definition to correctly establish its own completions. The implementation follows existing patterns in the codebase, uses proper shell escaping, and includes a robust e2e test to verify the fix.
There was a problem hiding this comment.
Pull request overview
This PR fixes a fish shell-specific issue where completions leak when shell aliases are dynamically managed by mise. The fix adds complete -e {name} commands to clear stale completions before setting or unsetting aliases.
Changes:
- Add
complete -e {name}beforealiascommand in fishset_aliasto clear stale completions - Add
complete -e {name}beforefunctions -ein fishunset_aliasto clean up leaked completions - Add fish-specific e2e test to verify completion cleanup on both set and unset operations
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/shell/fish.rs | Modified set_alias and unset_alias to include complete -e commands for clearing fish shell completions |
| e2e/cli/test_shell_alias_fish.fish | Added new e2e test verifying that complete -e is emitted when setting and unsetting shell aliases in fish |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Hyperfine Performance
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.19 x -- echo |
25.3 ± 0.3 | 24.8 | 28.0 | 1.00 |
mise x -- echo |
25.8 ± 0.4 | 25.0 | 32.5 | 1.02 ± 0.02 |
mise env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.19 env |
24.1 ± 0.5 | 23.5 | 29.3 | 1.00 |
mise env |
24.5 ± 0.4 | 23.8 | 26.0 | 1.02 ± 0.03 |
mise hook-env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.19 hook-env |
24.8 ± 0.3 | 24.2 | 26.3 | 1.00 |
mise hook-env |
25.2 ± 0.3 | 24.4 | 26.2 | 1.02 ± 0.02 |
mise ls
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.2.19 ls |
22.0 ± 0.2 | 21.5 | 22.8 | 1.00 |
mise ls |
22.5 ± 0.3 | 21.9 | 25.9 | 1.02 ± 0.02 |
xtasks/test/perf
| Command | mise-2026.2.19 | mise | Variance |
|---|---|---|---|
| install (cached) | 130ms | 133ms | -2% |
| ls (cached) | 80ms | 80ms | +0% |
| bin-paths (cached) | 84ms | 85ms | -1% |
| task-ls (cached) | 784ms | 790ms | +0% |
### 🚀 Features - **(conda)** replace custom backend with rattler crates by @jdx in [#8325](#8325) - **(task)** enforce per-task timeout configuration by @tvararu in [#8250](#8250) - **(vsix)** added vsix archives to http backend by @sosumappu in [#8306](#8306) - add core dotnet plugin for .NET SDK management by @jdx in [#8326](#8326) ### 🐛 Bug Fixes - **(conda)** preserve conda_packages on locked install and fix temp file race by @jdx in [#8335](#8335) - **(conda)** deduplicate repodata records to fix solver error on Linux by @jdx in [#8337](#8337) - **(env)** include watch_files in fast-path early exit check by @jdx in [#8317](#8317) - **(env)** clear fish completions when setting/unsetting shell aliases by @jdx in [#8324](#8324) - **(lockfile)** prevent lockfile writes when --locked is set by @jdx in [#8308](#8308) - **(lockfile)** prune orphan tool entries on mise lock by @mackwic in [#8265](#8265) - **(lockfile)** error on contradictory locked=true + lockfile=false config by @jdx in [#8329](#8329) - **(regal)** Update package location by @charlieegan3 in [#8315](#8315) - **(release)** strip markdown heading prefix from communique release title by @jdx in [#8303](#8303) - **(schema)** enforce additionalProperties constraint for env by @adamliang0 in [#8328](#8328) ### 📚 Documentation - Remove incorrect oh-my-zsh plugin ordering comment by @bvosk in [#8323](#8323) - require AI disclosure on GitHub comments by @jdx in [#8330](#8330) ### 📦 Registry - add `oxfmt` by @taoufik07 in [#8316](#8316) ### New Contributors - @adamliang0 made their first contribution in [#8328](#8328) - @tvararu made their first contribution in [#8250](#8250) - @bvosk made their first contribution in [#8323](#8323) - @taoufik07 made their first contribution in [#8316](#8316) - @charlieegan3 made their first contribution in [#8315](#8315) - @sosumappu made their first contribution in [#8306](#8306) ## 📦 Aqua Registry Updates #### New Packages (3) - [`Tyrrrz/FFmpegBin`](https://github.com/Tyrrrz/FFmpegBin) - [`elixir-lang/expert`](https://github.com/elixir-lang/expert) - [`erikjuhani/basalt`](https://github.com/erikjuhani/basalt) #### Updated Packages (5) - [`caarlos0/fork-cleaner`](https://github.com/caarlos0/fork-cleaner) - [`firecow/gitlab-ci-local`](https://github.com/firecow/gitlab-ci-local) - [`jackchuka/mdschema`](https://github.com/jackchuka/mdschema) - [`kunobi-ninja/kunobi-releases`](https://github.com/kunobi-ninja/kunobi-releases) - [`peco/peco`](https://github.com/peco/peco)
…jdx#8324) ## Summary - Add `complete -e {name}` before `alias` in fish `set_alias` to clear stale completions - Add `complete -e {name}` before `functions -e` in fish `unset_alias` to clean up leaked completions - Add fish e2e test for alias completion management Fixes jdx#8322 ## Test plan - [x] Existing `test_shell_alias` e2e tests pass (bash) - [x] New `test_shell_alias_fish.fish` e2e test verifies `complete -e` is emitted on both set and unset - [x] Unit tests pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Fish-only shell hook output changes plus an e2e test; low blast radius but could affect users relying on custom fish completions for alias names. > > **Overview** > Updates fish alias management to proactively clear any existing completions for the alias name by emitting `complete -e {name}` before both setting (`alias ...`) and unsetting (`functions -e ...`) an alias. > > Adds a new fish e2e test (`test_shell_alias_fish.fish`) that asserts `mise hook-env -s fish --force` includes the completion cleanup lines on alias creation and removal, preventing stale/leaked completions across config changes. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 79eb19a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
### 🚀 Features - **(conda)** replace custom backend with rattler crates by @jdx in [jdx#8325](jdx#8325) - **(task)** enforce per-task timeout configuration by @tvararu in [jdx#8250](jdx#8250) - **(vsix)** added vsix archives to http backend by @sosumappu in [jdx#8306](jdx#8306) - add core dotnet plugin for .NET SDK management by @jdx in [jdx#8326](jdx#8326) ### 🐛 Bug Fixes - **(conda)** preserve conda_packages on locked install and fix temp file race by @jdx in [jdx#8335](jdx#8335) - **(conda)** deduplicate repodata records to fix solver error on Linux by @jdx in [jdx#8337](jdx#8337) - **(env)** include watch_files in fast-path early exit check by @jdx in [jdx#8317](jdx#8317) - **(env)** clear fish completions when setting/unsetting shell aliases by @jdx in [jdx#8324](jdx#8324) - **(lockfile)** prevent lockfile writes when --locked is set by @jdx in [jdx#8308](jdx#8308) - **(lockfile)** prune orphan tool entries on mise lock by @mackwic in [jdx#8265](jdx#8265) - **(lockfile)** error on contradictory locked=true + lockfile=false config by @jdx in [jdx#8329](jdx#8329) - **(regal)** Update package location by @charlieegan3 in [jdx#8315](jdx#8315) - **(release)** strip markdown heading prefix from communique release title by @jdx in [jdx#8303](jdx#8303) - **(schema)** enforce additionalProperties constraint for env by @adamliang0 in [jdx#8328](jdx#8328) ### 📚 Documentation - Remove incorrect oh-my-zsh plugin ordering comment by @bvosk in [jdx#8323](jdx#8323) - require AI disclosure on GitHub comments by @jdx in [jdx#8330](jdx#8330) ### 📦 Registry - add `oxfmt` by @taoufik07 in [jdx#8316](jdx#8316) ### New Contributors - @adamliang0 made their first contribution in [jdx#8328](jdx#8328) - @tvararu made their first contribution in [jdx#8250](jdx#8250) - @bvosk made their first contribution in [jdx#8323](jdx#8323) - @taoufik07 made their first contribution in [jdx#8316](jdx#8316) - @charlieegan3 made their first contribution in [jdx#8315](jdx#8315) - @sosumappu made their first contribution in [jdx#8306](jdx#8306) ## 📦 Aqua Registry Updates #### New Packages (3) - [`Tyrrrz/FFmpegBin`](https://github.com/Tyrrrz/FFmpegBin) - [`elixir-lang/expert`](https://github.com/elixir-lang/expert) - [`erikjuhani/basalt`](https://github.com/erikjuhani/basalt) #### Updated Packages (5) - [`caarlos0/fork-cleaner`](https://github.com/caarlos0/fork-cleaner) - [`firecow/gitlab-ci-local`](https://github.com/firecow/gitlab-ci-local) - [`jackchuka/mdschema`](https://github.com/jackchuka/mdschema) - [`kunobi-ninja/kunobi-releases`](https://github.com/kunobi-ninja/kunobi-releases) - [`peco/peco`](https://github.com/peco/peco)
Summary
complete -e {name}beforealiasin fishset_aliasto clear stale completionscomplete -e {name}beforefunctions -ein fishunset_aliasto clean up leaked completionsFixes #8322
Test plan
test_shell_aliase2e tests pass (bash)test_shell_alias_fish.fishe2e test verifiescomplete -eis emitted on both set and unset🤖 Generated with Claude Code
Note
Low Risk
Fish-only shell hook output changes plus an e2e test; low blast radius but could affect users relying on custom fish completions for alias names.
Overview
Updates fish alias management to proactively clear any existing completions for the alias name by emitting
complete -e {name}before both setting (alias ...) and unsetting (functions -e ...) an alias.Adds a new fish e2e test (
test_shell_alias_fish.fish) that assertsmise hook-env -s fish --forceincludes the completion cleanup lines on alias creation and removal, preventing stale/leaked completions across config changes.Written by Cursor Bugbot for commit 79eb19a. This will update automatically on new commits. Configure here.