generated from nhcarrigan/template
feat: expose --name CLI flag as session name at startup (#226)
Adds session_name to ClaudeStartOptions and passes --name to Claude Code on initial session start, keeping tab names in sync with Claude Code.
This commit is contained in:
@@ -51,6 +51,9 @@ pub struct ClaudeStartOptions {
|
|||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub model_overrides: Option<HashMap<String, String>>,
|
pub model_overrides: Option<HashMap<String, String>>,
|
||||||
|
|
||||||
|
#[serde(default)]
|
||||||
|
pub session_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
|||||||
@@ -287,6 +287,13 @@ impl WslBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass session name to Claude Code if specified
|
||||||
|
if let Some(ref name) = options.session_name {
|
||||||
|
if !name.is_empty() {
|
||||||
|
cmd.args(["--name", name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add worktree flag if requested
|
// Add worktree flag if requested
|
||||||
if options.use_worktree {
|
if options.use_worktree {
|
||||||
cmd.arg("--worktree");
|
cmd.arg("--worktree");
|
||||||
@@ -466,6 +473,14 @@ impl WslBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass session name to Claude Code if specified
|
||||||
|
if let Some(ref name) = options.session_name {
|
||||||
|
if !name.is_empty() {
|
||||||
|
let escaped = name.replace('\'', "'\\''");
|
||||||
|
claude_cmd.push_str(&format!(" --name '{}'", escaped));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add worktree flag if requested
|
// Add worktree flag if requested
|
||||||
if options.use_worktree {
|
if options.use_worktree {
|
||||||
claude_cmd.push_str(" --worktree");
|
claude_cmd.push_str(" --worktree");
|
||||||
@@ -3577,4 +3592,45 @@ mod tests {
|
|||||||
"Session stopped due to an unknown API error"
|
"Session stopped due to an unknown API error"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Build the --name argument string without executing a command (for testing)
|
||||||
|
#[cfg(test)]
|
||||||
|
fn build_session_name_arg(name: &str) -> Option<(String, String)> {
|
||||||
|
if name.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
Some(("--name".to_string(), name.to_string()))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_e2e_session_name_passed_when_set() {
|
||||||
|
let name = "Sakura";
|
||||||
|
let result = build_session_name_arg(name);
|
||||||
|
assert!(result.is_some());
|
||||||
|
let (flag, value) = result.unwrap();
|
||||||
|
assert_eq!(flag, "--name");
|
||||||
|
assert_eq!(value, "Sakura");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_e2e_session_name_not_passed_when_none() {
|
||||||
|
let options = ClaudeStartOptions {
|
||||||
|
session_name: None,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
// When session_name is None, no --name arg should be produced
|
||||||
|
let has_name = options.session_name.as_deref().map(|n| !n.is_empty()).unwrap_or(false);
|
||||||
|
assert!(!has_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_e2e_session_name_not_passed_when_empty() {
|
||||||
|
let options = ClaudeStartOptions {
|
||||||
|
session_name: Some(String::new()),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
// When session_name is Some(""), no --name arg should be produced
|
||||||
|
let has_name = options.session_name.as_deref().map(|n| !n.is_empty()).unwrap_or(false);
|
||||||
|
assert!(!has_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ async function changeDirectory(path: string): Promise<void> {
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -152,6 +153,7 @@ async function startNewConversation(): Promise<void> {
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -406,6 +406,7 @@ User: ${formattedMessage}`;
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,7 @@
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -160,6 +160,7 @@
|
|||||||
if (!conversationId) {
|
if (!conversationId) {
|
||||||
throw new Error("No active conversation");
|
throw new Error("No active conversation");
|
||||||
}
|
}
|
||||||
|
const activeConversationForName = get(conversationsStore.activeConversation);
|
||||||
await invoke("start_claude", {
|
await invoke("start_claude", {
|
||||||
conversationId,
|
conversationId,
|
||||||
options: {
|
options: {
|
||||||
@@ -177,6 +178,7 @@
|
|||||||
enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: currentConfig.auto_memory_directory || null,
|
auto_memory_directory: currentConfig.auto_memory_directory || null,
|
||||||
model_overrides: currentConfig.model_overrides || null,
|
model_overrides: currentConfig.model_overrides || null,
|
||||||
|
session_name: activeConversationForName?.name || null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -338,6 +340,7 @@
|
|||||||
enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: currentConfig.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: currentConfig.auto_memory_directory || null,
|
auto_memory_directory: currentConfig.auto_memory_directory || null,
|
||||||
model_overrides: currentConfig.model_overrides || null,
|
model_overrides: currentConfig.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -222,6 +222,7 @@
|
|||||||
enable_claudeai_mcp_servers: cfg.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: cfg.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: cfg.auto_memory_directory || null,
|
auto_memory_directory: cfg.auto_memory_directory || null,
|
||||||
model_overrides: cfg.model_overrides || null,
|
model_overrides: cfg.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -112,6 +112,7 @@
|
|||||||
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
enable_claudeai_mcp_servers: config.enable_claudeai_mcp_servers ?? true,
|
||||||
auto_memory_directory: config.auto_memory_directory || null,
|
auto_memory_directory: config.auto_memory_directory || null,
|
||||||
model_overrides: config.model_overrides || null,
|
model_overrides: config.model_overrides || null,
|
||||||
|
session_name: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user