ui-ux-pro-max-cli 2.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +99 -0
  2. package/assets/data/_sync_all.py +414 -0
  3. package/assets/data/app-interface.csv +31 -0
  4. package/assets/data/charts.csv +26 -0
  5. package/assets/data/colors.csv +162 -0
  6. package/assets/data/design.csv +1776 -0
  7. package/assets/data/draft.csv +1779 -0
  8. package/assets/data/google-fonts.csv +1924 -0
  9. package/assets/data/icons.csv +106 -0
  10. package/assets/data/landing.csv +35 -0
  11. package/assets/data/products.csv +162 -0
  12. package/assets/data/react-performance.csv +45 -0
  13. package/assets/data/stacks/angular.csv +51 -0
  14. package/assets/data/stacks/astro.csv +54 -0
  15. package/assets/data/stacks/flutter.csv +53 -0
  16. package/assets/data/stacks/html-tailwind.csv +56 -0
  17. package/assets/data/stacks/javafx.csv +76 -0
  18. package/assets/data/stacks/jetpack-compose.csv +53 -0
  19. package/assets/data/stacks/laravel.csv +51 -0
  20. package/assets/data/stacks/nextjs.csv +53 -0
  21. package/assets/data/stacks/nuxt-ui.csv +71 -0
  22. package/assets/data/stacks/nuxtjs.csv +59 -0
  23. package/assets/data/stacks/react-native.csv +52 -0
  24. package/assets/data/stacks/react.csv +54 -0
  25. package/assets/data/stacks/shadcn.csv +61 -0
  26. package/assets/data/stacks/svelte.csv +54 -0
  27. package/assets/data/stacks/swiftui.csv +51 -0
  28. package/assets/data/stacks/threejs.csv +54 -0
  29. package/assets/data/stacks/vue.csv +50 -0
  30. package/assets/data/styles.csv +85 -0
  31. package/assets/data/typography.csv +74 -0
  32. package/assets/data/ui-reasoning.csv +162 -0
  33. package/assets/data/ux-guidelines.csv +100 -0
  34. package/assets/scripts/core.py +263 -0
  35. package/assets/scripts/design_system.py +1157 -0
  36. package/assets/scripts/search.py +114 -0
  37. package/assets/skills/banner-design/SKILL.md +196 -0
  38. package/assets/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
  39. package/assets/skills/brand/SKILL.md +97 -0
  40. package/assets/skills/brand/references/approval-checklist.md +169 -0
  41. package/assets/skills/brand/references/asset-organization.md +157 -0
  42. package/assets/skills/brand/references/brand-guideline-template.md +140 -0
  43. package/assets/skills/brand/references/color-palette-management.md +186 -0
  44. package/assets/skills/brand/references/consistency-checklist.md +94 -0
  45. package/assets/skills/brand/references/logo-usage-rules.md +185 -0
  46. package/assets/skills/brand/references/messaging-framework.md +85 -0
  47. package/assets/skills/brand/references/typography-specifications.md +214 -0
  48. package/assets/skills/brand/references/update.md +118 -0
  49. package/assets/skills/brand/references/visual-identity.md +96 -0
  50. package/assets/skills/brand/references/voice-framework.md +88 -0
  51. package/assets/skills/brand/scripts/extract-colors.cjs +341 -0
  52. package/assets/skills/brand/scripts/inject-brand-context.cjs +349 -0
  53. package/assets/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
  54. package/assets/skills/brand/scripts/validate-asset.cjs +387 -0
  55. package/assets/skills/brand/templates/brand-guidelines-starter.md +275 -0
  56. package/assets/skills/design/SKILL.md +313 -0
  57. package/assets/skills/design/data/cip/deliverables.csv +51 -0
  58. package/assets/skills/design/data/cip/industries.csv +21 -0
  59. package/assets/skills/design/data/cip/mockup-contexts.csv +21 -0
  60. package/assets/skills/design/data/cip/styles.csv +21 -0
  61. package/assets/skills/design/data/icon/styles.csv +16 -0
  62. package/assets/skills/design/data/logo/colors.csv +56 -0
  63. package/assets/skills/design/data/logo/industries.csv +56 -0
  64. package/assets/skills/design/data/logo/styles.csv +56 -0
  65. package/assets/skills/design/references/banner-sizes-and-styles.md +118 -0
  66. package/assets/skills/design/references/cip-deliverable-guide.md +95 -0
  67. package/assets/skills/design/references/cip-design.md +121 -0
  68. package/assets/skills/design/references/cip-prompt-engineering.md +84 -0
  69. package/assets/skills/design/references/cip-style-guide.md +68 -0
  70. package/assets/skills/design/references/design-routing.md +207 -0
  71. package/assets/skills/design/references/icon-design.md +122 -0
  72. package/assets/skills/design/references/logo-color-psychology.md +101 -0
  73. package/assets/skills/design/references/logo-design.md +92 -0
  74. package/assets/skills/design/references/logo-prompt-engineering.md +158 -0
  75. package/assets/skills/design/references/logo-style-guide.md +109 -0
  76. package/assets/skills/design/references/slides-copywriting-formulas.md +84 -0
  77. package/assets/skills/design/references/slides-create.md +4 -0
  78. package/assets/skills/design/references/slides-html-template.md +295 -0
  79. package/assets/skills/design/references/slides-layout-patterns.md +137 -0
  80. package/assets/skills/design/references/slides-strategies.md +94 -0
  81. package/assets/skills/design/references/slides.md +42 -0
  82. package/assets/skills/design/references/social-photos-design.md +329 -0
  83. package/assets/skills/design/scripts/cip/core.py +215 -0
  84. package/assets/skills/design/scripts/cip/generate.py +484 -0
  85. package/assets/skills/design/scripts/cip/render-html.py +424 -0
  86. package/assets/skills/design/scripts/cip/search.py +127 -0
  87. package/assets/skills/design/scripts/icon/generate.py +487 -0
  88. package/assets/skills/design/scripts/logo/core.py +175 -0
  89. package/assets/skills/design/scripts/logo/generate.py +362 -0
  90. package/assets/skills/design/scripts/logo/search.py +114 -0
  91. package/assets/skills/design-system/SKILL.md +244 -0
  92. package/assets/skills/design-system/data/slide-backgrounds.csv +11 -0
  93. package/assets/skills/design-system/data/slide-charts.csv +26 -0
  94. package/assets/skills/design-system/data/slide-color-logic.csv +14 -0
  95. package/assets/skills/design-system/data/slide-copy.csv +26 -0
  96. package/assets/skills/design-system/data/slide-layout-logic.csv +16 -0
  97. package/assets/skills/design-system/data/slide-layouts.csv +26 -0
  98. package/assets/skills/design-system/data/slide-strategies.csv +16 -0
  99. package/assets/skills/design-system/data/slide-typography.csv +15 -0
  100. package/assets/skills/design-system/references/component-specs.md +236 -0
  101. package/assets/skills/design-system/references/component-tokens.md +214 -0
  102. package/assets/skills/design-system/references/primitive-tokens.md +203 -0
  103. package/assets/skills/design-system/references/semantic-tokens.md +215 -0
  104. package/assets/skills/design-system/references/states-and-variants.md +241 -0
  105. package/assets/skills/design-system/references/tailwind-integration.md +251 -0
  106. package/assets/skills/design-system/references/token-architecture.md +224 -0
  107. package/assets/skills/design-system/scripts/embed-tokens.cjs +99 -0
  108. package/assets/skills/design-system/scripts/fetch-background.py +317 -0
  109. package/assets/skills/design-system/scripts/generate-slide.py +770 -0
  110. package/assets/skills/design-system/scripts/generate-tokens.cjs +205 -0
  111. package/assets/skills/design-system/scripts/html-token-validator.py +327 -0
  112. package/assets/skills/design-system/scripts/search-slides.py +218 -0
  113. package/assets/skills/design-system/scripts/slide-token-validator.py +35 -0
  114. package/assets/skills/design-system/scripts/slide_search_core.py +453 -0
  115. package/assets/skills/design-system/scripts/validate-tokens.cjs +251 -0
  116. package/assets/skills/design-system/templates/design-tokens-starter.json +143 -0
  117. package/assets/skills/slides/SKILL.md +40 -0
  118. package/assets/skills/slides/references/copywriting-formulas.md +84 -0
  119. package/assets/skills/slides/references/create.md +4 -0
  120. package/assets/skills/slides/references/html-template.md +295 -0
  121. package/assets/skills/slides/references/layout-patterns.md +137 -0
  122. package/assets/skills/slides/references/slide-strategies.md +94 -0
  123. package/assets/skills/ui-styling/LICENSE.txt +202 -0
  124. package/assets/skills/ui-styling/SKILL.md +324 -0
  125. package/assets/skills/ui-styling/references/canvas-design-system.md +320 -0
  126. package/assets/skills/ui-styling/references/shadcn-accessibility.md +471 -0
  127. package/assets/skills/ui-styling/references/shadcn-components.md +424 -0
  128. package/assets/skills/ui-styling/references/shadcn-theming.md +373 -0
  129. package/assets/skills/ui-styling/references/tailwind-customization.md +483 -0
  130. package/assets/skills/ui-styling/references/tailwind-responsive.md +382 -0
  131. package/assets/skills/ui-styling/references/tailwind-utilities.md +455 -0
  132. package/assets/skills/ui-styling/scripts/requirements.txt +17 -0
  133. package/assets/skills/ui-styling/scripts/shadcn_add.py +308 -0
  134. package/assets/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
  135. package/assets/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
  136. package/assets/skills/ui-styling/scripts/tests/requirements.txt +3 -0
  137. package/assets/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  138. package/assets/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
  139. package/assets/templates/base/quick-reference.md +297 -0
  140. package/assets/templates/base/skill-content.md +368 -0
  141. package/assets/templates/platforms/agent.json +21 -0
  142. package/assets/templates/platforms/augment.json +18 -0
  143. package/assets/templates/platforms/claude.json +21 -0
  144. package/assets/templates/platforms/codebuddy.json +21 -0
  145. package/assets/templates/platforms/codex.json +21 -0
  146. package/assets/templates/platforms/continue.json +21 -0
  147. package/assets/templates/platforms/copilot.json +21 -0
  148. package/assets/templates/platforms/cursor.json +21 -0
  149. package/assets/templates/platforms/droid.json +21 -0
  150. package/assets/templates/platforms/gemini.json +21 -0
  151. package/assets/templates/platforms/kilocode.json +21 -0
  152. package/assets/templates/platforms/kiro.json +21 -0
  153. package/assets/templates/platforms/opencode.json +21 -0
  154. package/assets/templates/platforms/qoder.json +21 -0
  155. package/assets/templates/platforms/roocode.json +21 -0
  156. package/assets/templates/platforms/trae.json +21 -0
  157. package/assets/templates/platforms/warp.json +18 -0
  158. package/assets/templates/platforms/windsurf.json +21 -0
  159. package/dist/index.js +10630 -0
  160. package/package.json +51 -0
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Logo Generation Script using Gemini Nano Banana API
5
+ Uses Gemini 2.5 Flash Image and Gemini 3 Pro Image Preview models
6
+
7
+ Models:
8
+ - Nano Banana (default): gemini-2.5-flash-image - fast, high-volume, low-latency
9
+ - Nano Banana Pro (--pro): gemini-3-pro-image-preview - professional quality, advanced reasoning
10
+
11
+ Usage:
12
+ python generate.py --prompt "tech startup logo minimalist blue"
13
+ python generate.py --prompt "coffee shop vintage badge" --style vintage --output logo.png
14
+ python generate.py --brand "TechFlow" --industry tech --style minimalist
15
+ python generate.py --brand "TechFlow" --pro # Use Nano Banana Pro model
16
+
17
+ Batch mode (generates multiple variants):
18
+ python generate.py --brand "Unikorn" --batch 9 --output-dir ./logos --pro
19
+ """
20
+
21
+ import argparse
22
+ import os
23
+ import sys
24
+ import time
25
+ from pathlib import Path
26
+ from datetime import datetime
27
+
28
+ # Load environment variables
29
+ def load_env():
30
+ """Load .env files in priority order"""
31
+ env_paths = [
32
+ Path(__file__).parent.parent.parent / ".env",
33
+ Path.home() / ".claude" / "skills" / ".env",
34
+ Path.home() / ".claude" / ".env"
35
+ ]
36
+
37
+ for env_path in env_paths:
38
+ if env_path.exists():
39
+ with open(env_path) as f:
40
+ for line in f:
41
+ line = line.strip()
42
+ if line and not line.startswith('#') and '=' in line:
43
+ key, value = line.split('=', 1)
44
+ if key not in os.environ:
45
+ os.environ[key] = value.strip('"\'')
46
+
47
+ load_env()
48
+
49
+ try:
50
+ from google import genai
51
+ from google.genai import types
52
+ except ImportError:
53
+ print("Error: google-genai package not installed.")
54
+ print("Install with: pip install google-genai")
55
+ sys.exit(1)
56
+
57
+
58
+ # ============ CONFIGURATION ============
59
+ GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
60
+
61
+ # Gemini "Nano Banana" model configurations for image generation
62
+ GEMINI_FLASH = "gemini-2.5-flash-image" # Nano Banana: fast, high-volume, low-latency
63
+ GEMINI_PRO = "gemini-3-pro-image-preview" # Nano Banana Pro: professional quality, advanced reasoning
64
+
65
+ # Supported aspect ratios
66
+ ASPECT_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"]
67
+ DEFAULT_ASPECT_RATIO = "1:1" # Square is ideal for logos
68
+
69
+ # Logo-specific prompt templates
70
+ LOGO_PROMPT_TEMPLATE = """Generate a professional logo image: {prompt}
71
+
72
+ Style requirements:
73
+ - Clean vector-style illustration suitable for a logo
74
+ - Simple, scalable design that works at any size
75
+ - Clear silhouette and recognizable shape
76
+ - Professional quality suitable for business use
77
+ - Centered composition on plain white or transparent background
78
+ - No text unless specifically requested
79
+ - High contrast and clear edges
80
+ - Square format, perfectly centered
81
+ - Output as a clean, high-quality logo image
82
+ """
83
+
84
+ STYLE_MODIFIERS = {
85
+ "minimalist": "minimalist, simple geometric shapes, clean lines, lots of white space, single color or limited palette",
86
+ "vintage": "vintage, retro, badge style, distressed texture, heritage feel, warm earth tones",
87
+ "modern": "modern, sleek, gradient colors, tech-forward, innovative feel",
88
+ "luxury": "luxury, elegant, gold accents, refined, premium feel, serif typography",
89
+ "playful": "playful, fun, colorful, friendly, approachable, rounded shapes",
90
+ "corporate": "corporate, professional, trustworthy, stable, conservative colors",
91
+ "organic": "organic, natural, flowing lines, earth tones, sustainable feel",
92
+ "geometric": "geometric, abstract, mathematical precision, symmetrical",
93
+ "hand-drawn": "hand-drawn, artisan, sketch-like, authentic, imperfect lines",
94
+ "3d": "3D, dimensional, depth, shadows, isometric perspective",
95
+ "abstract": "abstract mark, conceptual, symbolic, non-literal representation, artistic interpretation",
96
+ "lettermark": "lettermark, single letter or initials, typographic, monogram style, distinctive character",
97
+ "wordmark": "wordmark, logotype, custom typography, brand name as logo, distinctive lettering",
98
+ "emblem": "emblem, badge, crest style, enclosed design, traditional, authoritative feel",
99
+ "mascot": "mascot, character, friendly face, personified, memorable figure",
100
+ "gradient": "gradient, color transition, vibrant, modern digital feel, smooth color flow",
101
+ "lineart": "line art, single stroke, continuous line, elegant simplicity, wire-frame style",
102
+ "negative-space": "negative space, clever use of white space, hidden meaning, dual imagery, optical illusion"
103
+ }
104
+
105
+ INDUSTRY_PROMPTS = {
106
+ "tech": "technology company, digital, innovative, modern, circuit-like elements",
107
+ "healthcare": "healthcare, medical, caring, trust, cross or heart symbol",
108
+ "finance": "financial services, stable, trustworthy, growth, upward elements",
109
+ "food": "food and beverage, appetizing, warm colors, welcoming",
110
+ "fashion": "fashion brand, elegant, stylish, refined, artistic",
111
+ "fitness": "fitness and sports, dynamic, energetic, powerful, movement",
112
+ "eco": "eco-friendly, sustainable, natural, green, leaf or earth elements",
113
+ "education": "education, knowledge, growth, learning, book or cap symbol",
114
+ "real-estate": "real estate, property, home, roof or building silhouette",
115
+ "creative": "creative agency, artistic, unique, expressive, colorful"
116
+ }
117
+
118
+
119
+ def enhance_prompt(base_prompt, style=None, industry=None, brand_name=None):
120
+ """Enhance the logo prompt with style and industry modifiers"""
121
+ prompt_parts = [base_prompt]
122
+
123
+ if style and style in STYLE_MODIFIERS:
124
+ prompt_parts.append(STYLE_MODIFIERS[style])
125
+
126
+ if industry and industry in INDUSTRY_PROMPTS:
127
+ prompt_parts.append(INDUSTRY_PROMPTS[industry])
128
+
129
+ if brand_name:
130
+ prompt_parts.insert(0, f"Logo for '{brand_name}':")
131
+
132
+ combined = ", ".join(prompt_parts)
133
+ return LOGO_PROMPT_TEMPLATE.format(prompt=combined)
134
+
135
+
136
+ def generate_logo(prompt, style=None, industry=None, brand_name=None,
137
+ output_path=None, use_pro=False, aspect_ratio=None):
138
+ """Generate a logo using Gemini models with image generation
139
+
140
+ Args:
141
+ aspect_ratio: Image aspect ratio. Options: "1:1", "16:9", "9:16", "4:3", "3:4"
142
+ Default is "1:1" (square) for logos.
143
+ """
144
+
145
+ if not GEMINI_API_KEY:
146
+ print("Error: GEMINI_API_KEY not set")
147
+ print("Set it with: export GEMINI_API_KEY='your-key'")
148
+ return None
149
+
150
+ # Initialize client
151
+ client = genai.Client(api_key=GEMINI_API_KEY)
152
+
153
+ # Enhance the prompt
154
+ full_prompt = enhance_prompt(prompt, style, industry, brand_name)
155
+
156
+ # Select model
157
+ model = GEMINI_PRO if use_pro else GEMINI_FLASH
158
+ model_label = "Nano Banana Pro (gemini-3-pro-image-preview)" if use_pro else "Nano Banana (gemini-2.5-flash-image)"
159
+
160
+ # Set aspect ratio (default to 1:1 for logos)
161
+ ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
162
+
163
+ print(f"Generating logo with {model_label}...")
164
+ print(f"Aspect ratio: {ratio}")
165
+ print(f"Prompt: {full_prompt[:150]}...")
166
+ print()
167
+
168
+ try:
169
+ # Generate image using Gemini with image generation capability
170
+ response = client.models.generate_content(
171
+ model=model,
172
+ contents=full_prompt,
173
+ config=types.GenerateContentConfig(
174
+ response_modalities=["IMAGE", "TEXT"],
175
+ image_config=types.ImageConfig(
176
+ aspect_ratio=ratio
177
+ ),
178
+ safety_settings=[
179
+ types.SafetySetting(
180
+ category="HARM_CATEGORY_HATE_SPEECH",
181
+ threshold="BLOCK_LOW_AND_ABOVE"
182
+ ),
183
+ types.SafetySetting(
184
+ category="HARM_CATEGORY_DANGEROUS_CONTENT",
185
+ threshold="BLOCK_LOW_AND_ABOVE"
186
+ ),
187
+ types.SafetySetting(
188
+ category="HARM_CATEGORY_SEXUALLY_EXPLICIT",
189
+ threshold="BLOCK_LOW_AND_ABOVE"
190
+ ),
191
+ types.SafetySetting(
192
+ category="HARM_CATEGORY_HARASSMENT",
193
+ threshold="BLOCK_LOW_AND_ABOVE"
194
+ ),
195
+ ]
196
+ )
197
+ )
198
+
199
+ # Extract image from response
200
+ image_data = None
201
+ for part in response.candidates[0].content.parts:
202
+ if hasattr(part, 'inline_data') and part.inline_data:
203
+ if part.inline_data.mime_type.startswith('image/'):
204
+ image_data = part.inline_data.data
205
+ break
206
+
207
+ if not image_data:
208
+ print("No image generated. The model may not have produced an image.")
209
+ print("Try a different prompt or check if the model supports image generation.")
210
+ return None
211
+
212
+ # Determine output path
213
+ if output_path is None:
214
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
215
+ brand_slug = brand_name.lower().replace(" ", "_") if brand_name else "logo"
216
+ output_path = f"{brand_slug}_{timestamp}.png"
217
+
218
+ # Save image
219
+ with open(output_path, "wb") as f:
220
+ f.write(image_data)
221
+
222
+ print(f"Logo saved to: {output_path}")
223
+ return output_path
224
+
225
+ except Exception as e:
226
+ print(f"Error generating logo: {e}")
227
+ return None
228
+
229
+
230
+ def generate_batch(prompt, brand_name, count, output_dir, use_pro=False, brand_context=None, aspect_ratio=None):
231
+ """Generate multiple logo variants with different styles"""
232
+
233
+ # Select appropriate styles for batch generation
234
+ batch_styles = [
235
+ ("minimalist", "Clean, simple geometric shape with minimal details"),
236
+ ("modern", "Sleek gradient with tech-forward aesthetic"),
237
+ ("geometric", "Abstract geometric patterns, mathematical precision"),
238
+ ("gradient", "Vibrant color transitions, modern digital feel"),
239
+ ("abstract", "Conceptual symbolic representation"),
240
+ ("lettermark", "Stylized letter 'U' as monogram"),
241
+ ("negative-space", "Clever use of negative space, hidden meaning"),
242
+ ("lineart", "Single stroke continuous line design"),
243
+ ("3d", "Dimensional design with depth and shadows"),
244
+ ]
245
+
246
+ # Ensure output directory exists
247
+ os.makedirs(output_dir, exist_ok=True)
248
+
249
+ results = []
250
+ model_label = "Pro" if use_pro else "Flash"
251
+ ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
252
+
253
+ print(f"\n{'='*60}")
254
+ print(f" BATCH LOGO GENERATION: {brand_name}")
255
+ print(f" Model: Nano Banana {model_label}")
256
+ print(f" Aspect Ratio: {ratio}")
257
+ print(f" Variants: {count}")
258
+ print(f" Output: {output_dir}")
259
+ print(f"{'='*60}\n")
260
+
261
+ for i in range(min(count, len(batch_styles))):
262
+ style_key, style_desc = batch_styles[i]
263
+
264
+ # Build enhanced prompt with brand context
265
+ enhanced_prompt = f"{prompt}, {style_desc}"
266
+ if brand_context:
267
+ enhanced_prompt = f"{brand_context}, {enhanced_prompt}"
268
+
269
+ # Generate filename
270
+ filename = f"{brand_name.lower().replace(' ', '_')}_{style_key}_{i+1:02d}.png"
271
+ output_path = os.path.join(output_dir, filename)
272
+
273
+ print(f"[{i+1}/{count}] Generating {style_key} variant...")
274
+
275
+ result = generate_logo(
276
+ prompt=enhanced_prompt,
277
+ style=style_key,
278
+ industry="tech",
279
+ brand_name=brand_name,
280
+ output_path=output_path,
281
+ use_pro=use_pro,
282
+ aspect_ratio=aspect_ratio
283
+ )
284
+
285
+ if result:
286
+ results.append(result)
287
+ print(f" ✓ Saved: {filename}\n")
288
+ else:
289
+ print(f" ✗ Failed: {style_key}\n")
290
+
291
+ # Rate limiting between requests
292
+ if i < count - 1:
293
+ time.sleep(2)
294
+
295
+ print(f"\n{'='*60}")
296
+ print(f" BATCH COMPLETE: {len(results)}/{count} logos generated")
297
+ print(f"{'='*60}\n")
298
+
299
+ return results
300
+
301
+
302
+ def main():
303
+ parser = argparse.ArgumentParser(description="Generate logos using Gemini Nano Banana models")
304
+ parser.add_argument("--prompt", "-p", type=str, help="Logo description prompt")
305
+ parser.add_argument("--brand", "-b", type=str, help="Brand name")
306
+ parser.add_argument("--style", "-s", choices=list(STYLE_MODIFIERS.keys()), help="Logo style")
307
+ parser.add_argument("--industry", "-i", choices=list(INDUSTRY_PROMPTS.keys()), help="Industry type")
308
+ parser.add_argument("--output", "-o", type=str, help="Output file path")
309
+ parser.add_argument("--output-dir", type=str, help="Output directory for batch generation")
310
+ parser.add_argument("--batch", type=int, help="Number of logo variants to generate (batch mode)")
311
+ parser.add_argument("--brand-context", type=str, help="Additional brand context for prompts")
312
+ parser.add_argument("--pro", action="store_true", help="Use Nano Banana Pro (gemini-3-pro-image-preview) for professional quality")
313
+ parser.add_argument("--aspect-ratio", "-r", choices=ASPECT_RATIOS, default=DEFAULT_ASPECT_RATIO,
314
+ help=f"Image aspect ratio (default: {DEFAULT_ASPECT_RATIO} for logos)")
315
+ parser.add_argument("--list-styles", action="store_true", help="List available styles")
316
+ parser.add_argument("--list-industries", action="store_true", help="List available industries")
317
+
318
+ args = parser.parse_args()
319
+
320
+ if args.list_styles:
321
+ print("Available styles:")
322
+ for style, desc in STYLE_MODIFIERS.items():
323
+ print(f" {style}: {desc[:60]}...")
324
+ return
325
+
326
+ if args.list_industries:
327
+ print("Available industries:")
328
+ for industry, desc in INDUSTRY_PROMPTS.items():
329
+ print(f" {industry}: {desc[:60]}...")
330
+ return
331
+
332
+ if not args.prompt and not args.brand:
333
+ parser.error("Either --prompt or --brand is required")
334
+
335
+ prompt = args.prompt or "professional logo"
336
+
337
+ # Batch mode
338
+ if args.batch:
339
+ output_dir = args.output_dir or f"./{args.brand.lower().replace(' ', '_')}_logos"
340
+ generate_batch(
341
+ prompt=prompt,
342
+ brand_name=args.brand or "Logo",
343
+ count=args.batch,
344
+ output_dir=output_dir,
345
+ use_pro=args.pro,
346
+ brand_context=args.brand_context,
347
+ aspect_ratio=args.aspect_ratio
348
+ )
349
+ else:
350
+ generate_logo(
351
+ prompt=prompt,
352
+ style=args.style,
353
+ industry=args.industry,
354
+ brand_name=args.brand,
355
+ output_path=args.output,
356
+ use_pro=args.pro,
357
+ aspect_ratio=args.aspect_ratio
358
+ )
359
+
360
+
361
+ if __name__ == "__main__":
362
+ main()
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Logo Design Search - CLI for searching logo design guidelines
5
+ Usage: python search.py "<query>" [--domain <domain>] [--max-results 3]
6
+ python search.py "<query>" --design-brief [-p "Brand Name"]
7
+
8
+ Domains: style, color, industry
9
+ """
10
+
11
+ import argparse
12
+ from core import CSV_CONFIG, MAX_RESULTS, search, search_all
13
+
14
+
15
+ def format_output(result):
16
+ """Format results for Claude consumption (token-optimized)"""
17
+ if "error" in result:
18
+ return f"Error: {result['error']}"
19
+
20
+ output = []
21
+ output.append(f"## Logo Design Search Results")
22
+ output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
23
+ output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
24
+
25
+ for i, row in enumerate(result['results'], 1):
26
+ output.append(f"### Result {i}")
27
+ for key, value in row.items():
28
+ value_str = str(value)
29
+ if len(value_str) > 300:
30
+ value_str = value_str[:300] + "..."
31
+ output.append(f"- **{key}:** {value_str}")
32
+ output.append("")
33
+
34
+ return "\n".join(output)
35
+
36
+
37
+ def generate_design_brief(query, brand_name=None):
38
+ """Generate a comprehensive logo design brief based on query"""
39
+ results = search_all(query, max_results=2)
40
+
41
+ output = []
42
+ output.append("=" * 60)
43
+ if brand_name:
44
+ output.append(f" LOGO DESIGN BRIEF: {brand_name.upper()}")
45
+ else:
46
+ output.append(" LOGO DESIGN BRIEF")
47
+ output.append("=" * 60)
48
+ output.append(f" Query: {query}")
49
+ output.append("=" * 60)
50
+ output.append("")
51
+
52
+ # Industry recommendations
53
+ if "industry" in results:
54
+ output.append("## INDUSTRY ANALYSIS")
55
+ for r in results["industry"]:
56
+ output.append(f"**Industry:** {r.get('Industry', 'N/A')}")
57
+ output.append(f"- Recommended Styles: {r.get('Recommended Styles', 'N/A')}")
58
+ output.append(f"- Colors: {r.get('Primary Colors', 'N/A')}")
59
+ output.append(f"- Typography: {r.get('Typography', 'N/A')}")
60
+ output.append(f"- Symbols: {r.get('Common Symbols', 'N/A')}")
61
+ output.append(f"- Mood: {r.get('Mood', 'N/A')}")
62
+ output.append(f"- Best Practices: {r.get('Best Practices', 'N/A')}")
63
+ output.append(f"- Avoid: {r.get('Avoid', 'N/A')}")
64
+ output.append("")
65
+
66
+ # Style recommendations
67
+ if "style" in results:
68
+ output.append("## STYLE RECOMMENDATIONS")
69
+ for r in results["style"]:
70
+ output.append(f"**{r.get('Style Name', 'N/A')}** ({r.get('Category', 'N/A')})")
71
+ output.append(f"- Colors: {r.get('Primary Colors', 'N/A')} | {r.get('Secondary Colors', 'N/A')}")
72
+ output.append(f"- Typography: {r.get('Typography', 'N/A')}")
73
+ output.append(f"- Effects: {r.get('Effects', 'N/A')}")
74
+ output.append(f"- Best For: {r.get('Best For', 'N/A')}")
75
+ output.append(f"- Complexity: {r.get('Complexity', 'N/A')}")
76
+ output.append("")
77
+
78
+ # Color recommendations
79
+ if "color" in results:
80
+ output.append("## COLOR PALETTE OPTIONS")
81
+ for r in results["color"]:
82
+ output.append(f"**{r.get('Palette Name', 'N/A')}**")
83
+ output.append(f"- Primary: {r.get('Primary Hex', 'N/A')}")
84
+ output.append(f"- Secondary: {r.get('Secondary Hex', 'N/A')}")
85
+ output.append(f"- Accent: {r.get('Accent Hex', 'N/A')}")
86
+ output.append(f"- Background: {r.get('Background Hex', 'N/A')}")
87
+ output.append(f"- Psychology: {r.get('Psychology', 'N/A')}")
88
+ output.append("")
89
+
90
+ output.append("=" * 60)
91
+ return "\n".join(output)
92
+
93
+
94
+ if __name__ == "__main__":
95
+ parser = argparse.ArgumentParser(description="Logo Design Search")
96
+ parser.add_argument("query", help="Search query")
97
+ parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
98
+ parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
99
+ parser.add_argument("--json", action="store_true", help="Output as JSON")
100
+ parser.add_argument("--design-brief", "-db", action="store_true", help="Generate comprehensive design brief")
101
+ parser.add_argument("--brand-name", "-p", type=str, default=None, help="Brand name for design brief")
102
+
103
+ args = parser.parse_args()
104
+
105
+ if args.design_brief:
106
+ result = generate_design_brief(args.query, args.brand_name)
107
+ print(result)
108
+ else:
109
+ result = search(args.query, args.domain, args.max_results)
110
+ if args.json:
111
+ import json
112
+ print(json.dumps(result, indent=2, ensure_ascii=False))
113
+ else:
114
+ print(format_output(result))