use std::collections::BTreeSet;
use theway_core::{Skill, SkillSource};
struct BuiltinSpec {
name: &'static str,
description: &'static str,
raw_markdown: &'static str,
}
const BUILTINS: &[BuiltinSpec] = &[BuiltinSpec {
name: "karpathy-guidelines",
description: "Behavioral guidelines to reduce common LLM coding mistakes. Use when writing, reviewing, or refactoring code to avoid overcomplication, make surgical changes, surface assumptions, and define verifiable success criteria.",
raw_markdown: include_str!("../skills/karpathy-guidelines/SKILL.md"),
}];
pub fn available_builtin_names() -> Vec<&'static str> {
let mut out: Vec<&'static str> = BUILTINS.iter().map(|b| b.name).collect();
out.sort_unstable();
out
}
#[derive(Debug)]
pub struct ResolvedBuiltins {
pub skills: Vec<Skill>,
pub diagnostics: Vec<String>,
}
pub fn resolve_builtins(
cli_requested: &[String],
config_requested: &[String],
) -> Result<ResolvedBuiltins, UnknownBuiltinError> {
let known: BTreeSet<&'static str> = available_builtin_names().into_iter().collect();
let mut unknown_cli: Vec<String> = Vec::new();
for name in cli_requested {
if !known.contains(name.as_str()) {
unknown_cli.push(name.clone());
}
}
if !unknown_cli.is_empty() {
unknown_cli.sort();
unknown_cli.dedup();
return Err(UnknownBuiltinError {
unknown: unknown_cli,
available: available_builtin_names()
.into_iter()
.map(str::to_string)
.collect(),
});
}
let mut diagnostics: Vec<String> = Vec::new();
let mut unknown_config: Vec<String> = Vec::new();
for name in config_requested {
if !known.contains(name.as_str()) {
unknown_config.push(name.clone());
}
}
if !unknown_config.is_empty() {
unknown_config.sort();
unknown_config.dedup();
diagnostics.push(format!(
"config: ignoring unknown built-in skill(s) in `[builtin_skills] enabled`: {}. Available: {}.",
unknown_config.join(", "),
available_builtin_names().join(", ")
));
}
let mut enabled: BTreeSet<&'static str> = BTreeSet::new();
for name in cli_requested.iter().chain(config_requested.iter()) {
if let Some(known_name) = known.get(name.as_str()) {
enabled.insert(known_name);
}
}
let mut skills: Vec<Skill> = Vec::with_capacity(enabled.len());
for name in enabled {
let spec = BUILTINS
.iter()
.find(|b| b.name == name)
.expect("name validated against known set above");
skills.push(spec_to_skill(spec));
}
Ok(ResolvedBuiltins {
skills,
diagnostics,
})
}
fn spec_to_skill(spec: &BuiltinSpec) -> Skill {
Skill {
name: spec.name.to_string(),
description: spec.description.to_string(),
file_path: format!("<builtin>/{}/SKILL.md", spec.name),
content: strip_frontmatter(spec.raw_markdown).to_string(),
disable_model_invocation: false,
source: SkillSource::Builtin,
}
}
fn strip_frontmatter(content: &str) -> &str {
let trimmed = content.trim_start_matches('\u{feff}');
let Some(without_open) = trimmed.strip_prefix("---") else {
return content;
};
let after_open = match without_open.find('\n') {
Some(i) => &without_open[i + 1..],
None => return content,
};
let mut search_from = 0usize;
while let Some(pos) = after_open[search_from..].find("\n---") {
let absolute = search_from + pos + 1; let after_close = &after_open[absolute + 3..];
if let Some(rest) = after_close.strip_prefix('\n') {
return rest.trim_start_matches('\n');
}
if after_close.is_empty() {
return "";
}
search_from = absolute + 3;
}
content
}
pub fn merge_with_user_project(mut builtins: Vec<Skill>, user_project: &[Skill]) -> Vec<Skill> {
for skill in user_project.iter() {
if let Some(slot) = builtins.iter_mut().find(|s| s.name == skill.name) {
*slot = skill.clone();
} else {
builtins.push(skill.clone());
}
}
builtins
}
#[cfg(test)]
use theway_transport::config::parse_builtin_skills_config;
#[derive(Debug)]
pub struct UnknownBuiltinError {
pub unknown: Vec<String>,
pub available: Vec<String>,
}
impl std::fmt::Display for UnknownBuiltinError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"unknown built-in skill(s) requested via --builtin-skill: {}. Available: {}.",
self.unknown.join(", "),
self.available.join(", ")
)
}
}
impl std::error::Error for UnknownBuiltinError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn available_names_is_sorted_and_contains_karpathy() {
let names = available_builtin_names();
let mut sorted = names.clone();
sorted.sort_unstable();
assert_eq!(
names, sorted,
"available names must be alphabetically sorted"
);
assert!(names.contains(&"karpathy-guidelines"));
}
#[test]
fn no_request_returns_empty_no_diagnostics() {
let resolved = resolve_builtins(&[], &[]).expect("empty inputs are always OK");
assert!(resolved.skills.is_empty());
assert!(resolved.diagnostics.is_empty());
}
#[test]
fn cli_known_name_enables_skill_with_stripped_body() {
let resolved =
resolve_builtins(&["karpathy-guidelines".to_string()], &[]).expect("known name");
assert_eq!(resolved.skills.len(), 1);
let s = &resolved.skills[0];
assert_eq!(s.name, "karpathy-guidelines");
assert!(s.description.starts_with("Behavioral guidelines"));
assert_eq!(s.file_path, "<builtin>/karpathy-guidelines/SKILL.md");
assert!(
s.content.starts_with("# Karpathy Guidelines"),
"expected body to start with the H1 header, got: {:?}",
&s.content[..s.content.len().min(80)]
);
assert!(!s.content.starts_with("---"));
assert!(!s.content.contains("\nlicense: MIT"));
assert!(s.content.contains("Think Before Coding"));
assert!(!s.disable_model_invocation);
}
#[test]
fn cli_unknown_name_hard_fails_with_available_list() {
let err = resolve_builtins(&["nonexistent-skill".to_string()], &[])
.expect_err("unknown CLI name must hard fail");
assert_eq!(err.unknown, vec!["nonexistent-skill".to_string()]);
assert!(err.available.contains(&"karpathy-guidelines".to_string()));
let mut sorted_available = err.available.clone();
sorted_available.sort();
assert_eq!(err.available, sorted_available);
}
#[test]
fn cli_mixes_known_and_unknown_reports_all_unknown_at_once() {
let err = resolve_builtins(
&[
"karpathy-guidelines".to_string(),
"missing-a".to_string(),
"missing-b".to_string(),
],
&[],
)
.expect_err("any unknown CLI name must hard fail");
assert!(err.unknown.contains(&"missing-a".to_string()));
assert!(err.unknown.contains(&"missing-b".to_string()));
assert_eq!(err.unknown.len(), 2);
}
#[test]
fn config_unknown_name_is_soft_warning_not_fail() {
let resolved = resolve_builtins(&[], &["nonexistent-skill".to_string()])
.expect("unknown config name must NOT hard fail");
assert!(
resolved.skills.is_empty(),
"unknown name must not enable anything"
);
assert_eq!(resolved.diagnostics.len(), 1);
let diag = &resolved.diagnostics[0];
assert!(diag.contains("nonexistent-skill"));
assert!(diag.contains("Available: karpathy-guidelines"));
}
#[test]
fn config_mixes_known_and_unknown_keeps_known_skips_unknown() {
let resolved = resolve_builtins(
&[],
&["karpathy-guidelines".to_string(), "missing".to_string()],
)
.expect("config soft path must not fail on unknown");
assert_eq!(resolved.skills.len(), 1);
assert_eq!(resolved.skills[0].name, "karpathy-guidelines");
assert_eq!(resolved.diagnostics.len(), 1);
assert!(resolved.diagnostics[0].contains("missing"));
}
#[test]
fn cli_and_config_same_name_does_not_duplicate_catalog_entry() {
let resolved = resolve_builtins(
&["karpathy-guidelines".to_string()],
&["karpathy-guidelines".to_string()],
)
.expect("known on both sides is fine");
assert_eq!(
resolved.skills.len(),
1,
"union should dedup the same name across CLI + config"
);
assert!(resolved.diagnostics.is_empty());
}
#[test]
fn cli_repeated_same_name_does_not_duplicate_catalog_entry() {
let resolved = resolve_builtins(
&[
"karpathy-guidelines".to_string(),
"karpathy-guidelines".to_string(),
],
&[],
)
.expect("repeated --builtin-skill should be idempotent");
assert_eq!(resolved.skills.len(), 1);
}
fn fake_skill(name: &str, file_path: &str) -> Skill {
Skill {
name: name.into(),
description: format!("desc for {name}"),
file_path: file_path.into(),
content: format!("body of {name}"),
disable_model_invocation: false,
source: SkillSource::User,
}
}
#[test]
fn merge_no_user_project_returns_builtins_unchanged() {
let builtins = vec![fake_skill(
"karpathy-guidelines",
"<builtin>/karpathy-guidelines/SKILL.md",
)];
let merged = merge_with_user_project(builtins.clone(), &[]);
assert_eq!(merged.len(), 1);
assert_eq!(merged[0].name, "karpathy-guidelines");
assert_eq!(
merged[0].file_path,
"<builtin>/karpathy-guidelines/SKILL.md"
);
}
#[test]
fn merge_user_project_skill_shadows_builtin_same_name() {
let builtins = vec![fake_skill(
"karpathy-guidelines",
"<builtin>/karpathy-guidelines/SKILL.md",
)];
let user_project = vec![fake_skill(
"karpathy-guidelines",
"/home/me/.theway/skills/karpathy-guidelines/SKILL.md",
)];
let merged = merge_with_user_project(builtins, &user_project);
assert_eq!(merged.len(), 1, "same name must collapse to one entry");
assert_eq!(merged[0].name, "karpathy-guidelines");
assert_eq!(
merged[0].file_path, "/home/me/.theway/skills/karpathy-guidelines/SKILL.md",
"user / project entry must shadow the built-in"
);
}
#[test]
fn merge_unrelated_user_project_skills_appended_after_builtins() {
let builtins = vec![fake_skill(
"karpathy-guidelines",
"<builtin>/karpathy-guidelines/SKILL.md",
)];
let user_project = vec![fake_skill(
"my-personal-skill",
"/home/me/.theway/skills/my-personal-skill/SKILL.md",
)];
let merged = merge_with_user_project(builtins, &user_project);
assert_eq!(merged.len(), 2);
assert_eq!(merged[0].name, "karpathy-guidelines");
assert_eq!(merged[1].name, "my-personal-skill");
}
#[test]
fn merge_handles_empty_builtins_with_user_project() {
let user_project = vec![fake_skill(
"my-personal-skill",
"/home/me/.theway/skills/my-personal-skill/SKILL.md",
)];
let merged = merge_with_user_project(Vec::new(), &user_project);
assert_eq!(merged.len(), 1);
assert_eq!(merged[0].name, "my-personal-skill");
}
#[test]
fn parse_config_extracts_enabled_list() {
let text = r#"
[builtin_skills]
enabled = ["karpathy-guidelines", "future-other-skill"]
"#;
let enabled = parse_builtin_skills_config(text);
assert_eq!(
enabled,
vec![
"karpathy-guidelines".to_string(),
"future-other-skill".to_string()
]
);
}
#[test]
fn parse_config_missing_section_is_empty_list() {
let text = r#"
[some_other_section]
key = "value"
"#;
let enabled = parse_builtin_skills_config(text);
assert!(enabled.is_empty());
}
#[test]
fn parse_config_missing_enabled_key_is_empty_list() {
let text = r#"
[builtin_skills]
"#;
let enabled = parse_builtin_skills_config(text);
assert!(enabled.is_empty());
}
#[test]
fn parse_config_malformed_toml_degrades_to_empty_not_panic() {
let text = "this is not valid toml [ [ [";
let enabled = parse_builtin_skills_config(text);
assert!(enabled.is_empty());
}
#[test]
fn parse_config_empty_string_is_empty_list() {
let enabled = parse_builtin_skills_config("");
assert!(enabled.is_empty());
}
#[test]
fn strip_frontmatter_preserves_content_without_frontmatter() {
let raw = "# Just a body\n";
assert_eq!(strip_frontmatter(raw), raw);
}
#[test]
fn strip_frontmatter_returns_original_when_opening_has_no_newline() {
let raw = "--- not frontmatter";
assert_eq!(strip_frontmatter(raw), raw);
}
#[test]
fn strip_frontmatter_returns_original_when_no_closing_marker() {
let raw = "---\nname: x\nbody without close";
assert_eq!(strip_frontmatter(raw), raw);
}
#[test]
fn strip_frontmatter_handles_closing_line_with_trailing_text_and_eof() {
let raw = "---\nname: x\n--- trailing\nbody";
assert_eq!(strip_frontmatter(raw), raw);
let raw_eof = "---\nname: x\n---";
assert_eq!(strip_frontmatter(raw_eof), "");
}
#[test]
fn strip_frontmatter_skips_bom() {
let raw = "\u{feff}---\nname: x\n---\nbody";
assert_eq!(strip_frontmatter(raw), "body");
}
#[test]
fn vendored_skill_md_frontmatter_matches_hardcoded_metadata() {
let raw = BUILTINS
.iter()
.find(|b| b.name == "karpathy-guidelines")
.unwrap();
assert!(raw.raw_markdown.contains("name: karpathy-guidelines"));
assert!(
raw.raw_markdown.contains(raw.description),
"vendored SKILL.md description must byte-match the hardcoded BuiltinSpec.description"
);
}
}