feat: Add OurDigital custom skills package (10 skills)
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>
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user