{"record":{"id":"4779496bc88ab7fa","repo":"Hmbown/CodeWhale","slug":"config-migration-skipped-err","errorCode":null,"errorMessage":"Config migration skipped: {err}","messagePattern":"Config migration skipped: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/tui/src/lib.rs","lineNumber":11210,"sourceCode":"    if !cli.skip_onboarding {\n        match crate::config::ensure_config_file_exists(cli.config.clone()) {\n            Ok(Some(path)) => logging::info(format!(\n                \"Created first-run config file at {}\",\n                path.display()\n            )),\n            Ok(None) => {}\n            Err(err) => logging::warn(format!(\"Failed to create first-run config file: {err}\")),\n        }\n    }\n\n    // v0.8.44: migrate config from ~/.deepseek/ to ~/.codewhale/ on first\n    // launch. Non-fatal — existing installs keep working either way.\n    match codewhale_config::migrate_config_if_needed() {\n        Ok(Some(migration)) => {\n            eprintln!(\"{}\", migration.user_notice());\n        }\n        Ok(None) => {}\n        Err(err) => logging::warn(format!(\"Config migration skipped: {err}\")),\n    }\n\n    let model = config.default_model();\n    let provider = config.api_provider();\n    let max_subagents = cli.max_subagents.map_or_else(\n        || config.max_subagents_for_provider(provider),\n        |value| value.clamp(1, MAX_SUBAGENTS),\n    );\n    let screen_mode = startup_screen_mode(cli, config);\n    let mouse_capture_preference = mouse_capture_preference(cli, config);\n    let use_mouse_capture = screen_mode.mouse_capture(mouse_capture_preference);\n    let use_bracketed_paste = crate::settings::Settings::load()\n        .map(|s| s.effective_bracketed_paste())\n        .unwrap_or_else(|_| !crate::settings::detected_legacy_windows_console_host());\n\n    // Auto-install bundled system skills (e.g. skill-creator) on first launch.\n    // Errors are non-fatal: log a warning and continue.\n    let skills_dir = config.skills_dir();","sourceCodeStart":11192,"sourceCodeEnd":11228,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/crates/tui/src/lib.rs#L11192-L11228","documentation":"During startup the TUI runs the config-directory migration (codewhale_config::migrate_config_if_needed()). When it returns Err, the TUI logs \"Config migration skipped: {err}\" and continues with the existing config — the migration is explicitly non-fatal. The install keeps working from the old config location; nothing was moved.","triggerScenarios":"migrate_config_if_needed() errors during launch (lib.rs ~11210): source config unreadable/corrupt, destination unwritable, or partial-migration state detected on a later launch.","commonSituations":"Upgrading from an older version that stored config elsewhere; corrupt or hand-edited config at the source path; mixed-permission installs after running the app once as root/sudo; sync tools (Dropbox) locking config files.","solutions":["Read the {err} detail in the log to find the failing file or path.","Verify the source config parses (fix JSON/TOML syntax errors) and both source and destination paths are readable/writable.","Manually copy the config to the new location (~/.codewhale/) and remove the old one so migration becomes a no-op.","If a previous partial migration left stale state, clear the target location and retry."],"exampleFix":"// before\n~/.olddir/config.toml   (unreadable, perms 000)\n// after\nchmod 600 ~/.olddir/config.toml  # then relaunch to migrate","handlingStrategy":"validation","validationCode":"let src = old_config_path(); if src.exists() { ensure_readable(&src)?; ensure_writable_dir(new_config_dir())?; }","typeGuard":null,"tryCatchPattern":"match migrate_config_if_needed() { Err(err) => log::warn!(\"continuing with existing config: {err}\"), _ => {} }","preventionTips":["Validate the old config file parses before upgrading versions.","Keep both old and new config directories user-owned and writable.","Avoid placing config in sync-tool directories that can lock files."],"tags":["config","migration","startup","filesystem"],"backgroundTag":"config-file-not-found","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-22T11:17:16.035Z"}