From c63eb0a9f92d93cb699a88d7511ab00b1054d7fc Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 1 Jun 2026 14:27:40 -0600 Subject: [PATCH] feat: support multiple skill flags to load multiple skills at CLI startup --- src/cli/mod.rs | 18 ++++++++++++++---- src/main.rs | 14 ++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index eb1f298..00c6bd3 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -119,9 +119,11 @@ pub struct Cli { /// List all installed skills #[arg(long)] pub list_skills: bool, - /// Open a skill in $EDITOR (creates with a scaffold if missing) + /// Pre-load an existing skill into the session (repeatable). If a single + /// `--skill ` is given and the skill doesn't exist, opens $EDITOR + /// with a scaffold to create it. #[arg(long, value_name = "NAME")] - pub skill: Option, + pub skill: Vec, /// Input text #[arg(trailing_var_arg = true)] text: Vec, @@ -309,8 +311,16 @@ mod tests { #[test] fn parse_skill_flag_takes_name() { - assert_eq!(parse(&["--skill", "git-master"]).skill.as_deref(), Some("git-master")); - assert!(parse(&[]).skill.is_none()); + assert_eq!(parse(&["--skill", "git-master"]).skill, vec!["git-master"]); + assert!(parse(&[]).skill.is_empty()); + } + + #[test] + fn parse_multiple_skill_flags_preserves_order() { + assert_eq!( + parse(&["--skill", "alpha", "--skill", "beta", "--skill", "gamma"]).skill, + vec!["alpha", "beta", "gamma"] + ); } #[test] diff --git a/src/main.rs b/src/main.rs index 9bc596b..d054b19 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,13 +197,19 @@ async fn run( println!("{skills}"); return Ok(()); } - if let Some(name) = &cli.skill - && !paths::has_skill(name) - { + if cli.skill.len() == 1 && !paths::has_skill(&cli.skill[0]) { + let name = &cli.skill[0]; 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 { + if !paths::has_skill(name) { + bail!("Skill '{name}' is not installed"); + } + } + } if cli.dry_run { update_app_config(&mut ctx, |app| app.dry_run = true); @@ -317,7 +323,7 @@ async fn run( .await?; } - if let Some(name) = &cli.skill { + for name in &cli.skill { ctx.load_skill_repl(name, abort_signal.clone()).await?; }