From b1696c34254a031dc54e22eab169fdc6303c0995 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Jun 2026 14:58:33 -0600 Subject: [PATCH] refactor: removed redundant skill name validation from has_skill function --- src/config/paths.rs | 12 ++++-------- src/config/request_context.rs | 3 ++- src/main.rs | 12 ++++++++---- src/vault/utils.rs | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/config/paths.rs b/src/config/paths.rs index 125fdf9..b50b11b 100644 --- a/src/config/paths.rs +++ b/src/config/paths.rs @@ -282,10 +282,6 @@ pub fn list_skills() -> Vec { } pub fn has_skill(name: &str) -> bool { - if validate_skill_name(name).is_err() { - return false; - } - skill_file(name).is_file() } @@ -345,11 +341,11 @@ mod tests { } #[test] - fn has_skill_returns_false_for_invalid_names() { - for bad in ["", "../escape", "foo/bar", ".hidden", "with space"] { + fn has_skill_returns_false_for_missing_paths() { + for absent in ["definitely-not-installed-skill-xyz", "another-missing"] { assert!( - !has_skill(bad), - "has_skill({bad:?}) should be false for an invalid name" + !has_skill(absent), + "has_skill({absent:?}) should be false for a missing skill" ); } } diff --git a/src/config/request_context.rs b/src/config/request_context.rs index 495d8b0..9d0996d 100644 --- a/src/config/request_context.rs +++ b/src/config/request_context.rs @@ -1231,7 +1231,8 @@ impl RequestContext { if let Some(ref tool_names) = role_filter { agent_functions.retain(|v| { tool_names.contains(&v.name) - || v.name.starts_with(SKILL_FUNCTION_PREFIX) + || (!matches!(agent.skills_enabled(), Some(false)) + && v.name.starts_with(SKILL_FUNCTION_PREFIX)) || v.name.starts_with(USER_FUNCTION_PREFIX) }); } diff --git a/src/main.rs b/src/main.rs index 4cdf493..bf593b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,14 +197,18 @@ async fn run( println!("{skills}"); return Ok(()); } - if cli.skill.len() == 1 && !paths::has_skill(&cli.skill[0]) { + if cli.skill.len() == 1 { let name = &cli.skill[0]; - let app = Arc::clone(&ctx.app.config); - ctx.upsert_skill(app.as_ref(), name)?; - return Ok(()); + paths::validate_skill_name(name)?; + if !paths::has_skill(name) { + let app = Arc::clone(&ctx.app.config); + ctx.upsert_skill(app.as_ref(), name)?; + return Ok(()); + } } if cli.skill.len() > 1 { for name in &cli.skill { + paths::validate_skill_name(name)?; if !paths::has_skill(name) { bail!("Skill '{name}' is not installed"); } diff --git a/src/vault/utils.rs b/src/vault/utils.rs index 1463689..0a21050 100644 --- a/src/vault/utils.rs +++ b/src/vault/utils.rs @@ -13,9 +13,9 @@ use gman::providers::one_password::OnePasswordProvider; use indoc::formatdoc; use inquire::validator::Validation; use inquire::{Confirm, Password, PasswordDisplayMode, Select, Text, min_length, required}; +use log::debug; use std::path::{Path, PathBuf}; use std::process::Command; -use log::debug; pub fn ensure_password_file_initialized(local_provider: &mut LocalProvider) -> Result<()> { let vault_password_file = local_provider