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,211 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
OurDigital Visual Storytelling Prompt Generator
|
||||
Generates sophisticated image prompts for blog featured images
|
||||
"""
|
||||
|
||||
import argparse
|
||||
from typing import Dict, Tuple
|
||||
import json
|
||||
|
||||
class VisualPromptGenerator:
|
||||
def __init__(self):
|
||||
self.style_base = (
|
||||
"sophisticated featured image, minimalist contemporary design, "
|
||||
"clean vector illustration with subtle texture overlays, "
|
||||
"1200x630px, suitable for blog header"
|
||||
)
|
||||
|
||||
self.moods = {
|
||||
"contemplative": "contemplative and introspective atmosphere, zen-like calm",
|
||||
"critical": "analytical precision with underlying urgency, sharp clarity",
|
||||
"hopeful": "dawn breaking through uncertainty, warm optimism",
|
||||
"anxious": "subtle tension and uncertainty, digital unease",
|
||||
"philosophical": "deep meditation quality, timeless wisdom"
|
||||
}
|
||||
|
||||
self.color_palettes = {
|
||||
"contemplative": "monochrome palette with single accent color",
|
||||
"critical": "cool blue-gray with sharp red accents",
|
||||
"hopeful": "warm amber gradients with sky blue highlights",
|
||||
"anxious": "desaturated colors with digital green touches",
|
||||
"philosophical": "near black and off-white with muted gold"
|
||||
}
|
||||
|
||||
self.metaphor_types = {
|
||||
"technology": "organic-digital hybrid forms, natural systems becoming circuits",
|
||||
"identity": "layered masks, fragmented mirrors, dissolving boundaries",
|
||||
"network": "root systems, neural pathways, constellation patterns",
|
||||
"transformation": "metamorphosis states, particle dissolution, phase transitions",
|
||||
"knowledge": "light sources, growing trees, prismatic refractions"
|
||||
}
|
||||
|
||||
def generate_prompt(
|
||||
self,
|
||||
topic: str,
|
||||
mood: str = "contemplative",
|
||||
metaphor: str = None,
|
||||
cultural_fusion: float = 0.6,
|
||||
abstract_level: float = 0.8
|
||||
) -> str:
|
||||
"""
|
||||
Generate a sophisticated image prompt for OurDigital blog
|
||||
|
||||
Args:
|
||||
topic: Main subject of the blog post
|
||||
mood: Emotional tone (contemplative/critical/hopeful/anxious/philosophical)
|
||||
metaphor: Visual metaphor to use
|
||||
cultural_fusion: Balance of Korean-Western aesthetics (0-1)
|
||||
abstract_level: Level of abstraction (0=literal, 1=highly abstract)
|
||||
"""
|
||||
|
||||
# Build core prompt
|
||||
prompt_parts = [
|
||||
f"Create a {self.style_base} for blog post about {topic}.",
|
||||
""
|
||||
]
|
||||
|
||||
# Add visual concept
|
||||
if metaphor:
|
||||
prompt_parts.append(f"Visual concept: {metaphor}.")
|
||||
else:
|
||||
prompt_parts.append(f"Visual concept: Abstract representation of {topic}.")
|
||||
|
||||
prompt_parts.append("")
|
||||
|
||||
# Add mood and atmosphere
|
||||
mood_desc = self.moods.get(mood, self.moods["contemplative"])
|
||||
prompt_parts.append(f"Atmosphere: {mood_desc}.")
|
||||
|
||||
# Add color palette
|
||||
colors = self.color_palettes.get(mood, self.color_palettes["contemplative"])
|
||||
prompt_parts.append(f"Colors: {colors}.")
|
||||
|
||||
# Add composition guidelines
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Composition:",
|
||||
f"- {'Highly abstract' if abstract_level > 0.7 else 'Semi-abstract'} interpretation",
|
||||
f"- Minimum 20% negative space for contemplative breathing room",
|
||||
f"- Asymmetrical balance with {'strong' if abstract_level > 0.5 else 'subtle'} geometric structure"
|
||||
])
|
||||
|
||||
# Add cultural elements if needed
|
||||
if cultural_fusion > 0.3:
|
||||
fusion_level = "subtle" if cultural_fusion < 0.6 else "balanced"
|
||||
prompt_parts.append(
|
||||
f"- {fusion_level} integration of Korean minimalist aesthetics with Western modernism"
|
||||
)
|
||||
|
||||
# Add quality notes
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Technical notes:",
|
||||
"- Ensure clarity at thumbnail size (200px)",
|
||||
"- Avoid tech clichés (circuits, binary codes)",
|
||||
"- No stock photo aesthetics or literal interpretations",
|
||||
"- Timeless design that won't date quickly"
|
||||
])
|
||||
|
||||
# Add reference
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Aesthetic reference: Combine Bauhaus principles with Agnes Martin's contemplative minimalism."
|
||||
])
|
||||
|
||||
return "\n".join(prompt_parts)
|
||||
|
||||
def generate_variations(self, topic: str, count: int = 3) -> list:
|
||||
"""Generate multiple prompt variations for the same topic"""
|
||||
variations = []
|
||||
moods = ["contemplative", "critical", "philosophical"]
|
||||
|
||||
for i in range(min(count, len(moods))):
|
||||
prompt = self.generate_prompt(
|
||||
topic=topic,
|
||||
mood=moods[i],
|
||||
abstract_level=0.7 + (i * 0.1)
|
||||
)
|
||||
variations.append({
|
||||
"variation": i + 1,
|
||||
"mood": moods[i],
|
||||
"prompt": prompt
|
||||
})
|
||||
|
||||
return variations
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generate visual prompts for OurDigital blog featured images"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--topic",
|
||||
required=True,
|
||||
help="Main topic/subject of the blog post"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--mood",
|
||||
choices=["contemplative", "critical", "hopeful", "anxious", "philosophical"],
|
||||
default="contemplative",
|
||||
help="Emotional tone of the image"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--metaphor",
|
||||
help="Specific visual metaphor to use"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--cultural-fusion",
|
||||
type=float,
|
||||
default=0.6,
|
||||
help="Korean-Western aesthetic balance (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--abstract",
|
||||
type=float,
|
||||
default=0.8,
|
||||
help="Level of abstraction (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--variations",
|
||||
type=int,
|
||||
help="Generate N variations of the prompt"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--json",
|
||||
action="store_true",
|
||||
help="Output as JSON"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
generator = VisualPromptGenerator()
|
||||
|
||||
if args.variations:
|
||||
results = generator.generate_variations(args.topic, args.variations)
|
||||
if args.json:
|
||||
print(json.dumps(results, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
for var in results:
|
||||
print(f"\n--- Variation {var['variation']} ({var['mood']}) ---")
|
||||
print(var['prompt'])
|
||||
else:
|
||||
prompt = generator.generate_prompt(
|
||||
topic=args.topic,
|
||||
mood=args.mood,
|
||||
metaphor=args.metaphor,
|
||||
cultural_fusion=args.cultural_fusion,
|
||||
abstract_level=args.abstract
|
||||
)
|
||||
|
||||
if args.json:
|
||||
result = {
|
||||
"topic": args.topic,
|
||||
"mood": args.mood,
|
||||
"prompt": prompt
|
||||
}
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
print(prompt)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user