Complete implementation of OurDigital skills with dual-platform support (Claude Desktop + Claude Code) following standardized structure. Skills created: - 01-ourdigital-brand-guide: Brand reference & style guidelines - 02-ourdigital-blog: Korean blog drafts (blog.ourdigital.org) - 03-ourdigital-journal: English essays (journal.ourdigital.org) - 04-ourdigital-research: Research prompts & workflows - 05-ourdigital-document: Notion-to-presentation pipeline - 06-ourdigital-designer: Visual/image prompt generation - 07-ourdigital-ad-manager: Ad copywriting & keyword research - 08-ourdigital-trainer: Training materials & workshop planning - 09-ourdigital-backoffice: Quotes, proposals, cost analysis - 10-ourdigital-skill-creator: Meta skill for creating new skills Features: - YAML frontmatter with "ourdigital" or "our" prefix triggers - Standardized directory structure (code/, desktop/, shared/, docs/) - Shared environment setup (_ourdigital-shared/) - Comprehensive reference documentation - Cross-skill integration support Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
216 lines
4.7 KiB
Python
216 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Initialize a new OurDigital skill with standard directory structure.
|
|
|
|
Usage:
|
|
python init_skill.py {skill-name} --number XX
|
|
python init_skill.py blog --number 02
|
|
"""
|
|
|
|
import argparse
|
|
import os
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
|
|
|
|
SKILL_TEMPLATE = '''---
|
|
name: ourdigital-{name}
|
|
description: |
|
|
{description}
|
|
Activated with "ourdigital" keyword.
|
|
|
|
Triggers:
|
|
- "ourdigital {name}", "ourdigital {trigger}"
|
|
|
|
Features:
|
|
- {feature}
|
|
version: "1.0"
|
|
author: OurDigital
|
|
environment: {environment}
|
|
---
|
|
|
|
# OurDigital {title}
|
|
|
|
{description}
|
|
|
|
## Activation
|
|
|
|
Only activate when user includes "ourdigital" keyword:
|
|
- "ourdigital {trigger}"
|
|
|
|
## Workflow
|
|
|
|
### Phase 1: Input
|
|
|
|
Gather requirements from user.
|
|
|
|
### Phase 2: Process
|
|
|
|
Execute core functionality.
|
|
|
|
### Phase 3: Output
|
|
|
|
Deliver results.
|
|
|
|
## Quick Commands
|
|
|
|
| Command | Action |
|
|
|---------|--------|
|
|
| "ourdigital {name}" | Main action |
|
|
'''
|
|
|
|
CHANGELOG_TEMPLATE = '''# Changelog
|
|
|
|
All notable changes to this skill will be documented in this file.
|
|
|
|
## [1.0.0] - {date}
|
|
|
|
### Added
|
|
- Initial skill creation
|
|
- Desktop and Code versions
|
|
- Basic workflow implementation
|
|
|
|
### Notion Ref
|
|
- (To be added after sync)
|
|
'''
|
|
|
|
README_TEMPLATE = '''# OurDigital {title}
|
|
|
|
{description}
|
|
|
|
## Installation
|
|
|
|
This skill is part of the OurDigital custom skills package.
|
|
|
|
## Usage
|
|
|
|
### Claude Desktop
|
|
|
|
The skill activates when you mention "ourdigital {name}".
|
|
|
|
### Claude Code
|
|
|
|
```bash
|
|
# The skill activates via SKILL.md directive
|
|
```
|
|
|
|
## Structure
|
|
|
|
```
|
|
{number}-ourdigital-{name}/
|
|
├── code/SKILL.md
|
|
├── desktop/SKILL.md
|
|
├── shared/
|
|
│ └── references/
|
|
├── docs/
|
|
│ └── CHANGELOG.md
|
|
└── README.md
|
|
```
|
|
|
|
## Version
|
|
|
|
- Current: 1.0.0
|
|
- Author: OurDigital
|
|
'''
|
|
|
|
|
|
def create_skill(name: str, number: str, description: str = "", environment: str = "Both"):
|
|
"""Create a new skill directory structure."""
|
|
|
|
base_path = Path(__file__).parent.parent.parent.parent
|
|
skill_dir = base_path / f"{number}-ourdigital-{name}"
|
|
|
|
if skill_dir.exists():
|
|
print(f"Skill directory already exists: {skill_dir}")
|
|
return False
|
|
|
|
# Create directories
|
|
dirs = [
|
|
skill_dir / "code",
|
|
skill_dir / "desktop",
|
|
skill_dir / "shared" / "references",
|
|
skill_dir / "shared" / "templates",
|
|
skill_dir / "shared" / "scripts",
|
|
skill_dir / "docs" / "logs",
|
|
]
|
|
|
|
for d in dirs:
|
|
d.mkdir(parents=True, exist_ok=True)
|
|
print(f"Created: {d}")
|
|
|
|
# Title case for display
|
|
title = name.replace("-", " ").title()
|
|
trigger = name.replace("-", " ")
|
|
feature = f"Core {title} functionality"
|
|
date = datetime.now().strftime("%Y-%m-%d")
|
|
|
|
if not description:
|
|
description = f"OurDigital {title} skill for Claude."
|
|
|
|
# Create SKILL.md for desktop
|
|
desktop_skill = SKILL_TEMPLATE.format(
|
|
name=name,
|
|
title=title,
|
|
description=description,
|
|
trigger=trigger,
|
|
feature=feature,
|
|
environment="Desktop"
|
|
)
|
|
(skill_dir / "desktop" / "SKILL.md").write_text(desktop_skill)
|
|
print(f"Created: desktop/SKILL.md")
|
|
|
|
# Create SKILL.md for code
|
|
code_skill = SKILL_TEMPLATE.format(
|
|
name=name,
|
|
title=title,
|
|
description=description,
|
|
trigger=trigger,
|
|
feature=feature,
|
|
environment="Code"
|
|
)
|
|
(skill_dir / "code" / "SKILL.md").write_text(code_skill)
|
|
print(f"Created: code/SKILL.md")
|
|
|
|
# Create CHANGELOG.md
|
|
changelog = CHANGELOG_TEMPLATE.format(date=date)
|
|
(skill_dir / "docs" / "CHANGELOG.md").write_text(changelog)
|
|
print(f"Created: docs/CHANGELOG.md")
|
|
|
|
# Create README.md
|
|
readme = README_TEMPLATE.format(
|
|
title=title,
|
|
name=name,
|
|
number=number,
|
|
description=description
|
|
)
|
|
(skill_dir / "README.md").write_text(readme)
|
|
print(f"Created: README.md")
|
|
|
|
print(f"\nSkill created successfully: {skill_dir}")
|
|
return True
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Initialize a new OurDigital skill")
|
|
parser.add_argument("name", help="Skill name (e.g., 'blog', 'designer')")
|
|
parser.add_argument("--number", required=True, help="Skill number (e.g., '02', '07')")
|
|
parser.add_argument("--description", default="", help="Skill description")
|
|
parser.add_argument("--environment", default="Both",
|
|
choices=["Desktop", "Code", "Both"],
|
|
help="Target environment")
|
|
|
|
args = parser.parse_args()
|
|
|
|
success = create_skill(
|
|
name=args.name,
|
|
number=args.number,
|
|
description=args.description,
|
|
environment=args.environment
|
|
)
|
|
|
|
return 0 if success else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
exit(main())
|