use kernex_skills::{build_skill_prompt, load_skills, match_skill_triggers};
use tracing_subscriber::EnvFilter;
fn main() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let data_dir = "~/.kernex";
let skills = load_skills(data_dir);
println!("Loaded {} skills from {data_dir}/skills/\n", skills.len());
for skill in &skills {
let status = if skill.available {
"ready"
} else {
"missing deps"
};
println!(" {} — {} [{}]", skill.name, skill.description, status);
if let Some(ref trigger) = skill.trigger {
println!(" triggers: {trigger}");
}
if !skill.mcp_servers.is_empty() {
for srv in &skill.mcp_servers {
println!(
" mcp: {} -> {} {}",
srv.name,
srv.command,
srv.args.join(" ")
);
}
}
println!();
}
let test_messages = [
"Please browse google.com and extract the headlines",
"Show me the git log for the last week",
"Search for Rust async patterns online",
"Read the contents of main.rs",
"What is the weather today?",
];
println!("--- Trigger matching ---\n");
for msg in &test_messages {
let servers = match_skill_triggers(&skills, msg);
if servers.is_empty() {
println!(" \"{msg}\" -> no skills matched");
} else {
let names: Vec<&str> = servers.iter().map(|s| s.name.as_str()).collect();
println!(" \"{msg}\" -> activate: {}", names.join(", "));
}
}
let prompt_block = build_skill_prompt(&skills);
if !prompt_block.is_empty() {
println!("\n--- System prompt injection ---\n");
println!("{prompt_block}");
}
}