{"record":{"id":"ca8a1f1db1d26f29","repo":"Hmbown/CodeWhale","slug":"legacy-home-resolution-error","errorCode":null,"errorMessage":"<legacy home resolution error>","messagePattern":"<legacy home resolution error>","errorType":"exception","errorClass":"io::Error","httpStatus":null,"severity":"warning","filePath":"crates/tui/src/session_manager.rs","lineNumber":3089,"sourceCode":"        }\n        Err(err) => {\n            tracing::warn!(\n                target: \"session::migration\",\n                \"Could not copy legacy sessions into {}: {err}\",\n                dir.display()\n            );\n        }\n    }\n    Ok(dir)\n}\n\nfn merge_missing_legacy_session_entries(primary: &Path) -> io::Result<usize> {\n    if codewhale_paths::codewhale_home_is_explicit() {\n        return Ok(0);\n    }\n\n    let legacy = codewhale_config::legacy_deepseek_home()\n        .map_err(|e| io::Error::new(io::ErrorKind::NotFound, e.to_string()))?\n        .join(\"sessions\");\n    if !legacy.is_dir() || paths_equivalent(primary, &legacy) {\n        return Ok(0);\n    }\n\n    copy_missing_dir_entries(&legacy, primary)\n}\n\nfn copy_missing_dir_entries(src: &Path, dst: &Path) -> io::Result<usize> {\n    fs::create_dir_all(dst)?;\n    let mut copied = 0;\n    for entry in fs::read_dir(src)? {\n        let entry = entry?;\n        let source = entry.path();\n        let target = dst.join(entry.file_name());\n\n        let file_type = entry.file_type()?;\n        if file_type.is_dir() {","sourceCodeStart":3071,"sourceCodeEnd":3107,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/session_manager.rs#L3071-L3107","documentation":"`merge_missing_legacy_session_entries` (crates/tui/src/session_manager.rs:3089) resolves the legacy `~/.deepseek` home via `codewhale_config::legacy_deepseek_home()` to migrate old sessions into `~/.codewhale/sessions`. If the legacy home cannot be resolved, the error becomes an io::Error (kind NotFound) whose message is the resolver's text. It only matters on migration; when CODEWHALE_HOME is explicitly set the legacy merge is skipped entirely.","triggerScenarios":"Calling default_sessions_dir when CODEWHALE_HOME is NOT explicitly set (so legacy merge runs) and legacy_deepseek_home() fails to resolve the old home directory.","commonSituations":"Upgraded installation where the old ~/.deepseek directory was deleted while home resolution depends on it; unusual $HOME configurations during migration; environment where the legacy path cannot be constructed.","solutions":["Inspect the wrapped message and repair the legacy home path/permissions it complains about.","Set CODEWHALE_HOME explicitly — the legacy migration path is then skipped and sessions resolve directly.","Manually copy the needed session entries from ~/.deepseek/sessions into ~/.codewhale/sessions."],"exampleFix":"// environment\n// before: unset / broken home\n// after\nexport CODEWHALE_HOME=\"$HOME/.codewhale\"","handlingStrategy":"fallback","validationCode":"let legacy_ok = !std::env::var_os(\"CODEWHALE_HOME\").is_some()\n    && Path::new(\"~/.deepseek\").expand().is_dir();","typeGuard":null,"tryCatchPattern":"match default_sessions_dir() {\n    Err(e) if e.kind() == io::ErrorKind::NotFound => {\n        // fall back: skip migration, use primary dir directly\n    }\n    other => other?,\n}","preventionTips":["Keep ~/.deepseek intact until migration completes, or copy entries manually first.","Set CODEWHALE_HOME explicitly to skip the legacy-merge path.","Check old-home resolution after home-directory changes."],"tags":["migration","legacy-path","filesystem"],"backgroundTag":"directory-not-found","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}