{"record":{"id":"b0fd10f75d66044a","repo":"jdx/mise","slug":"is-not-available-required-binary-binary-no","errorCode":null,"errorMessage":"{} is not available: required binary '{binary}' not found; add it to [tools] or install it manually","messagePattern":"(.+?) is not available: required binary '(.+?)' not found; add it to \\[tools\\] or install it manually","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/plugin.rs","lineNumber":231,"sourceCode":"                let mut paths = Self::sync_lookup_path();\n                paths.extend(toolset.list_paths(&config).await);\n                let path =\n                    join_paths(&paths).wrap_err(\"failed to construct package plugin PATH\")?;\n                let mut env: IndexMap<String, String> = crate::env::vars_safe().collect();\n                env.insert(\"PATH\".into(), path.to_string_lossy().into_owned());\n                Ok(env)\n            })\n            .await\n    }\n\n    async fn checked_hook_env(&self) -> Result<&IndexMap<String, String>> {\n        let env = self.hook_env().await?;\n        let paths = env\n            .get(\"PATH\")\n            .map(|path| split_paths(path).collect::<Vec<_>>())\n            .unwrap_or_default();\n        if let Some(binary) = self.missing_from_path(&paths) {\n            bail!(\n                \"{} is not available: required binary '{binary}' not found; add it to [tools] or install it manually\",\n                self.name\n            );\n        }\n        Ok(env)\n    }\n\n    fn requests(pkgs: &[PackageRequest]) -> Vec<VfoxPackageRequest> {\n        pkgs.iter()\n            .map(|pkg| VfoxPackageRequest {\n                name: pkg.name.clone(),\n                version: pkg.version.clone(),\n            })\n            .collect()\n    }\n\n    fn vfox(&self, env: &IndexMap<String, String>) -> Result<vfox::Vfox> {\n        let (mut vfox, _) = self.plugin.vfox()?;","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/plugin.rs#L213-L249","documentation":"A package plugin declares a required binary (its hook needs an external program). checked_hook_env verifies every required binary is on PATH before running hooks, and fails early with a clear message naming the missing binary instead of letting the hook fail opaquely.","triggerScenarios":"Calling action, uninstall_action, or installed when the plugin's required binary is not found in any PATH directory of the hook environment — e.g. the binary isn't declared in [tools] and isn't installed on the system.","commonSituations":"Fresh machine or CI container missing the system binary the plugin depends on; binary installed via mise but shims not on PATH in the hook env; typo in the plugin's required binary name.","solutions":["Add the required binary to the [tools] section of your mise config so mise installs it","Install the binary manually with your system package manager and ensure it is on PATH","Verify with `which <binary>` (in the same shell mise runs in) that it resolves","If the plugin declares the wrong binary name, fix or report the plugin's binary requirement"],"exampleFix":"// before (mise.toml)\n[packages]\nmyplugin:redis-client = \"*\"\n// error: redis-client is not available: required binary 'redis-cli' not found\n// after (mise.toml)\n[tools]\nredis-cli = \"7.4\"\n[packages]\nmyplugin:redis-client = \"*\"","handlingStrategy":"validation","validationCode":"let required = plugin.required_binaries();\nlet missing: Vec<_> = required.iter().filter(|b| which(b).is_err()).collect();\nif !missing.is_empty() { install_tools(missing)?; }","typeGuard":"fn binary_available(bin: &str, paths: &[PathBuf]) -> bool {\n    paths.iter().any(|p| p.join(bin).is_file())\n}","tryCatchPattern":"match plugin.installed(&req).await {\n    Err(e) if e.to_string().contains(\"required binary\") => {\n        let bin = extract_missing_binary(&e)?; install_tool(bin).await?; retry()\n    }\n    other => other,\n}","preventionTips":["Declare every system binary a plugin needs in [tools] in mise.toml","Verify binaries with `which <name>` in the same environment mise runs hooks in","In CI, pre-install plugin-required binaries in the image"],"tags":["missing-binary","path","plugin","dependency"],"backgroundTag":"missing-dependency","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}