feat(activate): add shims directory as fallback when auto-install is enabled#8106
feat(activate): add shims directory as fallback when auto-install is enabled#8106
Conversation
Summary of ChangesHello @ctaintor, 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 enhances the Highlights
Changelog
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.
Pull request overview
Adds the shims directory to PATH (as a fallback, after installed tool paths) when not_found_auto_install is enabled, ensuring shims can trigger auto-install and avoid accidentally running unmanaged system binaries.
Changes:
- Append shims dir to tool
PATHentries whennot_found_auto_installis true. - Add an e2e test validating shims are present/ordered and disabled when the setting is false.
- Update an existing e2e activation test to reflect the new
PATHlayout.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/toolset/toolset_paths.rs | Appends shims directory to tool paths when auto-install is enabled. |
| e2e/cli/test_shims_fallback | New e2e test covering shims presence, ordering, and opt-out behavior. |
| e2e/cli/test_activate_aggressive | Updates expected PATH output to include shims as fallback. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
src/toolset/toolset_paths.rs
Outdated
| if Settings::get().not_found_auto_install { | ||
| let shims_dir = dirs::SHIMS.to_path_buf(); | ||
| if !tool_paths.contains(&shims_dir) { | ||
| tool_paths.push(shims_dir); | ||
| } | ||
| } |
There was a problem hiding this comment.
This method already takes a &Config, but the new behavior is gated by global Settings::get(). That mixes per-config behavior with global state and can make the resulting PATH depend on ambient settings rather than the provided config. Prefer reading the flag from config (if available) or pass the resolved boolean into this function so the result is deterministic and easier to test.
e2e/cli/test_shims_fallback
Outdated
| # Shims should be in PATH with not_found_auto_install=true (default) | ||
| assert "[[ \"\$PATH\" == *\"$SHIMS_DIR\"* ]]" | ||
|
|
||
| # Shims should come after installed tool paths | ||
| DUMMY_PATH="$MISE_DATA_DIR/installs/dummy/1.0.0/bin" | ||
| DUMMY_POS=$(echo "$PATH" | tr ':' '\n' | grep -n "$DUMMY_PATH" | head -1 | cut -d: -f1) | ||
| SHIMS_POS=$(echo "$PATH" | tr ':' '\n' | grep -n "$SHIMS_DIR" | head -1 | cut -d: -f1) | ||
| assert "[[ $SHIMS_POS -gt $DUMMY_POS ]]" |
There was a problem hiding this comment.
This test validates presence and ordering of the shims dir in PATH, but it doesn't exercise the key behavior described in the PR: that the shim is actually used as a fallback to (a) trigger auto-install when the requested version isn't installed, and (b) avoid running an unmanaged system binary. Consider extending the e2e to run a command that must resolve via the shim (e.g., a tool with an existing shim but missing requested version) and assert that mise performs/attempts the auto-install rather than executing a system-provided binary.
e2e/cli/test_shims_fallback
Outdated
| # Shims should NOT be in PATH with not_found_auto_install=false | ||
| export MISE_NOT_FOUND_AUTO_INSTALL=false | ||
| eval "$(mise hook-env --force)" | ||
| assert "[[ \"\$PATH\" != *\"$SHIMS_DIR\"* ]]" |
There was a problem hiding this comment.
This test exports MISE_NOT_FOUND_AUTO_INSTALL=false but doesn't restore the previous value. If the e2e harness executes multiple tests in the same process/session, this can leak state into later tests. Consider saving the prior value and restoring it (or unsetting it) at the end of the test.
| # Shims should NOT be in PATH with not_found_auto_install=false | |
| export MISE_NOT_FOUND_AUTO_INSTALL=false | |
| eval "$(mise hook-env --force)" | |
| assert "[[ \"\$PATH\" != *\"$SHIMS_DIR\"* ]]" | |
| # Shims should NOT be in PATH with not_found_auto_install=false | |
| OLD_MISE_NOT_FOUND_AUTO_INSTALL="${MISE_NOT_FOUND_AUTO_INSTALL-__MISE_UNSET__}" | |
| export MISE_NOT_FOUND_AUTO_INSTALL=false | |
| eval "$(mise hook-env --force)" | |
| assert "[[ \"\$PATH\" != *\"$SHIMS_DIR\"* ]]" | |
| # Restore previous MISE_NOT_FOUND_AUTO_INSTALL value to avoid leaking state | |
| if [ "$OLD_MISE_NOT_FOUND_AUTO_INSTALL" = "__MISE_UNSET__" ]; then | |
| unset MISE_NOT_FOUND_AUTO_INSTALL | |
| else | |
| export MISE_NOT_FOUND_AUTO_INSTALL="$OLD_MISE_NOT_FOUND_AUTO_INSTALL" | |
| fi |
There was a problem hiding this comment.
Code Review
This pull request enhances the auto-install feature by adding the shims directory to the PATH as a fallback. This is a great improvement that makes auto-installation more reliable, especially in subshells or when system-installed tools conflict with mise-managed versions. The implementation in toolset_paths.rs is clean and correct, and the new and updated e2e tests provide good coverage for the new behavior.
I have one suggestion to improve the robustness of the new test script e2e/cli/test_shims_fallback to prevent potential syntax errors during test execution.
e2e/cli/test_shims_fallback
Outdated
| DUMMY_POS=$(echo "$PATH" | tr ':' '\n' | grep -n "$DUMMY_PATH" | head -1 | cut -d: -f1) | ||
| SHIMS_POS=$(echo "$PATH" | tr ':' '\n' | grep -n "$SHIMS_DIR" | head -1 | cut -d: -f1) | ||
| assert "[[ $SHIMS_POS -gt $DUMMY_POS ]]" |
There was a problem hiding this comment.
This check for path ordering can be made more robust.
- If
grepdoesn't find a match, the position variable will be empty, leading to a syntax error in theassertcommand (e.g.,[[ 10 -gt ]]). This can make debugging test failures tricky. - Using
grep -nwithout-xor-Fcould lead to partial matches if a path happens to be a substring of another.
I suggest using grep -nFx for an exact, full-line match, and combining the presence and order checks into a single assertion. This prevents syntax errors and makes the test more reliable.
DUMMY_POS=$(echo "$PATH" | tr ':' '\n' | grep -nFx "$DUMMY_PATH" | cut -d: -f1)
SHIMS_POS=$(echo "$PATH" | tr ':' '\n' | grep -nFx "$SHIMS_DIR" | cut -d: -f1)
assert "[[ -n \"$DUMMY_POS\" && -n \"$SHIMS_POS\" && $SHIMS_POS -gt $DUMMY_POS ]]"
|
bugbot run |
jdx
left a comment
There was a problem hiding this comment.
Note
This review was AI-generated using Claude Code.
Key concern: should this add shims or just not remove them?
The current flow is:
mise activatecallsremove_shims()(src/cli/activate.rs:105) which strips the shims dir from PATH if presentPathEnv::from_iter(src/path_env.rs:62) also strips shims when it sees them- This PR then re-adds shims in
list_final_paths_splitas a "tool path"
This is working against the existing design rather than with it. The simpler and more correct approach would be: just don't remove shims from PATH when not_found_auto_install is true.
Specific concerns:
1. Conflicts with mise doctor diagnostics (src/cli/doctor/mod.rs:75-76)
mise doctor warns: "shims are on PATH and mise is also activated. You should only use one of these methods." This PR would cause that warning to fire for every default user, since shims would always be on PATH when activated with the default not_found_auto_install=true.
2. Round-tripping shims removal + re-addition is fragile
The activate script removes shims from PATH at shell init time (remove_shims() at activate.rs:154), then every hook-env re-adds them via the toolset paths. This means there's a brief window between activation and the first hook-env where shims aren't available. And the two pieces of code aren't aware of each other — they just happen to cancel out.
3. Shims end up classified as "tool paths" subject to dedup filtering
In build_path_operations (hook_env.rs:299), tool paths are filtered against __MISE_ORIG_PATH. If shims were in the original PATH before activation, they'd be filtered out of tool_paths, then... also removed from orig_path by PathEnv. The shims could disappear entirely.
4. Simpler alternative: just preserve shims
Instead of the add-back in toolset_paths.rs, modify remove_shims() in activate.rs and PathEnv::from_iter in path_env.rs to not strip shims when not_found_auto_install is true. The shims would naturally stay in their original position in PATH (likely after tool paths, since users typically put mise activate after adding shims). This is less code, fewer moving parts, and respects the user's original PATH ordering.
5. Test coverage gap
The new test_shims_fallback test installs dummy@1.0.0 and configures tiny = "3.0.0", but never actually tests that running a shim for an uninstalled tool triggers auto-install. It only checks PATH ordering. The core value proposition (subshells auto-installing missing tools) isn't verified.
Minor nits
e2e/cli/test_shims_fallback:14—tiny = "3.0.0"is configured but never used in the test- The
!tool_paths.contains(&shims_dir)guard is good butcontainsonVec<PathBuf>won't catch canonical vs non-canonical duplicates (the same issue thatbuild_path_operationshandles with explicit canonicalization)
Recommendation
The "just don't remove shims" approach would be:
- In
remove_shims(): skip removal whenSettings::get().not_found_auto_installis true - In
PathEnv::from_iter: same condition — don't strip shims - Update the
mise doctorcheck to not warn when this is the intended behavior - No changes needed in
toolset_paths.rs
|
i agree your suggestion is much cleaner 😅 . Will come back with the suggestions |
|
OK – I made those changes. I agree it's cleaner. I don't think it solves one issue though – but maybe you don't want to address that. I am using shims – so I can't say what the hook'd user's expectation is. I believe that the hook'd mise will only install tools based on a tool not being found. This behavior is preserved by changing to "only stop removing shims." In other words, hook'd mise won't try to install a missing tool if the tool is present in the PATH already. WIth this change, a user could have that experience if they manually added shims to their PATH before activating hook'd mise. (Also, I might be misunderstanding how mise works!) |
Instead of removing shims and re-adding them, simply preserve shims in their original PATH position when not_found_auto_install is true (default). This allows shims to trigger auto-install for uninstalled tools. Changes: - activate.rs: skip shim removal when not_found_auto_install is true - path_env.rs: preserve shims when not_found_auto_install is true - doctor: don't warn about shims+activate when this is intentional Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
### 🚀 Features - **(activate)** add shims directory as fallback when auto-install is enabled by @ctaintor in [#8106](#8106) - **(env)** add `tools` variable to tera template context by @jdx in [#8108](#8108) - **(set)** add --stdin flag for multiline environment variables by @jdx in [#8110](#8110) ### 🐛 Bug Fixes - **(backend)** improve conda patchelf and dependency resolution for complex packages by @jdx in [#8087](#8087) - **(ci)** fix validate-new-tools grep pattern for test field by @jdx in [#8100](#8100) - **(config)** make MISE_OFFLINE work correctly by gracefully skipping network calls by @jdx in [#8109](#8109) - **(github)** skip v prefix for "latest" version by @jdx in [#8105](#8105) - **(gitlab)** resolve tool options from config for aliased tools by @jdx in [#8084](#8084) - **(install)** use version_expr for Flutter to fix version resolution by @jdx in [#8081](#8081) - **(registry)** add Linux support for tuist by @fortmarek in [#8102](#8102) - **(release)** write release notes to file instead of capturing stdout by @jdx in [#8086](#8086) - **(upgrade)** tools are not uninstalled properly due to outdated symlink by @roele in [#8099](#8099) - **(upgrade)** ensure uninstallation failure does not leave invalid symlinks by @roele in [#8101](#8101) - SLSA for in-toto statement with no signatures by @gerhard in [#8094](#8094) - Vfox Plugin Auto-Installation for Environment Directives by @pose in [#8035](#8035) ### 📚 Documentation - use mise activate for PowerShell in getting-started by @rileychh in [#8112](#8112) ### 📦 Registry - add conda backend for mysql by @jdx in [#8080](#8080) - add conda backends for 10 asdf-only tools by @jdx in [#8083](#8083) - added podman-tui by @tony-sol in [#8098](#8098) ### Chore - sort settings.toml alphabetically and add test by @jdx in [#8111](#8111) ### New Contributors - @ctaintor made their first contribution in [#8106](#8106) - @rileychh made their first contribution in [#8112](#8112) - @fortmarek made their first contribution in [#8102](#8102) - @pose made their first contribution in [#8035](#8035) - @gerhard made their first contribution in [#8094](#8094) ## 📦 Aqua Registry Updates #### New Packages (2) - [`entireio/cli`](https://github.com/entireio/cli) - [`rmitchellscott/reManager`](https://github.com/rmitchellscott/reManager) #### Updated Packages (1) - [`atuinsh/atuin`](https://github.com/atuinsh/atuin)
### 🚀 Features - **(activate)** add shims directory as fallback when auto-install is enabled by @ctaintor in [#8106](#8106) - **(env)** add `tools` variable to tera template context by @jdx in [#8108](#8108) - **(set)** add --stdin flag for multiline environment variables by @jdx in [#8110](#8110) ### 🐛 Bug Fixes - **(backend)** improve conda patchelf and dependency resolution for complex packages by @jdx in [#8087](#8087) - **(ci)** fix validate-new-tools grep pattern for test field by @jdx in [#8100](#8100) - **(config)** make MISE_OFFLINE work correctly by gracefully skipping network calls by @jdx in [#8109](#8109) - **(github)** skip v prefix for "latest" version by @jdx in [#8105](#8105) - **(gitlab)** resolve tool options from config for aliased tools by @jdx in [#8084](#8084) - **(install)** use version_expr for Flutter to fix version resolution by @jdx in [#8081](#8081) - **(registry)** add Linux support for tuist by @fortmarek in [#8102](#8102) - **(release)** write release notes to file instead of capturing stdout by @jdx in [#8086](#8086) - **(upgrade)** tools are not uninstalled properly due to outdated symlink by @roele in [#8099](#8099) - **(upgrade)** ensure uninstallation failure does not leave invalid symlinks by @roele in [#8101](#8101) - SLSA for in-toto statement with no signatures by @gerhard in [#8094](#8094) - Vfox Plugin Auto-Installation for Environment Directives by @pose in [#8035](#8035) ### 📚 Documentation - use mise activate for PowerShell in getting-started by @rileychh in [#8112](#8112) ### 📦 Registry - add conda backend for mysql by @jdx in [#8080](#8080) - add conda backends for 10 asdf-only tools by @jdx in [#8083](#8083) - added podman-tui by @tony-sol in [#8098](#8098) ### Chore - sort settings.toml alphabetically and add test by @jdx in [#8111](#8111) ### New Contributors - @ctaintor made their first contribution in [#8106](#8106) - @rileychh made their first contribution in [#8112](#8112) - @fortmarek made their first contribution in [#8102](#8102) - @pose made their first contribution in [#8035](#8035) - @gerhard made their first contribution in [#8094](#8094) ## 📦 Aqua Registry Updates #### New Packages (2) - [`entireio/cli`](https://github.com/entireio/cli) - [`rmitchellscott/reManager`](https://github.com/rmitchellscott/reManager) #### Updated Packages (1) - [`atuinsh/atuin`](https://github.com/atuinsh/atuin)
## 問題 Ghostty / VSCode で dotfiles ディレクトリを開くと以下のエラーが発生: ``` mise ERROR no tasks defined in ~/repos/github.com/tak848/dotfiles. Are you in a project directory? error: unexpected argument '--zsh' found error: unexpected argument '--completion' found ``` ## 根本原因 ### 1. 残骸 shim PR #322 (`89aa3f1`, Jan 5) で zoxide を mise → aqua CLI に移行した際、 `~/.local/share/mise/shims/zoxide` と `~/.local/share/mise/installs/aqua-ajeetdsouza-zoxide/0.9.8/` が残った。 `mise reshim` は「インストール済みの全ツール」から shim を生成するため、インストールディレクトリが残っている限り shim が再生成され続けていた。 → `mise uninstall aqua:ajeetdsouza/zoxide@0.9.8` で別途解消済み ### 2. mise v2026.2.10 の "Shims as PATH fallback" 変更 [PR jdx/mise#8106](jdx/mise#8106) により、`auto_install`(`not_found_auto_install`)有効時、 `mise activate zsh` が shims ディレクトリを PATH から除去しなくなった。 この変更の意図: - サブシェルで未インストールツールの auto-install が発動しない問題の修正 - mise 未インストールでもシステムの同名コマンドが誤って使われる問題の修正 **v2026.2.9 以前**: `mise activate zsh` は `.zprofile` の `mise activate zsh --shims` で追加された shims を PATH から明示的に除去していた **v2026.2.10 以降**: shims が PATH にフォールバックとして残る `diff <(mise-2026.2.9 activate zsh) <(mise-2026.2.11 activate zsh)` で確認: v2026.2.9 にあった shims 除去の `export PATH=...` 行が v2026.2.11 で削除されている。 ### エラー発生の流れ ``` .zprofile: mise activate zsh --shims → PATH に shims を追加 .zshrc: mise activate zsh v2026.2.9以前 → shims を PATH から除去 → zoxide は aqua バイナリに解決 ✅ v2026.2.10以降 → shims が PATH に残る → 残骸 shim が aqua より先にヒット ❌ .zshrc: eval "$(zoxide init zsh)" → ~/.local/share/mise/shims/zoxide(残骸 shim)が実行される → shim → bootstrap → exec mise init zsh → "init" はサブコマンドでなく experimental=true でタスク名として解釈 → "no tasks defined" エラー ``` ### shims フォールバックの設計上の問題 `mise reshim` は config で active でないインストール済みツール全ての shim も生成する。 v2026.2.10 以降、activate 時に shims が PATH フォールバックとして残る仕様になったため、 mise 管理から別ツール管理に移行したツールで古い shim が本物のバイナリより先にヒットし得る。 ## 修正 `.mise.toml` の `auto_install` を `true` → `false` に変更。 - `auto_install = false` にすることで shims フォールバックが無効化され、従来の shims 除去挙動に戻る - グローバル config (`~/.config/mise/config.toml`) も `auto_install = false` であり、プロジェクト config のみ `true` だった ## 検証 `MISE_AUTO_INSTALL=false mise activate zsh` の出力で shims 除去行の復活を確認済み。 `zsh -l -i -c 'exit' 2>&1` → mise エラーなし ## 関連リンク - [mise v2026.2.10 リリースノート](https://github.com/jdx/mise/releases/tag/v2026.2.10) - [PR jdx/mise#8106: feat(activate): add shims directory as fallback when auto-install is enabled](jdx/mise#8106) - PR #322: zoxide を mise → aqua CLI に移行 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…enabled (jdx#8106) When not_found_auto_install is true (default), the shims directory is now added to PATH after tool installation paths. This allows shims to handle tools that aren't installed yet (triggering auto-install) and tools that exist on the system but aren't managed by mise. This solves address two unexpected behaviors of auto_install: 1. Subshells would launch only modifying the PATH to point to _installed and with the correct version_ tools. You could find yourself in a situation where e.g. the correct node version is installed but the correct ruby version is _not_ installed – and if yarn called bundler/ruby then it would not trigger the install. 2. relying on the not-found hook meant that the wrong version would be run if the version wasn't installed in mise but did exist in the system This change makes the shim be a fallback – meaning that as long as you've installed _any_ version of that tool (and thus mise has created a shim), mise will install the intended version when requested. Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
### 🚀 Features - **(activate)** add shims directory as fallback when auto-install is enabled by @ctaintor in [jdx#8106](jdx#8106) - **(env)** add `tools` variable to tera template context by @jdx in [jdx#8108](jdx#8108) - **(set)** add --stdin flag for multiline environment variables by @jdx in [jdx#8110](jdx#8110) ### 🐛 Bug Fixes - **(backend)** improve conda patchelf and dependency resolution for complex packages by @jdx in [jdx#8087](jdx#8087) - **(ci)** fix validate-new-tools grep pattern for test field by @jdx in [jdx#8100](jdx#8100) - **(config)** make MISE_OFFLINE work correctly by gracefully skipping network calls by @jdx in [jdx#8109](jdx#8109) - **(github)** skip v prefix for "latest" version by @jdx in [jdx#8105](jdx#8105) - **(gitlab)** resolve tool options from config for aliased tools by @jdx in [jdx#8084](jdx#8084) - **(install)** use version_expr for Flutter to fix version resolution by @jdx in [jdx#8081](jdx#8081) - **(registry)** add Linux support for tuist by @fortmarek in [jdx#8102](jdx#8102) - **(release)** write release notes to file instead of capturing stdout by @jdx in [jdx#8086](jdx#8086) - **(upgrade)** tools are not uninstalled properly due to outdated symlink by @roele in [jdx#8099](jdx#8099) - **(upgrade)** ensure uninstallation failure does not leave invalid symlinks by @roele in [jdx#8101](jdx#8101) - SLSA for in-toto statement with no signatures by @gerhard in [jdx#8094](jdx#8094) - Vfox Plugin Auto-Installation for Environment Directives by @pose in [jdx#8035](jdx#8035) ### 📚 Documentation - use mise activate for PowerShell in getting-started by @rileychh in [jdx#8112](jdx#8112) ### 📦 Registry - add conda backend for mysql by @jdx in [jdx#8080](jdx#8080) - add conda backends for 10 asdf-only tools by @jdx in [jdx#8083](jdx#8083) - added podman-tui by @tony-sol in [jdx#8098](jdx#8098) ### Chore - sort settings.toml alphabetically and add test by @jdx in [jdx#8111](jdx#8111) ### New Contributors - @ctaintor made their first contribution in [jdx#8106](jdx#8106) - @rileychh made their first contribution in [jdx#8112](jdx#8112) - @fortmarek made their first contribution in [jdx#8102](jdx#8102) - @pose made their first contribution in [jdx#8035](jdx#8035) - @gerhard made their first contribution in [jdx#8094](jdx#8094) ## 📦 Aqua Registry Updates #### New Packages (2) - [`entireio/cli`](https://github.com/entireio/cli) - [`rmitchellscott/reManager`](https://github.com/rmitchellscott/reManager) #### Updated Packages (1) - [`atuinsh/atuin`](https://github.com/atuinsh/atuin)
### 🚀 Features - **(activate)** add shims directory as fallback when auto-install is enabled by @ctaintor in [jdx#8106](jdx#8106) - **(env)** add `tools` variable to tera template context by @jdx in [jdx#8108](jdx#8108) - **(set)** add --stdin flag for multiline environment variables by @jdx in [jdx#8110](jdx#8110) ### 🐛 Bug Fixes - **(backend)** improve conda patchelf and dependency resolution for complex packages by @jdx in [jdx#8087](jdx#8087) - **(ci)** fix validate-new-tools grep pattern for test field by @jdx in [jdx#8100](jdx#8100) - **(config)** make MISE_OFFLINE work correctly by gracefully skipping network calls by @jdx in [jdx#8109](jdx#8109) - **(github)** skip v prefix for "latest" version by @jdx in [jdx#8105](jdx#8105) - **(gitlab)** resolve tool options from config for aliased tools by @jdx in [jdx#8084](jdx#8084) - **(install)** use version_expr for Flutter to fix version resolution by @jdx in [jdx#8081](jdx#8081) - **(registry)** add Linux support for tuist by @fortmarek in [jdx#8102](jdx#8102) - **(release)** write release notes to file instead of capturing stdout by @jdx in [jdx#8086](jdx#8086) - **(upgrade)** tools are not uninstalled properly due to outdated symlink by @roele in [jdx#8099](jdx#8099) - **(upgrade)** ensure uninstallation failure does not leave invalid symlinks by @roele in [jdx#8101](jdx#8101) - SLSA for in-toto statement with no signatures by @gerhard in [jdx#8094](jdx#8094) - Vfox Plugin Auto-Installation for Environment Directives by @pose in [jdx#8035](jdx#8035) ### 📚 Documentation - use mise activate for PowerShell in getting-started by @rileychh in [jdx#8112](jdx#8112) ### 📦 Registry - add conda backend for mysql by @jdx in [jdx#8080](jdx#8080) - add conda backends for 10 asdf-only tools by @jdx in [jdx#8083](jdx#8083) - added podman-tui by @tony-sol in [jdx#8098](jdx#8098) ### Chore - sort settings.toml alphabetically and add test by @jdx in [jdx#8111](jdx#8111) ### New Contributors - @ctaintor made their first contribution in [jdx#8106](jdx#8106) - @rileychh made their first contribution in [jdx#8112](jdx#8112) - @fortmarek made their first contribution in [jdx#8102](jdx#8102) - @pose made their first contribution in [jdx#8035](jdx#8035) - @gerhard made their first contribution in [jdx#8094](jdx#8094) ## 📦 Aqua Registry Updates #### New Packages (2) - [`entireio/cli`](https://github.com/entireio/cli) - [`rmitchellscott/reManager`](https://github.com/rmitchellscott/reManager) #### Updated Packages (1) - [`atuinsh/atuin`](https://github.com/atuinsh/atuin)
When not_found_auto_install is true (default), the shims directory is now added to PATH after tool installation paths. This allows shims to handle tools that aren't installed yet (triggering auto-install) and tools that exist on the system but aren't managed by mise.
This solves address two unexpected behaviors of auto_install:
This change makes the shim be a fallback – meaning that as long as you've installed any version of that tool (and thus mise has created a shim), mise will install the intended version when requested.