fix: SSH executor uses source ~/.profile for remote PATH

SSH non-interactive sessions don't load .profile, causing 'claude: command not found'.
Prepend 'source ~/.profile 2>/dev/null;' to ensure user PATH is available.

Verified: end-to-end test passed (arm0 → WSL2 Claude Code, 77s execution).
This commit is contained in:
Zer4tul 2026-05-12 16:36:02 +08:00
parent d1a746a8cb
commit 01f5fac718
3 changed files with 12 additions and 2 deletions

10
Cargo.lock generated
View file

@ -1079,6 +1079,15 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
[[package]]
name = "openssl-src"
version = "300.6.0+3.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8e8cbfd3a4a8c8f089147fd7aaa33cf8c7450c4d09f8f80698a0cf093abeff4"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
version = "0.9.115"
@ -1087,6 +1096,7 @@ checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781"
dependencies = [
"cc",
"libc",
"openssl-src",
"pkg-config",
"vcpkg",
]

View file

@ -23,7 +23,7 @@ rusqlite = { version = "0.32", features = ["bundled"] }
toml = "0.8"
# HTTP client (for Forgejo API)
reqwest = { version = "0.12", features = ["json"] }
reqwest = { version = "0.12", features = ["json", "native-tls-vendored"] }
# Logging
tracing = "0.1"

View file

@ -130,7 +130,7 @@ impl SshExecutor {
cmd.arg("-i").arg(key);
}
cmd.arg(format!("{}@{}", host.ssh_user, host.hostname))
.arg(command);
.arg(format!("source ~/.profile 2>/dev/null; {command}"));
cmd
};