jdx/mise · error
is not a mise bin. Perhaps you need to install it first.
Error message
{bin_name} is not a mise bin. Perhaps you need to install it first. What it means
Terminal fallback of `mise which <bin>`: when the bin has no mise shim and no match in the active toolset, mise concludes the binary is simply not managed by mise and bails with this message, suggesting the user install it first.
Solutions
- Add and install the tool: `mise use <tool>@<version>` then retry `mise which <bin>`.
- Verify the binary name spelling; if the binary is system-installed and not mise-managed, use `command -v <bin>` instead.
- Run `mise ls` to confirm the tool is present in the toolset.
Example fix
// before mise which rg # rg not managed by mise // after mise use ripgrep@14 mise which rg
Defensive patterns
Strategy: fallback
Validate before calling
mise ls --json | jq -e --arg b "$bin" 'any(.[]; .active == true)' >/dev/null || echo "$bin not managed by mise"
Try / catch
if ! mise which "$bin" 2>/dev/null; then
command -v "$bin" || { mise use "$tool" && mise which "$bin"; }
fi Prevention
- Only use `mise which` for mise-managed tools; use `command -v` for system binaries
- Double-check binary names (mise which locates binaries, not tool names)
- Add tools to config before trying to locate their binaries
When it happens
Trigger: `mise which <bin>` where `has_shim(&bin_name)` is false and the toolset lookup returned None — the name was never added to any mise config and no shim was generated.
Common situations: Typo in the binary name; using `mise which` for a system binary mise never manages; forgetting to add the tool to mise.toml before locating it.
Related errors
- @ is not installed hint: run `mise install @ `, or `mise ls…
- (dynamic message from…
- refusing to overwrite non-empty directory
- @ is not installed hint: run `mise install @ `, or `mise ls…
- a branch name is required
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/b3730c97a7026f6d.
Report an issue: GitHub.
Appendix: source
Thrown at src/cli/which.rs:87
miseprintln!("{}", path.unwrap().display());
}
Ok(())
}
None => {
if let Some(msg) = self.uninstalled_tool_message(&config, &ts) {
bail!(msg);
}
if let Some(msg) =
crate::shims::unavailable_configured_tool_message(&config, &ts, &bin_name)
{
bail!(msg);
}
if self.has_shim(&bin_name) {
bail!(
"{bin_name} is a mise bin however it is not currently active. Use `mise use` to activate it in this directory."
)
} else {
bail!("{bin_name} is not a mise bin. Perhaps you need to install it first.",)
}
}
}
}
async fn complete(&self, config: &Arc<Config>) -> Result<()> {
let ts = self.get_toolset(config).await?;
let bins = ts
.list_paths(config)
.await
.into_iter()
.flat_map(|p| file::ls(&p).unwrap_or_default())
.map(|p| p.file_name().unwrap().to_string_lossy().to_string())
.unique()
.sorted()
.collect_vec();
for bin in bins {
println!("{bin}");
}View on GitHub (pinned to 533346cc37)