mod agents;
mod commands;
mod daemon_cli;
mod database;
mod flags;
mod git;
mod profile;
mod remote;
mod setup;
mod tui;
use std::process::ExitCode;
use nomoreide_daemon_client::{resolve_daemon_port, RuntimePaths};
pub async fn run() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
let command = args.first().map(String::as_str).unwrap_or("mcp");
let paths = RuntimePaths::default();
let configured_port =
resolve_daemon_port(std::env::var("NOMOREIDE_DAEMON_PORT").ok().as_deref());
let code = match command {
"setup" => setup::run(&args[1..]),
"mcp" | "start" if args.len() <= 1 => match nomoreide_mcp::run_stdio().await {
Ok(()) => 0,
Err(error) => {
eprintln!("nomoreide: MCP server failed: {error}");
1
}
},
"daemon" => {
let rest = &args[1..];
let port = daemon_cli::port_flag(rest).unwrap_or(configured_port);
if rest.iter().any(|arg| !arg.starts_with("--")) {
daemon_cli::run(rest, &paths, port).await
} else {
return run_foreground_daemon(port).await;
}
}
"web" => web(&paths, configured_port).await,
"tui" => match tui::run(&paths, configured_port).await {
Ok(()) => 0,
Err(error) => {
if let Some(message) = error.message_text() {
eprintln!("{message}");
}
error.exit_code()
}
},
"__terminal-attach" => {
let socket = args.get(1).map(String::as_str).unwrap_or("");
let token = args.get(2).map(String::as_str).unwrap_or("");
match nomoreide_core::external_terminal::run_attach(socket, token) {
Ok(()) => 0,
Err(error) => {
eprintln!("{error}");
1
}
}
}
_ => commands::run(&args, &paths, configured_port).await,
};
ExitCode::from(code)
}
async fn run_foreground_daemon(port: u16) -> ExitCode {
let options = nomoreide_daemon::DaemonOptions {
port,
..Default::default()
};
match nomoreide_daemon::run(options).await {
Ok(()) => ExitCode::SUCCESS,
Err(error) => {
eprintln!("nomoreide: daemon failed: {error:#}");
ExitCode::FAILURE
}
}
}
async fn web(paths: &RuntimePaths, configured_port: u16) -> u8 {
let port = std::env::args()
.find_map(|arg| {
arg.strip_prefix("--port=")
.map(|value| resolve_daemon_port(Some(value)))
})
.unwrap_or(configured_port);
match nomoreide_daemon_client::ensure_daemon(paths, port, env!("CARGO_PKG_VERSION")).await {
Ok(daemon) => {
if let Some(warning) = &daemon.version_warning {
eprintln!("{warning}");
}
if daemon.status == nomoreide_daemon_client::EnsureStatus::Upgraded {
eprintln!(
"NoMoreIDE daemon updated to v{}.",
env!("CARGO_PKG_VERSION")
);
}
eprintln!(
"NoMoreIDE web UI: http://127.0.0.1:{}",
daemon.endpoint.port()
);
0
}
Err(error) => {
eprintln!("{error}");
1
}
}
}