use std::process::ExitCode;
const HOOK_PROG_NAME: &str = "kindling-hook";
fn main() -> ExitCode {
if invoked_as_hook() {
return kindling::hook::run_hook(std::env::args().nth(1));
}
match std::env::args().nth(1).as_deref() {
Some("hook") => {
let type_arg = std::env::args().nth(2);
if type_arg.is_none() {
eprintln!("{}", hook_usage());
}
kindling::hook::run_hook(type_arg)
}
_ => delegate_to_cli(),
}
}
fn invoked_as_hook() -> bool {
let argv0 = std::env::args().next().unwrap_or_default();
basename(&argv0) == HOOK_PROG_NAME
}
fn basename(argv0: &str) -> &str {
std::path::Path::new(argv0)
.file_name()
.and_then(|s| s.to_str())
.unwrap_or(argv0)
}
fn delegate_to_cli() -> ExitCode {
let code = kindling::cli_main();
ExitCode::from(code.clamp(0, 255) as u8)
}
fn hook_usage() -> &'static str {
"usage: kindling hook <type>\n \
type: session-start | post-tool-use | post-tool-use-failure | \
user-prompt-submit | subagent-stop | stop | pre-compact\n\
(reads the Claude Code hook context as JSON on stdin; always exits 0)"
}