{"record":{"id":"4d006145f5325e91","repo":"jdx/mise","slug":"no-version-specified-for-tool-tool-use-mise-she","errorCode":null,"errorMessage":"no version specified for tool {tool}\nuse `mise shell {tool}@VERSION` to set a version","messagePattern":"no version specified for tool (.+?)\nuse `mise shell (.+?)@VERSION` to set a version","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/shell.rs","lineNumber":70,"sourceCode":"            err_inactive()?;\n        }\n\n        let shell = require_shell(\n            None,\n            &format!(\"Re-run `mise activate {EXAMPLE_SHELL}` in your shell rc file.\"),\n        )?;\n\n        if self.unset {\n            for ta in &self.tool {\n                let op = shell.unset_env(&tool_env_var_name(&ta.ba.short));\n                print!(\"{op}\");\n            }\n            return Ok(());\n        }\n\n        for ta in &self.tool {\n            if ta.tvr.is_none() {\n                bail!(\n                    \"no version specified for tool {tool}\\nuse `mise shell {tool}@VERSION` to set a version\",\n                    tool = ta.ba.short,\n                );\n            }\n        }\n\n        let mut ts = ToolsetBuilder::new()\n            .with_args(&self.tool)\n            .build(&config)\n            .await?;\n        let opts = InstallOptions {\n            force: false,\n            jobs: self.jobs,\n            raw: self.raw,\n            ..Default::default()\n        };\n        let (_, missing) = ts.install_missing_versions(&mut config, &opts).await?;\n        ts.notify_missing_versions(missing);","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/shell.rs#L52-L88","documentation":"`mise shell <tool>` pins tools in the current shell session, which requires an explicit version. If a tool argument is given without an @VERSION suffix (its ToolRequest has no version), mise cannot know what to activate and aborts, suggesting the correct syntax. This prevents silently activating whatever version happens to resolve.","triggerScenarios":"Running `mise shell node` (no @version) or `mise shell node@` — the tool argument parsed without a version range.","commonSituations":"Habit from `mise use node` (which can use config-resolved latest); copy-pasting commands omitting the version; scripting shell activation without knowing the desired version.","solutions":["Append a version: `mise shell node@22` (or a full version like node@22.3.0).","Use `mise ls-remote node` to pick an available version.","If you want the config-resolved version, use `mise exec`/activate via mise.toml instead of `mise shell` without a version."],"exampleFix":"// before\nmise shell node\n// no version specified for tool node\n\n// after\nmise shell node@22","handlingStrategy":"validation","validationCode":"case \"$tool_spec\" in *@*) : ;; *) echo \"usage: mise shell ${tool_spec}@VERSION\" >&2;; esac","typeGuard":null,"tryCatchPattern":"mise shell node@22 || { mise ls-remote node | tail -1; }","preventionTips":["Always include @VERSION with `mise shell` tool arguments","Resolve versions with `mise ls-remote <tool>` first","If you want config-managed versions, use mise.toml instead of ad-hoc shell activation"],"tags":["cli","tools","versions"],"backgroundTag":"missing-required-argument","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"}