{"record":{"id":"dac1dc32e00f90b2","repo":"jdx/mise","slug":"history-is-disabled-history-enabled-false-dac1dc","errorCode":null,"errorMessage":"history is disabled (history.enabled = false)","messagePattern":"history is disabled \\(history\\.enabled = false\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/dotfiles/save.rs","lineNumber":73,"sourceCode":"        match self.capture(store, tracked, draft) {\n            Ok(()) => Ok(()),\n            Err(err) if self.best_effort => {\n                warn!(\"history save: {err:#}\");\n                Ok(())\n            }\n            Err(err) => Err(err),\n        }\n    }\n\n    async fn save(self) -> Result<()> {\n        let trigger = match self.trigger.as_str() {\n            \"save\" => Trigger::Save,\n            \"agent\" => Trigger::Agent,\n            \"update\" => Trigger::Update,\n            other => bail!(\"unknown trigger {other:?}; use save, agent, or update\"),\n        };\n        if !crate::config::Settings::get().history.enabled {\n            bail!(\"history is disabled (history.enabled = false)\");\n        }\n        let (store, tracked, entries) = super::history::open().await?;\n        if !self.paths.is_empty() {\n            let walk = tracked.walk()?;\n            for path in &self.paths {\n                let path = normalize_target(path);\n                let captured = walk.files.keys().any(|file| file.starts_with(&path));\n                if !captured {\n                    // saving a deleted manual-save path saves the deletion,\n                    // provided the path was captured before (a path that\n                    // never existed is not a deletion)\n                    let deletion = tracked\n                        .entry_for(&path)\n                        .is_some_and(|entry| !entry.policy.autosave)\n                        && std::fs::symlink_metadata(&path)\n                            .is_err_and(|err| err.kind() == std::io::ErrorKind::NotFound)\n                        && previously_captured(&store, &entries, &path)?;\n                    if deletion {","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/cli/dotfiles/save.rs#L55-L91","documentation":"Thrown by the dotfiles `save` command when history is disabled (`history.enabled = false` in settings). Saving captured dotfile edits into history requires the history feature, so the command aborts with the setting named in the message.","triggerScenarios":"Running `mise bootstrap dotfiles save` (any trigger) while `Settings::get().history.enabled` is false.","commonSituations":"Users who disabled history for disk space or privacy but still call save from scripts/automation; configs where history.enabled was set false after previously using dotfiles save.","solutions":["Enable history: set `history.enabled = true` in mise settings","Verify with `mise settings get history.enabled` before calling save","Remove or guard the save call in scripts when history is intentionally disabled"],"exampleFix":"// before (config.toml)\n[history]\nenabled = false\n// after\n[history]\nenabled = true","handlingStrategy":"validation","validationCode":"[ \"$(mise settings get history.enabled)\" = \"true\" ] || { echo \"enable history first\" >&2; exit 1; }\nmise bootstrap dotfiles save --trigger save","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check history.enabled before calling save from automation","Keep history enabled on machines that use dotfiles save","Guard scheduled save jobs to no-op when history is disabled"],"tags":["cli","dotfiles","config","feature-disabled"],"backgroundTag":"feature-not-enabled","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"}