diff --git a/Cargo.lock b/Cargo.lock index 8f4f2d4..88d6cb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ dependencies = [ [[package]] name = "agent-manager" -version = "0.2.10" +version = "0.2.11" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 61d44f3..2bffdbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "agent-manager" -version = "0.2.10" +version = "0.2.11" edition = "2021" description = "Manage local AI coding agents: list, install, start, stop, update — with automatic dependency handling and a YAML-driven catalog." license = "MIT" diff --git a/src/repl.rs b/src/repl.rs index 33d77c3..2c229b2 100644 --- a/src/repl.rs +++ b/src/repl.rs @@ -354,6 +354,7 @@ pub fn banner_box( version: &str, agents: usize, installed: usize, + external: usize, session: &ShellSession, session_id: &str, cwd: &str, @@ -425,7 +426,7 @@ pub fn banner_box( rows.push(blank()); rows.push(inner(dim( &format!( - "am v{version} · {agents} agents · {installed} installed · shell {} · /help for commands", + "am v{version} · {agents} agents · {external} external · {installed} managed · shell {} · /help for commands", session.current.name ), color, @@ -449,6 +450,7 @@ pub fn banner(app: &App, session: &ShellSession, session_id: &str) -> String { env!("CARGO_PKG_VERSION"), agent_count(app), installed_count(app), + external_count(app), session, session_id, ¤t_dir_string(), @@ -484,8 +486,9 @@ fn print_status(app: &App, session: &ShellSession, started: Instant) { ); let counts = dim( &format!( - "{} agents · {} installed", + "{} agents · {} external · {} managed", agent_count(app), + external_count(app), installed_count(app) ), color, @@ -609,6 +612,25 @@ fn installed_count(app: &App) -> usize { .unwrap_or(0) } +/// Number of external agents (installed outside agent-manager) detected on +/// the PATH — the same definition used by the "external" status in am list. +fn external_count(app: &App) -> usize { + let probe = crate::probe::detect_externals(app); + let managed: std::collections::BTreeSet = app + .state + .load() + .ok() + .map(|s| s.installed.keys().cloned().collect()) + .unwrap_or_default(); + app.catalog + .agents() + .iter() + .filter(|a| !a.hidden && a.installable) + .filter(|a| !managed.contains(&a.name)) + .filter(|a| probe.path_of(&a.name).is_some()) + .count() +} + fn current_dir_string() -> String { std::env::current_dir() .map(|p| p.display().to_string()) @@ -1245,6 +1267,7 @@ mod tests { "9.9.9", 65, 3, + 12, &session, "20260815_123456_abcdef", "/home/alice/dev/agent-manager", @@ -1258,6 +1281,8 @@ mod tests { assert!(text.contains("(default)")); assert!(text.contains("bash")); assert!(text.contains("/help for commands")); + assert!(text.contains("12 external")); + assert!(text.contains("3 managed")); assert!(text.contains("agent-manager")); }