{"record":{"id":"dff54da7219661c9","repo":"jdx/mise","slug":"mise-lock-upgrade-cannot-be-combined-with-tool","errorCode":null,"errorMessage":"`mise lock --upgrade` cannot be combined with tool arguments","messagePattern":"`mise lock --upgrade` cannot be combined with tool arguments","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/lock.rs","lineNumber":351,"sourceCode":"            dry_run: false,\n            platform: vec![],\n            bump: false,\n            json: true,\n            local: false,\n            minimum_release_age: None,\n            upgrade: false,\n        }\n        .run_with_installed(Some(installed), config)\n        .await\n    }\n\n    async fn run_with_installed(\n        self,\n        installed: Option<&[crate::toolset::ToolVersion]>,\n        config: Arc<Config>,\n    ) -> Result<()> {\n        if self.upgrade && !self.tool.is_empty() {\n            bail!(\"`mise lock --upgrade` cannot be combined with tool arguments\");\n        }\n        let settings = Settings::get();\n        let generate = settings.generate_lockfiles();\n        let atomic = self.upgrade || generate;\n        if !self.dry_run && !atomic {\n            lockfile::migrate_monorepo_lockfiles(&config, self.upgrade)?;\n        }\n        let before_date = self.get_before_date()?;\n        let lock_resolve_options = ResolveOptions {\n            before_date,\n            filter_installed_versions_by_release_date: true,\n            latest_versions: self.bump,\n            use_locked_version: !self.bump,\n            // Lock moving channels to their current concrete value without making\n            // ordinary `latest` requests ignore an installed concrete version.\n            resolve_rolling_channels: true,\n            ..Default::default()\n        };","sourceCodeStart":333,"sourceCodeEnd":369,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/lock.rs#L333-L369","documentation":"`mise lock --upgrade` re-resolves every tool already configured in the lockfile itself, so passing explicit tool arguments would be contradictory. mise rejects the combination up front rather than ignoring one of the inputs.","triggerScenarios":"Running `mise lock --upgrade node python` — tool arguments combined with the `--upgrade` flag on `mise lock`.","commonSituations":"Users habitually appending tool names (as with `mise install`) when upgrading lockfile entries.","solutions":["Drop the tool arguments: `mise lock --upgrade` upgrades all configured tools","Or drop `--upgrade` and use `mise lock <tool>@<version>` to pin specific tools without the upgrade semantics","Run `mise lock --upgrade` for the full lockfile, then edit individual pins via `mise use <tool>@<version>`"],"exampleFix":"// before\nmise lock --upgrade node@22 python\n// after\nmise lock --upgrade","handlingStrategy":"validation","validationCode":"// bash: strip tool args when --upgrade is used\nif [[ \"$*\" == *--upgrade* ]]; then set -- mise lock --upgrade; fi","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember --upgrade operates on the whole lockfile, never per-tool","Use `mise use <tool>@<version>` for per-tool pin changes"],"tags":["cli","lockfile","flags","conflicting-options"],"backgroundTag":"mutually-exclusive-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"}