1use clap::Args;
4use std::path::PathBuf;
5
6const SKILL_TEMPLATE: &str = r#"---
7name: {{name}}
8description: {{description}}
9license: MIT
10metadata:
11 triggers: "{{triggers}}"
12 tags: "{{tags}}"
13---
14
15# {{name}}
16
17## Overview
18
19{{description}}
20
21## Usage
22
23<!-- Add usage instructions here -->
24
25## Examples
26
27<!-- Add examples here -->
28"#;
29
30#[derive(Args)]
31pub struct InitArgs {
32 name: String,
34
35 #[arg(short, long, default_value = "A new skill")]
37 description: String,
38
39 #[arg(short, long, default_value = "")]
41 triggers: String,
42
43 #[arg(long, default_value = "")]
45 tags: String,
46
47 #[arg(short, long, default_value = ".")]
49 output: PathBuf,
50
51 #[arg(short, long)]
53 force: bool,
54}
55
56pub async fn init(args: InitArgs) -> anyhow::Result<()> {
57 let skill_dir = args.output.join(&args.name);
58
59 if skill_dir.exists() && !args.force {
60 anyhow::bail!(
61 "Directory {:?} already exists. Use --force to overwrite.",
62 skill_dir
63 );
64 }
65
66 std::fs::create_dir_all(&skill_dir)?;
68
69 let content = SKILL_TEMPLATE
71 .replace("{{name}}", &args.name)
72 .replace("{{description}}", &args.description)
73 .replace("{{triggers}}", &args.triggers)
74 .replace("{{tags}}", &args.tags);
75
76 let skill_file = skill_dir.join("SKILL.md");
78 std::fs::write(&skill_file, content)?;
79
80 println!("✓ Created skill at {:?}", skill_file);
81
82 std::fs::create_dir_all(skill_dir.join("references"))?;
84 std::fs::create_dir_all(skill_dir.join("scripts"))?;
85
86 println!("✓ Created references/ and scripts/ directories");
87 println!("\nNext steps:");
88 println!(" 1. Edit {:?} to add instructions", skill_file);
89 println!(" 2. Run `skm validate {:?}` to check the skill", skill_dir);
90
91 Ok(())
92}