{"record":{"id":"14b94d1b087449f3","repo":"jdx/mise","slug":"remote-host-cannot-combine-install-mise-with","errorCode":null,"errorMessage":"remote host '{}' cannot combine install_mise with remote_mise or bootstrap_command, which already provide mise on the host","messagePattern":"remote host '(.+?)' cannot combine install_mise with remote_mise or bootstrap_command, which already provide mise on the host","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/remote.rs","lineNumber":376,"sourceCode":"            );\n        }\n        let provisioning_strategies = [\n            self.mise_bin.is_some(),\n            self.remote_mise.is_some(),\n            self.bootstrap_command.is_some(),\n        ]\n        .into_iter()\n        .filter(|configured| *configured)\n        .count();\n        if provisioning_strategies > 1 {\n            bail!(\n                \"remote host '{}' must set at most one of mise_bin, remote_mise, or bootstrap_command\",\n                self.name\n            );\n        }\n        if let Some(install_mise) = &self.install_mise {\n            if self.remote_mise.is_some() || self.bootstrap_command.is_some() {\n                bail!(\n                    \"remote host '{}' cannot combine install_mise with remote_mise or bootstrap_command, which already provide mise on the host\",\n                    self.name\n                );\n            }\n            validate_install_mise_path(install_mise).wrap_err_with(|| {\n                format!(\"remote host '{}' has an invalid install_mise\", self.name)\n            })?;\n        }\n        for option in &self.ssh_options {\n            validate_value(\"SSH option\", option)?;\n        }\n        for exclude in &self.exclude {\n            validate_value(\"archive exclude\", exclude)?;\n        }\n        for env in &self.mise_env {\n            validate_value(\"mise environment\", env)?;\n            if env.contains(',') {\n                bail!(\"remote mise environment cannot contain a comma: {env}\");","sourceCodeStart":358,"sourceCodeEnd":394,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/remote.rs#L358-L394","documentation":"install_mise asks the tool to install mise on the remote host itself, but remote_mise and bootstrap_command already place mise on the host by other means. Combining them is redundant and ambiguous, so validate_with_source rejects the combination with a host-specific message.","triggerScenarios":"A remote host entry sets `install_mise` together with either `remote_mise` or `bootstrap_command`; validate() or apply_overrides() bail from this check.","commonSituations":"Config evolved from a bootstrap_command setup and someone added install_mise to 'upgrade' the install path; merging two host templates that each solved provisioning differently.","solutions":["Remove install_mise if the host already gets mise via remote_mise or bootstrap_command.","Remove remote_mise/bootstrap_command and keep only install_mise to have mise installed automatically.","Use install_mise's path/version options instead of a hand-rolled bootstrap_command."],"exampleFix":"// before\n[[remote_host]]\nname = \"builder\"\ninstall_mise = true\nbootstrap_command = \"curl https://mise.run | sh\"\n// after\n[[remote_host]]\nname = \"builder\"\ninstall_mise = true","handlingStrategy":"validation","validationCode":"function assertInstallMiseExclusive(host) {\n  if (host.install_mise != null && (host.remote_mise != null || host.bootstrap_command != null)) {\n    throw new Error(`remote host '${host.name}': drop install_mise or the bootstrap/remote_mise path`);\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat install_mise as the only provisioning field when you want automatic installation.","When migrating from bootstrap_command to install_mise, delete the old field in the same change.","Add a config lint step covering mutually exclusive remote host fields."],"tags":["remote","configuration","validation","conflicting-options"],"backgroundTag":"conflicting-config-options","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}