Menu
Public repository / ec19c1e2be3ce7356eb8894247e5ddc1d9f3ccd1
AkurAI-Notes / crates/notes-cli/src/main.rs
Latest change ec19c1e2be3ce7356eb8894247e5ddc1d9f3ccd1 - E03: AkurAI IDP SSO login — port idp_client.rs + session.rs + auth routes by Claude Code
#![forbid(unsafe_code)]
mod cmd_serve;
mod cmd_mcp;
mod cmd_seed;
use std::path::PathBuf;
use std::process::ExitCode;
const VERSION: &str = env!("CARGO_PKG_VERSION");
fn main() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
match run(&args) {
Ok(()) => ExitCode::SUCCESS,
Err(msg) => {
eprintln!("error: {msg}");
ExitCode::FAILURE
}
}
}
fn run(args: &[String]) -> Result<(), String> {
match args.first().map(String::as_str) {
Some("serve") => {
let cfg = parse_serve(&args[1..])?;
cmd_serve::run(cfg).map_err(|e| e.to_string())
}
Some("mcp") => {
cmd_mcp::run(&args[1..]).map_err(|e| e.to_string())
}
Some("seed") => {
let db_path = args.get(1).map(|s| s.as_str()).unwrap_or("notes.db");
cmd_seed::run(db_path)
}
Some("version") | Some("--version") | Some("-V") => {
println!("akurai-notes {VERSION}");
Ok(())
}
Some("help") | Some("--help") | Some("-h") | None => {
print_help();
Ok(())
}
Some(other) => Err(format!("unknown command '{other}' (try: akurai-notes help)")),
}
}
fn parse_serve(args: &[String]) -> Result<cmd_serve::Config, String> {
let mut host = "127.0.0.1".to_string();
let mut port: u16 = 8099;
let mut dir = PathBuf::from("site/frontend");
let mut db = "notes.db".to_string();
let mut i = 0;
while i < args.len() {
match args[i].as_str() {
"--host" => {
host = next(args, &mut i, "--host")?;
}
"--port" | "-p" => {
port = next(args, &mut i, "--port")?
.parse()
.map_err(|_| "invalid --port".to_string())?;
}
"--dir" => {
dir = PathBuf::from(next(args, &mut i, "--dir")?);
}
"--db" => {
db = next(args, &mut i, "--db")?;
}
other => return Err(format!("unknown flag '{other}'")),
}
i += 1;
}
Ok(cmd_serve::Config { host, port, dir, db })
}
fn next(args: &[String], i: &mut usize, flag: &str) -> Result<String, String> {
*i += 1;
args.get(*i)
.cloned()
.ok_or_else(|| format!("{flag} needs a value"))
}
fn print_help() {
println!("akurai-notes {VERSION} — Private notes with semantic search\n");
println!("USAGE:");
println!(" akurai-notes serve [opts] Start the Notes web server");
println!(" akurai-notes mcp [opts] Start the MCP server");
println!(" akurai-notes seed [db] Seed the database with demo data");
println!(" akurai-notes version Print version\n");
println!("SERVE OPTIONS:");
println!(" --host <addr> Bind host (default: 127.0.0.1)");
println!(" --port, -p <n> Bind port (default: 8099)");
println!(" --dir <path> Frontend directory (default: site/frontend)");
println!(" --db <path> Database file (default: notes.db)");
}