83 lines
2.6 KiB
Rust
83 lines
2.6 KiB
Rust
//! agent-manager — a CLI to manage local AI coding agents.
|
|
//!
|
|
//! The crate is organised around a few core concepts:
|
|
//!
|
|
//! * cli — clap definitions for the am command line interface.
|
|
//! * config — YAML schema, loading, validation, includes, path expansion.
|
|
//! * catalog — the merged agent catalog (embedded defaults + user config).
|
|
//! * state — the local installation database (JSON file).
|
|
//! * process — background/foreground process management (PID bookkeeping).
|
|
//! * installers — one installer per method (npm, pip, cargo, go, bun, curl,
|
|
//! binary, git).
|
|
//! * commands — one module per CLI command.
|
|
|
|
pub mod app;
|
|
pub mod catalog;
|
|
pub mod cli;
|
|
pub mod commands;
|
|
pub mod config;
|
|
pub mod deps;
|
|
pub mod doctor;
|
|
pub mod download;
|
|
pub mod events;
|
|
pub mod help;
|
|
pub mod installers;
|
|
pub mod nav;
|
|
pub mod output;
|
|
pub mod probe;
|
|
pub mod ps;
|
|
pub mod process;
|
|
pub mod repl;
|
|
pub mod runner;
|
|
pub mod sessions;
|
|
pub mod shell;
|
|
pub mod state;
|
|
pub mod tables;
|
|
pub mod theme;
|
|
pub mod toolchain;
|
|
pub mod version;
|
|
|
|
use clap::Parser;
|
|
|
|
/// CLI entry point used by the am binary. Returns the process exit code.
|
|
pub fn main_entry() -> i32 {
|
|
// Enable ANSI escape sequences on Windows consoles (best effort): the
|
|
// colored crate and the theme palettes both emit raw VT codes.
|
|
#[cfg(windows)]
|
|
let _ = colored::control::set_virtual_terminal(true);
|
|
|
|
// Nushell-style help: 'am -h', 'am install -h', 'am ls --help', ... all
|
|
// show the custom help before clap gets a chance to parse the line.
|
|
let args: Vec<String> = std::env::args().collect();
|
|
if let Some(code) = help::intercept(&args) {
|
|
return code;
|
|
}
|
|
let cli = cli::Cli::parse();
|
|
match app::App::from_cli(cli) {
|
|
Ok(app) => match commands::execute(&app) {
|
|
Ok(code) => code,
|
|
Err(err) => {
|
|
if app.json() {
|
|
let payload = serde_json::json!({
|
|
"error": format!("{:#}", err),
|
|
});
|
|
let _ = serde_json::to_writer_pretty(std::io::stdout(), &payload);
|
|
let _ = writeln!(std::io::stdout());
|
|
} else {
|
|
eprintln!("{} {}", "error:".red().bold(), format!("{:#}", err));
|
|
}
|
|
1
|
|
}
|
|
},
|
|
Err(err) => {
|
|
// Config could not even be loaded: fall back to plain stderr output.
|
|
eprintln!("{} {}", "error:".red().bold(), format!("{:#}", err));
|
|
1
|
|
}
|
|
}
|
|
}
|
|
|
|
#[allow(unused_imports)]
|
|
use colored::Colorize;
|
|
use std::io::Write;
|