Skip to main content

cove_cli/commands/
kill.rs

1use crate::colors::*;
2use crate::events;
3use crate::tmux;
4
5/// Write an "end" event for a window's Claude pane before killing it.
6/// All errors are silently swallowed — kill must never fail because of event writing.
7fn write_end_event(window_name: &str) {
8    let pane_id = match tmux::get_claude_pane_id(window_name) {
9        Ok(id) => id,
10        Err(_) => return,
11    };
12    let session_id = match events::find_session_id(&pane_id) {
13        Some(id) => id,
14        None => return,
15    };
16    let cwd = tmux::list_windows()
17        .ok()
18        .and_then(|wins| {
19            wins.into_iter()
20                .find(|w| w.name == window_name)
21                .map(|w| w.pane_path)
22        })
23        .unwrap_or_default();
24    let _ = events::write_event(&session_id, &cwd, &pane_id, "end");
25}
26
27pub fn run(name: &str) -> Result<(), String> {
28    if !tmux::has_session() {
29        println!("{ANSI_OVERLAY}No active cove session.{ANSI_RESET}");
30        return Err(String::new());
31    }
32
33    write_end_event(name);
34    tmux::kill_window(name)?;
35    println!("Killed: {ANSI_PEACH}{name}{ANSI_RESET}");
36    Ok(())
37}
38
39pub fn run_all() -> Result<(), String> {
40    if !tmux::has_session() {
41        println!("{ANSI_OVERLAY}No active cove session.{ANSI_RESET}");
42        return Err(String::new());
43    }
44
45    if let Ok(windows) = tmux::list_windows() {
46        for win in &windows {
47            write_end_event(&win.name);
48        }
49    }
50    tmux::kill_session()?;
51    println!("Killed all sessions.");
52    Ok(())
53}