mod cmd;
mod mcp;
use clap::{Parser, Subcommand};
use tracing_subscriber::EnvFilter;
use cmd::blast_radius::BlastFormat;
#[derive(Parser)]
#[command(name = "gcx", version, about = "GitCortex knowledge-graph CLI")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(clap::ValueEnum, Clone)]
pub enum VizFormat {
Web,
Dot,
}
#[derive(Subcommand)]
enum Commands {
Init {
#[arg(long)]
ci: bool,
},
Hook {
#[arg(long)]
branch_switch: bool,
},
Serve,
#[command(subcommand)]
Query(QueryCmd),
Viz {
#[arg(long, default_value = "main")]
branch: String,
#[arg(long, default_value = "web", value_enum)]
format: VizFormat,
#[arg(long, default_value_t = 5678)]
port: u16,
},
BlastRadius {
#[arg(long, default_value = "main")]
base: String,
#[arg(long, default_value = "HEAD")]
head: String,
#[arg(long, default_value_t = 2)]
depth: u8,
#[arg(long, default_value = "text", value_enum)]
format: BlastFormat,
},
Export {
#[arg(long)]
branch: Option<String>,
},
Status {
#[arg(long)]
branch: Option<String>,
},
Clean,
}
#[derive(Subcommand)]
enum QueryCmd {
LookupSymbol {
name: String,
#[arg(long, default_value = "main")]
branch: String,
},
FindCallers {
name: String,
#[arg(long, default_value = "main")]
branch: String,
},
ListDefinitions {
file: String,
#[arg(long, default_value = "main")]
branch: String,
},
}
fn main() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_writer(std::io::stderr)
.init();
let cli = Cli::parse();
let result = match cli.command {
Commands::Init { ci } => cmd::init::run(ci),
Commands::Hook { branch_switch } => cmd::hook::run(branch_switch),
Commands::Serve => cmd::serve::run(),
Commands::Query(q) => cmd::query::run(q),
Commands::Viz {
branch,
format,
port,
} => cmd::viz::run(branch, port, format),
Commands::BlastRadius {
base,
head,
depth,
format,
} => cmd::blast_radius::run(base, head, depth, format),
Commands::Export { branch } => cmd::export::run(branch),
Commands::Status { branch } => cmd::status::run(branch),
Commands::Clean => cmd::clean::run(),
};
if let Err(e) = result {
eprintln!("error: {e:#}");
std::process::exit(1);
}
}