From 5254512c857ba88ccba765b9d4e456729749243c Mon Sep 17 00:00:00 2001 From: Clawdbot Date: Mon, 6 Apr 2026 04:38:24 +0200 Subject: [PATCH] fix(claude): preserve hooks when syncing settings Fixes #1907 Co-Authored-By: Claude --- src-tauri/src/services/provider/live.rs | 19 ++++++++++++++++++- src-tauri/tests/provider_service.rs | 20 +++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/services/provider/live.rs b/src-tauri/src/services/provider/live.rs index d040f4ea6..dde1649be 100644 --- a/src-tauri/src/services/provider/live.rs +++ b/src-tauri/src/services/provider/live.rs @@ -666,7 +666,24 @@ pub(crate) fn write_live_snapshot(app_type: &AppType, provider: &Provider) -> Re match app_type { AppType::Claude => { let path = get_claude_settings_path(); - let settings = sanitize_claude_settings_for_live(&provider.settings_config); + let mut settings = sanitize_claude_settings_for_live(&provider.settings_config); + + if path.exists() { + if let Ok(existing) = read_json_file::(&path) { + if let (Some(existing_obj), Some(settings_obj)) = + (existing.as_object(), settings.as_object_mut()) + { + for key in ["hooks", "includeCoAuthoredBy"] { + if !settings_obj.contains_key(key) { + if let Some(value) = existing_obj.get(key) { + settings_obj.insert(key.to_string(), value.clone()); + } + } + } + } + } + } + write_json_file(&path, &settings)?; } AppType::Codex => { diff --git a/src-tauri/tests/provider_service.rs b/src-tauri/tests/provider_service.rs index c4400c230..70a954afd 100644 --- a/src-tauri/tests/provider_service.rs +++ b/src-tauri/tests/provider_service.rs @@ -594,7 +594,11 @@ fn provider_service_switch_claude_updates_live_and_state() { }, "workspace": { "path": "/tmp/workspace" - } + }, + "hooks": { + "before": ["echo hello"] + }, + "includeCoAuthoredBy": false }); std::fs::write( &settings_path, @@ -649,6 +653,20 @@ fn provider_service_switch_claude_updates_live_and_state() { "live settings.json should reflect new provider auth" ); + assert_eq!( + live_after.get("hooks"), + legacy_live.get("hooks"), + "hooks should be preserved when switching providers" + ); + + assert_eq!( + live_after + .get("includeCoAuthoredBy") + .and_then(|value| value.as_bool()), + Some(false), + "includeCoAuthoredBy should be preserved when switching providers" + ); + let providers = state .db .get_all_providers(AppType::Claude.as_str())