From c0a17031c5d1f1b7bf5b2b8b40dfed4eab8f37e7 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 1 Sep 2026 12:53:24 -0600 Subject: [PATCH] feat: added tab completions to --update-bundle flag --- src/cli/completer.rs | 9 +++++++++ src/cli/mod.rs | 5 +++-- src/config/bundles.rs | 15 +++++++++++++++ src/config/mod.rs | 1 + src/config/request_context.rs | 19 ++----------------- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/cli/completer.rs b/src/cli/completer.rs index 749902f..b64667c 100644 --- a/src/cli/completer.rs +++ b/src/cli/completer.rs @@ -105,6 +105,15 @@ pub(super) fn macro_completer(current: &OsStr) -> Vec { .collect() } +pub(super) fn bundle_completer(current: &OsStr) -> Vec { + let cur = current.to_string_lossy(); + crate::config::installed_bundle_names() + .into_iter() + .filter(|b| b.starts_with(&*cur)) + .map(CompletionCandidate::new) + .collect() +} + fn extract_agent_from_args() -> Option { let args: Vec = env::args().collect(); let mut i = 0; diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 848815c..fbd3d92 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,8 +1,8 @@ mod completer; use crate::cli::completer::{ - ShellCompletion, agent_completer, macro_completer, mcp_server_completer, model_completer, - rag_completer, role_completer, secrets_completer, session_completer, + ShellCompletion, agent_completer, bundle_completer, macro_completer, mcp_server_completer, + model_completer, rag_completer, role_completer, secrets_completer, session_completer, }; use crate::config::{AssetCategory, InstallFilter, MemoryScope}; use anyhow::{Context, Result}; @@ -230,6 +230,7 @@ pub struct Cli { value_name = "NAME", group = "yes_scope", conflicts_with_all = ["uninstall"], + add = ArgValueCompleter::new(bundle_completer), help_heading = "Installation & Updates" )] pub update_bundle: Option, diff --git a/src/config/bundles.rs b/src/config/bundles.rs index 69b181d..c48c560 100644 --- a/src/config/bundles.rs +++ b/src/config/bundles.rs @@ -9,6 +9,7 @@ use crate::utils::IS_STDOUT_TERMINAL; use anyhow::{Context, Result, bail}; use chrono::{SecondsFormat, Utc}; use inquire::Confirm; +use log::warn; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use std::collections::BTreeMap; @@ -637,6 +638,20 @@ pub(crate) fn bundle_list_rows(store: &BundleStore, config_dir: &Path) -> Vec Vec { + match BundleStore::load() { + Ok(store) => store + .bundle_names() + .into_iter() + .map(str::to_string) + .collect(), + Err(e) => { + warn!("skipping bundle-name completion: {e:#}"); + Vec::new() + } + } +} + pub fn list_installed_bundles() -> Result<()> { let store = BundleStore::load()?; let rows = bundle_list_rows(&store, &paths::config_dir()); diff --git a/src/config/mod.rs b/src/config/mod.rs index bbefe1d..0649765 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -33,6 +33,7 @@ pub use self::agent::{ pub use self::app_config::AppConfig; #[allow(unused_imports)] pub use self::app_state::AppState; +pub(crate) use self::bundles::installed_bundle_names; pub use self::bundles::list_installed_bundles; pub use self::input::Input; pub use self::install_remote::{ diff --git a/src/config/request_context.rs b/src/config/request_context.rs index ca3369b..6e97778 100644 --- a/src/config/request_context.rs +++ b/src/config/request_context.rs @@ -1,4 +1,4 @@ -use super::bundles::BundleStore; +use super::bundles::installed_bundle_names; use super::mcp_tool_policy::{McpToolPolicy, SkillMcpLayer, ToolFilter, expand_mcp_server_alias}; use super::rag_cache::{RagCache, RagKey}; use super::session::{INTERRUPTED_RESPONSE_TEXT, Session}; @@ -67,22 +67,6 @@ use std::sync::Arc; use std::time::Duration; use std::{env, fs}; -/// Completion must degrade rather than break the prompt, but a corrupt store -/// should not vanish silently: the failure is logged before returning empty. -fn installed_bundle_names() -> Vec { - match BundleStore::load() { - Ok(store) => store - .bundle_names() - .into_iter() - .map(str::to_string) - .collect(), - Err(e) => { - warn!("skipping bundle-name completion: {e:#}"); - Vec::new() - } - } -} - pub(crate) fn expand_enabled_mcp_server_ids( app: &AppConfig, mcp_config: &McpServersConfig, @@ -5210,6 +5194,7 @@ mod tests { use super::*; use crate::config::AppState; use crate::config::agent::AgentConfig; + use crate::config::bundles::BundleStore; use crate::config::mcp_tool_policy::LayerSource; use crate::config::tool_scope::test_fixtures::{FixtureServer, fixture_runtime}; use crate::function::jobs::RingBuf;