diff --git a/crates-cli/yaak-cli/src/main.rs b/crates-cli/yaak-cli/src/main.rs index ba439c1f..b5a2ad30 100644 --- a/crates-cli/yaak-cli/src/main.rs +++ b/crates-cli/yaak-cli/src/main.rs @@ -10,6 +10,7 @@ mod version_check; use clap::Parser; use cli::{Cli, Commands, PluginCommands, RequestCommands}; use context::{CliContext, CliExecutionContext}; +use std::path::PathBuf; use yaak_models::queries::any_request::AnyRequest; #[tokio::main] @@ -30,9 +31,7 @@ async fn main() { let app_id = if cfg!(debug_assertions) { "app.yaak.desktop.dev" } else { "app.yaak.desktop" }; - let data_dir = data_dir.unwrap_or_else(|| { - dirs::data_dir().expect("Could not determine data directory").join(app_id) - }); + let data_dir = data_dir.unwrap_or_else(|| resolve_data_dir(app_id)); version_check::maybe_check_for_updates().await; @@ -239,3 +238,46 @@ fn resolve_cookie_jar_id( .map(|jar| jar.id); Ok(default_cookie_jar) } + +fn resolve_data_dir(app_id: &str) -> PathBuf { + if let Some(dir) = wsl_data_dir(app_id) { + return dir; + } + dirs::data_dir().expect("Could not determine data directory").join(app_id) +} + +/// Detect WSL and resolve the Windows AppData\Roaming path for the Yaak data directory. +fn wsl_data_dir(app_id: &str) -> Option { + if !cfg!(target_os = "linux") { + return None; + } + + let proc_version = std::fs::read_to_string("/proc/version").ok()?; + let is_wsl = proc_version.to_lowercase().contains("microsoft"); + if !is_wsl { + return None; + } + + // We're in WSL, so try to resolve the Yaak app's data directory in Windows + + // Get the Windows %APPDATA% path via cmd.exe + let appdata_output = + std::process::Command::new("cmd.exe").args(["/C", "echo", "%APPDATA%"]).output().ok()?; + + let win_path = String::from_utf8(appdata_output.stdout).ok()?.trim().to_string(); + if win_path.is_empty() || win_path == "%APPDATA%" { + return None; + } + + // Convert Windows path to WSL path using wslpath (handles custom mount points) + let wslpath_output = std::process::Command::new("wslpath").arg(&win_path).output().ok()?; + + let wsl_appdata = String::from_utf8(wslpath_output.stdout).ok()?.trim().to_string(); + if wsl_appdata.is_empty() { + return None; + } + + let wsl_path = PathBuf::from(wsl_appdata).join(app_id); + + if wsl_path.exists() { Some(wsl_path) } else { None } +}