mod loader;
mod renderer;
mod script_gen;
mod transformer;
mod types;
mod validator;
#[cfg(test)]
mod test_utils;
#[cfg(test)]
mod edge_cases;
pub use loader::Loader;
pub use renderer::Renderer;
pub use script_gen::ScriptGenerator;
pub use transformer::Transformer;
pub use types::*;
pub use validator::Validator;
use anyhow::Result;
pub async fn generate(options: GenerateOptions) -> Result<GenerateResult> {
let loader = Loader::new(options.manifest_path.as_deref())?;
let skills = loader.load_all_skills().await?;
let skills = if let Some(ref name) = options.skill_name {
skills.into_iter().filter(|s| &s.name == name).collect()
} else {
skills
};
if skills.is_empty() {
if options.skill_name.is_some() {
anyhow::bail!(
"Skill '{}' not found in manifest",
options.skill_name.as_ref().unwrap()
);
} else {
anyhow::bail!("No skills found in manifest");
}
}
let validator = Validator::new();
let transformer = Transformer::new();
let mut result = GenerateResult::default();
for skill in skills {
let validated = validator.validate(&skill)?;
let claude_skill = transformer.transform(validated)?;
let renderer = Renderer::new(&options.output_dir)?;
let script_gen = ScriptGenerator::new(&claude_skill.name);
if options.dry_run {
result.dry_run_output.push(format!(
"Would generate: {}/{}",
options.output_dir.display(),
claude_skill.name
));
} else {
renderer.render(&claude_skill)?;
if !options.no_scripts {
script_gen.generate(&claude_skill, &options.output_dir)?;
}
result.generated_skills.push(claude_skill.name.clone());
}
}
Ok(result)
}