Skip to main content

agm/
main.rs

1//! Launch a Zellij session with a vertical tab sidebar plugin.
2//!
3//! Subcommands:
4//! - `install` — build the WASM plugin, deploy it, and install Claude, Cursor, Codex, Gemini, and Opencode hooks.
5//! - `git-stat` — print git statistics for a directory.
6//! - `git-stat` — print `path insertions deletions untracked` per path (one line each).
7//!
8//! # Errors
9//! - Zellij invocation fails.
10#![feature(exit_status_error)]
11
12use rootcause::report;
13use ytil_cmd::CmdExt as _;
14use ytil_sys::cli::Args;
15
16mod cmd;
17
18const SESSION_NAME: &str = "agm";
19const LAYOUT_NAME: &str = "agm";
20
21fn launch_session(args: &[String]) -> rootcause::Result<()> {
22    let session_name = args.first().map_or(SESSION_NAME, String::as_str);
23
24    if ytil_zellij::list_sessions().is_ok_and(|sessions| sessions.iter().any(|s| s.name == session_name)) {
25        ytil_zellij::attach_session(session_name)?;
26        return Ok(());
27    }
28
29    if ytil_zellij::is_active() {
30        ytil_cmd::silent_cmd("zellij")
31            .args(["--new-session-with-layout", LAYOUT_NAME, "--session", session_name])
32            .exec()?;
33        return Ok(());
34    }
35
36    ytil_zellij::new_session_with_layout(session_name, LAYOUT_NAME)
37}
38
39#[ytil_sys::main]
40fn main() -> rootcause::Result<()> {
41    let args = ytil_sys::cli::get();
42
43    if args.has_help() {
44        println!("{}", include_str!("../help.txt"));
45        return Ok(());
46    }
47
48    match args.first().map(String::as_str) {
49        Some("install") => {
50            let is_debug = args.iter().any(|a| a == "--debug");
51            cmd::install::install_plugin_and_hooks(is_debug)
52        }
53        Some("git-stat") => {
54            let paths = args.get(1..);
55            for cwd in paths.into_iter().flatten() {
56                let stat = cmd::git_stat::run(cwd);
57                println!("{cwd} {stat}");
58            }
59            Ok(())
60        }
61        Some("sessions") => cmd::sessions::run(),
62        None => launch_session(&args),
63        Some(unknown) => Err(report!("unknown argument").attach(format!("argument={unknown}"))),
64    }
65}