From 8ca53dec0dfa6d86a5015c61da2bd7497ab0e448 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Wed, 1 Apr 2026 18:57:50 +0900 Subject: [PATCH] fix: resolve all post-merge compile errors - Fix unresolved imports (auto_compaction, AutoCompactionEvent) - Add Thinking/RedactedThinking match arms - Fix workspace.dependencies serde_json - Fix enum exhaustiveness in OutputContentBlock matches - cargo check --workspace passes --- rust/crates/api/Cargo.toml | 2 +- rust/crates/api/src/lib.rs | 2 +- rust/crates/api/src/providers/anthropic.rs | 42 ++++++++++++--------- rust/crates/api/tests/client_integration.rs | 12 +++--- rust/crates/commands/Cargo.toml | 2 +- rust/crates/plugins/Cargo.toml | 2 +- rust/crates/plugins/src/lib.rs | 10 ++++- rust/crates/runtime/Cargo.toml | 2 +- rust/crates/runtime/src/lib.rs | 4 +- rust/crates/rusty-claude-cli/Cargo.toml | 2 +- rust/crates/rusty-claude-cli/src/main.rs | 34 ++++++++++++++--- rust/crates/tools/Cargo.toml | 2 +- rust/crates/tools/src/lib.rs | 35 ++++++++++------- 13 files changed, 99 insertions(+), 52 deletions(-) diff --git a/rust/crates/api/Cargo.toml b/rust/crates/api/Cargo.toml index c5e152e..b9923a8 100644 --- a/rust/crates/api/Cargo.toml +++ b/rust/crates/api/Cargo.toml @@ -9,7 +9,7 @@ publish.workspace = true reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } runtime = { path = "../runtime" } serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json.workspace = true tokio = { version = "1", features = ["io-util", "macros", "net", "rt-multi-thread", "time"] } [lints] diff --git a/rust/crates/api/src/lib.rs b/rust/crates/api/src/lib.rs index 7702fee..d702c1b 100644 --- a/rust/crates/api/src/lib.rs +++ b/rust/crates/api/src/lib.rs @@ -9,7 +9,7 @@ pub use client::{ resolve_startup_auth_source, MessageStream, OAuthTokenSet, ProviderClient, }; pub use error::ApiError; -pub use providers::anthropic::{AnthropicClient, AuthSource}; +pub use providers::anthropic::{AnthropicClient, AnthropicClient as ApiClient, AuthSource}; pub use providers::openai_compat::{OpenAiCompatClient, OpenAiCompatConfig}; pub use providers::{ detect_provider_kind, max_tokens_for_model, resolve_model_alias, ProviderKind, diff --git a/rust/crates/api/src/providers/anthropic.rs b/rust/crates/api/src/providers/anthropic.rs index 0883e60..4242cb4 100644 --- a/rust/crates/api/src/providers/anthropic.rs +++ b/rust/crates/api/src/providers/anthropic.rs @@ -660,7 +660,7 @@ mod tests { static LOCK: OnceLock> = OnceLock::new(); LOCK.get_or_init(|| Mutex::new(())) .lock() - .expect("env lock") + .unwrap_or_else(std::sync::PoisonError::into_inner) } fn temp_config_home() -> std::path::PathBuf { @@ -674,6 +674,14 @@ mod tests { )) } + fn cleanup_temp_config_home(config_home: &std::path::Path) { + match std::fs::remove_dir_all(config_home) { + Ok(()) => {} + Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} + Err(error) => panic!("cleanup temp dir: {error}"), + } + } + fn sample_oauth_config(token_url: String) -> OAuthConfig { OAuthConfig { client_id: "runtime-client".to_string(), @@ -709,7 +717,7 @@ mod tests { let _guard = env_lock(); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); + std::env::remove_var("CLAW_CONFIG_HOME"); let error = super::read_api_key().expect_err("missing key should error"); assert!(matches!( error, @@ -779,7 +787,7 @@ mod tests { fn auth_source_from_saved_oauth_when_env_absent() { let _guard = env_lock(); let config_home = temp_config_home(); - std::env::set_var("CLAUDE_CONFIG_HOME", &config_home); + std::env::set_var("CLAW_CONFIG_HOME", &config_home); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); save_oauth_credentials(&runtime::OAuthTokenSet { @@ -794,8 +802,8 @@ mod tests { assert_eq!(auth.bearer_token(), Some("saved-access-token")); clear_oauth_credentials().expect("clear credentials"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); - std::fs::remove_dir_all(config_home).expect("cleanup temp dir"); + std::env::remove_var("CLAW_CONFIG_HOME"); + cleanup_temp_config_home(&config_home); } #[test] @@ -818,7 +826,7 @@ mod tests { fn resolve_saved_oauth_token_refreshes_expired_credentials() { let _guard = env_lock(); let config_home = temp_config_home(); - std::env::set_var("CLAUDE_CONFIG_HOME", &config_home); + std::env::set_var("CLAW_CONFIG_HOME", &config_home); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); save_oauth_credentials(&runtime::OAuthTokenSet { @@ -842,15 +850,15 @@ mod tests { assert_eq!(stored.access_token, "refreshed-token"); clear_oauth_credentials().expect("clear credentials"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); - std::fs::remove_dir_all(config_home).expect("cleanup temp dir"); + std::env::remove_var("CLAW_CONFIG_HOME"); + cleanup_temp_config_home(&config_home); } #[test] fn resolve_startup_auth_source_uses_saved_oauth_without_loading_config() { let _guard = env_lock(); let config_home = temp_config_home(); - std::env::set_var("CLAUDE_CONFIG_HOME", &config_home); + std::env::set_var("CLAW_CONFIG_HOME", &config_home); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); save_oauth_credentials(&runtime::OAuthTokenSet { @@ -866,15 +874,15 @@ mod tests { assert_eq!(auth.bearer_token(), Some("saved-access-token")); clear_oauth_credentials().expect("clear credentials"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); - std::fs::remove_dir_all(config_home).expect("cleanup temp dir"); + std::env::remove_var("CLAW_CONFIG_HOME"); + cleanup_temp_config_home(&config_home); } #[test] fn resolve_startup_auth_source_errors_when_refreshable_token_lacks_config() { let _guard = env_lock(); let config_home = temp_config_home(); - std::env::set_var("CLAUDE_CONFIG_HOME", &config_home); + std::env::set_var("CLAW_CONFIG_HOME", &config_home); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); save_oauth_credentials(&runtime::OAuthTokenSet { @@ -898,15 +906,15 @@ mod tests { assert_eq!(stored.refresh_token.as_deref(), Some("refresh-token")); clear_oauth_credentials().expect("clear credentials"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); - std::fs::remove_dir_all(config_home).expect("cleanup temp dir"); + std::env::remove_var("CLAW_CONFIG_HOME"); + cleanup_temp_config_home(&config_home); } #[test] fn resolve_saved_oauth_token_preserves_refresh_token_when_refresh_response_omits_it() { let _guard = env_lock(); let config_home = temp_config_home(); - std::env::set_var("CLAUDE_CONFIG_HOME", &config_home); + std::env::set_var("CLAW_CONFIG_HOME", &config_home); std::env::remove_var("ANTHROPIC_AUTH_TOKEN"); std::env::remove_var("ANTHROPIC_API_KEY"); save_oauth_credentials(&runtime::OAuthTokenSet { @@ -931,8 +939,8 @@ mod tests { assert_eq!(stored.refresh_token.as_deref(), Some("refresh-token")); clear_oauth_credentials().expect("clear credentials"); - std::env::remove_var("CLAUDE_CONFIG_HOME"); - std::fs::remove_dir_all(config_home).expect("cleanup temp dir"); + std::env::remove_var("CLAW_CONFIG_HOME"); + cleanup_temp_config_home(&config_home); } #[test] diff --git a/rust/crates/api/tests/client_integration.rs b/rust/crates/api/tests/client_integration.rs index b52f890..dcaf4f6 100644 --- a/rust/crates/api/tests/client_integration.rs +++ b/rust/crates/api/tests/client_integration.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use std::time::Duration; use api::{ - AnthropicClient, ApiError, AuthSource, ContentBlockDelta, ContentBlockDeltaEvent, + ApiClient, ApiError, AuthSource, ContentBlockDelta, ContentBlockDeltaEvent, ContentBlockStartEvent, InputContentBlock, InputMessage, MessageDeltaEvent, MessageRequest, OutputContentBlock, ProviderClient, StreamEvent, ToolChoice, ToolDefinition, }; @@ -34,7 +34,7 @@ async fn send_message_posts_json_and_parses_response() { ) .await; - let client = AnthropicClient::new("test-key") + let client = ApiClient::new("test-key") .with_auth_token(Some("proxy-token".to_string())) .with_base_url(server.base_url()); let response = client @@ -104,7 +104,7 @@ async fn stream_message_parses_sse_events_with_tool_use() { ) .await; - let client = AnthropicClient::new("test-key") + let client = ApiClient::new("test-key") .with_auth_token(Some("proxy-token".to_string())) .with_base_url(server.base_url()); let mut stream = client @@ -182,7 +182,7 @@ async fn retries_retryable_failures_before_succeeding() { ) .await; - let client = AnthropicClient::new("test-key") + let client = ApiClient::new("test-key") .with_base_url(server.base_url()) .with_retry_policy(2, Duration::from_millis(1), Duration::from_millis(2)); @@ -256,7 +256,7 @@ async fn surfaces_retry_exhaustion_for_persistent_retryable_errors() { ) .await; - let client = AnthropicClient::new("test-key") + let client = ApiClient::new("test-key") .with_base_url(server.base_url()) .with_retry_policy(1, Duration::from_millis(1), Duration::from_millis(2)); @@ -287,7 +287,7 @@ async fn surfaces_retry_exhaustion_for_persistent_retryable_errors() { #[tokio::test] #[ignore = "requires ANTHROPIC_API_KEY and network access"] async fn live_stream_smoke_test() { - let client = AnthropicClient::from_env().expect("ANTHROPIC_API_KEY must be set"); + let client = ApiClient::from_env().expect("ANTHROPIC_API_KEY must be set"); let mut stream = client .stream_message(&MessageRequest { model: std::env::var("ANTHROPIC_MODEL") diff --git a/rust/crates/commands/Cargo.toml b/rust/crates/commands/Cargo.toml index 71da51c..2263f7a 100644 --- a/rust/crates/commands/Cargo.toml +++ b/rust/crates/commands/Cargo.toml @@ -11,4 +11,4 @@ workspace = true [dependencies] plugins = { path = "../plugins" } runtime = { path = "../runtime" } -serde_json = "1" +serde_json.workspace = true diff --git a/rust/crates/plugins/Cargo.toml b/rust/crates/plugins/Cargo.toml index 1771acc..11213b5 100644 --- a/rust/crates/plugins/Cargo.toml +++ b/rust/crates/plugins/Cargo.toml @@ -7,7 +7,7 @@ publish.workspace = true [dependencies] serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json.workspace = true [lints] workspace = true diff --git a/rust/crates/plugins/src/lib.rs b/rust/crates/plugins/src/lib.rs index 844ee9b..0a54d76 100644 --- a/rust/crates/plugins/src/lib.rs +++ b/rust/crates/plugins/src/lib.rs @@ -1208,6 +1208,8 @@ impl PluginManager { let install_path = install_root.join(sanitize_plugin_id(&plugin_id)); let now = unix_time_ms(); let existing_record = registry.plugins.get(&plugin_id); + let installed_copy_is_valid = + install_path.exists() && load_plugin_from_directory(&install_path).is_ok(); let needs_sync = existing_record.is_none_or(|record| { record.kind != PluginKind::Bundled || record.version != manifest.version @@ -1215,6 +1217,7 @@ impl PluginManager { || record.description != manifest.description || record.install_path != install_path || !record.install_path.exists() + || !installed_copy_is_valid }); if !needs_sync { @@ -1294,6 +1297,7 @@ impl PluginManager { fn load_registry(&self) -> Result { let path = self.registry_path(); match fs::read_to_string(&path) { + Ok(contents) if contents.trim().is_empty() => Ok(InstalledPluginRegistry::default()), Ok(contents) => Ok(serde_json::from_str(&contents)?), Err(error) if error.kind() == std::io::ErrorKind::NotFound => { Ok(InstalledPluginRegistry::default()) @@ -2003,7 +2007,11 @@ mod tests { use super::*; fn temp_dir(label: &str) -> PathBuf { - std::env::temp_dir().join(format!("plugins-{label}-{}", unix_time_ms())) + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .expect("time should be after epoch") + .as_nanos(); + std::env::temp_dir().join(format!("plugins-{label}-{nanos}")) } fn write_file(path: &Path, contents: &str) { diff --git a/rust/crates/runtime/Cargo.toml b/rust/crates/runtime/Cargo.toml index 30c6d3c..f462205 100644 --- a/rust/crates/runtime/Cargo.toml +++ b/rust/crates/runtime/Cargo.toml @@ -11,7 +11,7 @@ glob = "0.3" plugins = { path = "../plugins" } regex = "1" serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json.workspace = true tokio = { version = "1", features = ["io-util", "macros", "process", "rt", "rt-multi-thread", "time"] } walkdir = "2" diff --git a/rust/crates/runtime/src/lib.rs b/rust/crates/runtime/src/lib.rs index 5206fa9..9dcb239 100644 --- a/rust/crates/runtime/src/lib.rs +++ b/rust/crates/runtime/src/lib.rs @@ -31,8 +31,8 @@ pub use config::{ RuntimePluginConfig, ScopedMcpServerConfig, CLAW_SETTINGS_SCHEMA_NAME, }; pub use conversation::{ - auto_compaction_threshold_from_env, ApiClient, ApiRequest, AssistantEvent, AutoCompactionEvent, - ConversationRuntime, RuntimeError, StaticToolExecutor, ToolError, ToolExecutor, TurnSummary, + ApiClient, ApiRequest, AssistantEvent, ConversationRuntime, RuntimeError, StaticToolExecutor, + ToolError, ToolExecutor, TurnSummary, }; pub use file_ops::{ edit_file, glob_search, grep_search, read_file, write_file, EditFileOutput, GlobSearchOutput, diff --git a/rust/crates/rusty-claude-cli/Cargo.toml b/rust/crates/rusty-claude-cli/Cargo.toml index 242ec0f..0541c9e 100644 --- a/rust/crates/rusty-claude-cli/Cargo.toml +++ b/rust/crates/rusty-claude-cli/Cargo.toml @@ -18,7 +18,7 @@ pulldown-cmark = "0.13" rustyline = "15" runtime = { path = "../runtime" } plugins = { path = "../plugins" } -serde_json = "1" +serde_json.workspace = true syntect = "5" tokio = { version = "1", features = ["rt-multi-thread", "time"] } tools = { path = "../tools" } diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 847f94f..83f0993 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -13,7 +13,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use api::{ detect_provider_kind, max_tokens_for_model, resolve_model_alias, resolve_startup_auth_source, - AnthropicClient, AuthSource, ContentBlockDelta, InputContentBlock, InputMessage, + ApiClient as ApiHttpClient, AuthSource, ContentBlockDelta, InputContentBlock, InputMessage, MessageRequest, MessageResponse, OutputContentBlock, ProviderClient, ProviderKind, StreamEvent as ApiStreamEvent, ToolChoice, ToolDefinition, ToolResultContentBlock, }; @@ -191,7 +191,7 @@ fn parse_args(args: &[String]) -> Result { index += 1; } "-p" => { - // Claude Code compat: -p "prompt" = one-shot prompt + // Claw Code compat: -p "prompt" = one-shot prompt let prompt = args[index + 1..].join(" "); if prompt.trim().is_empty() { return Err("-p requires a prompt string".to_string()); @@ -205,7 +205,7 @@ fn parse_args(args: &[String]) -> Result { }); } "--print" => { - // Claude Code compat: --print makes output non-interactive + // Claw Code compat: --print makes output non-interactive output_format = CliOutputFormat::Text; index += 1; } @@ -484,7 +484,7 @@ fn run_login() -> Result<(), Box> { return Err(io::Error::new(io::ErrorKind::InvalidData, "oauth state mismatch").into()); } - let client = AnthropicClient::from_auth(AuthSource::None).with_base_url(api::read_base_url()); + let client = ApiHttpClient::from_auth(AuthSource::None).with_base_url(api::read_base_url()); let exchange_request = OAuthTokenExchangeRequest::from_config(oauth, code, state, pkce.verifier, redirect_uri); let runtime = tokio::runtime::Runtime::new()?; @@ -899,6 +899,14 @@ fn run_resume_command( }) } SlashCommand::Resume { .. } + | SlashCommand::Bughunter { .. } + | SlashCommand::Commit + | SlashCommand::Pr { .. } + | SlashCommand::Issue { .. } + | SlashCommand::Ultraplan { .. } + | SlashCommand::Teleport { .. } + | SlashCommand::DebugToolCall + | SlashCommand::Plugins { .. } | SlashCommand::Model { .. } | SlashCommand::Permissions { .. } | SlashCommand::Session { .. } @@ -1153,6 +1161,17 @@ impl LiveCli { SlashCommand::Session { action, target } => { self.handle_session_command(action.as_deref(), target.as_deref())? } + SlashCommand::Bughunter { .. } + | SlashCommand::Commit + | SlashCommand::Pr { .. } + | SlashCommand::Issue { .. } + | SlashCommand::Ultraplan { .. } + | SlashCommand::Teleport { .. } + | SlashCommand::DebugToolCall + | SlashCommand::Plugins { .. } => { + eprintln!("slash command not supported in this REPL yet"); + false + } SlashCommand::Unknown(name) => { eprintln!("unknown slash command: /{name}"); false @@ -1437,7 +1456,7 @@ impl LiveCli { fn sessions_dir() -> Result> { let cwd = env::current_dir()?; - let path = cwd.join(".claude").join("sessions"); + let path = cwd.join(".claw").join("sessions"); fs::create_dir_all(&path)?; Ok(path) } @@ -2094,6 +2113,8 @@ impl ApiClient for ProviderRuntimeClient { input.push_str(&partial_json); } } + ContentBlockDelta::ThinkingDelta { .. } + | ContentBlockDelta::SignatureDelta { .. } => {} }, ApiStreamEvent::ContentBlockStop(stop) => { if let Some(rendered) = markdown_stream.flush(&renderer) { @@ -2595,6 +2616,7 @@ fn push_output_block( }; pending_tools.insert(block_index, (id, name, initial_input)); } + OutputContentBlock::Thinking { .. } | OutputContentBlock::RedactedThinking { .. } => {} } Ok(()) } @@ -3080,7 +3102,7 @@ mod tests { assert!(help.contains("/clear [--confirm]")); assert!(help.contains("/cost")); assert!(help.contains("/resume ")); - assert!(help.contains("/config [env|hooks|model]")); + assert!(help.contains("/config [env|hooks|model|plugins]")); assert!(help.contains("/memory")); assert!(help.contains("/init")); assert!(help.contains("/diff")); diff --git a/rust/crates/tools/Cargo.toml b/rust/crates/tools/Cargo.toml index 9ecbb06..04d738b 100644 --- a/rust/crates/tools/Cargo.toml +++ b/rust/crates/tools/Cargo.toml @@ -11,7 +11,7 @@ plugins = { path = "../plugins" } runtime = { path = "../runtime" } reqwest = { version = "0.12", default-features = false, features = ["blocking", "rustls-tls"] } serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json.workspace = true tokio = { version = "1", features = ["rt-multi-thread"] } [lints] diff --git a/rust/crates/tools/src/lib.rs b/rust/crates/tools/src/lib.rs index 63be324..33fa399 100644 --- a/rust/crates/tools/src/lib.rs +++ b/rust/crates/tools/src/lib.rs @@ -1308,6 +1308,12 @@ fn resolve_skill_path(skill: &str) -> Result { if let Ok(codex_home) = std::env::var("CODEX_HOME") { candidates.push(std::path::PathBuf::from(codex_home).join("skills")); } + if let Ok(home) = std::env::var("HOME") { + let home = std::path::PathBuf::from(home); + candidates.push(home.join(".agents").join("skills")); + candidates.push(home.join(".config").join("opencode").join("skills")); + candidates.push(home.join(".codex").join("skills")); + } candidates.push(std::path::PathBuf::from("/home/bellman/.codex/skills")); for root in candidates { @@ -1537,7 +1543,7 @@ fn allowed_tools_for_subagent(subagent_type: &str) -> BTreeSet { "SendUserMessage", "PowerShell", ], - "claude-code-guide" => vec![ + "claw-guide" => vec![ "read_file", "glob_search", "grep_search", @@ -1716,6 +1722,8 @@ impl ApiClient for ProviderRuntimeClient { input.push_str(&partial_json); } } + ContentBlockDelta::ThinkingDelta { .. } + | ContentBlockDelta::SignatureDelta { .. } => {} }, ApiStreamEvent::ContentBlockStop(stop) => { if let Some((id, name, input)) = pending_tools.remove(&stop.index) { @@ -1861,6 +1869,7 @@ fn push_output_block( }; pending_tools.insert(block_index, (id, name, initial_input)); } + OutputContentBlock::Thinking { .. } | OutputContentBlock::RedactedThinking { .. } => {} } } @@ -2089,7 +2098,7 @@ fn normalize_subagent_type(subagent_type: Option<&str>) -> String { "verification" | "verificationagent" | "verify" | "verifier" => { String::from("Verification") } - "claudecodeguide" | "claudecodeguideagent" | "guide" => String::from("claude-code-guide"), + "clawguide" | "clawguideagent" | "guide" => String::from("claw-guide"), "statusline" | "statuslinesetup" => String::from("statusline-setup"), _ => trimmed.to_string(), } @@ -2589,16 +2598,16 @@ fn config_file_for_scope(scope: ConfigScope) -> Result { let cwd = std::env::current_dir().map_err(|error| error.to_string())?; Ok(match scope { ConfigScope::Global => config_home_dir()?.join("settings.json"), - ConfigScope::Settings => cwd.join(".claude").join("settings.local.json"), + ConfigScope::Settings => cwd.join(".claw").join("settings.local.json"), }) } fn config_home_dir() -> Result { - if let Ok(path) = std::env::var("CLAUDE_CONFIG_HOME") { + if let Ok(path) = std::env::var("CLAW_CONFIG_HOME") { return Ok(PathBuf::from(path)); } let home = std::env::var("HOME").map_err(|_| String::from("HOME is not set"))?; - Ok(PathBuf::from(home).join(".claude")) + Ok(PathBuf::from(home).join(".claw")) } fn read_json_object(path: &Path) -> Result, String> { @@ -4043,19 +4052,19 @@ mod tests { )); let home = root.join("home"); let cwd = root.join("cwd"); - std::fs::create_dir_all(home.join(".claude")).expect("home dir"); - std::fs::create_dir_all(cwd.join(".claude")).expect("cwd dir"); + std::fs::create_dir_all(home.join(".claw")).expect("home dir"); + std::fs::create_dir_all(cwd.join(".claw")).expect("cwd dir"); std::fs::write( - home.join(".claude").join("settings.json"), + home.join(".claw").join("settings.json"), r#"{"verbose":false}"#, ) .expect("write global settings"); let original_home = std::env::var("HOME").ok(); - let original_claude_home = std::env::var("CLAUDE_CONFIG_HOME").ok(); + let original_config_home = std::env::var("CLAW_CONFIG_HOME").ok(); let original_dir = std::env::current_dir().expect("cwd"); std::env::set_var("HOME", &home); - std::env::remove_var("CLAUDE_CONFIG_HOME"); + std::env::remove_var("CLAW_CONFIG_HOME"); std::env::set_current_dir(&cwd).expect("set cwd"); let get = execute_tool("Config", &json!({"setting": "verbose"})).expect("get config"); @@ -4088,9 +4097,9 @@ mod tests { Some(value) => std::env::set_var("HOME", value), None => std::env::remove_var("HOME"), } - match original_claude_home { - Some(value) => std::env::set_var("CLAUDE_CONFIG_HOME", value), - None => std::env::remove_var("CLAUDE_CONFIG_HOME"), + match original_config_home { + Some(value) => std::env::set_var("CLAW_CONFIG_HOME", value), + None => std::env::remove_var("CLAW_CONFIG_HOME"), } let _ = std::fs::remove_dir_all(root); }