diff --git a/src/cortex-cli/src/agent_cmd/utils.rs b/src/cortex-cli/src/agent_cmd/utils.rs index a4318d19..c00e03c6 100644 --- a/src/cortex-cli/src/agent_cmd/utils.rs +++ b/src/cortex-cli/src/agent_cmd/utils.rs @@ -72,6 +72,10 @@ pub fn matches_pattern(name: &str, pattern: &str) -> bool { let pattern = pattern.to_lowercase(); let name = name.to_lowercase(); + if pattern == "*" { + return true; + } + // Handle simple glob patterns if pattern.starts_with('*') && pattern.ends_with('*') { // *pattern* - contains @@ -212,8 +216,8 @@ mod tests { assert!(matches_pattern("", "")); // Empty pattern doesn't match non-empty name assert!(!matches_pattern("anything", "")); - // Note: Single "*" glob pattern has a bug in production code that causes a panic, - // so we don't test that edge case here. Use "*pattern" or "pattern*" instead. + // A single "*" matches any agent name. + assert!(matches_pattern("anything", "*")); } // =========================================== diff --git a/src/cortex-cli/tests/agent_filter.rs b/src/cortex-cli/tests/agent_filter.rs new file mode 100644 index 00000000..949da987 --- /dev/null +++ b/src/cortex-cli/tests/agent_filter.rs @@ -0,0 +1,26 @@ +use std::process::Command; + +#[test] +fn agent_list_single_wildcard_filter_does_not_panic() { + let home = tempfile::tempdir().expect("temp home"); + let output = Command::new(env!("CARGO_BIN_EXE_Cortex")) + .args(["agent", "list", "--filter", "*", "--json"]) + .env("HOME", home.path()) + .env("USERPROFILE", home.path()) + .output() + .expect("run Cortex agent list"); + + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + + assert!( + output.status.success(), + "agent list should accept a single wildcard filter\nstdout:\n{stdout}\nstderr:\n{stderr}" + ); + serde_json::from_slice::(&output.stdout) + .expect("agent list --json should emit valid JSON"); + assert!( + !stderr.contains("panicked"), + "single wildcard filter should not panic\nstdout:\n{stdout}\nstderr:\n{stderr}" + ); +}