|
|
@@ -6,7 +6,7 @@ use std::path::{Path, PathBuf};
|
|
|
use crate::json::JsonValue;
|
|
|
use crate::sandbox::{FilesystemIsolationMode, SandboxConfig};
|
|
|
|
|
|
-pub const CLAUDE_CODE_SETTINGS_SCHEMA_NAME: &str = "SettingsSchema";
|
|
|
+pub const CLAW_SETTINGS_SCHEMA_NAME: &str = "SettingsSchema";
|
|
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
|
|
pub enum ConfigSource {
|
|
|
@@ -79,7 +79,7 @@ pub enum McpTransport {
|
|
|
Http,
|
|
|
Ws,
|
|
|
Sdk,
|
|
|
- ClaudeAiProxy,
|
|
|
+ ManagedProxy,
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
@@ -89,7 +89,7 @@ pub enum McpServerConfig {
|
|
|
Http(McpRemoteServerConfig),
|
|
|
Ws(McpWebSocketServerConfig),
|
|
|
Sdk(McpSdkServerConfig),
|
|
|
- ClaudeAiProxy(McpClaudeAiProxyServerConfig),
|
|
|
+ ManagedProxy(McpManagedProxyServerConfig),
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
@@ -120,7 +120,7 @@ pub struct McpSdkServerConfig {
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
-pub struct McpClaudeAiProxyServerConfig {
|
|
|
+pub struct McpManagedProxyServerConfig {
|
|
|
pub url: String,
|
|
|
pub id: String,
|
|
|
}
|
|
|
@@ -196,8 +196,8 @@ impl ConfigLoader {
|
|
|
#[must_use]
|
|
|
pub fn discover(&self) -> Vec<ConfigEntry> {
|
|
|
let user_legacy_path = self.config_home.parent().map_or_else(
|
|
|
- || PathBuf::from(".claude.json"),
|
|
|
- |parent| parent.join(".claude.json"),
|
|
|
+ || PathBuf::from(".claw.json"),
|
|
|
+ |parent| parent.join(".claw.json"),
|
|
|
);
|
|
|
vec![
|
|
|
ConfigEntry {
|
|
|
@@ -210,15 +210,15 @@ impl ConfigLoader {
|
|
|
},
|
|
|
ConfigEntry {
|
|
|
source: ConfigSource::Project,
|
|
|
- path: self.cwd.join(".claude.json"),
|
|
|
+ path: self.cwd.join(".claw.json"),
|
|
|
},
|
|
|
ConfigEntry {
|
|
|
source: ConfigSource::Project,
|
|
|
- path: self.cwd.join(".claude").join("settings.json"),
|
|
|
+ path: self.cwd.join(".claw").join("settings.json"),
|
|
|
},
|
|
|
ConfigEntry {
|
|
|
source: ConfigSource::Local,
|
|
|
- path: self.cwd.join(".claude").join("settings.local.json"),
|
|
|
+ path: self.cwd.join(".claw").join("settings.local.json"),
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -420,10 +420,10 @@ impl RuntimePluginConfig {
|
|
|
|
|
|
#[must_use]
|
|
|
pub fn default_config_home() -> PathBuf {
|
|
|
- std::env::var_os("CLAUDE_CONFIG_HOME")
|
|
|
+ std::env::var_os("CLAW_CONFIG_HOME")
|
|
|
.map(PathBuf::from)
|
|
|
- .or_else(|| std::env::var_os("HOME").map(|home| PathBuf::from(home).join(".claude")))
|
|
|
- .unwrap_or_else(|| PathBuf::from(".claude"))
|
|
|
+ .or_else(|| std::env::var_os("HOME").map(|home| PathBuf::from(home).join(".claw")))
|
|
|
+ .unwrap_or_else(|| PathBuf::from(".claw"))
|
|
|
}
|
|
|
|
|
|
impl RuntimeHookConfig {
|
|
|
@@ -486,7 +486,7 @@ impl McpServerConfig {
|
|
|
Self::Http(_) => McpTransport::Http,
|
|
|
Self::Ws(_) => McpTransport::Ws,
|
|
|
Self::Sdk(_) => McpTransport::Sdk,
|
|
|
- Self::ClaudeAiProxy(_) => McpTransport::ClaudeAiProxy,
|
|
|
+ Self::ManagedProxy(_) => McpTransport::ManagedProxy,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -494,7 +494,7 @@ impl McpServerConfig {
|
|
|
fn read_optional_json_object(
|
|
|
path: &Path,
|
|
|
) -> Result<Option<BTreeMap<String, JsonValue>>, ConfigError> {
|
|
|
- let is_legacy_config = path.file_name().and_then(|name| name.to_str()) == Some(".claude.json");
|
|
|
+ let is_legacy_config = path.file_name().and_then(|name| name.to_str()) == Some(".claw.json");
|
|
|
let contents = match fs::read_to_string(path) {
|
|
|
Ok(contents) => contents,
|
|
|
Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(None),
|
|
|
@@ -724,12 +724,10 @@ fn parse_mcp_server_config(
|
|
|
"sdk" => Ok(McpServerConfig::Sdk(McpSdkServerConfig {
|
|
|
name: expect_string(object, "name", context)?.to_string(),
|
|
|
})),
|
|
|
- "claudeai-proxy" => Ok(McpServerConfig::ClaudeAiProxy(
|
|
|
- McpClaudeAiProxyServerConfig {
|
|
|
- url: expect_string(object, "url", context)?.to_string(),
|
|
|
- id: expect_string(object, "id", context)?.to_string(),
|
|
|
- },
|
|
|
- )),
|
|
|
+ "claudeai-proxy" => Ok(McpServerConfig::ManagedProxy(McpManagedProxyServerConfig {
|
|
|
+ url: expect_string(object, "url", context)?.to_string(),
|
|
|
+ id: expect_string(object, "id", context)?.to_string(),
|
|
|
+ })),
|
|
|
other => Err(ConfigError::Parse(format!(
|
|
|
"{context}: unsupported MCP server type for {server_name}: {other}"
|
|
|
))),
|
|
|
@@ -942,7 +940,7 @@ fn push_unique(target: &mut Vec<String>, value: String) {
|
|
|
mod tests {
|
|
|
use super::{
|
|
|
ConfigLoader, ConfigSource, McpServerConfig, McpTransport, ResolvedPermissionMode,
|
|
|
- CLAUDE_CODE_SETTINGS_SCHEMA_NAME,
|
|
|
+ CLAW_SETTINGS_SCHEMA_NAME,
|
|
|
};
|
|
|
use crate::json::JsonValue;
|
|
|
use crate::sandbox::FilesystemIsolationMode;
|
|
|
@@ -961,7 +959,7 @@ mod tests {
|
|
|
fn rejects_non_object_settings_files() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
fs::create_dir_all(&cwd).expect("project dir");
|
|
|
fs::write(home.join("settings.json"), "[]").expect("write bad settings");
|
|
|
@@ -980,12 +978,12 @@ mod tests {
|
|
|
fn loads_and_merges_claude_code_config_files_by_precedence() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
- fs::create_dir_all(cwd.join(".claude")).expect("project config dir");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
+ fs::create_dir_all(cwd.join(".claw")).expect("project config dir");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
|
|
|
fs::write(
|
|
|
- home.parent().expect("home parent").join(".claude.json"),
|
|
|
+ home.parent().expect("home parent").join(".claw.json"),
|
|
|
r#"{"model":"haiku","env":{"A":"1"},"mcpServers":{"home":{"command":"uvx","args":["home"]}}}"#,
|
|
|
)
|
|
|
.expect("write user compat config");
|
|
|
@@ -995,17 +993,17 @@ mod tests {
|
|
|
)
|
|
|
.expect("write user settings");
|
|
|
fs::write(
|
|
|
- cwd.join(".claude.json"),
|
|
|
+ cwd.join(".claw.json"),
|
|
|
r#"{"model":"project-compat","env":{"B":"2"}}"#,
|
|
|
)
|
|
|
.expect("write project compat config");
|
|
|
fs::write(
|
|
|
- cwd.join(".claude").join("settings.json"),
|
|
|
+ cwd.join(".claw").join("settings.json"),
|
|
|
r#"{"env":{"C":"3"},"hooks":{"PostToolUse":["project"]},"mcpServers":{"project":{"command":"uvx","args":["project"]}}}"#,
|
|
|
)
|
|
|
.expect("write project settings");
|
|
|
fs::write(
|
|
|
- cwd.join(".claude").join("settings.local.json"),
|
|
|
+ cwd.join(".claw").join("settings.local.json"),
|
|
|
r#"{"model":"opus","permissionMode":"acceptEdits"}"#,
|
|
|
)
|
|
|
.expect("write local settings");
|
|
|
@@ -1014,7 +1012,7 @@ mod tests {
|
|
|
.load()
|
|
|
.expect("config should load");
|
|
|
|
|
|
- assert_eq!(CLAUDE_CODE_SETTINGS_SCHEMA_NAME, "SettingsSchema");
|
|
|
+ assert_eq!(CLAW_SETTINGS_SCHEMA_NAME, "SettingsSchema");
|
|
|
assert_eq!(loaded.loaded_entries().len(), 5);
|
|
|
assert_eq!(loaded.loaded_entries()[0].source, ConfigSource::User);
|
|
|
assert_eq!(
|
|
|
@@ -1056,12 +1054,12 @@ mod tests {
|
|
|
fn parses_sandbox_config() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
- fs::create_dir_all(cwd.join(".claude")).expect("project config dir");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
+ fs::create_dir_all(cwd.join(".claw")).expect("project config dir");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
|
|
|
fs::write(
|
|
|
- cwd.join(".claude").join("settings.local.json"),
|
|
|
+ cwd.join(".claw").join("settings.local.json"),
|
|
|
r#"{
|
|
|
"sandbox": {
|
|
|
"enabled": true,
|
|
|
@@ -1094,8 +1092,8 @@ mod tests {
|
|
|
fn parses_typed_mcp_and_oauth_config() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
- fs::create_dir_all(cwd.join(".claude")).expect("project config dir");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
+ fs::create_dir_all(cwd.join(".claw")).expect("project config dir");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
|
|
|
fs::write(
|
|
|
@@ -1132,7 +1130,7 @@ mod tests {
|
|
|
)
|
|
|
.expect("write user settings");
|
|
|
fs::write(
|
|
|
- cwd.join(".claude").join("settings.local.json"),
|
|
|
+ cwd.join(".claw").join("settings.local.json"),
|
|
|
r#"{
|
|
|
"mcpServers": {
|
|
|
"remote-server": {
|
|
|
@@ -1185,8 +1183,8 @@ mod tests {
|
|
|
fn parses_plugin_config_from_enabled_plugins() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
- fs::create_dir_all(cwd.join(".claude")).expect("project config dir");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
+ fs::create_dir_all(cwd.join(".claw")).expect("project config dir");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
|
|
|
fs::write(
|
|
|
@@ -1223,8 +1221,8 @@ mod tests {
|
|
|
fn parses_plugin_config() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
- fs::create_dir_all(cwd.join(".claude")).expect("project config dir");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
+ fs::create_dir_all(cwd.join(".claw")).expect("project config dir");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
|
|
|
fs::write(
|
|
|
@@ -1275,7 +1273,7 @@ mod tests {
|
|
|
fn rejects_invalid_mcp_server_shapes() {
|
|
|
let root = temp_dir();
|
|
|
let cwd = root.join("project");
|
|
|
- let home = root.join("home").join(".claude");
|
|
|
+ let home = root.join("home").join(".claw");
|
|
|
fs::create_dir_all(&home).expect("home config dir");
|
|
|
fs::create_dir_all(&cwd).expect("project dir");
|
|
|
fs::write(
|