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>
211 lines
7.2 KiB
Python
211 lines
7.2 KiB
Python
#!/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() |