From c7ad0161170c1a0dd0156e2a9985c8a16e3d5912 Mon Sep 17 00:00:00 2001 From: VipinDevelops Date: Wed, 10 Jun 2026 15:44:30 +0530 Subject: [PATCH] Keep worktree session dir when pane cwd is outside Amp-Thread-ID: https://ampcode.com/threads/T-019eb074-d17e-743c-a833-2519cfed77a9 Co-authored-by: Amp --- packages/runtime-rs/src/tmux_provider.rs | 45 +++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/runtime-rs/src/tmux_provider.rs b/packages/runtime-rs/src/tmux_provider.rs index fa72cdb..638adaf 100644 --- a/packages/runtime-rs/src/tmux_provider.rs +++ b/packages/runtime-rs/src/tmux_provider.rs @@ -1,4 +1,5 @@ use std::collections::{HashMap, HashSet}; +use std::path::Path; use std::process::Command; use std::sync::Arc; @@ -453,10 +454,10 @@ impl MuxProvider for TmuxProvider { .map(|session| MuxSessionInfo { name: session.name.clone(), created_at: session.created_at, - dir: active_dirs - .get(&session.name) - .cloned() - .unwrap_or(session.dir), + dir: choose_session_dir( + &session.dir, + active_dirs.get(&session.name).map(String::as_str), + ), windows: session.window_count, }) .collect() @@ -907,6 +908,23 @@ fn thread_name_from_pane(pane: &PaneInfo, agent: &str) -> Option { None } +fn choose_session_dir(session_dir: &str, active_dir: Option<&str>) -> String { + let Some(active_dir) = active_dir.filter(|dir| !dir.is_empty()) else { + return session_dir.to_string(); + }; + if session_dir.is_empty() || session_dir == "/" || is_home_dir(session_dir) { + return active_dir.to_string(); + } + if Path::new(active_dir).starts_with(Path::new(session_dir)) { + return active_dir.to_string(); + } + session_dir.to_string() +} + +fn is_home_dir(dir: &str) -> bool { + std::env::var("HOME").is_ok_and(|home| dir == home) +} + fn shell_quote(value: &str) -> String { format!("'{}'", value.replace('\'', "'\\''")) } @@ -1066,4 +1084,23 @@ mod tests { ], ); } + + #[test] + fn session_dir_keeps_worktree_path_when_active_pane_is_outside_it() { + assert_eq!( + choose_session_dir("/repo-wt/workspace-1", Some("/repo/packages/app"),), + "/repo-wt/workspace-1", + ); + } + + #[test] + fn session_dir_uses_active_subdirectory_inside_session_path() { + assert_eq!( + choose_session_dir( + "/repo-wt/workspace-1", + Some("/repo-wt/workspace-1/packages/app"), + ), + "/repo-wt/workspace-1/packages/app", + ); + } }