main
  1#!/usr/bin/env python3
  2"""
  3Skill Initializer - Creates a new skill from template
  4
  5Usage:
  6    init_skill.py <skill-name> --path <path>
  7
  8Examples:
  9    init_skill.py my-new-skill --path skills/public
 10    init_skill.py my-api-helper --path skills/private
 11    init_skill.py custom-skill --path /custom/location
 12"""
 13
 14import sys
 15from pathlib import Path
 16
 17
 18SKILL_TEMPLATE = """---
 19name: {skill_name}
 20description: [TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, file types, or tasks that trigger it.]
 21---
 22
 23# {skill_title}
 24
 25## Overview
 26
 27[TODO: 1-2 sentences explaining what this skill enables]
 28
 29## Structuring This Skill
 30
 31[TODO: Choose the structure that best fits this skill's purpose. Common patterns:
 32
 33**1. Workflow-Based** (best for sequential processes)
 34- Works well when there are clear step-by-step procedures
 35- Example: DOCX skill with "Workflow Decision Tree""Reading""Creating""Editing"
 36- Structure: ## Overview → ## Workflow Decision Tree → ## Step 1 → ## Step 2...
 37
 38**2. Task-Based** (best for tool collections)
 39- Works well when the skill offers different operations/capabilities
 40- Example: PDF skill with "Quick Start""Merge PDFs""Split PDFs""Extract Text"
 41- Structure: ## Overview → ## Quick Start → ## Task Category 1 → ## Task Category 2...
 42
 43**3. Reference/Guidelines** (best for standards or specifications)
 44- Works well for brand guidelines, coding standards, or requirements
 45- Example: Brand styling with "Brand Guidelines""Colors""Typography""Features"
 46- Structure: ## Overview → ## Guidelines → ## Specifications → ## Usage...
 47
 48**4. Capabilities-Based** (best for integrated systems)
 49- Works well when the skill provides multiple interrelated features
 50- Example: Product Management with "Core Capabilities" → numbered capability list
 51- Structure: ## Overview → ## Core Capabilities → ### 1. Feature → ### 2. Feature...
 52
 53Patterns can be mixed and matched as needed. Most skills combine patterns (e.g., start with task-based, add workflow for complex operations).
 54
 55Delete this entire "Structuring This Skill" section when done - it's just guidance.]
 56
 57## [TODO: Replace with the first main section based on chosen structure]
 58
 59[TODO: Add content here. See examples in existing skills:
 60- Code samples for technical skills
 61- Decision trees for complex workflows
 62- Concrete examples with realistic user requests
 63- References to scripts/templates/references as needed]
 64
 65## Resources
 66
 67This skill includes example resource directories that demonstrate how to organize different types of bundled resources:
 68
 69### scripts/
 70Executable code (Python/Bash/etc.) that can be run directly to perform specific operations.
 71
 72**Examples from other skills:**
 73- PDF skill: `fill_fillable_fields.py`, `extract_form_field_info.py` - utilities for PDF manipulation
 74- DOCX skill: `document.py`, `utilities.py` - Python modules for document processing
 75
 76**Appropriate for:** Python scripts, shell scripts, or any executable code that performs automation, data processing, or specific operations.
 77
 78**Note:** Scripts may be executed without loading into context, but can still be read by Claude for patching or environment adjustments.
 79
 80### references/
 81Documentation and reference material intended to be loaded into context to inform Claude's process and thinking.
 82
 83**Examples from other skills:**
 84- Product management: `communication.md`, `context_building.md` - detailed workflow guides
 85- BigQuery: API reference documentation and query examples
 86- Finance: Schema documentation, company policies
 87
 88**Appropriate for:** In-depth documentation, API references, database schemas, comprehensive guides, or any detailed information that Claude should reference while working.
 89
 90### assets/
 91Files not intended to be loaded into context, but rather used within the output Claude produces.
 92
 93**Examples from other skills:**
 94- Brand styling: PowerPoint template files (.pptx), logo files
 95- Frontend builder: HTML/React boilerplate project directories
 96- Typography: Font files (.ttf, .woff2)
 97
 98**Appropriate for:** Templates, boilerplate code, document templates, images, icons, fonts, or any files meant to be copied or used in the final output.
 99
100---
101
102**Any unneeded directories can be deleted.** Not every skill requires all three types of resources.
103"""
104
105EXAMPLE_SCRIPT = '''#!/usr/bin/env python3
106"""
107Example helper script for {skill_name}
108
109This is a placeholder script that can be executed directly.
110Replace with actual implementation or delete if not needed.
111
112Example real scripts from other skills:
113- pdf/scripts/fill_fillable_fields.py - Fills PDF form fields
114- pdf/scripts/convert_pdf_to_images.py - Converts PDF pages to images
115"""
116
117def main():
118    print("This is an example script for {skill_name}")
119    # TODO: Add actual script logic here
120    # This could be data processing, file conversion, API calls, etc.
121
122if __name__ == "__main__":
123    main()
124'''
125
126EXAMPLE_REFERENCE = """# Reference Documentation for {skill_title}
127
128This is a placeholder for detailed reference documentation.
129Replace with actual reference content or delete if not needed.
130
131Example real reference docs from other skills:
132- product-management/references/communication.md - Comprehensive guide for status updates
133- product-management/references/context_building.md - Deep-dive on gathering context
134- bigquery/references/ - API references and query examples
135
136## When Reference Docs Are Useful
137
138Reference docs are ideal for:
139- Comprehensive API documentation
140- Detailed workflow guides
141- Complex multi-step processes
142- Information too lengthy for main SKILL.md
143- Content that's only needed for specific use cases
144
145## Structure Suggestions
146
147### API Reference Example
148- Overview
149- Authentication
150- Endpoints with examples
151- Error codes
152- Rate limits
153
154### Workflow Guide Example
155- Prerequisites
156- Step-by-step instructions
157- Common patterns
158- Troubleshooting
159- Best practices
160"""
161
162EXAMPLE_ASSET = """# Example Asset File
163
164This placeholder represents where asset files would be stored.
165Replace with actual asset files (templates, images, fonts, etc.) or delete if not needed.
166
167Asset files are NOT intended to be loaded into context, but rather used within
168the output Claude produces.
169
170Example asset files from other skills:
171- Brand guidelines: logo.png, slides_template.pptx
172- Frontend builder: hello-world/ directory with HTML/React boilerplate
173- Typography: custom-font.ttf, font-family.woff2
174- Data: sample_data.csv, test_dataset.json
175
176## Common Asset Types
177
178- Templates: .pptx, .docx, boilerplate directories
179- Images: .png, .jpg, .svg, .gif
180- Fonts: .ttf, .otf, .woff, .woff2
181- Boilerplate code: Project directories, starter files
182- Icons: .ico, .svg
183- Data files: .csv, .json, .xml, .yaml
184
185Note: This is a text placeholder. Actual assets can be any file type.
186"""
187
188
189def title_case_skill_name(skill_name):
190    """Convert hyphenated skill name to Title Case for display."""
191    return ' '.join(word.capitalize() for word in skill_name.split('-'))
192
193
194def init_skill(skill_name, path):
195    """
196    Initialize a new skill directory with template SKILL.md.
197
198    Args:
199        skill_name: Name of the skill
200        path: Path where the skill directory should be created
201
202    Returns:
203        Path to created skill directory, or None if error
204    """
205    # Determine skill directory path
206    skill_dir = Path(path).resolve() / skill_name
207
208    # Check if directory already exists
209    if skill_dir.exists():
210        print(f"❌ Error: Skill directory already exists: {skill_dir}")
211        return None
212
213    # Create skill directory
214    try:
215        skill_dir.mkdir(parents=True, exist_ok=False)
216        print(f"✅ Created skill directory: {skill_dir}")
217    except Exception as e:
218        print(f"❌ Error creating directory: {e}")
219        return None
220
221    # Create SKILL.md from template
222    skill_title = title_case_skill_name(skill_name)
223    skill_content = SKILL_TEMPLATE.format(
224        skill_name=skill_name,
225        skill_title=skill_title
226    )
227
228    skill_md_path = skill_dir / 'SKILL.md'
229    try:
230        skill_md_path.write_text(skill_content)
231        print("✅ Created SKILL.md")
232    except Exception as e:
233        print(f"❌ Error creating SKILL.md: {e}")
234        return None
235
236    # Create resource directories with example files
237    try:
238        # Create scripts/ directory with example script
239        scripts_dir = skill_dir / 'scripts'
240        scripts_dir.mkdir(exist_ok=True)
241        example_script = scripts_dir / 'example.py'
242        example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
243        example_script.chmod(0o755)
244        print("✅ Created scripts/example.py")
245
246        # Create references/ directory with example reference doc
247        references_dir = skill_dir / 'references'
248        references_dir.mkdir(exist_ok=True)
249        example_reference = references_dir / 'api_reference.md'
250        example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
251        print("✅ Created references/api_reference.md")
252
253        # Create assets/ directory with example asset placeholder
254        assets_dir = skill_dir / 'assets'
255        assets_dir.mkdir(exist_ok=True)
256        example_asset = assets_dir / 'example_asset.txt'
257        example_asset.write_text(EXAMPLE_ASSET)
258        print("✅ Created assets/example_asset.txt")
259    except Exception as e:
260        print(f"❌ Error creating resource directories: {e}")
261        return None
262
263    # Print next steps
264    print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
265    print("\nNext steps:")
266    print("1. Edit SKILL.md to complete the TODO items and update the description")
267    print("2. Customize or delete the example files in scripts/, references/, and assets/")
268    print("3. Run the validator when ready to check the skill structure")
269
270    return skill_dir
271
272
273def main():
274    if len(sys.argv) < 4 or sys.argv[2] != '--path':
275        print("Usage: init_skill.py <skill-name> --path <path>")
276        print("\nSkill name requirements:")
277        print("  - Hyphen-case identifier (e.g., 'data-analyzer')")
278        print("  - Lowercase letters, digits, and hyphens only")
279        print("  - Max 40 characters")
280        print("  - Must match directory name exactly")
281        print("\nExamples:")
282        print("  init_skill.py my-new-skill --path skills/public")
283        print("  init_skill.py my-api-helper --path skills/private")
284        print("  init_skill.py custom-skill --path /custom/location")
285        sys.exit(1)
286
287    skill_name = sys.argv[1]
288    path = sys.argv[3]
289
290    print(f"🚀 Initializing skill: {skill_name}")
291    print(f"   Location: {path}")
292    print()
293
294    result = init_skill(skill_name, path)
295
296    if result:
297        sys.exit(0)
298    else:
299        sys.exit(1)
300
301
302if __name__ == "__main__":
303    main()