kaizen-cli 0.1.45

Distributable agent observability: real-time-tailable sessions, agile-style retros, and repo-level improvement (Cursor, Claude Code, Codex). SQLite, redact before any sync you enable.
Documentation
use std::ffi::OsString;

#[test]
fn init_wires_user_prompt_capture_in_user_config() -> anyhow::Result<()> {
    let temp = tempfile::tempdir()?;
    let workspace = temp.path().join("workspace");
    std::fs::create_dir(&workspace)?;
    let _home = EnvGuard::set("HOME", temp.path().into());
    let _kaizen = EnvGuard::set("KAIZEN_HOME", temp.path().join("kaizen").into());
    kaizen::shell::init::init_text(Some(&workspace))?;
    let raw = std::fs::read_to_string(temp.path().join(".claude/settings.json"))?;
    let value: serde_json::Value = serde_json::from_str(&raw)?;
    assert!(value.pointer("/hooks/UserPromptSubmit").is_some());
    Ok(())
}

struct EnvGuard(&'static str, Option<OsString>);

impl EnvGuard {
    fn set(key: &'static str, value: OsString) -> Self {
        let old = std::env::var_os(key);
        unsafe { std::env::set_var(key, value) };
        Self(key, old)
    }
}

impl Drop for EnvGuard {
    fn drop(&mut self) {
        match self.1.take() {
            Some(value) => unsafe { std::env::set_var(self.0, value) },
            None => unsafe { std::env::remove_var(self.0) },
        }
    }
}