Skip to main content

skm_cli/commands/
init.rs

1//! Init command: create a new skill from template.
2
3use 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    /// Skill name (will create a directory with this name)
33    name: String,
34
35    /// Skill description
36    #[arg(short, long, default_value = "A new skill")]
37    description: String,
38
39    /// Trigger patterns (comma-separated)
40    #[arg(short, long, default_value = "")]
41    triggers: String,
42
43    /// Tags (comma-separated)
44    #[arg(long, default_value = "")]
45    tags: String,
46
47    /// Directory to create skill in
48    #[arg(short, long, default_value = ".")]
49    output: PathBuf,
50
51    /// Force overwrite if exists
52    #[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    // Create directory
67    std::fs::create_dir_all(&skill_dir)?;
68
69    // Generate content
70    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    // Write SKILL.md
77    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    // Create optional directories
83    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}