mod cli;
mod commands;
pub mod auto_context;
pub mod budget;
pub mod cache;
pub mod context_quality;
#[cfg(feature = "daemon")]
pub mod daemon;
#[cfg(feature = "embeddings")]
pub mod embeddings;
pub mod git;
pub mod index;
pub mod intelligence;
pub mod output;
pub mod parser;
pub mod relevance;
pub mod scanner;
pub mod schema;
pub mod util;
use clap::Parser;
use cli::{parse_token_count, Cli, Commands};
fn main() {
let cli = Cli::parse();
let result = match &cli.command {
Commands::Clean { path } => commands::clean::run(path),
#[cfg(feature = "daemon")]
Commands::Serve {
port,
tokens,
verbose,
mcp,
path,
} => {
let token_budget = match parse_token_count(tokens) {
Ok(0) => {
eprintln!("Error: --tokens must be greater than 0");
std::process::exit(1);
}
Ok(n) => n,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
};
if *mcp {
commands::serve::run_mcp(path)
} else {
commands::serve::run(path, *port, token_budget, *verbose)
}
}
#[cfg(feature = "daemon")]
Commands::Watch {
tokens,
format,
verbose,
path,
} => {
let token_budget = match parse_token_count(tokens) {
Ok(0) => {
eprintln!("Error: --tokens must be greater than 0");
std::process::exit(1);
}
Ok(n) => n,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
};
commands::watch::run(path, token_budget, format, *verbose)
}
Commands::Diff {
tokens,
out,
format,
verbose,
all,
git_ref,
focus,
since,
timing,
path,
} => {
let token_budget = match parse_token_count(tokens) {
Ok(0) => {
eprintln!("Error: --tokens must be greater than 0");
std::process::exit(1);
}
Ok(n) => n,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
};
let effective_git_ref = match (git_ref, since) {
(Some(_), _) => git_ref.clone(),
(None, Some(since_expr)) => match commands::diff::resolve_since(path, since_expr) {
Ok(r) => Some(r),
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
},
(None, None) => None,
};
commands::diff::run(
path,
effective_git_ref.as_deref(),
token_budget,
format,
out.as_deref(),
*verbose,
*all,
focus.as_deref(),
*timing,
)
}
Commands::Overview {
tokens,
out,
format,
verbose,
focus,
timing,
path,
} => {
let token_budget = match parse_token_count(tokens) {
Ok(0) => {
eprintln!("Error: --tokens must be greater than 0");
std::process::exit(1);
}
Ok(n) => n,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
};
commands::overview::run(
path,
token_budget,
format,
out.as_deref(),
*verbose,
focus.as_deref(),
*timing,
)
}
Commands::Trace {
tokens,
out,
format,
verbose,
all,
focus,
timing,
target,
path,
} => {
let token_budget = match parse_token_count(tokens) {
Ok(0) => {
eprintln!("Error: --tokens must be greater than 0");
std::process::exit(1);
}
Ok(n) => n,
Err(e) => {
eprintln!("Error: {e}");
std::process::exit(1);
}
};
commands::trace::run(
path,
target,
token_budget,
format,
out.as_deref(),
*verbose,
*all,
focus.as_deref(),
*timing,
)
}
};
if let Err(e) = result {
eprintln!("Error: {e}");
std::process::exit(1);
}
}