Skip to main content

j_agent/util/
path_utils.rs

1/// 展开 ~ 为 HOME 目录路径:`~` → HOME,`~/foo` → HOME/foo,其他不变
2pub fn expand_tilde(path: &str) -> String {
3    if path == "~" {
4        std::env::var("HOME").unwrap_or_else(|_| "~".to_string())
5    } else if let Some(rest) = path.strip_prefix("~/") {
6        match std::env::var("HOME") {
7            Ok(home) => format!("{}/{}", home, rest),
8            Err(_) => path.to_string(),
9        }
10    } else {
11        path.to_string()
12    }
13}
14
15use crate::agent::thread_identity::thread_cwd;
16
17/// 解析路径:展开 ~,若路径为相对路径且当前线程有 worktree CWD,则相对于该 CWD 解析。
18pub fn resolve_path(path: &str) -> String {
19    let expanded = expand_tilde(path);
20    if std::path::Path::new(&expanded).is_absolute() {
21        return expanded;
22    }
23    if let Some(cwd) = thread_cwd() {
24        return cwd.join(&expanded).to_string_lossy().to_string();
25    }
26    expanded
27}
28
29/// 获取当前有效的工作目录:先取线程本地 worktree CWD,再 fallback 到进程 CWD
30pub fn effective_cwd() -> String {
31    if let Some(cwd) = thread_cwd() {
32        return cwd.to_string_lossy().to_string();
33    }
34    std::env::current_dir()
35        .map(|d| d.to_string_lossy().to_string())
36        .unwrap_or_else(|_| ".".to_string())
37}