mirror of
https://github.com/instructkr/claw-code.git
synced 2026-04-11 02:24:49 +08:00
fix(startup): fall back to USERPROFILE when HOME is not set (Windows)
On Windows, HOME is often unset. The CLI crashed at startup with 'error: io error: HOME is not set' because three paths only checked HOME: - config_home_dir() in tools crate (config/settings loading) - credentials_home_dir() in runtime crate (OAuth credentials) - detect_broad_cwd() in CLI (CWD-is-home-dir check) - skill lookup roots in tools crate All now fall through to USERPROFILE when HOME is absent. Error message updated to suggest USERPROFILE or CLAW_CONFIG_HOME on Windows. Source: MaxDerVerpeilte in #claw-code (Windows user, 2026-04-10).
This commit is contained in:
@@ -335,7 +335,14 @@ fn credentials_home_dir() -> io::Result<PathBuf> {
|
|||||||
return Ok(PathBuf::from(path));
|
return Ok(PathBuf::from(path));
|
||||||
}
|
}
|
||||||
let home = std::env::var_os("HOME")
|
let home = std::env::var_os("HOME")
|
||||||
.ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "HOME is not set"))?;
|
.or_else(|| std::env::var_os("USERPROFILE"))
|
||||||
|
.ok_or_else(|| {
|
||||||
|
io::Error::new(
|
||||||
|
io::ErrorKind::NotFound,
|
||||||
|
"HOME is not set (on Windows, set USERPROFILE or HOME, \
|
||||||
|
or use CLAW_CONFIG_HOME to point directly at the config directory)",
|
||||||
|
)
|
||||||
|
})?;
|
||||||
Ok(PathBuf::from(home).join(".claw"))
|
Ok(PathBuf::from(home).join(".claw"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3055,6 +3055,7 @@ fn detect_broad_cwd() -> Option<PathBuf> {
|
|||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
let is_home = env::var_os("HOME")
|
let is_home = env::var_os("HOME")
|
||||||
|
.or_else(|| env::var_os("USERPROFILE"))
|
||||||
.map(|h| PathBuf::from(h) == cwd)
|
.map(|h| PathBuf::from(h) == cwd)
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
let is_root = cwd.parent().is_none();
|
let is_root = cwd.parent().is_none();
|
||||||
|
|||||||
@@ -3066,7 +3066,7 @@ fn skill_lookup_roots() -> Vec<SkillLookupRoot> {
|
|||||||
if let Ok(codex_home) = std::env::var("CODEX_HOME") {
|
if let Ok(codex_home) = std::env::var("CODEX_HOME") {
|
||||||
push_prefixed_skill_lookup_roots(&mut roots, std::path::Path::new(&codex_home));
|
push_prefixed_skill_lookup_roots(&mut roots, std::path::Path::new(&codex_home));
|
||||||
}
|
}
|
||||||
if let Ok(home) = std::env::var("HOME") {
|
if let Ok(home) = std::env::var("HOME").or_else(|_| std::env::var("USERPROFILE")) {
|
||||||
push_home_skill_lookup_roots(&mut roots, std::path::Path::new(&home));
|
push_home_skill_lookup_roots(&mut roots, std::path::Path::new(&home));
|
||||||
}
|
}
|
||||||
if let Ok(claude_config_dir) = std::env::var("CLAUDE_CONFIG_DIR") {
|
if let Ok(claude_config_dir) = std::env::var("CLAUDE_CONFIG_DIR") {
|
||||||
@@ -4987,7 +4987,14 @@ fn config_home_dir() -> Result<PathBuf, String> {
|
|||||||
if let Ok(path) = std::env::var("CLAW_CONFIG_HOME") {
|
if let Ok(path) = std::env::var("CLAW_CONFIG_HOME") {
|
||||||
return Ok(PathBuf::from(path));
|
return Ok(PathBuf::from(path));
|
||||||
}
|
}
|
||||||
let home = std::env::var("HOME").map_err(|_| String::from("HOME is not set"))?;
|
let home = std::env::var("HOME")
|
||||||
|
.or_else(|_| std::env::var("USERPROFILE"))
|
||||||
|
.map_err(|_| {
|
||||||
|
String::from(
|
||||||
|
"HOME is not set (on Windows, set USERPROFILE or HOME, \
|
||||||
|
or use CLAW_CONFIG_HOME to point directly at the config directory)",
|
||||||
|
)
|
||||||
|
})?;
|
||||||
Ok(PathBuf::from(home).join(".claw"))
|
Ok(PathBuf::from(home).join(".claw"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user