name: install-tool description: "Use when a tool, CLI, or package is needed but not installed, or when the user asks to install/add a tool. Prefers mise for all installations." argument-hint: "[tool[@version] | package-name...]" model: haiku allowed-tools:
- Bash(mise search:*)
- Bash(mise registry:*)
- Bash(mise ls-remote:*)
- Bash(mise tool:*)
- Bash(mise ls:*)
- Bash(mise backends:*)
- Bash(mise use --dry-run:*)
- Bash(mise which:*)
- Bash(which:*)
- Bash(command -v:*)
- Bash(chezmoi source-path:*)
- Bash(pwd:*)
- Bash(realpath:*)
- Read
- Glob
- Grep
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 toolsmise 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