Skip to content

Commit 63eeb1e

Browse files
committed
chore: test prompt text
1 parent e397bc6 commit 63eeb1e

3 files changed

Lines changed: 321 additions & 0 deletions

File tree

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Generate icon prompts for building blocks missing logo.png files.
4+
Parses README.md frontmatter and creates AI image generation prompts.
5+
"""
6+
7+
import os
8+
import sys
9+
import yaml
10+
import json
11+
from pathlib import Path
12+
13+
PLATFORM_COLORS = {
14+
"aws": {
15+
"primary": "#FF9900",
16+
"secondary": "#232F3E",
17+
"accent": "#7FBA00",
18+
"name": "AWS colors: orange (#FF9900), dark blue (#232F3E), and lime green (#7FBA00)"
19+
},
20+
"azure": {
21+
"primary": "#0078D4",
22+
"secondary": "#00BCF2",
23+
"accent": "#50E6FF",
24+
"name": "Azure colors: blue (#0078D4), cyan (#00BCF2), and light blue (#50E6FF)"
25+
},
26+
"aks": {
27+
"primary": "#326CE5",
28+
"secondary": "#0078D4",
29+
"accent": "#00BCF2",
30+
"name": "Kubernetes/Azure colors: blue (#326CE5), Azure blue (#0078D4), and cyan (#00BCF2)"
31+
},
32+
"azuredevops": {
33+
"primary": "#0078D4",
34+
"secondary": "#00BCF2",
35+
"accent": "#005A9E",
36+
"name": "Azure DevOps colors: blue (#0078D4), teal (#00BCF2), and dark blue (#005A9E)"
37+
},
38+
"gcp": {
39+
"primary": "#4285F4",
40+
"secondary": "#EA4335",
41+
"accent": "#FBBC04",
42+
"name": "Google colors: blue (#4285F4), red (#EA4335), yellow (#FBBC04), and green (#34A853)"
43+
},
44+
"github": {
45+
"primary": "#6e5494",
46+
"secondary": "#24292e",
47+
"accent": "#8b5cf6",
48+
"name": "GitHub colors: purple (#6e5494), dark gray (#24292e), and bright purple (#8b5cf6)"
49+
},
50+
"ionos": {
51+
"primary": "#003D7A",
52+
"secondary": "#FF6600",
53+
"accent": "#0096D6",
54+
"name": "IONOS colors: blue (#003D7A), orange (#FF6600), and light blue (#0096D6)"
55+
},
56+
"kubernetes": {
57+
"primary": "#326CE5",
58+
"secondary": "#00D3E0",
59+
"accent": "#7AB8FF",
60+
"name": "Kubernetes colors: blue (#326CE5), cyan (#00D3E0), and light blue (#7AB8FF)"
61+
},
62+
"sapbtp": {
63+
"primary": "#0070AD",
64+
"secondary": "#F0AB00",
65+
"accent": "#0078D4",
66+
"name": "SAP colors: blue (#0070AD), gold (#F0AB00), and light blue (#0078D4)"
67+
},
68+
"stackit": {
69+
"primary": "#00A859",
70+
"secondary": "#007A3D",
71+
"accent": "#7FBA00",
72+
"name": "STACKIT colors: green (#00A859), dark green (#007A3D), and lime (#7FBA00)"
73+
}
74+
}
75+
76+
77+
def parse_readme_frontmatter(readme_path):
78+
"""Extract YAML frontmatter from README.md"""
79+
with open(readme_path, 'r', encoding='utf-8') as f:
80+
content = f.read()
81+
82+
if not content.startswith('---'):
83+
return None
84+
85+
# Extract frontmatter between --- delimiters
86+
parts = content.split('---', 2)
87+
if len(parts) < 3:
88+
return None
89+
90+
try:
91+
frontmatter = yaml.safe_load(parts[1])
92+
return frontmatter
93+
except yaml.YAMLError:
94+
return None
95+
96+
97+
def get_platform_from_frontmatter(frontmatter):
98+
"""Get the primary platform from supportedPlatforms list"""
99+
platforms = frontmatter.get('supportedPlatforms', [])
100+
if not platforms:
101+
return None
102+
return platforms[0] # Use first platform
103+
104+
105+
def generate_icon_prompt(name, platform, description):
106+
"""Generate an AI image generation prompt for an icon"""
107+
platform_colors = PLATFORM_COLORS.get(platform)
108+
109+
if not platform_colors:
110+
# Fallback to generic bright colors
111+
color_scheme = "bright, vibrant colors"
112+
else:
113+
color_scheme = platform_colors["name"]
114+
115+
# Clean up description
116+
clean_description = description.strip().replace('\n', ' ')
117+
118+
# Generate prompt
119+
prompt = f"""A modern, professional flat design icon for the meshcloud Building Block ecosystem.
120+
121+
Purpose: {clean_description}
122+
123+
Color Palette:
124+
- Primary: meshcloud blue (#2563eb)
125+
- Platform accent: {color_scheme}
126+
- Use 2-3 colors maximum for clarity
127+
128+
Style Requirements:
129+
- Enterprise-grade professional appearance
130+
- Simple geometric shapes with clean lines
131+
- Flat design (no gradients, shadows, or 3D effects)
132+
- 128x128px square format
133+
- Transparent background (PNG with alpha channel)
134+
- 16px padding from edges
135+
- Centered composition
136+
- Iconography should be instantly recognizable at small sizes
137+
138+
Design Principles:
139+
- Consistency with meshcloud's Building Block visual language
140+
- Platform-appropriate symbolism for {platform.upper()} (e.g., cloud, containers, security, databases, etc.)
141+
- Balance between abstract and literal representation
142+
- Professional, trustworthy aesthetic suitable for enterprise documentation"""
143+
144+
return prompt
145+
146+
147+
def find_missing_logos(modules_dir):
148+
"""Find all buildingblock directories missing logo.png"""
149+
missing = []
150+
151+
for root, dirs, files in os.walk(modules_dir):
152+
if 'buildingblock' in root:
153+
buildingblock_path = Path(root)
154+
readme_path = buildingblock_path / 'README.md'
155+
logo_path = buildingblock_path / 'logo.png'
156+
157+
if readme_path.exists() and not logo_path.exists():
158+
frontmatter = parse_readme_frontmatter(readme_path)
159+
if frontmatter:
160+
platform = get_platform_from_frontmatter(frontmatter)
161+
name = frontmatter.get('name', 'Unknown')
162+
description = frontmatter.get('description', '')
163+
164+
# Get relative path from modules directory
165+
rel_path = buildingblock_path.relative_to(modules_dir)
166+
167+
missing.append({
168+
'path': str(rel_path),
169+
'name': name,
170+
'platform': platform,
171+
'description': description,
172+
'readme_path': str(readme_path),
173+
'logo_path': str(logo_path)
174+
})
175+
176+
return missing
177+
178+
179+
def main():
180+
# Get modules directory
181+
repo_root = Path(__file__).parent.parent.parent
182+
modules_dir = repo_root / 'modules'
183+
184+
if not modules_dir.exists():
185+
print(f"ERROR: Modules directory not found: {modules_dir}", file=sys.stderr)
186+
sys.exit(1)
187+
188+
# Find missing logos
189+
missing_logos = find_missing_logos(modules_dir)
190+
191+
if not missing_logos:
192+
print("✅ All building blocks have logos!")
193+
sys.exit(0)
194+
195+
# Generate prompts for each missing logo
196+
results = []
197+
for item in missing_logos:
198+
prompt = generate_icon_prompt(
199+
item['name'],
200+
item['platform'] or 'generic',
201+
item['description']
202+
)
203+
204+
results.append({
205+
'name': item['name'],
206+
'platform': item['platform'],
207+
'path': item['path'],
208+
'logo_path': item['logo_path'],
209+
'prompt': prompt
210+
})
211+
212+
# Output as JSON for GitHub Action to consume
213+
print(json.dumps(results, indent=2))
214+
215+
216+
if __name__ == '__main__':
217+
main()

.github/workflows/icon-prompts.yml

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
name: Generate Icon Prompts for Missing Logos
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize, reopened]
6+
paths:
7+
- 'modules/**/buildingblock/README.md'
8+
9+
permissions:
10+
pull-requests: write
11+
contents: read
12+
13+
jobs:
14+
check-missing-logos:
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Checkout code
18+
uses: actions/checkout@v4
19+
20+
- name: Set up Python
21+
uses: actions/setup-python@v5
22+
with:
23+
python-version: '3.11'
24+
25+
- name: Install dependencies
26+
run: |
27+
pip install pyyaml
28+
29+
- name: Find missing logos and generate prompts
30+
id: generate
31+
run: |
32+
python .github/scripts/generate-icon-prompts.py > prompts.json
33+
echo "has_missing=$([ -s prompts.json ] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT
34+
35+
- name: Read prompts
36+
if: steps.generate.outputs.has_missing == 'true'
37+
id: read_prompts
38+
run: |
39+
PROMPTS=$(cat prompts.json)
40+
echo "prompts<<EOF" >> $GITHUB_OUTPUT
41+
echo "$PROMPTS" >> $GITHUB_OUTPUT
42+
echo "EOF" >> $GITHUB_OUTPUT
43+
44+
- name: Generate PR comment
45+
if: steps.generate.outputs.has_missing == 'true'
46+
id: format_comment
47+
uses: actions/github-script@v7
48+
env:
49+
PROMPTS_JSON: ${{ steps.read_prompts.outputs.prompts }}
50+
with:
51+
result-encoding: string
52+
script: |
53+
const prompts = JSON.parse(process.env.PROMPTS_JSON);
54+
55+
if (prompts.length === 0) {
56+
return '';
57+
}
58+
59+
let comment = '## 🎨 Missing Building Block Icons\n\n';
60+
comment += `Found **${prompts.length}** building block(s) without \`logo.png\` files.\n\n`;
61+
comment += 'Copy the prompts below and use them with your favorite AI image generator (DALL-E, Midjourney, Stable Diffusion, etc.) to create consistent icons.\n\n';
62+
comment += '### Requirements\n';
63+
comment += '- **Size:** 128x128 pixels\n';
64+
comment += '- **Format:** PNG\n';
65+
comment += '- **Max file size:** 100KB\n\n';
66+
comment += '---\n\n';
67+
68+
for (const item of prompts) {
69+
comment += `### ${item.name}\n\n`;
70+
comment += `**Platform:** \`${item.platform}\`\n\n`;
71+
comment += `**Path:** \`${item.logo_path}\`\n\n`;
72+
comment += '**Prompt:**\n\n';
73+
comment += '```\n';
74+
comment += item.prompt;
75+
comment += '\n```\n\n';
76+
comment += '---\n\n';
77+
}
78+
79+
comment += '\n\n💡 **Tip:** After generating the icon, optimize it with tools like [TinyPNG](https://tinypng.com/) or [ImageOptim](https://imageoptim.com/) to ensure it\'s under 100KB.\n';
80+
81+
return comment;
82+
83+
- name: Find existing comment
84+
if: steps.generate.outputs.has_missing == 'true'
85+
uses: peter-evans/find-comment@v3
86+
id: find_comment
87+
with:
88+
issue-number: ${{ github.event.pull_request.number }}
89+
comment-author: 'github-actions[bot]'
90+
body-includes: '🎨 Missing Building Block Icons'
91+
92+
- name: Create or update comment
93+
if: steps.generate.outputs.has_missing == 'true'
94+
uses: peter-evans/create-or-update-comment@v4
95+
with:
96+
comment-id: ${{ steps.find_comment.outputs.comment-id }}
97+
issue-number: ${{ github.event.pull_request.number }}
98+
body: ${{ steps.format_comment.outputs.result }}
99+
edit-mode: replace
100+
101+
- name: Success message
102+
if: steps.generate.outputs.has_missing == 'false'
103+
run: |
104+
echo "✅ All building blocks have logo.png files!"
-17.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)