319 lines
11 KiB
Python
319 lines
11 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Skill Initializer - Creates a new skill from template
|
||
|
||
Usage:
|
||
init_skill.py <skill-name> --path <path>
|
||
|
||
Examples:
|
||
init_skill.py my-new-skill --path skills/public
|
||
init_skill.py my-api-helper --path skills/private
|
||
init_skill.py custom-skill --path /custom/location
|
||
"""
|
||
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
|
||
SKILL_TEMPLATE = """---
|
||
name: {skill_name}
|
||
description: [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.]
|
||
---
|
||
|
||
# {skill_title}
|
||
|
||
## Overview
|
||
|
||
[TODO: 1-2 sentences explaining what this skill enables]
|
||
|
||
## Structuring This Skill
|
||
|
||
[TODO: Choose the structure that best fits this skill's purpose. Common patterns:
|
||
|
||
**1. Workflow-Based** (best for sequential processes)
|
||
- Works well when there are clear step-by-step procedures
|
||
- Example: DOCX skill with "Workflow Decision Tree" → "Reading" → "Creating" → "Editing"
|
||
- Structure: ## Overview → ## Workflow Decision Tree → ## Step 1 → ## Step 2...
|
||
|
||
**2. Task-Based** (best for tool collections)
|
||
- Works well when the skill offers different operations/capabilities
|
||
- Example: PDF skill with "Quick Start" → "Merge PDFs" → "Split PDFs" → "Extract Text"
|
||
- Structure: ## Overview → ## Quick Start → ## Task Category 1 → ## Task Category 2...
|
||
|
||
**3. Reference/Guidelines** (best for standards or specifications)
|
||
- Works well for brand guidelines, coding standards, or requirements
|
||
- Example: Brand styling with "Brand Guidelines" → "Colors" → "Typography" → "Features"
|
||
- Structure: ## Overview → ## Guidelines → ## Specifications → ## Usage...
|
||
|
||
**4. Capabilities-Based** (best for integrated systems)
|
||
- Works well when the skill provides multiple interrelated features
|
||
- Example: Product Management with "Core Capabilities" → numbered capability list
|
||
- Structure: ## Overview → ## Core Capabilities → ### 1. Feature → ### 2. Feature...
|
||
|
||
Patterns can be mixed and matched as needed. Most skills combine patterns (e.g., start with task-based, add workflow for complex operations).
|
||
|
||
Delete this entire "Structuring This Skill" section when done - it's just guidance.]
|
||
|
||
## [TODO: Replace with the first main section based on chosen structure]
|
||
|
||
[TODO: Add content here. See examples in existing skills:
|
||
- Code samples for technical skills
|
||
- Decision trees for complex workflows
|
||
- Concrete examples with realistic user requests
|
||
- References to scripts/templates/references as needed]
|
||
|
||
## Resources
|
||
|
||
This skill includes example resource directories that demonstrate how to organize different types of bundled resources:
|
||
|
||
### scripts/
|
||
Executable code (Python/Bash/etc.) that can be run directly to perform specific operations.
|
||
|
||
**Examples from other skills:**
|
||
- PDF skill: `fill_fillable_fields.py`, `extract_form_field_info.py` - utilities for PDF manipulation
|
||
- DOCX skill: `document.py`, `utilities.py` - Python modules for document processing
|
||
|
||
**Appropriate for:** Python scripts, shell scripts, or any executable code that performs automation, data processing, or specific operations.
|
||
|
||
**Note:** Scripts may be executed without loading into context, but can still be read by Claude for patching or environment adjustments.
|
||
|
||
### references/
|
||
Documentation and reference material intended to be loaded into context to inform Claude's process and thinking.
|
||
|
||
**Examples from other skills:**
|
||
- Product management: `communication.md`, `context_building.md` - detailed workflow guides
|
||
- BigQuery: API reference documentation and query examples
|
||
- Finance: Schema documentation, company policies
|
||
|
||
**Appropriate for:** In-depth documentation, API references, database schemas, comprehensive guides, or any detailed information that Claude should reference while working.
|
||
|
||
### assets/
|
||
Files not intended to be loaded into context, but rather used within the output Claude produces.
|
||
|
||
**Examples from other skills:**
|
||
- Brand styling: PowerPoint template files (.pptx), logo files
|
||
- Frontend builder: HTML/React boilerplate project directories
|
||
- Typography: Font files (.ttf, .woff2)
|
||
|
||
**Appropriate for:** Templates, boilerplate code, document templates, images, icons, fonts, or any files meant to be copied or used in the final output.
|
||
|
||
---
|
||
|
||
**Any unneeded directories can be deleted.** Not every skill requires all three types of resources.
|
||
"""
|
||
|
||
EXAMPLE_SCRIPT = '''#!/usr/bin/env python3
|
||
"""
|
||
Example helper script for {skill_name}
|
||
|
||
This is a placeholder script that can be executed directly.
|
||
Replace with actual implementation or delete if not needed.
|
||
|
||
Example real scripts from other skills:
|
||
- pdf/scripts/fill_fillable_fields.py - Fills PDF form fields
|
||
- pdf/scripts/convert_pdf_to_images.py - Converts PDF pages to images
|
||
"""
|
||
|
||
def main():
|
||
print("This is an example script for {skill_name}")
|
||
# TODO: Add actual script logic here
|
||
# This could be data processing, file conversion, API calls, etc.
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
'''
|
||
|
||
EXAMPLE_REFERENCE = """# Reference Documentation for {skill_title}
|
||
|
||
This is a placeholder for detailed reference documentation.
|
||
Replace with actual reference content or delete if not needed.
|
||
|
||
Example real reference docs from other skills:
|
||
- product-management/references/communication.md - Comprehensive guide for status updates
|
||
- product-management/references/context_building.md - Deep-dive on gathering context
|
||
- bigquery/references/ - API references and query examples
|
||
|
||
## When Reference Docs Are Useful
|
||
|
||
Reference docs are ideal for:
|
||
- Comprehensive API documentation
|
||
- Detailed workflow guides
|
||
- Complex multi-step processes
|
||
- Information too lengthy for main SKILL.md
|
||
- Content that's only needed for specific use cases
|
||
|
||
## Structure Suggestions
|
||
|
||
### API Reference Example
|
||
- Overview
|
||
- Authentication
|
||
- Endpoints with examples
|
||
- Error codes
|
||
- Rate limits
|
||
|
||
### Workflow Guide Example
|
||
- Prerequisites
|
||
- Step-by-step instructions
|
||
- Common patterns
|
||
- Troubleshooting
|
||
- Best practices
|
||
"""
|
||
|
||
EXAMPLE_ASSET = """# Example Asset File
|
||
|
||
This placeholder represents where asset files would be stored.
|
||
Replace with actual asset files (templates, images, fonts, etc.) or delete if not needed.
|
||
|
||
Asset files are NOT intended to be loaded into context, but rather used within
|
||
the output Claude produces.
|
||
|
||
Example asset files from other skills:
|
||
- Brand guidelines: logo.png, slides_template.pptx
|
||
- Frontend builder: hello-world/ directory with HTML/React boilerplate
|
||
- Typography: custom-font.ttf, font-family.woff2
|
||
- Data: sample_data.csv, test_dataset.json
|
||
|
||
## Common Asset Types
|
||
|
||
- Templates: .pptx, .docx, boilerplate directories
|
||
- Images: .png, .jpg, .svg, .gif
|
||
- Fonts: .ttf, .otf, .woff, .woff2
|
||
- Boilerplate code: Project directories, starter files
|
||
- Icons: .ico, .svg
|
||
- Data files: .csv, .json, .xml, .yaml
|
||
|
||
Note: This is a text placeholder. Actual assets can be any file type.
|
||
"""
|
||
|
||
|
||
def title_case_skill_name(skill_name):
|
||
"""Convert hyphenated skill name to Title Case for display."""
|
||
return ' '.join(word.capitalize() for word in skill_name.split('-'))
|
||
|
||
|
||
def init_skill(skill_name, path):
|
||
"""
|
||
Initialize a new skill directory with template SKILL.md.
|
||
|
||
Args:
|
||
skill_name: Name of the skill
|
||
path: Path where the skill directory should be created
|
||
|
||
Returns:
|
||
Path to created skill directory, or None if error
|
||
"""
|
||
# Determine skill directory path
|
||
skill_dir = Path(path).resolve() / skill_name
|
||
|
||
# Check if directory already exists
|
||
if skill_dir.exists():
|
||
print(f"❌ Error: Skill directory already exists: {skill_dir}")
|
||
return None
|
||
|
||
# Create skill directory
|
||
try:
|
||
skill_dir.mkdir(parents=True, exist_ok=False)
|
||
print(f"✅ Created skill directory: {skill_dir}")
|
||
except Exception as e:
|
||
print(f"❌ Error creating directory: {e}")
|
||
return None
|
||
|
||
# Create SKILL.md from template
|
||
skill_title = title_case_skill_name(skill_name)
|
||
skill_content = SKILL_TEMPLATE.format(
|
||
skill_name=skill_name,
|
||
skill_title=skill_title
|
||
)
|
||
|
||
skill_md_path = skill_dir / 'SKILL.md'
|
||
try:
|
||
skill_md_path.write_text(skill_content)
|
||
print("✅ Created SKILL.md")
|
||
except Exception as e:
|
||
print(f"❌ Error creating SKILL.md: {e}")
|
||
return None
|
||
|
||
# Create resource directories with example files
|
||
try:
|
||
# Create scripts/ directory with example script
|
||
scripts_dir = skill_dir / 'scripts'
|
||
scripts_dir.mkdir(exist_ok=True)
|
||
example_script = scripts_dir / 'example.py'
|
||
example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
|
||
example_script.chmod(0o755)
|
||
print("✅ Created scripts/example.py")
|
||
|
||
# Create references/ directory with example reference doc
|
||
references_dir = skill_dir / 'references'
|
||
references_dir.mkdir(exist_ok=True)
|
||
example_reference = references_dir / 'api_reference.md'
|
||
example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
|
||
print("✅ Created references/api_reference.md")
|
||
|
||
# Create assets/ directory with example asset placeholder
|
||
assets_dir = skill_dir / 'assets'
|
||
assets_dir.mkdir(exist_ok=True)
|
||
example_asset = assets_dir / 'example_asset.txt'
|
||
example_asset.write_text(EXAMPLE_ASSET)
|
||
print("✅ Created assets/example_asset.txt")
|
||
|
||
# Create .openakita-i18n.json template for Chinese translation
|
||
i18n_data = {
|
||
"zh": {
|
||
"name": "[TODO: 中文技能名(2-6个字)]",
|
||
"description": "[TODO: 技能功能的中文描述]"
|
||
}
|
||
}
|
||
i18n_path = skill_dir / '.openakita-i18n.json'
|
||
i18n_path.write_text(
|
||
json.dumps(i18n_data, ensure_ascii=False, indent=2) + "\n"
|
||
)
|
||
print("✅ Created .openakita-i18n.json (中文翻译模板)")
|
||
except Exception as e:
|
||
print(f"❌ Error creating resource directories: {e}")
|
||
return None
|
||
|
||
# Print next steps
|
||
print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
|
||
print("\nNext steps:")
|
||
print("1. Edit SKILL.md to complete the TODO items and update the description")
|
||
print("2. Edit .openakita-i18n.json to fill in Chinese name and description")
|
||
print("3. Customize or delete the example files in scripts/, references/, and assets/")
|
||
print("4. Run the validator when ready to check the skill structure")
|
||
|
||
return skill_dir
|
||
|
||
|
||
def main():
|
||
if len(sys.argv) < 4 or sys.argv[2] != '--path':
|
||
print("Usage: init_skill.py <skill-name> --path <path>")
|
||
print("\nSkill name requirements:")
|
||
print(" - Kebab-case identifier (e.g., 'my-data-analyzer')")
|
||
print(" - Lowercase letters, digits, and hyphens only")
|
||
print(" - Max 64 characters")
|
||
print(" - Must match directory name exactly")
|
||
print("\nExamples:")
|
||
print(" init_skill.py my-new-skill --path skills/public")
|
||
print(" init_skill.py my-api-helper --path skills/private")
|
||
print(" init_skill.py custom-skill --path /custom/location")
|
||
sys.exit(1)
|
||
|
||
skill_name = sys.argv[1]
|
||
path = sys.argv[3]
|
||
|
||
print(f"🚀 Initializing skill: {skill_name}")
|
||
print(f" Location: {path}")
|
||
print()
|
||
|
||
result = init_skill(skill_name, path)
|
||
|
||
if result:
|
||
sys.exit(0)
|
||
else:
|
||
sys.exit(1)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|