Files
our-claude-skills/ourdigital-custom-skills/10-ourdigital-visual-storytelling/scripts/generate_prompt.py
Andrew Yim 8f618fbb74 refactor: Renumber skills 00→10, 01→11 for consistent numbering
- Rename 00-ourdigital-visual-storytelling to 10-ourdigital-visual-storytelling
- Rename 01-ourdigital-research-publisher to 11-ourdigital-research-publisher
- Update CLAUDE.md with new skill numbering and add skill 12 (seo-audit)
- Skill count updated from 8 to 9

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 02:33:23 +09:00

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()