Install Tool
Arguments
$ARGUMENTS
Instructions
1. Identify the Tool
Parse the arguments for tool names and optional versions. If no version is specified, default to @latest.
2. Check If Already Installed
mise which <tool> 2>/dev/null || command -v <tool> 2>/dev/null
If the tool is already available, report its location and version. Stop unless the user explicitly wants a different version.
3. Search the Mise Registry
mise search <tool> mise registry <tool>
- •
mise search— fuzzy-searches the registry for matching tools - •
mise registry <tool>— shows the full backend path (e.g.,core:node,aqua:jqlang/jq)
If no results, check alternate names or ask the user.
4. Choose Scope
CRITICAL: Global installs must happen in dotfiles
Before proceeding, determine if this is a global install:
- •Arguments include
--globalor-g - •User explicitly asks for global install
- •Tool is general-purpose (jq, ripgrep, etc.) and no local
mise.tomlexists
If global install is requested:
- •Check if we're in the chezmoi source directory:
chezmoi_source=$(chezmoi source-path 2>/dev/null) current_dir=$(pwd) # Check if current directory is within chezmoi source directory
- •
If NOT in dotfiles (current dir not within
chezmoi source-path):- •REFUSE the install
- •Tell the user: "Global tool installs must be done from your dotfiles repository to ensure they're tracked and reproducible. Please run
chezmoi cdfirst, then run/install-toolagain." - •Stop execution
- •
If in dotfiles:
- •Proceed with
mise use --global - •This will update
home/dot_config/mise/config.toml(the chezmoi source file) - •Remind user to apply changes:
chezmoi apply ~/.config/mise/config.toml
- •Proceed with
Decision tree for project-local installs:
- •Inside a project directory with
mise.toml→ project-local (default) - •No
mise.tomlexists → create one withmise use <tool>@<version>
5. Preview the Install
Always dry-run first:
mise use --dry-run <tool>@<version>
Report what will be installed and where the config will be written.
6. Execute
# Project-local (default) mise use <tool>@<version> # Global (only from within dotfiles) mise use --global <tool>@<version> # Then apply via chezmoi: chezmoi apply ~/.config/mise/config.toml # Pinned exact version (project-local) mise use --pin <tool>@<version>
After global install, remind the user that the tool is now configured in their dotfiles and will be available everywhere after chezmoi apply.
7. Verify
mise which <tool> <tool> --version # or equivalent
Confirm the tool is available and report the installed version.
When Mise Cannot Provide the Tool
If mise search and mise registry return no results:
- •Stop and tell the user — do not fall back to brew/apt/npm/pipx
- •Suggest alternatives:
- •Check if it's available via a different name
- •Use
ubibackend:mise use ubi:owner/repo - •Use
aquabackend:mise use aqua:owner/repo - •Use language-specific backend (see reference below)
- •If mise truly cannot provide it, ask the user for approval before using any other installer
Mise Discovery Subcommands
| Command | Purpose |
|---|---|
mise search <name> | Fuzzy-search the tool registry |
mise registry <name> | Show full backend path for a tool |
mise registry --backend <be> | List all tools for a specific backend |
mise ls-remote <tool> | List available versions for a tool |
mise ls-remote <tool>@<prefix> | Filter versions by prefix (e.g., node@20) |
mise tool <name> | Show info: backend, installed/active versions, config source |
mise ls | List all installed and active tool versions |
mise backends ls | List all available backends |
Mise Backends Reference
| Backend | Prefix | Installs from | Example |
|---|---|---|---|
| core | core: | Built-in support (node, python, go, etc.) | mise use node@22 |
| aqua | aqua: | aqua registry — GitHub releases | mise use aqua:jqlang/jq |
| asdf | asdf: | asdf plugin ecosystem | mise use asdf:mise-plugins/mise-poetry |
| cargo | cargo: | Rust crates (crates.io) | mise use cargo:ripgrep |
| go | go: | Go modules | mise use go:golang.org/x/tools/gopls |
| npm | npm: | npm packages | mise use npm:prettier |
| pipx | pipx: | Python packages (isolated envs) | mise use pipx:black |
| gem | gem: | Ruby gems | mise use gem:rubocop |
| ubi | ubi: | GitHub releases (universal) | mise use ubi:BurntSushi/ripgrep |
| vfox | vfox: | vfox plugin ecosystem | mise use vfox:version-fox/vfox-node |
| conda | conda: | Conda/mamba packages | mise use conda:scipy |
| dotnet | dotnet: | .NET tools | mise use dotnet:fantomas |
| spm | spm: | Swift packages | mise use spm:nicklockwood/SwiftFormat |
| http | http: | Direct URL download | mise use http:https://example.com/tool.tar.gz |
Backend Selection Guide
- •Check
mise searchfirst — most tools have a default backend - •Core for major languages (node, python, ruby, go, java, etc.)
- •Aqua for most CLI tools distributed as GitHub releases
- •npm/pipx/cargo/go/gem for language-ecosystem packages
- •ubi as a fallback for any GitHub release not in aqua
Examples
/install-tool jq → search, preview, install jq /install-tool node@22 → install Node.js 22.x /install-tool --global ripgrep → install ripgrep globally /install-tool terraform jq go → install multiple tools /install-tool cargo:stylua → install via cargo backend /install-tool ubi:BurntSushi/ripgrep → install via ubi backend